SVN-fs-dump-format-version: 2 Revision-number: 1 Prop-content-length: 126 Content-length: 126 K 8 svn:date V 27 2009-11-04T16:23:02.000000Z K 7 svn:log V 52 Standard project directories initialized by cvs2svn. PROPS-END Node-path: powersupply Node-kind: dir Node-action: add Node-path: powersupply/itest Node-kind: dir Node-action: add Node-path: powersupply/itest/Bilt Node-kind: dir Node-action: add Node-path: powersupply/itest/Bilt/trunk Node-kind: dir Node-action: add Node-path: powersupply/itest/Bilt/branches Node-kind: dir Node-action: add Node-path: powersupply/itest/Bilt/tags Node-kind: dir Node-action: add Revision-number: 2 Prop-content-length: 121 Content-length: 121 K 10 svn:author V 5 meyer K 8 svn:date V 27 2009-11-04T16:23:02.000000Z K 7 svn:log V 21 Imported using TkCVS PROPS-END Node-path: powersupply/itest/Bilt/trunk/Bilt.cpp Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 24356 Text-content-md5: 22a1ff98cc32b5c16d99554298c059c9 Content-length: 24366 PROPS-END static const char *RcsId = "$Id: Bilt.cpp,v 1.1.1.1 2009-11-04 16:23:02 meyer Exp $"; //+============================================================================= // // file : Bilt.cpp // // description : C++ source for the Bilt and its commands. // The class is derived from Device. It represents the // CORBA servant object which will be accessed from the // network. All commands which can be executed on the // Bilt are implemented in this file. // // project : TANGO Device Server // // $Author: meyer $ // // $Revision: 1.1.1.1 $ // // $Revision: 1.1.1.1 $ // $Date: 2009-11-04 16:23:02 $ // // SVN only: // $HeadURL: $ // // CVS only: // $Source: /segfs/tango/cvsroot/cppserver/machine/powersupply/SrSteerers/tango/Bilt/Bilt.cpp,v $ // $Log: not supported by cvs2svn $ // // copyleft : European Synchrotron Radiation Facility // BP 220, Grenoble 38043 // FRANCE // //-============================================================================= // // This file is generated by POGO // (Program Obviously used to Generate tango Object) // // (c) - Software Engineering Group - ESRF //============================================================================= //=================================================================== // // The following table gives the correspondence // between commands and method name. // // Command name| Method name // ---------------------------------------- // State | dev_state() // Status | dev_status() // On | on() // Off | off() // Reset | reset() // //=================================================================== #include #include #include namespace Bilt_ns { //+---------------------------------------------------------------------------- // // method : Bilt::Bilt(string &s) // // description : constructor for simulated Bilt // // in : - cl : Pointer to the DeviceClass object // - s : Device name // //----------------------------------------------------------------------------- Bilt::Bilt(Tango::DeviceClass *cl,string &s) :Tango::Device_4Impl(cl,s.c_str()) { init_device(); } Bilt::Bilt(Tango::DeviceClass *cl,const char *s) :Tango::Device_4Impl(cl,s) { init_device(); } Bilt::Bilt(Tango::DeviceClass *cl,const char *s,const char *d) :Tango::Device_4Impl(cl,s,d) { init_device(); } //+---------------------------------------------------------------------------- // // method : Bilt::delete_device() // // description : will be called at device destruction or at init command. // //----------------------------------------------------------------------------- void Bilt::delete_device() { // Delete device allocated objects delete BILT; } //+---------------------------------------------------------------------------- // // method : Bilt::init_device() // // description : will be called at device initialization. // //----------------------------------------------------------------------------- void Bilt::init_device() { INFO_STREAM << "Bilt::Bilt() create device " << device_name << endl; // Initialise variables to default values //-------------------------------------------- get_device_property(); set_state (Tango::UNKNOWN); try { BILT = new itest::TMagnet (iPAddress.c_str(), magnetNumber); POLE = &(BILT->pole(poleNumber)); } catch (itest::ItestException &e) { try { create_tango_exception (e, "Init failure" , "Cannot initialise ITEST libray objects", "Bilt::init_device"); } catch (Tango::DevFailed &e) { set_state (Tango::FAULT); } } } //+---------------------------------------------------------------------------- // // method : Bilt::get_device_property() // // description : Read the device properties from database. // //----------------------------------------------------------------------------- void Bilt::get_device_property() { // Initialize your default values here (if not done with POGO). //------------------------------------------------------------------ idata.magnet = 0; idata.pole = 0; idata.meascurr = 0; idata.measvolt = 0; idata.state = -1; idata.fail = "none"; fdata.nbrframe_sec = 0; fdata.nbrferr_sec = 0; fdata.min_sett_sec = 0; fdata.max_sett_sec = 0; fdata.average_sett_sec = 0; fdata.nbrferr = 0; current_dc = 0; set_current_ac = 0; local_control = false; // Read device properties from database.(Automatic code generation) //------------------------------------------------------------------ Tango::DbData dev_prop; dev_prop.push_back(Tango::DbDatum("IPAddress")); dev_prop.push_back(Tango::DbDatum("MagnetNumber")); dev_prop.push_back(Tango::DbDatum("PoleNumber")); // Call database and extract values //-------------------------------------------- if (Tango::Util::instance()->_UseDb==true) get_db_device()->get_property(dev_prop); Tango::DbDatum def_prop, cl_prop; BiltClass *ds_class = (static_cast(get_device_class())); int i = -1; // Try to initialize IPAddress from class property cl_prop = ds_class->get_class_property(dev_prop[++i].name); if (cl_prop.is_empty()==false) cl_prop >> iPAddress; else { // Try to initialize IPAddress from default device value def_prop = ds_class->get_default_device_property(dev_prop[i].name); if (def_prop.is_empty()==false) def_prop >> iPAddress; } // And try to extract IPAddress value from database if (dev_prop[i].is_empty()==false) dev_prop[i] >> iPAddress; // Try to initialize MagnetNumber from class property cl_prop = ds_class->get_class_property(dev_prop[++i].name); if (cl_prop.is_empty()==false) cl_prop >> magnetNumber; else { // Try to initialize MagnetNumber from default device value def_prop = ds_class->get_default_device_property(dev_prop[i].name); if (def_prop.is_empty()==false) def_prop >> magnetNumber; } // And try to extract MagnetNumber value from database if (dev_prop[i].is_empty()==false) dev_prop[i] >> magnetNumber; // Try to initialize PoleNumber from class property cl_prop = ds_class->get_class_property(dev_prop[++i].name); if (cl_prop.is_empty()==false) cl_prop >> poleNumber; else { // Try to initialize PoleNumber from default device value def_prop = ds_class->get_default_device_property(dev_prop[i].name); if (def_prop.is_empty()==false) def_prop >> poleNumber; } // And try to extract PoleNumber value from database if (dev_prop[i].is_empty()==false) dev_prop[i] >> poleNumber; // End of Automatic code generation //------------------------------------------------------------------ } //+---------------------------------------------------------------------------- // // method : Bilt::always_executed_hook() // // description : method always executed before any command is executed // //----------------------------------------------------------------------------- void Bilt::always_executed_hook() { } //+---------------------------------------------------------------------------- // // method : Bilt::read_attr_hardware // // description : Hardware acquisition for attributes. // //----------------------------------------------------------------------------- void Bilt::read_attr_hardware(vector &attr_list) { DEBUG_STREAM << "Bilt::read_attr_hardware(vector &attr_list) entering... "<< endl; // Add your own code here } //+---------------------------------------------------------------------------- // // method : Bilt::read_LocalControl // // description : Extract real attribute values for LocalControl acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_LocalControl(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_LocalControl(Tango::Attribute &attr) entering... "<< endl; try { int switch_state = POLE->get_switch(); if ( switch_state == 1 ) local_control = false; else local_control = true; } catch (itest::ItestException &e) { create_tango_exception (e, "Read failure" , "Cannot read the actual switch state", "Bilt::read_LocalControl"); } attr.set_value (&local_control); } //+---------------------------------------------------------------------------- // // method : Bilt::write_LocalControl // // description : Write LocalControl attribute values to hardware. // //----------------------------------------------------------------------------- void Bilt::write_LocalControl(Tango::WAttribute &attr) { DEBUG_STREAM << "Bilt::write_LocalControl(Tango::WAttribute &attr) entering... "<< endl; attr.get_write_value(local_control); try { int switch_state; if ( local_control == true ) switch_state = 0; else switch_state = 1; POLE->set_switch (switch_state); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot write switch state", "Bilt::write_LocalControl"); } } //+---------------------------------------------------------------------------- // // method : Bilt::read_SetCurrentAC // // description : Extract real attribute values for SetCurrentAC acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_SetCurrentAC(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_SetCurrentAC(Tango::Attribute &attr) entering... "<< endl; if ( local_control == false ) { attr.set_quality (Tango::ATTR_INVALID); } else { attr.set_value (&set_current_ac); } } //+---------------------------------------------------------------------------- // // method : Bilt::write_SetCurrentAC // // description : Write SetCurrentAC attribute values to hardware. // //----------------------------------------------------------------------------- void Bilt::write_SetCurrentAC(Tango::WAttribute &attr) { DEBUG_STREAM << "Bilt::write_SetCurrentAC(Tango::WAttribute &attr) entering... "<< endl; // check whether local control is true if ( local_control == false ) { TangoSys_MemStream tms; tms << "Can set AC current only when local control enabled!" << endl; Tango::Except::throw_exception("WriteError", tms.str(), "Bilt::write_SetCurrentAC"); } attr.get_write_value(set_current_ac); try { POLE->set_current_AC (set_current_ac); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot write AC current value", "Bilt::write_SetCurrentAC"); } } //+---------------------------------------------------------------------------- // // method : Bilt::read_CurrentDC // // description : Extract real attribute values for CurrentDC acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_CurrentDC(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_CurrentDC(Tango::Attribute &attr) entering... "<< endl; try { current_dc = POLE->get_current_DC(); } catch (itest::ItestException &e) { create_tango_exception (e, "Read failure" , "Cannot read DC current value", "Bilt::read_CurrentDC"); } attr.set_value (¤t_dc); } //+---------------------------------------------------------------------------- // // method : Bilt::write_CurrentDC // // description : Write CurrentDC attribute values to hardware. // //----------------------------------------------------------------------------- void Bilt::write_CurrentDC(Tango::WAttribute &attr) { DEBUG_STREAM << "Bilt::write_CurrentDC(Tango::WAttribute &attr) entering... "<< endl; attr.get_write_value(attr_CurrentDC_write); try { POLE->set_current_DC (attr_CurrentDC_write); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot write DC current value", "Bilt::write_CurrentDC"); } } //+---------------------------------------------------------------------------- // // method : Bilt::read_CurrentAC // // description : Extract real attribute values for CurrentAC acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_CurrentAC(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_CurrentAC(Tango::Attribute &attr) entering... "<< endl; read_idata(); if ( errors.length() != 0 ) attr.set_quality(Tango::ATTR_INVALID); else attr.set_value (&idata.meascurr); } //+---------------------------------------------------------------------------- // // method : Bilt::read_Voltage // // description : Extract real attribute values for Voltage acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_Voltage(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_Voltage(Tango::Attribute &attr) entering... "<< endl; read_idata(); if ( errors.length() != 0 ) attr.set_quality(Tango::ATTR_INVALID); else attr.set_value (&idata.measvolt); } //+---------------------------------------------------------------------------- // // method : Bilt::read_SetMin // // description : Extract real attribute values for SetMin acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_SetMin(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_SetMin(Tango::Attribute &attr) entering... "<< endl; read_fdata(); if ( errors.length() != 0 ) attr.set_quality(Tango::ATTR_INVALID); else attr.set_value (&fdata.min_sett_sec); } //+---------------------------------------------------------------------------- // // method : Bilt::read_SetMax // // description : Extract real attribute values for SetMax acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_SetMax(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_SetMax(Tango::Attribute &attr) entering... "<< endl; read_fdata(); if ( errors.length() != 0 ) attr.set_quality(Tango::ATTR_INVALID); else attr.set_value (&fdata.max_sett_sec); } //+---------------------------------------------------------------------------- // // method : Bilt::read_SetAverage // // description : Extract real attribute values for SetAverage acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_SetAverage(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_SetAverage(Tango::Attribute &attr) entering... "<< endl; read_fdata(); if ( errors.length() != 0 ) attr.set_quality(Tango::ATTR_INVALID); else attr.set_value (&fdata.average_sett_sec); } //+---------------------------------------------------------------------------- // // method : Bilt::read_FramesPerSec // // description : Extract real attribute values for FramesPerSec acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_FramesPerSec(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_FramesPerSec(Tango::Attribute &attr) entering... "<< endl; read_fdata(); if ( errors.length() != 0 ) attr.set_quality(Tango::ATTR_INVALID); else attr.set_value ((Tango::DevULong *) &fdata.nbrframe_sec); } //+---------------------------------------------------------------------------- // // method : Bilt::read_ErrorPerSec // // description : Extract real attribute values for ErrorPerSec acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_ErrorPerSec(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_ErrorPerSec(Tango::Attribute &attr) entering... "<< endl; read_fdata(); if ( errors.length() != 0 ) attr.set_quality(Tango::ATTR_INVALID); else attr.set_value ((Tango::DevULong *) &fdata.nbrferr_sec); } //+---------------------------------------------------------------------------- // // method : Bilt::read_ErrorCounter // // description : Extract real attribute values for ErrorCounter acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_ErrorCounter(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_ErrorCounter(Tango::Attribute &attr) entering... "<< endl; read_fdata(); if ( errors.length() != 0 ) attr.set_quality(Tango::ATTR_INVALID); else attr.set_value ((Tango::DevULong *) &fdata.nbrferr); } //+------------------------------------------------------------------ /** * method: Bilt::on * * description: method to execute "On" * Turns on power supply. * * */ //+------------------------------------------------------------------ void Bilt::on() { DEBUG_STREAM << "Bilt::on(): entering... !" << endl; // Add your own code to control device here try { POLE->clear_ferrors(); BILT->set_state(1); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot switch on pole", "Bilt::on"); } } //+------------------------------------------------------------------ /** * method: Bilt::off * * description: method to execute "Off" * Turns of power supply * * */ //+------------------------------------------------------------------ void Bilt::off() { DEBUG_STREAM << "Bilt::off(): entering... !" << endl; // Add your own code to control device here try { BILT->set_state(0); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot switch off pole", "Bilt::off"); } } //+------------------------------------------------------------------ /** * method: Bilt::reset * * description: method to execute "Reset" * Reset faults and alarms * * */ //+------------------------------------------------------------------ void Bilt::reset() { DEBUG_STREAM << "Bilt::reset(): entering... !" << endl; // Add your own code to control device here try { BILT->clear_all_err(); BILT->clear_alarm(); POLE->clear_ferrors(); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot reset pole", "Bilt::reset"); } } //+------------------------------------------------------------------ /** * method: Bilt::create_tango_exception() * * description: convert an itest exception into a tango exception * * * in : - &e : Reference to itest exception * - reason : Reason of the local Tango exception to be added to the stack * - desc : Description for the local Tango exception to be added to the stack * - origin : Origin if the local Tango exception to be added to the stack */ //+------------------------------------------------------------------ void Bilt::create_tango_exception (itest::ItestException &e, string reason, string desc, string origin) { DEBUG_STREAM << "Bilt::create_tango_exception(): entering... !" << endl; errors.length(e.errors.size() + 1); int i; for(i=0; iget_idata (&idata); errors.length(0); } catch (itest::ItestException &e) { create_tango_exception (e, "Read failure" , "Cannot read the idata structure", "Bilt::read_idata"); } } //+------------------------------------------------------------------ /** * method: Bilt::read_fdata() * * description: Read the fdata structure for the pole. * */ //+------------------------------------------------------------------ void Bilt::read_fdata() { DEBUG_STREAM << "Bilt::read_fdata(): entering... !" << endl; static time_t last_update_time = 0; // check whether the last reading was more than a second ago time_t now; time (&now); time_t delay = now - last_update_time; if ( delay < 1 ) { return; } else { last_update_time = now; } // read the data from the power supply try { POLE->get_fdata (&fdata); } catch (itest::ItestException &e) { create_tango_exception (e, "Read failure" , "Cannot read the fdata structure", "Bilt::read_fdata"); } } //+------------------------------------------------------------------ /** * method: Bilt::dev_status * * description: method to execute "Status" * This command gets the device status (stored in its device_status data member) and returns it to the caller. * * @return Status description * */ //+------------------------------------------------------------------ Tango::ConstDevString Bilt::dev_status() { Tango::ConstDevString argout = DeviceImpl::dev_status(); DEBUG_STREAM << "Bilt::dev_status(): entering... !" << endl; // Add your own code to control device here stringstream status; Tango::DevState state = dev_state(); switch (state) { case Tango::ON: status << "Pole state : ON" << endl; break; case Tango::OFF: status << "Pole state : OFF" << endl; break; case Tango::ALARM: status << "Pole state : Alarm" << endl; status << "Alarm message : Overvoltage detected! (48V for 100ms)" << endl; break; case Tango::FAULT: status << "Pole state : Fault" << endl; status << "Fault code : " << idata.fail << endl; if ( idata.fail == "OVI" ) { status << "Fault descr. : Short circuit detected!" << endl; break; } if ( idata.fail == "PWSK" ) { status << "Fault descr. : Absorbed power > 10W in 10ms!" << endl; break; } if ( idata.fail == "TEMP" ) { status << "Fault descr. : Max. temp on semiconductor reached!" << endl; break; } if ( idata.fail == "PWSO" ) { status << "Fault descr. : Delivered power > 40W in 100ms!" << endl; break; } status << "Fault descr. : Unkown fault code!" << endl; break; default: status << "Pole state : Unknown" << endl; status << "Error stack : " << endl; // print error from ITEST interface for(int i=0; iget_str_alarm() << endl; set_status(status.str()); return get_status().c_str(); } //+------------------------------------------------------------------ /** * method: Bilt::dev_state * * description: method to execute "State" * This command gets the device state (stored in its device_state data member) and returns it to the caller. * * @return State Code * */ //+------------------------------------------------------------------ Tango::DevState Bilt::dev_state() { Tango::DevState argout = DeviceImpl::dev_state(); DEBUG_STREAM << "Bilt::dev_state(): entering... !" << endl; // Add your own code to control device here read_idata(); if ( errors.length() != 0 ) set_state (Tango::UNKNOWN); else { // set the device state switch (idata.state) { case 0: set_state (Tango::OFF); break; case 1: set_state (Tango::ON); break; case 2: set_state (Tango::ALARM); break; case 3: set_state (Tango::FAULT); break; default: set_state (Tango::UNKNOWN); break; } } argout = get_state(); return argout; } } // namespace Node-path: powersupply/itest/Bilt/trunk/Bilt.h Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 9157 Text-content-md5: c336def83299071d85224654cd838c18 Content-length: 9167 PROPS-END //============================================================================= // // file : Bilt.h // // description : Include for the Bilt class. // // project : BILT multi channel power supply // // $Author: meyer $ // // $Revision: 1.1.1.1 $ // $Date: 2009-11-04 16:23:02 $ // // SVN only: // $HeadURL: $ // // CVS only: // $Source: /segfs/tango/cvsroot/cppserver/machine/powersupply/SrSteerers/tango/Bilt/Bilt.h,v $ // $Log: not supported by cvs2svn $ // // copyleft : European Synchrotron Radiation Facility // BP 220, Grenoble 38043 // FRANCE // //============================================================================= // // This file is generated by POGO // (Program Obviously used to Generate tango Object) // // (c) - Software Engineering Group - ESRF //============================================================================= #ifndef _BILT_H #define _BILT_H #include #include #include //using namespace Tango; /** * @author $Author: meyer $ * @version $Revision: 1.1.1.1 $ */ // Add your own constant definitions here. //----------------------------------------------- namespace Bilt_ns { /** * Class Description: * The BILT multi channel power supply will be used with 3 channels for the ESRF fast * feedback systems. * The power supply can be controlled in 2 ways : * By this device server for slow or human control or * by the Libera Beam Position monitors for fast feedback with closed loop control. */ /* * Device States Description: * Tango::ON : Magnet is ON, all three channels are ON. * Tango::OFF : Magnet is OFF, all three channels are OFF. * Tango::FAULT : Error detected by the BILT magnet. * Tango::ALARM : Alarm detected on one or more channels. * Tango::UNKNOWN : Communication fault */ class Bilt: public Tango::Device_4Impl { public : // Add your own data members here //----------------------------------------- // Here is the Start of the automatic code generation part //------------------------------------------------------------- /** * @name attributes * Attribute member data. */ //@{ Tango::DevDouble *attr_CurrentDC_read; Tango::DevDouble attr_CurrentDC_write; Tango::DevDouble *attr_CurrentAC_read; Tango::DevDouble *attr_Voltage_read; Tango::DevDouble *attr_SetMin_read; Tango::DevDouble *attr_SetMax_read; Tango::DevDouble *attr_SetAverage_read; Tango::DevULong *attr_FramesPerSec_read; Tango::DevULong *attr_ErrorPerSec_read; Tango::DevULong *attr_ErrorCounter_read; Tango::DevBoolean *attr_LocalControl_read; Tango::DevBoolean attr_LocalControl_write; Tango::DevDouble *attr_SetCurrentAC_read; Tango::DevDouble attr_SetCurrentAC_write; //@} /** * @name Device properties * Device properties member data. */ //@{ /** * IP Address of BILT controller. * Each controller includes several magnets and * each magnet includes 3 power supplies, * for corrections in the X, Y and Z planes. * * */ string iPAddress; /** * Magnet number from 1 to 48 */ Tango::DevShort magnetNumber; /** * The number of the Pole to be used from 0 to 2 */ Tango::DevShort poleNumber; //@} /** * @name Device properties * Device property member data. */ //@{ //@} /**@name Constructors * Miscellaneous constructors */ //@{ /** * Constructs a newly allocated Command object. * * @param cl Class. * @param s Device Name */ Bilt(Tango::DeviceClass *cl,string &s); /** * Constructs a newly allocated Command object. * * @param cl Class. * @param s Device Name */ Bilt(Tango::DeviceClass *cl,const char *s); /** * Constructs a newly allocated Command object. * * @param cl Class. * @param s Device name * @param d Device description. */ Bilt(Tango::DeviceClass *cl,const char *s,const char *d); //@} /**@name Destructor * Only one destructor is defined for this class */ //@{ /** * The object destructor. */ ~Bilt() {delete_device();}; /** * will be called at device destruction or at init command. */ void delete_device(); //@} /**@name Miscellaneous methods */ //@{ /** * Initialize the device */ virtual void init_device(); /** * Always executed method before execution command method. */ virtual void always_executed_hook(); //@} /** * @name Bilt methods prototypes */ //@{ /** * Hardware acquisition for attributes. */ virtual void read_attr_hardware(vector &attr_list); /** * Extract real attribute values for CurrentDC acquisition result. */ virtual void read_CurrentDC(Tango::Attribute &attr); /** * Write CurrentDC attribute values to hardware. */ virtual void write_CurrentDC(Tango::WAttribute &attr); /** * Extract real attribute values for CurrentAC acquisition result. */ virtual void read_CurrentAC(Tango::Attribute &attr); /** * Extract real attribute values for Voltage acquisition result. */ virtual void read_Voltage(Tango::Attribute &attr); /** * Extract real attribute values for SetMin acquisition result. */ virtual void read_SetMin(Tango::Attribute &attr); /** * Extract real attribute values for SetMax acquisition result. */ virtual void read_SetMax(Tango::Attribute &attr); /** * Extract real attribute values for SetAverage acquisition result. */ virtual void read_SetAverage(Tango::Attribute &attr); /** * Extract real attribute values for FramesPerSec acquisition result. */ virtual void read_FramesPerSec(Tango::Attribute &attr); /** * Extract real attribute values for ErrorPerSec acquisition result. */ virtual void read_ErrorPerSec(Tango::Attribute &attr); /** * Extract real attribute values for ErrorCounter acquisition result. */ virtual void read_ErrorCounter(Tango::Attribute &attr); /** * Extract real attribute values for LocalControl acquisition result. */ virtual void read_LocalControl(Tango::Attribute &attr); /** * Write LocalControl attribute values to hardware. */ virtual void write_LocalControl(Tango::WAttribute &attr); /** * Extract real attribute values for SetCurrentAC acquisition result. */ virtual void read_SetCurrentAC(Tango::Attribute &attr); /** * Write SetCurrentAC attribute values to hardware. */ virtual void write_SetCurrentAC(Tango::WAttribute &attr); /** * Read/Write allowed for CurrentDC attribute. */ virtual bool is_CurrentDC_allowed(Tango::AttReqType type); /** * Read/Write allowed for CurrentAC attribute. */ virtual bool is_CurrentAC_allowed(Tango::AttReqType type); /** * Read/Write allowed for Voltage attribute. */ virtual bool is_Voltage_allowed(Tango::AttReqType type); /** * Read/Write allowed for SetMin attribute. */ virtual bool is_SetMin_allowed(Tango::AttReqType type); /** * Read/Write allowed for SetMax attribute. */ virtual bool is_SetMax_allowed(Tango::AttReqType type); /** * Read/Write allowed for SetAverage attribute. */ virtual bool is_SetAverage_allowed(Tango::AttReqType type); /** * Read/Write allowed for FramesPerSec attribute. */ virtual bool is_FramesPerSec_allowed(Tango::AttReqType type); /** * Read/Write allowed for ErrorPerSec attribute. */ virtual bool is_ErrorPerSec_allowed(Tango::AttReqType type); /** * Read/Write allowed for ErrorCounter attribute. */ virtual bool is_ErrorCounter_allowed(Tango::AttReqType type); /** * Read/Write allowed for LocalControl attribute. */ virtual bool is_LocalControl_allowed(Tango::AttReqType type); /** * Read/Write allowed for SetCurrentAC attribute. */ virtual bool is_SetCurrentAC_allowed(Tango::AttReqType type); /** * Execution allowed for On command. */ virtual bool is_On_allowed(const CORBA::Any &any); /** * Execution allowed for Off command. */ virtual bool is_Off_allowed(const CORBA::Any &any); /** * Execution allowed for Reset command. */ virtual bool is_Reset_allowed(const CORBA::Any &any); /** * This command gets the device state (stored in its device_state data member) and returns it to the caller. * @return State Code * @exception DevFailed */ virtual Tango::DevState dev_state(); /** * This command gets the device status (stored in its device_status data member) and returns it to the caller. * @return Status description * @exception DevFailed */ virtual Tango::ConstDevString dev_status(); /** * Turns on power supply. * @exception DevFailed */ void on(); /** * Turns of power supply * @exception DevFailed */ void off(); /** * Reset faults and alarms * @exception DevFailed */ void reset(); /** * Read the device properties from database */ void get_device_property(); //@} // Here is the end of the automatic code generation part //------------------------------------------------------------- protected : // Add your own data members here //----------------------------------------- void create_tango_exception (itest::ItestException &e, string reason, string desc, string origin); void read_idata(); void read_fdata(); itest::TMagnet *BILT; itest::TPole *POLE; struct itest::idata idata; struct itest::fdata fdata; double current_dc; double set_current_ac; bool local_control; Tango::DevErrorList errors; }; } // namespace_ns #endif // _BILT_H Node-path: powersupply/itest/Bilt/trunk/BiltClass.cpp Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 20362 Text-content-md5: 91799e4de6096eba58955cafe0f70b11 Content-length: 20372 PROPS-END static const char *ClassId = "$Id: BiltClass.cpp,v 1.1.1.1 2009-11-04 16:23:02 meyer Exp $"; static const char *TagName = "$Name: not supported by cvs2svn $"; static const char *CvsPath = "$Source: /segfs/tango/cvsroot/cppserver/machine/powersupply/SrSteerers/tango/Bilt/BiltClass.cpp,v $"; static const char *SvnPath = "$HeadURL: $"; static const char *HttpServer = "http://www.esrf.fr/computing/cs/tango/tango_doc/ds_doc/"; //+============================================================================= // // file : BiltClass.cpp // // description : C++ source for the BiltClass. A singleton // class derived from DeviceClass. It implements the // command list and all properties and methods required // by the Bilt once per process. // // project : TANGO Device Server // // $Author: meyer $ // // $Revision: 1.1.1.1 $ // // $Log: not supported by cvs2svn $ // // copyleft : European Synchrotron Radiation Facility // BP 220, Grenoble 38043 // FRANCE // //-============================================================================= // // This file is generated by POGO // (Program Obviously used to Generate tango Object) // // (c) - Software Engineering Group - ESRF //============================================================================= #include #include #include //+---------------------------------------------------------------------------- /** * Create BiltClass singleton and return it in a C function for Python usage */ //+---------------------------------------------------------------------------- extern "C" { #ifdef WIN32 __declspec(dllexport) #endif Tango::DeviceClass *_create_Bilt_class(const char *name) { return Bilt_ns::BiltClass::init(name); } } namespace Bilt_ns { //+---------------------------------------------------------------------------- // // method : OnCmd::execute() // // description : method to trigger the execution of the command. // PLEASE DO NOT MODIFY this method core without pogo // // in : - device : The device on which the command must be executed // - in_any : The command input data // // returns : The command output data (packed in the Any object) // //----------------------------------------------------------------------------- CORBA::Any *OnCmd::execute(Tango::DeviceImpl *device,const CORBA::Any &in_any) { cout2 << "OnCmd::execute(): arrived" << endl; ((static_cast(device))->on()); return new CORBA::Any(); } //+---------------------------------------------------------------------------- // // method : OffCmd::execute() // // description : method to trigger the execution of the command. // PLEASE DO NOT MODIFY this method core without pogo // // in : - device : The device on which the command must be executed // - in_any : The command input data // // returns : The command output data (packed in the Any object) // //----------------------------------------------------------------------------- CORBA::Any *OffCmd::execute(Tango::DeviceImpl *device,const CORBA::Any &in_any) { cout2 << "OffCmd::execute(): arrived" << endl; ((static_cast(device))->off()); return new CORBA::Any(); } //+---------------------------------------------------------------------------- // // method : ResetCmd::execute() // // description : method to trigger the execution of the command. // PLEASE DO NOT MODIFY this method core without pogo // // in : - device : The device on which the command must be executed // - in_any : The command input data // // returns : The command output data (packed in the Any object) // //----------------------------------------------------------------------------- CORBA::Any *ResetCmd::execute(Tango::DeviceImpl *device,const CORBA::Any &in_any) { cout2 << "ResetCmd::execute(): arrived" << endl; ((static_cast(device))->reset()); return new CORBA::Any(); } // //---------------------------------------------------------------- // Initialize pointer for singleton pattern //---------------------------------------------------------------- // BiltClass *BiltClass::_instance = NULL; //+---------------------------------------------------------------------------- // // method : BiltClass::BiltClass(string &s) // // description : constructor for the BiltClass // // in : - s : The class name // //----------------------------------------------------------------------------- BiltClass::BiltClass(string &s):DeviceClass(s) { cout2 << "Entering BiltClass constructor" << endl; set_default_property(); get_class_property(); write_class_property(); cout2 << "Leaving BiltClass constructor" << endl; } //+---------------------------------------------------------------------------- // // method : BiltClass::~BiltClass() // // description : destructor for the BiltClass // //----------------------------------------------------------------------------- BiltClass::~BiltClass() { _instance = NULL; } //+---------------------------------------------------------------------------- // // method : BiltClass::instance // // description : Create the object if not already done. Otherwise, just // return a pointer to the object // // in : - name : The class name // //----------------------------------------------------------------------------- BiltClass *BiltClass::init(const char *name) { if (_instance == NULL) { try { string s(name); _instance = new BiltClass(s); } catch (bad_alloc) { throw; } } return _instance; } BiltClass *BiltClass::instance() { if (_instance == NULL) { cerr << "Class is not initialised !!" << endl; exit(-1); } return _instance; } //+---------------------------------------------------------------------------- // // method : BiltClass::command_factory // // description : Create the command object(s) and store them in the // command list // //----------------------------------------------------------------------------- void BiltClass::command_factory() { command_list.push_back(new OnCmd("On", Tango::DEV_VOID, Tango::DEV_VOID, "", "", Tango::OPERATOR)); command_list.push_back(new OffCmd("Off", Tango::DEV_VOID, Tango::DEV_VOID, "", "", Tango::OPERATOR)); command_list.push_back(new ResetCmd("Reset", Tango::DEV_VOID, Tango::DEV_VOID, "", "", Tango::OPERATOR)); // add polling if any for (unsigned int i=0 ; ilength() ; i++) { cout4 << "Device name : " << (*devlist_ptr)[i].in() << endl; // Create devices and add it into the device list //---------------------------------------------------- device_list.push_back(new Bilt(this, (*devlist_ptr)[i])); // Export device to the outside world // Check before if database used. //--------------------------------------------- if ((Tango::Util::_UseDb == true) && (Tango::Util::_FileDb == false)) export_device(device_list.back()); else export_device(device_list.back(), (*devlist_ptr)[i]); } // End of Automatic code generation //------------------------------------------------------------- } //+---------------------------------------------------------------------------- // Method: BiltClass::attribute_factory(vector &att_list) //----------------------------------------------------------------------------- void BiltClass::attribute_factory(vector &att_list) { // Attribute : CurrentDC CurrentDCAttrib *current_dc = new CurrentDCAttrib(); Tango::UserDefaultAttrProp current_dc_prop; current_dc_prop.set_description("The DC current of the channel"); current_dc->set_default_properties(current_dc_prop); current_dc->set_memorized(); current_dc->set_memorized_init(true); att_list.push_back(current_dc); // Attribute : CurrentAC CurrentACAttrib *current_ac = new CurrentACAttrib(); Tango::UserDefaultAttrProp current_ac_prop; current_ac_prop.set_description("The measured AC current of the channel"); current_ac->set_default_properties(current_ac_prop); att_list.push_back(current_ac); // Attribute : Voltage VoltageAttrib *voltage = new VoltageAttrib(); Tango::UserDefaultAttrProp voltage_prop; voltage_prop.set_description("The measured voltage of the channel"); voltage->set_default_properties(voltage_prop); att_list.push_back(voltage); // Attribute : SetMin SetMinAttrib *set_min = new SetMinAttrib(); Tango::UserDefaultAttrProp set_min_prop; set_min_prop.set_description("Statistic when driven by the Libera.\nThe minimum setpoint applied during the last second."); set_min->set_default_properties(set_min_prop); att_list.push_back(set_min); // Attribute : SetMax SetMaxAttrib *set_max = new SetMaxAttrib(); Tango::UserDefaultAttrProp set_max_prop; set_max_prop.set_description("Statistic when driven by the Libera.\nThe maximum setpoint applied during the last second."); set_max->set_default_properties(set_max_prop); att_list.push_back(set_max); // Attribute : SetAverage SetAverageAttrib *set_average = new SetAverageAttrib(); Tango::UserDefaultAttrProp set_average_prop; set_average_prop.set_description("Statistic when driven by the Libera.\nThe average setpoint applied during the last second."); set_average->set_default_properties(set_average_prop); att_list.push_back(set_average); // Attribute : FramesPerSec FramesPerSecAttrib *frames_per_sec = new FramesPerSecAttrib(); Tango::UserDefaultAttrProp frames_per_sec_prop; frames_per_sec_prop.set_description("Statistic when driven by the Libera.\nThe number of setpoints per second."); frames_per_sec->set_default_properties(frames_per_sec_prop); att_list.push_back(frames_per_sec); // Attribute : ErrorPerSec ErrorPerSecAttrib *error_per_sec = new ErrorPerSecAttrib(); Tango::UserDefaultAttrProp error_per_sec_prop; error_per_sec_prop.set_description("Statistic when driven by the Libera.\nThe number of errors detected per second."); error_per_sec->set_default_properties(error_per_sec_prop); att_list.push_back(error_per_sec); // Attribute : ErrorCounter ErrorCounterAttrib *error_counter = new ErrorCounterAttrib(); Tango::UserDefaultAttrProp error_counter_prop; error_counter_prop.set_description("Statistic when driven by the Libera.\nThe total number of errors since the last reset."); error_counter->set_default_properties(error_counter_prop); att_list.push_back(error_counter); // Attribute : LocalControl LocalControlAttrib *local_control = new LocalControlAttrib(); Tango::UserDefaultAttrProp local_control_prop; local_control_prop.set_unit(" "); local_control_prop.set_description("If true the AC current can be set on the device,\notherwise it is driven by the Libera."); local_control->set_default_properties(local_control_prop); att_list.push_back(local_control); // Attribute : SetCurrentAC SetCurrentACAttrib *set_current_ac = new SetCurrentACAttrib(); Tango::UserDefaultAttrProp set_current_ac_prop; set_current_ac_prop.set_description("The AC current setpoint in local mode. If driven by the Libera, the attribute \nattribute value in INVALID."); set_current_ac->set_default_properties(set_current_ac_prop); att_list.push_back(set_current_ac); // End of Automatic code generation //------------------------------------------------------------- } //+---------------------------------------------------------------------------- // // method : BiltClass::get_class_property() // // description : Read the class properties from database. // //----------------------------------------------------------------------------- void BiltClass::get_class_property() { // Initialize your default values here (if not done with POGO). //------------------------------------------------------------------ // Read class properties from database.(Automatic code generation) //------------------------------------------------------------------ // Call database and extract values //-------------------------------------------- if (Tango::Util::instance()->_UseDb==true) get_db_class()->get_property(cl_prop); Tango::DbDatum def_prop; int i = -1; // End of Automatic code generation //------------------------------------------------------------------ } //+---------------------------------------------------------------------------- // // method : BiltClass::set_default_property // // description: Set default property (class and device) for wizard. // For each property, add to wizard property name and description // If default value has been set, add it to wizard property and // store it in a DbDatum. // //----------------------------------------------------------------------------- void BiltClass::set_default_property() { string prop_name; string prop_desc; string prop_def; vector vect_data; // Set Default Class Properties // Set Default Device Properties prop_name = "IPAddress"; prop_desc = "IP Address of BILT controller.\nEach controller includes several magnets and\neach magnet includes 3 power supplies,\nfor corrections in the X, Y and Z planes.\n\n"; prop_def = "0.0.0.0"; vect_data.clear(); vect_data.push_back("0.0.0.0"); if (prop_def.length()>0) { Tango::DbDatum data(prop_name); data << vect_data ; dev_def_prop.push_back(data); add_wiz_dev_prop(prop_name, prop_desc, prop_def); } else add_wiz_dev_prop(prop_name, prop_desc); prop_name = "MagnetNumber"; prop_desc = "Magnet number from 1 to 48"; prop_def = "0"; vect_data.clear(); vect_data.push_back("0"); if (prop_def.length()>0) { Tango::DbDatum data(prop_name); data << vect_data ; dev_def_prop.push_back(data); add_wiz_dev_prop(prop_name, prop_desc, prop_def); } else add_wiz_dev_prop(prop_name, prop_desc); prop_name = "PoleNumber"; prop_desc = "The number of the Pole to be used from 0 to 2"; prop_def = "0"; vect_data.clear(); vect_data.push_back("0"); if (prop_def.length()>0) { Tango::DbDatum data(prop_name); data << vect_data ; dev_def_prop.push_back(data); add_wiz_dev_prop(prop_name, prop_desc, prop_def); } else add_wiz_dev_prop(prop_name, prop_desc); } //+---------------------------------------------------------------------------- // // method : BiltClass::write_class_property // // description : Set class description as property in database // //----------------------------------------------------------------------------- void BiltClass::write_class_property() { // First time, check if database used //-------------------------------------------- if (Tango::Util::_UseDb == false) return; Tango::DbData data; string classname = get_name(); string header; string::size_type start, end; // Put title Tango::DbDatum title("ProjectTitle"); string str_title("BILT multi channel power supply"); title << str_title; data.push_back(title); // Put Description Tango::DbDatum description("Description"); vector str_desc; str_desc.push_back("The BILT multi channel power supply will be used with 3 channels for the ESRF fast"); str_desc.push_back("feedback systems."); str_desc.push_back("The power supply can be controlled in 2 ways :"); str_desc.push_back("By this device server for slow or human control or"); str_desc.push_back("by the Libera Beam Position monitors for fast feedback with closed loop control."); description << str_desc; data.push_back(description); // put cvs or svn location string filename(classname); filename += "Class.cpp"; // Create a string with the class ID to // get the string into the binary string class_id(ClassId); // check for cvs information string src_path(CvsPath); start = src_path.find("/"); if (start!=string::npos) { end = src_path.find(filename); if (end>start) { string strloc = src_path.substr(start, end-start); // Check if specific repository start = strloc.find("/cvsroot/"); if (start!=string::npos && start>0) { string repository = strloc.substr(0, start); if (repository.find("/segfs/")!=string::npos) strloc = "ESRF:" + strloc.substr(start, strloc.length()-start); } Tango::DbDatum cvs_loc("cvs_location"); cvs_loc << strloc; data.push_back(cvs_loc); } } // check for svn information else { string src_path(SvnPath); start = src_path.find("://"); if (start!=string::npos) { end = src_path.find(filename); if (end>start) { header = "$HeadURL: "; start = header.length(); string strloc = src_path.substr(start, (end-start)); Tango::DbDatum svn_loc("svn_location"); svn_loc << strloc; data.push_back(svn_loc); } } } // Get CVS or SVN revision tag // CVS tag string tagname(TagName); header = "$Name: "; start = header.length(); string endstr(" $"); end = tagname.find(endstr); if (end!=string::npos && end>start) { string strtag = tagname.substr(start, end-start); Tango::DbDatum cvs_tag("cvs_tag"); cvs_tag << strtag; data.push_back(cvs_tag); } // SVN tag string svnpath(SvnPath); header = "$HeadURL: "; start = header.length(); end = svnpath.find(endstr); if (end!=string::npos && end>start) { string strloc = svnpath.substr(start, end-start); string tagstr ("/tags/"); start = strloc.find(tagstr); if ( start!=string::npos ) { start = start + tagstr.length(); end = strloc.find(filename); string strtag = strloc.substr(start, end-start-1); Tango::DbDatum svn_tag("svn_tag"); svn_tag << strtag; data.push_back(svn_tag); } } // Get URL location string httpServ(HttpServer); if (httpServ.length()>0) { Tango::DbDatum db_doc_url("doc_url"); db_doc_url << httpServ; data.push_back(db_doc_url); } // Put inheritance Tango::DbDatum inher_datum("InheritedFrom"); vector inheritance; inheritance.push_back("Device_4Impl"); inher_datum << inheritance; data.push_back(inher_datum); // Call database and and values //-------------------------------------------- get_db_class()->put_property(data); } } // namespace Node-path: powersupply/itest/Bilt/trunk/BiltClass.h Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 9322 Text-content-md5: a3f80d2cfe63378bcef10a2eba719880 Content-length: 9332 PROPS-END //============================================================================= // // file : BiltClass.h // // description : Include for the BiltClass root class. // This class is the singleton class for // the Bilt device class. // It contains all properties and methods which the // Bilt requires only once e.g. the commands. // // project : TANGO Device Server // // $Author: meyer $ // // $Revision: 1.1.1.1 $ // $Date: 2009-11-04 16:23:02 $ // // SVN only: // $HeadURL: $ // // CVS only: // $Source: /segfs/tango/cvsroot/cppserver/machine/powersupply/SrSteerers/tango/Bilt/BiltClass.h,v $ // $Log: not supported by cvs2svn $ // // copyleft : European Synchrotron Radiation Facility // BP 220, Grenoble 38043 // FRANCE // //============================================================================= // // This file is generated by POGO // (Program Obviously used to Generate tango Object) // // (c) - Software Engineering Group - ESRF //============================================================================= #ifndef _BILTCLASS_H #define _BILTCLASS_H #include #include namespace Bilt_ns {//===================================== // Define classes for attributes //===================================== class SetCurrentACAttrib: public Tango::Attr { public: SetCurrentACAttrib():Attr("SetCurrentAC", Tango::DEV_DOUBLE, Tango::READ_WRITE) {}; ~SetCurrentACAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_SetCurrentAC(att);} virtual void write(Tango::DeviceImpl *dev,Tango::WAttribute &att) {(static_cast(dev))->write_SetCurrentAC(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_SetCurrentAC_allowed(ty);} }; class LocalControlAttrib: public Tango::Attr { public: LocalControlAttrib():Attr("LocalControl", Tango::DEV_BOOLEAN, Tango::READ_WRITE) {}; ~LocalControlAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_LocalControl(att);} virtual void write(Tango::DeviceImpl *dev,Tango::WAttribute &att) {(static_cast(dev))->write_LocalControl(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_LocalControl_allowed(ty);} }; class ErrorCounterAttrib: public Tango::Attr { public: ErrorCounterAttrib():Attr("ErrorCounter", Tango::DEV_ULONG, Tango::READ) {}; ~ErrorCounterAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_ErrorCounter(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_ErrorCounter_allowed(ty);} }; class ErrorPerSecAttrib: public Tango::Attr { public: ErrorPerSecAttrib():Attr("ErrorPerSec", Tango::DEV_ULONG, Tango::READ) {}; ~ErrorPerSecAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_ErrorPerSec(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_ErrorPerSec_allowed(ty);} }; class FramesPerSecAttrib: public Tango::Attr { public: FramesPerSecAttrib():Attr("FramesPerSec", Tango::DEV_ULONG, Tango::READ) {}; ~FramesPerSecAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_FramesPerSec(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_FramesPerSec_allowed(ty);} }; class SetAverageAttrib: public Tango::Attr { public: SetAverageAttrib():Attr("SetAverage", Tango::DEV_DOUBLE, Tango::READ) {}; ~SetAverageAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_SetAverage(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_SetAverage_allowed(ty);} }; class SetMaxAttrib: public Tango::Attr { public: SetMaxAttrib():Attr("SetMax", Tango::DEV_DOUBLE, Tango::READ) {}; ~SetMaxAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_SetMax(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_SetMax_allowed(ty);} }; class SetMinAttrib: public Tango::Attr { public: SetMinAttrib():Attr("SetMin", Tango::DEV_DOUBLE, Tango::READ) {}; ~SetMinAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_SetMin(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_SetMin_allowed(ty);} }; class VoltageAttrib: public Tango::Attr { public: VoltageAttrib():Attr("Voltage", Tango::DEV_DOUBLE, Tango::READ) {}; ~VoltageAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_Voltage(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_Voltage_allowed(ty);} }; class CurrentACAttrib: public Tango::Attr { public: CurrentACAttrib():Attr("CurrentAC", Tango::DEV_DOUBLE, Tango::READ) {}; ~CurrentACAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_CurrentAC(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_CurrentAC_allowed(ty);} }; class CurrentDCAttrib: public Tango::Attr { public: CurrentDCAttrib():Attr("CurrentDC", Tango::DEV_DOUBLE, Tango::READ_WRITE) {}; ~CurrentDCAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_CurrentDC(att);} virtual void write(Tango::DeviceImpl *dev,Tango::WAttribute &att) {(static_cast(dev))->write_CurrentDC(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_CurrentDC_allowed(ty);} }; //========================================= // Define classes for commands //========================================= class ResetCmd : public Tango::Command { public: ResetCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out, const char *in_desc, const char *out_desc, Tango::DispLevel level) :Command(name,in,out,in_desc,out_desc, level) {}; ResetCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out) :Command(name,in,out) {}; ~ResetCmd() {}; virtual CORBA::Any *execute (Tango::DeviceImpl *dev, const CORBA::Any &any); virtual bool is_allowed (Tango::DeviceImpl *dev, const CORBA::Any &any) {return (static_cast(dev))->is_Reset_allowed(any);} }; class OffCmd : public Tango::Command { public: OffCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out, const char *in_desc, const char *out_desc, Tango::DispLevel level) :Command(name,in,out,in_desc,out_desc, level) {}; OffCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out) :Command(name,in,out) {}; ~OffCmd() {}; virtual CORBA::Any *execute (Tango::DeviceImpl *dev, const CORBA::Any &any); virtual bool is_allowed (Tango::DeviceImpl *dev, const CORBA::Any &any) {return (static_cast(dev))->is_Off_allowed(any);} }; class OnCmd : public Tango::Command { public: OnCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out, const char *in_desc, const char *out_desc, Tango::DispLevel level) :Command(name,in,out,in_desc,out_desc, level) {}; OnCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out) :Command(name,in,out) {}; ~OnCmd() {}; virtual CORBA::Any *execute (Tango::DeviceImpl *dev, const CORBA::Any &any); virtual bool is_allowed (Tango::DeviceImpl *dev, const CORBA::Any &any) {return (static_cast(dev))->is_On_allowed(any);} }; // // The BiltClass singleton definition // class #ifdef WIN32 __declspec(dllexport) #endif BiltClass : public Tango::DeviceClass { public: // properties member data // add your own data members here //------------------------------------ public: Tango::DbData cl_prop; Tango::DbData cl_def_prop; Tango::DbData dev_def_prop; // Method prototypes static BiltClass *init(const char *); static BiltClass *instance(); ~BiltClass(); Tango::DbDatum get_class_property(string &); Tango::DbDatum get_default_device_property(string &); Tango::DbDatum get_default_class_property(string &); protected: BiltClass(string &); static BiltClass *_instance; void command_factory(); void get_class_property(); void attribute_factory(vector &); void write_class_property(); void set_default_property(); string get_cvstag(); string get_cvsroot(); private: void device_factory(const Tango::DevVarStringArray *); }; } // namespace Bilt_ns #endif // _BILTCLASS_H Node-path: powersupply/itest/Bilt/trunk/BiltStateMachine.cpp Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 7854 Text-content-md5: fd8d0758a554f51d483c408bcd879570 Content-length: 7864 PROPS-END static const char *RcsId = "$Id $"; //+============================================================================= // // file : BiltStateMachine.cpp // // description : C++ source for the Bilt and its alowed // methods for commands and attributes // // project : TANGO Device Server // // $Author: meyer $ // // $Revision: 1.1.1.1 $ // $Date: 2009-11-04 16:23:02 $ // // SVN only: // $HeadURL: $ // // CVS only: // $Source: /segfs/tango/cvsroot/cppserver/machine/powersupply/SrSteerers/tango/Bilt/BiltStateMachine.cpp,v $ // $Log: not supported by cvs2svn $ // // copyleft : European Synchrotron Radiation Facility // BP 220, Grenoble 38043 // FRANCE // //-============================================================================= // // This file is generated by POGO // (Program Obviously used to Generate tango Object) // // (c) - Software Engineering Group - ESRF //============================================================================= #include #include #include /*==================================================================== * This file contains the methods to allow commands and attributes * read or write execution. * * If you wand to add your own code, add it between * the "End/Re-Start of Generated Code" comments. * * If you want, you can also add your own methods. *==================================================================== */ namespace Bilt_ns { //================================================= // Attributes Allowed Methods //================================================= //+---------------------------------------------------------------------------- // // method : Bilt::is_CurrentDC_allowed // // description : Read/Write allowed for CurrentDC attribute. // //----------------------------------------------------------------------------- bool Bilt::is_CurrentDC_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_CurrentAC_allowed // // description : Read/Write allowed for CurrentAC attribute. // //----------------------------------------------------------------------------- bool Bilt::is_CurrentAC_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_Voltage_allowed // // description : Read/Write allowed for Voltage attribute. // //----------------------------------------------------------------------------- bool Bilt::is_Voltage_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_SetMin_allowed // // description : Read/Write allowed for SetMin attribute. // //----------------------------------------------------------------------------- bool Bilt::is_SetMin_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_SetMax_allowed // // description : Read/Write allowed for SetMax attribute. // //----------------------------------------------------------------------------- bool Bilt::is_SetMax_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_SetAverage_allowed // // description : Read/Write allowed for SetAverage attribute. // //----------------------------------------------------------------------------- bool Bilt::is_SetAverage_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_FramesPerSec_allowed // // description : Read/Write allowed for FramesPerSec attribute. // //----------------------------------------------------------------------------- bool Bilt::is_FramesPerSec_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_ErrorPerSec_allowed // // description : Read/Write allowed for ErrorPerSec attribute. // //----------------------------------------------------------------------------- bool Bilt::is_ErrorPerSec_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_ErrorCounter_allowed // // description : Read/Write allowed for ErrorCounter attribute. // //----------------------------------------------------------------------------- bool Bilt::is_ErrorCounter_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_LocalControl_allowed // // description : Read/Write allowed for LocalControl attribute. // //----------------------------------------------------------------------------- bool Bilt::is_LocalControl_allowed(Tango::AttReqType type) { if (get_state() == Tango::OFF || get_state() == Tango::FAULT || get_state() == Tango::UNKNOWN) { // End of Generated Code // Re-Start of Generated Code return false; } return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_SetCurrentAC_allowed // // description : Read/Write allowed for SetCurrentAC attribute. // //----------------------------------------------------------------------------- bool Bilt::is_SetCurrentAC_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //================================================= // Commands Allowed Methods //================================================= //+---------------------------------------------------------------------------- // // method : Bilt::is_On_allowed // // description : Execution allowed for On command. // //----------------------------------------------------------------------------- bool Bilt::is_On_allowed(const CORBA::Any &any) { if (get_state() == Tango::ON || get_state() == Tango::FAULT || get_state() == Tango::UNKNOWN) { // End of Generated Code // Re-Start of Generated Code return false; } return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_Off_allowed // // description : Execution allowed for Off command. // //----------------------------------------------------------------------------- bool Bilt::is_Off_allowed(const CORBA::Any &any) { if (get_state() == Tango::OFF || get_state() == Tango::UNKNOWN) { // End of Generated Code // Re-Start of Generated Code return false; } return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_Reset_allowed // // description : Execution allowed for Reset command. // //----------------------------------------------------------------------------- bool Bilt::is_Reset_allowed(const CORBA::Any &any) { if (get_state() == Tango::UNKNOWN) { // End of Generated Code // Re-Start of Generated Code return false; } return true; } } // namespace Bilt_ns Node-path: powersupply/itest/Bilt/trunk/ClassFactory.cpp Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 1429 Text-content-md5: fa1fde4b2fcf26f5b9aa4b3b8dbdad53 Content-length: 1439 PROPS-END static const char *RcsId = "$Id: ClassFactory.cpp,v 1.1.1.1 2009-11-04 16:23:02 meyer Exp $"; //+============================================================================= // // file : ClassFactory.cpp // // description : C++ source for the class_factory method of the DServer // device class. This method is responsible for the creation of // all class singleton for a device server. It is called // at device server startup // // project : TANGO Device Server // // $Author: meyer $ // // $Revision: 1.1.1.1 $ // $Date: 2009-11-04 16:23:02 $ // // SVN only: // $HeadURL: $ // // CVS only: // $Source: /segfs/tango/cvsroot/cppserver/machine/powersupply/SrSteerers/tango/Bilt/ClassFactory.cpp,v $ // $Log: not supported by cvs2svn $ // // copyleft : European Synchrotron Radiation Facility // BP 220, Grenoble 38043 // FRANCE // //-============================================================================= // // This file is generated by POGO // (Program Obviously used to Generate tango Object) // // (c) - Software Engineering Group - ESRF //============================================================================= #include #include /** * Create BiltClass singleton and store it in DServer object. */ void Tango::DServer::class_factory() { add_class(Bilt_ns::BiltClass::init("Bilt")); } Node-path: powersupply/itest/Bilt/trunk/Makefile Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 4977 Text-content-md5: ae3cf411ad855e18f6ca23cce4d803f6 Content-length: 4987 PROPS-END #============================================================================= # # file : Makefile # # description : Include for the Bilt class. # # project : Makefile to generate a Tango server # # $Author: meyer $ # # $Revision: 1.1.1.1 $ # # $Log: not supported by cvs2svn $ # # copyleft : European Synchrotron Radiation Facility # BP 220, Grenoble 38043 # FRANCE # #============================================================================= # This file is generated by POGO # (Program Obviously used to Generate tango Object) # # (c) - Software Engineering Group - ESRF #============================================================================= # CLASS = Bilt MAJOR_VERS = 1 MINOR_VERS = 0 RELEASE = Release_$(MAJOR_VERS)_$(MINOR_VERS) OS = $(shell /csadmin/common/scripts/get_os) PROCESSOR = $(shell uname -p) #----------------------------------------- # Set default home directories #----------------------------------------- TANGO_HOME = /segfs/tango/release CPP_SERVERS = $(TANGO_HOME)/cppserver ifdef no_debug DEBUG = -O else DEBUG = -g endif ifdef _solaris CC = CC BIN_DIR=$(OS)_CC AR_SL = $(CC) -mt -G VERS_OPT = -h SL_EXT = so endif ifdef linux CC = c++ CC_SHLIB = $(CC) -fPIC $(PROCESSOR)=1 ifdef x86_64 NBITS=_64 endif BIN_DIR=$(OS)$(NBITS) AR_SL = $(CC) -fPIC -shared SL_EXT = so VERS_OPT = -Wl,-soname, endif INCLUDE_DIRS = -I$(TANGO_HOME)/$(BIN_DIR)/include -I. \ -I$(CPP_SERVERS)/include \ -I libMagnet_V110 OBJS_DIR = obj/$(BIN_DIR) LIB_DIRS = -L $(TANGO_HOME)/$(BIN_DIR)/lib \ -L libMagnet_V110 TARGET_LIB = $(CPP_SERVERS)/lib/$(BIN_DIR)/libtgclasses.a #----------------------------------------- # Set CXXFLAGS and LFLAGS #----------------------------------------- ifdef _solaris CXXFLAGS = $(DEBUG) -mt -D_PTHREADS $(INCLUDE_DIRS) LFLAGS = $(DEBUG) $(LIB_DIRS) \ -ltango \ -llog4tango \ -lomniORB4 \ -lomniDynamic4 \ -lomnithread \ -lCOS4 \ -lpthread \ -lposix4 -lsocket -lnsl endif ifdef linux CXXFLAGS = $(DEBUG) -D_REENTRANT $(INCLUDE_DIRS) LFLAGS = $(DEBUG) $(LIB_DIRS) \ -ltango \ -llog4tango \ -lomniORB4 \ -lomniDynamic4 \ -lomnithread \ -lCOS4 \ -ldl -lpthread \ -lMagnet endif #----------------------------------------- # Set dependences #----------------------------------------- SVC_OBJS = $(OBJS_DIR)/$(CLASS).o \ $(OBJS_DIR)/$(CLASS)StateMachine.o \ $(OBJS_DIR)/$(CLASS)Class.o \ $(OBJS_DIR)/ClassFactory.o \ $(OBJS_DIR)/main.o SHLIB_OBJS = $(OBJS_DIR)/$(CLASS)Class.so.o \ $(OBJS_DIR)/$(CLASS)StateMachine.so.o \ $(OBJS_DIR)/$(CLASS).so.o SVC_INC = $(CLASS)Class.h \ $(CLASS).h $(OBJS_DIR)/%.o: %.cpp $(SVC_INC) $(CC) $(CXXFLAGS) -c $< -o $(OBJS_DIR)/$*.o $(OBJS_DIR)/%.so.o: %.cpp $(SVC_INC) $(CC_SHLIB) $(CXXFLAGS) -c $< -o $(OBJS_DIR)/$*.so.o #----------------------------------------- # Make Entry #----------------------------------------- all: $(CLASS) $(CLASS): make_obj_dir make_bin_dir $(SVC_OBJS) $(CC) $(SVC_OBJS) -o $(CLASS) $(LFLAGS) @mv $(CLASS) bin/$(BIN_DIR)/$(CLASS) shlib: make_obj_dir make_shlib_dir $(SHLIB_OBJS) $(AR_SL) -o \ shlib/$(BIN_DIR)/$(CLASS).$(SL_EXT).$(MAJOR_VERS).$(MINOR_VERS) \ $(VERS_OPT)$(CLASS).$(SL_EXT).$(MAJOR_VERS) \ $(SHLIB_OBJS) $(LFLAGS) @rm -f shlib/$(BIN_DIR)/$(CLASS).$(SL_EXT) @cd shlib/$(BIN_DIR); \ ln -s $(CLASS).$(SL_EXT).$(MAJOR_VERS).$(MINOR_VERS) $(CLASS).$(SL_EXT) clean: rm -f $(OBJS_DIR)/*.o \ $(OBJS_DIR)/*.so.o \ bin/$(BIN_DIR)/$(CLASS) \ core make_obj_dir: @mkdir -p obj @mkdir -p obj/$(BIN_DIR) make_bin_dir: @mkdir -p bin @mkdir -p bin/$(BIN_DIR) make_shlib_dir: @mkdir -p shlib @mkdir -p shlib/$(BIN_DIR) #----------------------------------------- # Install binary file #----------------------------------------- install: cp bin/$(BIN_DIR)/$(CLASS) $(TANGO_HOME)/$(BIN_DIR)/bin #----------------------------------------- # Update class library and header files # recompile without debug mode. #----------------------------------------- lib: clean @make no_debug=1 cp *.h $(CPP_SERVERS)/include ar ruv $(TARGET_LIB) $(CLASS).o ar ruv $(TARGET_LIB) $(CLASS)Class.o ar ruv $(TARGET_LIB) $(CLASS)StateMachine.o ident $(TARGET_LIB) | grep $(CLASS) #------------------------------------------------------ # Tag the CVS/SVN module corresponding to this class # copy cvs_tag or svn_tag to tag: entry #------------------------------------------------------ #svn_tag: # svn copy ../trunk ../tags/$(RELEASE) # svn commit ../tags/$(RELEASE) \ # -m "Tagging the $(RELEASE) of the $(CLASS) project." # #cvs_tag: # @cvstag "$(CLASS)-$(RELEASE)" # @make $(CLASS) # @make show_tag #show_cvs_tag: # @cvstag -d # # Only these make options work with the current Pogo version 5.3.x! tag: @cvstag "$(CLASS)-$(RELEASE)" @make $(CLASS) @make show_tag show_tag: @cvstag -d Node-path: powersupply/itest/Bilt/trunk/TangoClassID.txt Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 209 Text-content-md5: 0bafaf143d80092a78cc63320960b73c Content-length: 219 PROPS-END /** * Device Class Identification: * * Class Name : Bilt * Contact : meier@esrf.fr * Platform : Unix Like * Bus : Ethernet * Manufacturer : itest * Reference : Module BE548 */ Node-path: powersupply/itest/Bilt/trunk/main.cpp Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 1961 Text-content-md5: df77a6e9375d637cc7ee68a9aa77c6b8 Content-length: 1971 PROPS-END static const char *RcsId = "$Id $"; //+============================================================================= // // file : main.cpp // // description : C++ source for a TANGO device server main. // The main rule is to initialise (and create) the Tango // system and to create the DServerClass singleton. // The main should be the same for every Tango device server. // // project : TANGO Device Server // // $Author: meyer $ // // $Revision: 1.1.1.1 $ $ // $Date: 2009-11-04 16:23:02 $ // // SVN only: // $HeadURL: $ // // CVS only: // $Source: /segfs/tango/cvsroot/cppserver/machine/powersupply/SrSteerers/tango/Bilt/main.cpp,v $ // $Log: not supported by cvs2svn $ // // copyleft : European Synchrotron Radiation Facility // BP 220, Grenoble 38043 // FRANCE // //-============================================================================= // // This file is generated by POGO // (Program Obviously used to Generate tango Object) // // (c) - Software Engineering Group - ESRF //============================================================================= #include int main(int argc,char *argv[]) { Tango::Util *tg; try { // Initialise the device server //---------------------------------------- tg = Tango::Util::init(argc,argv); // Create the device server singleton // which will create everything //---------------------------------------- tg->server_init(false); // Run the endless loop //---------------------------------------- cout << "Ready to accept request" << endl; tg->server_run(); } catch (bad_alloc) { cout << "Can't allocate memory to store device object !!!" << endl; cout << "Exiting" << endl; } catch (CORBA::Exception &e) { Tango::Except::print_exception(e); cout << "Received a CORBA_Exception" << endl; cout << "Exiting" << endl; } tg->server_cleanup(); return(0); } Node-path: powersupply/itest/Bilt/trunk/libMagnet_V110 Node-kind: dir Node-action: add Node-path: powersupply/itest/Bilt/trunk/libMagnet_V110/ClassMagnet.cpp Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 32864 Text-content-md5: 4bdad45ff9e2c11c2e00f2dfdfa64dd4 Content-length: 32874 PROPS-END // ============================================================================ // // = CONTEXT // ITest Power Supplies - C++ Interface // // = FILENAME // ClassMagnet.cpp // // = AUTHOR // Sebastien Laurent - ITEST // // = VERSION // 1.10 // // ============================================================================ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "ClassMagnet.h" #include "Exception.h" namespace itest{ //--------------------------------------------------------------------------- //#define __ITEST_DEBUG //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //---------------------------CLASSE SOCKET---------------------------------- //--------------------------------------------------------------------------- //SOCKET //Création de la socket, connexion au BILT Socket::Socket(const char *StrIP):init_device_done(false) { struct sockaddr_in adresse; int resultat,flag; struct timeval Tv; fd_set myset; #ifdef __ITEST_DEBUG std::cout<<"CREATE SOCKET"<init_device_done=true; //modif V202 07/06/07 //Set blocking // fcntl(Sockfd, F_SETFL, flag); #ifdef __ITEST_DEBUG std::cout<<"END CREATED: "<init_device_done) //modif V202 07/06/07 { std::ostringstream Desc; Desc<"<init_device_done) //modif V202 07/06/07 { std::ostringstream Desc; Desc<"<"<NumLastErr=atoi(Ptr))!=0) { std::ostringstream Desc; this->StrLastErr=strchr(Ptr,','); strcpy(&BuffLastErr[0],++this->StrLastErr); this->StrLastErr=&BuffLastErr[0]; Desc<"<StrLastErr<NumLastErr); throw e; } } //---------------------------------- char *TBilt::query(const std::string& _Str) throw (itest::ItestException) { std::ostringstream oss; oss<<_Str<NumMagnet<NumMagnet<NumMagnet<NBRPOLE) { std::ostringstream Desc; Desc<NumMagnet<Pole[Num]; } //--------------------------------------------------------------------------- //GROUPE //Allume ou éteind le groupe //Allume ou éteind l'aimant //0=OFF;1=ON //---------------------------------- void TMagnet::set_state(bool val) throw (itest::ItestException) { try{ std::ostringstream oss; oss<<":p"<Group<write(oss.str()); } catch(ItestException &e) { std::ostringstream Desc; Desc<NumMagnet<NumMagnet<Group<query(oss.str()))-1); //-1 pour avoir meme numero pour groupe et instrument } catch(ItestException &e) { std::ostringstream Desc; Desc<NumMagnet<NumMagnet<magnet=_magnet; mymdata->state=atoi(TabRes[2].c_str())-1; //-1 pour avoir state inst = state group parse_fill_idata(Tabsplit[1].c_str(), &(mymdata->idata[X]),_magnet); parse_fill_idata(Tabsplit[2].c_str(), &(mymdata->idata[Y]),_magnet); parse_fill_idata(Tabsplit[3].c_str(), &(mymdata->idata[Z]),_magnet); } //---------------------------------- void TMagnet::get_mdata(struct mdata * mymdata) throw (itest::ItestException) { try{ std::ostringstream oss; char *Ptr; oss<<":p"<Group<query(oss.str()); #ifdef __ITEST_DEBUG std::cout<<"GET_MDATA: "<NumMagnet); } catch(ItestException &e) { std::ostringstream Desc; Desc<NumMagnet<NumMagnet<Group<Group<write(oss.str()); } catch(ItestException &e) { std::ostringstream Desc; Desc<NumMagnet<NumMagnet<Pole[i]->set_switch(val); } catch(ItestException &e) { std::ostringstream Desc; Desc<query(oss.str())); #ifdef __ITEST_DEBUG std::cout<<"BOUCLE ERR"<NumMagnet<NumMagnet<query(oss.str()); return Ptr; } catch(ItestException &e) { std::ostringstream Desc; Desc<NumMagnet<NumMagnet<Inst<query(oss.str()))); } catch(ItestException &e) { std::ostringstream Desc; Desc<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<Inst<query(oss.str()); return atof(Ptr); } catch(ItestException &e) { std::ostringstream Desc; Desc<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<Inst<query(oss.str()); return atof(Ptr); } catch(ItestException &e) { std::ostringstream Desc; Desc<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<magnet=_magnet; int var=atoi(TabRes[0].c_str()+1); myidata->pole=(var>5?(var-7):(var-1))/2; myidata->state=atoi(TabRes[1].c_str()); myidata->fail=TabRes[2]; myidata->measvolt=atof(TabRes[3].c_str()); myidata->meascurr=atof(TabRes[4].c_str()); } //--------------------------------------------------------------------------- //INSTRUMENT BE549 //Lecture de idata : NoModule,State,Fail,MeasU,MeasI //State : 0=OFF,1=ON,2=WARNING,3=ALARM //Lecture de l'état et des paramètres de l'alimentation du pole void TPole::get_idata(struct idata *myidata) throw (itest::ItestException) { try{ std::ostringstream oss; char *Ptr; oss<<":i"<Inst<query(oss.str()); #ifdef __ITEST_DEBUG std::cout<<"GET_IADATA: "<NumMagnet); } catch(ItestException &e) { std::ostringstream Desc; Desc<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<Inst<query(oss.str()); return atoi(Ptr); } catch(ItestException &e) { std::ostringstream Desc; Desc<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<Inst<query(oss.str()); return atof(Ptr); } catch(ItestException &e) { std::ostringstream Desc; Desc<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<Inst<query(oss.str()); return atoi(Ptr); } catch(ItestException &e) { std::ostringstream Desc; Desc<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<Inst<query(oss.str()); return Ptr; } catch(ItestException &e) { std::ostringstream Desc; Desc<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<Inst<write(oss.str()); } catch(ItestException &e) { std::ostringstream Desc; Desc<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<Inst<write(oss.str()); } catch(ItestException &e) { std::ostringstream Desc; Desc<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<Inst<write(oss.str()); } catch(ItestException &e) { std::ostringstream Desc; Desc<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<Inst<query(oss.str()); #ifdef __ITEST_DEBUG std::cout<<"GET_FDATA: "<nbrframe_sec=atoi(data.substr(start,end-start).c_str()); break; case ERRSEC: mydata->nbrferr_sec=atoi(data.substr(start,end-start).c_str()); break; case MINS: mydata->min_sett_sec=atof(data.substr(start,end-start).c_str()); break; case MAXS: mydata->max_sett_sec=atof(data.substr(start,end-start).c_str()); break; case AVERAGES: mydata->average_sett_sec=atof(data.substr(start,end-start).c_str()); break; default : break; } start=i+1; i++;} mydata->nbrferr=atoi(data.substr(start,end-start).c_str()); } catch(ItestException &e) { std::ostringstream Desc; Desc<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<Inst<write(oss.str()); } catch(ItestException &e) { std::ostringstream Desc; Desc<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"< #include "Exception.h" namespace itest{ #define MAGNET1 #define MAGNET2 #define NBRPOLE 3 #define INST_MAGN1_POLE_X 1 //Instrument du pole X de l'aimant 1 #define INST_MAGN2_POLE_X 7 //Instrument du pole X de l'aimant 2 #define P1 1 //groupe de BILT de l'aimant 1 #define P2 2 //groupe de BILT de l'aimant 2 #define BUFFSIZE 130 //taille buffer de caractère de réception #define SOCK_PORT 5025 //Port de communication socket #define MAXTIME_CONNECT_READ 10 //temps max d'attente pour une connexion et une lecture sur BILT modif V201 #define X 0 #define Y 1 #define Z 2 #define CONF 0 #define RS485 1 #define MAGNET_OFF 0 #define MAGNET_ON 1 #define Q_SYSTERR ":syst:err?" #define Q_MCURR ";:meas:curr?" #define Q_MVOLT ";:meas:volt?" #define Q_IDATA ";:idata?" #define Q_MDATA ";:mdata?" #define Q_SWITCH ";:switch?" #define Q_CURR_DC ";:curr:dc?" #define Q_FAIL ";:lim:fail?" #define Q_FAILSTR ";:lim:fail:str?" #define Q_STAT ":stat?" #define SWITCH ";:switch " #define CURR_DC ";:curr:dc " #define CURR_AC ";:curr:ac " #define STAT ":stat " #define STATCLEAR ":stat:clear" #define SYSTVERS ":syst:vers?" //comptage #define Q_FDATA ";:fdata?" #define FRST ";:frst" //--------------------------------------------------------------------------- #define ITEST_EXCEPT_TRY_STR "ItestException exception caught while trying " #define ITEST_EXCEPT_MAGN_STR "ItestException exception caught on magnet" #define UNKNOW_EXCEPT_MAGN_STR "Unknown exception caugth on magnet" #define SOCK_ERROR_STR "Socket error" #define CONNECT_FAILED_STR "Connection failed" //--------------------------------------------------------------------------- class Socket{ private: int Sockfd; char R_Buff[BUFFSIZE]; bool init_device_done; //modif V202 07/06/07 pas d'exception dans constructeur mais dans fonctions membres protected: public: Socket(const char *StrIP); ~Socket(void); char *query(const std::string& Str); void write(const std::string& Str); }; //---------------------------------- class TBilt : private Socket //public Socket modif V202 05/06/07 { private: char BuffLastErr[50]; int NumLastErr; const char *StrLastErr; //modif V202 07/06/07 passage en private protected: public: TBilt(const char *StrIP); ~TBilt(void); void write(const std::string& _Str) throw (itest::ItestException); char *query(const std::string& _Str) throw (itest::ItestException); //ajout de const modif V202 05/06/07 }; //---------------------------------- class TPole{ private: // int Group; int Inst; int *PtrSock; char *Ptr_R_Buff; int NumMagnet; int Pole; TBilt *Bilt; public: TPole(TBilt *_Bilt, int _NumMagnet, int _Pole); double get_measure_current(void) throw (itest::ItestException); double get_measure_voltage(void) throw (itest::ItestException); void get_idata(struct idata *) throw (itest::ItestException); int get_switch(void) throw (itest::ItestException); double get_current_DC(void) throw (itest::ItestException); int get_state(void) throw (itest::ItestException); int get_num_alarm(void) throw (itest::ItestException); const char * get_str_alarm(void) throw (itest::ItestException); void set_current_DC(double ValF) throw (itest::ItestException); void set_current_AC(double ValF) throw (itest::ItestException); void set_switch(bool val) throw (itest::ItestException); // void clear_alarm(void) throw (itest::ItestException); //taux de comptage void get_fdata(struct fdata *) throw (itest::ItestException); void clear_ferrors(void) throw (itest::ItestException); }; //---------------------------------- class TMagnet { protected: private: int Group; char StrAddrIp[20]; TBilt *Bilt; TPole *Pole[NBRPOLE]; int NumMagnet; //passe en private modif V202 05/06/07 const char *AddrIP; //passe en private modif V202 05/06/07 public: TMagnet(const char *_AddrIp,int NumMagnet) throw (itest::ItestException); ~TMagnet(void); TMagnet(const TMagnet & Magn) throw (itest::ItestException); TMagnet & operator=(const TMagnet & Magn) throw (itest::ItestException); //modif V201 07/03/07 int num_magnet(void){return NumMagnet;} //modif V202 05/06/07 const char *addrIP_magnet(void){return AddrIP;} //modif V202 05/06/07 TPole & pole(int Num); void clear_all_err(void) throw (itest::ItestException); void clear_alarm(void) throw (itest::ItestException); void set_switch(bool val) throw (itest::ItestException); void set_state(bool val) throw (itest::ItestException); void get_mdata(struct mdata *) throw (itest::ItestException); int get_state(void) throw (itest::ItestException); const char * get_bilt_vers(void) throw (itest::ItestException); }; //--------------------------------------------------------------------------- //Structure de données de idata struct idata{ int magnet; int pole; int state; std::string fail; double measvolt; double meascurr; }; //--------------------------------------------------------------------------- //Structure de données de Mdata struct mdata{ int magnet; int state; struct idata idata[NBRPOLE]; }; //--------------------------------------------------------------------------- //Structure de données de Fdata struct fdata{ unsigned int nbrframe_sec; unsigned int nbrferr_sec; double min_sett_sec; double max_sett_sec; double average_sett_sec; unsigned int nbrferr; }; //--------------------------------------------------------------------------- } //end namespace //--------------------------------------------------------------------------- #endif //_ITEST_CLASSMAGNET_H_ Node-path: powersupply/itest/Bilt/trunk/libMagnet_V110/Exception.cpp Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 7037 Text-content-md5: 9d76e60e6386c4edf40ea80aef2679ab Content-length: 7047 PROPS-END // ============================================================================ // // = CONTEXT // ITest Power Supplies - C++ Interface - Error & ItestException Classes // // = FILENAME // ItestException.cpp // // = AUTHOR // Nicolas Leclercq - SOLEIL // // ============================================================================ // ============================================================================ // DEPENDENCIES // ============================================================================ #include "Exception.h" namespace itest { // ============================================================================ // Error::Error // ============================================================================ Error::Error (void) : reason ("unknown error"), desc ("unknown error"), origin ("unknown"), severity (itest::ERR), code (-1) { //- noop ctor } // ============================================================================ // Error::Error // ============================================================================ Error::Error (const char *_reason, const char *_desc, const char *_origin, int _severity, int _code) : reason (_reason), desc (_desc), origin (_origin), severity (_severity), code (_code) { //- noop ctor } // ============================================================================ // Error::Error // ============================================================================ Error::Error (const std::string& _reason, const std::string& _desc, const std::string& _origin, int _severity, int _code) : reason (_reason), desc (_desc), origin (_origin), severity (_severity), code (_code) { //- noop ctor } // ============================================================================ // Error::Error // ============================================================================ Error::Error (const Error& _src) : reason (_src.reason), desc (_src.desc), origin (_src.origin), severity (_src.severity), code (_src.code) { //- noop ctor } // ============================================================================ // Error::~Error // ============================================================================ Error::~Error (void) { //- noop dtor } // ============================================================================ // Error::operator= // ============================================================================ Error& Error::operator= (const Error& _src) { //- no self assignment if (this == &_src) return *this; this->reason = _src.reason; this->desc = _src.desc; this->origin = _src.origin; this->severity = _src.severity; this->code = _src.code; return *this; } // ============================================================================ // ItestException::ItestException // ============================================================================ ItestException::ItestException (void) : errors(0) { this->push_error(Error()); } // ============================================================================ // ItestException::ItestException // ============================================================================ ItestException::ItestException (const char *_reason, const char *_desc, const char *_origin, int _severity, int _code) : errors(0) { this->push_error(_reason, _desc, _origin, _severity, _code); } // ============================================================================ // ItestException::ItestException // ============================================================================ ItestException::ItestException (const std::string& _reason, const std::string& _desc, const std::string& _origin, int _severity, int _code) : errors(0) { this->push_error(_reason, _desc, _origin, _severity, _code); } // ============================================================================ // ItestException::ItestException // ============================================================================ ItestException::ItestException (const ItestException& _src) : errors(0) { this->errors = _src.errors; } // ============================================================================ // ItestException::ItestException // ============================================================================ ItestException::ItestException (const ErrorList& _errors) { this->errors = _errors; } // ============================================================================ // ItestException::ItestException // ============================================================================ ItestException& ItestException::operator= (const ItestException& _src) { //- no self assignment if (this == &_src) { return *this; } this->errors.clear(); for (size_t i = 0; i < _src.errors.size(); i++) this->push_error(_src.errors[i]); return *this; } // ============================================================================ // ItestException::~ItestException // ============================================================================ ItestException::~ItestException (void) { this->errors.clear(); } // ============================================================================ // ItestException::push_error // ============================================================================ void ItestException::push_error (const char *_reason, const char *_desc, const char *_origin, int _severity, int _err_code) { this->errors.push_back(Error(_reason, _desc, _origin, _severity, _err_code)); } // ============================================================================ // ItestException::push_error // ============================================================================ void ItestException::push_error (const std::string& _reason, const std::string& _desc, const std::string& _origin, int _err_code, int _severity) { this->errors.push_back(Error(_reason, _desc, _origin, _severity, _err_code)); } // ============================================================================ // ItestException::push_error // ============================================================================ void ItestException::push_error (const Error& _error) { this->errors.push_back(_error); } } // namespace itest Node-path: powersupply/itest/Bilt/trunk/libMagnet_V110/Exception.h Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 4255 Text-content-md5: 216d054c131bc191accef25995d29271 Content-length: 4265 PROPS-END // ============================================================================ // // = CONTEXT // ITest Power Supplies - C++ Interface - Error & Exception Classes // // = FILENAME // Exception.h // // = AUTHOR // Nicolas Leclercq - SOLEIL // // ============================================================================ #ifndef _ITEST_EXCEPTION_H_ #define _ITEST_EXCEPTION_H_ // ============================================================================ // DEPENDENCIES // ============================================================================ #include #include namespace itest { // ============================================================================ // Error severity // ============================================================================ typedef enum { WARN, ERR, PANIC } ErrorSeverity; // ============================================================================ // Error abstraction class // ============================================================================ class Error { public: /** * Initialization. */ Error (void); /** * Initialization. */ Error (const char *reason, const char *desc, const char *origin, int severity = itest::ERR, int err_code = -1); /** * Initialization. */ Error (const std::string& reason, const std::string& desc, const std::string& origin, int severity = itest::ERR, int err_code = -1); /** * Copy constructor. */ Error (const Error& src); /** * Error details: code */ virtual ~Error (void); /** * operator= */ Error& operator= (const Error& _src); /** * Error details: reason */ std::string reason; /** * Error details: description */ std::string desc; /** * Error details: origin */ std::string origin; /** * Error details: severity */ int severity; /** * Error details: code */ int code; }; // ============================================================================ // Error list // ============================================================================ typedef std::vector ErrorList; // ============================================================================ // Exception class // ============================================================================ class ItestException { public: /** * Default constructor */ ItestException (void); /** * Constructor */ ItestException (const char *reason, const char *desc, const char *origin, int severity = itest::ERR, int err_code = -1); /** * Constructor */ ItestException (const std::string& reason, const std::string& desc, const std::string& origin, int severity = itest::ERR, int err_code = -1); /** * Constructor */ ItestException (const Error& error); /** * Constructor */ ItestException (const ErrorList& errors); /** * Copy constructor */ ItestException (const ItestException& src); /** * operator= */ ItestException& operator= (const ItestException& _src); /** * Destructor */ virtual ~ItestException (void); /** * Push the specified error into the errors list. */ void push_error (const char *reason, const char *desc, const char *origin, int severity = itest::ERR, int err_code = -1); /** * Push the specified error into the errors list. */ void push_error (const std::string& reason, const std::string& desc, const std::string& origin, int severity = itest::ERR, int err_code = -1); /** * Push the specified error into the errors list. */ void push_error (const Error& error); /** * The errors list */ ErrorList errors; }; } // namespace itest #endif // _ITEST_EXCEPTION_H_ Node-path: powersupply/itest/Bilt/trunk/libMagnet_V110/Manuel_esrf_bibliothequeC++_itest_ed2.pdf Node-kind: file Node-action: add Prop-content-length: 36 Text-content-length: 312515 Text-content-md5: 150a17489e5f55bd5ac8add0c2dad030 Content-length: 312551 K 14 svn:executable V 1 * PROPS-END %PDF-1.3 %Çì¢ 5 0 obj <> stream xœí]]oݸ}÷¯ÐÛ& ,“EIÍ6]Ý×(ú °c;q6‰c;^tÿmÑ—&ïýÕç½ÔCi$_ÛŠ= Î’¼Ã™áðpø¡‹HÅÚDªúÓýãÍÇ‹½ý"z{µsYeж.‹ÓÈš¼üÛ鬈]VÝÛ×*úÓùΫÛ"zGè¯e»yœTÿÕMûÿ~ó1z~Pµj#­be¢ƒÓ²¢(œjÄÓ‘±:6.Êr§ytðqçÉ_Ÿ¼ß)[±IR:8ÞyrXAiœÓ!Ÿ*Ä•½4Ö¶Ðu)W6ÙB'M=gËb-ô¡‚Lœ9ÝŠrÜ6žëú-yÐjmÓ¹Ñ:,8­vD»rÆ)~®«§´ÊZèœVüRAIœ(tÍ¿£=þJD¿ …:+“aÓ>ÿX!Yl”É»¦ž5õòÜ$v2& «ê ô¯3_¾îÍ…ºŠN'aÑ?S…žSÏ»¦¥.›Ö ¥Ó´ßºoÂÔ„@xPÈÕþbnuš„Ýá=é"øA–j€JjÖ#p³‡¾ÏW®+vÁ$]Å’´C~,qe<³~,É\’n ÉÊ©ºßjƒIùëiÞ·ŸЊmW «uWꟴ¨xE¡ÚX6V¹vtÚ(ÝæÚ†[?¢’žQ±@) <¨xN+~!b½ciëb®šÛh‘ºDõBCãÇ. u5Â+¥ö‡g±¶^jµ5“¬ßÎ/67 ¦)”9³ YqØëzÇAëøRuÑ"×Úõ!¿õI¥n¹"j‹Í©¸Méw+‰U8wµ©Võ?45¯¥Ðõ:EMªØE­'ÊNà‚Bwf£ï×(ýR¿4¢p¦+tHuó¶)”8“nð; Aÿ5-µGe.QïÑ«U*2Ýý‹E ³¨b=ã¹vÆ«¨{æ"—e±sëO—È]ák (m•¸ŽÔ3^MÉ{칇œ4Q·ÈÓ#'¶„ŒêYÝÆ©*i¡”Æšõ@ëè.q.\ñˆüàYÛ”ÑE,~ïŒBçT{_ZRS6Õ‰ðŽ´þ•öù‚«õÑŒ)@±»R?5?íJõv2[÷¬²Ÿh[m)“ù=³¥‹h×›5Ó¸‹}Æ×äÒR_q}è …¾Ñ¶®š_tkIcÚEH H [„œ^åÑ—}G¢ÞT§Kw­ÓåJ¢ˆvË…p^ã<â LΣ׬ >½,¹N6ô÷;ÚüKv:ÙØìòy9hT¼nJvc··Ù@ÌÂ̓n×K¨¢\ã$Y/e<*X{t›ÜN¯Ö¶­&ÊB6,ÖÚ:€@ÅEEè1CK›Iz¤Ð#wÌ­3HCK ƒìº ¨Ú9íÐ[Vô Ô -5@!iE¡ $@ th 2ÜßZmë<3¡¥@[?WP'+$ì@5À­Oû€úd0°ÑŠuf†àô›nïTç{:.מÿuÎd]©=*ÂË êsrPˆÐaÈuÑ9þ5•P~ÐÖs*=‹XºÕ‚q¦ÈÃn$@ $У‡$Ø’´ÌÅZ§Ã$—æ»ýÙ÷<¤¥ZÚ‘Y]¤}È;L H 8oKжî.åz³ÈðúIƒù»Ä¹ËÕAÍU&UöqE: «äÊ9Ñ×O[Á” è $@Ý3­YÉxdÐ#7G¦ãåý¥nÍ;¡2^ ÙnûþÃËRô Wa¢é 1‰hú7‡ÂDÓßÚ]TxH H nºÅÖ—F=ï‚ÎLƒ– vLAK`OøsÓ–¿åºoo±ûĤú&lL÷…¹X^šdԪݛ÷TH³¿ ?GTø6Ý<|‡g2*ÂìðÙk ^šz›â¥Å=H µnÚײ ×âl&ßÅY¾{ÝLþL;ø? …oaø,gþ>18º¨O ÙH z\ÐÒ2:Éfõ}PVK‰ÓÌÄà§7½…<ÂFi[¼Š€7ÿPA&ÖJ­>P² C¼—s€ Ç«îöH‘—P 'ýD(÷×'ï³å:¦Íƒ_¼…ʈç€uO.СmúêÝœòåyôH[³óÁ³-|‚÷’ÕÀئïãz9vÞÆ‚0G =r ¥ ;ál^v<é )²ì ­…c $Ð÷ --Á"@Ѓu_°›]-œ·c¸"ó·üøÌwH¥n÷x•¼m#@ ôx¡¥ñ „Un—UÎþd/e¾«0ýôú"*/ëÙ6¯Iu¸ù›¾¾8]…‹ ® $@ ´ènhÙÃ$‚¼wpö+¨Ÿ^×òÀ'ìIº›+~·œªœþ&hkÂ÷ýFõµÍ-þ›]ß…¯Ž|{iE H =Î6ÚtØ]ð2Þc/?UP?AÇ#ß7qüç´©8ÂN*zšà=#}GïžqH 6´„)^ ­@Ö´€öÕÐ6iïþ±¤ã$·YèžG€ÁÝ£mžÚ^Í»ÚÄ;¾)"Ìùþ¡¥…sfsğw3ö1$´&½ùH…ÿ‹¼IòÆo¾È»ˆ $@ Ä„– Ãm¬ËÂl‘óBJÆâ[¯ Q²R`ïŽ÷¨Ûû¦sä1@À¶@ã³31CõzæÖ™JÒŽ>v׆MbÒ ÈË-.Ê]H Z^I IJn 4³¾µÊ£™9‹Kqržýmû_© ypp÷Rž|´D H Ú´48zpcÄ{û:‹´‰N=rœ›–·×OèÒ†Â÷œ3Y®Xç`A:²ÿò ÈÁnóøØ'**ˆ:éÆêˆ¨ÿfiµ=Ià”Ét_9ÞWIé¾;è0ÐCøç“Í.ÎŒÉ6<"éÈ] *ðˆzY¥UÙI«'õ(göQ –êASÀ¹À¹Ðð¿ ~¦–JÅ;t ý-l‹Ís•ܯûÎ Ì3û¥tª ¿ã=ãó‚Æ„í–¾C¼ öÚ?­|„§.ž †ŸØâÆ‘ïKñl6\1<µØÒît—ó¢Ñs9aêØ&‰—Mštb¹pVõ¾ÏPůœ¿¼1n´WàÓZ@C³ Ç ¢ ŸÖ¢Oœù*úâM†4„uÎ7РÐá £¿ÃÊ3-o>¡óÐ ÐÍ5íâM§Ç\»,ÜøœEXó>çh0u:Ï¿ è5Ðé„è1ZñÔ?ÇVŽo³nBñ¼þ?Áé»%5Px‚amÏ[ßõV/Ië?7=TU mZ5~§˜ïð¦G×Á´ ä _¤ª*NbÀAÚ™É%±ÑÞÄDŽ k‡¿3âã/iÅ_H†"#oãƒ÷e$^,þ‘Fž\ÐR׫j+<¨üѦ2Ðxkv ðÂÙC蜎PÀƒÀTÏ[Úñ"/ðy ýûàŒ&odðÌÿu^^F@¼çyo¶ªžUy„\À+ 0ÍÎUðÍ»‚2Î+zöŠÌ³Ð&鬇u²‘ÐÙ]›¦q^F¡õ >º82&â…"^ó³Ó@³5¯ŸÐ`âP7Hðx;;ËøœL Ñ®‘ƒ… ^?¥^Æ›\kh·TVl­ïR³ÓÏGTiáï:#Õ&’Ÿuö-èAø³Î`~Î?òÙ?~æ·o8Þš¨“tØ7yŽØŒ¾` ZÞÄG~ÇcpÏÚ‰« dy*”ÉÏÙdR~Ψ`Ú+e0`>‡‰‹'ÈÏÎ<³+‚‰ð5À#VA)°xƒ{r¦r“¯{L|_×*IÆß{˜>ÙMzNQO§TÑ_»¤ºŸ@yFó¸Ã}Ü/Þ¦ÔîNY¹“PåâÜÆy2²:[- æ‘jÞ d jÖtÈKh¶B7½ò<Â+Ã]$™ÞÑUÏìC^âÄmÞFQxuáWäMD ÇaæÏJ.ÞòÜâh>ÄïFw Âãl+9bªÁ0 D_JoHbïˆ'…ó'Óß2Øæfòì)Hÿ*‡ÜÃ[%þˆvZÂ+”¥÷ÿ &²wm¢â,ñ×`¼³0¼½Jà³ ÍNÌ@iÀ¾À¡&|´ Κ‘y[¨À¡ÐQ¶V‚Àf¡lÀ‹ƒèÕNõçÿ*Â[endstream endobj 6 0 obj 3712 endobj 26 0 obj <> stream xœí[m·qç‘×ó)ú-N<½EVoó'A Œ ÈÑ 30u=NÝ•q¾­1OÖ{>À×eoÖ¿¸w¯nµìرÛjV‘‹ä—*®ZÜ_Ý…S¤»ÐÿÙÿå÷¯¾zõÕjËß’Ë)Ý UýßK;åÒuÞù'ªw÷Å«_¾ 'iõÎüïÝÿ˜¦þ«–[OÜÿ³=þû‡oï~öZKrÃ)ÐÝëO´ŒÖZk½âIï)Y›G"[ÒwkRÈZä–ôñš/‹ªmI=‰N%Ç]éÎ¥|´^I²-i¨Ï¶])Æë÷Ù~å›òæˆÒäq{¾CÙ’¾ð¿íI|ây/þ3ßâß¹ªå•ö>ÄízŸû6ÿmO)' T÷¢~ºæ«•X ‰ˆ¯wŸï«Iûv|õÒšo|Òž1G¾^õ/}‡~áGÞw^ëëµôbJ¶ôáƒG8©ü$ã¤^Û«ÄÄׇï]'<Ô5“.tÍeb Ç13ÊKÆ}1Içµ$-Ëи–d]Ïd\KJæS²ªýYÛb¢OOÕò“>ö·¦4‰q×ú?^k’ñŸ´À’S¨1ïIŸ¬.5ÊõÒåkúÆWk¢5©ü$ã>ã·®ZŸê­¯žÛÍÛj‘2³4¬ã8_Ošt×›µò!DŠWÛsŒØ–/Izým‘J{EiU*™ÎKÖé:‹K¾®Òkµ¯5Æl“ÆÒŸ¤õ#gtI ±çd|ÉÚßSV‹JÎûHݲê‚èñŠOzǺà‘_Ëh«.å^áæ“~oP(þa¡X­÷Ö Ñ2íJø¾ùtUâL ì»IŽ$¯õޝÃdH,ÿþõÝ/_Å»þO7¦÷;j@ë.Z‡Mo7 SÖ1tWB=åÕ~¾[7’b•±FU›ÂÙ˜r‰uø=IGv’´'}¿f¬•ónA,›eS£BY­±ø¯·.”ÊÂj=øJ¼ñIß®ýÉBg“'~³Zj)Fºi륢Ö»\´åÒK«ASÇ^Ê'õMŠY„çZ™ }iµþf­`N¦KD)Ŷw܇¾¬ÏֽމDZ…»™ Ï­ÿØ—4)|’ñ;|Þ¤š“Â'M~» Ÿ 9Ϧ凪ð½ï÷I%&ý0©×楶²I:zÌ–¬¾n؆Ê}ÌQÇEÖu½ŠŒ6G«LeD³8;gãƒËÐÜýŸ¯¼Öw>écŸqXR÷ÖüÌWâÍÕºb“&Åè+ñ…¯êç«V“©™l½°—Ó‰ÔI)5ä›T4ûZë­I7'_–ø¤æ“¶µ äH7*Á‡ªúï›ÉÈ ù·ëêKÂ¥]oã羓1¼­I%Ž ’oüžôÄ—‡&Õî «Æ±^=Ö…[FÝÑð€é‘.œTâ_~²¦µÏ{æ¤+>öüÍõ‰6¦z’kÙ'P®ï­“~Øê&EíKÅ¥g¯/Oïÿc'uŸŒêÝÞ õ|´7ÂÇðN¬š‰qrm:ÌW¡¬c+ʤ'&U˜5“Œ“ÕéX%&Í~É6N’މ¯|Æ Ú}~£•aëõo>iR‰IOLê5Yž=AŸ°ñL·afߨwÐͱûï¡}gfýZ/¹ï|ïŸ8^_{­'xßkYOqKñ÷"ÜÏußáS}désã·;¿}LfédG9æÜ¼ë3N †IÆ ¸­)ÇZ gkÌ7–ÖI7NŠÿòÐB7™ÞùI3™“Œ“qqÝß3Nfî„Ð$i28å‹¿n÷ÿXöó7™Éœd<—wŠ“^=æOOVàI½®1Ø“Eæ3Ÿñÿ]7ÍÀ‰pÌéþ“ÛÌ'Câ‹õ‰£7}m1toìtÏž/ÇMš}c@I“ž¸½î]_½ždŠ ¶Ï 3j°}®mBÃþ½¤rêorî9žjûêéçötuÂþ?·ŸLº/°ðO×ÊÔnœ NjþCOí]Æû(¤Nz6'ýÙc‚uÐϱ7&¯5&Ù&½áúõóG&½õ›CÝ|õY•ÃZ¿Æl“º÷VñPä_Ò»>i’qR…o®ìNvüm㽆ذ¬aýÌ×~R/Gøõº]ÞQˆ:µx|C4yÝ𮟧ó¢Ç„Éê?ÁyãÑ%MÊúÅfó ožå3NÜ1[ìØ ¶cü'3èØæwÝÞ|äMó¤ÙÇNV~s¨“‘³Þѧz‚Ïþè °ÉëÁ¯¨ow᯽֤ 'ÃäØ[þŃ¢S áæü[ß9“z-/©ïµ9'J2œ =áýÑeÚ½œ¯É‡NšŸ>·¼Ÿ{ìíyt; âÚè±eM¾IwùÊŸ| 'v6Á 7ñˆÇùÈ‹ßc[Àõ&?Ý{h«×±Y{-²äу‰I%þýjO<²XM_¯Y9vÞ=;¼áú²ýÈ˨kñ¶^Cz·w'5“}›|Ò$ãÕ€ Û;?¸EvV[ÖdzLfßdµè1 ³.ÿz2x¿?ˆpÖEßlå•“Ü舉YÞï&y¿žôË:‘¦;}ß&YŽþUû²ËÇåC÷}¥]6ä]þÖh?À† +ÛòçEŠö×=‰t•£.—Gƒöd״̆,c‘ÏYk'AºZä©j?”~€º¬µñºYe+D¡Ø³nÛC‹]õ]Ed–0d‹|©§~0<¶˜®·ØVȵ8I[ìªï˜U4I²ŒE¾T‹ë‰=´˜¯·ØVH[¬™6—4N)ß×Ī?õ±¸jo¯´i®\m®oí`õµyh,h?ì ÞxÄ!ËXäK5X‡´œ¯·ØVÈ&®al³k€k¢TÁ?õ±¸—j¯hÓÜr½¹cm(4llªv‹ÀÚCÛœå½& l/Ô`î#Ú¬Yõz‹m•Ü.-Û»&¸F¢s¹% Yl¡/ÕjÝ›R[Ý®¯[ã²BË­fÕjYÆU !»DùYóÞ÷RƒšûÊØÚt±àÇ5‡`;`ˆ”ÕçÂ?/ꦸ—¢›ÄNâkï §=`*ˆcœ)²ãØh,w/Ùþ9(ÛÂ^ªõý&&z¤ù×M1SG×|¡`›-‚ö&üsP¶…½Pó%ÈI£¿Øe7N šœ¨öÉþO9&ø³_ýãøÕÿk÷«¥ßšÐ<þ|ÜñŸËÿÞ±45ÆîîùÚ£\Æ2ŸÄeÖfe•rGYÏþtÂåó‰Þl<eE?+ÝcK½Q¿«GSó%\—½ÙΙŠ]ôa‡U¾°uÓ¶„!ƒ-ð¥~j'~dÝ¿î‚iêÎö[õöª½~9Ð^Møs4tm/½¯¡Ü¨‚î­y<\·Úç„Ë.ðçh‹dóø—8^g‘~kš4ê!mœ^ þ0+Áy3 ýÕZ_µ‡`Ô—ÞM¯²Š‡Yý¾w؋ճwØeÅâªV}䢸ÌÍÚê-ááœP mÍTÅýyQ‹ëóÿج¿r«Ä¢íS÷XNu]}ÿá¼úžoõÜ®’ì—°™8€t"¢`bçÖp”±Ÿ­ÒÒ}ËýTgâä“ök4Æ'¾çŠŸe¼þ^€e9¤Š9äÞs%/i×l«´:üƒø-ê?œ m Òc ðÏ‹º-ðÅ6Ké+tlI‡àÂk‹h/t¹çóóKWÁ×¢ý^°}t{îcû‰-ë;_Ö‘W+3„HM®ûQøQ®?±ø½þƵ*¥FŒäë:Æf@Øœw׉´ZÅÖ–ÙÕ#Š{Œ÷~€ë |‹Ú{QŽfj»„K(ô¥ŽúKÕ)ìw¡¾^»fü°uû¶ƒêù¢º÷¼Ò;Æ»¾Gß{tÖI½9ë6ñ[ÔðÓ¦ÙúçEÝøÂ³®Æý¹?îY7¹àêù³®ýÐY·#æ|sŒlâ·¨ÿà ŠõÏ‹º-ð¥ÆˆNä>Fz¡ cäÚáãK ›è‡Í¤üÛ#‰bÍ»-µFn•|ùóaû³–¸»z¡¹?ÏÊPØ6­(æ³iEÓ*>×´še¼nZźøÄ‘ËÒs:‡éKq1_Ë9¶Îè>œ¤íÒòû>áœÅùRïZˆûWÆQÉLßaäMfÎÓ¦ïPÖw¾¬}úV¼?zTš,!“>%ºÚÎËI³'…çåóú Œgd½õãaOÈƃK¸Œ˜±È ý·*þȱ«*IaÏ ÒÙÉÈÿžPƃKÈÑ Œ¢®Yû OÜìo[;ût€ì®TT«js¶–à8 )ïÎVàU¼¯-ËÃÚ½ºWÛžßãuêêo1ï#!ÆU£î<&ËZLZNÂ)œ]¿°Ñ´v>îê©ì'íq­m¡ÝDÍMÿäºâŽêÛa}>úôd±QÛ~ºÀ©-C¸å­Z&ÃZ„TZº5§^ËFm7s©èh]|͵3 ·¡”kÔòÖ Û4ÚkÙC[tšå½/s/¯0í@ŒúZ„:—k»Úk¢Õ%ϤŽiå£ÍßÏëW¯›ÂcõLRöz–´ÔD·þúü϶¦[†­¦ûSÒ^DëÖA¤sD¿«gkYÂÚΘ«¥(âíY{3Ñ¹Ž¤=“B°uÜÔ÷:n}ÁçZ†u'ä½?ÏtªÛ¨èW½ÅÎa™ëê™ö 6Ã:´¨µý˜b-„×Ú´½6Ì1­œö!n³l#Tx=BÛCûÚª…¬í¯¯S´çÏS§Dò\­oˆm¯mÇÔ¼®ËW$ ò­®}Â5¬«Ð>iõßzß—³[ªöê×ê™ú”²Gš´úx=Ó`ü,õ\îyF]9墔–±½žr…!PhYwñ[Ô¿¬´•ÎM[Ϲ\Â9 ú²ç\¬e3ýAϹ K¦'‡»ð­ïÀ-C˦]ÂÐŶÐ °“nİŽý*ãÍC÷m¿¤®gÛýÅÉE³f’41O&V†¯ÃO=Ÿ^ŒÉ:‰è¼çK¢óŸËÒ­}iäTA³‘±rnËtÑè±[ tÖrÐYç©ÑY—ÃA‡£Ó‰Íh,‘]ƒœš)Aûä%yj —lë µÂ:кi:[8å [µ:ÛqŠÑ)†KÌÀEw;#gàÒï§å¸Ä\Bu\B.!;.!— ŽKÿ5ÅQ#—y‘ë’m¹hwE#Ï äÉr‰M‹Z±:„\b –‹î&È%Ö*F£Ès0r© çlä$ –K, ¹ÄR èä²XšV'!—¸Ø´ƒG[B.¹.¹—œKNŽKà¢æ¦Ó‰À¥¿ÒÔ —TK*†KJÀ%‰á’¸$.)8.Ò€‹TÇE pÙlJ£#†‹0p²%Dà"Ápá \¸ÎŽ 'àÂâ¸0ŽŽ Ã…p¡j¸P.ý§§F¹bࢫ+Öa÷:ëôƒÐщ :Åq‰ÉpQ– g[— —ЀK¨À%Ç%dà’ãÒ}g«CŽKˆ†K–‹šÍƒ¸K¥åJK–I‹¤;°öé-Z - Ú,ŽZ‘FÍ#Œš,‹*&7[ýô~Ë¡4‹¡T¤PŠ…P22(blÞç¨A#€mÿ—0öÿrÚ0Hsû?gÛÿ9ÙþÏŒý¿'û?Ûÿɘ,—¿ëžcOÙ}«íï~ûd6¼zl ʨÁÕj¤€™¬FIP®ÅÖãrµ¥H´mbÔàd5¤@=$5SîpƒFe«Ñh¤PŒÆùTã¢Ádê‘Ô¼”­FF.©Z.©!—,—ó‘ÏEƒ,—~®Érɹäb¹äŠ\J°\JD.…,—ÂÈ¥ˆåR2r)År)¹”f¹Ôˆ\*Y.ês¡†X.5!—Z,—Z‘Km–K È¥EË¥1rib¹´„\Z¶\ZA.­.jµ5ì“Õ àB õ"jd¶%¡F5\Ô“.ýÇžM=Ôj@ ÎVC*jä`5 péïEl=pé/œQ@ &«!À…úשc=(7Ô¨– 5äÂÁráˆ\˜,äÂÉrá|æ’ÕÏÖ¿Û¾—´ó_‹t}p‘/޼ÑX¼ýAc90Ë™Á Ñ"h53/ò³•R¥¬4Ñ(Íb¥‹±<Èk…g×åkÀ‹F„$Vƒ3jHå9ZiáQZ!oû¿Ûÿlÿ÷×96Ûÿ-aÿ·lû¿UìÿÖÆþ×)i¨¹YœÈ…Œ< ȳ¥ ¦1bˆ¡Y1¡¸€! 5ã›ÑH䙼`þZŒ¼Y ê¡X"±¿…2t¾Ž uèÄ{@ô¨Ñ€ Ã… ¸0.,À…páì¸p.Ü—þI£ÑYßeX2\–÷‚Fž ɘ¿.RK À%EÇ%pI츬ï#G츤b¸¤ \t•å9—L†Kfà’¸ää¸ä\ru\r.%8.%.ýe •‹áÒאּòl¸”\J.58.5—JŽKeàR“ãR³áR p©Õpi¸´h¸4.KÇ¥eàÒŠãÒ*pi ¹¨6rQk,‚œÙÈó§bä¹¼Z.rQãÌrѵ¹¨yÖ@G Å$F#g—jäÍrQËkä²¼B±r²\tIF.D)€NF.DE@§:.Ô ŽÀ¥ßw;Êò³.ýc"+/À…«ã ¸Hp\$aÇEÄp‘\$.R‹4Ã%à’"pIä¸$.)9.)—T—T —€KކK&ÈŸÙpÉ\r.¹8.¹—Ü—€K!Ç¥°áR¸”d¸”\J5\J.5——ÊÀ¥ŠãRp©Ùq©Åp© ¸´`¸´ù.KKÀ¥eÇ¥àÒªãÒšåÂ!"$Fƒ3È¥y /däU@Þ,޹p¤:Œ\8Š€NB.s35‚¼\¸,häýø(§r±\˜raÊ t raªÀ…ƒãÂÑpéñ+VΆ 'àÂÙpá\¸nŽ‹Dà"ä¸ÇE’á"¸H5\¤AþdüyNàÐsž“sé9OÏÉ9õœÀ«×ÌqÉÆ¯ç Ž=gãÙsמ³ñí9ƒsϼ{u_—þ½î¯ŽKŸ‹sñuL.œ|.ÆËçR1¿ñ󹂣Ï<}Ýö— ¾>WçìëP.Õ¹û\¿Ï ü}nÆßçþ>7ãïsŸøûÜœ¿Ï ü} Îß—þ¾çïK0þ¾ð÷%_ %Ìoü} àïK_¢ó÷%‚¿/ÑùûÁß—èü}‰Æß—þ¾ñ÷u 7þþr º•ƒ¿/äü}!ð÷Õow\ü}açï _ؘ—„T÷“Ès’lß¿Xœè\Î÷÷$jÕ>¼[ó¨St29@çòÆâœ´G¼";­N¬ uÔË;˜sRb[Ÿîq¡AÇwÏ uöƒå=!\Þ*“j°õé7~£N^A¯ÀÀ+ã‚åµxÅVgñœ­NA^‹nuyÅ~éH6:„¼b‹–×@:µÐ)È+Öly-'¨Ã ty-§$V' ¯Xšå¥ã yÅ’3è$ä‹è0òÒõ xõÓ%Ðé'PF§ŸR¡N^99^Y€WfÇ+ðÊÁñJ x¥êx¥¼Rv¼ú)¡ÕaÇ+ðJÑñÚ¢Þ/:R¯Nmu²ã% x‰8^º´ÛúôSZÔ À«Ÿö‚WàÕ#@¡>=ÔÔ§G€¢/õ9œN^êïa}ÔUµõ"!„!úL÷.ŒåÐn æÐn"›è3ÝE+ÈMô™DŸé>mC:„\ô™îõ6¨CmŒêP‹AÇEŸ©åÑŒDŸ©õbK€è3õbÆàµŽltÚO6¼Fí+Œ¯QŒ@ÇEŸ©%\‚‹>S‹p䢣å¢NX0rˆ>S»49DŸ©]k¹psÑgj[.j;#µ°t\ôYÿßh@ô™Zû¶ˆ>ãj¢ÏÔ›°\Ôß°\ÔA.ê³è¸è3õ|*è¸è3õ  —Ñgjã.âÏÔ3\2D ©\²‹AS_¸d…¦)pI.M=[Ã%A$šzǶˆEãd‚ÑÔû.áhê¿;.ij;.!iºž:.b‚ÒX *Å„¥1C\³ Lc†È4fMcv±iÌœ¶.et œ<ðs§4=éÕß^ïû¡Wý?“.|6ÆÉx~ã3îd©[WŸèûaBvR‡‰Ödt}q¤öqNE}}ÜLp|ÿ¤+>=ÂRú„ìá|)jÒõ~ž]ÃÿÎ?éj}^„ï»D’ÎýòÆwü¤O'ý2!öµ×ò#w©¹nç¡Ìþè8Â%Ân)úøÏ¿Á<»ÌêÝ5SÿttÈ4(ü³/ÕîAûÍ$nizt^M–ÚIÆIK'CîßÍ÷•¸ØæGè?FÏã`²ø8ø“ºNÆôd.OªÿàË:ùŒ“>ü»CkÓ±ý~R‰ ÈÉ„øo>ãdÂÿÌ[9ïúös×õ¯}¾d™«¶ÐmÊÇÚ=YÂ^p¸Ah¨û¤Z“Q>Éèë0Ù¶ol;Ãí÷“*|ä”.ÒÝËîç ;Óɼ›¬µ_™ý_z¥ýøhïú¦ýeO‰ýÊì =yÊv›4™”‡6ÅcÆçÕ‹í^bšòü­ä¾Ÿk÷“¦ÖÊ!ÛÇ÷ï3¿x“µ~’ô»C–Öd˜Ý0oo8ð“1tÌ6=4ŽùûÞ˧$—½÷_CKΤÝ/hGß ôÇk÷<¶Š«û±Ýl²Wz_òú éï䤜ÉdøNöçVÕmj²âêÂIýÿý™‹üd•8fn,Fâv×OŽë?e¿YõعíÏõT«G× ò{7Ê×»|õ.«³Æù :k$ ÑYãŽN§G=&q”÷»|y¿ËÇÊ{Ôã O äkÜä ±FV5þrÐY#4Gõ.ŸAg½ËÇê1=VÔÈ“áÒïò±r2\ú]>V€Ëz—ÑYïòu²ã²Þå3êˆãÒïò5"péwù\äË]>£|¹Ëg”çòd¹lwùX&Ð!ä²Ýå3è¬wù~—ϨQä9¹Ts6rGËe»ËÇè¬wùŒ:¹lwùŒ: ¹,wùŒT@m ¸ô»|y¿ËÇÊ3pYïò±:\Ö»|¬N.ë]>F§ßå3hô»|¬¼.ý.+Ã¥ßåcå\Ö»|ŒÎz—Ï ³Þåcu pYïò±:b¸ô»|¬œl ¸ô»|y¿ËÇÈ×»|F츬wùŒ:⸬wùŒ:Ñqá`¸ô»|Œ¼ßå3Ê3péwùŒr.ÄÀe½ËÇêà²ÞåctÖ»|Fâ¸Äd¸ô»|¬œm \ú]>ƒ| úå¡—õ.«“Ëz—Õaà²0h¸ô»|Fy¿Ëç"îwùi¡,Ø£T,’õ.£-õ.ŸQc½Ë碱…“y„Ñïò1R1¹Ù’è†Ô –CiÃz—Ñ(Âz—Ñ‹` í5hÐïò1Ò0ö¿Ëg”ö»|i¶ýŸ“íÿõ.£A¶ÿ×»|ŒF°ýŸŒÉòpþ›Îï.÷f›ÃÝN!ÉÞÅÑ_ƒÚ{#ú›R£q¹nwKI!än§HlïâHBP”lÛú+aÐ(Õj4¼5${G=më‘)[ ®¨‘‚ÕÈxkH.ö.Ž\ Ö£5£Q"r)d¹F.E,—’K,0¹”f¹Ô€\*Y.•‘KË¥&äR³åR+r©Íri¹´h¹4B.M,—–KË–K+È¥UÃe m1Kô‹Ñ „l¸,a6Ùjäh5 £FMV£— dê ¸ôx"«!5Rµ% F5\–ð'[ † SÈÕÔ7Rõ©: FªžÄ ­b¥ëÆgy ž]×_ ¿h,ÑX¼¢A#eÔÈm”«Ûe¤mìÿl^ÝÓG)Ùþ_m‚Až°ÿ[¶ýß ö«¶ÿã(6ª,fͨAä\<g2ò" ¯êÐDŒÑ’ˆ‘EŒ, #c17GA^ÙÈäï¿R?È{0¢•³e¢Æ5BQó;NF,‘ pY+Nwþ#»VN†‹: O†Kµò\¸:.€‹DÇE¸¬¯VG uà@^ uAÞ —¼kä««9j°ã’¸¤ä¸¤ \Ö@d«Ó u¬­\]o#gà¢î»‘'ಌÅqÉ ¸¬?î`tJ.k€¸ÕaÃ¥$àR²áR 毆Kv7òK%Ç¥2p©â¸¬¿7êÇ¥VÃ¥6àÒ‚áÒ¸46\úGVž€KËŽK«À¥5äB!X.´~Pau¨ ‰ Oläó—bäÕrÙŽ2‘ EJ ÃÈ…¢4ÐÉÈe9–5jy¹ôÃ_+×ÿ9 ÈÅr!JÈ…Ö_“uªãB ¸¬ ކ 3pa1\8aþl¸p.Ü€‹ÇE"pr\„‹$ÇE²á"¸H5\R.).‰€Kbà’ÄqI¸¤â¸¤ \Rs\r0\2—̆KÌŸ —œK®À%7Ç¥àR¢ãR¸q\J2\ú/Yy1\J.5.5—JÀ¥²ãRp©Ùq©¸Ôê¸Ôf¸´\.!Ã¥%àÒ piÕqiÍrQ¹¨KÙ@‡‘‹šcb4Ry®F^ÈÛÈ…c°\Ô´\ÔŸD.ê@ÐIÈEíD‚\Ô©¹¨i¹¨ ÉFN_W.#—òl¹0䢿+p¡æ¸p.LŽ ³áÂ\8.\€ WÃ…p‘\$:.ÂÀEÄq‘\$;.R iÀ%ž8ôjò. \zÝ€KrN='ðêµÿ—~=gçØs6ž=gpíÕ1\28÷ºU.Ü{Îàß+XÇ¥€‡ÏŹø\ÀÇçâœ|u• —n¾îã†KGŸk4\*¸ú\Á×çêœ}®àísuî¾zpÀ¥9_M Ã¥¿ÏÍøûÜÀßçfü}nàïsŸ›ó÷%€¿/Áùûjùè8_‚ñ÷%€¿/ÁøûÀß—hü}‰àïK_¢ó÷ÕK ãü}‰àïKtþ¾ñ÷…Àß2þ¾zÝäÆß_­DËEÈùûºŒvþ¾0øûÛÇüKÞlÀ·p¼ÜÓNÚ¯ò?'”ètö8'¸›C8²½Õãå—ÎIûì ¡5Ô ûOœÜÍ!²½ÕÃå·ÎIûÏ-œ(;( ãn¡ó/ó.¿qNÊt’8!Ðq7‡P‹pËM È‹j³¼¨VäE57Ðq7‡P¸å¦2òêá\ •fyQq7‡P)pËM õéï#­#/*$ ãn¡€W¿û êÓïG³:Ùñê?ú`uÜÍ!” xåèxõ÷”F§ß:ýÎ8«ãn¹üã9A¯~‡Õ‰ŽWÿa£#îæ’ ¼¤8^’€—ˆã% ¼„^d_b G|‹-ìkl¡†ï±…JŒo²u±£!rF+ÈÃø:[·û>[bµ/´uSÂ7ÚºqÐ|§­ ƒaTn¢cXn²6®@7aSB( ò\ȸr\B.! 5L,5]‹7b4ÜÄvªñTAnb;Õü²\¸Bl§qÈE ½:.¶S FÛ©Fg3Û©F«)¡@l'ÛÉb;Õp¶\Ô¸F.\ ¶“‹‹íTC¸d۩΀á’!¶“³‰íTg¸dÛ©î pÉÛ©Nã’ ¶S'Ç%Al''Û©Nšá’"pI&¶S@à"&¶sýo#‡ØNuFØNÛ©Ž/pa۩γáÂÛ¹üÈñ(‡ØNuÞ †ØNfˆíÜ~oØèÄv2¹ØN]Ú ¹ØN&Û©æ+p¡hK€ØNµe —±!¶S­XÇ%Bl§Z±ŽK„ØNŽ.¶SíXÃ%@l§Ú°†K€ØN&¶SmWà ¶S U Ý ¶“š‹íTÛb¡›‹íTCÕÄB7ˆí¤F¶ˆíÔÚĨWˆíÔá1êÕÅvª½ 1êÕÅvªq 1êÕÅvª½jbÔ Ävªé`bÔ ÄvêÈ61êb;ûOÄÛ:Û©)pÉ.¶SmTà’]l§¤†K†ØNr¶ˆíTÛÔpIÛI b;Õ*u\ÄvªUê¸$ˆíTGÙqI&¶SmRà"Í~ÓQð›Žl¿é»án)Ñ=í$ë`ÿÜ'sã{ÔÛ©M¾Ì™”5ùxf’tì{çcßCNª:©×¡o™&ßSM¾è}ö§ÀOùêN]åÀ剉øOJ'Ÿ$ÝøÆòæ} O¨½möû¾¬Éí9ï¹:L¾4îgËW»¹ï3ºcÝøýæ#àIµNƤÿÞµp2ÕŸ=ž=û'_ýûªðØÐWÿ÷ýgËÂp1É䙓ùé¿Q<öañ³¯¸ñ­î¥“^=ö%ã|iÔ¼á\_zµá©¦[ß²NŠûÏ0\_òóùc½?Éø’Ëã±oÆý´:†l2a~ðwË·{ðúzòøPÏÞ' ˜TíÆõ)?ÎætlÉŸ|eèòŸIŽÍ½É ð¶ãd&LFγ­Âc7ñëšIG _ ·þ{²jÁëËÕþ«_ëY÷víè®ñ°ý@üÉRö?·_Z¼$l¿˜³ª²>p/¿™bÿ<—nj÷ðê“¿þãªïû¯~©ÿü èRendstream endobj 27 0 obj 10666 endobj 43 0 obj <> stream xœÕ][oÝÆ~ׯ R µ[zo\. @bûÁiâ$ŽÒ"€aK²|‘,Ë·:ú‹úÒ÷þ™<Úÿ¢K.y´{æ[rHã‹ :«ÝÙÙ¹Ïì>/D)U!گᗃӽó½óÂÕtŸ­Ëª0ÊùŸVÖMiëvÎõ»¦*nžíý¸'JÓ¸"ùYüŽ>õp]©Ûèø÷ƒÓâë}UšBŠR¨bÿ¡‡Ñ4/Y(#Ke‹ÚɲrÅþéÞ•ï®î?ÙóPŒÖí¤ýý+÷Û¡ª¬”Fžµ#ÖOÓ½CÂzýÐQXgŸÖ´Cª¬­&dä°î”±)¤º¬í””yÄé²ô(9“ÀvÃ:!EÝÑ…¯Ú!]j!õþ=ñ;‚ú94Ð\(ÝäiNÏ|£©K%”@ý%¬sNi³1¤”Î“Ò œo`Ÿ»8ÍK:4,´RçQN zF%ï5õ"@o„¬ªzÌÂÊB€¦ bG”„¯(¿\ ±“ò£"!JdÈ:WÊN„¾ W¯Ïú§ åRGCÿµ»‚Ä$¢H‡Nò³|Äžˆ†ñ2-›È­=W“ßñˆÎ¨Á¸•6ág0iÃÐ!]Àƒ…'ô@{°ð ÌR>²¯óô°½†¡‹I<äOƒH)£ë&¿á3JÀìçtà8bªô4éIQ°^`áõ ìØ˜Ôâ3hˆ•4ù ƒÎ Ï còD=Μ'E Ð&Êy«IéŠw„äé@•'8<ÀœqHš”\ï3ŠK .`G ½€^y饄·ãÏÁÔBWÃÂktÖ?è,+/ª„þg0ÿʪf˜UÒY`áþ¦ßÔâù ]<F–W¥°bué`­ŒQ>©T>œ×¥Ë™¾÷,¯óˆ%)<Ò´6²Ñåì]˜0ïÀÆŒP{ôÔ@±xöd±¯¥hPÀè‡ ìÂ3bÀ¨¿Ÿ0Ò3(˜òš'$”\‹íýôH#y ÏSe ‰ày>@gplž Îâÿ„Ý‘/C<ƒ|#8 aô0 ÀôœÅFà`xáä{–n\Ö¦NÄŽÀ¹óržrS®$â¬ÎÏÙ @C‹Cæ£à kQÖRGlû–ô€2ÈÊsº†ÒÛt1<©*ɳ}ÃÕöQQ85/äq¨ÖbûÄŽ§Gà@€ªo—€© ?¤ôÊéQºp±}çù0^–ü†jÀk¡}¢9"Åêø€enGì! k"=îÉUYé62¢8„É¥‹ÐJLàßYŠ6ÃNzºy!l$8 /€W^¹\9©¡"u›jmoÑkÄÈy€åÈßQMD*€6Ûd6`#00 nèu¸Vª¶yTË wZ z§´.eãCx-{½+(±T”PuҘΒuëUŸOaeÄ zÔxÇ×AÓuZ‰À¢ût7@ôÐÃ#<é-sºì÷*paݳ’Ê””‘õ»AÍÓÊå˜ëLH‡žPºŒÜŒëàX!¯+$×À0I ªÿc¡Ê+§,.x.n:É„ó°v£õ4KÁù- ÀºòªÛ4¸?P}º7„0Vª¢Þ¦œx…﩯£=¯N:’º÷4ì¸ ÉÃkVÓ¿è6ÏìñZ“€C<J$æ]ãòòSVi>Þ1ºyªìy2Ñç6UíÍ‚‹r›¯©NÞ¦†4‹’j$ON¶YÚ¤à•pGÒ¹ñyEcÀ[@‰üåéaJ¼IþN2Þ×9Ðs5îI,Ï)€ Àâ5/¾¸ÈWâ'ªÝÀ¯.Žä€ezò˜@$x]s/ÐÕ .@Ýæ±ÿ}–äÌ®5Í*dN¨6 48㎫–;®àÍË:XýÐñ,žÍù)ìˆò¿ÙÆ—w¯Àk E¸ì·7Çë îÅÌÎ7äTmÝ¥‰|ôŒ.¦%—è<ïáVúÃË·†»!7P˜ð¼»Wž=Ép¡ÍdÞ•Î6Ü¡ÀkF r#Y ¿õ •±U)j9Þöɹil¼0æÀ |˜¾Fæ)?‰ˆ‹UÌKŠg²šg(xýàb XPÒì}T²–¥me\‰RØî¤’±ÍÒ¯i†÷Œçx еÅÇ.îÜáåf¼çø>‰äiFUg2]ZÕÉUÆÓ AáG.^›É% †QèÆ3óœÂxØ nóáÕY ’ „f1d­'ÄlÏz.&}žã·'[|ƒõ,à‡W}IgÉö³—rj¾2U;ÑFñ@ XÞÓ³¹g¶'/F¶y·ˆ¾øé ^g;X’·ÉëÌÅ}š@#gÉël0¯44»Ð¿8òÝ…øÎND7eó®AÖŸNf¢J5`ˆ—IíÈ÷ÙÄgœÕg3q ^n‚Œ|¤ßvúâ"&ïÉÞ“z—5$Á‚cŠ9©µì²»îU[ªø×ž,¾ñßOü÷ã=ï\dûÖ[!]û¾ÛÓ½ªºøtÒ}ª´ªÂ'cT³ùñb½Ÿ/ñR¢¨»'v†×/¹¦ï_²Mi\û"^™w/`úC8kû¯¤€£|8'Ó-uR;¹~µÙ ]øšÎ:ì‡ÔÅ»B謂Âú‚κш<« $œh’à0ÝñeÆ3€Úrí­ÓþÓ‰c Ð œñݱ¤Ç~Dau”X9/¢•i¯hº—”~î̼E™ù–…êEâ9]¨ý˜ÊÊ]è5‡Mu]ªJ¶Ý..¡â¸4Ô@ô ÖB §Á6ÖN¥ÙØ$ª€Ö@K–J  `%U°ðËvHŠö-Š¯ÂŒ‘¸N‘ø$ˆsHg¼x2D‰¨íÀ6f„Cª9­¼×óɯZë ÀP‘gëÀ†\)à80pNhÛ ºð˜%×(x ÀJÅà èÏZ|ì7VÀVÕ.öy¿eĽ{ühˆ‚&ÍÇ å×%Š¥ÂK†(±Ûxå#)庬!À @Á7+ÚjÕ†ÃÉ}÷ yö $…/è–`eC‡T>†ˆø`Y:äXñ€UÑ!±/ÍBÐ Ø/Dü«9O¼Ì–ç©A–ìÐ{*(À€m3ŠÜ¦?ázWDöÉ£VmhÜi‚HPb±7 ÿËÒH@¯]ø7–Ë9pDÀža”àÁ‡}@L€L€A¨HÂŽ§ynªÕJWm!¦ú<é'á´€#à(›6!Ÿø3 "õnÈTN4ÒY÷X’ÇS8žòŒÀë&¥pGˆ®#Ü÷¼¡¼‡µÞÃÚ!ÊåyXPºÖH"p§<Û¶¸Å+‚AzÆóü¼‚Ïb[ÎÈ“i^&Éó@±€=œEŒ»-€`Ú<{8NB€0‡;–Õ‘8/ä‹WUYÌ¡ÅéßC–IòÄCbG±ÙˆWûìb3S¹Ò·86‹†þÝ%õ™tC`Vﳄ0WõJª8éU"ò¼·éÐåê™éÐgtÏXüÇ^ÇÆ¯ †r+µfBó¥/6^t1ë@²<ãAÍg$;¾•éL„³¥ªfÖz>Unó>À‹çXG$g|Çy’3›#WPƒ¨¼@€ô~‹´•^mŒG‰Åa'¯Rd‚çÙxOîA¼Ê ïFB²<èRè®t­ÊvÚnªK<äFbÏñ³ó¬2(çÎîUIWñ5UgaÃè]´TBV¡[ÉŠzýé$|²í+;º~$¡ ù¸ž»Š×­dš\·R]yâª"Ìh·R*M¹ᥠ_ÓY‡½šdr04Ô‚6»ƒA:ÌÉäÐwÁŠÆÉ(€uÌ2åàØ¯è±A‰ \<爳jD)tÍhiúl9~‹ÂÊ9ïI$rδg¤Hl³Ë)ËËÚ•u¥âàP-¿@hOr­O°Í%V@m€j®»g 3s5)%€ÊñP‚\ƒ“^å¼I^)Ùî f¥å€Œ3‚ÐIjäjŸéÂ\M:4£‹fòá+J|`¢À@â6( Â×(%x™+NºӻÁ¨$lPÓmJföF¤‹’Ú¯ÿ†í1’endstream endobj 44 0 obj 3952 endobj 54 0 obj <> stream xœí]ݒݶ‘®½§8W'›¡ÁTåbãd«²›dmg*ûS©rYÿòŽþ"ËIå•ööe|Ýì•  öä9g<’&ª¸t f³ÑèׇºòPÂ_<¿x}ñú jÙ¿•îªö ¤±ÿÕ¢ë+Ý 0÷¾hõá—//>¿¨+Õ›CòßÿÁÑÿ±xMÕ ÿQÓ¿?x~øÅ•Å*ÔAÔU-W-޾ïuíè©D%õ¡3¢jÍáêùÅ'¿ýñÕ׋jšèêáÅ'_ CmÕJF^ #ÚNO*å‡Þº¡Z[”~è‘{N+ 懮‡!YuZ yè‘©tЉPÀó¨"O8ì>ŸÊ³ ðºð\-êνä~3 5US‹& Êgü7Fúkx^˦ÏóœÏùÓa¤«d-M@õOî9cd£fCR6yöq^ù…å3q6oøPxP‹&Oú+ÎЗ\òÞr¨?9ì}-Ú6ÅN—ðš/! <èòo4J´M^¾fS/,b `)`MÔÀù ©ÌQ ƤlI;š!jK´µgŠÚ’N7íL%¡ ïòÆÄ¾½5éúÑ¡GüA?•^  ¾äPàÁ7|h\,UÕFè0ôØ1]¡òØïsJŸq² <ø’?ø #ëi·^ïe³·­nêÄ489Öù!À®gŽøºRdçS¶bþ¹V %7­¾÷/ÊÈ@¨t@–“ɪòkŸ{˜]JU°FQì› Îü Wlσ§¤þRjQYÃy)äY ÿ øò*>tK]Í—<÷`JJe ¸çC7¶(Rü°‹’B}æ¢×2}ÅyóÄ5Z¶³øp¾Pq¨{œ £~ÿêêðù…8 †`:ü­$€¶ñÄãy‡×ÙŸæÐYiô±ó!ºiC_­+qw‰iÁPZvMºÄê7Î7²¡lK{ã†:)»™° Yˆ|^Î1½š¼ã¨½‹ÔFô‰7O¡¾ñŽT ÞöŒO…ðb>P6@Àƒ¢¡<ëV†ÀdîÏi¿æ0 Kedgò3$¼õï3M=_)ú¼ü¼]e:xèù0d#>m¦50ÈôNCþˆ?6 ‹Õ¯öÐGõ2MÐ/eíóA÷V¿]<ù\ÖP{9ÇúÒÚÜ6²é jb\õ­)¸ #‘ó—ê•{c¯fiÁª‚¼sJ›ct”Y MˆIÏCN©çªgiNú`ì¹ ¦4€ðù-¸ø|À’=š ¼<üÙšöµÿ·R{xv¡:kmWÛ¡;<¿½1dàúâ÷ãPÊôÉ¿+«xmÛŽUšˆÀD„E0‡øüâµE#6,4M?dQaàš h÷bï=½øÃ 6»èÎü<•èÒyú@„Öäµ±½ T„Ÿþ­¼ ÇŠ‰ ÇË «“ˆKá~Œ3F¶Z5¸ß×á÷qlŒkتéR®ÍߦÍQXý©Ó†¥'3p?]ƒD`·¬J$gº Êtt”߸j.Ïãå+‘jQ¤c¶û"ºÁ…dJ¢ö}­9Eõܹ-m}é,“µœÜk€’Ñã~åÐ+»ÖÁÆ>áè_p\܃JçCK\ü$ÿ€ì[Žì¥Ÿ¤5ØügÙCõÇc}[é)âÿ›$-T–1ìgÅŸ¢»I*‡).¿jí”W=äköˆ#‹ÍKÝ?C©ªSµîÓ%kkÑõ)³Ès~~jj“_êœP^ÊÖØjlÚlMÀ8þé‰éùª‘i„oi ãá._Oùû/š‰cÈ’ÅD¹–ñ!Ÿx߯ùÐgîAZ/ý’£R™WPª@ÀJ‰ã'è§ ž¦üø[®f@èAµ0Çé§²^ ý3WPÀi z`F@¸ÀP^ù¢Hä׌ *Ñt*’yMg_žV¨|Àa¸Íˆ›00ËN#cI R~¶¡lÀ ÉY©EsNÃj~%{üm岉k!‰¤NƒØ‰"J¦û­[3ÃÏý¶Ú9ƒˆrå~2‘¾%Šû]7†ÎtXBU«:À¨ÆýµŒãœH]€¢J@4"“X'œžÙˆ¨ï€ Ì&}>Ñÿ„Ç3Õj( ^3@š#‹ÇâJäðøóXiNU‹4«ÄrS;å95½©!) 3¶T¦SãIL!‘êÔ:¦¶nö.fç’=”{ˆh»r‘m5·fä;µ¡sù>S}¨µöЦC¼uåC²É†g ëâÁ~>݈qî?òbƒyU”õeßOs”"€rÎ þÆ’ÂÀîúޝ‰ª‹_Q~ï™Nö?½ã…¬ò×¾!á&I2`D®Ž²ZZ)É׊V¬D¾?•4þ'_ÀŸòè¿<”–&‹ 0ˆH°þÛ©ÝSw\o‰ßù•ž Fˆ œeåÚl ¯Q¢ê[Mjxßò)mªìЊàjQqðL Õ¾ä”6Uå4T@ŸA e+Ü'â³³Z ž9údåWÜ¡<æÄ>æ¸óÁ:–µx}Lû-g0û`=BÁJ‹Öäi(’8Pûbм["Àƒoùº ÏSE'ª¬{?.€êyÖåâ_ö9™öNÔµ–“ÿ5_…ßp…¸òfÑTµ0½YP=ý| ï¾åT¼äÌÙòÍì\7}Õw“îß ‹w2kˆ**ìûBߢ¸5)誩)3[¯8®ï½Þ‘ ³,Ò>ŽvŠé¨ð2„õdžo67®[usv |#JR°Óàú³c è©<„ºù„I »Ÿá×* ³'΢œ€µ(Rá¼q«+ÙNõ~ðµýi‘¡âöslIdÈâäã…M~ ¬p"@eÁ^”2>äüJàtJ3Š`óKÙ6  >ù½;»©_Œˆò’e‰;ðm9ºšO€¥û‚Ú‘Ðr§c)á'­·YV¾ï³¯Ýþ@Œê+ÕöÖ­ˆ¡&9üCÍé`´þÜΈÎ^òØiì,k2°¯Lؼh¯x¬K.YœÍ@HöYý«âÀ½Ü3lÁjqkÃRÅ/¸ä‡Úh,*Îí1ØB‘ßEBV¨CYÀ[’X‚ª.È€#©{vßf¤à;ލdGŒ‹.›NZwpƒ)êB?°ßo%”P€ˆ-HHS¨³z½¨T<< A”r P3<ËRÖ²’ãØËõ˜íÓí„>Y®ÝL7¬çŽþï‰ 7ÕõÃtŸ±šºîöµgx5Þ Ñ‡s»I?cÜñï^ÓHl÷/Þ‘O}`¨ÜS†—˜öcfÀ¼Æï¡—²i«f¬¸®,a|ë?;Óp ÊZøèJ,ø„ ʰ9‚‡½†²þ¬DÿÁ|€à%ðé8Jq–™XÉU¹Ì€Ò]Ö~—¾5Uã¼Ú=å²ÝÄü… |ýysAÕÓ)Ï#†r-™ç0b%CýAÃ2}®;âc^ÕŽÃ7ó–•ÅòÌE»MH©œ)W„>¸”-'H–@eaãÊB`|ú9¯˜˜ŸpÊì´}Õë´ãh*–âÅ@À¿²¢Ô¿uf¾¨§® PYŸ,ž.J ŠaCrQ‰´–ͶìÓ=°’¹{PúõkSëyê“‚à4Ù½/¬.N;!áÙ2ŠyÁ¦³¸¤¬¸¾ò].» D¥v5+«l¿q|¢;FS4d×ÏÔ§r~ÒúJГ™§Ë°OéÔF£P¸Ãôô›®ÄÐ3Êê?(¿Rô™ûH»¾®s§ÙÅtôúåÓ¶9erm õxâ:_7møÖûaO¼–±ÍÓ(*&,ïX†2U¯šôcÓøzÞ5Š pjU'UêÕp¨kp½qo¬ëF'¶ÏTÆ4:ñžJ7]ž†WÈ(U¦χY8 €ƒÎ ¸1I‰#Å?î¬OÛ½ä\ÍQ‘2'œÃ̬tëÞô}ö`åZßP(p*wÃ);åx5'Ýwj£íµÀ Mp8²ì} aÒ#>AÒt3 #§àAÒ3²É΄þÈYQ×FçŽv‚!–vLò–¶{ü õß1¾ëø–ÓŒ.;|[&&@œ®²&Zà2à*XÚo8©¾û–E5ï(LhxÁ‡Š:mI¿å¨BH¬…^g ƒà 50J¯‹$b·fBÃQ¦³€…alH·€H_~oƒ„iÒý»©®‰Âå›=ÖZH'ëSçœjÕ,œÙØóJ<<¸ðŸ´|„\?¶K¥U%‡Ý)MeVŒ‚fÓ$ëè¦ ¬˜%˜h0% rÀ‹»H-“{@ê‚Úl¡oMß¾Õ¦ƒ>x‘ZN™ÃØY܆J»R¦”>)²ã ªF¦Xqº©;CD`qn¦ÑÆ çjlŠéb¸?ö|K¡µPHNè)£™¸f†P|h>$X‰ª€,åÅk{cÍ2‡y¿h‰]e±×}'|å3YŒ"+ûX‰£lUv¥ÍN£tèÞ\Òf‡€ßµÙÙ"¦ïk›iDì—Ò“ߢ'c/úïC_©»Ø cDà"‚ ·0 #ж) ~ ¢˜  1¢hLŸRá"Š "  # ÑÖ) ?QLQÔu—NÄDD@A Âè6¡" L("„GA!F” a ¢˜  1¢hMÊ‹0QLQ Gº*ü@D1AbD!útQÃ@D1Ab@ÑW*è>¢ŠáQPˆ…v(Š00¡ˆ…Pè®M©ŠáQPˆ±As#S*ÂÀ„"B„¶+bj¿Ô‹ ýk; \O»ðÝxü¯ÂöKýŒßa€4¬éÈkCû¥‰ŠÐ~i"Ê“1²"RáÚ/ÍhX›±xî·îfí—ˆIs¿s”4F"Ëýn̬ý1Hî·P³öKÄ޸߃­HßÍÉøÛš•â ÖÂý4=ÁAŒûÝv3:ˆ®»ßƒž¦8¢*»ßvf8¢¦Ž¿û¶'*"‰ÞˆA‰DAôlü=,BŠƒ¨‘k¤eU@ÌT mÔ3¶Òö¿I;ª#€hahG•(áŠäŽ¢7™¼Dòf¾4úEepz&}>ñ“‰ÌÍ\\tWú¯à‹TjÓ÷•HÛÌóx/Ò¥ïOO"i3Ÿì:¿Ôe$R6³ö“åNìpjì ›ÙéÉæëEl0ªDÂÆŸÇZ·Ôl°rЀÎÌí[¢¥WÚ"‹eÔÆ¥A ™Ô¼«¨KÃ$ô¨Q[—:$léæôðІڻ4T¡Ç|î,8Il^l$¡ƒHaXx‘ؽ4\HœbùÆîôÑôùîõÑöMíÊ&GìÚ••Z¿4æ íÊétdÛˆn9:²ÝJ·h`fJzçd[Ñ­¿ }ûB#:SÒ‰Ž®Á؉»Ñ™| u< eZ¾é³Šr–C“_r¿Úkn»>ao<¡íKÍôÎ!ž()µ•¹Œ›qŠ+¬¹Mnqï‡‰Èøœj\6RWíÝÙ~Æùóœí—êc²ïI†‘«ÀÆàž€»âÉO.ÕT­¥àöÙ¬U׳pmi”¿`…jDY·|`ÀgØm¬ì܃aì`;ošõ>À#z”–ÝŠå œÏÓNùïÑ´ÜLøØ‹_†-[J*€ {o1Ê_Ä@cSyJœÅ¦–á+.³$“Ûä¯6f‰ÅÎj¥®µÅY-¦yWÅ5¹Í;«¡º˜ŸÌ¾J¹gÄW[¤…вžžeuϲ˹zÐ$ñ6$›..;“-ÜâVá…wteA@æ›Q_|°_½OWjÈK=…ú·•õ㾬ì‰+«”Ýü7ulÇÉ•¥/ë v¬*òÖ›ZÆ^^ÂpéòÞ°„*SÙP–”©¸ëØXeç¥Î&e^Ø–0ß{b½çpL ½»•ñþÝJÒ•ÜJÂnx-»”e KwÌî¾Ç»¬€H2Yv>"»Uk·*»Cßóµò•ÁÜš»8ö\Åqs_* nâ©L' oâ0±)ÆÂMµlzú’ôöŒcoâ šŸ½‰cñ£þÂ=Ëz˜¿ˆã½q%_û’Í— ^ À1·p¬Þž“÷'|Ô%«Œ:ï'ž½Vbáðqãùdógú­ Í_—¸ÄPpûQîåÛ7sƒ·oœ2¶[ØAìʦ,U€*»¬Bû7@xÃûSþÀµ±(¾*ë;µU#g>ãP¹‚ÓÉ€-e™7L.Ð[ª–oºy×ÄUCÌ˹¹ka¹£l«Åm¼åwÇ'Ä2%Üphªäàh+ª÷ûòλ{Û爖îmoÄTïý-He˦ –¢ìûá®{ßZ&ÞtÙûÊV’¼Ñ§jRÝ»Î߯ËÞËv£î¼ìýR mIÓw;Ñûïv¢³8á¸è«"•½ýDŸ @^qì½èešxº‹ÑûF[Dew[†#ë)ËŸÉsI*¶‚{»û,ÇÇ IÅÿ-Ijñ! µ%I]Œ<ŽMRYŽj…«ïÔGÊÝ%©Û£“S$©eJxÒ$5U@Óë"]. ÑvÚÚüIæœ,ý9Wï1î»´0ÕpÛÀåï{·0,„E۬袕më[ÐÀÇ’mÛ—÷éêí ¢±ÊÈ'°ÇœØÇœ=ù]:tâ%Þèd×éÞÈŽ`ÖÐË]¨‘£é‡h„q)MS‰¦¹©hoÛ™Ìå:´öàÙx!øéú-»±ü¤ÁàÛ»-eïÿÖ½•ˆîÃ8˵{_îäæj}d€; Ø ¦S$ôÀÞü¥@«ÏÚ0„ç _/ïL¸Jçϸ¦0ÒCèXËébÀ[Å/Ľ„ø[s B¥ˆnàÄÂús ¢U{sU”oò¸PjYÎïAœ–ìfzˆ»h ` b øš¯) Ÿl„ÈêÆw†ô¯xœ<çW\ǾÊQ°îRt2¿{­;ày¾ÁØ·´xK:Ø«ÿˆÏ /ÛìRÖ ¡8?X-yg}ãJ­ù¶¸~šZåúW#ÃqŸïxëØðçï߆»°endstream endobj 55 0 obj 6100 endobj 62 0 obj <> stream xœí]˒ݶ­lïWÜ]줆"ïâØ çU‘=U^$©ÔH#ÉãŒ4šÑ#É'æ/²´¼ö$²Á>¸ïÌX‰£¸b ¸Ý~ãÕ ®÷m#ä¾þIxü|w½»ÞëVº±­Mßt{-­ÿ·½kL?À<øÒèýgW»‡»¶ÑÎî³ï {ÿæéÚF ÿIÓ??~¾ÿôÔSz/Ú¦•ûÓ§ž†sδ/±—Z4Òì{+šÎîOŸï>úýǧßî<­Ôtz¾ûèlèêšNÊÔóbè1^<©uìzºZãIÆ®'Ïh».‡.ÙôF$ =ë9Ä­Ô&§D8àh‘´•B”çh¸(5@`¸„׊¶]WñõÐ¥Õ •ÈÃ%þޱ~Í’Î[©\Yç\æ_=}#[i©_;KóŠw%D#T™õ—\¡WÜóÞp¨›@ݵ¢ërêÔ„—Ü„€y€øŠ#Z-:Uv‡o™ˆ`À*Õ•Õ̸”ú på1%“nÊ%ݘ†h.1>ŸišKz£ºEHN•ÆŠÉÄÞÙÜ~´ë GŒ¢8-D‚ú+‡ˆ¯x×h,Ý´V˜Ôõ4(][¡ËÔqN/8[ 0¯8âkÆÖ7UÚº>VÍ1[tFµYj~lÊ]@]ù¶R婳XÄë´Ðr“õãü¢­LŒÊÔ9¥¬¦l‹ï¼hÊUÊV“wQê› î‘u;ñ.¹?‘Ư¨|â<rXY ?n^Í»p¯k¹ÉKˆ9+ít íåéÜ ­œÓ²¥–Ó*X±Ì±·Ê¹òˆñ%Gü;/0Ã]ù¢äËžºA±ÎS^på$k“5@|ÁüÒ¬ús®Á‘Ô‰V~åï—â'ÂúÅUÕ#¶l*°ÉKN Ä2pØr,Óˆ¿(:qèÁ—Ò§bI²s–œÃ†ä<æØ¾QRQ^ÂÀŽJæVEm꼪wTÔ‘lÒ’qeî7èÓ¢øŠwó®'s’ʼÁÏE}5gñmÕHœÅ8¸1²We <+²(ý.¸§›¨Ô—äN/ŽW0­ìµL>b"/…éÊPþˆsñ*z´ö¯7ܦo¸v,Ÿ3t˜än…êÊÊ?ã ¬¹Áˆ¿Úù¸À+ ¢qÕ%'.ÀôTéxųˆÕ*+ˈ j€$åY ]À]`Ó7|Ä—Ü4€Ö WpI_«.sÎGëg5:¼±ÂÉ2y # U§è4"·,ñwrÊÒ—yˆÖð©O,6ûzîxuš¯Ss"pÞü¦¨Óñ[ΔÖY!ç|…eB7d›Þ/üÚ¦ &Ž7…¬”#‚)!ºE¯…;àç—\P`€:§Ó pê§òÕkÕ&ÄwœüÍ´!žî®8­(´6­[,D(àži‹nËYáùl+ë/Ö4ÐR™¤x«ZSF,õDá×rÃ-°’±ÿÎ\âe`ÃùY¶ªÎ qUŒ ÝXéò_në7QD¿³kj 0?ð®‚N¤î|ʱ÷aŸWq³Gj¸)TŠÎÔùµ–+CE›~»þö¬X/c ¸jçç\À€ _r¨.¹”ïDJëÓ© Æø*`³ê²xÎ'LJÞsÀ@3Ðͼ;*W\¾à ©˜éù)§]NJËâQ¡ÚFõI+Çzm¡"2Ï AAé;ÎúÝE9pI{ê |¹u“ÑŠÌ[¦#šþÁ…†+¤\ê·$an|àíÌUYæQõL”ãq£–SÏÌÓcŽæò¯<<º® I3ïˆá’ëÄóÞ´N’ä÷Ÿ•Kƒäê9VùÀuÁœ`À€ o9[Ñ)éêÌau*\cMb"ëZ«:µÉrÀ&ÀéËÊÙê<á°À„d.ž„, CÉ…ìÆ5ÙOؽ3=u¯dl2QÞü”Ü dBùëØɸ´¨X©jÑÚ4êCQËù{+jÉ£6Ñ­+3qtqGZ‘Ð{.p/øšCÝ®¨%§Uò¢áìÆj±"7¼œ¤äﵨeõþ¬®HDÍO ¨%ï*µä#‚hP›ŠZ(­§¨…ú[H2⪖;»†¼÷²–‚qY ‘‘”µ¬ÇÐ ùCª>;oX½/—µôׯ>”µðüPÖò¡¬å¥¬”²±Á\W <§¦øE9Ù¸êÚ—úÿ±ôåÎsûÒå7Ú¤"5É…ô 1–*Pˆ¡ÜCµ†¤&%0AÄûN 3NТ“Ô$$fˆH‚¤BÙ÷óx?5/§¦žË æV]™‡§E-©™ÝÉÏã%"óø©©É}|=I£++†vÛ-ª=ˆ™‚ȃŠE9¾Ï%˜h—”™¼’g+'¥ç•k:…¤5 TJæÔ·˜-'Ac9Å,i긭=©ÓëMÒ¦0¢i—6ÍC-±¨y f %Ä®±c6ìˆPoÙ<^g>ÒÞS̓òŽ$ô‡¢‡÷w^u ŽfêŽ,G¨Ùæ>Ü ×ÞR6oyUxø’8é¦Âë7ßŃóuAË6; Uð+U@âN_¸é?ºT§ªF…^ç€ØüËèmçÕ N¹#ƒ£û[^ɮܠßö¾|kÔ—ýŒf}p'hqê2 `uC* Æ©¡®ûñcÝÿî.Ç+®<õªêÊ£_†Äœ«]@t×]¤–«-¨4\3®¶LGV7®D´ÂoÓë"fðÏã2ÌÈI>þ¦²ü’mºÈX9_¿dÔË'fô9èÃçGŸ =`Ô·=·âGÇ”t•wàüòðRÝ‘fÝu?w‡Là–°÷+ À±p.pAUwÁý=G,_è _â8àô€{à&@ ïxh}ºîX\V¿¿ó„°b³OCšrVÉ4àœSv°zºì7ÂãÙátþ£ÛxëÆCؾœÛ2½í¤UyþC¨ëŒz8#°.‡ÒÚj”š2q$3ŽÖxðcæ´%càj/UOŸ"û±=`ħßqòóˆ.[—IÛúô{@'?è­é³Ñc{BŸ~èäçÝ'ºL÷©ÐçßGtúóˆÞÛLöԞЧß:ù9ù–0Z$ƒ/¥öåÔVvö­¹Uç[>Ónjç¾5ó0:ÓÌBl¦1t-£ &‚  äáSgßm¥ ¯©µ5¼b[ubË£Câ¿¡=x`ö¸hh·Æä‡ÌÄ ƒY?ÊhG íá»Ê =ù>Eõ”ÚIO·t•ÙWg×KWÉRaž‰e"lµ¥¦$”biƒ•ò3¥ RH̆†x–A2Ëä Æ³á3ÙeÐÂl•±u»à¡ù…ÇŽ¶mž»U=±cŸ¡>~ôðmï|±-‚&„9 Še ‘®lESWŸÑÉâˆtQ:,’%P J"±;æ`ê£i6—yOG~O²/ýû¨õûFi½ŠÂ÷$Kg7ùVÿŒo_Á7£Ç5˜ôC«ia J–Á±j]mðMÍþøå´¸KÊéXŸãà òñ·¤Íi<›¶#‡¬'\[ã'B‡—QJ$q~5í­+ò°ioOÍ*4ÁDIä•c P¯ ŽEÀÛ¢òs#v²õ5 à=ƒç ÀdáÓ°'1FNÛp­ò»¸s!_LOgÁv±ÇÊϔЛ!#@p|ʘ—aàUÐL‚²BOÛÀa¸"©;Ê\±ñ€™3”_g,ÿb†»y8qÍI;šãöÒéå1îðíÐñ†-0¹äfN®„kZKo¹Æ/f«¶éºé–ë½gÛºÓä áUo£Wüäߪëæú;µ!†sdC¬#>X§Î:@:N<µwh@wï¢ylÓ¶4x$7Ï×C—k:­1‹füà %¨g\…üé÷†÷Å4)=å|‚Ô•r%yƒWžh¨C”Þ“sk.“câ5¶ÍיּIºw$³2¨Ì)½bÄñ´¹~£~È,}]®|8 cà}u³7ˆüÒhÎiùË Tf(5+°±Zs# V @W@1À»]}_v¢£Êt&×c‹tÊ¡uøƒ3åÐ:\‡RU PX'J¹Fõt»ªªæc.w*>ṨTy³9±üµˆ•ÝÚq¥k`Z%‚÷ïl‡kÄê£oÛοuîÞÒx®àš@€´·!çl‚ÄX¨ÙCß6…ÒLXzóþ£§Ð»¨tÜ’DW¾+pëô-†¥ |é×Âå·òÂvÇ©ñ/3£ÌG¿‰ï•ñ®º‡h€¸î/W€€j‚í %&ò² P¬þ~^¢|Ë™<€R˜mª?\S÷yåÒëQXî±òžÔÂÔ="›F±ËðWüU+…“žq*NÄÆgt±Üâáî?,9üšendstream endobj 63 0 obj 4124 endobj 70 0 obj <> stream xœí]Û’æ´®ÜÎSüw!‡1’,Ër.RB.I€d 7©¢vg,™ev–Ý„¼m.§ˆ­“[îO¶ìù!›Ô²¬äV«Õgÿ»“h¤:‰éOüËõó‹»‹»“jpemú¦;ieÇÿÙé'˜wÿÜ«Óû·Ÿ\ˆFö”ý÷ô!¬ýûˆ×6íôCMÿ~ýüôÞÕˆUê“P§«'#ŽaŒðtɓҲQæÔ[Ùtötõüâ?þìêË‹‹nÛ èêÑÅ;¦ª®é”Š5_M5fžÒ:T½öUÂŒ(CÕcßÎè,TÝLUªéŒ@'Vó( ·J›¡€7 ¨­’²L8oöåY è.¶Rô¡ê–7|5UµM+dÑÁGü-#ýŽEž Õežó1ÿvªé%”¨~áÛY«Z½¨Rª-³ó Œ/ŠÏΣùšWņF¶eÒ_p†ÞrÍ{Í¡^zìƒ]—c§"¼á"ㆀ®Ð£Õ²kËêð%"è°Š5€¥€5³.GHu¨²kI—|IçÜõ%fôgšú’Þ´ÝÂ$'¥Š}g2öÞÙ\~´ê1o†2h)#Ôç 4üšW9aéFXibÕÏtm¥.cÈ)}ÆÉP€xÐð–7|ÅÈú¢Š[wGÙ¼EgZ‘¹¯Ç¦\ØõÌ/„T²8ž:‰…v–Zí’~ˆ/ÚªH¨ò@½QÉe5eYÌí¥C©ŠÞÂJiò*Š}ÔÜU9‰ixNê/•3ªÑq^J5eVÓÉÅ«yÕ»\ëy©aNŠ˜e$xàU?šP”üï %‡úØÄ`TzÀyóÔµFu‹üpvh8Ô»œ ξwuúäBž¦?S2ÿV“@·Ýi˜žmCÀëõ¨?§~ ‡ÖÇ»Ÿø©ÆŠÈ>¨øû><ݦ”ä;O|«•Œ]Cƒ‘¦Í™J¡æT0¹_’4D~í£œ±rȼ“W¥ˆþÇõ˜÷Þðê$…H©& þ›£=þíÎgœ @@ö§‹lkbPSR—û{á1 zÎoò^Ë¡+ã P‘¶ß¥%ÿ(²~œ®¦Dòi©1‰RÒte]:^Y%ˆšL?º]ªôï*(@P›ºŸOUC£tÛå›­Cÿ§ë–W™Õy‰:FæpÉ>cÖ˜vù.5N×úrÃ÷¦ª¾l«"Ôœ5ðP­mElxå«”QCÙß~–Î'wº—§n£éOÏ/ì`ÆéS,ßÌeáË:”¾¸øëé« uúç°~?þûåøï3Æt¯¶ »Î°ÿÅQ`‡JZ·ö4ƒÍ"R¥²òc¿9~ȘÖ.2:Z%[‹"¥w1u›c—Œ†V‰Àhm5‰E òÀ•ýŠl|#:Å(Xæ8|7&¢ 婵crú™L<„gù Lž@áH0mŸiS('Ò÷Hð$$OùIHžáHè„θʉ„ô=’@< “@¾G„'@8Ú>·©PN$¤ï‘àIHžò=’ < ‘ Ú\B9‘¾G€'!AxÈ÷HB‚ð$G‚¹.„r"!}$OB‚ð$ï‘„áI Ñ}ê¡7Ô}ÆòÍ\n=Ù:”êÜçŸi[,çîs¦!xË™ˆ¹"ô›ZTÒ1±r¦"°rIFð‡3Î_ÎTÄbès¯$‰k¦Â‰kIƒóˆ3Î_ÎÄbè0WöÔa¦À©Ã’‚<šê>w¡Ü›žDÓTÚMCyò•\åîÕ—Mkf›R¹÷óåÉ÷È bvN¾Üörcö¾ Æ®TêõS·lokÒéîâ¾+û(Y‘ôqgNb«kΉWœ;Ä:õª³cà8¸#ç# æ5kV—é€GU‘Ì”8%…QÅÔé^¦Ò-D|ô"À’×á¼ÐTpW< âÓ™ÿ¡p°'BLw”"öjÿîŸ[ àvf:‚ÛÙnÌPÝ:g¸Û@O}Óu§ßxjèѳ‡¼ê†7Çæ.pòлã|àh0ÀU""? Χ‚èüˆèðœx@8Ì»õ¤aÝIÊ8 ô’³ ‡k]@fŸóÁ)I@×sïèÉs€kïsêÁ°CýR¢hÑÙm¿háïa­ÖZ^§ÒçduñÔ7mXñãpšÊÖs:?Éê9½q·¡ÓzdrõÝkùlû†}Ô“™“æ~èšëðr7¬Ý3ލ ªîÔ2¸y°röÜ(½â¿JÜÊmúýQ;+Z§¸®Ë¦·ÎÕ²«Ý`4à0´Û¢¡Q¿ÄítxWCërŽºÔ¡Î¦piF€ëàÒBݱ 8@e“eÚ |»nÎ1Öaß‘CmòT•¢vÎzp—¦ê~Ò¯¦šËv“Û¾T}c\õ§ 66>àÄ3A^-+~0©V:«»ö Ø^ZDÛœ—Xu¦¬º|iâ:|iýœktu¹÷áÄ´nž]ö.¼GK@-'?­ ­OîÒ¶}_È÷­ÃÊ¢SÝô«ÎŠàwvÙÇ÷¨C]¢P7ìs5P¢Êd¶‚;âuM6\’Ô¬èÉŽ«ñ—º“£îw$¶ƒþž[Òa³¿ïzú†šQ‡þ°%ýøæ tåð› @õu³þº÷>. & û¶è-6~J¹ú'yß§<6 ¦ô”Çæ’H'v<å÷þè€OŠÏžþžõ1¼¥›(]¶Ú4½ç$]Ûè ãšV×iÏJ¶L8[÷ÄKùM¦vîŠßà)F•ž€ðCçÆÌÛö¥}¹Íg[^IY?ØLŽ 6Óz°1‡²`f¯8ÔË¢ÿ§„•7E6VŸpòKㆇyöM3û9àN)U'[‡›É@Ý>ZݚƎ˜~$W ˜.iÝÂ7ÀzÖ\·è R0c:¼‚¹k5l#E_™°Ô¶|šÔåŸ;¦€GV'ÀÿU¥93ú5º¢¯r%X•(­ÜŒs‰é½_Kæ;²qàŽk÷62œsn‚ ´D¡ºuR°Q·(6ιOz8«[å¸ÀÂ9]7ð€_@ÀÚÊcd¯(n’Vá7]CªI3Õºaבú†‹ƒýq¬¯d^–»Ã%KË]ÈêrÃÓº5ÝÃâ8ø¼#àüám2w??³@Ÿe3¶Ón£…ï9íFÀÎûöœ <_J³¹“ZÇ÷ò4 ä¡ËA¹÷2—/cøw£Z)µC 9§Ç0Æ Ahm‡ bzÆN }x‹Æ!ˆE‚`†Ø&‡q(¬ ±HQ$ˆˆ‚À8Ý (ŠP¤(DDA`жËŠE‚ˆ(ŒC!¥¢(B‘¢H‰/‡IÊÒ>ob1¾)éac©îݰeT,¦geÆØEú×z¤ÿPŒ=àZ f œ>1 6@ÔÑ•2e³}óåé Áì7¢N¾ÜÙa1k‹/O’Î{™•Á—'A.ÞVT„Ö }MÓ»Ÿ(‰.Ñήsr¶ì6é™^ð’ïlŠv©ÔÔ~õ‚ŸÌü¨1É‚}QkYj§¢Ëd\ ÷ÕÐÌŒõ.ΫÎ|¦]jiî©O›õ4wsÄiMÍýXî•}1ϵÔVm{ª®z¹¾ú ¢°Sƒ›{»DÇ’³Ç_š’‰ÂÏpuCÓ©Ó§ÿM ŧ!»'¿Ðî” ãätq_™þ¦ÿ=¦§¼]È&¥PË»hZË>[<̆K_]ºŠ~'h~ Gdáä¿—0i#–Tц9 /çéK„z«^¦”³Í2Ý´Vö1÷ ûÛ SæÃçœ[€ñ9z—“YÙ¨>%Mâr½åÃtõºM÷(Ëœ cÔF?â=Ꙭ_1Õ²˜9Jó³2—iw_Ïy芎€»`¤Ë ˜²Lio×¼ê¶``yU‰é—£Œ§_È:]ʾ‘®þ­ñï0~@{„"¿–~^ÅÒ’ £áu}ЛdÖT°ós,ùäókÝ›}]–á=à*S¥ÿŠ]3_û­h×ãÌuÅ ×£]»%Ub×À¦€–¼æÝ>äPü‡4ËJ2ó"ºbÕ.ß¼#ˆ€)î ”3b q‡±;¡M·ÄM °ŸqK|ÀVqï5ç°”"I¸«â1þ„×ÒOVºu%[Œæ@k’Î9@kuÍ1—¢fΔ• GÆû”7¸j èJ|M”Øã ®°@ Ïxà»ãƒ>ô;NÄÚ™ƒÎ¹Àš½Ï-æ7¡Ê¨ô´‡[Ru' –ohld–€ª:9׫Þ*Wv¥u•±aYA©ÜËf´JÕW* +§A—jœB ÃtõÁO¥‡ûàn€U˜ŸñŸd®ñÀê©>懔¤×Âdgr\+iö:˪<;HRΕ‘Óá'üÛ*2Ãc¦ƒi†Ö’Ô1Ð_À¯{¦TØåpEÿ›bv±á€Æ\‚kó.ì »˜Þ ßÈì`ÀäbzPU du‹ jtÌÍ—2ŒÜ[—§ÑôWºAàŽóèå\pÃ)®ä„.à"8g¸PKFŽ©œaì§$0{r RrŒ^)S”óJ†¡d¯Ê²)gUÊ·šÞ"º¾˜bžoéhSZw¼áJ–1½CÚú,þÍ2Þfof–<ÐÓ8•%>¡nKà)`Z|8§(¯‡,–à “vhl—ÞØz#˜ÿÅͮίԭfŸodO€ Ývþ?ì2ÙÀèxÊK Ué ZY÷¯oò ˆPù‰úÌížë$öÖéÞî­}kt‡3ýº\5¦'¢äÛE·éI9=y»o:'[Õ‡&–|­Ûœ~­·oÔö'X ‰€ZÙSÙrùUïÚmÝE]V7Ï­Ë~À²ÄkÎR Î‘#»¢ÛÁ¬Û¶|©Úq;è&ëäwt†PÚE˜ò°Ò GÍ©<¬°îd¾;û=ýù9¾èFendstream endobj 71 0 obj 4948 endobj 78 0 obj <> stream xœí]ërGþžb+TM8«¹ï¬ ©‚ĤrQQ\B¥K¶•HزeH x'^ƒ·à'á7ÀìeΙ=ýíªwuŽ¢•N\IY™žžîž¯{zfVç™È¥ÊDõ'þåÉÙâ|qž¡ÊúgãŠÜfFùð_'‹2wEÕæà/²÷^,>^ˆÜ”>ëü7û%¤~øú\WÿÔ¬Ó¿?9Ë~v¸J“I‘ •> <ʲt¢‘KfÊÈ\¹¬ð2·>;<[Üûðþá—‹ÀÅh]5:²z»éç½Òfƒ¤”îWÕ˜_4Ÿ_Ïæ5%ÅŽNê~Ñ_R…¾ ž÷†¶zÕp/…´¶Ë=5á)5!trµ#z#­îw‡/ÉÁ€,Õ•Õ¬Wàæ SŸ®\wŒ`bWXbkJ±Ä<3)–NÛ%Y9U«“0ºõ]û¥¤cÚ±Ji¤Œ­>§­@Ç×”TËäÂKIO¥/M?÷/¨¤'T,Ð :¾ /ˆXÏYÚ:Ÿªæ-¬Ó¢ »~P×I#¼RÉÞùð,Öö³F5Êúm|1^EAUÓ¨pjYy¿-ÖýŽz­“JÑÂK麤”û¨V;îHHµÅ¦tܦôKåBF€s)U•YUÿCRóJ: ^'¨Éû:vEë@.)éÚŒ¢äwk”n«šQ:=¦ºyÖ4ÒNÙüh0° ­¨ À%êõýè0ûx!³êO•LÇ¿qèÿH•D¼6àáGŸÊÄÜ9[‡é(³i&2î¢-ÝV²måT¡»&N[=j€¸ôZÅ ü5íxLIg)DmçWiLj—V±Í)︉øJ´³_z‘+ö0K]„«Ûü«á£œ*7”Zzë*$LEo£Ä§£Lm´¨Rɘ³µÉBHyWa´º ¤:¿V,„(7´trQ!Z[¼n–ØíØÿ ñ`)Ä*Ly9ÖF-I{Õ?! ¯ ª ê¿)¯ %¼ú'”òŠé¸“N§¤‚)éâÿK;ò¤?îõ¸K:¾n„p^–—iÕpZçñ #`?àrÃŽ ôà˜vŒr­)Vh¨²¿üEø7ÀCv²>"Cj¯Œ ¶ÈÎÖ®:­²Nøª\qº0º®bºý»Óŧ ¬ hSAÜm}„Û°¯0>sYÑÀí÷š©Y!}g•«\)QÊÔVÝVOe^®"Ð)íø†¶:jIj½¥;¦­2ÊëÇTˆ×=Î×%]PÒ«wï ñ˜ŠzÖ`AáU}á:±ªÌ¤B³e³³;š»j£¨^”"Á¥§íDÔÇTÔ¨m¥ ×ÕvÀ%ãü<µýmõn‹µ*0Û"1ðGÞ ø°É0¬Ð¢ì×ö3Êè ̘<§Ó~NyÕšXz“Ö”·Æ˜¨1¿f‰ ÅKÚh›·X¾Æ˜©)ª•Õšó-{# È\/cuäA4P,謒'S=h˜’'*èø°"IQíÚ6¶Þ©Tˆ¡œ#Ú ÈÅó àú ^c,”ˆÚg¡¥2eÈâÕjÍ9€yX&ðÙ½þ8Ì Ìð« Äög,¿øeü $(ž\`B?¤¼iò´ÿBy}v¿vŒ2PµOcÞß{Üýà“÷ÇtþRøxE¹|ÓpI6al'}Ü)Õ/e@w_ÈD `  Áï®UBšœ†‚L¸*oq€µ P ø`@(Dºo¨Ç½×´ªÊÅU…”ýÃÆŸ‹Ü…¾ótŸCª¡ëϘô×/°/Š)oÑ!AÏ’’%åÔ€—£$ßÏ+Ñ!àe)IL•K³Dúá)ÿ>U~“èéܘÕ)Zï£õuDk‡·3Z …®C7û>§þ‡¼“Û‰C|¸„Ûø@O„GJãøèÚ⸞*l\OtÈ+¡Úna€b3Zïø>€ï8CÑï̱Jà*÷…Þðmðm†IÞý Þ1#űßÐøkJê GÀ’…Í »z¬Ì‹P`JöyWTAâËÆëX–K¥E®åþÌj«k\)›\kö© ˜6o¥¢5ø}:$pâqW–F 6& -CÏq—gy›w§Œ·sØqVºc7¢ò<šwᤳ¼z-O.Þ-ܧtD»ÓNFx^^4ÁóÞîÀ]¢mÊÅKìØoc7vå»§ {°ë¹Ú š¥v*׮̖JÎ-(ó \ÿñeÏÛELB€÷s€n‚Äã§4ö½_‘º›;Ë‚j¸Ø 4äâMˆ‡É×ßÁ©¯j¼Í §ÂqNžÈìüžWì6½•Ô¹4~žyþ]€”O){e@+)w?v\Á¸¥`!KÀbžX19‹z„7|ý›W‚¼~ByûW °x¿ìc½9A†‡”(3½MyR|%'r/çZØ­ßÕɰ¼K/‡Ý…ôQëI 걿¢>ôˆvÓoîÇœ›ö†”þÀÊÜfæ,Œúmµã£þ]ÂÑkˆWùìA5°ÍšuXþv6ÕqYäÆêz´}#kŸ5ï"kñ›O¢@,qÄö þU«ºÈµžM5àîáÚÏi+bÐcr¶ÏÄf”‰=+ïð,ðÛŠXJç^ÏæµÎÝC,p$òÛ=Í‹xŸa¢'ç]ữk:—¹;LŸ »ÏÄæ„kàJþ×î®móùÈmÍ׿µÃì’þÑLA¢×s¼ƒÊb¼o–ò>:‚V“Oh'ß•W ­æ}u°w¤ÞˬaÅT¿_kúVgÓ‘;_¢Ä×6ðÒó;ï{v¾Wyù«5PÀ¸Ú—[»¤}ј\ÃFNÙ¹ú\+1ýÌ~󴫪'‚MþàN½ÁGÞ©7ˆÄÀA¶ÁÃQ@⩸?ï)ðÏ¿±¢2$ósÌm§òÒÙ¸x×ûÁ…ÀÉ ÜbÜ’}½Ÿwót·áÇÛhMðnŠpI;•Wýv‹ºç†MÖÄä礼>òžµ€Ž¼ì<¿ïP'ƒ&ðœ¾ýXýè´j6ËÉ­+¸Ë=o¿±ÍhºÍÊÃä_ZÄûh)@™qÅ®aHá}ïr±ë.8Àäg^`g2¹Ž Ð| ´š|áå¦fÊÛ¼~°O„yû¢Ûy‚êoZ‹\–nG‘š—FL~îËÛâ÷mL—:$½Ú¦¿—¡ÖIý« «?ÿø&8Çendstream endobj 79 0 obj 2839 endobj 86 0 obj <> stream xœí]ëŽÝ¶FÿîSôG›´ÝcÞ$Q ió#mŠ&ŽæG€Àöú–¬/ëKb?S¡Ôø-J‰¤8Ô|Ô¡ÎÙuìæØ°a͇ùq$}”/6b+ÕF ¿ã?î<:¹8¹Ø¡úñڴݶÙeÝß­ìúmÛ <×nX»ùÛ““¯NÄÖôv“ý½ù¤þàäÚ­~¢é¿ï<Ú|zÓI•f#ÅV¨ÍÍ{NFß÷­ðzÉ2r«ÚMgå¶±››N>øç‡7¿?qRŒÖÓͳ“n ¤fÛ()Jë–§Œ ¤—ž$Z'2îúq­qlt>Ô¶kedÚ0ÊYn•isID>,ˆ¶Jʲâ|Øm¾”‡5L`º8NHÑÒ>ðÅ@Ò[-¤ŽâðÿÂT¿àLÑæBé¾ls¾æ¿”n«„²QÔŸý8k•63’Rºl>n+°¾è>›Vóœ“âÀVê²êO¹AŸðÈ{ɹžyé½M“K§.<ç.ʃ@¯0£5²Ñåpøž-LXe`R`š”óÒ˜¡<ŒÅ¤™jI3–!ZKZWÏ ­%]«›YJAç ÅÄÍÞØÜ”t— K锑ë;Î>ç¤ÑYf+¬l#éž7º±Ò”¥ßæš>äj. <ø„|ÁÔzPe­‹}ͪEÓj‘•Çm™ÌõÐ+/„T²¸ž:…q‘F­ò~Ø_ŒUQQ噺VM%k[öEwVôÕ*V +e›“¨ôU\W<‘Fí3ð2µ?U­ë¨\á<•j謆Hî^ÃI×xÔ îòÒÀ\‘6ʨpÏIoÍ)JþºNɹ¾ô Ñ·*2Ýâ¶¹ï™t«šY,H'´œëׄĘߟÝÜ|u"7Ãï¡™Žÿªm Ý.jɦè¦u1´é„ݶ¾Þø¤ÒÆé¿ öF·Yëa¶ÆHøÅ@ê]ƒbDV¼òÏ«d¯8鎟QÝvù@ku{–§žË#²v¤q÷*ß»r%žð=ö¤Îê¾§ rJ´º+¯çŒë–LÎeÝâ«oóõuwle.0ãC.þIѨÊu•1”p®_ø²/¸_ìuí†rA«HgaÜZ»•cá÷|­4µšwyO­æ‹¦å×µ¾uÕÊõÜ›¨3²orR›&¼[¥ÃçžÔ·r áØb¨y‹Th­ìAÛuÿln˜W¾š¹{°©ïVó9w¨ÙHn;9é ø˜“€ebë¬)›ô>—%^rÒS/¾7é~§Î‰Àòu3–}Mà (BhÏãˆãV¸8DÓ‡U|Ìò,èŒËªóì9wÐ-ž`àm®*Xãm®˜±dœ\<°ê.þ¾ì‹ªPöÚòeK„²ÞjÕ•õUv•^;ÜJ¨U?V-l.£^§F9ª:~½µ¥¸ûã@rwBØ…9ÊéF¹Jéƒì'—Y¦ýy±YWvùÖ@Ý-  ¾©Êø3n@àp`›ºJ"¸ÎÎ娤9‚ØèöÑoËÜt¾-ƒþ£ú<ãÑñŒsà\¥m´‰ã˜š=š__õC¾ Ý•ÄÀ¾!kÝ€;ê:ò°0®fëíæ–Ò§îÚúÛH¹éÌØ^7fxpêÚëßͬœ7ã½Ê¹ßãf¼hsbºødž4ì`3¹Æ{xµùÉݽÿÝýùÞýyxb:å Õh«†÷hN”±‚ÎO¾I„ÃÛg?7Þ4ʈ­¤! ˜8œ;ãEˆ¾Ëu„$bâˆ"Ç ÂôM“i “ˆÄDPŽQ„•¹%"!‰˜8¢Â1Šh»Ü‘DLQáøê䉑Ó¨~38)Î ¡õþpõàäß›ÇÌÓéé÷¹ãÏí Q e:K¦”í%Ñ"^†Y{¥Þ“c\1v,‚„¥¿VºO¾P$Ì&Ž!fdÆ‘ÂʦwÅ#“A¢Æ_Ïd ð×mÛÓuŒj;yŒwºŒî3‡»3ÅTr¯¬±dÊï)h3;ÎÒ7¥¢„¹óÌäY“¥ffÁYV… Éíƒk2áÄ‚þòÐXÌw…c9¢5ÒΣ1¯zy “9ϼÎe™×­¼ årx¥šG¥± KÓ‹<.!æ8 >2óê–ô˜YvÏË]™!›á1ì¦ÕÚmÄémj¿5VwÙÓã¶WÙÅîhìï­ëuþŽ2Ä]Ø™‹RÂåÝÔíýÍoÞ&p—|¶oòbýç3rèÀS¦(xñ͇…nA%"éqj°¢}OÙ¶}çî%»á!g¼vq TÞxwk-{KEåÒÁ’_x­($ ¼ÁHö f g¯nóùnyR#Òcæg©U–%áâ’žqãÿÝ*º”!v†iu­hÓŠIˆ—Ò|9iOG”‡QÀÃ_ßu{œR'øæ!×,ù>×êcapwjS#Dv«Ú¦ìfžI@÷=ƇرÀbãó骠hû²¨W^))”Ðå°Š“¤àS¾šLà›hwÿ“=w8uÕØÕû*4 SöÞ(J%„C÷¬ µæîY@hH^ç\«*HbZW@H– ˆ#|늶~¼‡3¬IÃùޙ剦C¹©uŸÇP]{VnröìÒ°5 ¡WÜRwxf•*Ïå•d×9ùª'uçsî}àêý6d`‰‹} åª På^$!¶Ó½ø×~>ŠÈ~S¥Õ›U»(ÓŠP€$P@§ SŒH’©!$­*GÖ+"+6Ã\QÐxÕ?"p1é¶½æ*B².²@ýû®˜¯;6†Rîz¿­zu{}¹¥ßÑ å˜¨4ÎòŒ—A{Òã†FÉ9žô­VaÐÿíð*°ñª*\Ñþí茿ý€G$Ø ë*T¹úT•nòXó%W{˜ý‘o:£Å‚—ÁFl<à 'pH&¡ºl,f™OC¦’§8 :}á¹è™¢›œôí‡íÚ mðŸVn)éó8w—½uö‡‰Þøò7Å%¶<úÒp…gÆôÝ?ÀÙ4Æ \ÊN0ÃAð¾œôÁû‚&À¬+Å\`$Ì–}‹“ê´Ö7\Õg\ÕºÀ©SõYMà”;ÁK£!+béŠÑ;qÁS3¡dN•í·«Y§Ã;ÉTé(¾¤„Þà«„ŠìPC:ã*¨aEæãÜY È:ŒxJò*²N‡*ÃW[ØzˆÃV€ðj7ª)œ¿=Küzzv§^×CK°„Yá4o­MPEZ#ì_óÄHŒø@`úÁHì\>4@ŃŸúÂÒ+­f qƒ –¾˜Õ¬×vX˜›à»AßSš|§xІ3…×B[U&Õyc2-wŽá¼5µ¿€Læg>è@Ñ@‰¿pRéŒQ^CÊ àõíѯuÈhõ–òët¹"í^uå´œ ;ªKП’uuTOwÄ@ÖÞ‰°pÜŠ @Ý×UJCÆqM› |W9ÒaŽßû9l+§ã  B‚9$Ÿã#¾„ëœt‡§H©EI, ¾Z€V}ÊëÉÇ~ 3Øô2 ¬³ 0ê—| Ù€ )aWwj¢ÎÐuGJ@T×!ç×5\Nf ë÷v]'^·Û‚Rw"•z—L½Ub¡¥®ÛëžÊì}æä1ˆhv+¸ª"]›: @Ý ÄÛÈÒ™Õ…ÓºkTЄ œ8FT:ýù€ð×­è3è|$$G€¼RŽQ„‘]®C $GA8FRÙ\D $GA8ª×M¶H˜D$Ž ‚rŒ"º^gZDB1qD„#‚ãUK|28)ÎÁô Ÿ®êàñNœÈW3„yÒc<Þ´—qÖ‰½V oŠI‹1®˜;AÂÒ_A•C qç¯ló³ $¬üµTÝŒ#E7ÝàñlþºëU†+Ôõ†žvˆ×ñ´ÃîL1•Ü[ÚÁ2#™géS±ÍÓ;ËÞ̆³ÄKI$aVÅ Q('ŽÇ’ý塱˜%îšX µ„ÖH;ƼêÑ–â1/k´Husžy!Ëb2/L´ÌäQ9^ aé7¸ „˜ã€úÈÌ«[Òc›WuÚÁh;~fçxÚáòO;€·‰\8§º'œh^ŶV‹6'Ñ·³§^[À Óê^j«dYx @Œ ¸¦nkE´æt_Ȇ· ºWzä!Éħ¨Ëp>î³pE>¬Yx\¢-G>—‚ûC“‰7 É»KX¾šR™‡—èj^rI¿ò€¯¹ÓõSØ#Ze{*(·ˆÛªšÂ¦«;7ôš[so-S!<&žÇĵpð/÷°ä¢?bLà0p1@þ” b§îžzÛ›Î'Ý’&¹ïrq™éÛk§|Žý8ú\``{Ƀ ¬ýK.„7€¶.°×hˆ/Àµ'˜ì}<Ó]Tá’IÖR#éw3 ˜¼|Vo¬vŒ¡áõ©v[m Üãœåfå}>‚³c£‡)€~.¹ædî͕كþÜåF|ÇÑ¿R‚0˜d#Èx ûknQ€;%3ý?U-í §JŒØéîós…·ËµzG¢¨§`—/ç/zóÏøçÂÿËË¨ÍØÐ¹YF°×©¶¸Lm|Í!‡}»øšãÜK{ØôÊùA˹çQ sk‰”ãé¨wèt”u-Öð®¤Ð?ZÚÈßÍãC`sP\ÛIãÇ“:o­"¼“'uv@3U¯·®c¨…föñÙºkR´1Q‡ORþîàO;ßšÉp™ƒê0à· @òzHJã]Hë½±“qÎauxD€ïÖAQÀ™½¿ÞYþà0ÅV­B§\)X~þRÐ)+Àš{iÀI$ŠÕ¤k~¦À¨‡a5wžw©ƒwÕi@s@ûr .$ÐBEÀÀkœ ø¬±ôiüS£Ý¶2¾wŒ ÏoøÎϘҔŒjR·Âþc>ò`Ø@Ð/#h†­R„­Ùôä`3W¸ Wµ¹Võy_°ÄïxÚ€¬|÷VN©Ù'u#!aYùeŸý|ćÉÙu#! ³ÏTRŽA„ ”üƒº‘0‰HAåEt³ÝFBÑ©ü£›”cÑèÜ‘DLQD£3[HÝ綈„$bâˆ"4‡VIEÐKƒ“"á<(¸*]Õ«œ¸™½Õ ]åGI—´—3|R½Þ“c\1v!ÄTþÍÞ1¨r›Ì¿Ù+{9ûv0 +ݩٷƒIÔøëFϾL‚Â_å€î— +¯#Vî@w¦˜êòà¨ÂÊ9C&šÈì8Kߊ2‡ÂæÙ›Ùp–x1‰ò/çyÇìƒk2áŽKô—‡Æb–¸+,+šš}­7‹Æ¼ê‘Fâ1/ky‘ÊåðBFc2/Ly™¡Q9@ßHXzh‰Ë@PVnEdæÕ-é1³ìUaåT3Ìv„ʽ¯@!ÀÇ`ìMñêï •@vðÍ8} ³‚Gà!ÐX´êCs·ù¸šGx«¾¸ãƒ.å÷`T¼Çõ¹òÓM¯½Ž¸¾Bêq}G\ßÿ®o•Íi‚Õ˜Aé©{9ÊUصøaÑe$ðÍ~ Äoøæ¾¾T`pþyŽËñÎÚ8ãø´\ÍßgàSúöð» ðø$D Á\€] jÇßó X¨ÄÊå/EVhIr‚±à&¢ÔºJÓ:·¿º{Ä•q%Åt]+±Í¶m\ ºöíG0È%¤ñ; _p ¿ÿZ~óendstream endobj 87 0 obj 4510 endobj 94 0 obj <> stream xœí]é®Ý¶FÿÞ§8H6ird’¢6§ Ð,?ÒˆwšÂp|½ÆÛµ}¸Aß©ôWü¥DRj>J£s¯¯í 1D<ÙáÌp6RòÉNÚìTÿ'þÏG'G';«L7<Ûº)ª5­ûo­›®¨›æÒ_ºz÷飣+Gª°]»Kþ»û#ýÆám‹²ÿg@MÿÿƃÝÇWVmwZÊì®Þr8º®«•çKïŒÕ…©wM«‹ªÝ]}pôîŸß»zïÈa±eÙ]=>z÷z?T•1qäa?R»åkÃЩRµC†núyµu`aè~?dЦÖhÇFŽòÖØ:ÅD8àÓêÖhgœOûš/宋ó”VMzÄ'>ë‡Ê¢TºŒèïðÿÈX?á@QæÊ”]^æ|ÍŸô#Ma”i#ª÷ý¼¶5¥ SæÅÇeÖÕ×N«yʇâÄZ—yÖs>â–wÊ¡žxìÒU•b§*¼ÏU˜_bkuUæÍá[" ( )Í´ç+¤6Ly˜I5ú’jpCÔ—ÔΟYêKšº¬f[²7ªH+8G½jSýÑ¡›|bXJgµŽP×8˜ø” ʲ…ju‡ny¡ÛVÛ<ö¯9§w9[ 0&>âŸ1¶îˆ¤ur¨˜ƒ·¨êR%®ÁÛqâºë™WJ]Lca^eµ5›´â‹mMdÔx ¦6£Ë*òº˜ægµC¹ŠÞ¢ÕºN‡(öMP¯x"4vÈÄóä~oj—Q9ǹצϬú4W¯åC—¸Õ)®òÜÄ”5ÊÈpLJ.L)F¿^¥¤P_ø ÑÕ&]ç²¹íÊÚT³üHr¾Äy&1ìïÏ®î®é]ÿ§O¦ãÿIè²ÚuSÀkËðëìg×(ëbüï~áC¤q? xgfàW|x¬m9¦$SF7Ï}KktLòîOé@”Í Ÿxê'vvJ6.Wˆ¤‰˜-ê ;1®2ÏÃw"ìú¡®0¶lâÄÇœS°@1pÚXÝUyV9ú_{#ÑJµ BýŽO¼á¡ŒKôšüÁ‚HY½Ë×øˆO|È¥út4^³ûÖ™íÜ¿÷Ü¿wlc\"VµÊ­­Ù=8jÝœøtÿèK÷\&¿›ªjÈ@Òk;ün›rWÕÕP¡á‰ˆ'0B8j1è+âi á‰$ˆ'1BDb aÜvVž‰ñ÷H‚€x#D$A ª¬‰ðDHŒ¿GÄ“!" Ñ“°=¦QPñi"1ýHPÄHPˆD­ˆ â!1þIOb„ˆ$Ä@ÂÔÄ¢â!1þIOb„ˆ$Ä@B5Ä¢â!1þIOb„ˆ$DO¢l,Ùxñi"1ýHPÄHPˆ„Ó?!ž‰ñ÷H‚€x#D$A ®82zWêIõøt?>…UÈðtçèﻇÌ%MñÕ;'ß’„§H»u9òDÛñÛù)ü4hx!AD#QD3&ÜpEÈ‚* ñ1PÀ…lx5Œ\ .–ñ°"Fâ¡ýsï?G;GjaëzÚ&ñ¡á¹÷^)ŽÉÁùçÞù¤“žï0)â^üs¿õÄ;øç~ç¦ÓæöϪ™­…ìMof.)H!ÈÖòÏ•9;š8±&¸©ð|6ÓŸv^Ü å`ÍpÎuÜ”åLçóÀ;FÉ:u¤4®–3ÏÉQ)‰jåLçó C"DêmIL)g:Ÿ»üÑ?ÏÖB=z9ÓùÜáŽÞ1Ñùà>ª‰“*Ñyx>›³!þš:ŸuÇDLOq/Ñø,Š9Ï(£Y4%,Éü$ÇIt=K?bª`üiv‘èyø§ üžÄõDdzãN~O#*ÓotÍá¢#ögõäIÈÝâÉCFG“m5Û׳ô˜&³“LóÛ4áa+õèi†IóA3£ÅsFêÕÓ/ÍÈf0,k£ž=ͲhN¤g0uÁr¤ø˜£¿Î}sT!?¦¸€VÁD`3ËN…ÃÄœÛE©ûŒÊ6‰L‹2ƒËÉË´2ª‹L|õ.[3! ð?ä†Ìë«÷ú±½­TaéìMypÈþâÈ;H[]G‚ŸðŒðpÊ ‚3Ç›è’;†èßU€q@l < uSßr§ŸIÒ­q‡ÇP™oy°ÓL°OårGdTûuÅs±ÁôJ'šÆFìŸsT1>´¥ªó‹z[) Ñd$c_‹,;ŸRýs-ýäB.eT’ï¾ @f ŒuO9SlÚÇÁWÕft_цˆŸþO¢BYE/ÛåÕB7](0>Au"Ëæ"=Ñ0JÄRá£PéÊø²ºè(äð—MDÂP;+n°|¢»éB æùì‡å¦ Ÿ æ ,˜®„S6&š†‚€ rwkx=qèìâP[TåèlŽC©°ˆq…åÍ}½¥³ê+$þ`Êòªmç«<*(1W¸ì›W¨«sXì8[´¤w˜7DË4'w¶ÓgŠÙ5\ºÚíµvæ1rvÑo…#M5\%Üí­*ÌyÈR­/‚è÷…g޶eMàò€ëÊ×õ¢TζÓ%§ j™’(Ê2€èf6´/$„$o¸uÀtâ`•*"Èß¼æhÇWÒrÍ¿ÔÚÁb6xé•®WîmK˜”…`Ñ-ÕÂÌùäCãÊ AV"ëAåÝE;?Vöv~»/vTcl¥G.¯o7à~ÁÐד¹3L =\èNÍ[Ý.4˜ÂyÔ!2´9m,xG’ ]ãdopÃÉ7ÝQÇv¹ûëU”ž`¤“žsίs6Û>ôÔ!]šïO®¸°½À¦?ë–˜èd|ÿja Ik‡ƒA킲jÜ÷´<ŽØpD¢ˆÈ8¹žÏj7D@ÀB¶}¹XƒíþÁ¦å{Eâ€Ã¶ WlÃÛáDž-¹kmáò£Y‡ý'’ÜÉêîƒga5=Z@xǰm§òˆdà¤OdÍ_¢ÀÏi„ü‘Kì±|á ýöÉ|ã‚Inoü €>9ß±¢‹mHàó#=yó#ˆ:‹Íµñœ‘ŸÒ¯ø©Ë£îÕ‚ rQìŠÕü‰ïŠ›!}^þ¢•5Øy ÚHÂ2Ð$8ZØÃÄvò'+æ”WîJ‹ p¿à–ºè¤\¦8°·éð[=+ä–LŽÄù|&÷Ó«37­D1°—€øMÜÖÝ]ý»!¤LGÔ`'‚¤ò7™å†„ÍÔ­ËRšsKØš¶¨;×6ƒˆò0Äç' jÿ3¦ ¢$r¥f9ô°w¨S™éß²È Tv°š/WZky×±±‰þ ä~©_>¼‰*fV›¾5ÉÙ¾ìTa+zÌ}Æ*Ï5嬅OïQ}é9Y¾³Ì÷T¶Â§úÏw˜·ž«l¸3’¿.iˆR_·É¢¦ßÈ*Ô>[š8+W(Ïm«†ÞVcU¿‚&;–ãË) pÈù.ÅJÖEÕjUƒìPHr´‘¿r´Ò™Ï5¿£QS(—¬rÍñü“€•h³wDÀ ÆÊË–`HTÑmº)»U2²2Zfj@9@…™;u‚2=ø‚Æs ·$³wN­Ð±£¼vp´Rµxå/ Ò•çó1É•xq1tÉ:_3~!uÖ˜»D  õJ>ðJwþ”… ,‰:¬ó›?¡Bøß¡N œ¨xgE;«míù8+1íÂë8×ù·ŒP^ _îK6]l'š²Zè€8¶ç#\ާi?¸ÄñIŒË2Õ¨pYHÖmŠï,wjÀyCÞÝ-^ •%MÜ@Uô¢P¾~Ý•wÓ›’]É|MÝÖCãÕÁÝVºfÙÛà’ƒ3™!ß)gùx­\Í^w¶hš†6t@v .ø‚¨¤¢%xÕ({ç÷\SîÅO{Cõš(¬ØAÿà à×ñÞ2ûð,bØ~übÄ@ŒAsİàº?Û=½Å7ÚEYîd{j–ÁJ^ _©s/nï]>Y¨ZƒÓ‘­g·²:›®rQ‡a8.Y ÙÕÁ]fÓÛÔ‡æü@¶é¿ž¢uüÀ]Õ”ãÓýáÉtmø^›-Ûþc€l`‚Oõx[ÿ›Q»Æ­›|:>~ ¾¢Hi†¿"ªÿŽÛ/Gé¶³„ßÕÍDI¡nx4­®fixÊ¡ŽÃ™}D"…Úq\¿åLMÑï°ƒ¡g|è L\笺vPf´Æ†½Y÷[²ê_îþ–šã·]´‘ÕVuÉ[UÀ6iV¯sV£´iêTÚUalݾÒ~‡C}â“«¥Æ ÷>W°GÙêÊÆ-»T]^Ú·9z /°F ò‚/ûÇ5Hbߺ·²ÝOF™Ÿqe~'blŠÇ|"¶l³ymQSÓ¦Òýžk).[#` ðLo'š(sÑ@°€U k°Knj)@@•2VÁÄ!“ÖªÿhfeâgâÎ1‡|Él˜>$ð1 "¬æ4´7¶®ÖÇ=øR”ù:°€Xˆ¡ ¸Œ ¬à» ÄöÛ"»ø€£v¼$pP2¾À‚~Ãq¡ƒ—ýœã òΖ-yßgÌ}ø.sLçWÝÇŽå…ÇBŠß1EÑ@¸oØ›¶Ñ„!  Á×E†¦^·%èŧ<€û‹gB‹NáNÌìøÉçDW͇ZQ>pU|HÊW)bÈ ø/$ü÷r‘º,¬û ²H ªà‡^rCì<³ÈóŒç ]G•Rµ™-h9h‚LHâàh&þW´#¼ö|âG¢4sˆ€?Æ$ÐËÚ)¯ØL€MŠ U"iÇ7yηվ¬úiõvÓ7"h@* 9Ð6jB1ñ<‰@Þ„`S9ÓH¡®‰,O¶ád{Pæì_Ÿré€p?DRÖUUk?%ÍO%!´vK³cH…PЛ"—2çup³IÖAý% í²ŽÎÁάQf´²RQÁÎo[š°—@iÛÞ²_Àß½b[]Häz`_²¶‰LCÈõ/o“ÇñÛC–þðj“(Ðê5b"Á²ãeÂNÍÐ<;,‹"Cÿa‰² àºÈšrý©$ž¥•32ÀÏùÐÙ:éÐ[t"Tü+nG(¥ µ¶(²ça4ßsyÜâ+ËåUwf®ßq\ Kò¡8 Æ’vY• †dbæ˜yé‹"Rd6C]=zŸ¯ yüµ)ººŠ;@–î‚Ès°f±mKoÎ*_²„qÁ¹-SÜæÜ6KbaAËE¥€UÀÈÂ^ž£ìAÿFÖa“IâàÜVÖï6!‹º²"Bf÷ )>ØiËwü§ÊÆ:¹°ôõ¨d XçeNñ2G/+—h t.DSB4šÔ+ަÿ…ΉÂðÁ—îd=[àed²Wx€aÊΫ®Ÿ `[·0*“mª]®ƒ?à¬(€k›jß´LyAµ„¯Õ.w€ €´duÑÏ{ûÚÛ²î«,ï—Iu[@(‚€ÒY )7(‡ŽÔÞêþ¯U~U·ndâÂï²/’uor=‡}éê™2Yû “áŠþÏÿ¼ endstream endobj 95 0 obj 4943 endobj 102 0 obj <> stream xœí]ÝnÝÆ¾×S½h4‡æþp¹D‘틤NãØºH‹†,ËJ$˲¤4AÑwêcE½ÎtÉ%ÏYr¾%‡Ô‘,9'Fi³;œ¿ovfIŸ%Y*d’UÚöOvÎvÎɲþ]›"Í-­û¯E™š¢šóð¹ÈtòøtçÛ,Õ¥M:ÿMþGt„mªªjÚáÏû'É»Yˆ,Íd²ûÚÑ(ËÒdž1‘H-Ri’Š4·ÉîÉ΃¯?ÝýaÇQÑJU“vvìUCyšKÙŽ¼­FŒÛŸÔººôC™q$›¡¥_g´›Ö WC2-Œh'%dä !n¥6]JtYCÚJ!âŒÓe¯èVŽ8“ÀãÚu™ÈŠfè”.¼¨†Tª2¡ZòoèŽ%¬ŸÑI­Ì3©Ê¸ÌéžU#E*3i[Rò묕J÷†¤TqñQYýµê³ëݜӡv¡*Îú;*ÐSjy—tÖ{O½ÌDžw©‡*<¦*̃…€¯æ‰V‹\ÅÍá²Eð@–h€HhÖØßah3À”ë…m0ÉW±$¯ÃPKŒ h:Œ%…QyÏ%+£jŸÕ÷ôÜvõ-éÂf+¥¢õ’Î ÏéP­,fV˜v赺¶BÇ©¿¢œQ¶À,ÀiÖ /$CµÆæ,Ü$÷ i\JåçBÈ*µªþ‡ êÕtè!µºŒª<¶°ËJ¶Ê–á’ÝšR¤ø°JéÎzæ¢4²´Gesè')#ó^~$>(hã!eKPe×.ÿd7ùvG$ÕŸ*¿nâæÔXm€ƒmN÷¤¤Èlj|JxlÉ3a[¾GÆR+ÓÉFtªµ°-“Oª!‡¶6[¥ ?Ó…K?d­2mžqR/Ô©´«ÀT'(¥ËtÖÁÏî­s¿03ªèrîçÀO*¬*ÛLô“uúÓ.¼ô³¬ÖY'³ÉÝqCva°ËàÌ:§²Ùk˜Ï”)&=ñ”²ú¶‘ ÑÙ¸$…˨²Ã…Í•u'Â÷Dô!§û”:×Ć–>ísG!col½p¿ÚÄÎôÚÖ}¦ÚJ×xw‡Î¢ƒ®ÝY¢™ed¡ÂÍvg=ò ­VY|“¹+ÊVàW”ÖºhR>)V›=¢O<õÙ’*47`UÖgÔyòÐ ÂeKÏ@!eaâËŽ)Ÿ4ñL®ãØÌ¥uÒDcWÑ,|ÛgôÂ+\fÂÚ:Çvó…v–*裄 ,äyJ;§Ñm¶TÁ¬K:ÔX¡Ôj…CW”{ {ÀWN©vQo!.NˆßÐ`ÏÛ(0kÙã>?bÀçy _±ÐÔJ#V9O jEœ °m±È*Ïâ ìЖ>)PÈþ‹Œ¤’í¿¤òzêgI#ËÖLvýÖ*Ëãä¿@EÁãµÝ÷ ÷1utÈ ˆ›TÇ;€€'Æ‘'É·~¨Ô´|>6ÿ·×ÆÍwõÁAd{1ò:â-x"@1ž†Zt•R€òç@èÙ)H*xä?€˜5Õ¤ ZûTö ¡‹¡ÂB+‘Vgà…P üeòÌ:Æo×E€2YAf“€Ä3ÎuŸf .€ü¯¬ ÉóxK<`d· zĵQ5¼”g]o¨Ýð0°:Ûž0ÄÉ!˜õ3Ë—ÁB`—`C±jÁœÜüK@^“ðpDC¼ü?¤Ü ’¸¢ÎG˜ØúþSêÛõ¡"(^-œ¦Ú^¸˜ìrÝ`;Ó+V²™5\±úk5Ô=Ä€(Î+ß,éqù¦«ÃXí«+«†½N šÒW˜ 7É0(~… Aë²Ïúñ~ÆÑUpÄ¿r›j'É…ÐjZõë}ïÐ|Å@] Yš„>#¥ˆi±ÍH}í¼‚wààá0ˆ44[¢çÁy°k:ðv;ØAÃ!Ç, +W¾@Ø´À,žÅD ÄNž-5¥¨¼j<æA)J²œùi?P€‡‚Ôló’B%È×y°{ÀJÀB€“òÊð³3ý Ü™€<¯¯Ü<¤bi ¯$7Ì}¼ë–ä@FWÇôJólcâqøȃúHÞµU^Û¾ ì †|pà'œxƒÃÉpv Øì{Rgi¤ä‚2 ”yçÆ=÷Wy%¦Ù¾ ŽF­î_Ò… â7òŠž º;ò°©ójqØÁQ,ØÜeÀ&µI±P¼hR‹×ô -%v®î2Xè4->¶§”{°¡ž/tµ`¥î¤0 ¡Ùõ^9;‚X¯ËİÇh? ¶tÂNx{ùv}èÍ: œ€>÷lY-WwŽ@ŒøŒe„gœíZS®×ÙH RJë8:MnHózb€ükjûxÜ/9V2)O'å×îy¾h!P ¬0Îê*å.´Òié”¶nñlð ÞM ZE¼ȧ Õ X«T.hVºÀ«•‚!Þ5–i7º&gxg—I7º† M¼­>¢ÞÙ×\>†²Ýô:Èèb•ÜÑZP#¯’Ëë‹LØã(«¼š ˆÂñâhë‚m «ŠÚïôßvƒìª$]°)Ãj`ΊSOý¬‘$Üöò×—÷ø03zƒfgı+.Ý Å®¸À¦+©¨]ãX˜ŒðŒ~BS¿‹JÍPn{/6ŽÆ Þ=ãÙw¯<©Æoö„–>¯†Âþ ÊK‡òÆ;W½Z™W½ÀÍôjõX@ë9Õ4x•`Ÿ‘Væ»þ ÷ü›}K¡âo)„ œ³DG(Å›Ç!O¤{EÕ Þœhx*¬,z!lðŒË¸P‚eDw¿Ñe±Ü(lKÕkG“ß›h|*|o@ê„fFwhÒµ(Nj´Šެ¼ Ð\—|LÝ–WèoOý¦÷±„ 5FÀy|^¹–‡›Ìâyí^PgÛ‡Ç[º¬0Ü’¸{‘Á).~’ ³z8Âì>~Âŧü¯íxA0?Pp¾ë¿¬IGr´ :ûÖ{¬°Í®·Íí5Miر¼¦18½ðBI¬,¿ÐJ¦¦sz¶c9òèÝ_m@müþÂè 7qa“xM cFë/÷cÀ,ÞM¡V0¦ß(_ñ[Y#Õ¶¦$㦬}UƒJ»C_™šA7ë¤Ú6L鎊E^OØæÙÛ<{›gß·Œœ×쎩9éKìšDý­™ükG$_¹],IŽvq‘æ‰Ê³À¬`èk›óLeUiaÅê»A‡Í\bï­7µêË*-w^P- º0¥Ü¿£³NéÐ1ÝÐ’²Ú¾3rñÝÚnÛHܾØNKéÎé,ðL°ñ—”ÿ}*±KJë=¥†€ôŽx|=¦ÒyÔäîøœwäZg­g°UT®²Œ–Šÿ¤ŽÐËŸkË•”R#zHö„nHé'–õ±¬8Ý´|Øûë‰ûtذv°íÙñì‘gÇ`!p&°GžÈs&À ˜J›‡Eø!ð†mµ.l9§Í2#{ Èû:ñ¬†­‰ Zè¬ê«T‘ú‹ª{·ÍDèlúæ:£”?£-·½Eè-Bß:Bƒ¸Eè-Bß„þg©ƒÒóBœ ôðÆ:`ö’Òš†ÐÃ:º6B‡£]Œ¹ûmŒÐ@s€ÐÕû'v@/¡½’Ò¡·½Eè ‚!Ì: ´xFø@è€ü]Ø"´•E¥áÎ!tõù÷{ƒÐ aMú¾ð{?2ŠCJköÉØ#ˆé`Û€<0d”°ü‘>ä­¿°°|>c1(®?î_纇& í5Ý(ÒÊí«€W3âѳ€Ç}N7†òÖ²Èë{„60³ðé®gð0h¤ Ü€mƒ'‚Y€<°XdØQOŸãrš dô€&‡Í˜×½¶3û(ä R'žMABðHLÓâÑtÆ eØ*þSG‡êo„³ªÜÇï8@‘à#ŽMVŽnXuÈd¿¡Æøw:tÍxà¯Pù;N¹f}eªýÍ_™ÊsUÿ¸«Rt`5¿Gn3W¦Ln;ŸÑ] X÷û0¹K ìö½û®†ä¤ +K:$Y eèe…C@+gÁ/p ¬y&2~,Î •j½ºüÌ«Jƒö7Hݯ¨¡ð/nóy±²ûæXÏï‘ÛL^,1{ï^%à§€A»ôZy°sÃ%$ œÛ/ºÕÁ¶‹Q›|²bܧm·§±\Wì> stream xœí][o·~ׯ8OM‚欗\î Aš Š´ P'*¶) Y–;ºX¶•:ÿ¶èKí<ç”{vW‡{ærÈÝ#_¢1$š—ápî3ä^®òLéUÞý8>;¸<¸\™\·›ßMUgåÊèÆþ]©ºÍªºësçe|~qp÷ ÏLÛ¬&¯þ[´7YÑý·™Ûýùølõéa7­Y©<Ëõêð¡£mÛ*ïS+mT¦«Uݨ¬lV‡g~ýÑá“;‹)Š®ÓჃº¦2+µ[λ–ÊîO34]õMye§šNúq•±Ý†¦Ó®Igu¥ÆN+Òò`˜¼Ñ¦šÎä@@‡ S7Z)p:ì>ÝÊcI'°Ü8.Wy=4]Ð/º¦"+rUŒÓÿ@wüŠ€~I;8ÏuÑò8§{þ¬k©3ëfœê÷ý¸¦Ñ…ÙiÒºàÑGqö7_³ÝÍsÚ4¬TÁƒþ”"ô‚RÞíõ¬Ÿ½ÍUYNgwð”! p +6F•OOÈÁ‚"Ô”Ôl9pw‡.ÍRÞ …Iy-KÊreIešqeI]åKvD5®5»zÙLÏÏm:¡‡­´F©±×=Ú |N›6‡e²¼QÕØô°Gºi”ág¿O!}LÁ½ð`àø‚€õƒ[—©h¤EYùD4ôt\ñM]{àó\iÅîGvbøÒ(££NÐ/¦Ñ# ºïTWúZdeüYlÇ=`OÇ…j”RÕ´É=ª×ž’¦Í‰¥ \úµ®¬IeçZéδêþAÑã5´é¥ºœ97p J¾U”#À-mº±CÑêÍÊ´×_{†h+=v:¢¸yÔw**]îØwƒî‚à°x‡‚¥èaoXþ‹ÃÕݵêþtöõø“Ħ¶&‘ÒŽt`mmVµ%ÐÁœ^m5÷¸ªß¿5Â뉴™ö2C¯J×ÅôÔÝ^êšZÛT4‰7øœ6 rª­T56=¦Ó_ô¢¿ÐcŸó¡¡)ò]¨¬½7Vv‡ñ0ÕZ׿?2Ók:ÓÃAukUÑ^W»3½ Ãž$»»!åéî°_wNéþOz£Kçµ­U«²Ê’›ý!«Í¦ÏWÛ¥uá´jÝ™¬jT«§ v2¤pwVZžÛš§¯û&ë»^•ƒ]d-éÊE÷´ÓÖ5¹6^Pœ `ÕFµeX`‹` @è½tPyÞì@ïÎõ’B/[àù‚ÎuÎ#ÇÕ³!…ѲÃ6¤­SópT°G𤠠€ °!°âhnjµë:¢pIäðÌíÚ:\õÀûe¨'Ž7LSñuDáåžõtj·×žR¤ü‹ ÌŒb€—Æîô@×f]íH¿éJ2¢‡Nä'‘ˆ9Þ9‘©È+=É ‰îQx…ŒJ|+‰ŸQI|Âðè¦?ë-67ùØëû)‰}ÿÝ$@X?tJwW”¬Ï·ÆC'T;išîñFÏíÏÙÆy´·ää€ÇJ¸W5E]ÏÀpCap˜p¢‰×¦(­zkõö”1¦¸ú'Úzq$´µÎ)!ÊN>Xì‘—Ä‹õ×:—ç”üg¹]k5…Äâ ®l‹;´`o™s$Û#çŸL›€Dç˜Ì!²˜ ™£ xÀEu%Ø"ˆÐð¾‰{²¬ÿˆv-“†@_%Ó%¢áèý¥^ ‰–ÔÉVö€{¶(–˜¼ÛÐÑ@jËàrαà§ÜëHSfÊvÛêH¯Ì`ð‚&΋¨t. U¤3.J\¹³Ëq¶-å×D€žnƘ M#ôBPÝÚV{³­fX(:½˜md¾y¶UÐÛ¥¦ÈûaZ9'ËÛVî@YÜ—·­ØlÛ*š.šî12¢Û‰'k½È*3…ëE¾å̼ Ñ=ƬôVß‚ , ~@Ö¯ó!˜ðºº  ¥ÞJ GC›Â ¤ÚÂ,ò¢ñˆäPÒuÅ‘·@ë=”¤ìl©IĨ#–`ÀÄDÁ’‚ȉ d»ÐÿJ›’Ý.a&,Â) šI{pJÔ4;úC½—#G e›øŒ þÈÂ`t k|Œ–îã\o¹t'VÅÚÔ:+Zãèx ,À²K¯ÒƳ«%¹yCQNþºÒߺm²Ê×7 ÆDæn>8x òk IæÿzóTŠ8’$ÊutD²§øzFÍ£ˆ„Ù4  çòÊSM–ö ÇâX$J€÷’› œl„ðxܦ%Só¤fýÅI 5»d¶þ)íõ+å®Z3ˆ¾ðNW@šîØX«ÝÀæúÀªLX^|ˆ¨2NЗ›3¥pu½&ȱjÛÕwo•غŒåÀìpIéâŠÎ,™”8¨¸ëòöµi³ºÊ­Â.•=tcñ5í%«Ü^ßP= ª¾îv++HÉ5˜g0—I@”ËËT¡°\ÞWä.+á—Ì4@¤+Ý6ùXG@jƒ]g‚â¼9Y:Cæqf@0G˜ ª,¤€ÊyAPì¾hI`³rj°: a6ì±ÖÊêÈÆêøB :ž t9i Ga\Ydó¢’õn¥ÚÏtŇôœ>ïÙëâ²hƒ©v=XèQÄ…—`ö39ºd™‡¬vðnœö’Çr@ ]–$rÿã/ŒÈJ’À\àYT¸<>fÏë1÷8ÈØÝ¼Å’ìw`‹e‰‡Â¢-ÏçY,@XYEj¥N+zÿÜ=q’x%ní†GT¡æìŽEnÈjó÷üÅ•wH:&ï1¹ê>ùÑ Ï“Gþ+/TÈJ=’kWdè¶ÐEœÒ)´´`vn Ø²Âö䉸‡do®­ÂÙw|ñ\öJ'¸ê—Åéµë),öJg0KÉekÖ¦¶š²0þÇðÀ„à0ç¾ÿ¿°àC8Ñ_g’<"ª;‚æ/pAzFV-ó)öÀ!÷ ßÑÆäÌÛº¢ì¹ç†ˆƒUYE)@4ø€ ÷žÆñ¼Ã<˜?ÖxOÆ¡2Š“%‰÷küÏ„¯Ž dÊø¤yÅ"1e ŽŠ/Áļ•î $ðÈμZ@•ÖíÌ3]¹~ç{w™;*5zÓ§”›K~îS––¢2É!'HL@¨FJþr—íÛ|Q¶(ûÚžEÀõ; eOY$ß››+’õžžè—}ÚAV17ò˯QU½ñáŒ%O^²:¯€ <”|¦s¾’M•å Ë8kË]~ÉÉÄ 8 ™)=ÖÅ;•s4Þ”\ù? >òø©?¶ÎZfíÊ"öþ*u^œÉ"D›Ù×¦ì «üŸ­‹iÁûųoú#ZïLÛßgÞeL¢ ‹fÛ£êÁAòÀåS™”‰zþyÑãöëj2éxä~+ Φ®þúÒ8¸N&$üh¸Æä«.ô8p q8.ùêfÖçÇ·¼C%s)Þ€§]~ýçSv2ãwqÿamê<3“'DdqÛ¨[!àµä@z%ŠsÁ¯›Ž¥rÑÓË^”›ËÌ.ÎÝŠþ…4¥,yí„øo€Kþ0dòë–oUÛá&Y£´ôL|(?âznŠí*3îiTeòç"²±Á—, ’=æô6…AÂk¯ˆ”²ìu5YÁDò3²"Þ*ùâpu÷@¯þ} V¶ÿ?±ÿ?>°3©¬\µÊ3»³ƒ²ÜþvºùÍ”ÖÏ­ºßLQÕhØöß™îôàÛƒËU“Ý–|òóñÙêÓÃþ"ZWÉ×]E˳¶m˦Ýü»ZUmfšUY˜Íµ´³á°´Uy;yDÑ65ykvšn¾—ÓôœÒÕ ÚôŒ6]õMu£Ê ïØ&­JÏ\ˆ‡´×:×]LD‚ÏzuïIþÜd™«¦äáú|KÜõ\¸¾£sÝ£@|Ý0e^ä-¿â#:ý9KѦßRäüý9\kÛ¯¸•H7›A(¬9[FøímŒp¡³Ö(=îe”Nœô­óB§‹ÉˆJ5‡8>™Å‡›Z÷çÿ=ó§Jendstream endobj 111 0 obj 4614 endobj 118 0 obj <> stream xœÕZÛr5-^÷+æðD÷ o@ Š$.xIåØvb{cCþ‰Oà‡’¿@3’vZÓ­]íÚ¹­¸<íîV«OߤÙËŽõ\tløä_Ï—‹ËN1áÇgel¯;%\øi¸õ½±χ\°îîrñ`Ázå]Wüì~$©Ïƒb×Ëáߨþ~xÞ}½?¨Ug=ÝþÓ Ã{oX4ŒwBñ^˜Î:Þk×íŸ/nýt{ÿÙ"hQRLûG‹[I÷ZˆL¹(&ìO(•HW‘ÄLP™HÇQΨÀ–HgIôÖðÌÔ!ÊQRî„2¥&`Kªà¼n8{‚·rÚÂD,—åg6‘–XðÕ@’½d\fõ'xÇoé—˜)ûœ éë>Ç{þf Ø^0ᲪϣœsBªIYwö±¿ Ÿ›vó“² á²nú ìÐ%޼+ÌõgÔî׺Ô!<ÃÆ‚„]iE§¸–õpx†¶H,ØäÂ¥„k¦ œïÆ Ê£`.&zUKôX†`-1¡ )XK¬‘z–’CPåµR1 «kWâIÇX0mÅ+Î3×|‰I#XªgŽ›Lz®WuíO°¥§Ø,‚‹0ž\bÁWȬ“&o]îêæT-´‘¬( 1ŽMD¸ë4ϼºŸ6Ä’œV\‰­ÐOýE9‘ ‘ɱ*Y}‹I´*W ǹ)IPûV\ïX‘FÄv¼Ië÷„ #U(œ{\ £ÕðŽáU˜tGÃ×KSØÔ(³Á“Þ(‚XPJ®_bBx#2ÓöÍ‘I¡góáA¸ ¶À‚w°Yƒ= ~»ß=Xðnø óuþ­u¦Õ>˜gjmÂJq.Ø0¶Á.ö͸ËvÛØ½’¦˜FT¯wÙÈ_Rè¶Ž©¢ž•‚¦Êë„.¦«’ë« š#‘bE/öafQ¬ÐåC¬IcKSá†îcÁ´¢táˆSW…I¯›V$<ñ*â,•(ƒ´Üö½Ñ«"Ôh] Äœ‡¹E9HDt‡Ðø!ü<ÝéBÙ Ûi©ípp;_å œ-$À´úâïÊÊNsoJ‰0)XqnÆ1ª`R÷ªH„IÅŠ#«±TYÞ)gõÊ’ao™p2J%þôt²ø­»@š2*º*ð«ÂÌLÈFeXv0Ös`E~L«NìfŒ®˜¬á@6lØ@3>XðŒ…è¬8˜T­ìê@[ñ¨È“Ï×s4@Û®`3-{œv…S±ÃY<æØ*ö—`™¶8Øáøx]ËßÅÿ0)ÝÇ2Í`Ò”H†e!”ʳËH`[ YæêÊŽ9ž»µ.å;.@ßÊmË÷¡„ÎÛÖÝX`’ºh""8s°=Œw«¹œV3W>^ nÖèJÇ$c„•°=”$B=¡k‰ÇîÃ]Àßç¾ò]<ÛH‘yÞb±#L"”;<ˆSkHÅá.mû°ÎÔ×mïÅ|£FÂÙ[l=Ì%BØÙ ݘΤÚq6SoÃøÏK]† ;»oêÇ&Îí€pæ*íúa°z‚‹ÐÅÓ!!à«£·ÝGíí{qÌ‘Lº<ùâcІÙDf»T“y»ÆY-øxæ¢ÇY×4ÎÞÇó&1Ä‚ç£T/œ.Î¥às<6&õÎI“=õψÄh|†IÇÑS‚ÑÕ3z‰…ºï¾îÏ+Ëñ´°/ƒb8ÆI¸Uß %WCó|Žã„PŸ.°¼á«ÝŸV’¾$%]a"/¯> /Contents 5 0 R >> endobj 25 0 obj <> /Contents 26 0 R >> endobj 42 0 obj <> /Contents 43 0 R >> endobj 53 0 obj <> /Contents 54 0 R >> endobj 61 0 obj <> /Contents 62 0 R >> endobj 69 0 obj <> /Contents 70 0 R >> endobj 77 0 obj <> /Contents 78 0 R >> endobj 85 0 obj <> /Contents 86 0 R >> endobj 93 0 obj <> /Contents 94 0 R >> endobj 101 0 obj <> /Contents 102 0 R >> endobj 109 0 obj <> /Contents 110 0 R >> endobj 117 0 obj <> /Contents 118 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 4 0 R 25 0 R 42 0 R 53 0 R 61 0 R 69 0 R 77 0 R 85 0 R 93 0 R 101 0 R 109 0 R 117 0 R ] /Count 12 /Rotate 0>> endobj 1 0 obj <> endobj 9 0 obj <> endobj 11 0 obj [/Indexed /DeviceRGB 255 <000000FF00006B6BD2FFFFFF666666FF66667B7B7B6666C24A4AB96B6B6B4242 B1F30000FF9090B1B1DA888888737373B1A1A1FFB1B1CC6B6B181818FF33337B 7BCC6666B9E33333B9B9B99090D2DADADA8888CCB98888FFC2C2424242E37B7B FFE3E3DA9999FF1818FF7B7BEB2121B1B1EBFF4A4A8080D2C2C2E3A9A9A93333 33F33333D252529090E3DADAF3CCCCEBEB1818FFA1A1999999A1A1DAB99090FF D2D2525252EBA9A98080E3A1A1E3EBEBF3080808FF08087B7BD2FF73737373C2 5A5AB9B1B1B1292929FF4242E34242C2C2C2E3E3E3DADAEBF38888FFF3F3EB90 90FF2929FF8888C2C2EBB1B1F3FF5A5AD2D2D2EB4242E34A4A9999F3CCCCF3A1 A1F3C2C2F37373D2FF6B6B8080806B6BC26666CC5252B94A4AB1FF9999B9B9E3 B1B1E3909090B1A9A9FFB9B9D26B6BCC7373212121FF39398080CCE339399999 D29090DAC28080FFCCCC4A4A4AE38080FFEBEBFF2121FF8080F32121B9B9EBFF 52528888D28080DA393939DA4A4A9999E39090EBE3E3F3DADAFFD2D2EBF31010 FFA9A9A1A1A1A9A9DAB99999FFDADA5A5A5A8888E3A9A9E3A1A1EBF3F3F3EBEB FF101010FF10107B7BDA7373CC5A5AC2CCCCCCEBEBEBB9B9F3B1B1FFD2D2F3CC CCFFA9A9F3C2C2FF6B6BCC5252C2D273739999DAC28888F329298888DA9999EB E3E3FF8888EBA9A9EBF3F3FFD2D2FFF7B796FC949005E770C2F0F4F7B82899EB 94F741F7FC9490F7B84E6D892D05E770C2F118F7B77BF741F7FC949003EE8803 D600F713EE00016FF7A2E3007DF1C2F164000FF8DF0008402004F7A3A0C40000 1F200C000FF8000000C4000CC40000DF0008000000F713E22A001EC4000CDEFD 30C2F18CF7A10E03EE8803D60000000305E00FC2F1A800E44A05E0F8000032F7 B9C59A3DEC000030001DE803B600C2F1E000CD7C00000900CD5C000000FF92D0 05E10005E17003B600C2F20400CD7CC2F21000F56A033238FFFFFFC2F2780010 260000300021F9000028FF92D0601232FF94D0FF92A005E100F432F805E100C2 F22C66E8880000006021D3FF92D0F432F805E100C2F26C66E94B00000060D91D>]endobj 10 0 obj <>stream xœí} Oi–¶s1Ónó!H ‚Âf0IX&|&\‡5Ù| .FÁËe@_˜ F€Âm#I‡ÉÆÍF ¼?tÏ9ï¥Þ*@fâäö‚ Æ—AçbSHôïÝœiñ×­ôÆ |E ã‹`c±ªw ~~^±Iäo*ô%1Œ/+óŒÕû'6+6Áö³ò3ßBÁxo¨xÌïŸh‘¿B_ƒÁøhÙXœ{2PÜ]ï÷û»Aø¹«ÁøFp3¸Ÿ u‡zçªxƒñm`3Ä¡ýÅÐB¡¹3…¾ ƒñ…н±ØTõ$„xRÅÓúŒoþ`0^UÕ47×gî3ßî÷nãKñÅ•_ }) ãËâ—¿ßߢ©½×Â`0 ˆë}…¾ƒQT³ø3ß(n3ûŒoÑB_ƒÁ( b· } £0ˆ²ñg0¾MDÙø3ß&˜ü Æ7ŠëìûŒooXúŒoi&?ƒñ­àæó ¿_/äã®ü­µ_ð‚~ëë…¾ã7Ÿ·øWz—:7®|×ùžÔëFþÉ|_ôÒÎÇZÏwTè‹`0þA1S/‰òW6®t^¹Ò Mþëyä_?ðùþ—?× —Âäg0.‰ûÀxã †zõn,Zm;{­Ñ÷ïÿ[È¿ñù²L~ãÒ~'(Ÿ¯P °”?=4NÍ=óù’¨¶]¸Nî–ŠkI2ùŒKÂOt¯j©ðw^¿¡üѨ1©¿•ˆbë»V€ë´aý\^ +?ƒqiÜDÅ‚G3”ñ9¿Yï›üA2ß—ÌØö?˜Ïd“Ù$\+?ƒñˆåïÓÑXçw6å¯Öä§:!YhåÏmõ3@~V~ãó0°Ñ¹!Ž&déO+4:(^S…6‹;Tþ7…¸VDi&›Aîù³>îçg0. g°Sµl!@“äÔÂ/Ò}‚ü€ú@ÿd6+²V~㲘Yê\zNGcADgç†$ÿmÝÑ×*óý¬(ùÔögüÙ üŒÏÅÍÅ`pf—‚ ý@AþÃh4-ϱ+a ~D~¬øù²lûŒÏBïÒâRh³Â_ BÀ Èo ?)¿¦~mf¹ŸM²íg0>þÅx|1¾ø!þ!aø$òGÑ}¨üY‹ý…·ýÄþ$Û~ã³P¬ÿP¯Š ,Å—üףј>¥Õ&üÙB“?+J~äüïòZŒlܯB4‰†ô_ôÓL~cX¿™óg}ÉÆ|ãÚèëöð~*mwwyxïã×p:üëÙY8ŽÐgÚÏú_{jFTüPù“IV~ã3ðóœDÕñ c|Ï|¾?(É—ìÅæøº½©ðþ~d?Lã^ ¯6œÏeÀéò*œFàùRûíkÎó¦J!ßÇFôïÉRw]l\øc0.ŒÇOû逹/GõËQ}IÓö'³è¼3™Tþ—­½ìÚOõS¤û€×ÀíÝÿ>ïçOV‡VOV"«4æá“?^:,ÃÔ¸`þ¸èë“I¿;ãâ(Ö?é}ÒÛ;ÛÜ\SÕDLíóŠQ}¶j?xnâþxžòçºà>)ŒJt&ú¯6ä\|xHpÿ%Š?6éýáKöSvFùýã2é—}D8bò3—¿7ê õÂz‚ìŸû'£Øgé½:H’éGÔ8¾ho>±OÔßGþ*âõONVON]~ûס“!|t?ŒÊOQƒØIì›ç"ùÉ÷Ó ¿lR;òñãRh …B+ÐBž„zç~3 ýF²o R(¿Ãö¯ãß—ôO¡‚£éôzƒ¾çgþ£C#'CC@þW-å—ÒI$Ì€AäÏ’ñÏR¹ß¢>+?ƒqÜX‘Qèý-–Óoúœ@Ê÷3™yÛ×ìu%ÒôƒòHÈW¥ò¯"ÅÚ:424´{‚äÔ틤63¾ùµðgù…+ö2Œ‹âþ€ÄÊÊñÿ/­7¶™õ¾,ÖÝl9n^Ⱦþyð°HãWQ×ÑÞíæì¿ündhw„„ÿääDÿ0±¬? ?|á²uvƒ~Ó÷[®„•ŸÁ¸8~(¦FüýÿÆ›NÛïÓõ>‡ò¿ÝGîKáO…SaUëá‚ ŒüjûáW#€¡]Š (þ»ïÎPýQù÷¥ö'ö­Ó…ògÇůÓ0ëêXùŒ‹ãfw1Bñ`eÓxÓÅô'E_ßxÖ$s‚È¿¿Of=œŠDVwÏ^*ú½GvGFliÿè±DP_†½³U•õ§(–XÒß  ~Ö0V~ãsð˜È?V,B¿ÅxÓ-çÝüY[Á¯Qr;ùQ¶w‰æ¹_¥ðCÊOLkþð[úÓ‰ ÿOê¯Ã`üçUo_"ѧËj–Ä_¬èa]+?ƒqq<öuwûíÊŸWíOf{¨ânöóß½Šäߗ‰h½>¢Z?æûCÄSú‡FýÉõ[oìb¹ÈIääe¿êÓ0®ËýjjU‹`åg0.·€äÿ@…ñ^žîõ³Rû Û?Ü¿ M°×zg;ù‡PÞIù²ÞÙCê¿Bã?tbô…_î6ŒöŸ:û¦ˆúBû1Ð"ž¬ü ÆgÀß]è®Gþ#û7'´›å>_6LÿÞÕ« I}ª÷åŒ÷ND±ì=ÁzãT ?ÕûOÞ}âÅjî ågÅg0.çâ›þz’ÿâ çZ åÙÏ¿Qgâ*¥ü²à×`¾Òä¦b?°ý­¥ð¹·Èþ·ôŽóý„é´˜‡œØ×ƒ¦Ÿ'ô0Ÿ¿±¼¿ ù³¦ïÏŸÏ?ÂÒ/¹i6ß;¥þ!)ü#µÞQÊ/»úWëg££Ín£€ Èr¿˜Ù“dåg0>é3Ù_ßíF~£“?ébûß_¥”_VüÃ~¥ò á7ëýôRÒÿDŒðÇ©½‘ðnÿiUc|Øö3Ÿ‹XßðþŸ-úÍ8O±­á—Í_Ìc„_Ò?’Ûß=#é—"ÿÖHúÿ›Ê}¤üb€¿œÜüO¥vïæ\/7#†øeiF?Oèa0.ëÑ´wÂoÙŸ¯üz4 ÖûòÉß|ÕÈù#‘HûIûnûî¶³wgTî“Å~hVfŸÃ”_)ÿÍ ¾4-(Ùop+ŒÓ¼½€/“ŸÁ¸q±®–– „fÿŒó,Û~.ä§^þ„®ö›Ëøà„>Tþ!9Êgä­Áè¿êœ_ð%åËñ½)ç„~‚ZɇÆösÎÏ`\bîîf ÂbÿŒó´‘¿áêUQï¾GçÍÓ}ò“!1ÆG)¿9ÌÇÈù‡TÒ/föÐJ@ûûgy—lüàjšóN`0‡\¤s`ÐßüY‹û.ýüS ´ýªÚŸ@ÛNÚ/çõœ¨‚ñß\ÐkïJùMåˆ~`üö^C„îê˰ò3—…Z¤³bsSð_°¿þ†óDSùÝ ~ V¹’~þ”X¿/,øIåG¡·­æ·÷VŒÔ·ôÐËy8Ù­”?Ë9?ƒqY(î?ž©ûÏU~Ëõ»ÙþI³Ú/&öÐ^±Ž‡˜²«¤ß¾”gî?‡dÊ¿z"‚)D(?.äçø­ŒZÊGäülûŒ ã0z]ùgff*Èúûgœ§ZÕ~*÷çð›Õ~k”ϼ´ý‘°š×£êýNò{½§ÿI¿Ö}±–Ìùû Ǩ}]ìϰò3—BßmuWŽŸgfn û+Ðø»“ß>³'o„_s¾ò‹¥|(é²ÿ<ò{ñž# ü/UüHøi^ŸsÔÀ¸X»;ÃÕ~ã’°îÁûóù'>Jþlþ:E??P_Tûç§§kÐöâpÎõœ¿;‘®^ÌçO!õ÷‰œíùÊß®gõ‘úæÊ{©ˆUïK$–moÊÛu‰A>¬ü ÆE¡ïŸ®æÆïåüëæb^Ùd&ï뎤í—+ùØjt¹ß£»wz:<üÓÙÙªÉâZ¾“ï†ï´/ù›‘KyHåŸü¤ÿ\ƒ!q]õñ#€ø7ˆûçVû¬•2if ꃜu ñ“S{‘ý~ãûXÆ;ûixô•}a®W¿þôŽº÷iBϪ¹’O¿Èùé ¯:rþ.P~ZFL(¿ìyàî~ãÓPm¸þDz§]ÿ„ë¿ucJ/®Ü]:utw»+c¸ûVáûåœÞýˆõVƒ^»ŸîÌ1¢~{ÿðoâ^]«ÏDÂäÏÙ®¥±Tß±'‰~¤±}ª6yð·øWa0¾ÜÖwáõz®æ›ÂŸ?¯Ù6+í=Xt›²ÎÈIòÓHŸÈ~*%Ù¿&‡í…Qßi!ÏœúÈ«= Ÿ`Ý‘{]?Ú~rýÖÚÝ„F½x¯yûàäßè†ÁøÊÑ­¶Rþ_**Ôð^Êøëýÿ7ï>›ôc;ÊïkãŒvs˜ÎÇ 7Œö¾”ÔÇÁ{â†\Æ*^'CrmO9£'<šÃ?ï5¤tOÖûS{ÚEO_FŒñÑø[þó0_/Ž>ïÍŠMIý‰s¦ôz3ö™=”rÛoו벆øÒŒ~q“nû}ºWmkôâÊž«òîÜrdßnûnX ðÙÜ/áè7œ”Â/”_oÓã«EµYïÚcÓsúüÝ3y¨±I?òÍ·mÎÍ‘îí£Ûõí«™}4Ä_êÿÉIÎøDîäÄä¾ÝgõóEð wíWâmÜÇ‘ý>¾cƒqA˜äÿ¹¥E®å1¡–ñšÉûÀ¤©üú>½öþþvYò»º/²~âp8bQ(n/Üë„_Ýw>¢—ñÀé¼h$rÎk—Âï3oÒËýý Æ'!jÿ—‰–‰½ŠW½¿¾Û…ü9Û=»ô}zí'Í'(ë$ôr>á”pþ’ú«Î¹w«Öd¾°^ÄCÌé‘ý|ùƒZ³êf]jØnÜßÏ`| ¢FOß ÿ6Å}¼oOÞžŽå<|IºQ¯“ü¹°ãK¦ù}b–®S÷»V¾§¤ÂÒò§h= ü®¿æ}Ä»7žµ:ú4Ú?÷ß„Áø&`*ÿ¦céÞn—›vÞ›Ê/´?›qŽá?KÐðþ«2éW{åb~n#ýÞ™sø#j6_Šfó%ö#®“&3bÙn›i½ü¿ƒñ á¶EþÇzÝîz¡ûn·ëäžÔ÷ɂ޸º£ÒËôòNÝ)¹œW$üSÎõRŽ„á§•»ÂF­…?õNy±Ž‡-áQ> ƧÀPþ›@yâ=4y«¾üu"r]û‘üI`¿Ë Úá”è—Py?!Ü;÷bFOÔŠ½ÒóGhh_äìü¹“ìp°i?“ŸÁøD«£êf-HzÁüzy—î7åÕd²–öÌ¿vP:ÚŽºäO…çwï~däýéðÙ‰òü4¶/uÒ_°aªÖ”ýÄñòƒß?ŸÁ`bzxïc}{nIý±âWå>>::ZoþØŒýWk¯ÖÄj>Ÿ|Qê§á½Â\^Î'žÎ`0ƒQq·¯÷—n…1BqñÀÀÊïŸÁ`üCã ø~q´9f˜Ügò3_/¢Ñè!î×kæ÷WZ }y ãï…ê¨XÊç9¾˜hOªÜ…˜ü ÆW‹¾¨ä7t/–¢~Áäg0¾^û¯{½cHxE|IýÞ¹‰B_ƒÁø»!Åš_Eh%´‚¬³/˜êí›cåg0¾b ‚ôGBÈþf>P¸ÏÊÏ`|ÕÀ¬ÿ@wÚˆø`ø‘úMMþB_ƒÁø{¥ÿ7ú^¤}¯Ð|ä~0(ˆÇk  Ø`D‡öí×­ØÚ·Û[U;/$`4 ‡ý1íÙ÷hýÿÄÿm1¸ º¿|'€þz«îá`90>FB=»S‚ìóîÌvô:hØp%FŠ’ÙXÚOe-#¯C;à-¸³0ˆ~¿£Ž–¯ë0Ïi[hÃìÂû¢Òƒ!¡­r– ±J¢}Y]ú‚­…E”Q<ž‹åü–æ›Òo ì™MÐ<½G> }®öŸ>85èoñœ8ß¼ö Ù­h¿$‡‡ØÐ¬K7 Žá@÷©MXE÷#hÃJûG%ñiwËlŠñ¸5yKcRøIý~;é—÷‘ößOM‚ðO~?e6EðÈ{`?6ê#í[‘îÛí†%  6¤=vÏZ%ÿéÙ >0_qý˜žk„-˜·”ŸœB#n©šFxn´¸ßˆÜo´´ß&þëkmD×Ú ŽDÄGšÙáàGhHtr?RC¼/ŦP|—dÇnÄthÁ}â|¾ê)U„—ÜïÁ嬀ö¸¨º‚,nÂøp‡/ðöZ´è…XçÒ"ÿÅÅ¥xü7,ûýWÓ"ÙýÅÅà´ ù©Âm«{8‹‘òw$?p\áNݬ`{Ñ2à¡é‚ž:.£W]ûï -ðUvà7¥á é“uóœ’_Í=ôõÓ 1V½;++ñ¯áÃø±jØÅ.B}—(3viÒ~öôþÁyÚo×} þÞšMøÅ4gü›=pŠ?i¿Hš…ðÛÄŸ( •²¥ûÃnÀÝ~up«ßˆyªßO´¿µ,èkR‡bÿÔÔ䔡ü¦P1`Usaý¿ßކ͖´£êߤð‹½]÷Qõå^„€VKôÿÏ5ØTN`—}|Týy¢;<”ú7ZÍzì'í·YýÒ5°é>„‚kZ÷1àëT@(ÿÔý§OÇŸ"åi/--5%ßd$  ‚~´ÿúÔ”ð‹-ké?ŸêÿúǽKAäz$þŽþöaì>¼ ;ƒ6ò— ¦nÕŸ1⸠‘gyžö*ëLò×S…š;•m·­c«Þh¥çE>ùÓm•Èö¨`;üNG”XN¢m–ªJ ñ³fÁàSèoùý\^[ÚEûÅÞ]û ö›ªoj¿®4ÛËk¦ò?²ë¾Ò~Cù×µÝ?’H?,µ_‰¿Cûï’ðdXÖz/›¤~¿aü%ó—…ç—Ú?)ÔßÔ} (÷ úÀý)Ãú;tÉßÞJÛ¶!üZ÷Û¡µ¶Ãó±6Rú•ë—–_ÿXk¿|¨ÂÀ<ÑÞR~“þ û5]`ìÊoñ^»WíWºÄ¿&ŒÿS²ü:ï?Ê/Ô_˜~|HÖKá—q€èýC)Ñ^k¿f¿”~8øAZ±vµd~’¨/´ö —Ÿ•¼'êÓß²šüõÀsäz0ø¯ÿGûýñ½Øè„f#êô½Ù鯄ò{ªù%ëbH¢K ò÷É¿Ùu\uü-²ÇŠ®ÏzòÈß7}{‡¾IüŠ·dzº#`½”D¼úð½@삾ߌ.Å?þ¼"à=öÎ×þ½SS÷Úß,ÙeßEù­ò_3é¾~<Àl)¿®Ú]­ûÃ:ëwhÿ­~Cùïjí_6ó}ñ÷kí—•ïʯ´_Å€×È{tû–÷ÝŸ²åû¢¡÷Ý*”¿µÝ,á[[-ÁoÕOZûI÷üHÿg†æ«ä=¥ü˜üká×A e…€®FWt5v]k¼ÖUÛu­ËUûµî“í¿&…_Š>=¿Mè?E’~ÓúK`©öãš÷ãvíÏëïùAi&©š¢¿ÔþŒÖ~"¾Èõ³Û X ±òG4ÿÑ¿,mtv¯t^±‘ŸJóŽ-¨¬M“Á®ö´íx0 zh7íÑl‘ßëé»;1›'­óp£Eõ‹Ù<òÇ*ËËMò{^D©œ¯È§:–Æ«óP ©óô]LùÍBŸ“úJûEÕ/m¯ùS;GûAùO䷴ߪó­iöËðHª¿¡ÿGÍ–ö7«¼_è¾,õ©@0_i¿æ¿%ýH}þ»†õy¿~Ò}§òkö[¼'íŸt~Ù€1€lD€©ísŠ}ÛDúvÊûÛ-í?&ío•vÍ¿`¾!ýó¸ÕKÅ—ûg¦öÏ+áGç¯6Óù§„ô7Ú­€Úk°á£K‰¿Mû­Œ™MýI÷§ïÔíéSÅþ[ѯÔHdª?Žâ/ÆõÇ•ç_ú„Û·©D⟥[júä--Í‚ßãP'ð|ã xüà*þŸ¢èþ£þËÿÿ°ñ ºïknm"}O“òƒ°W")Óƒ“-$#ïê<1'ùït”‹à±Yzñf]™†(ìÚòÈuJÛeRoYâ xÚðc垎 uõÙ‚€KÏŸ—”ß)þB÷õ]´ß©ûμÿ•tkpdïÌKüåi¿Ðÿõ#;ý…0µßVï7´_øÿ~³âÒ¯u_)¿ ·–ÏÑþ)ËX1à{¡ý´ÕñÚöŸ„[$þöÎ@$;Ðÿeë±ØTõï™,ø¡òߟKñŸ¯12~É|!ùêXûS5–æKÆ+÷/F¨íïß…´wA+hç/»~|o6Jd’þ÷¥FÞ/CÀ¸¦©©û¢Ê/{þ¤ ûb‹¼3¬Tÿ¬ ½Èû…óÏêq×¹•.@ü?ß²qeãÊ•ÎNÜÑ3Ä‚¥ùcuTàv´Z÷»‰ìÚã½#l¬ˆXX$U˜̦¤Ü´ý^ÙùîU¹|ò£“Ç‚ßV>ùÛ:›–Ah:0h¼„ÏâW÷Űᢠûí!À .Í=çGíß;gðO>ý8JþÍkhûÖ_Ëÿš~›ö«´ÝMùlõþa©ûŽa?*Õ¿%^P@‰ÿ¤j’úùÚ?µl)ÿ¤*øOé^?5ö=?Ù}cô=(Û/ˆ/°-+ôLº/©ÿRåüÊjŽçIúíŸÊ/çµù¯‘Ù¾­æ§´^°¿F¿@î×BÂÔ'þ»û±èÿãÁ5£äoÚcèÏ{½·[YúÏH¿/[©æ½Ùß/¸}~=¢¨€LþÅÞÒ~!öº»ÏVðc˜’ïJû´-íÇç´QíÏÙ´_qÝÅø“'x`y¿ÃøËœ_ê>>ÖuÙïÐ…ß>pØÔKû‡UÍßÈûupKÕþßAøûoYù¾Nío˜4h?)Šþ“†ðË1>$ýTó±À>þOdþdÿ[·[e ÀìÓ. ~/)÷©„_Sÿeÿ ÿŠþRþíÊߨò~Êú)é@•üæÍ í>\#×ßEY?…gÚoØ~=ÔGþM²_û\¤ýOu¹ÏðýôœQIáû5ý3Õá×#R~â;²_åüTû3 R¤ü¢»O0ßÇ÷±wEîñ7µÏÒþ:ówjÿš«ö»´WfÞoô£@Ð,¿ììü_äû‚þ„ñu‡ö÷ëš¿‘÷[)¿½Ãó}cدCÿyÿ”îó³úù•ù—%ÿ)ìé{=eËù ío•UÿV™ðËÑ>ªòGy»RûgÇVŸŽç­¿Çbä¯ÕõW£³ÿFÕÝ'Jïßj÷Iþ‰÷Ž´ëý.ôWÂ/ºûóéo9Ô~‹ýV©Ÿ^«:¿òšû2ûÏHÐ#¶¬ä~ÖªøgDÕ¯ÇR~à'ºûðQhž1 ƒÁ`0 ƒÁ`0 ƒÁø\üƒÔ endstream endobj 21 0 obj <> endobj 22 0 obj <> endobj 23 0 obj <> endobj 24 0 obj <> endobj 8 0 obj <>stream xœkhÙDÀ€ endstream endobj 7 0 obj <>stream xœc`Ù endstream endobj 29 0 obj [/Indexed /DeviceRGB 255 <000000FF00006B6BD2FFFFFF666666FF66667B7B7B6666C24A4AB96B6B6B4242 B1F30000FF9090B1B1DA888888737373B1A1A1FFB1B1CC6B6B181818FF33337B 7BCC6666B9E33333B9B9B99090D2DADADA8888CCB98888FFC2C2424242E37B7B FFE3E3DA9999FF1818FF7B7BEB2121B1B1EBFF4A4A8080D2C2C2E3A9A9A93333 33F33333D252529090E3DADAF3CCCCEBEB1818FFA1A1999999A1A1DAB99090FF D2D2525252EBA9A98080E3A1A1E3EBEBF3080808FF08087B7BD2FF73737373C2 5A5AB9B1B1B1292929FF4242E34242C2C2C2E3E3E3DADAEBF38888FFF3F3EB90 90FF2929FF8888C2C2EBB1B1F3FF5A5AD2D2D2EB4242E34A4A9999F3CCCCF3A1 A1F3C2C2F37373D2FF6B6B8080806B6BC26666CC5252B94A4AB1FF9999B9B9E3 B1B1E3909090B1A9A9FFB9B9D26B6BCC7373212121FF39398080CCE339399999 D29090DAC28080FFCCCC4A4A4AE38080FFEBEBFF2121FF8080F32121B9B9EBFF 52528888D28080DA393939DA4A4A9999E39090EBE3E3F3DADAFFD2D2EBF31010 FFA9A9A1A1A1A9A9DAB99999FFDADA5A5A5A8888E3A9A9E3A1A1EBF3F3F3EBEB FF101010FF10107B7BDA7373CC5A5AC2CCCCCCEBEBEBB9B9F3B1B1FFD2D2F3CC CCFFA9A9F3C2C2FF6B6BCC5252C2D273739999DAC28888F329298888DA9999EB E3E3FF8888EBA9A9EBF3F3FFD2D2FFF7B796FC949005E770C2F0F4F7B82899EB 94F741F7FC9490F7B84E6D892D05E770C2F118F7B77BF741F7FC949003EE8803 D600F713EE00016FF7A2E3007DF1C2F164000FF8DF0008402004F7A3A0C40000 1F200C000FF8000000C4000CC40000DF0008000000F713E22A001EC4000CDEFD 30C2F18CF7A10E03EE8803D60000000305E00FC2F1A800E44A05E0F8000032F7 B9C59A3DEC000030001DE803B600C2F1E000CD7C00000900CD5C000000FF92D0 05E10005E17003B600C2F20400CD7CC2F21000F56A033238FFFFFFC2F2780010 260000300021F9000028FF92D0601232FF94D0FF92A005E100F432F805E100C2 F22C66E8880000006021D3FF92D0F432F805E100C2F26C66E94B00000060D91D>]endobj 28 0 obj <>stream xœí} Oi–¶s1Ónó!H ‚Âf0IX&|&\‡5Ù| .FÁËe@_˜ F€Âm#I‡ÉÆÍF ¼?tÏ9ï¥Þ*@fâäö‚ Æ—AçbSHôïÝœiñ×­ôÆ |E ã‹`c±ªw ~~^±Iäo*ô%1Œ/+óŒÕû'6+6Áö³ò3ßBÁxo¨xÌïŸh‘¿B_ƒÁøhÙXœ{2PÜ]ï÷û»Aø¹«ÁøFp3¸Ÿ u‡zçªxƒñm`3Ä¡ýÅÐB¡¹3…¾ ƒñ…н±ØTõ$„xRÅÓúŒoþ`0^UÕ47×gî3ßî÷nãKñÅ•_ }) ãËâ—¿ßߢ©½×Â`0 ˆë}…¾ƒQT³ø3ß(n3ûŒoÑB_ƒÁ( b· } £0ˆ²ñg0¾MDÙø3ß&˜ü Æ7ŠëìûŒooXúŒoi&?ƒñ­àæó ¿_/äã®ü­µ_ð‚~ëë…¾ã7Ÿ·øWz—:7®|×ùžÔëFþÉ|_ôÒÎÇZÏwTè‹`0þA1S/‰òW6®t^¹Ò Mþëyä_?ðùþ—?× —Âäg0.‰ûÀxã †zõn,Zm;{­Ñ÷ïÿ[È¿ñù²L~ãÒ~'(Ÿ¯P °”?=4NÍ=óù’¨¶]¸Nî–ŠkI2ùŒKÂOt¯j©ðw^¿¡üѨ1©¿•ˆbë»V€ë´aý\^ +?ƒqiÜDÅ‚G3”ñ9¿Yï›üA2ß—ÌØö?˜Ïd“Ù$\+?ƒñˆåïÓÑXçw6å¯Öä§:!YhåÏmõ3@~V~ãó0°Ñ¹!Ž&déO+4:(^S…6‹;Tþ7…¸VDi&›Aîù³>îçg0. g°Sµl!@“äÔÂ/Ò}‚ü€ú@ÿd6+²V~㲘Yê\zNGcADgç†$ÿmÝÑ×*óý¬(ùÔögüÙ üŒÏÅÍÅ`pf—‚ ý@AþÃh4-ϱ+a ~D~¬øù²lûŒÏBïÒâRh³Â_ BÀ Èo ?)¿¦~mf¹ŸM²íg0>þÅx|1¾ø!þ!aø$òGÑ}¨üY‹ý…·ýÄþ$Û~ã³P¬ÿP¯Š ,Å—üףј>¥Õ&üÙB“?+J~äüïòZŒlܯB4‰†ô_ôÓL~cX¿™óg}ÉÆ|ãÚèëöð~*mwwyxïã×p:üëÙY8ŽÐgÚÏú_{jFTüPù“IV~ã3ðóœDÕñ c|Ï|¾?(É—ìÅæøº½©ðþ~d?Lã^ ¯6œÏeÀéò*œFàùRûíkÎó¦J!ßÇFôïÉRw]l\øc0.ŒÇOû逹/GõËQ}IÓö'³è¼3™Tþ—­½ìÚOõS¤û€×ÀíÝÿ>ïçOV‡VOV"«4æá“?^:,ÃÔ¸`þ¸èë“I¿;ãâ(Ö?é}ÒÛ;ÛÜ\SÕDLíóŠQ}¶j?xnâþxžòçºà>)ŒJt&ú¯6ä\|xHpÿ%Š?6éýáKöSvFùýã2é—}D8bò3—¿7ê õÂz‚ìŸû'£Øgé½:H’éGÔ8¾ho>±OÔßGþ*âõONVON]~ûס“!|t?ŒÊOQƒØIì›ç"ùÉ÷Ó ¿lR;òñãRh …B+ÐBž„zç~3 ýF²o R(¿Ãö¯ãß—ôO¡‚£éôzƒ¾çgþ£C#'CC@þW-å—ÒI$Ì€AäÏ’ñÏR¹ß¢>+?ƒqÜX‘Qèý-–Óoúœ@Ê÷3™yÛ×ìu%ÒôƒòHÈW¥ò¯"ÅÚ:424´{‚äÔ틤63¾ùµðgù…+ö2Œ‹âþ€ÄÊÊñÿ/­7¶™õ¾,ÖÝl9n^Ⱦþyð°HãWQ×ÑÞíæì¿ündhw„„ÿääDÿ0±¬? ?|á²uvƒ~Ó÷[®„•ŸÁ¸8~(¦FüýÿÆ›NÛïÓõ>‡ò¿ÝGîKáO…SaUëá‚ ŒüjûáW#€¡]Š (þ»ïÎPýQù÷¥ö'ö­Ó…ògÇůÓ0ëêXùŒ‹ãfw1Bñ`eÓxÓÅô'E_ßxÖ$s‚È¿¿Of=œŠDVwÏ^*ú½GvGFliÿè±DP_†½³U•õ§(–XÒß  ~Ö0V~ãsð˜È?V,B¿ÅxÓ-çÝüY[Á¯Qr;ùQ¶w‰æ¹_¥ðCÊOLkþð[úÓ‰ ÿOê¯Ã`üçUo_"ѧËj–Ä_¬èa]+?ƒqq<öuwûíÊŸWíOf{¨ânöóß½Šäߗ‰h½>¢Z?æûCÄSú‡FýÉõ[oìb¹ÈIääe¿êÓ0®ËýjjU‹`åg0.·€äÿ@…ñ^žîõ³Rû Û?Ü¿ M°×zg;ù‡PÞIù²ÞÙCê¿Bã?tbô…_î6ŒöŸ:û¦ˆúBû1Ð"ž¬ü ÆgÀß]è®Gþ#û7'´›å>_6LÿÞÕ« I}ª÷åŒ÷ND±ì=ÁzãT ?ÕûOÞ}âÅjî ågÅg0.çâ›þz’ÿâ çZ åÙÏ¿Qgâ*¥ü²à×`¾Òä¦b?°ý­¥ð¹·Èþ·ôŽóý„é´˜‡œØ×ƒ¦Ÿ'ô0Ÿ¿±¼¿ ù³¦ïÏŸÏ?ÂÒ/¹i6ß;¥þ!)ü#µÞQÊ/»úWëg££Ín£€ Èr¿˜Ù“dåg0>é3Ù_ßíF~£“?ébûß_¥”_VüÃ~¥ò á7ëýôRÒÿDŒðÇ©½‘ðnÿiUc|Øö3Ÿ‹XßðþŸ-úÍ8O±­á—Í_Ìc„_Ò?’Ûß=#é—"ÿÖHúÿ›Ê}¤üb€¿œÜüO¥vïæ\/7#†øeiF?Oèa0.ëÑ´wÂoÙŸ¯üz4 ÖûòÉß|ÕÈù#‘HûIûnûî¶³wgTî“Å~hVfŸÃ”_)ÿÍ ¾4-(Ùop+ŒÓ¼½€/“ŸÁ¸q±®–– „fÿŒó,Û~.ä§^þ„®ö›Ëøà„>Tþ!9Êgä­Áè¿êœ_ð%åËñ½)ç„~‚ZɇÆösÎÏ`\bîîf ÂbÿŒó´‘¿áêUQï¾GçÍÓ}ò“!1ÆG)¿9ÌÇÈù‡TÒ/föÐJ@ûûgy—lüàjšóN`0‡\¤s`ÐßüY‹û.ýüS ´ýªÚŸ@ÛNÚ/çõœ¨‚ñß\ÐkïJùMåˆ~`üö^C„îê˰ò3—…Z¤³bsSð_°¿þ†óDSùÝ ~ V¹’~þ”X¿/,øIåG¡·­æ·÷VŒÔ·ôÐËy8Ù­”?Ë9?ƒqY(î?ž©ûÏU~Ëõ»ÙþI³Ú/&öÐ^±Ž‡˜²«¤ß¾”gî?‡dÊ¿z"‚)D(?.äçø­ŒZÊGäülûŒ ã0z]ùgff*Èúûgœ§ZÕ~*÷çð›Õ~k”ϼ´ý‘°š×£êýNò{½§ÿI¿Ö}±–Ìùû Ǩ}]ìϰò3—BßmuWŽŸgfn û+Ðø»“ß>³'o„_s¾ò‹¥|(é²ÿ<ò{ñž# ü/UüHøi^ŸsÔÀ¸X»;ÃÕ~ã’°îÁûóù'>Jþlþ:E??P_Tûç§§kÐöâpÎõœ¿;‘®^ÌçO!õ÷‰œíùÊß®gõ‘úæÊ{©ˆUïK$–moÊÛu‰A>¬ü ÆE¡ïŸ®æÆïåüëæb^Ùd&ï뎤í—+ùØjt¹ß£»wz:<üÓÙÙªÉâZ¾“ï†ï´/ù›‘KyHåŸü¤ÿ\ƒ!q]õñ#€ø7ˆûçVû¬•2if ꃜu ñ“S{‘ý~ãûXÆ;ûixô•}a®W¿þôŽº÷iBϪ¹’O¿Èùé ¯:rþ.P~ZFL(¿ìyàî~ãÓPm¸þDz§]ÿ„ë¿ucJ/®Ü]:utw»+c¸ûVáûåœÞýˆõVƒ^»ŸîÌ1¢~{ÿðoâ^]«ÏDÂäÏÙ®¥±Tß±'‰~¤±}ª6yð·øWa0¾ÜÖwáõz®æ›ÂŸ?¯Ù6+í=Xt›²ÎÈIòÓHŸÈ~*%Ù¿&‡í…Qßi!ÏœúÈ«= Ÿ`Ý‘{]?Ú~rýÖÚÝ„F½x¯yûàäßè†ÁøÊÑ­¶Rþ_**Ôð^Êøëýÿ7ï>›ôc;ÊïkãŒvs˜ÎÇ 7Œö¾”ÔÇÁ{â†\Æ*^'CrmO9£'<šÃ?ï5¤tOÖûS{ÚEO_FŒñÑø[þó0_/Ž>ïÍŠMIý‰s¦ôz3ö™=”rÛoו벆øÒŒ~q“nû}ºWmkôâÊž«òîÜrdßnûnX ðÙÜ/áè7œ”Â/”_oÓã«EµYïÚcÓsúüÝ3y¨±I?òÍ·mÎÍ‘îí£Ûõí«™}4Ä_êÿÉIÎøDîäÄä¾ÝgõóEð wíWâmÜÇ‘ý>¾cƒqA˜äÿ¹¥E®å1¡–ñšÉûÀ¤©üú>½öþþvYò»º/²~âp8bQ(n/Üë„_Ýw>¢—ñÀé¼h$rÎk—Âï3oÒËýý Æ'!jÿ—‰–‰½ŠW½¿¾Û…ü9Û=»ô}zí'Í'(ë$ôr>á”pþ’ú«Î¹w«Öd¾°^ÄCÌé‘ý|ùƒZ³êf]jØnÜßÏ`| ¢FOß ÿ6Å}¼oOÞžŽå<|IºQ¯“ü¹°ãK¦ù}b–®S÷»V¾§¤ÂÒò§h= ü®¿æ}Ä»7žµ:ú4Ú?÷ß„Áø&`*ÿ¦céÞn—›vÞ›Ê/´?›qŽá?KÐðþ«2éW{åb~n#ýÞ™sø#j6_Šfó%ö#®“&3bÙn›i½ü¿ƒñ á¶EþÇzÝîz¡ûn·ëäžÔ÷ɂ޸º£ÒËôòNÝ)¹œW$üSÎõRŽ„á§•»ÂF­…?õNy±Ž‡-áQ> ƧÀPþ›@yâ=4y«¾üu"r]û‘üI`¿Ë Úá”è—Py?!Ü;÷bFOÔŠ½ÒóGhh_äìü¹“ìp°i?“ŸÁøD«£êf-HzÁüzy—î7åÕd²–öÌ¿vP:ÚŽºäO…çwï~däýéðÙ‰òü4¶/uÒ_°aªÖ”ýÄñòƒß?ŸÁ`bzxïc}{nIý±âWå>>::ZoþØŒýWk¯ÖÄj>Ÿ|Qê§á½Â\^Î'žÎ`0ƒQq·¯÷—n…1BqñÀÀÊïŸÁ`üCã ø~q´9f˜Ügò3_/¢Ñè!î×kæ÷WZ }y ãï…ê¨XÊç9¾˜hOªÜ…˜ü ÆW‹¾¨ä7t/–¢~Áäg0¾^û¯{½cHxE|IýÞ¹‰B_ƒÁø»!Åš_Eh%´‚¬³/˜êí›cåg0¾b ‚ôGBÈþf>P¸ÏÊÏ`|ÕÀ¬ÿ@wÚˆø`ø‘úMMþB_ƒÁø{¥ÿ7ú^¤}¯Ð|ä~0(ˆÇk  Ø`D‡öí×­ØÚ·Û[U;/$`4 ‡ý1íÙ÷hýÿÄÿm1¸ º¿|'€þz«îá`90>FB=»S‚ìóîÌvô:hØp%FŠ’ÙXÚOe-#¯C;à-¸³0ˆ~¿£Ž–¯ë0Ïi[hÃìÂû¢Òƒ!¡­r– ±J¢}Y]ú‚­…E”Q<ž‹åü–æ›Òo ì™MÐ<½G> }®öŸ>85èoñœ8ß¼ö Ù­h¿$‡‡ØÐ¬K7 Žá@÷©MXE÷#hÃJûG%ñiwËlŠñ¸5yKcRøIý~;é—÷‘ößOM‚ðO~?e6EðÈ{`?6ê#í[‘îÛí†%  6¤=vÏZ%ÿéÙ >0_qý˜žk„-˜·”ŸœB#n©šFxn´¸ßˆÜo´´ß&þëkmD×Ú ŽDÄGšÙáàGhHtr?RC¼/ŦP|—dÇnÄthÁ}â|¾ê)U„—ÜïÁ嬀ö¸¨º‚,nÂøp‡/ðöZ´è…XçÒ"ÿÅÅ¥xü7,ûýWÓ"ÙýÅÅà´ ù©Âm«{8‹‘òw$?p\áNݬ`{Ñ2à¡é‚ž:.£W]ûï -ðUvà7¥á é“uóœ’_Í=ôõÓ 1V½;++ñ¯áÃø±jØÅ.B}—(3viÒ~öôþÁyÚo×} þÞšMøÅ4gü›=pŠ?i¿Hš…ðÛÄŸ( •²¥ûÃnÀÝ~up«ßˆyªßO´¿µ,èkR‡bÿÔÔ䔡ü¦P1`Usaý¿ßކ͖´£êߤð‹½]÷Qõå^„€VKôÿÏ5ØTN`—}|Týy¢;<”ú7ZÍzì'í·YýÒ5°é>„‚kZ÷1àëT@(ÿÔý§OÇŸ"åi/--5%ßd$  ‚~´ÿúÔ”ð‹-ké?ŸêÿúǽKAäz$þŽþöaì>¼ ;ƒ6ò— ¦nÕŸ1⸠‘gyžö*ëLò×S…š;•m·­c«Þh¥çE>ùÓm•Èö¨`;üNG”XN¢m–ªJ ñ³fÁàSèoùý\^[ÚEûÅÞ]û ö›ªoj¿®4ÛËk¦ò?²ë¾Ò~Cù×µÝ?’H?,µ_‰¿Cûï’ðdXÖz/›¤~¿aü%ó—…ç—Ú?)ÔßÔ} (÷ úÀý)Ãú;tÉßÞJÛ¶!üZ÷Û¡µ¶Ãó±6Rú•ë—–_ÿXk¿|¨ÂÀ<ÑÞR~“þ û5]`ìÊoñ^»WíWºÄ¿&ŒÿS²ü:ï?Ê/Ô_˜~|HÖKá—q€èýC)Ñ^k¿f¿”~8øAZ±vµd~’¨/´ö —Ÿ•¼'êÓß²šüõÀsäz0ø¯ÿGûýñ½Øè„f#êô½Ù鯄ò{ªù%ëbH¢K ò÷É¿Ùu\uü-²ÇŠ®ÏzòÈß7}{‡¾IüŠ·dzº#`½”D¼úð½@삾ߌ.Å?þ¼"à=öÎ×þ½SS÷Úß,ÙeßEù­ò_3é¾~<Àl)¿®Ú]­ûÃ:ëwhÿ­~Cùïjí_6ó}ñ÷kí—•ïʯ´_Å€×È{tû–÷ÝŸ²åû¢¡÷Ý*”¿µÝ,á[[-ÁoÕOZûI÷üHÿg†æ«ä=¥ü˜üká×A e…€®FWt5v]k¼ÖUÛu­ËUûµî“í¿&…_Š>=¿Mè?E’~ÓúK`©öãš÷ãvíÏëïùAi&©š¢¿ÔþŒÖ~"¾Èõ³Û X ±òG4ÿÑ¿,mtv¯t^±‘ŸJóŽ-¨¬M“Á®ö´íx0 zh7íÑl‘ßëé»;1›'­óp£Eõ‹Ù<òÇ*ËËMò{^D©œ¯È§:–Æ«óP ©óô]LùÍBŸ“úJûEÕ/m¯ùS;GûAùO䷴ߪó­iöËðHª¿¡ÿGÍ–ö7«¼_è¾,õ©@0_i¿æ¿%ýH}þ»†õy¿~Ò}§òkö[¼'íŸt~Ù€1€lD€©ísŠ}ÛDúvÊûÛ-í?&ío•vÍ¿`¾!ýó¸ÕKÅ—ûg¦öÏ+áGç¯6Óù§„ô7Ú­€Úk°á£K‰¿Mû­Œ™MýI÷§ïÔíéSÅþ[ѯÔHdª?Žâ/ÆõÇ•ç_ú„Û·©D⟥[júä--Í‚ßãP'ð|ã xüà*þŸ¢èþ£þËÿÿ°ñ ºïknm"}O“òƒ°W")Óƒ“-$#ïê<1'ùït”‹à±Yzñf]™†(ìÚòÈuJÛeRoYâ xÚðc垎 uõÙ‚€KÏŸ—”ß)þB÷õ]´ß©ûμÿ•tkpdïÌKüåi¿Ðÿõ#;ý…0µßVï7´_øÿ~³âÒ¯u_)¿ ·–ÏÑþ)ËX1à{¡ý´ÕñÚöŸ„[$þöÎ@$;Ðÿeë±ØTõï™,ø¡òߟKñŸ¯12~É|!ùêXûS5–æKÆ+÷/F¨íïß…´wA+hç/»~|o6Jd’þ÷¥FÞ/CÀ¸¦©©û¢Ê/{þ¤ ûb‹¼3¬Tÿ¬ ½Èû…óÏêq×¹•.@ü?ß²qeãÊ•ÎNÜÑ3Ä‚¥ùcuTàv´Z÷»‰ìÚã½#l¬ˆXX$U˜̦¤Ü´ý^ÙùîU¹|ò£“Ç‚ßV>ùÛ:›–Ah:0h¼„ÏâW÷Űᢠûí!À .Í=çGíß;gðO>ý8JþÍkhûÖ_Ëÿš~›ö«´ÝMùlõþa©ûŽa?*Õ¿%^P@‰ÿ¤j’úùÚ?µl)ÿ¤*øOé^?5ö=?Ù}cô=(Û/ˆ/°-+ôLº/©ÿRåüÊjŽçIúíŸÊ/çµù¯‘Ù¾­æ§´^°¿F¿@î×BÂÔ'þ»û±èÿãÁ5£äoÚcèÏ{½·[YúÏH¿/[©æ½Ùß/¸}~=¢¨€LþÅÞÒ~!öº»ÏVðc˜’ïJû´-íÇç´QíÏÙ´_qÝÅø“'x`y¿ÃøËœ_ê>>ÖuÙïÐ…ß>pØÔKû‡UÍßÈûupKÕþßAøûoYù¾Nío˜4h?)Šþ“†ðË1>$ýTó±À>þOdþdÿ[·[e ÀìÓ. ~/)÷©„_Sÿeÿ ÿŠþRþíÊߨò~Êú)é@•üæÍ í>\#×ßEY?…gÚoØ~=ÔGþM²_û\¤ýOu¹ÏðýôœQIáû5ý3Õá×#R~â;²_åüTû3 R¤ü¢»O0ßÇ÷±wEîñ7µÏÒþ:ówjÿš«ö»´WfÞoô£@Ð,¿ììü_äû‚þ„ñu‡ö÷ëš¿‘÷[)¿½Ãó}cدCÿyÿ”îó³úù•ù—%ÿ)ìé{=eËù ío•UÿV™ðËÑ>ªòGy»RûgÇVŸŽç­¿Çbä¯ÕõW£³ÿFÕÝ'Jïßj÷Iþ‰÷Ž´ëý.ôWÂ/ºûóéo9Ô~‹ýV©Ÿ^«:¿òšû2ûÏHÐ#¶¬ä~ÖªøgDÕ¯ÇR~à'ºûðQhž1 ƒÁ`0 ƒÁ`0 ƒÁø\üƒÔ endstream endobj 39 0 obj <> endobj 40 0 obj <> endobj 41 0 obj <> endobj 46 0 obj [/Indexed /DeviceRGB 255 <000000FF00006B6BD2FFFFFF666666FF66667B7B7B6666C24A4AB96B6B6B4242 B1F30000FF9090B1B1DA888888737373B1A1A1FFB1B1CC6B6B181818FF33337B 7BCC6666B9E33333B9B9B99090D2DADADA8888CCB98888FFC2C2424242E37B7B FFE3E3DA9999FF1818FF7B7BEB2121B1B1EBFF4A4A8080D2C2C2E3A9A9A93333 33F33333D252529090E3DADAF3CCCCEBEB1818FFA1A1999999A1A1DAB99090FF D2D2525252EBA9A98080E3A1A1E3EBEBF3080808FF08087B7BD2FF73737373C2 5A5AB9B1B1B1292929FF4242E34242C2C2C2E3E3E3DADAEBF38888FFF3F3EB90 90FF2929FF8888C2C2EBB1B1F3FF5A5AD2D2D2EB4242E34A4A9999F3CCCCF3A1 A1F3C2C2F37373D2FF6B6B8080806B6BC26666CC5252B94A4AB1FF9999B9B9E3 B1B1E3909090B1A9A9FFB9B9D26B6BCC7373212121FF39398080CCE339399999 D29090DAC28080FFCCCC4A4A4AE38080FFEBEBFF2121FF8080F32121B9B9EBFF 52528888D28080DA393939DA4A4A9999E39090EBE3E3F3DADAFFD2D2EBF31010 FFA9A9A1A1A1A9A9DAB99999FFDADA5A5A5A8888E3A9A9E3A1A1EBF3F3F3EBEB FF101010FF10107B7BDA7373CC5A5AC2CCCCCCEBEBEBB9B9F3B1B1FFD2D2F3CC CCFFA9A9F3C2C2FF6B6BCC5252C2D273739999DAC28888F329298888DA9999EB E3E3FF8888EBA9A9EBF3F3FFD2D2FFF7B796FC949005E770C2F0F4F7B82899EB 94F741F7FC9490F7B84E6D892D05E770C2F118F7B77BF741F7FC949003EE8803 D600F713EE00016FF7A2E3007DF1C2F164000FF8DF0008402004F7A3A0C40000 1F200C000FF8000000C4000CC40000DF0008000000F713E22A001EC4000CDEFD 30C2F18CF7A10E03EE8803D60000000305E00FC2F1A800E44A05E0F8000032F7 B9C59A3DEC000030001DE803B600C2F1E000CD7C00000900CD5C000000FF92D0 05E10005E17003B600C2F20400CD7CC2F21000F56A033238FFFFFFC2F2780010 260000300021F9000028FF92D0601232FF94D0FF92A005E100F432F805E100C2 F22C66E8880000006021D3FF92D0F432F805E100C2F26C66E94B00000060D91D>]endobj 45 0 obj <>stream xœí} Oi–¶s1Ónó!H ‚Âf0IX&|&\‡5Ù| .FÁËe@_˜ F€Âm#I‡ÉÆÍF ¼?tÏ9ï¥Þ*@fâäö‚ Æ—AçbSHôïÝœiñ×­ôÆ |E ã‹`c±ªw ~~^±Iäo*ô%1Œ/+óŒÕû'6+6Áö³ò3ßBÁxo¨xÌïŸh‘¿B_ƒÁøhÙXœ{2PÜ]ï÷û»Aø¹«ÁøFp3¸Ÿ u‡zçªxƒñm`3Ä¡ýÅÐB¡¹3…¾ ƒñ…н±ØTõ$„xRÅÓúŒoþ`0^UÕ47×gî3ßî÷nãKñÅ•_ }) ãËâ—¿ßߢ©½×Â`0 ˆë}…¾ƒQT³ø3ß(n3ûŒoÑB_ƒÁ( b· } £0ˆ²ñg0¾MDÙø3ß&˜ü Æ7ŠëìûŒooXúŒoi&?ƒñ­àæó ¿_/äã®ü­µ_ð‚~ëë…¾ã7Ÿ·øWz—:7®|×ùžÔëFþÉ|_ôÒÎÇZÏwTè‹`0þA1S/‰òW6®t^¹Ò Mþëyä_?ðùþ—?× —Âäg0.‰ûÀxã †zõn,Zm;{­Ñ÷ïÿ[È¿ñù²L~ãÒ~'(Ÿ¯P °”?=4NÍ=óù’¨¶]¸Nî–ŠkI2ùŒKÂOt¯j©ðw^¿¡üѨ1©¿•ˆbë»V€ë´aý\^ +?ƒqiÜDÅ‚G3”ñ9¿Yï›üA2ß—ÌØö?˜Ïd“Ù$\+?ƒñˆåïÓÑXçw6å¯Öä§:!YhåÏmõ3@~V~ãó0°Ñ¹!Ž&déO+4:(^S…6‹;Tþ7…¸VDi&›Aîù³>îçg0. g°Sµl!@“äÔÂ/Ò}‚ü€ú@ÿd6+²V~㲘Yê\zNGcADgç†$ÿmÝÑ×*óý¬(ùÔögüÙ üŒÏÅÍÅ`pf—‚ ý@AþÃh4-ϱ+a ~D~¬øù²lûŒÏBïÒâRh³Â_ BÀ Èo ?)¿¦~mf¹ŸM²íg0>þÅx|1¾ø!þ!aø$òGÑ}¨üY‹ý…·ýÄþ$Û~ã³P¬ÿP¯Š ,Å—üףј>¥Õ&üÙB“?+J~äüïòZŒlܯB4‰†ô_ôÓL~cX¿™óg}ÉÆ|ãÚèëöð~*mwwyxïã×p:üëÙY8ŽÐgÚÏú_{jFTüPù“IV~ã3ðóœDÕñ c|Ï|¾?(É—ìÅæøº½©ðþ~d?Lã^ ¯6œÏeÀéò*œFàùRûíkÎó¦J!ßÇFôïÉRw]l\øc0.ŒÇOû逹/GõËQ}IÓö'³è¼3™Tþ—­½ìÚOõS¤û€×ÀíÝÿ>ïçOV‡VOV"«4æá“?^:,ÃÔ¸`þ¸èë“I¿;ãâ(Ö?é}ÒÛ;ÛÜ\SÕDLíóŠQ}¶j?xnâþxžòçºà>)ŒJt&ú¯6ä\|xHpÿ%Š?6éýáKöSvFùýã2é—}D8bò3—¿7ê õÂz‚ìŸû'£Øgé½:H’éGÔ8¾ho>±OÔßGþ*âõONVON]~ûס“!|t?ŒÊOQƒØIì›ç"ùÉ÷Ó ¿lR;òñãRh …B+ÐBž„zç~3 ýF²o R(¿Ãö¯ãß—ôO¡‚£éôzƒ¾çgþ£C#'CC@þW-å—ÒI$Ì€AäÏ’ñÏR¹ß¢>+?ƒqÜX‘Qèý-–Óoúœ@Ê÷3™yÛ×ìu%ÒôƒòHÈW¥ò¯"ÅÚ:424´{‚äÔ틤63¾ùµðgù…+ö2Œ‹âþ€ÄÊÊñÿ/­7¶™õ¾,ÖÝl9n^Ⱦþyð°HãWQ×ÑÞíæì¿ündhw„„ÿääDÿ0±¬? ?|á²uvƒ~Ó÷[®„•ŸÁ¸8~(¦FüýÿÆ›NÛïÓõ>‡ò¿ÝGîKáO…SaUëá‚ ŒüjûáW#€¡]Š (þ»ïÎPýQù÷¥ö'ö­Ó…ògÇůÓ0ëêXùŒ‹ãfw1Bñ`eÓxÓÅô'E_ßxÖ$s‚È¿¿Of=œŠDVwÏ^*ú½GvGFliÿè±DP_†½³U•õ§(–XÒß  ~Ö0V~ãsð˜È?V,B¿ÅxÓ-çÝüY[Á¯Qr;ùQ¶w‰æ¹_¥ðCÊOLkþð[úÓ‰ ÿOê¯Ã`üçUo_"ѧËj–Ä_¬èa]+?ƒqq<öuwûíÊŸWíOf{¨ânöóß½Šäߗ‰h½>¢Z?æûCÄSú‡FýÉõ[oìb¹ÈIääe¿êÓ0®ËýjjU‹`åg0.·€äÿ@…ñ^žîõ³Rû Û?Ü¿ M°×zg;ù‡PÞIù²ÞÙCê¿Bã?tbô…_î6ŒöŸ:û¦ˆúBû1Ð"ž¬ü ÆgÀß]è®Gþ#û7'´›å>_6LÿÞÕ« I}ª÷åŒ÷ND±ì=ÁzãT ?ÕûOÞ}âÅjî ågÅg0.çâ›þz’ÿâ çZ åÙÏ¿Qgâ*¥ü²à×`¾Òä¦b?°ý­¥ð¹·Èþ·ôŽóý„é´˜‡œØ×ƒ¦Ÿ'ô0Ÿ¿±¼¿ ù³¦ïÏŸÏ?ÂÒ/¹i6ß;¥þ!)ü#µÞQÊ/»úWëg££Ín£€ Èr¿˜Ù“dåg0>é3Ù_ßíF~£“?ébûß_¥”_VüÃ~¥ò á7ëýôRÒÿDŒðÇ©½‘ðnÿiUc|Øö3Ÿ‹XßðþŸ-úÍ8O±­á—Í_Ìc„_Ò?’Ûß=#é—"ÿÖHúÿ›Ê}¤üb€¿œÜüO¥vïæ\/7#†øeiF?Oèa0.ëÑ´wÂoÙŸ¯üz4 ÖûòÉß|ÕÈù#‘HûIûnûî¶³wgTî“Å~hVfŸÃ”_)ÿÍ ¾4-(Ùop+ŒÓ¼½€/“ŸÁ¸q±®–– „fÿŒó,Û~.ä§^þ„®ö›Ëøà„>Tþ!9Êgä­Áè¿êœ_ð%åËñ½)ç„~‚ZɇÆösÎÏ`\bîîf ÂbÿŒó´‘¿áêUQï¾GçÍÓ}ò“!1ÆG)¿9ÌÇÈù‡TÒ/föÐJ@ûûgy—lüàjšóN`0‡\¤s`ÐßüY‹û.ýüS ´ýªÚŸ@ÛNÚ/çõœ¨‚ñß\ÐkïJùMåˆ~`üö^C„îê˰ò3—…Z¤³bsSð_°¿þ†óDSùÝ ~ V¹’~þ”X¿/,øIåG¡·­æ·÷VŒÔ·ôÐËy8Ù­”?Ë9?ƒqY(î?ž©ûÏU~Ëõ»ÙþI³Ú/&öÐ^±Ž‡˜²«¤ß¾”gî?‡dÊ¿z"‚)D(?.äçø­ŒZÊGäülûŒ ã0z]ùgff*Èúûgœ§ZÕ~*÷çð›Õ~k”ϼ´ý‘°š×£êýNò{½§ÿI¿Ö}±–Ìùû Ǩ}]ìϰò3—BßmuWŽŸgfn û+Ðø»“ß>³'o„_s¾ò‹¥|(é²ÿ<ò{ñž# ü/UüHøi^ŸsÔÀ¸X»;ÃÕ~ã’°îÁûóù'>Jþlþ:E??P_Tûç§§kÐöâpÎõœ¿;‘®^ÌçO!õ÷‰œíùÊß®gõ‘úæÊ{©ˆUïK$–moÊÛu‰A>¬ü ÆE¡ïŸ®æÆïåüëæb^Ùd&ï뎤í—+ùØjt¹ß£»wz:<üÓÙÙªÉâZ¾“ï†ï´/ù›‘KyHåŸü¤ÿ\ƒ!q]õñ#€ø7ˆûçVû¬•2if ꃜu ñ“S{‘ý~ãûXÆ;ûixô•}a®W¿þôŽº÷iBϪ¹’O¿Èùé ¯:rþ.P~ZFL(¿ìyàî~ãÓPm¸þDz§]ÿ„ë¿ucJ/®Ü]:utw»+c¸ûVáûåœÞýˆõVƒ^»ŸîÌ1¢~{ÿðoâ^]«ÏDÂäÏÙ®¥±Tß±'‰~¤±}ª6yð·øWa0¾ÜÖwáõz®æ›ÂŸ?¯Ù6+í=Xt›²ÎÈIòÓHŸÈ~*%Ù¿&‡í…Qßi!ÏœúÈ«= Ÿ`Ý‘{]?Ú~rýÖÚÝ„F½x¯yûàäßè†ÁøÊÑ­¶Rþ_**Ôð^Êøëýÿ7ï>›ôc;ÊïkãŒvs˜ÎÇ 7Œö¾”ÔÇÁ{â†\Æ*^'CrmO9£'<šÃ?ï5¤tOÖûS{ÚEO_FŒñÑø[þó0_/Ž>ïÍŠMIý‰s¦ôz3ö™=”rÛoו벆øÒŒ~q“nû}ºWmkôâÊž«òîÜrdßnûnX ðÙÜ/áè7œ”Â/”_oÓã«EµYïÚcÓsúüÝ3y¨±I?òÍ·mÎÍ‘îí£Ûõí«™}4Ä_êÿÉIÎøDîäÄä¾ÝgõóEð wíWâmÜÇ‘ý>¾cƒqA˜äÿ¹¥E®å1¡–ñšÉûÀ¤©üú>½öþþvYò»º/²~âp8bQ(n/Üë„_Ýw>¢—ñÀé¼h$rÎk—Âï3oÒËýý Æ'!jÿ—‰–‰½ŠW½¿¾Û…ü9Û=»ô}zí'Í'(ë$ôr>á”pþ’ú«Î¹w«Öd¾°^ÄCÌé‘ý|ùƒZ³êf]jØnÜßÏ`| ¢FOß ÿ6Å}¼oOÞžŽå<|IºQ¯“ü¹°ãK¦ù}b–®S÷»V¾§¤ÂÒò§h= ü®¿æ}Ä»7žµ:ú4Ú?÷ß„Áø&`*ÿ¦céÞn—›vÞ›Ê/´?›qŽá?KÐðþ«2éW{åb~n#ýÞ™sø#j6_Šfó%ö#®“&3bÙn›i½ü¿ƒñ á¶EþÇzÝîz¡ûn·ëäžÔ÷ɂ޸º£ÒËôòNÝ)¹œW$üSÎõRŽ„á§•»ÂF­…?õNy±Ž‡-áQ> ƧÀPþ›@yâ=4y«¾üu"r]û‘üI`¿Ë Úá”è—Py?!Ü;÷bFOÔŠ½ÒóGhh_äìü¹“ìp°i?“ŸÁøD«£êf-HzÁüzy—î7åÕd²–öÌ¿vP:ÚŽºäO…çwï~däýéðÙ‰òü4¶/uÒ_°aªÖ”ýÄñòƒß?ŸÁ`bzxïc}{nIý±âWå>>::ZoþØŒýWk¯ÖÄj>Ÿ|Qê§á½Â\^Î'žÎ`0ƒQq·¯÷—n…1BqñÀÀÊïŸÁ`üCã ø~q´9f˜Ügò3_/¢Ñè!î×kæ÷WZ }y ãï…ê¨XÊç9¾˜hOªÜ…˜ü ÆW‹¾¨ä7t/–¢~Áäg0¾^û¯{½cHxE|IýÞ¹‰B_ƒÁø»!Åš_Eh%´‚¬³/˜êí›cåg0¾b ‚ôGBÈþf>P¸ÏÊÏ`|ÕÀ¬ÿ@wÚˆø`ø‘úMMþB_ƒÁø{¥ÿ7ú^¤}¯Ð|ä~0(ˆÇk  Ø`D‡öí×­ØÚ·Û[U;/$`4 ‡ý1íÙ÷hýÿÄÿm1¸ º¿|'€þz«îá`90>FB=»S‚ìóîÌvô:hØp%FŠ’ÙXÚOe-#¯C;à-¸³0ˆ~¿£Ž–¯ë0Ïi[hÃìÂû¢Òƒ!¡­r– ±J¢}Y]ú‚­…E”Q<ž‹åü–æ›Òo ì™MÐ<½G> }®öŸ>85èoñœ8ß¼ö Ù­h¿$‡‡ØÐ¬K7 Žá@÷©MXE÷#hÃJûG%ñiwËlŠñ¸5yKcRøIý~;é—÷‘ößOM‚ðO~?e6EðÈ{`?6ê#í[‘îÛí†%  6¤=vÏZ%ÿéÙ >0_qý˜žk„-˜·”ŸœB#n©šFxn´¸ßˆÜo´´ß&þëkmD×Ú ŽDÄGšÙáàGhHtr?RC¼/ŦP|—dÇnÄthÁ}â|¾ê)U„—ÜïÁ嬀ö¸¨º‚,nÂøp‡/ðöZ´è…XçÒ"ÿÅÅ¥xü7,ûýWÓ"ÙýÅÅà´ ù©Âm«{8‹‘òw$?p\áNݬ`{Ñ2à¡é‚ž:.£W]ûï -ðUvà7¥á é“uóœ’_Í=ôõÓ 1V½;++ñ¯áÃø±jØÅ.B}—(3viÒ~öôþÁyÚo×} þÞšMøÅ4gü›=pŠ?i¿Hš…ðÛÄŸ( •²¥ûÃnÀÝ~up«ßˆyªßO´¿µ,èkR‡bÿÔÔ䔡ü¦P1`Usaý¿ßކ͖´£êߤð‹½]÷Qõå^„€VKôÿÏ5ØTN`—}|Týy¢;<”ú7ZÍzì'í·YýÒ5°é>„‚kZ÷1àëT@(ÿÔý§OÇŸ"åi/--5%ßd$  ‚~´ÿúÔ”ð‹-ké?ŸêÿúǽKAäz$þŽþöaì>¼ ;ƒ6ò— ¦nÕŸ1⸠‘gyžö*ëLò×S…š;•m·­c«Þh¥çE>ùÓm•Èö¨`;üNG”XN¢m–ªJ ñ³fÁàSèoùý\^[ÚEûÅÞ]û ö›ªoj¿®4ÛËk¦ò?²ë¾Ò~Cù×µÝ?’H?,µ_‰¿Cûï’ðdXÖz/›¤~¿aü%ó—…ç—Ú?)ÔßÔ} (÷ úÀý)Ãú;tÉßÞJÛ¶!üZ÷Û¡µ¶Ãó±6Rú•ë—–_ÿXk¿|¨ÂÀ<ÑÞR~“þ û5]`ìÊoñ^»WíWºÄ¿&ŒÿS²ü:ï?Ê/Ô_˜~|HÖKá—q€èýC)Ñ^k¿f¿”~8øAZ±vµd~’¨/´ö —Ÿ•¼'êÓß²šüõÀsäz0ø¯ÿGûýñ½Øè„f#êô½Ù鯄ò{ªù%ëbH¢K ò÷É¿Ùu\uü-²ÇŠ®ÏzòÈß7}{‡¾IüŠ·dzº#`½”D¼úð½@삾ߌ.Å?þ¼"à=öÎ×þ½SS÷Úß,ÙeßEù­ò_3é¾~<Àl)¿®Ú]­ûÃ:ëwhÿ­~Cùïjí_6ó}ñ÷kí—•ïʯ´_Å€×È{tû–÷ÝŸ²åû¢¡÷Ý*”¿µÝ,á[[-ÁoÕOZûI÷üHÿg†æ«ä=¥ü˜üká×A e…€®FWt5v]k¼ÖUÛu­ËUûµî“í¿&…_Š>=¿Mè?E’~ÓúK`©öãš÷ãvíÏëïùAi&©š¢¿ÔþŒÖ~"¾Èõ³Û X ±òG4ÿÑ¿,mtv¯t^±‘ŸJóŽ-¨¬M“Á®ö´íx0 zh7íÑl‘ßëé»;1›'­óp£Eõ‹Ù<òÇ*ËËMò{^D©œ¯È§:–Æ«óP ©óô]LùÍBŸ“úJûEÕ/m¯ùS;GûAùO䷴ߪó­iöËðHª¿¡ÿGÍ–ö7«¼_è¾,õ©@0_i¿æ¿%ýH}þ»†õy¿~Ò}§òkö[¼'íŸt~Ù€1€lD€©ísŠ}ÛDúvÊûÛ-í?&ío•vÍ¿`¾!ýó¸ÕKÅ—ûg¦öÏ+áGç¯6Óù§„ô7Ú­€Úk°á£K‰¿Mû­Œ™MýI÷§ïÔíéSÅþ[ѯÔHdª?Žâ/ÆõÇ•ç_ú„Û·©D⟥[júä--Í‚ßãP'ð|ã xüà*þŸ¢èþ£þËÿÿ°ñ ºïknm"}O“òƒ°W")Óƒ“-$#ïê<1'ùït”‹à±Yzñf]™†(ìÚòÈuJÛeRoYâ xÚðc垎 uõÙ‚€KÏŸ—”ß)þB÷õ]´ß©ûμÿ•tkpdïÌKüåi¿Ðÿõ#;ý…0µßVï7´_øÿ~³âÒ¯u_)¿ ·–ÏÑþ)ËX1à{¡ý´ÕñÚöŸ„[$þöÎ@$;Ðÿeë±ØTõï™,ø¡òߟKñŸ¯12~É|!ùêXûS5–æKÆ+÷/F¨íïß…´wA+hç/»~|o6Jd’þ÷¥FÞ/CÀ¸¦©©û¢Ê/{þ¤ ûb‹¼3¬Tÿ¬ ½Èû…óÏêq×¹•.@ü?ß²qeãÊ•ÎNÜÑ3Ä‚¥ùcuTàv´Z÷»‰ìÚã½#l¬ˆXX$U˜̦¤Ü´ý^ÙùîU¹|ò£“Ç‚ßV>ùÛ:›–Ah:0h¼„ÏâW÷Űᢠûí!À .Í=çGíß;gðO>ý8JþÍkhûÖ_Ëÿš~›ö«´ÝMùlõþa©ûŽa?*Õ¿%^P@‰ÿ¤j’úùÚ?µl)ÿ¤*øOé^?5ö=?Ù}cô=(Û/ˆ/°-+ôLº/©ÿRåüÊjŽçIúíŸÊ/çµù¯‘Ù¾­æ§´^°¿F¿@î×BÂÔ'þ»û±èÿãÁ5£äoÚcèÏ{½·[YúÏH¿/[©æ½Ùß/¸}~=¢¨€LþÅÞÒ~!öº»ÏVðc˜’ïJû´-íÇç´QíÏÙ´_qÝÅø“'x`y¿ÃøËœ_ê>>ÖuÙïÐ…ß>pØÔKû‡UÍßÈûupKÕþßAøûoYù¾Nío˜4h?)Šþ“†ðË1>$ýTó±À>þOdþdÿ[·[e ÀìÓ. ~/)÷©„_Sÿeÿ ÿŠþRþíÊߨò~Êú)é@•üæÍ í>\#×ßEY?…gÚoØ~=ÔGþM²_û\¤ýOu¹ÏðýôœQIáû5ý3Õá×#R~â;²_åüTû3 R¤ü¢»O0ßÇ÷±wEîñ7µÏÒþ:ówjÿš«ö»´WfÞoô£@Ð,¿ììü_äû‚þ„ñu‡ö÷ëš¿‘÷[)¿½Ãó}cدCÿyÿ”îó³úù•ù—%ÿ)ìé{=eËù ío•UÿV™ðËÑ>ªòGy»RûgÇVŸŽç­¿Çbä¯ÕõW£³ÿFÕÝ'Jïßj÷Iþ‰÷Ž´ëý.ôWÂ/ºûóéo9Ô~‹ýV©Ÿ^«:¿òšû2ûÏHÐ#¶¬ä~ÖªøgDÕ¯ÇR~à'ºûðQhž1 ƒÁ`0 ƒÁ`0 ƒÁø\üƒÔ endstream endobj 50 0 obj <> endobj 51 0 obj <> endobj 52 0 obj <> endobj 57 0 obj [/Indexed /DeviceRGB 255 <000000FF00006B6BD2FFFFFF666666FF66667B7B7B6666C24A4AB96B6B6B4242 B1F30000FF9090B1B1DA888888737373B1A1A1FFB1B1CC6B6B181818FF33337B 7BCC6666B9E33333B9B9B99090D2DADADA8888CCB98888FFC2C2424242E37B7B FFE3E3DA9999FF1818FF7B7BEB2121B1B1EBFF4A4A8080D2C2C2E3A9A9A93333 33F33333D252529090E3DADAF3CCCCEBEB1818FFA1A1999999A1A1DAB99090FF D2D2525252EBA9A98080E3A1A1E3EBEBF3080808FF08087B7BD2FF73737373C2 5A5AB9B1B1B1292929FF4242E34242C2C2C2E3E3E3DADAEBF38888FFF3F3EB90 90FF2929FF8888C2C2EBB1B1F3FF5A5AD2D2D2EB4242E34A4A9999F3CCCCF3A1 A1F3C2C2F37373D2FF6B6B8080806B6BC26666CC5252B94A4AB1FF9999B9B9E3 B1B1E3909090B1A9A9FFB9B9D26B6BCC7373212121FF39398080CCE339399999 D29090DAC28080FFCCCC4A4A4AE38080FFEBEBFF2121FF8080F32121B9B9EBFF 52528888D28080DA393939DA4A4A9999E39090EBE3E3F3DADAFFD2D2EBF31010 FFA9A9A1A1A1A9A9DAB99999FFDADA5A5A5A8888E3A9A9E3A1A1EBF3F3F3EBEB FF101010FF10107B7BDA7373CC5A5AC2CCCCCCEBEBEBB9B9F3B1B1FFD2D2F3CC CCFFA9A9F3C2C2FF6B6BCC5252C2D273739999DAC28888F329298888DA9999EB E3E3FF8888EBA9A9EBF3F3FFD2D2FFF7B796FC949005E770C2F0F4F7B82899EB 94F741F7FC9490F7B84E6D892D05E770C2F118F7B77BF741F7FC949003EE8803 D600F713EE00016FF7A2E3007DF1C2F164000FF8DF0008402004F7A3A0C40000 1F200C000FF8000000C4000CC40000DF0008000000F713E22A001EC4000CDEFD 30C2F18CF7A10E03EE8803D60000000305E00FC2F1A800E44A05E0F8000032F7 B9C59A3DEC000030001DE803B600C2F1E000CD7C00000900CD5C000000FF92D0 05E10005E17003B600C2F20400CD7CC2F21000F56A033238FFFFFFC2F2780010 260000300021F9000028FF92D0601232FF94D0FF92A005E100F432F805E100C2 F22C66E8880000006021D3FF92D0F432F805E100C2F26C66E94B00000060D91D>]endobj 56 0 obj <>stream xœí} Oi–¶s1Ónó!H ‚Âf0IX&|&\‡5Ù| .FÁËe@_˜ F€Âm#I‡ÉÆÍF ¼?tÏ9ï¥Þ*@fâäö‚ Æ—AçbSHôïÝœiñ×­ôÆ |E ã‹`c±ªw ~~^±Iäo*ô%1Œ/+óŒÕû'6+6Áö³ò3ßBÁxo¨xÌïŸh‘¿B_ƒÁøhÙXœ{2PÜ]ï÷û»Aø¹«ÁøFp3¸Ÿ u‡zçªxƒñm`3Ä¡ýÅÐB¡¹3…¾ ƒñ…н±ØTõ$„xRÅÓúŒoþ`0^UÕ47×gî3ßî÷nãKñÅ•_ }) ãËâ—¿ßߢ©½×Â`0 ˆë}…¾ƒQT³ø3ß(n3ûŒoÑB_ƒÁ( b· } £0ˆ²ñg0¾MDÙø3ß&˜ü Æ7ŠëìûŒooXúŒoi&?ƒñ­àæó ¿_/äã®ü­µ_ð‚~ëë…¾ã7Ÿ·øWz—:7®|×ùžÔëFþÉ|_ôÒÎÇZÏwTè‹`0þA1S/‰òW6®t^¹Ò Mþëyä_?ðùþ—?× —Âäg0.‰ûÀxã †zõn,Zm;{­Ñ÷ïÿ[È¿ñù²L~ãÒ~'(Ÿ¯P °”?=4NÍ=óù’¨¶]¸Nî–ŠkI2ùŒKÂOt¯j©ðw^¿¡üѨ1©¿•ˆbë»V€ë´aý\^ +?ƒqiÜDÅ‚G3”ñ9¿Yï›üA2ß—ÌØö?˜Ïd“Ù$\+?ƒñˆåïÓÑXçw6å¯Öä§:!YhåÏmõ3@~V~ãó0°Ñ¹!Ž&déO+4:(^S…6‹;Tþ7…¸VDi&›Aîù³>îçg0. g°Sµl!@“äÔÂ/Ò}‚ü€ú@ÿd6+²V~㲘Yê\zNGcADgç†$ÿmÝÑ×*óý¬(ùÔögüÙ üŒÏÅÍÅ`pf—‚ ý@AþÃh4-ϱ+a ~D~¬øù²lûŒÏBïÒâRh³Â_ BÀ Èo ?)¿¦~mf¹ŸM²íg0>þÅx|1¾ø!þ!aø$òGÑ}¨üY‹ý…·ýÄþ$Û~ã³P¬ÿP¯Š ,Å—üףј>¥Õ&üÙB“?+J~äüïòZŒlܯB4‰†ô_ôÓL~cX¿™óg}ÉÆ|ãÚèëöð~*mwwyxïã×p:üëÙY8ŽÐgÚÏú_{jFTüPù“IV~ã3ðóœDÕñ c|Ï|¾?(É—ìÅæøº½©ðþ~d?Lã^ ¯6œÏeÀéò*œFàùRûíkÎó¦J!ßÇFôïÉRw]l\øc0.ŒÇOû逹/GõËQ}IÓö'³è¼3™Tþ—­½ìÚOõS¤û€×ÀíÝÿ>ïçOV‡VOV"«4æá“?^:,ÃÔ¸`þ¸èë“I¿;ãâ(Ö?é}ÒÛ;ÛÜ\SÕDLíóŠQ}¶j?xnâþxžòçºà>)ŒJt&ú¯6ä\|xHpÿ%Š?6éýáKöSvFùýã2é—}D8bò3—¿7ê õÂz‚ìŸû'£Øgé½:H’éGÔ8¾ho>±OÔßGþ*âõONVON]~ûס“!|t?ŒÊOQƒØIì›ç"ùÉ÷Ó ¿lR;òñãRh …B+ÐBž„zç~3 ýF²o R(¿Ãö¯ãß—ôO¡‚£éôzƒ¾çgþ£C#'CC@þW-å—ÒI$Ì€AäÏ’ñÏR¹ß¢>+?ƒqÜX‘Qèý-–Óoúœ@Ê÷3™yÛ×ìu%ÒôƒòHÈW¥ò¯"ÅÚ:424´{‚äÔ틤63¾ùµðgù…+ö2Œ‹âþ€ÄÊÊñÿ/­7¶™õ¾,ÖÝl9n^Ⱦþyð°HãWQ×ÑÞíæì¿ündhw„„ÿääDÿ0±¬? ?|á²uvƒ~Ó÷[®„•ŸÁ¸8~(¦FüýÿÆ›NÛïÓõ>‡ò¿ÝGîKáO…SaUëá‚ ŒüjûáW#€¡]Š (þ»ïÎPýQù÷¥ö'ö­Ó…ògÇůÓ0ëêXùŒ‹ãfw1Bñ`eÓxÓÅô'E_ßxÖ$s‚È¿¿Of=œŠDVwÏ^*ú½GvGFliÿè±DP_†½³U•õ§(–XÒß  ~Ö0V~ãsð˜È?V,B¿ÅxÓ-çÝüY[Á¯Qr;ùQ¶w‰æ¹_¥ðCÊOLkþð[úÓ‰ ÿOê¯Ã`üçUo_"ѧËj–Ä_¬èa]+?ƒqq<öuwûíÊŸWíOf{¨ânöóß½Šäߗ‰h½>¢Z?æûCÄSú‡FýÉõ[oìb¹ÈIääe¿êÓ0®ËýjjU‹`åg0.·€äÿ@…ñ^žîõ³Rû Û?Ü¿ M°×zg;ù‡PÞIù²ÞÙCê¿Bã?tbô…_î6ŒöŸ:û¦ˆúBû1Ð"ž¬ü ÆgÀß]è®Gþ#û7'´›å>_6LÿÞÕ« I}ª÷åŒ÷ND±ì=ÁzãT ?ÕûOÞ}âÅjî ågÅg0.çâ›þz’ÿâ çZ åÙÏ¿Qgâ*¥ü²à×`¾Òä¦b?°ý­¥ð¹·Èþ·ôŽóý„é´˜‡œØ×ƒ¦Ÿ'ô0Ÿ¿±¼¿ ù³¦ïÏŸÏ?ÂÒ/¹i6ß;¥þ!)ü#µÞQÊ/»úWëg££Ín£€ Èr¿˜Ù“dåg0>é3Ù_ßíF~£“?ébûß_¥”_VüÃ~¥ò á7ëýôRÒÿDŒðÇ©½‘ðnÿiUc|Øö3Ÿ‹XßðþŸ-úÍ8O±­á—Í_Ìc„_Ò?’Ûß=#é—"ÿÖHúÿ›Ê}¤üb€¿œÜüO¥vïæ\/7#†øeiF?Oèa0.ëÑ´wÂoÙŸ¯üz4 ÖûòÉß|ÕÈù#‘HûIûnûî¶³wgTî“Å~hVfŸÃ”_)ÿÍ ¾4-(Ùop+ŒÓ¼½€/“ŸÁ¸q±®–– „fÿŒó,Û~.ä§^þ„®ö›Ëøà„>Tþ!9Êgä­Áè¿êœ_ð%åËñ½)ç„~‚ZɇÆösÎÏ`\bîîf ÂbÿŒó´‘¿áêUQï¾GçÍÓ}ò“!1ÆG)¿9ÌÇÈù‡TÒ/föÐJ@ûûgy—lüàjšóN`0‡\¤s`ÐßüY‹û.ýüS ´ýªÚŸ@ÛNÚ/çõœ¨‚ñß\ÐkïJùMåˆ~`üö^C„îê˰ò3—…Z¤³bsSð_°¿þ†óDSùÝ ~ V¹’~þ”X¿/,øIåG¡·­æ·÷VŒÔ·ôÐËy8Ù­”?Ë9?ƒqY(î?ž©ûÏU~Ëõ»ÙþI³Ú/&öÐ^±Ž‡˜²«¤ß¾”gî?‡dÊ¿z"‚)D(?.äçø­ŒZÊGäülûŒ ã0z]ùgff*Èúûgœ§ZÕ~*÷çð›Õ~k”ϼ´ý‘°š×£êýNò{½§ÿI¿Ö}±–Ìùû Ǩ}]ìϰò3—BßmuWŽŸgfn û+Ðø»“ß>³'o„_s¾ò‹¥|(é²ÿ<ò{ñž# ü/UüHøi^ŸsÔÀ¸X»;ÃÕ~ã’°îÁûóù'>Jþlþ:E??P_Tûç§§kÐöâpÎõœ¿;‘®^ÌçO!õ÷‰œíùÊß®gõ‘úæÊ{©ˆUïK$–moÊÛu‰A>¬ü ÆE¡ïŸ®æÆïåüëæb^Ùd&ï뎤í—+ùØjt¹ß£»wz:<üÓÙÙªÉâZ¾“ï†ï´/ù›‘KyHåŸü¤ÿ\ƒ!q]õñ#€ø7ˆûçVû¬•2if ꃜu ñ“S{‘ý~ãûXÆ;ûixô•}a®W¿þôŽº÷iBϪ¹’O¿Èùé ¯:rþ.P~ZFL(¿ìyàî~ãÓPm¸þDz§]ÿ„ë¿ucJ/®Ü]:utw»+c¸ûVáûåœÞýˆõVƒ^»ŸîÌ1¢~{ÿðoâ^]«ÏDÂäÏÙ®¥±Tß±'‰~¤±}ª6yð·øWa0¾ÜÖwáõz®æ›ÂŸ?¯Ù6+í=Xt›²ÎÈIòÓHŸÈ~*%Ù¿&‡í…Qßi!ÏœúÈ«= Ÿ`Ý‘{]?Ú~rýÖÚÝ„F½x¯yûàäßè†ÁøÊÑ­¶Rþ_**Ôð^Êøëýÿ7ï>›ôc;ÊïkãŒvs˜ÎÇ 7Œö¾”ÔÇÁ{â†\Æ*^'CrmO9£'<šÃ?ï5¤tOÖûS{ÚEO_FŒñÑø[þó0_/Ž>ïÍŠMIý‰s¦ôz3ö™=”rÛoו벆øÒŒ~q“nû}ºWmkôâÊž«òîÜrdßnûnX ðÙÜ/áè7œ”Â/”_oÓã«EµYïÚcÓsúüÝ3y¨±I?òÍ·mÎÍ‘îí£Ûõí«™}4Ä_êÿÉIÎøDîäÄä¾ÝgõóEð wíWâmÜÇ‘ý>¾cƒqA˜äÿ¹¥E®å1¡–ñšÉûÀ¤©üú>½öþþvYò»º/²~âp8bQ(n/Üë„_Ýw>¢—ñÀé¼h$rÎk—Âï3oÒËýý Æ'!jÿ—‰–‰½ŠW½¿¾Û…ü9Û=»ô}zí'Í'(ë$ôr>á”pþ’ú«Î¹w«Öd¾°^ÄCÌé‘ý|ùƒZ³êf]jØnÜßÏ`| ¢FOß ÿ6Å}¼oOÞžŽå<|IºQ¯“ü¹°ãK¦ù}b–®S÷»V¾§¤ÂÒò§h= ü®¿æ}Ä»7žµ:ú4Ú?÷ß„Áø&`*ÿ¦céÞn—›vÞ›Ê/´?›qŽá?KÐðþ«2éW{åb~n#ýÞ™sø#j6_Šfó%ö#®“&3bÙn›i½ü¿ƒñ á¶EþÇzÝîz¡ûn·ëäžÔ÷ɂ޸º£ÒËôòNÝ)¹œW$üSÎõRŽ„á§•»ÂF­…?õNy±Ž‡-áQ> ƧÀPþ›@yâ=4y«¾üu"r]û‘üI`¿Ë Úá”è—Py?!Ü;÷bFOÔŠ½ÒóGhh_äìü¹“ìp°i?“ŸÁøD«£êf-HzÁüzy—î7åÕd²–öÌ¿vP:ÚŽºäO…çwï~däýéðÙ‰òü4¶/uÒ_°aªÖ”ýÄñòƒß?ŸÁ`bzxïc}{nIý±âWå>>::ZoþØŒýWk¯ÖÄj>Ÿ|Qê§á½Â\^Î'žÎ`0ƒQq·¯÷—n…1BqñÀÀÊïŸÁ`üCã ø~q´9f˜Ügò3_/¢Ñè!î×kæ÷WZ }y ãï…ê¨XÊç9¾˜hOªÜ…˜ü ÆW‹¾¨ä7t/–¢~Áäg0¾^û¯{½cHxE|IýÞ¹‰B_ƒÁø»!Åš_Eh%´‚¬³/˜êí›cåg0¾b ‚ôGBÈþf>P¸ÏÊÏ`|ÕÀ¬ÿ@wÚˆø`ø‘úMMþB_ƒÁø{¥ÿ7ú^¤}¯Ð|ä~0(ˆÇk  Ø`D‡öí×­ØÚ·Û[U;/$`4 ‡ý1íÙ÷hýÿÄÿm1¸ º¿|'€þz«îá`90>FB=»S‚ìóîÌvô:hØp%FŠ’ÙXÚOe-#¯C;à-¸³0ˆ~¿£Ž–¯ë0Ïi[hÃìÂû¢Òƒ!¡­r– ±J¢}Y]ú‚­…E”Q<ž‹åü–æ›Òo ì™MÐ<½G> }®öŸ>85èoñœ8ß¼ö Ù­h¿$‡‡ØÐ¬K7 Žá@÷©MXE÷#hÃJûG%ñiwËlŠñ¸5yKcRøIý~;é—÷‘ößOM‚ðO~?e6EðÈ{`?6ê#í[‘îÛí†%  6¤=vÏZ%ÿéÙ >0_qý˜žk„-˜·”ŸœB#n©šFxn´¸ßˆÜo´´ß&þëkmD×Ú ŽDÄGšÙáàGhHtr?RC¼/ŦP|—dÇnÄthÁ}â|¾ê)U„—ÜïÁ嬀ö¸¨º‚,nÂøp‡/ðöZ´è…XçÒ"ÿÅÅ¥xü7,ûýWÓ"ÙýÅÅà´ ù©Âm«{8‹‘òw$?p\áNݬ`{Ñ2à¡é‚ž:.£W]ûï -ðUvà7¥á é“uóœ’_Í=ôõÓ 1V½;++ñ¯áÃø±jØÅ.B}—(3viÒ~öôþÁyÚo×} þÞšMøÅ4gü›=pŠ?i¿Hš…ðÛÄŸ( •²¥ûÃnÀÝ~up«ßˆyªßO´¿µ,èkR‡bÿÔÔ䔡ü¦P1`Usaý¿ßކ͖´£êߤð‹½]÷Qõå^„€VKôÿÏ5ØTN`—}|Týy¢;<”ú7ZÍzì'í·YýÒ5°é>„‚kZ÷1àëT@(ÿÔý§OÇŸ"åi/--5%ßd$  ‚~´ÿúÔ”ð‹-ké?ŸêÿúǽKAäz$þŽþöaì>¼ ;ƒ6ò— ¦nÕŸ1⸠‘gyžö*ëLò×S…š;•m·­c«Þh¥çE>ùÓm•Èö¨`;üNG”XN¢m–ªJ ñ³fÁàSèoùý\^[ÚEûÅÞ]û ö›ªoj¿®4ÛËk¦ò?²ë¾Ò~Cù×µÝ?’H?,µ_‰¿Cûï’ðdXÖz/›¤~¿aü%ó—…ç—Ú?)ÔßÔ} (÷ úÀý)Ãú;tÉßÞJÛ¶!üZ÷Û¡µ¶Ãó±6Rú•ë—–_ÿXk¿|¨ÂÀ<ÑÞR~“þ û5]`ìÊoñ^»WíWºÄ¿&ŒÿS²ü:ï?Ê/Ô_˜~|HÖKá—q€èýC)Ñ^k¿f¿”~8øAZ±vµd~’¨/´ö —Ÿ•¼'êÓß²šüõÀsäz0ø¯ÿGûýñ½Øè„f#êô½Ù鯄ò{ªù%ëbH¢K ò÷É¿Ùu\uü-²ÇŠ®ÏzòÈß7}{‡¾IüŠ·dzº#`½”D¼úð½@삾ߌ.Å?þ¼"à=öÎ×þ½SS÷Úß,ÙeßEù­ò_3é¾~<Àl)¿®Ú]­ûÃ:ëwhÿ­~Cùïjí_6ó}ñ÷kí—•ïʯ´_Å€×È{tû–÷ÝŸ²åû¢¡÷Ý*”¿µÝ,á[[-ÁoÕOZûI÷üHÿg†æ«ä=¥ü˜üká×A e…€®FWt5v]k¼ÖUÛu­ËUûµî“í¿&…_Š>=¿Mè?E’~ÓúK`©öãš÷ãvíÏëïùAi&©š¢¿ÔþŒÖ~"¾Èõ³Û X ±òG4ÿÑ¿,mtv¯t^±‘ŸJóŽ-¨¬M“Á®ö´íx0 zh7íÑl‘ßëé»;1›'­óp£Eõ‹Ù<òÇ*ËËMò{^D©œ¯È§:–Æ«óP ©óô]LùÍBŸ“úJûEÕ/m¯ùS;GûAùO䷴ߪó­iöËðHª¿¡ÿGÍ–ö7«¼_è¾,õ©@0_i¿æ¿%ýH}þ»†õy¿~Ò}§òkö[¼'íŸt~Ù€1€lD€©ísŠ}ÛDúvÊûÛ-í?&ío•vÍ¿`¾!ýó¸ÕKÅ—ûg¦öÏ+áGç¯6Óù§„ô7Ú­€Úk°á£K‰¿Mû­Œ™MýI÷§ïÔíéSÅþ[ѯÔHdª?Žâ/ÆõÇ•ç_ú„Û·©D⟥[júä--Í‚ßãP'ð|ã xüà*þŸ¢èþ£þËÿÿ°ñ ºïknm"}O“òƒ°W")Óƒ“-$#ïê<1'ùït”‹à±Yzñf]™†(ìÚòÈuJÛeRoYâ xÚðc垎 uõÙ‚€KÏŸ—”ß)þB÷õ]´ß©ûμÿ•tkpdïÌKüåi¿Ðÿõ#;ý…0µßVï7´_øÿ~³âÒ¯u_)¿ ·–ÏÑþ)ËX1à{¡ý´ÕñÚöŸ„[$þöÎ@$;Ðÿeë±ØTõï™,ø¡òߟKñŸ¯12~É|!ùêXûS5–æKÆ+÷/F¨íïß…´wA+hç/»~|o6Jd’þ÷¥FÞ/CÀ¸¦©©û¢Ê/{þ¤ ûb‹¼3¬Tÿ¬ ½Èû…óÏêq×¹•.@ü?ß²qeãÊ•ÎNÜÑ3Ä‚¥ùcuTàv´Z÷»‰ìÚã½#l¬ˆXX$U˜̦¤Ü´ý^ÙùîU¹|ò£“Ç‚ßV>ùÛ:›–Ah:0h¼„ÏâW÷Űᢠûí!À .Í=çGíß;gðO>ý8JþÍkhûÖ_Ëÿš~›ö«´ÝMùlõþa©ûŽa?*Õ¿%^P@‰ÿ¤j’úùÚ?µl)ÿ¤*øOé^?5ö=?Ù}cô=(Û/ˆ/°-+ôLº/©ÿRåüÊjŽçIúíŸÊ/çµù¯‘Ù¾­æ§´^°¿F¿@î×BÂÔ'þ»û±èÿãÁ5£äoÚcèÏ{½·[YúÏH¿/[©æ½Ùß/¸}~=¢¨€LþÅÞÒ~!öº»ÏVðc˜’ïJû´-íÇç´QíÏÙ´_qÝÅø“'x`y¿ÃøËœ_ê>>ÖuÙïÐ…ß>pØÔKû‡UÍßÈûupKÕþßAøûoYù¾Nío˜4h?)Šþ“†ðË1>$ýTó±À>þOdþdÿ[·[e ÀìÓ. ~/)÷©„_Sÿeÿ ÿŠþRþíÊߨò~Êú)é@•üæÍ í>\#×ßEY?…gÚoØ~=ÔGþM²_û\¤ýOu¹ÏðýôœQIáû5ý3Õá×#R~â;²_åüTû3 R¤ü¢»O0ßÇ÷±wEîñ7µÏÒþ:ówjÿš«ö»´WfÞoô£@Ð,¿ììü_äû‚þ„ñu‡ö÷ëš¿‘÷[)¿½Ãó}cدCÿyÿ”îó³úù•ù—%ÿ)ìé{=eËù ío•UÿV™ðËÑ>ªòGy»RûgÇVŸŽç­¿Çbä¯ÕõW£³ÿFÕÝ'Jïßj÷Iþ‰÷Ž´ëý.ôWÂ/ºûóéo9Ô~‹ýV©Ÿ^«:¿òšû2ûÏHÐ#¶¬ä~ÖªøgDÕ¯ÇR~à'ºûðQhž1 ƒÁ`0 ƒÁ`0 ƒÁø\üƒÔ endstream endobj 58 0 obj <> endobj 59 0 obj <> endobj 60 0 obj <> endobj 65 0 obj [/Indexed /DeviceRGB 255 <000000FF00006B6BD2FFFFFF666666FF66667B7B7B6666C24A4AB96B6B6B4242 B1F30000FF9090B1B1DA888888737373B1A1A1FFB1B1CC6B6B181818FF33337B 7BCC6666B9E33333B9B9B99090D2DADADA8888CCB98888FFC2C2424242E37B7B FFE3E3DA9999FF1818FF7B7BEB2121B1B1EBFF4A4A8080D2C2C2E3A9A9A93333 33F33333D252529090E3DADAF3CCCCEBEB1818FFA1A1999999A1A1DAB99090FF D2D2525252EBA9A98080E3A1A1E3EBEBF3080808FF08087B7BD2FF73737373C2 5A5AB9B1B1B1292929FF4242E34242C2C2C2E3E3E3DADAEBF38888FFF3F3EB90 90FF2929FF8888C2C2EBB1B1F3FF5A5AD2D2D2EB4242E34A4A9999F3CCCCF3A1 A1F3C2C2F37373D2FF6B6B8080806B6BC26666CC5252B94A4AB1FF9999B9B9E3 B1B1E3909090B1A9A9FFB9B9D26B6BCC7373212121FF39398080CCE339399999 D29090DAC28080FFCCCC4A4A4AE38080FFEBEBFF2121FF8080F32121B9B9EBFF 52528888D28080DA393939DA4A4A9999E39090EBE3E3F3DADAFFD2D2EBF31010 FFA9A9A1A1A1A9A9DAB99999FFDADA5A5A5A8888E3A9A9E3A1A1EBF3F3F3EBEB FF101010FF10107B7BDA7373CC5A5AC2CCCCCCEBEBEBB9B9F3B1B1FFD2D2F3CC CCFFA9A9F3C2C2FF6B6BCC5252C2D273739999DAC28888F329298888DA9999EB E3E3FF8888EBA9A9EBF3F3FFD2D2FFF7B796FC949005E770C2F0F4F7B82899EB 94F741F7FC9490F7B84E6D892D05E770C2F118F7B77BF741F7FC949003EE8803 D600F713EE00016FF7A2E3007DF1C2F164000FF8DF0008402004F7A3A0C40000 1F200C000FF8000000C4000CC40000DF0008000000F713E22A001EC4000CDEFD 30C2F18CF7A10E03EE8803D60000000305E00FC2F1A800E44A05E0F8000032F7 B9C59A3DEC000030001DE803B600C2F1E000CD7C00000900CD5C000000FF92D0 05E10005E17003B600C2F20400CD7CC2F21000F56A033238FFFFFFC2F2780010 260000300021F9000028FF92D0601232FF94D0FF92A005E100F432F805E100C2 F22C66E8880000006021D3FF92D0F432F805E100C2F26C66E94B00000060D91D>]endobj 64 0 obj <>stream xœí} Oi–¶s1Ónó!H ‚Âf0IX&|&\‡5Ù| .FÁËe@_˜ F€Âm#I‡ÉÆÍF ¼?tÏ9ï¥Þ*@fâäö‚ Æ—AçbSHôïÝœiñ×­ôÆ |E ã‹`c±ªw ~~^±Iäo*ô%1Œ/+óŒÕû'6+6Áö³ò3ßBÁxo¨xÌïŸh‘¿B_ƒÁøhÙXœ{2PÜ]ï÷û»Aø¹«ÁøFp3¸Ÿ u‡zçªxƒñm`3Ä¡ýÅÐB¡¹3…¾ ƒñ…н±ØTõ$„xRÅÓúŒoþ`0^UÕ47×gî3ßî÷nãKñÅ•_ }) ãËâ—¿ßߢ©½×Â`0 ˆë}…¾ƒQT³ø3ß(n3ûŒoÑB_ƒÁ( b· } £0ˆ²ñg0¾MDÙø3ß&˜ü Æ7ŠëìûŒooXúŒoi&?ƒñ­àæó ¿_/äã®ü­µ_ð‚~ëë…¾ã7Ÿ·øWz—:7®|×ùžÔëFþÉ|_ôÒÎÇZÏwTè‹`0þA1S/‰òW6®t^¹Ò Mþëyä_?ðùþ—?× —Âäg0.‰ûÀxã †zõn,Zm;{­Ñ÷ïÿ[È¿ñù²L~ãÒ~'(Ÿ¯P °”?=4NÍ=óù’¨¶]¸Nî–ŠkI2ùŒKÂOt¯j©ðw^¿¡üѨ1©¿•ˆbë»V€ë´aý\^ +?ƒqiÜDÅ‚G3”ñ9¿Yï›üA2ß—ÌØö?˜Ïd“Ù$\+?ƒñˆåïÓÑXçw6å¯Öä§:!YhåÏmõ3@~V~ãó0°Ñ¹!Ž&déO+4:(^S…6‹;Tþ7…¸VDi&›Aîù³>îçg0. g°Sµl!@“äÔÂ/Ò}‚ü€ú@ÿd6+²V~㲘Yê\zNGcADgç†$ÿmÝÑ×*óý¬(ùÔögüÙ üŒÏÅÍÅ`pf—‚ ý@AþÃh4-ϱ+a ~D~¬øù²lûŒÏBïÒâRh³Â_ BÀ Èo ?)¿¦~mf¹ŸM²íg0>þÅx|1¾ø!þ!aø$òGÑ}¨üY‹ý…·ýÄþ$Û~ã³P¬ÿP¯Š ,Å—üףј>¥Õ&üÙB“?+J~äüïòZŒlܯB4‰†ô_ôÓL~cX¿™óg}ÉÆ|ãÚèëöð~*mwwyxïã×p:üëÙY8ŽÐgÚÏú_{jFTüPù“IV~ã3ðóœDÕñ c|Ï|¾?(É—ìÅæøº½©ðþ~d?Lã^ ¯6œÏeÀéò*œFàùRûíkÎó¦J!ßÇFôïÉRw]l\øc0.ŒÇOû逹/GõËQ}IÓö'³è¼3™Tþ—­½ìÚOõS¤û€×ÀíÝÿ>ïçOV‡VOV"«4æá“?^:,ÃÔ¸`þ¸èë“I¿;ãâ(Ö?é}ÒÛ;ÛÜ\SÕDLíóŠQ}¶j?xnâþxžòçºà>)ŒJt&ú¯6ä\|xHpÿ%Š?6éýáKöSvFùýã2é—}D8bò3—¿7ê õÂz‚ìŸû'£Øgé½:H’éGÔ8¾ho>±OÔßGþ*âõONVON]~ûס“!|t?ŒÊOQƒØIì›ç"ùÉ÷Ó ¿lR;òñãRh …B+ÐBž„zç~3 ýF²o R(¿Ãö¯ãß—ôO¡‚£éôzƒ¾çgþ£C#'CC@þW-å—ÒI$Ì€AäÏ’ñÏR¹ß¢>+?ƒqÜX‘Qèý-–Óoúœ@Ê÷3™yÛ×ìu%ÒôƒòHÈW¥ò¯"ÅÚ:424´{‚äÔ틤63¾ùµðgù…+ö2Œ‹âþ€ÄÊÊñÿ/­7¶™õ¾,ÖÝl9n^Ⱦþyð°HãWQ×ÑÞíæì¿ündhw„„ÿääDÿ0±¬? ?|á²uvƒ~Ó÷[®„•ŸÁ¸8~(¦FüýÿÆ›NÛïÓõ>‡ò¿ÝGîKáO…SaUëá‚ ŒüjûáW#€¡]Š (þ»ïÎPýQù÷¥ö'ö­Ó…ògÇůÓ0ëêXùŒ‹ãfw1Bñ`eÓxÓÅô'E_ßxÖ$s‚È¿¿Of=œŠDVwÏ^*ú½GvGFliÿè±DP_†½³U•õ§(–XÒß  ~Ö0V~ãsð˜È?V,B¿ÅxÓ-çÝüY[Á¯Qr;ùQ¶w‰æ¹_¥ðCÊOLkþð[úÓ‰ ÿOê¯Ã`üçUo_"ѧËj–Ä_¬èa]+?ƒqq<öuwûíÊŸWíOf{¨ânöóß½Šäߗ‰h½>¢Z?æûCÄSú‡FýÉõ[oìb¹ÈIääe¿êÓ0®ËýjjU‹`åg0.·€äÿ@…ñ^žîõ³Rû Û?Ü¿ M°×zg;ù‡PÞIù²ÞÙCê¿Bã?tbô…_î6ŒöŸ:û¦ˆúBû1Ð"ž¬ü ÆgÀß]è®Gþ#û7'´›å>_6LÿÞÕ« I}ª÷åŒ÷ND±ì=ÁzãT ?ÕûOÞ}âÅjî ågÅg0.çâ›þz’ÿâ çZ åÙÏ¿Qgâ*¥ü²à×`¾Òä¦b?°ý­¥ð¹·Èþ·ôŽóý„é´˜‡œØ×ƒ¦Ÿ'ô0Ÿ¿±¼¿ ù³¦ïÏŸÏ?ÂÒ/¹i6ß;¥þ!)ü#µÞQÊ/»úWëg££Ín£€ Èr¿˜Ù“dåg0>é3Ù_ßíF~£“?ébûß_¥”_VüÃ~¥ò á7ëýôRÒÿDŒðÇ©½‘ðnÿiUc|Øö3Ÿ‹XßðþŸ-úÍ8O±­á—Í_Ìc„_Ò?’Ûß=#é—"ÿÖHúÿ›Ê}¤üb€¿œÜüO¥vïæ\/7#†øeiF?Oèa0.ëÑ´wÂoÙŸ¯üz4 ÖûòÉß|ÕÈù#‘HûIûnûî¶³wgTî“Å~hVfŸÃ”_)ÿÍ ¾4-(Ùop+ŒÓ¼½€/“ŸÁ¸q±®–– „fÿŒó,Û~.ä§^þ„®ö›Ëøà„>Tþ!9Êgä­Áè¿êœ_ð%åËñ½)ç„~‚ZɇÆösÎÏ`\bîîf ÂbÿŒó´‘¿áêUQï¾GçÍÓ}ò“!1ÆG)¿9ÌÇÈù‡TÒ/föÐJ@ûûgy—lüàjšóN`0‡\¤s`ÐßüY‹û.ýüS ´ýªÚŸ@ÛNÚ/çõœ¨‚ñß\ÐkïJùMåˆ~`üö^C„îê˰ò3—…Z¤³bsSð_°¿þ†óDSùÝ ~ V¹’~þ”X¿/,øIåG¡·­æ·÷VŒÔ·ôÐËy8Ù­”?Ë9?ƒqY(î?ž©ûÏU~Ëõ»ÙþI³Ú/&öÐ^±Ž‡˜²«¤ß¾”gî?‡dÊ¿z"‚)D(?.äçø­ŒZÊGäülûŒ ã0z]ùgff*Èúûgœ§ZÕ~*÷çð›Õ~k”ϼ´ý‘°š×£êýNò{½§ÿI¿Ö}±–Ìùû Ǩ}]ìϰò3—BßmuWŽŸgfn û+Ðø»“ß>³'o„_s¾ò‹¥|(é²ÿ<ò{ñž# ü/UüHøi^ŸsÔÀ¸X»;ÃÕ~ã’°îÁûóù'>Jþlþ:E??P_Tûç§§kÐöâpÎõœ¿;‘®^ÌçO!õ÷‰œíùÊß®gõ‘úæÊ{©ˆUïK$–moÊÛu‰A>¬ü ÆE¡ïŸ®æÆïåüëæb^Ùd&ï뎤í—+ùØjt¹ß£»wz:<üÓÙÙªÉâZ¾“ï†ï´/ù›‘KyHåŸü¤ÿ\ƒ!q]õñ#€ø7ˆûçVû¬•2if ꃜu ñ“S{‘ý~ãûXÆ;ûixô•}a®W¿þôŽº÷iBϪ¹’O¿Èùé ¯:rþ.P~ZFL(¿ìyàî~ãÓPm¸þDz§]ÿ„ë¿ucJ/®Ü]:utw»+c¸ûVáûåœÞýˆõVƒ^»ŸîÌ1¢~{ÿðoâ^]«ÏDÂäÏÙ®¥±Tß±'‰~¤±}ª6yð·øWa0¾ÜÖwáõz®æ›ÂŸ?¯Ù6+í=Xt›²ÎÈIòÓHŸÈ~*%Ù¿&‡í…Qßi!ÏœúÈ«= Ÿ`Ý‘{]?Ú~rýÖÚÝ„F½x¯yûàäßè†ÁøÊÑ­¶Rþ_**Ôð^Êøëýÿ7ï>›ôc;ÊïkãŒvs˜ÎÇ 7Œö¾”ÔÇÁ{â†\Æ*^'CrmO9£'<šÃ?ï5¤tOÖûS{ÚEO_FŒñÑø[þó0_/Ž>ïÍŠMIý‰s¦ôz3ö™=”rÛoו벆øÒŒ~q“nû}ºWmkôâÊž«òîÜrdßnûnX ðÙÜ/áè7œ”Â/”_oÓã«EµYïÚcÓsúüÝ3y¨±I?òÍ·mÎÍ‘îí£Ûõí«™}4Ä_êÿÉIÎøDîäÄä¾ÝgõóEð wíWâmÜÇ‘ý>¾cƒqA˜äÿ¹¥E®å1¡–ñšÉûÀ¤©üú>½öþþvYò»º/²~âp8bQ(n/Üë„_Ýw>¢—ñÀé¼h$rÎk—Âï3oÒËýý Æ'!jÿ—‰–‰½ŠW½¿¾Û…ü9Û=»ô}zí'Í'(ë$ôr>á”pþ’ú«Î¹w«Öd¾°^ÄCÌé‘ý|ùƒZ³êf]jØnÜßÏ`| ¢FOß ÿ6Å}¼oOÞžŽå<|IºQ¯“ü¹°ãK¦ù}b–®S÷»V¾§¤ÂÒò§h= ü®¿æ}Ä»7žµ:ú4Ú?÷ß„Áø&`*ÿ¦céÞn—›vÞ›Ê/´?›qŽá?KÐðþ«2éW{åb~n#ýÞ™sø#j6_Šfó%ö#®“&3bÙn›i½ü¿ƒñ á¶EþÇzÝîz¡ûn·ëäžÔ÷ɂ޸º£ÒËôòNÝ)¹œW$üSÎõRŽ„á§•»ÂF­…?õNy±Ž‡-áQ> ƧÀPþ›@yâ=4y«¾üu"r]û‘üI`¿Ë Úá”è—Py?!Ü;÷bFOÔŠ½ÒóGhh_äìü¹“ìp°i?“ŸÁøD«£êf-HzÁüzy—î7åÕd²–öÌ¿vP:ÚŽºäO…çwï~däýéðÙ‰òü4¶/uÒ_°aªÖ”ýÄñòƒß?ŸÁ`bzxïc}{nIý±âWå>>::ZoþØŒýWk¯ÖÄj>Ÿ|Qê§á½Â\^Î'žÎ`0ƒQq·¯÷—n…1BqñÀÀÊïŸÁ`üCã ø~q´9f˜Ügò3_/¢Ñè!î×kæ÷WZ }y ãï…ê¨XÊç9¾˜hOªÜ…˜ü ÆW‹¾¨ä7t/–¢~Áäg0¾^û¯{½cHxE|IýÞ¹‰B_ƒÁø»!Åš_Eh%´‚¬³/˜êí›cåg0¾b ‚ôGBÈþf>P¸ÏÊÏ`|ÕÀ¬ÿ@wÚˆø`ø‘úMMþB_ƒÁø{¥ÿ7ú^¤}¯Ð|ä~0(ˆÇk  Ø`D‡öí×­ØÚ·Û[U;/$`4 ‡ý1íÙ÷hýÿÄÿm1¸ º¿|'€þz«îá`90>FB=»S‚ìóîÌvô:hØp%FŠ’ÙXÚOe-#¯C;à-¸³0ˆ~¿£Ž–¯ë0Ïi[hÃìÂû¢Òƒ!¡­r– ±J¢}Y]ú‚­…E”Q<ž‹åü–æ›Òo ì™MÐ<½G> }®öŸ>85èoñœ8ß¼ö Ù­h¿$‡‡ØÐ¬K7 Žá@÷©MXE÷#hÃJûG%ñiwËlŠñ¸5yKcRøIý~;é—÷‘ößOM‚ðO~?e6EðÈ{`?6ê#í[‘îÛí†%  6¤=vÏZ%ÿéÙ >0_qý˜žk„-˜·”ŸœB#n©šFxn´¸ßˆÜo´´ß&þëkmD×Ú ŽDÄGšÙáàGhHtr?RC¼/ŦP|—dÇnÄthÁ}â|¾ê)U„—ÜïÁ嬀ö¸¨º‚,nÂøp‡/ðöZ´è…XçÒ"ÿÅÅ¥xü7,ûýWÓ"ÙýÅÅà´ ù©Âm«{8‹‘òw$?p\áNݬ`{Ñ2à¡é‚ž:.£W]ûï -ðUvà7¥á é“uóœ’_Í=ôõÓ 1V½;++ñ¯áÃø±jØÅ.B}—(3viÒ~öôþÁyÚo×} þÞšMøÅ4gü›=pŠ?i¿Hš…ðÛÄŸ( •²¥ûÃnÀÝ~up«ßˆyªßO´¿µ,èkR‡bÿÔÔ䔡ü¦P1`Usaý¿ßކ͖´£êߤð‹½]÷Qõå^„€VKôÿÏ5ØTN`—}|Týy¢;<”ú7ZÍzì'í·YýÒ5°é>„‚kZ÷1àëT@(ÿÔý§OÇŸ"åi/--5%ßd$  ‚~´ÿúÔ”ð‹-ké?ŸêÿúǽKAäz$þŽþöaì>¼ ;ƒ6ò— ¦nÕŸ1⸠‘gyžö*ëLò×S…š;•m·­c«Þh¥çE>ùÓm•Èö¨`;üNG”XN¢m–ªJ ñ³fÁàSèoùý\^[ÚEûÅÞ]û ö›ªoj¿®4ÛËk¦ò?²ë¾Ò~Cù×µÝ?’H?,µ_‰¿Cûï’ðdXÖz/›¤~¿aü%ó—…ç—Ú?)ÔßÔ} (÷ úÀý)Ãú;tÉßÞJÛ¶!üZ÷Û¡µ¶Ãó±6Rú•ë—–_ÿXk¿|¨ÂÀ<ÑÞR~“þ û5]`ìÊoñ^»WíWºÄ¿&ŒÿS²ü:ï?Ê/Ô_˜~|HÖKá—q€èýC)Ñ^k¿f¿”~8øAZ±vµd~’¨/´ö —Ÿ•¼'êÓß²šüõÀsäz0ø¯ÿGûýñ½Øè„f#êô½Ù鯄ò{ªù%ëbH¢K ò÷É¿Ùu\uü-²ÇŠ®ÏzòÈß7}{‡¾IüŠ·dzº#`½”D¼úð½@삾ߌ.Å?þ¼"à=öÎ×þ½SS÷Úß,ÙeßEù­ò_3é¾~<Àl)¿®Ú]­ûÃ:ëwhÿ­~Cùïjí_6ó}ñ÷kí—•ïʯ´_Å€×È{tû–÷ÝŸ²åû¢¡÷Ý*”¿µÝ,á[[-ÁoÕOZûI÷üHÿg†æ«ä=¥ü˜üká×A e…€®FWt5v]k¼ÖUÛu­ËUûµî“í¿&…_Š>=¿Mè?E’~ÓúK`©öãš÷ãvíÏëïùAi&©š¢¿ÔþŒÖ~"¾Èõ³Û X ±òG4ÿÑ¿,mtv¯t^±‘ŸJóŽ-¨¬M“Á®ö´íx0 zh7íÑl‘ßëé»;1›'­óp£Eõ‹Ù<òÇ*ËËMò{^D©œ¯È§:–Æ«óP ©óô]LùÍBŸ“úJûEÕ/m¯ùS;GûAùO䷴ߪó­iöËðHª¿¡ÿGÍ–ö7«¼_è¾,õ©@0_i¿æ¿%ýH}þ»†õy¿~Ò}§òkö[¼'íŸt~Ù€1€lD€©ísŠ}ÛDúvÊûÛ-í?&ío•vÍ¿`¾!ýó¸ÕKÅ—ûg¦öÏ+áGç¯6Óù§„ô7Ú­€Úk°á£K‰¿Mû­Œ™MýI÷§ïÔíéSÅþ[ѯÔHdª?Žâ/ÆõÇ•ç_ú„Û·©D⟥[júä--Í‚ßãP'ð|ã xüà*þŸ¢èþ£þËÿÿ°ñ ºïknm"}O“òƒ°W")Óƒ“-$#ïê<1'ùït”‹à±Yzñf]™†(ìÚòÈuJÛeRoYâ xÚðc垎 uõÙ‚€KÏŸ—”ß)þB÷õ]´ß©ûμÿ•tkpdïÌKüåi¿Ðÿõ#;ý…0µßVï7´_øÿ~³âÒ¯u_)¿ ·–ÏÑþ)ËX1à{¡ý´ÕñÚöŸ„[$þöÎ@$;Ðÿeë±ØTõï™,ø¡òߟKñŸ¯12~É|!ùêXûS5–æKÆ+÷/F¨íïß…´wA+hç/»~|o6Jd’þ÷¥FÞ/CÀ¸¦©©û¢Ê/{þ¤ ûb‹¼3¬Tÿ¬ ½Èû…óÏêq×¹•.@ü?ß²qeãÊ•ÎNÜÑ3Ä‚¥ùcuTàv´Z÷»‰ìÚã½#l¬ˆXX$U˜̦¤Ü´ý^ÙùîU¹|ò£“Ç‚ßV>ùÛ:›–Ah:0h¼„ÏâW÷Űᢠûí!À .Í=çGíß;gðO>ý8JþÍkhûÖ_Ëÿš~›ö«´ÝMùlõþa©ûŽa?*Õ¿%^P@‰ÿ¤j’úùÚ?µl)ÿ¤*øOé^?5ö=?Ù}cô=(Û/ˆ/°-+ôLº/©ÿRåüÊjŽçIúíŸÊ/çµù¯‘Ù¾­æ§´^°¿F¿@î×BÂÔ'þ»û±èÿãÁ5£äoÚcèÏ{½·[YúÏH¿/[©æ½Ùß/¸}~=¢¨€LþÅÞÒ~!öº»ÏVðc˜’ïJû´-íÇç´QíÏÙ´_qÝÅø“'x`y¿ÃøËœ_ê>>ÖuÙïÐ…ß>pØÔKû‡UÍßÈûupKÕþßAøûoYù¾Nío˜4h?)Šþ“†ðË1>$ýTó±À>þOdþdÿ[·[e ÀìÓ. ~/)÷©„_Sÿeÿ ÿŠþRþíÊߨò~Êú)é@•üæÍ í>\#×ßEY?…gÚoØ~=ÔGþM²_û\¤ýOu¹ÏðýôœQIáû5ý3Õá×#R~â;²_åüTû3 R¤ü¢»O0ßÇ÷±wEîñ7µÏÒþ:ówjÿš«ö»´WfÞoô£@Ð,¿ììü_äû‚þ„ñu‡ö÷ëš¿‘÷[)¿½Ãó}cدCÿyÿ”îó³úù•ù—%ÿ)ìé{=eËù ío•UÿV™ðËÑ>ªòGy»RûgÇVŸŽç­¿Çbä¯ÕõW£³ÿFÕÝ'Jïßj÷Iþ‰÷Ž´ëý.ôWÂ/ºûóéo9Ô~‹ýV©Ÿ^«:¿òšû2ûÏHÐ#¶¬ä~ÖªøgDÕ¯ÇR~à'ºûðQhž1 ƒÁ`0 ƒÁ`0 ƒÁø\üƒÔ endstream endobj 66 0 obj <> endobj 67 0 obj <> endobj 68 0 obj <> endobj 73 0 obj [/Indexed /DeviceRGB 255 <000000FF00006B6BD2FFFFFF666666FF66667B7B7B6666C24A4AB96B6B6B4242 B1F30000FF9090B1B1DA888888737373B1A1A1FFB1B1CC6B6B181818FF33337B 7BCC6666B9E33333B9B9B99090D2DADADA8888CCB98888FFC2C2424242E37B7B FFE3E3DA9999FF1818FF7B7BEB2121B1B1EBFF4A4A8080D2C2C2E3A9A9A93333 33F33333D252529090E3DADAF3CCCCEBEB1818FFA1A1999999A1A1DAB99090FF D2D2525252EBA9A98080E3A1A1E3EBEBF3080808FF08087B7BD2FF73737373C2 5A5AB9B1B1B1292929FF4242E34242C2C2C2E3E3E3DADAEBF38888FFF3F3EB90 90FF2929FF8888C2C2EBB1B1F3FF5A5AD2D2D2EB4242E34A4A9999F3CCCCF3A1 A1F3C2C2F37373D2FF6B6B8080806B6BC26666CC5252B94A4AB1FF9999B9B9E3 B1B1E3909090B1A9A9FFB9B9D26B6BCC7373212121FF39398080CCE339399999 D29090DAC28080FFCCCC4A4A4AE38080FFEBEBFF2121FF8080F32121B9B9EBFF 52528888D28080DA393939DA4A4A9999E39090EBE3E3F3DADAFFD2D2EBF31010 FFA9A9A1A1A1A9A9DAB99999FFDADA5A5A5A8888E3A9A9E3A1A1EBF3F3F3EBEB FF101010FF10107B7BDA7373CC5A5AC2CCCCCCEBEBEBB9B9F3B1B1FFD2D2F3CC CCFFA9A9F3C2C2FF6B6BCC5252C2D273739999DAC28888F329298888DA9999EB E3E3FF8888EBA9A9EBF3F3FFD2D2FFF7B796FC949005E770C2F0F4F7B82899EB 94F741F7FC9490F7B84E6D892D05E770C2F118F7B77BF741F7FC949003EE8803 D600F713EE00016FF7A2E3007DF1C2F164000FF8DF0008402004F7A3A0C40000 1F200C000FF8000000C4000CC40000DF0008000000F713E22A001EC4000CDEFD 30C2F18CF7A10E03EE8803D60000000305E00FC2F1A800E44A05E0F8000032F7 B9C59A3DEC000030001DE803B600C2F1E000CD7C00000900CD5C000000FF92D0 05E10005E17003B600C2F20400CD7CC2F21000F56A033238FFFFFFC2F2780010 260000300021F9000028FF92D0601232FF94D0FF92A005E100F432F805E100C2 F22C66E8880000006021D3FF92D0F432F805E100C2F26C66E94B00000060D91D>]endobj 72 0 obj <>stream xœí} Oi–¶s1Ónó!H ‚Âf0IX&|&\‡5Ù| .FÁËe@_˜ F€Âm#I‡ÉÆÍF ¼?tÏ9ï¥Þ*@fâäö‚ Æ—AçbSHôïÝœiñ×­ôÆ |E ã‹`c±ªw ~~^±Iäo*ô%1Œ/+óŒÕû'6+6Áö³ò3ßBÁxo¨xÌïŸh‘¿B_ƒÁøhÙXœ{2PÜ]ï÷û»Aø¹«ÁøFp3¸Ÿ u‡zçªxƒñm`3Ä¡ýÅÐB¡¹3…¾ ƒñ…н±ØTõ$„xRÅÓúŒoþ`0^UÕ47×gî3ßî÷nãKñÅ•_ }) ãËâ—¿ßߢ©½×Â`0 ˆë}…¾ƒQT³ø3ß(n3ûŒoÑB_ƒÁ( b· } £0ˆ²ñg0¾MDÙø3ß&˜ü Æ7ŠëìûŒooXúŒoi&?ƒñ­àæó ¿_/äã®ü­µ_ð‚~ëë…¾ã7Ÿ·øWz—:7®|×ùžÔëFþÉ|_ôÒÎÇZÏwTè‹`0þA1S/‰òW6®t^¹Ò Mþëyä_?ðùþ—?× —Âäg0.‰ûÀxã †zõn,Zm;{­Ñ÷ïÿ[È¿ñù²L~ãÒ~'(Ÿ¯P °”?=4NÍ=óù’¨¶]¸Nî–ŠkI2ùŒKÂOt¯j©ðw^¿¡üѨ1©¿•ˆbë»V€ë´aý\^ +?ƒqiÜDÅ‚G3”ñ9¿Yï›üA2ß—ÌØö?˜Ïd“Ù$\+?ƒñˆåïÓÑXçw6å¯Öä§:!YhåÏmõ3@~V~ãó0°Ñ¹!Ž&déO+4:(^S…6‹;Tþ7…¸VDi&›Aîù³>îçg0. g°Sµl!@“äÔÂ/Ò}‚ü€ú@ÿd6+²V~㲘Yê\zNGcADgç†$ÿmÝÑ×*óý¬(ùÔögüÙ üŒÏÅÍÅ`pf—‚ ý@AþÃh4-ϱ+a ~D~¬øù²lûŒÏBïÒâRh³Â_ BÀ Èo ?)¿¦~mf¹ŸM²íg0>þÅx|1¾ø!þ!aø$òGÑ}¨üY‹ý…·ýÄþ$Û~ã³P¬ÿP¯Š ,Å—üףј>¥Õ&üÙB“?+J~äüïòZŒlܯB4‰†ô_ôÓL~cX¿™óg}ÉÆ|ãÚèëöð~*mwwyxïã×p:üëÙY8ŽÐgÚÏú_{jFTüPù“IV~ã3ðóœDÕñ c|Ï|¾?(É—ìÅæøº½©ðþ~d?Lã^ ¯6œÏeÀéò*œFàùRûíkÎó¦J!ßÇFôïÉRw]l\øc0.ŒÇOû逹/GõËQ}IÓö'³è¼3™Tþ—­½ìÚOõS¤û€×ÀíÝÿ>ïçOV‡VOV"«4æá“?^:,ÃÔ¸`þ¸èë“I¿;ãâ(Ö?é}ÒÛ;ÛÜ\SÕDLíóŠQ}¶j?xnâþxžòçºà>)ŒJt&ú¯6ä\|xHpÿ%Š?6éýáKöSvFùýã2é—}D8bò3—¿7ê õÂz‚ìŸû'£Øgé½:H’éGÔ8¾ho>±OÔßGþ*âõONVON]~ûס“!|t?ŒÊOQƒØIì›ç"ùÉ÷Ó ¿lR;òñãRh …B+ÐBž„zç~3 ýF²o R(¿Ãö¯ãß—ôO¡‚£éôzƒ¾çgþ£C#'CC@þW-å—ÒI$Ì€AäÏ’ñÏR¹ß¢>+?ƒqÜX‘Qèý-–Óoúœ@Ê÷3™yÛ×ìu%ÒôƒòHÈW¥ò¯"ÅÚ:424´{‚äÔ틤63¾ùµðgù…+ö2Œ‹âþ€ÄÊÊñÿ/­7¶™õ¾,ÖÝl9n^Ⱦþyð°HãWQ×ÑÞíæì¿ündhw„„ÿääDÿ0±¬? ?|á²uvƒ~Ó÷[®„•ŸÁ¸8~(¦FüýÿÆ›NÛïÓõ>‡ò¿ÝGîKáO…SaUëá‚ ŒüjûáW#€¡]Š (þ»ïÎPýQù÷¥ö'ö­Ó…ògÇůÓ0ëêXùŒ‹ãfw1Bñ`eÓxÓÅô'E_ßxÖ$s‚È¿¿Of=œŠDVwÏ^*ú½GvGFliÿè±DP_†½³U•õ§(–XÒß  ~Ö0V~ãsð˜È?V,B¿ÅxÓ-çÝüY[Á¯Qr;ùQ¶w‰æ¹_¥ðCÊOLkþð[úÓ‰ ÿOê¯Ã`üçUo_"ѧËj–Ä_¬èa]+?ƒqq<öuwûíÊŸWíOf{¨ânöóß½Šäߗ‰h½>¢Z?æûCÄSú‡FýÉõ[oìb¹ÈIääe¿êÓ0®ËýjjU‹`åg0.·€äÿ@…ñ^žîõ³Rû Û?Ü¿ M°×zg;ù‡PÞIù²ÞÙCê¿Bã?tbô…_î6ŒöŸ:û¦ˆúBû1Ð"ž¬ü ÆgÀß]è®Gþ#û7'´›å>_6LÿÞÕ« I}ª÷åŒ÷ND±ì=ÁzãT ?ÕûOÞ}âÅjî ågÅg0.çâ›þz’ÿâ çZ åÙÏ¿Qgâ*¥ü²à×`¾Òä¦b?°ý­¥ð¹·Èþ·ôŽóý„é´˜‡œØ×ƒ¦Ÿ'ô0Ÿ¿±¼¿ ù³¦ïÏŸÏ?ÂÒ/¹i6ß;¥þ!)ü#µÞQÊ/»úWëg££Ín£€ Èr¿˜Ù“dåg0>é3Ù_ßíF~£“?ébûß_¥”_VüÃ~¥ò á7ëýôRÒÿDŒðÇ©½‘ðnÿiUc|Øö3Ÿ‹XßðþŸ-úÍ8O±­á—Í_Ìc„_Ò?’Ûß=#é—"ÿÖHúÿ›Ê}¤üb€¿œÜüO¥vïæ\/7#†øeiF?Oèa0.ëÑ´wÂoÙŸ¯üz4 ÖûòÉß|ÕÈù#‘HûIûnûî¶³wgTî“Å~hVfŸÃ”_)ÿÍ ¾4-(Ùop+ŒÓ¼½€/“ŸÁ¸q±®–– „fÿŒó,Û~.ä§^þ„®ö›Ëøà„>Tþ!9Êgä­Áè¿êœ_ð%åËñ½)ç„~‚ZɇÆösÎÏ`\bîîf ÂbÿŒó´‘¿áêUQï¾GçÍÓ}ò“!1ÆG)¿9ÌÇÈù‡TÒ/föÐJ@ûûgy—lüàjšóN`0‡\¤s`ÐßüY‹û.ýüS ´ýªÚŸ@ÛNÚ/çõœ¨‚ñß\ÐkïJùMåˆ~`üö^C„îê˰ò3—…Z¤³bsSð_°¿þ†óDSùÝ ~ V¹’~þ”X¿/,øIåG¡·­æ·÷VŒÔ·ôÐËy8Ù­”?Ë9?ƒqY(î?ž©ûÏU~Ëõ»ÙþI³Ú/&öÐ^±Ž‡˜²«¤ß¾”gî?‡dÊ¿z"‚)D(?.äçø­ŒZÊGäülûŒ ã0z]ùgff*Èúûgœ§ZÕ~*÷çð›Õ~k”ϼ´ý‘°š×£êýNò{½§ÿI¿Ö}±–Ìùû Ǩ}]ìϰò3—BßmuWŽŸgfn û+Ðø»“ß>³'o„_s¾ò‹¥|(é²ÿ<ò{ñž# ü/UüHøi^ŸsÔÀ¸X»;ÃÕ~ã’°îÁûóù'>Jþlþ:E??P_Tûç§§kÐöâpÎõœ¿;‘®^ÌçO!õ÷‰œíùÊß®gõ‘úæÊ{©ˆUïK$–moÊÛu‰A>¬ü ÆE¡ïŸ®æÆïåüëæb^Ùd&ï뎤í—+ùØjt¹ß£»wz:<üÓÙÙªÉâZ¾“ï†ï´/ù›‘KyHåŸü¤ÿ\ƒ!q]õñ#€ø7ˆûçVû¬•2if ꃜu ñ“S{‘ý~ãûXÆ;ûixô•}a®W¿þôŽº÷iBϪ¹’O¿Èùé ¯:rþ.P~ZFL(¿ìyàî~ãÓPm¸þDz§]ÿ„ë¿ucJ/®Ü]:utw»+c¸ûVáûåœÞýˆõVƒ^»ŸîÌ1¢~{ÿðoâ^]«ÏDÂäÏÙ®¥±Tß±'‰~¤±}ª6yð·øWa0¾ÜÖwáõz®æ›ÂŸ?¯Ù6+í=Xt›²ÎÈIòÓHŸÈ~*%Ù¿&‡í…Qßi!ÏœúÈ«= Ÿ`Ý‘{]?Ú~rýÖÚÝ„F½x¯yûàäßè†ÁøÊÑ­¶Rþ_**Ôð^Êøëýÿ7ï>›ôc;ÊïkãŒvs˜ÎÇ 7Œö¾”ÔÇÁ{â†\Æ*^'CrmO9£'<šÃ?ï5¤tOÖûS{ÚEO_FŒñÑø[þó0_/Ž>ïÍŠMIý‰s¦ôz3ö™=”rÛoו벆øÒŒ~q“nû}ºWmkôâÊž«òîÜrdßnûnX ðÙÜ/áè7œ”Â/”_oÓã«EµYïÚcÓsúüÝ3y¨±I?òÍ·mÎÍ‘îí£Ûõí«™}4Ä_êÿÉIÎøDîäÄä¾ÝgõóEð wíWâmÜÇ‘ý>¾cƒqA˜äÿ¹¥E®å1¡–ñšÉûÀ¤©üú>½öþþvYò»º/²~âp8bQ(n/Üë„_Ýw>¢—ñÀé¼h$rÎk—Âï3oÒËýý Æ'!jÿ—‰–‰½ŠW½¿¾Û…ü9Û=»ô}zí'Í'(ë$ôr>á”pþ’ú«Î¹w«Öd¾°^ÄCÌé‘ý|ùƒZ³êf]jØnÜßÏ`| ¢FOß ÿ6Å}¼oOÞžŽå<|IºQ¯“ü¹°ãK¦ù}b–®S÷»V¾§¤ÂÒò§h= ü®¿æ}Ä»7žµ:ú4Ú?÷ß„Áø&`*ÿ¦céÞn—›vÞ›Ê/´?›qŽá?KÐðþ«2éW{åb~n#ýÞ™sø#j6_Šfó%ö#®“&3bÙn›i½ü¿ƒñ á¶EþÇzÝîz¡ûn·ëäžÔ÷ɂ޸º£ÒËôòNÝ)¹œW$üSÎõRŽ„á§•»ÂF­…?õNy±Ž‡-áQ> ƧÀPþ›@yâ=4y«¾üu"r]û‘üI`¿Ë Úá”è—Py?!Ü;÷bFOÔŠ½ÒóGhh_äìü¹“ìp°i?“ŸÁøD«£êf-HzÁüzy—î7åÕd²–öÌ¿vP:ÚŽºäO…çwï~däýéðÙ‰òü4¶/uÒ_°aªÖ”ýÄñòƒß?ŸÁ`bzxïc}{nIý±âWå>>::ZoþØŒýWk¯ÖÄj>Ÿ|Qê§á½Â\^Î'žÎ`0ƒQq·¯÷—n…1BqñÀÀÊïŸÁ`üCã ø~q´9f˜Ügò3_/¢Ñè!î×kæ÷WZ }y ãï…ê¨XÊç9¾˜hOªÜ…˜ü ÆW‹¾¨ä7t/–¢~Áäg0¾^û¯{½cHxE|IýÞ¹‰B_ƒÁø»!Åš_Eh%´‚¬³/˜êí›cåg0¾b ‚ôGBÈþf>P¸ÏÊÏ`|ÕÀ¬ÿ@wÚˆø`ø‘úMMþB_ƒÁø{¥ÿ7ú^¤}¯Ð|ä~0(ˆÇk  Ø`D‡öí×­ØÚ·Û[U;/$`4 ‡ý1íÙ÷hýÿÄÿm1¸ º¿|'€þz«îá`90>FB=»S‚ìóîÌvô:hØp%FŠ’ÙXÚOe-#¯C;à-¸³0ˆ~¿£Ž–¯ë0Ïi[hÃìÂû¢Òƒ!¡­r– ±J¢}Y]ú‚­…E”Q<ž‹åü–æ›Òo ì™MÐ<½G> }®öŸ>85èoñœ8ß¼ö Ù­h¿$‡‡ØÐ¬K7 Žá@÷©MXE÷#hÃJûG%ñiwËlŠñ¸5yKcRøIý~;é—÷‘ößOM‚ðO~?e6EðÈ{`?6ê#í[‘îÛí†%  6¤=vÏZ%ÿéÙ >0_qý˜žk„-˜·”ŸœB#n©šFxn´¸ßˆÜo´´ß&þëkmD×Ú ŽDÄGšÙáàGhHtr?RC¼/ŦP|—dÇnÄthÁ}â|¾ê)U„—ÜïÁ嬀ö¸¨º‚,nÂøp‡/ðöZ´è…XçÒ"ÿÅÅ¥xü7,ûýWÓ"ÙýÅÅà´ ù©Âm«{8‹‘òw$?p\áNݬ`{Ñ2à¡é‚ž:.£W]ûï -ðUvà7¥á é“uóœ’_Í=ôõÓ 1V½;++ñ¯áÃø±jØÅ.B}—(3viÒ~öôþÁyÚo×} þÞšMøÅ4gü›=pŠ?i¿Hš…ðÛÄŸ( •²¥ûÃnÀÝ~up«ßˆyªßO´¿µ,èkR‡bÿÔÔ䔡ü¦P1`Usaý¿ßކ͖´£êߤð‹½]÷Qõå^„€VKôÿÏ5ØTN`—}|Týy¢;<”ú7ZÍzì'í·YýÒ5°é>„‚kZ÷1àëT@(ÿÔý§OÇŸ"åi/--5%ßd$  ‚~´ÿúÔ”ð‹-ké?ŸêÿúǽKAäz$þŽþöaì>¼ ;ƒ6ò— ¦nÕŸ1⸠‘gyžö*ëLò×S…š;•m·­c«Þh¥çE>ùÓm•Èö¨`;üNG”XN¢m–ªJ ñ³fÁàSèoùý\^[ÚEûÅÞ]û ö›ªoj¿®4ÛËk¦ò?²ë¾Ò~Cù×µÝ?’H?,µ_‰¿Cûï’ðdXÖz/›¤~¿aü%ó—…ç—Ú?)ÔßÔ} (÷ úÀý)Ãú;tÉßÞJÛ¶!üZ÷Û¡µ¶Ãó±6Rú•ë—–_ÿXk¿|¨ÂÀ<ÑÞR~“þ û5]`ìÊoñ^»WíWºÄ¿&ŒÿS²ü:ï?Ê/Ô_˜~|HÖKá—q€èýC)Ñ^k¿f¿”~8øAZ±vµd~’¨/´ö —Ÿ•¼'êÓß²šüõÀsäz0ø¯ÿGûýñ½Øè„f#êô½Ù鯄ò{ªù%ëbH¢K ò÷É¿Ùu\uü-²ÇŠ®ÏzòÈß7}{‡¾IüŠ·dzº#`½”D¼úð½@삾ߌ.Å?þ¼"à=öÎ×þ½SS÷Úß,ÙeßEù­ò_3é¾~<Àl)¿®Ú]­ûÃ:ëwhÿ­~Cùïjí_6ó}ñ÷kí—•ïʯ´_Å€×È{tû–÷ÝŸ²åû¢¡÷Ý*”¿µÝ,á[[-ÁoÕOZûI÷üHÿg†æ«ä=¥ü˜üká×A e…€®FWt5v]k¼ÖUÛu­ËUûµî“í¿&…_Š>=¿Mè?E’~ÓúK`©öãš÷ãvíÏëïùAi&©š¢¿ÔþŒÖ~"¾Èõ³Û X ±òG4ÿÑ¿,mtv¯t^±‘ŸJóŽ-¨¬M“Á®ö´íx0 zh7íÑl‘ßëé»;1›'­óp£Eõ‹Ù<òÇ*ËËMò{^D©œ¯È§:–Æ«óP ©óô]LùÍBŸ“úJûEÕ/m¯ùS;GûAùO䷴ߪó­iöËðHª¿¡ÿGÍ–ö7«¼_è¾,õ©@0_i¿æ¿%ýH}þ»†õy¿~Ò}§òkö[¼'íŸt~Ù€1€lD€©ísŠ}ÛDúvÊûÛ-í?&ío•vÍ¿`¾!ýó¸ÕKÅ—ûg¦öÏ+áGç¯6Óù§„ô7Ú­€Úk°á£K‰¿Mû­Œ™MýI÷§ïÔíéSÅþ[ѯÔHdª?Žâ/ÆõÇ•ç_ú„Û·©D⟥[júä--Í‚ßãP'ð|ã xüà*þŸ¢èþ£þËÿÿ°ñ ºïknm"}O“òƒ°W")Óƒ“-$#ïê<1'ùït”‹à±Yzñf]™†(ìÚòÈuJÛeRoYâ xÚðc垎 uõÙ‚€KÏŸ—”ß)þB÷õ]´ß©ûμÿ•tkpdïÌKüåi¿Ðÿõ#;ý…0µßVï7´_øÿ~³âÒ¯u_)¿ ·–ÏÑþ)ËX1à{¡ý´ÕñÚöŸ„[$þöÎ@$;Ðÿeë±ØTõï™,ø¡òߟKñŸ¯12~É|!ùêXûS5–æKÆ+÷/F¨íïß…´wA+hç/»~|o6Jd’þ÷¥FÞ/CÀ¸¦©©û¢Ê/{þ¤ ûb‹¼3¬Tÿ¬ ½Èû…óÏêq×¹•.@ü?ß²qeãÊ•ÎNÜÑ3Ä‚¥ùcuTàv´Z÷»‰ìÚã½#l¬ˆXX$U˜̦¤Ü´ý^ÙùîU¹|ò£“Ç‚ßV>ùÛ:›–Ah:0h¼„ÏâW÷Űᢠûí!À .Í=çGíß;gðO>ý8JþÍkhûÖ_Ëÿš~›ö«´ÝMùlõþa©ûŽa?*Õ¿%^P@‰ÿ¤j’úùÚ?µl)ÿ¤*øOé^?5ö=?Ù}cô=(Û/ˆ/°-+ôLº/©ÿRåüÊjŽçIúíŸÊ/çµù¯‘Ù¾­æ§´^°¿F¿@î×BÂÔ'þ»û±èÿãÁ5£äoÚcèÏ{½·[YúÏH¿/[©æ½Ùß/¸}~=¢¨€LþÅÞÒ~!öº»ÏVðc˜’ïJû´-íÇç´QíÏÙ´_qÝÅø“'x`y¿ÃøËœ_ê>>ÖuÙïÐ…ß>pØÔKû‡UÍßÈûupKÕþßAøûoYù¾Nío˜4h?)Šþ“†ðË1>$ýTó±À>þOdþdÿ[·[e ÀìÓ. ~/)÷©„_Sÿeÿ ÿŠþRþíÊߨò~Êú)é@•üæÍ í>\#×ßEY?…gÚoØ~=ÔGþM²_û\¤ýOu¹ÏðýôœQIáû5ý3Õá×#R~â;²_åüTû3 R¤ü¢»O0ßÇ÷±wEîñ7µÏÒþ:ówjÿš«ö»´WfÞoô£@Ð,¿ììü_äû‚þ„ñu‡ö÷ëš¿‘÷[)¿½Ãó}cدCÿyÿ”îó³úù•ù—%ÿ)ìé{=eËù ío•UÿV™ðËÑ>ªòGy»RûgÇVŸŽç­¿Çbä¯ÕõW£³ÿFÕÝ'Jïßj÷Iþ‰÷Ž´ëý.ôWÂ/ºûóéo9Ô~‹ýV©Ÿ^«:¿òšû2ûÏHÐ#¶¬ä~ÖªøgDÕ¯ÇR~à'ºûðQhž1 ƒÁ`0 ƒÁ`0 ƒÁø\üƒÔ endstream endobj 74 0 obj <> endobj 75 0 obj <> endobj 76 0 obj <> endobj 81 0 obj [/Indexed /DeviceRGB 255 <000000FF00006B6BD2FFFFFF666666FF66667B7B7B6666C24A4AB96B6B6B4242 B1F30000FF9090B1B1DA888888737373B1A1A1FFB1B1CC6B6B181818FF33337B 7BCC6666B9E33333B9B9B99090D2DADADA8888CCB98888FFC2C2424242E37B7B FFE3E3DA9999FF1818FF7B7BEB2121B1B1EBFF4A4A8080D2C2C2E3A9A9A93333 33F33333D252529090E3DADAF3CCCCEBEB1818FFA1A1999999A1A1DAB99090FF D2D2525252EBA9A98080E3A1A1E3EBEBF3080808FF08087B7BD2FF73737373C2 5A5AB9B1B1B1292929FF4242E34242C2C2C2E3E3E3DADAEBF38888FFF3F3EB90 90FF2929FF8888C2C2EBB1B1F3FF5A5AD2D2D2EB4242E34A4A9999F3CCCCF3A1 A1F3C2C2F37373D2FF6B6B8080806B6BC26666CC5252B94A4AB1FF9999B9B9E3 B1B1E3909090B1A9A9FFB9B9D26B6BCC7373212121FF39398080CCE339399999 D29090DAC28080FFCCCC4A4A4AE38080FFEBEBFF2121FF8080F32121B9B9EBFF 52528888D28080DA393939DA4A4A9999E39090EBE3E3F3DADAFFD2D2EBF31010 FFA9A9A1A1A1A9A9DAB99999FFDADA5A5A5A8888E3A9A9E3A1A1EBF3F3F3EBEB FF101010FF10107B7BDA7373CC5A5AC2CCCCCCEBEBEBB9B9F3B1B1FFD2D2F3CC CCFFA9A9F3C2C2FF6B6BCC5252C2D273739999DAC28888F329298888DA9999EB E3E3FF8888EBA9A9EBF3F3FFD2D2FFF7B796FC949005E770C2F0F4F7B82899EB 94F741F7FC9490F7B84E6D892D05E770C2F118F7B77BF741F7FC949003EE8803 D600F713EE00016FF7A2E3007DF1C2F164000FF8DF0008402004F7A3A0C40000 1F200C000FF8000000C4000CC40000DF0008000000F713E22A001EC4000CDEFD 30C2F18CF7A10E03EE8803D60000000305E00FC2F1A800E44A05E0F8000032F7 B9C59A3DEC000030001DE803B600C2F1E000CD7C00000900CD5C000000FF92D0 05E10005E17003B600C2F20400CD7CC2F21000F56A033238FFFFFFC2F2780010 260000300021F9000028FF92D0601232FF94D0FF92A005E100F432F805E100C2 F22C66E8880000006021D3FF92D0F432F805E100C2F26C66E94B00000060D91D>]endobj 80 0 obj <>stream xœí} Oi–¶s1Ónó!H ‚Âf0IX&|&\‡5Ù| .FÁËe@_˜ F€Âm#I‡ÉÆÍF ¼?tÏ9ï¥Þ*@fâäö‚ Æ—AçbSHôïÝœiñ×­ôÆ |E ã‹`c±ªw ~~^±Iäo*ô%1Œ/+óŒÕû'6+6Áö³ò3ßBÁxo¨xÌïŸh‘¿B_ƒÁøhÙXœ{2PÜ]ï÷û»Aø¹«ÁøFp3¸Ÿ u‡zçªxƒñm`3Ä¡ýÅÐB¡¹3…¾ ƒñ…н±ØTõ$„xRÅÓúŒoþ`0^UÕ47×gî3ßî÷nãKñÅ•_ }) ãËâ—¿ßߢ©½×Â`0 ˆë}…¾ƒQT³ø3ß(n3ûŒoÑB_ƒÁ( b· } £0ˆ²ñg0¾MDÙø3ß&˜ü Æ7ŠëìûŒooXúŒoi&?ƒñ­àæó ¿_/äã®ü­µ_ð‚~ëë…¾ã7Ÿ·øWz—:7®|×ùžÔëFþÉ|_ôÒÎÇZÏwTè‹`0þA1S/‰òW6®t^¹Ò Mþëyä_?ðùþ—?× —Âäg0.‰ûÀxã †zõn,Zm;{­Ñ÷ïÿ[È¿ñù²L~ãÒ~'(Ÿ¯P °”?=4NÍ=óù’¨¶]¸Nî–ŠkI2ùŒKÂOt¯j©ðw^¿¡üѨ1©¿•ˆbë»V€ë´aý\^ +?ƒqiÜDÅ‚G3”ñ9¿Yï›üA2ß—ÌØö?˜Ïd“Ù$\+?ƒñˆåïÓÑXçw6å¯Öä§:!YhåÏmõ3@~V~ãó0°Ñ¹!Ž&déO+4:(^S…6‹;Tþ7…¸VDi&›Aîù³>îçg0. g°Sµl!@“äÔÂ/Ò}‚ü€ú@ÿd6+²V~㲘Yê\zNGcADgç†$ÿmÝÑ×*óý¬(ùÔögüÙ üŒÏÅÍÅ`pf—‚ ý@AþÃh4-ϱ+a ~D~¬øù²lûŒÏBïÒâRh³Â_ BÀ Èo ?)¿¦~mf¹ŸM²íg0>þÅx|1¾ø!þ!aø$òGÑ}¨üY‹ý…·ýÄþ$Û~ã³P¬ÿP¯Š ,Å—üףј>¥Õ&üÙB“?+J~äüïòZŒlܯB4‰†ô_ôÓL~cX¿™óg}ÉÆ|ãÚèëöð~*mwwyxïã×p:üëÙY8ŽÐgÚÏú_{jFTüPù“IV~ã3ðóœDÕñ c|Ï|¾?(É—ìÅæøº½©ðþ~d?Lã^ ¯6œÏeÀéò*œFàùRûíkÎó¦J!ßÇFôïÉRw]l\øc0.ŒÇOû逹/GõËQ}IÓö'³è¼3™Tþ—­½ìÚOõS¤û€×ÀíÝÿ>ïçOV‡VOV"«4æá“?^:,ÃÔ¸`þ¸èë“I¿;ãâ(Ö?é}ÒÛ;ÛÜ\SÕDLíóŠQ}¶j?xnâþxžòçºà>)ŒJt&ú¯6ä\|xHpÿ%Š?6éýáKöSvFùýã2é—}D8bò3—¿7ê õÂz‚ìŸû'£Øgé½:H’éGÔ8¾ho>±OÔßGþ*âõONVON]~ûס“!|t?ŒÊOQƒØIì›ç"ùÉ÷Ó ¿lR;òñãRh …B+ÐBž„zç~3 ýF²o R(¿Ãö¯ãß—ôO¡‚£éôzƒ¾çgþ£C#'CC@þW-å—ÒI$Ì€AäÏ’ñÏR¹ß¢>+?ƒqÜX‘Qèý-–Óoúœ@Ê÷3™yÛ×ìu%ÒôƒòHÈW¥ò¯"ÅÚ:424´{‚äÔ틤63¾ùµðgù…+ö2Œ‹âþ€ÄÊÊñÿ/­7¶™õ¾,ÖÝl9n^Ⱦþyð°HãWQ×ÑÞíæì¿ündhw„„ÿääDÿ0±¬? ?|á²uvƒ~Ó÷[®„•ŸÁ¸8~(¦FüýÿÆ›NÛïÓõ>‡ò¿ÝGîKáO…SaUëá‚ ŒüjûáW#€¡]Š (þ»ïÎPýQù÷¥ö'ö­Ó…ògÇůÓ0ëêXùŒ‹ãfw1Bñ`eÓxÓÅô'E_ßxÖ$s‚È¿¿Of=œŠDVwÏ^*ú½GvGFliÿè±DP_†½³U•õ§(–XÒß  ~Ö0V~ãsð˜È?V,B¿ÅxÓ-çÝüY[Á¯Qr;ùQ¶w‰æ¹_¥ðCÊOLkþð[úÓ‰ ÿOê¯Ã`üçUo_"ѧËj–Ä_¬èa]+?ƒqq<öuwûíÊŸWíOf{¨ânöóß½Šäߗ‰h½>¢Z?æûCÄSú‡FýÉõ[oìb¹ÈIääe¿êÓ0®ËýjjU‹`åg0.·€äÿ@…ñ^žîõ³Rû Û?Ü¿ M°×zg;ù‡PÞIù²ÞÙCê¿Bã?tbô…_î6ŒöŸ:û¦ˆúBû1Ð"ž¬ü ÆgÀß]è®Gþ#û7'´›å>_6LÿÞÕ« I}ª÷åŒ÷ND±ì=ÁzãT ?ÕûOÞ}âÅjî ågÅg0.çâ›þz’ÿâ çZ åÙÏ¿Qgâ*¥ü²à×`¾Òä¦b?°ý­¥ð¹·Èþ·ôŽóý„é´˜‡œØ×ƒ¦Ÿ'ô0Ÿ¿±¼¿ ù³¦ïÏŸÏ?ÂÒ/¹i6ß;¥þ!)ü#µÞQÊ/»úWëg££Ín£€ Èr¿˜Ù“dåg0>é3Ù_ßíF~£“?ébûß_¥”_VüÃ~¥ò á7ëýôRÒÿDŒðÇ©½‘ðnÿiUc|Øö3Ÿ‹XßðþŸ-úÍ8O±­á—Í_Ìc„_Ò?’Ûß=#é—"ÿÖHúÿ›Ê}¤üb€¿œÜüO¥vïæ\/7#†øeiF?Oèa0.ëÑ´wÂoÙŸ¯üz4 ÖûòÉß|ÕÈù#‘HûIûnûî¶³wgTî“Å~hVfŸÃ”_)ÿÍ ¾4-(Ùop+ŒÓ¼½€/“ŸÁ¸q±®–– „fÿŒó,Û~.ä§^þ„®ö›Ëøà„>Tþ!9Êgä­Áè¿êœ_ð%åËñ½)ç„~‚ZɇÆösÎÏ`\bîîf ÂbÿŒó´‘¿áêUQï¾GçÍÓ}ò“!1ÆG)¿9ÌÇÈù‡TÒ/föÐJ@ûûgy—lüàjšóN`0‡\¤s`ÐßüY‹û.ýüS ´ýªÚŸ@ÛNÚ/çõœ¨‚ñß\ÐkïJùMåˆ~`üö^C„îê˰ò3—…Z¤³bsSð_°¿þ†óDSùÝ ~ V¹’~þ”X¿/,øIåG¡·­æ·÷VŒÔ·ôÐËy8Ù­”?Ë9?ƒqY(î?ž©ûÏU~Ëõ»ÙþI³Ú/&öÐ^±Ž‡˜²«¤ß¾”gî?‡dÊ¿z"‚)D(?.äçø­ŒZÊGäülûŒ ã0z]ùgff*Èúûgœ§ZÕ~*÷çð›Õ~k”ϼ´ý‘°š×£êýNò{½§ÿI¿Ö}±–Ìùû Ǩ}]ìϰò3—BßmuWŽŸgfn û+Ðø»“ß>³'o„_s¾ò‹¥|(é²ÿ<ò{ñž# ü/UüHøi^ŸsÔÀ¸X»;ÃÕ~ã’°îÁûóù'>Jþlþ:E??P_Tûç§§kÐöâpÎõœ¿;‘®^ÌçO!õ÷‰œíùÊß®gõ‘úæÊ{©ˆUïK$–moÊÛu‰A>¬ü ÆE¡ïŸ®æÆïåüëæb^Ùd&ï뎤í—+ùØjt¹ß£»wz:<üÓÙÙªÉâZ¾“ï†ï´/ù›‘KyHåŸü¤ÿ\ƒ!q]õñ#€ø7ˆûçVû¬•2if ꃜu ñ“S{‘ý~ãûXÆ;ûixô•}a®W¿þôŽº÷iBϪ¹’O¿Èùé ¯:rþ.P~ZFL(¿ìyàî~ãÓPm¸þDz§]ÿ„ë¿ucJ/®Ü]:utw»+c¸ûVáûåœÞýˆõVƒ^»ŸîÌ1¢~{ÿðoâ^]«ÏDÂäÏÙ®¥±Tß±'‰~¤±}ª6yð·øWa0¾ÜÖwáõz®æ›ÂŸ?¯Ù6+í=Xt›²ÎÈIòÓHŸÈ~*%Ù¿&‡í…Qßi!ÏœúÈ«= Ÿ`Ý‘{]?Ú~rýÖÚÝ„F½x¯yûàäßè†ÁøÊÑ­¶Rþ_**Ôð^Êøëýÿ7ï>›ôc;ÊïkãŒvs˜ÎÇ 7Œö¾”ÔÇÁ{â†\Æ*^'CrmO9£'<šÃ?ï5¤tOÖûS{ÚEO_FŒñÑø[þó0_/Ž>ïÍŠMIý‰s¦ôz3ö™=”rÛoו벆øÒŒ~q“nû}ºWmkôâÊž«òîÜrdßnûnX ðÙÜ/áè7œ”Â/”_oÓã«EµYïÚcÓsúüÝ3y¨±I?òÍ·mÎÍ‘îí£Ûõí«™}4Ä_êÿÉIÎøDîäÄä¾ÝgõóEð wíWâmÜÇ‘ý>¾cƒqA˜äÿ¹¥E®å1¡–ñšÉûÀ¤©üú>½öþþvYò»º/²~âp8bQ(n/Üë„_Ýw>¢—ñÀé¼h$rÎk—Âï3oÒËýý Æ'!jÿ—‰–‰½ŠW½¿¾Û…ü9Û=»ô}zí'Í'(ë$ôr>á”pþ’ú«Î¹w«Öd¾°^ÄCÌé‘ý|ùƒZ³êf]jØnÜßÏ`| ¢FOß ÿ6Å}¼oOÞžŽå<|IºQ¯“ü¹°ãK¦ù}b–®S÷»V¾§¤ÂÒò§h= ü®¿æ}Ä»7žµ:ú4Ú?÷ß„Áø&`*ÿ¦céÞn—›vÞ›Ê/´?›qŽá?KÐðþ«2éW{åb~n#ýÞ™sø#j6_Šfó%ö#®“&3bÙn›i½ü¿ƒñ á¶EþÇzÝîz¡ûn·ëäžÔ÷ɂ޸º£ÒËôòNÝ)¹œW$üSÎõRŽ„á§•»ÂF­…?õNy±Ž‡-áQ> ƧÀPþ›@yâ=4y«¾üu"r]û‘üI`¿Ë Úá”è—Py?!Ü;÷bFOÔŠ½ÒóGhh_äìü¹“ìp°i?“ŸÁøD«£êf-HzÁüzy—î7åÕd²–öÌ¿vP:ÚŽºäO…çwï~däýéðÙ‰òü4¶/uÒ_°aªÖ”ýÄñòƒß?ŸÁ`bzxïc}{nIý±âWå>>::ZoþØŒýWk¯ÖÄj>Ÿ|Qê§á½Â\^Î'žÎ`0ƒQq·¯÷—n…1BqñÀÀÊïŸÁ`üCã ø~q´9f˜Ügò3_/¢Ñè!î×kæ÷WZ }y ãï…ê¨XÊç9¾˜hOªÜ…˜ü ÆW‹¾¨ä7t/–¢~Áäg0¾^û¯{½cHxE|IýÞ¹‰B_ƒÁø»!Åš_Eh%´‚¬³/˜êí›cåg0¾b ‚ôGBÈþf>P¸ÏÊÏ`|ÕÀ¬ÿ@wÚˆø`ø‘úMMþB_ƒÁø{¥ÿ7ú^¤}¯Ð|ä~0(ˆÇk  Ø`D‡öí×­ØÚ·Û[U;/$`4 ‡ý1íÙ÷hýÿÄÿm1¸ º¿|'€þz«îá`90>FB=»S‚ìóîÌvô:hØp%FŠ’ÙXÚOe-#¯C;à-¸³0ˆ~¿£Ž–¯ë0Ïi[hÃìÂû¢Òƒ!¡­r– ±J¢}Y]ú‚­…E”Q<ž‹åü–æ›Òo ì™MÐ<½G> }®öŸ>85èoñœ8ß¼ö Ù­h¿$‡‡ØÐ¬K7 Žá@÷©MXE÷#hÃJûG%ñiwËlŠñ¸5yKcRøIý~;é—÷‘ößOM‚ðO~?e6EðÈ{`?6ê#í[‘îÛí†%  6¤=vÏZ%ÿéÙ >0_qý˜žk„-˜·”ŸœB#n©šFxn´¸ßˆÜo´´ß&þëkmD×Ú ŽDÄGšÙáàGhHtr?RC¼/ŦP|—dÇnÄthÁ}â|¾ê)U„—ÜïÁ嬀ö¸¨º‚,nÂøp‡/ðöZ´è…XçÒ"ÿÅÅ¥xü7,ûýWÓ"ÙýÅÅà´ ù©Âm«{8‹‘òw$?p\áNݬ`{Ñ2à¡é‚ž:.£W]ûï -ðUvà7¥á é“uóœ’_Í=ôõÓ 1V½;++ñ¯áÃø±jØÅ.B}—(3viÒ~öôþÁyÚo×} þÞšMøÅ4gü›=pŠ?i¿Hš…ðÛÄŸ( •²¥ûÃnÀÝ~up«ßˆyªßO´¿µ,èkR‡bÿÔÔ䔡ü¦P1`Usaý¿ßކ͖´£êߤð‹½]÷Qõå^„€VKôÿÏ5ØTN`—}|Týy¢;<”ú7ZÍzì'í·YýÒ5°é>„‚kZ÷1àëT@(ÿÔý§OÇŸ"åi/--5%ßd$  ‚~´ÿúÔ”ð‹-ké?ŸêÿúǽKAäz$þŽþöaì>¼ ;ƒ6ò— ¦nÕŸ1⸠‘gyžö*ëLò×S…š;•m·­c«Þh¥çE>ùÓm•Èö¨`;üNG”XN¢m–ªJ ñ³fÁàSèoùý\^[ÚEûÅÞ]û ö›ªoj¿®4ÛËk¦ò?²ë¾Ò~Cù×µÝ?’H?,µ_‰¿Cûï’ðdXÖz/›¤~¿aü%ó—…ç—Ú?)ÔßÔ} (÷ úÀý)Ãú;tÉßÞJÛ¶!üZ÷Û¡µ¶Ãó±6Rú•ë—–_ÿXk¿|¨ÂÀ<ÑÞR~“þ û5]`ìÊoñ^»WíWºÄ¿&ŒÿS²ü:ï?Ê/Ô_˜~|HÖKá—q€èýC)Ñ^k¿f¿”~8øAZ±vµd~’¨/´ö —Ÿ•¼'êÓß²šüõÀsäz0ø¯ÿGûýñ½Øè„f#êô½Ù鯄ò{ªù%ëbH¢K ò÷É¿Ùu\uü-²ÇŠ®ÏzòÈß7}{‡¾IüŠ·dzº#`½”D¼úð½@삾ߌ.Å?þ¼"à=öÎ×þ½SS÷Úß,ÙeßEù­ò_3é¾~<Àl)¿®Ú]­ûÃ:ëwhÿ­~Cùïjí_6ó}ñ÷kí—•ïʯ´_Å€×È{tû–÷ÝŸ²åû¢¡÷Ý*”¿µÝ,á[[-ÁoÕOZûI÷üHÿg†æ«ä=¥ü˜üká×A e…€®FWt5v]k¼ÖUÛu­ËUûµî“í¿&…_Š>=¿Mè?E’~ÓúK`©öãš÷ãvíÏëïùAi&©š¢¿ÔþŒÖ~"¾Èõ³Û X ±òG4ÿÑ¿,mtv¯t^±‘ŸJóŽ-¨¬M“Á®ö´íx0 zh7íÑl‘ßëé»;1›'­óp£Eõ‹Ù<òÇ*ËËMò{^D©œ¯È§:–Æ«óP ©óô]LùÍBŸ“úJûEÕ/m¯ùS;GûAùO䷴ߪó­iöËðHª¿¡ÿGÍ–ö7«¼_è¾,õ©@0_i¿æ¿%ýH}þ»†õy¿~Ò}§òkö[¼'íŸt~Ù€1€lD€©ísŠ}ÛDúvÊûÛ-í?&ío•vÍ¿`¾!ýó¸ÕKÅ—ûg¦öÏ+áGç¯6Óù§„ô7Ú­€Úk°á£K‰¿Mû­Œ™MýI÷§ïÔíéSÅþ[ѯÔHdª?Žâ/ÆõÇ•ç_ú„Û·©D⟥[júä--Í‚ßãP'ð|ã xüà*þŸ¢èþ£þËÿÿ°ñ ºïknm"}O“òƒ°W")Óƒ“-$#ïê<1'ùït”‹à±Yzñf]™†(ìÚòÈuJÛeRoYâ xÚðc垎 uõÙ‚€KÏŸ—”ß)þB÷õ]´ß©ûμÿ•tkpdïÌKüåi¿Ðÿõ#;ý…0µßVï7´_øÿ~³âÒ¯u_)¿ ·–ÏÑþ)ËX1à{¡ý´ÕñÚöŸ„[$þöÎ@$;Ðÿeë±ØTõï™,ø¡òߟKñŸ¯12~É|!ùêXûS5–æKÆ+÷/F¨íïß…´wA+hç/»~|o6Jd’þ÷¥FÞ/CÀ¸¦©©û¢Ê/{þ¤ ûb‹¼3¬Tÿ¬ ½Èû…óÏêq×¹•.@ü?ß²qeãÊ•ÎNÜÑ3Ä‚¥ùcuTàv´Z÷»‰ìÚã½#l¬ˆXX$U˜̦¤Ü´ý^ÙùîU¹|ò£“Ç‚ßV>ùÛ:›–Ah:0h¼„ÏâW÷Űᢠûí!À .Í=çGíß;gðO>ý8JþÍkhûÖ_Ëÿš~›ö«´ÝMùlõþa©ûŽa?*Õ¿%^P@‰ÿ¤j’úùÚ?µl)ÿ¤*øOé^?5ö=?Ù}cô=(Û/ˆ/°-+ôLº/©ÿRåüÊjŽçIúíŸÊ/çµù¯‘Ù¾­æ§´^°¿F¿@î×BÂÔ'þ»û±èÿãÁ5£äoÚcèÏ{½·[YúÏH¿/[©æ½Ùß/¸}~=¢¨€LþÅÞÒ~!öº»ÏVðc˜’ïJû´-íÇç´QíÏÙ´_qÝÅø“'x`y¿ÃøËœ_ê>>ÖuÙïÐ…ß>pØÔKû‡UÍßÈûupKÕþßAøûoYù¾Nío˜4h?)Šþ“†ðË1>$ýTó±À>þOdþdÿ[·[e ÀìÓ. ~/)÷©„_Sÿeÿ ÿŠþRþíÊߨò~Êú)é@•üæÍ í>\#×ßEY?…gÚoØ~=ÔGþM²_û\¤ýOu¹ÏðýôœQIáû5ý3Õá×#R~â;²_åüTû3 R¤ü¢»O0ßÇ÷±wEîñ7µÏÒþ:ówjÿš«ö»´WfÞoô£@Ð,¿ììü_äû‚þ„ñu‡ö÷ëš¿‘÷[)¿½Ãó}cدCÿyÿ”îó³úù•ù—%ÿ)ìé{=eËù ío•UÿV™ðËÑ>ªòGy»RûgÇVŸŽç­¿Çbä¯ÕõW£³ÿFÕÝ'Jïßj÷Iþ‰÷Ž´ëý.ôWÂ/ºûóéo9Ô~‹ýV©Ÿ^«:¿òšû2ûÏHÐ#¶¬ä~ÖªøgDÕ¯ÇR~à'ºûðQhž1 ƒÁ`0 ƒÁ`0 ƒÁø\üƒÔ endstream endobj 82 0 obj <> endobj 83 0 obj <> endobj 84 0 obj <> endobj 89 0 obj [/Indexed /DeviceRGB 255 <000000FF00006B6BD2FFFFFF666666FF66667B7B7B6666C24A4AB96B6B6B4242 B1F30000FF9090B1B1DA888888737373B1A1A1FFB1B1CC6B6B181818FF33337B 7BCC6666B9E33333B9B9B99090D2DADADA8888CCB98888FFC2C2424242E37B7B FFE3E3DA9999FF1818FF7B7BEB2121B1B1EBFF4A4A8080D2C2C2E3A9A9A93333 33F33333D252529090E3DADAF3CCCCEBEB1818FFA1A1999999A1A1DAB99090FF D2D2525252EBA9A98080E3A1A1E3EBEBF3080808FF08087B7BD2FF73737373C2 5A5AB9B1B1B1292929FF4242E34242C2C2C2E3E3E3DADAEBF38888FFF3F3EB90 90FF2929FF8888C2C2EBB1B1F3FF5A5AD2D2D2EB4242E34A4A9999F3CCCCF3A1 A1F3C2C2F37373D2FF6B6B8080806B6BC26666CC5252B94A4AB1FF9999B9B9E3 B1B1E3909090B1A9A9FFB9B9D26B6BCC7373212121FF39398080CCE339399999 D29090DAC28080FFCCCC4A4A4AE38080FFEBEBFF2121FF8080F32121B9B9EBFF 52528888D28080DA393939DA4A4A9999E39090EBE3E3F3DADAFFD2D2EBF31010 FFA9A9A1A1A1A9A9DAB99999FFDADA5A5A5A8888E3A9A9E3A1A1EBF3F3F3EBEB FF101010FF10107B7BDA7373CC5A5AC2CCCCCCEBEBEBB9B9F3B1B1FFD2D2F3CC CCFFA9A9F3C2C2FF6B6BCC5252C2D273739999DAC28888F329298888DA9999EB E3E3FF8888EBA9A9EBF3F3FFD2D2FFF7B796FC949005E770C2F0F4F7B82899EB 94F741F7FC9490F7B84E6D892D05E770C2F118F7B77BF741F7FC949003EE8803 D600F713EE00016FF7A2E3007DF1C2F164000FF8DF0008402004F7A3A0C40000 1F200C000FF8000000C4000CC40000DF0008000000F713E22A001EC4000CDEFD 30C2F18CF7A10E03EE8803D60000000305E00FC2F1A800E44A05E0F8000032F7 B9C59A3DEC000030001DE803B600C2F1E000CD7C00000900CD5C000000FF92D0 05E10005E17003B600C2F20400CD7CC2F21000F56A033238FFFFFFC2F2780010 260000300021F9000028FF92D0601232FF94D0FF92A005E100F432F805E100C2 F22C66E8880000006021D3FF92D0F432F805E100C2F26C66E94B00000060D91D>]endobj 88 0 obj <>stream xœí} Oi–¶s1Ónó!H ‚Âf0IX&|&\‡5Ù| .FÁËe@_˜ F€Âm#I‡ÉÆÍF ¼?tÏ9ï¥Þ*@fâäö‚ Æ—AçbSHôïÝœiñ×­ôÆ |E ã‹`c±ªw ~~^±Iäo*ô%1Œ/+óŒÕû'6+6Áö³ò3ßBÁxo¨xÌïŸh‘¿B_ƒÁøhÙXœ{2PÜ]ï÷û»Aø¹«ÁøFp3¸Ÿ u‡zçªxƒñm`3Ä¡ýÅÐB¡¹3…¾ ƒñ…н±ØTõ$„xRÅÓúŒoþ`0^UÕ47×gî3ßî÷nãKñÅ•_ }) ãËâ—¿ßߢ©½×Â`0 ˆë}…¾ƒQT³ø3ß(n3ûŒoÑB_ƒÁ( b· } £0ˆ²ñg0¾MDÙø3ß&˜ü Æ7ŠëìûŒooXúŒoi&?ƒñ­àæó ¿_/äã®ü­µ_ð‚~ëë…¾ã7Ÿ·øWz—:7®|×ùžÔëFþÉ|_ôÒÎÇZÏwTè‹`0þA1S/‰òW6®t^¹Ò Mþëyä_?ðùþ—?× —Âäg0.‰ûÀxã †zõn,Zm;{­Ñ÷ïÿ[È¿ñù²L~ãÒ~'(Ÿ¯P °”?=4NÍ=óù’¨¶]¸Nî–ŠkI2ùŒKÂOt¯j©ðw^¿¡üѨ1©¿•ˆbë»V€ë´aý\^ +?ƒqiÜDÅ‚G3”ñ9¿Yï›üA2ß—ÌØö?˜Ïd“Ù$\+?ƒñˆåïÓÑXçw6å¯Öä§:!YhåÏmõ3@~V~ãó0°Ñ¹!Ž&déO+4:(^S…6‹;Tþ7…¸VDi&›Aîù³>îçg0. g°Sµl!@“äÔÂ/Ò}‚ü€ú@ÿd6+²V~㲘Yê\zNGcADgç†$ÿmÝÑ×*óý¬(ùÔögüÙ üŒÏÅÍÅ`pf—‚ ý@AþÃh4-ϱ+a ~D~¬øù²lûŒÏBïÒâRh³Â_ BÀ Èo ?)¿¦~mf¹ŸM²íg0>þÅx|1¾ø!þ!aø$òGÑ}¨üY‹ý…·ýÄþ$Û~ã³P¬ÿP¯Š ,Å—üףј>¥Õ&üÙB“?+J~äüïòZŒlܯB4‰†ô_ôÓL~cX¿™óg}ÉÆ|ãÚèëöð~*mwwyxïã×p:üëÙY8ŽÐgÚÏú_{jFTüPù“IV~ã3ðóœDÕñ c|Ï|¾?(É—ìÅæøº½©ðþ~d?Lã^ ¯6œÏeÀéò*œFàùRûíkÎó¦J!ßÇFôïÉRw]l\øc0.ŒÇOû逹/GõËQ}IÓö'³è¼3™Tþ—­½ìÚOõS¤û€×ÀíÝÿ>ïçOV‡VOV"«4æá“?^:,ÃÔ¸`þ¸èë“I¿;ãâ(Ö?é}ÒÛ;ÛÜ\SÕDLíóŠQ}¶j?xnâþxžòçºà>)ŒJt&ú¯6ä\|xHpÿ%Š?6éýáKöSvFùýã2é—}D8bò3—¿7ê õÂz‚ìŸû'£Øgé½:H’éGÔ8¾ho>±OÔßGþ*âõONVON]~ûס“!|t?ŒÊOQƒØIì›ç"ùÉ÷Ó ¿lR;òñãRh …B+ÐBž„zç~3 ýF²o R(¿Ãö¯ãß—ôO¡‚£éôzƒ¾çgþ£C#'CC@þW-å—ÒI$Ì€AäÏ’ñÏR¹ß¢>+?ƒqÜX‘Qèý-–Óoúœ@Ê÷3™yÛ×ìu%ÒôƒòHÈW¥ò¯"ÅÚ:424´{‚äÔ틤63¾ùµðgù…+ö2Œ‹âþ€ÄÊÊñÿ/­7¶™õ¾,ÖÝl9n^Ⱦþyð°HãWQ×ÑÞíæì¿ündhw„„ÿääDÿ0±¬? ?|á²uvƒ~Ó÷[®„•ŸÁ¸8~(¦FüýÿÆ›NÛïÓõ>‡ò¿ÝGîKáO…SaUëá‚ ŒüjûáW#€¡]Š (þ»ïÎPýQù÷¥ö'ö­Ó…ògÇůÓ0ëêXùŒ‹ãfw1Bñ`eÓxÓÅô'E_ßxÖ$s‚È¿¿Of=œŠDVwÏ^*ú½GvGFliÿè±DP_†½³U•õ§(–XÒß  ~Ö0V~ãsð˜È?V,B¿ÅxÓ-çÝüY[Á¯Qr;ùQ¶w‰æ¹_¥ðCÊOLkþð[úÓ‰ ÿOê¯Ã`üçUo_"ѧËj–Ä_¬èa]+?ƒqq<öuwûíÊŸWíOf{¨ânöóß½Šäߗ‰h½>¢Z?æûCÄSú‡FýÉõ[oìb¹ÈIääe¿êÓ0®ËýjjU‹`åg0.·€äÿ@…ñ^žîõ³Rû Û?Ü¿ M°×zg;ù‡PÞIù²ÞÙCê¿Bã?tbô…_î6ŒöŸ:û¦ˆúBû1Ð"ž¬ü ÆgÀß]è®Gþ#û7'´›å>_6LÿÞÕ« I}ª÷åŒ÷ND±ì=ÁzãT ?ÕûOÞ}âÅjî ågÅg0.çâ›þz’ÿâ çZ åÙÏ¿Qgâ*¥ü²à×`¾Òä¦b?°ý­¥ð¹·Èþ·ôŽóý„é´˜‡œØ×ƒ¦Ÿ'ô0Ÿ¿±¼¿ ù³¦ïÏŸÏ?ÂÒ/¹i6ß;¥þ!)ü#µÞQÊ/»úWëg££Ín£€ Èr¿˜Ù“dåg0>é3Ù_ßíF~£“?ébûß_¥”_VüÃ~¥ò á7ëýôRÒÿDŒðÇ©½‘ðnÿiUc|Øö3Ÿ‹XßðþŸ-úÍ8O±­á—Í_Ìc„_Ò?’Ûß=#é—"ÿÖHúÿ›Ê}¤üb€¿œÜüO¥vïæ\/7#†øeiF?Oèa0.ëÑ´wÂoÙŸ¯üz4 ÖûòÉß|ÕÈù#‘HûIûnûî¶³wgTî“Å~hVfŸÃ”_)ÿÍ ¾4-(Ùop+ŒÓ¼½€/“ŸÁ¸q±®–– „fÿŒó,Û~.ä§^þ„®ö›Ëøà„>Tþ!9Êgä­Áè¿êœ_ð%åËñ½)ç„~‚ZɇÆösÎÏ`\bîîf ÂbÿŒó´‘¿áêUQï¾GçÍÓ}ò“!1ÆG)¿9ÌÇÈù‡TÒ/föÐJ@ûûgy—lüàjšóN`0‡\¤s`ÐßüY‹û.ýüS ´ýªÚŸ@ÛNÚ/çõœ¨‚ñß\ÐkïJùMåˆ~`üö^C„îê˰ò3—…Z¤³bsSð_°¿þ†óDSùÝ ~ V¹’~þ”X¿/,øIåG¡·­æ·÷VŒÔ·ôÐËy8Ù­”?Ë9?ƒqY(î?ž©ûÏU~Ëõ»ÙþI³Ú/&öÐ^±Ž‡˜²«¤ß¾”gî?‡dÊ¿z"‚)D(?.äçø­ŒZÊGäülûŒ ã0z]ùgff*Èúûgœ§ZÕ~*÷çð›Õ~k”ϼ´ý‘°š×£êýNò{½§ÿI¿Ö}±–Ìùû Ǩ}]ìϰò3—BßmuWŽŸgfn û+Ðø»“ß>³'o„_s¾ò‹¥|(é²ÿ<ò{ñž# ü/UüHøi^ŸsÔÀ¸X»;ÃÕ~ã’°îÁûóù'>Jþlþ:E??P_Tûç§§kÐöâpÎõœ¿;‘®^ÌçO!õ÷‰œíùÊß®gõ‘úæÊ{©ˆUïK$–moÊÛu‰A>¬ü ÆE¡ïŸ®æÆïåüëæb^Ùd&ï뎤í—+ùØjt¹ß£»wz:<üÓÙÙªÉâZ¾“ï†ï´/ù›‘KyHåŸü¤ÿ\ƒ!q]õñ#€ø7ˆûçVû¬•2if ꃜu ñ“S{‘ý~ãûXÆ;ûixô•}a®W¿þôŽº÷iBϪ¹’O¿Èùé ¯:rþ.P~ZFL(¿ìyàî~ãÓPm¸þDz§]ÿ„ë¿ucJ/®Ü]:utw»+c¸ûVáûåœÞýˆõVƒ^»ŸîÌ1¢~{ÿðoâ^]«ÏDÂäÏÙ®¥±Tß±'‰~¤±}ª6yð·øWa0¾ÜÖwáõz®æ›ÂŸ?¯Ù6+í=Xt›²ÎÈIòÓHŸÈ~*%Ù¿&‡í…Qßi!ÏœúÈ«= Ÿ`Ý‘{]?Ú~rýÖÚÝ„F½x¯yûàäßè†ÁøÊÑ­¶Rþ_**Ôð^Êøëýÿ7ï>›ôc;ÊïkãŒvs˜ÎÇ 7Œö¾”ÔÇÁ{â†\Æ*^'CrmO9£'<šÃ?ï5¤tOÖûS{ÚEO_FŒñÑø[þó0_/Ž>ïÍŠMIý‰s¦ôz3ö™=”rÛoו벆øÒŒ~q“nû}ºWmkôâÊž«òîÜrdßnûnX ðÙÜ/áè7œ”Â/”_oÓã«EµYïÚcÓsúüÝ3y¨±I?òÍ·mÎÍ‘îí£Ûõí«™}4Ä_êÿÉIÎøDîäÄä¾ÝgõóEð wíWâmÜÇ‘ý>¾cƒqA˜äÿ¹¥E®å1¡–ñšÉûÀ¤©üú>½öþþvYò»º/²~âp8bQ(n/Üë„_Ýw>¢—ñÀé¼h$rÎk—Âï3oÒËýý Æ'!jÿ—‰–‰½ŠW½¿¾Û…ü9Û=»ô}zí'Í'(ë$ôr>á”pþ’ú«Î¹w«Öd¾°^ÄCÌé‘ý|ùƒZ³êf]jØnÜßÏ`| ¢FOß ÿ6Å}¼oOÞžŽå<|IºQ¯“ü¹°ãK¦ù}b–®S÷»V¾§¤ÂÒò§h= ü®¿æ}Ä»7žµ:ú4Ú?÷ß„Áø&`*ÿ¦céÞn—›vÞ›Ê/´?›qŽá?KÐðþ«2éW{åb~n#ýÞ™sø#j6_Šfó%ö#®“&3bÙn›i½ü¿ƒñ á¶EþÇzÝîz¡ûn·ëäžÔ÷ɂ޸º£ÒËôòNÝ)¹œW$üSÎõRŽ„á§•»ÂF­…?õNy±Ž‡-áQ> ƧÀPþ›@yâ=4y«¾üu"r]û‘üI`¿Ë Úá”è—Py?!Ü;÷bFOÔŠ½ÒóGhh_äìü¹“ìp°i?“ŸÁøD«£êf-HzÁüzy—î7åÕd²–öÌ¿vP:ÚŽºäO…çwï~däýéðÙ‰òü4¶/uÒ_°aªÖ”ýÄñòƒß?ŸÁ`bzxïc}{nIý±âWå>>::ZoþØŒýWk¯ÖÄj>Ÿ|Qê§á½Â\^Î'žÎ`0ƒQq·¯÷—n…1BqñÀÀÊïŸÁ`üCã ø~q´9f˜Ügò3_/¢Ñè!î×kæ÷WZ }y ãï…ê¨XÊç9¾˜hOªÜ…˜ü ÆW‹¾¨ä7t/–¢~Áäg0¾^û¯{½cHxE|IýÞ¹‰B_ƒÁø»!Åš_Eh%´‚¬³/˜êí›cåg0¾b ‚ôGBÈþf>P¸ÏÊÏ`|ÕÀ¬ÿ@wÚˆø`ø‘úMMþB_ƒÁø{¥ÿ7ú^¤}¯Ð|ä~0(ˆÇk  Ø`D‡öí×­ØÚ·Û[U;/$`4 ‡ý1íÙ÷hýÿÄÿm1¸ º¿|'€þz«îá`90>FB=»S‚ìóîÌvô:hØp%FŠ’ÙXÚOe-#¯C;à-¸³0ˆ~¿£Ž–¯ë0Ïi[hÃìÂû¢Òƒ!¡­r– ±J¢}Y]ú‚­…E”Q<ž‹åü–æ›Òo ì™MÐ<½G> }®öŸ>85èoñœ8ß¼ö Ù­h¿$‡‡ØÐ¬K7 Žá@÷©MXE÷#hÃJûG%ñiwËlŠñ¸5yKcRøIý~;é—÷‘ößOM‚ðO~?e6EðÈ{`?6ê#í[‘îÛí†%  6¤=vÏZ%ÿéÙ >0_qý˜žk„-˜·”ŸœB#n©šFxn´¸ßˆÜo´´ß&þëkmD×Ú ŽDÄGšÙáàGhHtr?RC¼/ŦP|—dÇnÄthÁ}â|¾ê)U„—ÜïÁ嬀ö¸¨º‚,nÂøp‡/ðöZ´è…XçÒ"ÿÅÅ¥xü7,ûýWÓ"ÙýÅÅà´ ù©Âm«{8‹‘òw$?p\áNݬ`{Ñ2à¡é‚ž:.£W]ûï -ðUvà7¥á é“uóœ’_Í=ôõÓ 1V½;++ñ¯áÃø±jØÅ.B}—(3viÒ~öôþÁyÚo×} þÞšMøÅ4gü›=pŠ?i¿Hš…ðÛÄŸ( •²¥ûÃnÀÝ~up«ßˆyªßO´¿µ,èkR‡bÿÔÔ䔡ü¦P1`Usaý¿ßކ͖´£êߤð‹½]÷Qõå^„€VKôÿÏ5ØTN`—}|Týy¢;<”ú7ZÍzì'í·YýÒ5°é>„‚kZ÷1àëT@(ÿÔý§OÇŸ"åi/--5%ßd$  ‚~´ÿúÔ”ð‹-ké?ŸêÿúǽKAäz$þŽþöaì>¼ ;ƒ6ò— ¦nÕŸ1⸠‘gyžö*ëLò×S…š;•m·­c«Þh¥çE>ùÓm•Èö¨`;üNG”XN¢m–ªJ ñ³fÁàSèoùý\^[ÚEûÅÞ]û ö›ªoj¿®4ÛËk¦ò?²ë¾Ò~Cù×µÝ?’H?,µ_‰¿Cûï’ðdXÖz/›¤~¿aü%ó—…ç—Ú?)ÔßÔ} (÷ úÀý)Ãú;tÉßÞJÛ¶!üZ÷Û¡µ¶Ãó±6Rú•ë—–_ÿXk¿|¨ÂÀ<ÑÞR~“þ û5]`ìÊoñ^»WíWºÄ¿&ŒÿS²ü:ï?Ê/Ô_˜~|HÖKá—q€èýC)Ñ^k¿f¿”~8øAZ±vµd~’¨/´ö —Ÿ•¼'êÓß²šüõÀsäz0ø¯ÿGûýñ½Øè„f#êô½Ù鯄ò{ªù%ëbH¢K ò÷É¿Ùu\uü-²ÇŠ®ÏzòÈß7}{‡¾IüŠ·dzº#`½”D¼úð½@삾ߌ.Å?þ¼"à=öÎ×þ½SS÷Úß,ÙeßEù­ò_3é¾~<Àl)¿®Ú]­ûÃ:ëwhÿ­~Cùïjí_6ó}ñ÷kí—•ïʯ´_Å€×È{tû–÷ÝŸ²åû¢¡÷Ý*”¿µÝ,á[[-ÁoÕOZûI÷üHÿg†æ«ä=¥ü˜üká×A e…€®FWt5v]k¼ÖUÛu­ËUûµî“í¿&…_Š>=¿Mè?E’~ÓúK`©öãš÷ãvíÏëïùAi&©š¢¿ÔþŒÖ~"¾Èõ³Û X ±òG4ÿÑ¿,mtv¯t^±‘ŸJóŽ-¨¬M“Á®ö´íx0 zh7íÑl‘ßëé»;1›'­óp£Eõ‹Ù<òÇ*ËËMò{^D©œ¯È§:–Æ«óP ©óô]LùÍBŸ“úJûEÕ/m¯ùS;GûAùO䷴ߪó­iöËðHª¿¡ÿGÍ–ö7«¼_è¾,õ©@0_i¿æ¿%ýH}þ»†õy¿~Ò}§òkö[¼'íŸt~Ù€1€lD€©ísŠ}ÛDúvÊûÛ-í?&ío•vÍ¿`¾!ýó¸ÕKÅ—ûg¦öÏ+áGç¯6Óù§„ô7Ú­€Úk°á£K‰¿Mû­Œ™MýI÷§ïÔíéSÅþ[ѯÔHdª?Žâ/ÆõÇ•ç_ú„Û·©D⟥[júä--Í‚ßãP'ð|ã xüà*þŸ¢èþ£þËÿÿ°ñ ºïknm"}O“òƒ°W")Óƒ“-$#ïê<1'ùït”‹à±Yzñf]™†(ìÚòÈuJÛeRoYâ xÚðc垎 uõÙ‚€KÏŸ—”ß)þB÷õ]´ß©ûμÿ•tkpdïÌKüåi¿Ðÿõ#;ý…0µßVï7´_øÿ~³âÒ¯u_)¿ ·–ÏÑþ)ËX1à{¡ý´ÕñÚöŸ„[$þöÎ@$;Ðÿeë±ØTõï™,ø¡òߟKñŸ¯12~É|!ùêXûS5–æKÆ+÷/F¨íïß…´wA+hç/»~|o6Jd’þ÷¥FÞ/CÀ¸¦©©û¢Ê/{þ¤ ûb‹¼3¬Tÿ¬ ½Èû…óÏêq×¹•.@ü?ß²qeãÊ•ÎNÜÑ3Ä‚¥ùcuTàv´Z÷»‰ìÚã½#l¬ˆXX$U˜̦¤Ü´ý^ÙùîU¹|ò£“Ç‚ßV>ùÛ:›–Ah:0h¼„ÏâW÷Űᢠûí!À .Í=çGíß;gðO>ý8JþÍkhûÖ_Ëÿš~›ö«´ÝMùlõþa©ûŽa?*Õ¿%^P@‰ÿ¤j’úùÚ?µl)ÿ¤*øOé^?5ö=?Ù}cô=(Û/ˆ/°-+ôLº/©ÿRåüÊjŽçIúíŸÊ/çµù¯‘Ù¾­æ§´^°¿F¿@î×BÂÔ'þ»û±èÿãÁ5£äoÚcèÏ{½·[YúÏH¿/[©æ½Ùß/¸}~=¢¨€LþÅÞÒ~!öº»ÏVðc˜’ïJû´-íÇç´QíÏÙ´_qÝÅø“'x`y¿ÃøËœ_ê>>ÖuÙïÐ…ß>pØÔKû‡UÍßÈûupKÕþßAøûoYù¾Nío˜4h?)Šþ“†ðË1>$ýTó±À>þOdþdÿ[·[e ÀìÓ. ~/)÷©„_Sÿeÿ ÿŠþRþíÊߨò~Êú)é@•üæÍ í>\#×ßEY?…gÚoØ~=ÔGþM²_û\¤ýOu¹ÏðýôœQIáû5ý3Õá×#R~â;²_åüTû3 R¤ü¢»O0ßÇ÷±wEîñ7µÏÒþ:ówjÿš«ö»´WfÞoô£@Ð,¿ììü_äû‚þ„ñu‡ö÷ëš¿‘÷[)¿½Ãó}cدCÿyÿ”îó³úù•ù—%ÿ)ìé{=eËù ío•UÿV™ðËÑ>ªòGy»RûgÇVŸŽç­¿Çbä¯ÕõW£³ÿFÕÝ'Jïßj÷Iþ‰÷Ž´ëý.ôWÂ/ºûóéo9Ô~‹ýV©Ÿ^«:¿òšû2ûÏHÐ#¶¬ä~ÖªøgDÕ¯ÇR~à'ºûðQhž1 ƒÁ`0 ƒÁ`0 ƒÁø\üƒÔ endstream endobj 90 0 obj <> endobj 91 0 obj <> endobj 92 0 obj <> endobj 97 0 obj [/Indexed /DeviceRGB 255 <000000FF00006B6BD2FFFFFF666666FF66667B7B7B6666C24A4AB96B6B6B4242 B1F30000FF9090B1B1DA888888737373B1A1A1FFB1B1CC6B6B181818FF33337B 7BCC6666B9E33333B9B9B99090D2DADADA8888CCB98888FFC2C2424242E37B7B FFE3E3DA9999FF1818FF7B7BEB2121B1B1EBFF4A4A8080D2C2C2E3A9A9A93333 33F33333D252529090E3DADAF3CCCCEBEB1818FFA1A1999999A1A1DAB99090FF D2D2525252EBA9A98080E3A1A1E3EBEBF3080808FF08087B7BD2FF73737373C2 5A5AB9B1B1B1292929FF4242E34242C2C2C2E3E3E3DADAEBF38888FFF3F3EB90 90FF2929FF8888C2C2EBB1B1F3FF5A5AD2D2D2EB4242E34A4A9999F3CCCCF3A1 A1F3C2C2F37373D2FF6B6B8080806B6BC26666CC5252B94A4AB1FF9999B9B9E3 B1B1E3909090B1A9A9FFB9B9D26B6BCC7373212121FF39398080CCE339399999 D29090DAC28080FFCCCC4A4A4AE38080FFEBEBFF2121FF8080F32121B9B9EBFF 52528888D28080DA393939DA4A4A9999E39090EBE3E3F3DADAFFD2D2EBF31010 FFA9A9A1A1A1A9A9DAB99999FFDADA5A5A5A8888E3A9A9E3A1A1EBF3F3F3EBEB FF101010FF10107B7BDA7373CC5A5AC2CCCCCCEBEBEBB9B9F3B1B1FFD2D2F3CC CCFFA9A9F3C2C2FF6B6BCC5252C2D273739999DAC28888F329298888DA9999EB E3E3FF8888EBA9A9EBF3F3FFD2D2FFF7B796FC949005E770C2F0F4F7B82899EB 94F741F7FC9490F7B84E6D892D05E770C2F118F7B77BF741F7FC949003EE8803 D600F713EE00016FF7A2E3007DF1C2F164000FF8DF0008402004F7A3A0C40000 1F200C000FF8000000C4000CC40000DF0008000000F713E22A001EC4000CDEFD 30C2F18CF7A10E03EE8803D60000000305E00FC2F1A800E44A05E0F8000032F7 B9C59A3DEC000030001DE803B600C2F1E000CD7C00000900CD5C000000FF92D0 05E10005E17003B600C2F20400CD7CC2F21000F56A033238FFFFFFC2F2780010 260000300021F9000028FF92D0601232FF94D0FF92A005E100F432F805E100C2 F22C66E8880000006021D3FF92D0F432F805E100C2F26C66E94B00000060D91D>]endobj 96 0 obj <>stream xœí} Oi–¶s1Ónó!H ‚Âf0IX&|&\‡5Ù| .FÁËe@_˜ F€Âm#I‡ÉÆÍF ¼?tÏ9ï¥Þ*@fâäö‚ Æ—AçbSHôïÝœiñ×­ôÆ |E ã‹`c±ªw ~~^±Iäo*ô%1Œ/+óŒÕû'6+6Áö³ò3ßBÁxo¨xÌïŸh‘¿B_ƒÁøhÙXœ{2PÜ]ï÷û»Aø¹«ÁøFp3¸Ÿ u‡zçªxƒñm`3Ä¡ýÅÐB¡¹3…¾ ƒñ…н±ØTõ$„xRÅÓúŒoþ`0^UÕ47×gî3ßî÷nãKñÅ•_ }) ãËâ—¿ßߢ©½×Â`0 ˆë}…¾ƒQT³ø3ß(n3ûŒoÑB_ƒÁ( b· } £0ˆ²ñg0¾MDÙø3ß&˜ü Æ7ŠëìûŒooXúŒoi&?ƒñ­àæó ¿_/äã®ü­µ_ð‚~ëë…¾ã7Ÿ·øWz—:7®|×ùžÔëFþÉ|_ôÒÎÇZÏwTè‹`0þA1S/‰òW6®t^¹Ò Mþëyä_?ðùþ—?× —Âäg0.‰ûÀxã †zõn,Zm;{­Ñ÷ïÿ[È¿ñù²L~ãÒ~'(Ÿ¯P °”?=4NÍ=óù’¨¶]¸Nî–ŠkI2ùŒKÂOt¯j©ðw^¿¡üѨ1©¿•ˆbë»V€ë´aý\^ +?ƒqiÜDÅ‚G3”ñ9¿Yï›üA2ß—ÌØö?˜Ïd“Ù$\+?ƒñˆåïÓÑXçw6å¯Öä§:!YhåÏmõ3@~V~ãó0°Ñ¹!Ž&déO+4:(^S…6‹;Tþ7…¸VDi&›Aîù³>îçg0. g°Sµl!@“äÔÂ/Ò}‚ü€ú@ÿd6+²V~㲘Yê\zNGcADgç†$ÿmÝÑ×*óý¬(ùÔögüÙ üŒÏÅÍÅ`pf—‚ ý@AþÃh4-ϱ+a ~D~¬øù²lûŒÏBïÒâRh³Â_ BÀ Èo ?)¿¦~mf¹ŸM²íg0>þÅx|1¾ø!þ!aø$òGÑ}¨üY‹ý…·ýÄþ$Û~ã³P¬ÿP¯Š ,Å—üףј>¥Õ&üÙB“?+J~äüïòZŒlܯB4‰†ô_ôÓL~cX¿™óg}ÉÆ|ãÚèëöð~*mwwyxïã×p:üëÙY8ŽÐgÚÏú_{jFTüPù“IV~ã3ðóœDÕñ c|Ï|¾?(É—ìÅæøº½©ðþ~d?Lã^ ¯6œÏeÀéò*œFàùRûíkÎó¦J!ßÇFôïÉRw]l\øc0.ŒÇOû逹/GõËQ}IÓö'³è¼3™Tþ—­½ìÚOõS¤û€×ÀíÝÿ>ïçOV‡VOV"«4æá“?^:,ÃÔ¸`þ¸èë“I¿;ãâ(Ö?é}ÒÛ;ÛÜ\SÕDLíóŠQ}¶j?xnâþxžòçºà>)ŒJt&ú¯6ä\|xHpÿ%Š?6éýáKöSvFùýã2é—}D8bò3—¿7ê õÂz‚ìŸû'£Øgé½:H’éGÔ8¾ho>±OÔßGþ*âõONVON]~ûס“!|t?ŒÊOQƒØIì›ç"ùÉ÷Ó ¿lR;òñãRh …B+ÐBž„zç~3 ýF²o R(¿Ãö¯ãß—ôO¡‚£éôzƒ¾çgþ£C#'CC@þW-å—ÒI$Ì€AäÏ’ñÏR¹ß¢>+?ƒqÜX‘Qèý-–Óoúœ@Ê÷3™yÛ×ìu%ÒôƒòHÈW¥ò¯"ÅÚ:424´{‚äÔ틤63¾ùµðgù…+ö2Œ‹âþ€ÄÊÊñÿ/­7¶™õ¾,ÖÝl9n^Ⱦþyð°HãWQ×ÑÞíæì¿ündhw„„ÿääDÿ0±¬? ?|á²uvƒ~Ó÷[®„•ŸÁ¸8~(¦FüýÿÆ›NÛïÓõ>‡ò¿ÝGîKáO…SaUëá‚ ŒüjûáW#€¡]Š (þ»ïÎPýQù÷¥ö'ö­Ó…ògÇůÓ0ëêXùŒ‹ãfw1Bñ`eÓxÓÅô'E_ßxÖ$s‚È¿¿Of=œŠDVwÏ^*ú½GvGFliÿè±DP_†½³U•õ§(–XÒß  ~Ö0V~ãsð˜È?V,B¿ÅxÓ-çÝüY[Á¯Qr;ùQ¶w‰æ¹_¥ðCÊOLkþð[úÓ‰ ÿOê¯Ã`üçUo_"ѧËj–Ä_¬èa]+?ƒqq<öuwûíÊŸWíOf{¨ânöóß½Šäߗ‰h½>¢Z?æûCÄSú‡FýÉõ[oìb¹ÈIääe¿êÓ0®ËýjjU‹`åg0.·€äÿ@…ñ^žîõ³Rû Û?Ü¿ M°×zg;ù‡PÞIù²ÞÙCê¿Bã?tbô…_î6ŒöŸ:û¦ˆúBû1Ð"ž¬ü ÆgÀß]è®Gþ#û7'´›å>_6LÿÞÕ« I}ª÷åŒ÷ND±ì=ÁzãT ?ÕûOÞ}âÅjî ågÅg0.çâ›þz’ÿâ çZ åÙÏ¿Qgâ*¥ü²à×`¾Òä¦b?°ý­¥ð¹·Èþ·ôŽóý„é´˜‡œØ×ƒ¦Ÿ'ô0Ÿ¿±¼¿ ù³¦ïÏŸÏ?ÂÒ/¹i6ß;¥þ!)ü#µÞQÊ/»úWëg££Ín£€ Èr¿˜Ù“dåg0>é3Ù_ßíF~£“?ébûß_¥”_VüÃ~¥ò á7ëýôRÒÿDŒðÇ©½‘ðnÿiUc|Øö3Ÿ‹XßðþŸ-úÍ8O±­á—Í_Ìc„_Ò?’Ûß=#é—"ÿÖHúÿ›Ê}¤üb€¿œÜüO¥vïæ\/7#†øeiF?Oèa0.ëÑ´wÂoÙŸ¯üz4 ÖûòÉß|ÕÈù#‘HûIûnûî¶³wgTî“Å~hVfŸÃ”_)ÿÍ ¾4-(Ùop+ŒÓ¼½€/“ŸÁ¸q±®–– „fÿŒó,Û~.ä§^þ„®ö›Ëøà„>Tþ!9Êgä­Áè¿êœ_ð%åËñ½)ç„~‚ZɇÆösÎÏ`\bîîf ÂbÿŒó´‘¿áêUQï¾GçÍÓ}ò“!1ÆG)¿9ÌÇÈù‡TÒ/föÐJ@ûûgy—lüàjšóN`0‡\¤s`ÐßüY‹û.ýüS ´ýªÚŸ@ÛNÚ/çõœ¨‚ñß\ÐkïJùMåˆ~`üö^C„îê˰ò3—…Z¤³bsSð_°¿þ†óDSùÝ ~ V¹’~þ”X¿/,øIåG¡·­æ·÷VŒÔ·ôÐËy8Ù­”?Ë9?ƒqY(î?ž©ûÏU~Ëõ»ÙþI³Ú/&öÐ^±Ž‡˜²«¤ß¾”gî?‡dÊ¿z"‚)D(?.äçø­ŒZÊGäülûŒ ã0z]ùgff*Èúûgœ§ZÕ~*÷çð›Õ~k”ϼ´ý‘°š×£êýNò{½§ÿI¿Ö}±–Ìùû Ǩ}]ìϰò3—BßmuWŽŸgfn û+Ðø»“ß>³'o„_s¾ò‹¥|(é²ÿ<ò{ñž# ü/UüHøi^ŸsÔÀ¸X»;ÃÕ~ã’°îÁûóù'>Jþlþ:E??P_Tûç§§kÐöâpÎõœ¿;‘®^ÌçO!õ÷‰œíùÊß®gõ‘úæÊ{©ˆUïK$–moÊÛu‰A>¬ü ÆE¡ïŸ®æÆïåüëæb^Ùd&ï뎤í—+ùØjt¹ß£»wz:<üÓÙÙªÉâZ¾“ï†ï´/ù›‘KyHåŸü¤ÿ\ƒ!q]õñ#€ø7ˆûçVû¬•2if ꃜu ñ“S{‘ý~ãûXÆ;ûixô•}a®W¿þôŽº÷iBϪ¹’O¿Èùé ¯:rþ.P~ZFL(¿ìyàî~ãÓPm¸þDz§]ÿ„ë¿ucJ/®Ü]:utw»+c¸ûVáûåœÞýˆõVƒ^»ŸîÌ1¢~{ÿðoâ^]«ÏDÂäÏÙ®¥±Tß±'‰~¤±}ª6yð·øWa0¾ÜÖwáõz®æ›ÂŸ?¯Ù6+í=Xt›²ÎÈIòÓHŸÈ~*%Ù¿&‡í…Qßi!ÏœúÈ«= Ÿ`Ý‘{]?Ú~rýÖÚÝ„F½x¯yûàäßè†ÁøÊÑ­¶Rþ_**Ôð^Êøëýÿ7ï>›ôc;ÊïkãŒvs˜ÎÇ 7Œö¾”ÔÇÁ{â†\Æ*^'CrmO9£'<šÃ?ï5¤tOÖûS{ÚEO_FŒñÑø[þó0_/Ž>ïÍŠMIý‰s¦ôz3ö™=”rÛoו벆øÒŒ~q“nû}ºWmkôâÊž«òîÜrdßnûnX ðÙÜ/áè7œ”Â/”_oÓã«EµYïÚcÓsúüÝ3y¨±I?òÍ·mÎÍ‘îí£Ûõí«™}4Ä_êÿÉIÎøDîäÄä¾ÝgõóEð wíWâmÜÇ‘ý>¾cƒqA˜äÿ¹¥E®å1¡–ñšÉûÀ¤©üú>½öþþvYò»º/²~âp8bQ(n/Üë„_Ýw>¢—ñÀé¼h$rÎk—Âï3oÒËýý Æ'!jÿ—‰–‰½ŠW½¿¾Û…ü9Û=»ô}zí'Í'(ë$ôr>á”pþ’ú«Î¹w«Öd¾°^ÄCÌé‘ý|ùƒZ³êf]jØnÜßÏ`| ¢FOß ÿ6Å}¼oOÞžŽå<|IºQ¯“ü¹°ãK¦ù}b–®S÷»V¾§¤ÂÒò§h= ü®¿æ}Ä»7žµ:ú4Ú?÷ß„Áø&`*ÿ¦céÞn—›vÞ›Ê/´?›qŽá?KÐðþ«2éW{åb~n#ýÞ™sø#j6_Šfó%ö#®“&3bÙn›i½ü¿ƒñ á¶EþÇzÝîz¡ûn·ëäžÔ÷ɂ޸º£ÒËôòNÝ)¹œW$üSÎõRŽ„á§•»ÂF­…?õNy±Ž‡-áQ> ƧÀPþ›@yâ=4y«¾üu"r]û‘üI`¿Ë Úá”è—Py?!Ü;÷bFOÔŠ½ÒóGhh_äìü¹“ìp°i?“ŸÁøD«£êf-HzÁüzy—î7åÕd²–öÌ¿vP:ÚŽºäO…çwï~däýéðÙ‰òü4¶/uÒ_°aªÖ”ýÄñòƒß?ŸÁ`bzxïc}{nIý±âWå>>::ZoþØŒýWk¯ÖÄj>Ÿ|Qê§á½Â\^Î'žÎ`0ƒQq·¯÷—n…1BqñÀÀÊïŸÁ`üCã ø~q´9f˜Ügò3_/¢Ñè!î×kæ÷WZ }y ãï…ê¨XÊç9¾˜hOªÜ…˜ü ÆW‹¾¨ä7t/–¢~Áäg0¾^û¯{½cHxE|IýÞ¹‰B_ƒÁø»!Åš_Eh%´‚¬³/˜êí›cåg0¾b ‚ôGBÈþf>P¸ÏÊÏ`|ÕÀ¬ÿ@wÚˆø`ø‘úMMþB_ƒÁø{¥ÿ7ú^¤}¯Ð|ä~0(ˆÇk  Ø`D‡öí×­ØÚ·Û[U;/$`4 ‡ý1íÙ÷hýÿÄÿm1¸ º¿|'€þz«îá`90>FB=»S‚ìóîÌvô:hØp%FŠ’ÙXÚOe-#¯C;à-¸³0ˆ~¿£Ž–¯ë0Ïi[hÃìÂû¢Òƒ!¡­r– ±J¢}Y]ú‚­…E”Q<ž‹åü–æ›Òo ì™MÐ<½G> }®öŸ>85èoñœ8ß¼ö Ù­h¿$‡‡ØÐ¬K7 Žá@÷©MXE÷#hÃJûG%ñiwËlŠñ¸5yKcRøIý~;é—÷‘ößOM‚ðO~?e6EðÈ{`?6ê#í[‘îÛí†%  6¤=vÏZ%ÿéÙ >0_qý˜žk„-˜·”ŸœB#n©šFxn´¸ßˆÜo´´ß&þëkmD×Ú ŽDÄGšÙáàGhHtr?RC¼/ŦP|—dÇnÄthÁ}â|¾ê)U„—ÜïÁ嬀ö¸¨º‚,nÂøp‡/ðöZ´è…XçÒ"ÿÅÅ¥xü7,ûýWÓ"ÙýÅÅà´ ù©Âm«{8‹‘òw$?p\áNݬ`{Ñ2à¡é‚ž:.£W]ûï -ðUvà7¥á é“uóœ’_Í=ôõÓ 1V½;++ñ¯áÃø±jØÅ.B}—(3viÒ~öôþÁyÚo×} þÞšMøÅ4gü›=pŠ?i¿Hš…ðÛÄŸ( •²¥ûÃnÀÝ~up«ßˆyªßO´¿µ,èkR‡bÿÔÔ䔡ü¦P1`Usaý¿ßކ͖´£êߤð‹½]÷Qõå^„€VKôÿÏ5ØTN`—}|Týy¢;<”ú7ZÍzì'í·YýÒ5°é>„‚kZ÷1àëT@(ÿÔý§OÇŸ"åi/--5%ßd$  ‚~´ÿúÔ”ð‹-ké?ŸêÿúǽKAäz$þŽþöaì>¼ ;ƒ6ò— ¦nÕŸ1⸠‘gyžö*ëLò×S…š;•m·­c«Þh¥çE>ùÓm•Èö¨`;üNG”XN¢m–ªJ ñ³fÁàSèoùý\^[ÚEûÅÞ]û ö›ªoj¿®4ÛËk¦ò?²ë¾Ò~Cù×µÝ?’H?,µ_‰¿Cûï’ðdXÖz/›¤~¿aü%ó—…ç—Ú?)ÔßÔ} (÷ úÀý)Ãú;tÉßÞJÛ¶!üZ÷Û¡µ¶Ãó±6Rú•ë—–_ÿXk¿|¨ÂÀ<ÑÞR~“þ û5]`ìÊoñ^»WíWºÄ¿&ŒÿS²ü:ï?Ê/Ô_˜~|HÖKá—q€èýC)Ñ^k¿f¿”~8øAZ±vµd~’¨/´ö —Ÿ•¼'êÓß²šüõÀsäz0ø¯ÿGûýñ½Øè„f#êô½Ù鯄ò{ªù%ëbH¢K ò÷É¿Ùu\uü-²ÇŠ®ÏzòÈß7}{‡¾IüŠ·dzº#`½”D¼úð½@삾ߌ.Å?þ¼"à=öÎ×þ½SS÷Úß,ÙeßEù­ò_3é¾~<Àl)¿®Ú]­ûÃ:ëwhÿ­~Cùïjí_6ó}ñ÷kí—•ïʯ´_Å€×È{tû–÷ÝŸ²åû¢¡÷Ý*”¿µÝ,á[[-ÁoÕOZûI÷üHÿg†æ«ä=¥ü˜üká×A e…€®FWt5v]k¼ÖUÛu­ËUûµî“í¿&…_Š>=¿Mè?E’~ÓúK`©öãš÷ãvíÏëïùAi&©š¢¿ÔþŒÖ~"¾Èõ³Û X ±òG4ÿÑ¿,mtv¯t^±‘ŸJóŽ-¨¬M“Á®ö´íx0 zh7íÑl‘ßëé»;1›'­óp£Eõ‹Ù<òÇ*ËËMò{^D©œ¯È§:–Æ«óP ©óô]LùÍBŸ“úJûEÕ/m¯ùS;GûAùO䷴ߪó­iöËðHª¿¡ÿGÍ–ö7«¼_è¾,õ©@0_i¿æ¿%ýH}þ»†õy¿~Ò}§òkö[¼'íŸt~Ù€1€lD€©ísŠ}ÛDúvÊûÛ-í?&ío•vÍ¿`¾!ýó¸ÕKÅ—ûg¦öÏ+áGç¯6Óù§„ô7Ú­€Úk°á£K‰¿Mû­Œ™MýI÷§ïÔíéSÅþ[ѯÔHdª?Žâ/ÆõÇ•ç_ú„Û·©D⟥[júä--Í‚ßãP'ð|ã xüà*þŸ¢èþ£þËÿÿ°ñ ºïknm"}O“òƒ°W")Óƒ“-$#ïê<1'ùït”‹à±Yzñf]™†(ìÚòÈuJÛeRoYâ xÚðc垎 uõÙ‚€KÏŸ—”ß)þB÷õ]´ß©ûμÿ•tkpdïÌKüåi¿Ðÿõ#;ý…0µßVï7´_øÿ~³âÒ¯u_)¿ ·–ÏÑþ)ËX1à{¡ý´ÕñÚöŸ„[$þöÎ@$;Ðÿeë±ØTõï™,ø¡òߟKñŸ¯12~É|!ùêXûS5–æKÆ+÷/F¨íïß…´wA+hç/»~|o6Jd’þ÷¥FÞ/CÀ¸¦©©û¢Ê/{þ¤ ûb‹¼3¬Tÿ¬ ½Èû…óÏêq×¹•.@ü?ß²qeãÊ•ÎNÜÑ3Ä‚¥ùcuTàv´Z÷»‰ìÚã½#l¬ˆXX$U˜̦¤Ü´ý^ÙùîU¹|ò£“Ç‚ßV>ùÛ:›–Ah:0h¼„ÏâW÷Űᢠûí!À .Í=çGíß;gðO>ý8JþÍkhûÖ_Ëÿš~›ö«´ÝMùlõþa©ûŽa?*Õ¿%^P@‰ÿ¤j’úùÚ?µl)ÿ¤*øOé^?5ö=?Ù}cô=(Û/ˆ/°-+ôLº/©ÿRåüÊjŽçIúíŸÊ/çµù¯‘Ù¾­æ§´^°¿F¿@î×BÂÔ'þ»û±èÿãÁ5£äoÚcèÏ{½·[YúÏH¿/[©æ½Ùß/¸}~=¢¨€LþÅÞÒ~!öº»ÏVðc˜’ïJû´-íÇç´QíÏÙ´_qÝÅø“'x`y¿ÃøËœ_ê>>ÖuÙïÐ…ß>pØÔKû‡UÍßÈûupKÕþßAøûoYù¾Nío˜4h?)Šþ“†ðË1>$ýTó±À>þOdþdÿ[·[e ÀìÓ. ~/)÷©„_Sÿeÿ ÿŠþRþíÊߨò~Êú)é@•üæÍ í>\#×ßEY?…gÚoØ~=ÔGþM²_û\¤ýOu¹ÏðýôœQIáû5ý3Õá×#R~â;²_åüTû3 R¤ü¢»O0ßÇ÷±wEîñ7µÏÒþ:ówjÿš«ö»´WfÞoô£@Ð,¿ììü_äû‚þ„ñu‡ö÷ëš¿‘÷[)¿½Ãó}cدCÿyÿ”îó³úù•ù—%ÿ)ìé{=eËù ío•UÿV™ðËÑ>ªòGy»RûgÇVŸŽç­¿Çbä¯ÕõW£³ÿFÕÝ'Jïßj÷Iþ‰÷Ž´ëý.ôWÂ/ºûóéo9Ô~‹ýV©Ÿ^«:¿òšû2ûÏHÐ#¶¬ä~ÖªøgDÕ¯ÇR~à'ºûðQhž1 ƒÁ`0 ƒÁ`0 ƒÁø\üƒÔ endstream endobj 98 0 obj <> endobj 99 0 obj <> endobj 100 0 obj <> endobj 105 0 obj [/Indexed /DeviceRGB 255 <000000FF00006B6BD2FFFFFF666666FF66667B7B7B6666C24A4AB96B6B6B4242 B1F30000FF9090B1B1DA888888737373B1A1A1FFB1B1CC6B6B181818FF33337B 7BCC6666B9E33333B9B9B99090D2DADADA8888CCB98888FFC2C2424242E37B7B FFE3E3DA9999FF1818FF7B7BEB2121B1B1EBFF4A4A8080D2C2C2E3A9A9A93333 33F33333D252529090E3DADAF3CCCCEBEB1818FFA1A1999999A1A1DAB99090FF D2D2525252EBA9A98080E3A1A1E3EBEBF3080808FF08087B7BD2FF73737373C2 5A5AB9B1B1B1292929FF4242E34242C2C2C2E3E3E3DADAEBF38888FFF3F3EB90 90FF2929FF8888C2C2EBB1B1F3FF5A5AD2D2D2EB4242E34A4A9999F3CCCCF3A1 A1F3C2C2F37373D2FF6B6B8080806B6BC26666CC5252B94A4AB1FF9999B9B9E3 B1B1E3909090B1A9A9FFB9B9D26B6BCC7373212121FF39398080CCE339399999 D29090DAC28080FFCCCC4A4A4AE38080FFEBEBFF2121FF8080F32121B9B9EBFF 52528888D28080DA393939DA4A4A9999E39090EBE3E3F3DADAFFD2D2EBF31010 FFA9A9A1A1A1A9A9DAB99999FFDADA5A5A5A8888E3A9A9E3A1A1EBF3F3F3EBEB FF101010FF10107B7BDA7373CC5A5AC2CCCCCCEBEBEBB9B9F3B1B1FFD2D2F3CC CCFFA9A9F3C2C2FF6B6BCC5252C2D273739999DAC28888F329298888DA9999EB E3E3FF8888EBA9A9EBF3F3FFD2D2FFF7B796FC949005E770C2F0F4F7B82899EB 94F741F7FC9490F7B84E6D892D05E770C2F118F7B77BF741F7FC949003EE8803 D600F713EE00016FF7A2E3007DF1C2F164000FF8DF0008402004F7A3A0C40000 1F200C000FF8000000C4000CC40000DF0008000000F713E22A001EC4000CDEFD 30C2F18CF7A10E03EE8803D60000000305E00FC2F1A800E44A05E0F8000032F7 B9C59A3DEC000030001DE803B600C2F1E000CD7C00000900CD5C000000FF92D0 05E10005E17003B600C2F20400CD7CC2F21000F56A033238FFFFFFC2F2780010 260000300021F9000028FF92D0601232FF94D0FF92A005E100F432F805E100C2 F22C66E8880000006021D3FF92D0F432F805E100C2F26C66E94B00000060D91D>]endobj 104 0 obj <>stream xœí} Oi–¶s1Ónó!H ‚Âf0IX&|&\‡5Ù| .FÁËe@_˜ F€Âm#I‡ÉÆÍF ¼?tÏ9ï¥Þ*@fâäö‚ Æ—AçbSHôïÝœiñ×­ôÆ |E ã‹`c±ªw ~~^±Iäo*ô%1Œ/+óŒÕû'6+6Áö³ò3ßBÁxo¨xÌïŸh‘¿B_ƒÁøhÙXœ{2PÜ]ï÷û»Aø¹«ÁøFp3¸Ÿ u‡zçªxƒñm`3Ä¡ýÅÐB¡¹3…¾ ƒñ…н±ØTõ$„xRÅÓúŒoþ`0^UÕ47×gî3ßî÷nãKñÅ•_ }) ãËâ—¿ßߢ©½×Â`0 ˆë}…¾ƒQT³ø3ß(n3ûŒoÑB_ƒÁ( b· } £0ˆ²ñg0¾MDÙø3ß&˜ü Æ7ŠëìûŒooXúŒoi&?ƒñ­àæó ¿_/äã®ü­µ_ð‚~ëë…¾ã7Ÿ·øWz—:7®|×ùžÔëFþÉ|_ôÒÎÇZÏwTè‹`0þA1S/‰òW6®t^¹Ò Mþëyä_?ðùþ—?× —Âäg0.‰ûÀxã †zõn,Zm;{­Ñ÷ïÿ[È¿ñù²L~ãÒ~'(Ÿ¯P °”?=4NÍ=óù’¨¶]¸Nî–ŠkI2ùŒKÂOt¯j©ðw^¿¡üѨ1©¿•ˆbë»V€ë´aý\^ +?ƒqiÜDÅ‚G3”ñ9¿Yï›üA2ß—ÌØö?˜Ïd“Ù$\+?ƒñˆåïÓÑXçw6å¯Öä§:!YhåÏmõ3@~V~ãó0°Ñ¹!Ž&déO+4:(^S…6‹;Tþ7…¸VDi&›Aîù³>îçg0. g°Sµl!@“äÔÂ/Ò}‚ü€ú@ÿd6+²V~㲘Yê\zNGcADgç†$ÿmÝÑ×*óý¬(ùÔögüÙ üŒÏÅÍÅ`pf—‚ ý@AþÃh4-ϱ+a ~D~¬øù²lûŒÏBïÒâRh³Â_ BÀ Èo ?)¿¦~mf¹ŸM²íg0>þÅx|1¾ø!þ!aø$òGÑ}¨üY‹ý…·ýÄþ$Û~ã³P¬ÿP¯Š ,Å—üףј>¥Õ&üÙB“?+J~äüïòZŒlܯB4‰†ô_ôÓL~cX¿™óg}ÉÆ|ãÚèëöð~*mwwyxïã×p:üëÙY8ŽÐgÚÏú_{jFTüPù“IV~ã3ðóœDÕñ c|Ï|¾?(É—ìÅæøº½©ðþ~d?Lã^ ¯6œÏeÀéò*œFàùRûíkÎó¦J!ßÇFôïÉRw]l\øc0.ŒÇOû逹/GõËQ}IÓö'³è¼3™Tþ—­½ìÚOõS¤û€×ÀíÝÿ>ïçOV‡VOV"«4æá“?^:,ÃÔ¸`þ¸èë“I¿;ãâ(Ö?é}ÒÛ;ÛÜ\SÕDLíóŠQ}¶j?xnâþxžòçºà>)ŒJt&ú¯6ä\|xHpÿ%Š?6éýáKöSvFùýã2é—}D8bò3—¿7ê õÂz‚ìŸû'£Øgé½:H’éGÔ8¾ho>±OÔßGþ*âõONVON]~ûס“!|t?ŒÊOQƒØIì›ç"ùÉ÷Ó ¿lR;òñãRh …B+ÐBž„zç~3 ýF²o R(¿Ãö¯ãß—ôO¡‚£éôzƒ¾çgþ£C#'CC@þW-å—ÒI$Ì€AäÏ’ñÏR¹ß¢>+?ƒqÜX‘Qèý-–Óoúœ@Ê÷3™yÛ×ìu%ÒôƒòHÈW¥ò¯"ÅÚ:424´{‚äÔ틤63¾ùµðgù…+ö2Œ‹âþ€ÄÊÊñÿ/­7¶™õ¾,ÖÝl9n^Ⱦþyð°HãWQ×ÑÞíæì¿ündhw„„ÿääDÿ0±¬? ?|á²uvƒ~Ó÷[®„•ŸÁ¸8~(¦FüýÿÆ›NÛïÓõ>‡ò¿ÝGîKáO…SaUëá‚ ŒüjûáW#€¡]Š (þ»ïÎPýQù÷¥ö'ö­Ó…ògÇůÓ0ëêXùŒ‹ãfw1Bñ`eÓxÓÅô'E_ßxÖ$s‚È¿¿Of=œŠDVwÏ^*ú½GvGFliÿè±DP_†½³U•õ§(–XÒß  ~Ö0V~ãsð˜È?V,B¿ÅxÓ-çÝüY[Á¯Qr;ùQ¶w‰æ¹_¥ðCÊOLkþð[úÓ‰ ÿOê¯Ã`üçUo_"ѧËj–Ä_¬èa]+?ƒqq<öuwûíÊŸWíOf{¨ânöóß½Šäߗ‰h½>¢Z?æûCÄSú‡FýÉõ[oìb¹ÈIääe¿êÓ0®ËýjjU‹`åg0.·€äÿ@…ñ^žîõ³Rû Û?Ü¿ M°×zg;ù‡PÞIù²ÞÙCê¿Bã?tbô…_î6ŒöŸ:û¦ˆúBû1Ð"ž¬ü ÆgÀß]è®Gþ#û7'´›å>_6LÿÞÕ« I}ª÷åŒ÷ND±ì=ÁzãT ?ÕûOÞ}âÅjî ågÅg0.çâ›þz’ÿâ çZ åÙÏ¿Qgâ*¥ü²à×`¾Òä¦b?°ý­¥ð¹·Èþ·ôŽóý„é´˜‡œØ×ƒ¦Ÿ'ô0Ÿ¿±¼¿ ù³¦ïÏŸÏ?ÂÒ/¹i6ß;¥þ!)ü#µÞQÊ/»úWëg££Ín£€ Èr¿˜Ù“dåg0>é3Ù_ßíF~£“?ébûß_¥”_VüÃ~¥ò á7ëýôRÒÿDŒðÇ©½‘ðnÿiUc|Øö3Ÿ‹XßðþŸ-úÍ8O±­á—Í_Ìc„_Ò?’Ûß=#é—"ÿÖHúÿ›Ê}¤üb€¿œÜüO¥vïæ\/7#†øeiF?Oèa0.ëÑ´wÂoÙŸ¯üz4 ÖûòÉß|ÕÈù#‘HûIûnûî¶³wgTî“Å~hVfŸÃ”_)ÿÍ ¾4-(Ùop+ŒÓ¼½€/“ŸÁ¸q±®–– „fÿŒó,Û~.ä§^þ„®ö›Ëøà„>Tþ!9Êgä­Áè¿êœ_ð%åËñ½)ç„~‚ZɇÆösÎÏ`\bîîf ÂbÿŒó´‘¿áêUQï¾GçÍÓ}ò“!1ÆG)¿9ÌÇÈù‡TÒ/föÐJ@ûûgy—lüàjšóN`0‡\¤s`ÐßüY‹û.ýüS ´ýªÚŸ@ÛNÚ/çõœ¨‚ñß\ÐkïJùMåˆ~`üö^C„îê˰ò3—…Z¤³bsSð_°¿þ†óDSùÝ ~ V¹’~þ”X¿/,øIåG¡·­æ·÷VŒÔ·ôÐËy8Ù­”?Ë9?ƒqY(î?ž©ûÏU~Ëõ»ÙþI³Ú/&öÐ^±Ž‡˜²«¤ß¾”gî?‡dÊ¿z"‚)D(?.äçø­ŒZÊGäülûŒ ã0z]ùgff*Èúûgœ§ZÕ~*÷çð›Õ~k”ϼ´ý‘°š×£êýNò{½§ÿI¿Ö}±–Ìùû Ǩ}]ìϰò3—BßmuWŽŸgfn û+Ðø»“ß>³'o„_s¾ò‹¥|(é²ÿ<ò{ñž# ü/UüHøi^ŸsÔÀ¸X»;ÃÕ~ã’°îÁûóù'>Jþlþ:E??P_Tûç§§kÐöâpÎõœ¿;‘®^ÌçO!õ÷‰œíùÊß®gõ‘úæÊ{©ˆUïK$–moÊÛu‰A>¬ü ÆE¡ïŸ®æÆïåüëæb^Ùd&ï뎤í—+ùØjt¹ß£»wz:<üÓÙÙªÉâZ¾“ï†ï´/ù›‘KyHåŸü¤ÿ\ƒ!q]õñ#€ø7ˆûçVû¬•2if ꃜu ñ“S{‘ý~ãûXÆ;ûixô•}a®W¿þôŽº÷iBϪ¹’O¿Èùé ¯:rþ.P~ZFL(¿ìyàî~ãÓPm¸þDz§]ÿ„ë¿ucJ/®Ü]:utw»+c¸ûVáûåœÞýˆõVƒ^»ŸîÌ1¢~{ÿðoâ^]«ÏDÂäÏÙ®¥±Tß±'‰~¤±}ª6yð·øWa0¾ÜÖwáõz®æ›ÂŸ?¯Ù6+í=Xt›²ÎÈIòÓHŸÈ~*%Ù¿&‡í…Qßi!ÏœúÈ«= Ÿ`Ý‘{]?Ú~rýÖÚÝ„F½x¯yûàäßè†ÁøÊÑ­¶Rþ_**Ôð^Êøëýÿ7ï>›ôc;ÊïkãŒvs˜ÎÇ 7Œö¾”ÔÇÁ{â†\Æ*^'CrmO9£'<šÃ?ï5¤tOÖûS{ÚEO_FŒñÑø[þó0_/Ž>ïÍŠMIý‰s¦ôz3ö™=”rÛoו벆øÒŒ~q“nû}ºWmkôâÊž«òîÜrdßnûnX ðÙÜ/áè7œ”Â/”_oÓã«EµYïÚcÓsúüÝ3y¨±I?òÍ·mÎÍ‘îí£Ûõí«™}4Ä_êÿÉIÎøDîäÄä¾ÝgõóEð wíWâmÜÇ‘ý>¾cƒqA˜äÿ¹¥E®å1¡–ñšÉûÀ¤©üú>½öþþvYò»º/²~âp8bQ(n/Üë„_Ýw>¢—ñÀé¼h$rÎk—Âï3oÒËýý Æ'!jÿ—‰–‰½ŠW½¿¾Û…ü9Û=»ô}zí'Í'(ë$ôr>á”pþ’ú«Î¹w«Öd¾°^ÄCÌé‘ý|ùƒZ³êf]jØnÜßÏ`| ¢FOß ÿ6Å}¼oOÞžŽå<|IºQ¯“ü¹°ãK¦ù}b–®S÷»V¾§¤ÂÒò§h= ü®¿æ}Ä»7žµ:ú4Ú?÷ß„Áø&`*ÿ¦céÞn—›vÞ›Ê/´?›qŽá?KÐðþ«2éW{åb~n#ýÞ™sø#j6_Šfó%ö#®“&3bÙn›i½ü¿ƒñ á¶EþÇzÝîz¡ûn·ëäžÔ÷ɂ޸º£ÒËôòNÝ)¹œW$üSÎõRŽ„á§•»ÂF­…?õNy±Ž‡-áQ> ƧÀPþ›@yâ=4y«¾üu"r]û‘üI`¿Ë Úá”è—Py?!Ü;÷bFOÔŠ½ÒóGhh_äìü¹“ìp°i?“ŸÁøD«£êf-HzÁüzy—î7åÕd²–öÌ¿vP:ÚŽºäO…çwï~däýéðÙ‰òü4¶/uÒ_°aªÖ”ýÄñòƒß?ŸÁ`bzxïc}{nIý±âWå>>::ZoþØŒýWk¯ÖÄj>Ÿ|Qê§á½Â\^Î'žÎ`0ƒQq·¯÷—n…1BqñÀÀÊïŸÁ`üCã ø~q´9f˜Ügò3_/¢Ñè!î×kæ÷WZ }y ãï…ê¨XÊç9¾˜hOªÜ…˜ü ÆW‹¾¨ä7t/–¢~Áäg0¾^û¯{½cHxE|IýÞ¹‰B_ƒÁø»!Åš_Eh%´‚¬³/˜êí›cåg0¾b ‚ôGBÈþf>P¸ÏÊÏ`|ÕÀ¬ÿ@wÚˆø`ø‘úMMþB_ƒÁø{¥ÿ7ú^¤}¯Ð|ä~0(ˆÇk  Ø`D‡öí×­ØÚ·Û[U;/$`4 ‡ý1íÙ÷hýÿÄÿm1¸ º¿|'€þz«îá`90>FB=»S‚ìóîÌvô:hØp%FŠ’ÙXÚOe-#¯C;à-¸³0ˆ~¿£Ž–¯ë0Ïi[hÃìÂû¢Òƒ!¡­r– ±J¢}Y]ú‚­…E”Q<ž‹åü–æ›Òo ì™MÐ<½G> }®öŸ>85èoñœ8ß¼ö Ù­h¿$‡‡ØÐ¬K7 Žá@÷©MXE÷#hÃJûG%ñiwËlŠñ¸5yKcRøIý~;é—÷‘ößOM‚ðO~?e6EðÈ{`?6ê#í[‘îÛí†%  6¤=vÏZ%ÿéÙ >0_qý˜žk„-˜·”ŸœB#n©šFxn´¸ßˆÜo´´ß&þëkmD×Ú ŽDÄGšÙáàGhHtr?RC¼/ŦP|—dÇnÄthÁ}â|¾ê)U„—ÜïÁ嬀ö¸¨º‚,nÂøp‡/ðöZ´è…XçÒ"ÿÅÅ¥xü7,ûýWÓ"ÙýÅÅà´ ù©Âm«{8‹‘òw$?p\áNݬ`{Ñ2à¡é‚ž:.£W]ûï -ðUvà7¥á é“uóœ’_Í=ôõÓ 1V½;++ñ¯áÃø±jØÅ.B}—(3viÒ~öôþÁyÚo×} þÞšMøÅ4gü›=pŠ?i¿Hš…ðÛÄŸ( •²¥ûÃnÀÝ~up«ßˆyªßO´¿µ,èkR‡bÿÔÔ䔡ü¦P1`Usaý¿ßކ͖´£êߤð‹½]÷Qõå^„€VKôÿÏ5ØTN`—}|Týy¢;<”ú7ZÍzì'í·YýÒ5°é>„‚kZ÷1àëT@(ÿÔý§OÇŸ"åi/--5%ßd$  ‚~´ÿúÔ”ð‹-ké?ŸêÿúǽKAäz$þŽþöaì>¼ ;ƒ6ò— ¦nÕŸ1⸠‘gyžö*ëLò×S…š;•m·­c«Þh¥çE>ùÓm•Èö¨`;üNG”XN¢m–ªJ ñ³fÁàSèoùý\^[ÚEûÅÞ]û ö›ªoj¿®4ÛËk¦ò?²ë¾Ò~Cù×µÝ?’H?,µ_‰¿Cûï’ðdXÖz/›¤~¿aü%ó—…ç—Ú?)ÔßÔ} (÷ úÀý)Ãú;tÉßÞJÛ¶!üZ÷Û¡µ¶Ãó±6Rú•ë—–_ÿXk¿|¨ÂÀ<ÑÞR~“þ û5]`ìÊoñ^»WíWºÄ¿&ŒÿS²ü:ï?Ê/Ô_˜~|HÖKá—q€èýC)Ñ^k¿f¿”~8øAZ±vµd~’¨/´ö —Ÿ•¼'êÓß²šüõÀsäz0ø¯ÿGûýñ½Øè„f#êô½Ù鯄ò{ªù%ëbH¢K ò÷É¿Ùu\uü-²ÇŠ®ÏzòÈß7}{‡¾IüŠ·dzº#`½”D¼úð½@삾ߌ.Å?þ¼"à=öÎ×þ½SS÷Úß,ÙeßEù­ò_3é¾~<Àl)¿®Ú]­ûÃ:ëwhÿ­~Cùïjí_6ó}ñ÷kí—•ïʯ´_Å€×È{tû–÷ÝŸ²åû¢¡÷Ý*”¿µÝ,á[[-ÁoÕOZûI÷üHÿg†æ«ä=¥ü˜üká×A e…€®FWt5v]k¼ÖUÛu­ËUûµî“í¿&…_Š>=¿Mè?E’~ÓúK`©öãš÷ãvíÏëïùAi&©š¢¿ÔþŒÖ~"¾Èõ³Û X ±òG4ÿÑ¿,mtv¯t^±‘ŸJóŽ-¨¬M“Á®ö´íx0 zh7íÑl‘ßëé»;1›'­óp£Eõ‹Ù<òÇ*ËËMò{^D©œ¯È§:–Æ«óP ©óô]LùÍBŸ“úJûEÕ/m¯ùS;GûAùO䷴ߪó­iöËðHª¿¡ÿGÍ–ö7«¼_è¾,õ©@0_i¿æ¿%ýH}þ»†õy¿~Ò}§òkö[¼'íŸt~Ù€1€lD€©ísŠ}ÛDúvÊûÛ-í?&ío•vÍ¿`¾!ýó¸ÕKÅ—ûg¦öÏ+áGç¯6Óù§„ô7Ú­€Úk°á£K‰¿Mû­Œ™MýI÷§ïÔíéSÅþ[ѯÔHdª?Žâ/ÆõÇ•ç_ú„Û·©D⟥[júä--Í‚ßãP'ð|ã xüà*þŸ¢èþ£þËÿÿ°ñ ºïknm"}O“òƒ°W")Óƒ“-$#ïê<1'ùït”‹à±Yzñf]™†(ìÚòÈuJÛeRoYâ xÚðc垎 uõÙ‚€KÏŸ—”ß)þB÷õ]´ß©ûμÿ•tkpdïÌKüåi¿Ðÿõ#;ý…0µßVï7´_øÿ~³âÒ¯u_)¿ ·–ÏÑþ)ËX1à{¡ý´ÕñÚöŸ„[$þöÎ@$;Ðÿeë±ØTõï™,ø¡òߟKñŸ¯12~É|!ùêXûS5–æKÆ+÷/F¨íïß…´wA+hç/»~|o6Jd’þ÷¥FÞ/CÀ¸¦©©û¢Ê/{þ¤ ûb‹¼3¬Tÿ¬ ½Èû…óÏêq×¹•.@ü?ß²qeãÊ•ÎNÜÑ3Ä‚¥ùcuTàv´Z÷»‰ìÚã½#l¬ˆXX$U˜̦¤Ü´ý^ÙùîU¹|ò£“Ç‚ßV>ùÛ:›–Ah:0h¼„ÏâW÷Űᢠûí!À .Í=çGíß;gðO>ý8JþÍkhûÖ_Ëÿš~›ö«´ÝMùlõþa©ûŽa?*Õ¿%^P@‰ÿ¤j’úùÚ?µl)ÿ¤*øOé^?5ö=?Ù}cô=(Û/ˆ/°-+ôLº/©ÿRåüÊjŽçIúíŸÊ/çµù¯‘Ù¾­æ§´^°¿F¿@î×BÂÔ'þ»û±èÿãÁ5£äoÚcèÏ{½·[YúÏH¿/[©æ½Ùß/¸}~=¢¨€LþÅÞÒ~!öº»ÏVðc˜’ïJû´-íÇç´QíÏÙ´_qÝÅø“'x`y¿ÃøËœ_ê>>ÖuÙïÐ…ß>pØÔKû‡UÍßÈûupKÕþßAøûoYù¾Nío˜4h?)Šþ“†ðË1>$ýTó±À>þOdþdÿ[·[e ÀìÓ. ~/)÷©„_Sÿeÿ ÿŠþRþíÊߨò~Êú)é@•üæÍ í>\#×ßEY?…gÚoØ~=ÔGþM²_û\¤ýOu¹ÏðýôœQIáû5ý3Õá×#R~â;²_åüTû3 R¤ü¢»O0ßÇ÷±wEîñ7µÏÒþ:ówjÿš«ö»´WfÞoô£@Ð,¿ììü_äû‚þ„ñu‡ö÷ëš¿‘÷[)¿½Ãó}cدCÿyÿ”îó³úù•ù—%ÿ)ìé{=eËù ío•UÿV™ðËÑ>ªòGy»RûgÇVŸŽç­¿Çbä¯ÕõW£³ÿFÕÝ'Jïßj÷Iþ‰÷Ž´ëý.ôWÂ/ºûóéo9Ô~‹ýV©Ÿ^«:¿òšû2ûÏHÐ#¶¬ä~ÖªøgDÕ¯ÇR~à'ºûðQhž1 ƒÁ`0 ƒÁ`0 ƒÁø\üƒÔ endstream endobj 106 0 obj <> endobj 107 0 obj <> endobj 108 0 obj <> endobj 113 0 obj [/Indexed /DeviceRGB 255 <000000FF00006B6BD2FFFFFF666666FF66667B7B7B6666C24A4AB96B6B6B4242 B1F30000FF9090B1B1DA888888737373B1A1A1FFB1B1CC6B6B181818FF33337B 7BCC6666B9E33333B9B9B99090D2DADADA8888CCB98888FFC2C2424242E37B7B FFE3E3DA9999FF1818FF7B7BEB2121B1B1EBFF4A4A8080D2C2C2E3A9A9A93333 33F33333D252529090E3DADAF3CCCCEBEB1818FFA1A1999999A1A1DAB99090FF D2D2525252EBA9A98080E3A1A1E3EBEBF3080808FF08087B7BD2FF73737373C2 5A5AB9B1B1B1292929FF4242E34242C2C2C2E3E3E3DADAEBF38888FFF3F3EB90 90FF2929FF8888C2C2EBB1B1F3FF5A5AD2D2D2EB4242E34A4A9999F3CCCCF3A1 A1F3C2C2F37373D2FF6B6B8080806B6BC26666CC5252B94A4AB1FF9999B9B9E3 B1B1E3909090B1A9A9FFB9B9D26B6BCC7373212121FF39398080CCE339399999 D29090DAC28080FFCCCC4A4A4AE38080FFEBEBFF2121FF8080F32121B9B9EBFF 52528888D28080DA393939DA4A4A9999E39090EBE3E3F3DADAFFD2D2EBF31010 FFA9A9A1A1A1A9A9DAB99999FFDADA5A5A5A8888E3A9A9E3A1A1EBF3F3F3EBEB FF101010FF10107B7BDA7373CC5A5AC2CCCCCCEBEBEBB9B9F3B1B1FFD2D2F3CC CCFFA9A9F3C2C2FF6B6BCC5252C2D273739999DAC28888F329298888DA9999EB E3E3FF8888EBA9A9EBF3F3FFD2D2FFF7B796FC949005E770C2F0F4F7B82899EB 94F741F7FC9490F7B84E6D892D05E770C2F118F7B77BF741F7FC949003EE8803 D600F713EE00016FF7A2E3007DF1C2F164000FF8DF0008402004F7A3A0C40000 1F200C000FF8000000C4000CC40000DF0008000000F713E22A001EC4000CDEFD 30C2F18CF7A10E03EE8803D60000000305E00FC2F1A800E44A05E0F8000032F7 B9C59A3DEC000030001DE803B600C2F1E000CD7C00000900CD5C000000FF92D0 05E10005E17003B600C2F20400CD7CC2F21000F56A033238FFFFFFC2F2780010 260000300021F9000028FF92D0601232FF94D0FF92A005E100F432F805E100C2 F22C66E8880000006021D3FF92D0F432F805E100C2F26C66E94B00000060D91D>]endobj 112 0 obj <>stream xœí} Oi–¶s1Ónó!H ‚Âf0IX&|&\‡5Ù| .FÁËe@_˜ F€Âm#I‡ÉÆÍF ¼?tÏ9ï¥Þ*@fâäö‚ Æ—AçbSHôïÝœiñ×­ôÆ |E ã‹`c±ªw ~~^±Iäo*ô%1Œ/+óŒÕû'6+6Áö³ò3ßBÁxo¨xÌïŸh‘¿B_ƒÁøhÙXœ{2PÜ]ï÷û»Aø¹«ÁøFp3¸Ÿ u‡zçªxƒñm`3Ä¡ýÅÐB¡¹3…¾ ƒñ…н±ØTõ$„xRÅÓúŒoþ`0^UÕ47×gî3ßî÷nãKñÅ•_ }) ãËâ—¿ßߢ©½×Â`0 ˆë}…¾ƒQT³ø3ß(n3ûŒoÑB_ƒÁ( b· } £0ˆ²ñg0¾MDÙø3ß&˜ü Æ7ŠëìûŒooXúŒoi&?ƒñ­àæó ¿_/äã®ü­µ_ð‚~ëë…¾ã7Ÿ·øWz—:7®|×ùžÔëFþÉ|_ôÒÎÇZÏwTè‹`0þA1S/‰òW6®t^¹Ò Mþëyä_?ðùþ—?× —Âäg0.‰ûÀxã †zõn,Zm;{­Ñ÷ïÿ[È¿ñù²L~ãÒ~'(Ÿ¯P °”?=4NÍ=óù’¨¶]¸Nî–ŠkI2ùŒKÂOt¯j©ðw^¿¡üѨ1©¿•ˆbë»V€ë´aý\^ +?ƒqiÜDÅ‚G3”ñ9¿Yï›üA2ß—ÌØö?˜Ïd“Ù$\+?ƒñˆåïÓÑXçw6å¯Öä§:!YhåÏmõ3@~V~ãó0°Ñ¹!Ž&déO+4:(^S…6‹;Tþ7…¸VDi&›Aîù³>îçg0. g°Sµl!@“äÔÂ/Ò}‚ü€ú@ÿd6+²V~㲘Yê\zNGcADgç†$ÿmÝÑ×*óý¬(ùÔögüÙ üŒÏÅÍÅ`pf—‚ ý@AþÃh4-ϱ+a ~D~¬øù²lûŒÏBïÒâRh³Â_ BÀ Èo ?)¿¦~mf¹ŸM²íg0>þÅx|1¾ø!þ!aø$òGÑ}¨üY‹ý…·ýÄþ$Û~ã³P¬ÿP¯Š ,Å—üףј>¥Õ&üÙB“?+J~äüïòZŒlܯB4‰†ô_ôÓL~cX¿™óg}ÉÆ|ãÚèëöð~*mwwyxïã×p:üëÙY8ŽÐgÚÏú_{jFTüPù“IV~ã3ðóœDÕñ c|Ï|¾?(É—ìÅæøº½©ðþ~d?Lã^ ¯6œÏeÀéò*œFàùRûíkÎó¦J!ßÇFôïÉRw]l\øc0.ŒÇOû逹/GõËQ}IÓö'³è¼3™Tþ—­½ìÚOõS¤û€×ÀíÝÿ>ïçOV‡VOV"«4æá“?^:,ÃÔ¸`þ¸èë“I¿;ãâ(Ö?é}ÒÛ;ÛÜ\SÕDLíóŠQ}¶j?xnâþxžòçºà>)ŒJt&ú¯6ä\|xHpÿ%Š?6éýáKöSvFùýã2é—}D8bò3—¿7ê õÂz‚ìŸû'£Øgé½:H’éGÔ8¾ho>±OÔßGþ*âõONVON]~ûס“!|t?ŒÊOQƒØIì›ç"ùÉ÷Ó ¿lR;òñãRh …B+ÐBž„zç~3 ýF²o R(¿Ãö¯ãß—ôO¡‚£éôzƒ¾çgþ£C#'CC@þW-å—ÒI$Ì€AäÏ’ñÏR¹ß¢>+?ƒqÜX‘Qèý-–Óoúœ@Ê÷3™yÛ×ìu%ÒôƒòHÈW¥ò¯"ÅÚ:424´{‚äÔ틤63¾ùµðgù…+ö2Œ‹âþ€ÄÊÊñÿ/­7¶™õ¾,ÖÝl9n^Ⱦþyð°HãWQ×ÑÞíæì¿ündhw„„ÿääDÿ0±¬? ?|á²uvƒ~Ó÷[®„•ŸÁ¸8~(¦FüýÿÆ›NÛïÓõ>‡ò¿ÝGîKáO…SaUëá‚ ŒüjûáW#€¡]Š (þ»ïÎPýQù÷¥ö'ö­Ó…ògÇůÓ0ëêXùŒ‹ãfw1Bñ`eÓxÓÅô'E_ßxÖ$s‚È¿¿Of=œŠDVwÏ^*ú½GvGFliÿè±DP_†½³U•õ§(–XÒß  ~Ö0V~ãsð˜È?V,B¿ÅxÓ-çÝüY[Á¯Qr;ùQ¶w‰æ¹_¥ðCÊOLkþð[úÓ‰ ÿOê¯Ã`üçUo_"ѧËj–Ä_¬èa]+?ƒqq<öuwûíÊŸWíOf{¨ânöóß½Šäߗ‰h½>¢Z?æûCÄSú‡FýÉõ[oìb¹ÈIääe¿êÓ0®ËýjjU‹`åg0.·€äÿ@…ñ^žîõ³Rû Û?Ü¿ M°×zg;ù‡PÞIù²ÞÙCê¿Bã?tbô…_î6ŒöŸ:û¦ˆúBû1Ð"ž¬ü ÆgÀß]è®Gþ#û7'´›å>_6LÿÞÕ« I}ª÷åŒ÷ND±ì=ÁzãT ?ÕûOÞ}âÅjî ågÅg0.çâ›þz’ÿâ çZ åÙÏ¿Qgâ*¥ü²à×`¾Òä¦b?°ý­¥ð¹·Èþ·ôŽóý„é´˜‡œØ×ƒ¦Ÿ'ô0Ÿ¿±¼¿ ù³¦ïÏŸÏ?ÂÒ/¹i6ß;¥þ!)ü#µÞQÊ/»úWëg££Ín£€ Èr¿˜Ù“dåg0>é3Ù_ßíF~£“?ébûß_¥”_VüÃ~¥ò á7ëýôRÒÿDŒðÇ©½‘ðnÿiUc|Øö3Ÿ‹XßðþŸ-úÍ8O±­á—Í_Ìc„_Ò?’Ûß=#é—"ÿÖHúÿ›Ê}¤üb€¿œÜüO¥vïæ\/7#†øeiF?Oèa0.ëÑ´wÂoÙŸ¯üz4 ÖûòÉß|ÕÈù#‘HûIûnûî¶³wgTî“Å~hVfŸÃ”_)ÿÍ ¾4-(Ùop+ŒÓ¼½€/“ŸÁ¸q±®–– „fÿŒó,Û~.ä§^þ„®ö›Ëøà„>Tþ!9Êgä­Áè¿êœ_ð%åËñ½)ç„~‚ZɇÆösÎÏ`\bîîf ÂbÿŒó´‘¿áêUQï¾GçÍÓ}ò“!1ÆG)¿9ÌÇÈù‡TÒ/föÐJ@ûûgy—lüàjšóN`0‡\¤s`ÐßüY‹û.ýüS ´ýªÚŸ@ÛNÚ/çõœ¨‚ñß\ÐkïJùMåˆ~`üö^C„îê˰ò3—…Z¤³bsSð_°¿þ†óDSùÝ ~ V¹’~þ”X¿/,øIåG¡·­æ·÷VŒÔ·ôÐËy8Ù­”?Ë9?ƒqY(î?ž©ûÏU~Ëõ»ÙþI³Ú/&öÐ^±Ž‡˜²«¤ß¾”gî?‡dÊ¿z"‚)D(?.äçø­ŒZÊGäülûŒ ã0z]ùgff*Èúûgœ§ZÕ~*÷çð›Õ~k”ϼ´ý‘°š×£êýNò{½§ÿI¿Ö}±–Ìùû Ǩ}]ìϰò3—BßmuWŽŸgfn û+Ðø»“ß>³'o„_s¾ò‹¥|(é²ÿ<ò{ñž# ü/UüHøi^ŸsÔÀ¸X»;ÃÕ~ã’°îÁûóù'>Jþlþ:E??P_Tûç§§kÐöâpÎõœ¿;‘®^ÌçO!õ÷‰œíùÊß®gõ‘úæÊ{©ˆUïK$–moÊÛu‰A>¬ü ÆE¡ïŸ®æÆïåüëæb^Ùd&ï뎤í—+ùØjt¹ß£»wz:<üÓÙÙªÉâZ¾“ï†ï´/ù›‘KyHåŸü¤ÿ\ƒ!q]õñ#€ø7ˆûçVû¬•2if ꃜu ñ“S{‘ý~ãûXÆ;ûixô•}a®W¿þôŽº÷iBϪ¹’O¿Èùé ¯:rþ.P~ZFL(¿ìyàî~ãÓPm¸þDz§]ÿ„ë¿ucJ/®Ü]:utw»+c¸ûVáûåœÞýˆõVƒ^»ŸîÌ1¢~{ÿðoâ^]«ÏDÂäÏÙ®¥±Tß±'‰~¤±}ª6yð·øWa0¾ÜÖwáõz®æ›ÂŸ?¯Ù6+í=Xt›²ÎÈIòÓHŸÈ~*%Ù¿&‡í…Qßi!ÏœúÈ«= Ÿ`Ý‘{]?Ú~rýÖÚÝ„F½x¯yûàäßè†ÁøÊÑ­¶Rþ_**Ôð^Êøëýÿ7ï>›ôc;ÊïkãŒvs˜ÎÇ 7Œö¾”ÔÇÁ{â†\Æ*^'CrmO9£'<šÃ?ï5¤tOÖûS{ÚEO_FŒñÑø[þó0_/Ž>ïÍŠMIý‰s¦ôz3ö™=”rÛoו벆øÒŒ~q“nû}ºWmkôâÊž«òîÜrdßnûnX ðÙÜ/áè7œ”Â/”_oÓã«EµYïÚcÓsúüÝ3y¨±I?òÍ·mÎÍ‘îí£Ûõí«™}4Ä_êÿÉIÎøDîäÄä¾ÝgõóEð wíWâmÜÇ‘ý>¾cƒqA˜äÿ¹¥E®å1¡–ñšÉûÀ¤©üú>½öþþvYò»º/²~âp8bQ(n/Üë„_Ýw>¢—ñÀé¼h$rÎk—Âï3oÒËýý Æ'!jÿ—‰–‰½ŠW½¿¾Û…ü9Û=»ô}zí'Í'(ë$ôr>á”pþ’ú«Î¹w«Öd¾°^ÄCÌé‘ý|ùƒZ³êf]jØnÜßÏ`| ¢FOß ÿ6Å}¼oOÞžŽå<|IºQ¯“ü¹°ãK¦ù}b–®S÷»V¾§¤ÂÒò§h= ü®¿æ}Ä»7žµ:ú4Ú?÷ß„Áø&`*ÿ¦céÞn—›vÞ›Ê/´?›qŽá?KÐðþ«2éW{åb~n#ýÞ™sø#j6_Šfó%ö#®“&3bÙn›i½ü¿ƒñ á¶EþÇzÝîz¡ûn·ëäžÔ÷ɂ޸º£ÒËôòNÝ)¹œW$üSÎõRŽ„á§•»ÂF­…?õNy±Ž‡-áQ> ƧÀPþ›@yâ=4y«¾üu"r]û‘üI`¿Ë Úá”è—Py?!Ü;÷bFOÔŠ½ÒóGhh_äìü¹“ìp°i?“ŸÁøD«£êf-HzÁüzy—î7åÕd²–öÌ¿vP:ÚŽºäO…çwï~däýéðÙ‰òü4¶/uÒ_°aªÖ”ýÄñòƒß?ŸÁ`bzxïc}{nIý±âWå>>::ZoþØŒýWk¯ÖÄj>Ÿ|Qê§á½Â\^Î'žÎ`0ƒQq·¯÷—n…1BqñÀÀÊïŸÁ`üCã ø~q´9f˜Ügò3_/¢Ñè!î×kæ÷WZ }y ãï…ê¨XÊç9¾˜hOªÜ…˜ü ÆW‹¾¨ä7t/–¢~Áäg0¾^û¯{½cHxE|IýÞ¹‰B_ƒÁø»!Åš_Eh%´‚¬³/˜êí›cåg0¾b ‚ôGBÈþf>P¸ÏÊÏ`|ÕÀ¬ÿ@wÚˆø`ø‘úMMþB_ƒÁø{¥ÿ7ú^¤}¯Ð|ä~0(ˆÇk  Ø`D‡öí×­ØÚ·Û[U;/$`4 ‡ý1íÙ÷hýÿÄÿm1¸ º¿|'€þz«îá`90>FB=»S‚ìóîÌvô:hØp%FŠ’ÙXÚOe-#¯C;à-¸³0ˆ~¿£Ž–¯ë0Ïi[hÃìÂû¢Òƒ!¡­r– ±J¢}Y]ú‚­…E”Q<ž‹åü–æ›Òo ì™MÐ<½G> }®öŸ>85èoñœ8ß¼ö Ù­h¿$‡‡ØÐ¬K7 Žá@÷©MXE÷#hÃJûG%ñiwËlŠñ¸5yKcRøIý~;é—÷‘ößOM‚ðO~?e6EðÈ{`?6ê#í[‘îÛí†%  6¤=vÏZ%ÿéÙ >0_qý˜žk„-˜·”ŸœB#n©šFxn´¸ßˆÜo´´ß&þëkmD×Ú ŽDÄGšÙáàGhHtr?RC¼/ŦP|—dÇnÄthÁ}â|¾ê)U„—ÜïÁ嬀ö¸¨º‚,nÂøp‡/ðöZ´è…XçÒ"ÿÅÅ¥xü7,ûýWÓ"ÙýÅÅà´ ù©Âm«{8‹‘òw$?p\áNݬ`{Ñ2à¡é‚ž:.£W]ûï -ðUvà7¥á é“uóœ’_Í=ôõÓ 1V½;++ñ¯áÃø±jØÅ.B}—(3viÒ~öôþÁyÚo×} þÞšMøÅ4gü›=pŠ?i¿Hš…ðÛÄŸ( •²¥ûÃnÀÝ~up«ßˆyªßO´¿µ,èkR‡bÿÔÔ䔡ü¦P1`Usaý¿ßކ͖´£êߤð‹½]÷Qõå^„€VKôÿÏ5ØTN`—}|Týy¢;<”ú7ZÍzì'í·YýÒ5°é>„‚kZ÷1àëT@(ÿÔý§OÇŸ"åi/--5%ßd$  ‚~´ÿúÔ”ð‹-ké?ŸêÿúǽKAäz$þŽþöaì>¼ ;ƒ6ò— ¦nÕŸ1⸠‘gyžö*ëLò×S…š;•m·­c«Þh¥çE>ùÓm•Èö¨`;üNG”XN¢m–ªJ ñ³fÁàSèoùý\^[ÚEûÅÞ]û ö›ªoj¿®4ÛËk¦ò?²ë¾Ò~Cù×µÝ?’H?,µ_‰¿Cûï’ðdXÖz/›¤~¿aü%ó—…ç—Ú?)ÔßÔ} (÷ úÀý)Ãú;tÉßÞJÛ¶!üZ÷Û¡µ¶Ãó±6Rú•ë—–_ÿXk¿|¨ÂÀ<ÑÞR~“þ û5]`ìÊoñ^»WíWºÄ¿&ŒÿS²ü:ï?Ê/Ô_˜~|HÖKá—q€èýC)Ñ^k¿f¿”~8øAZ±vµd~’¨/´ö —Ÿ•¼'êÓß²šüõÀsäz0ø¯ÿGûýñ½Øè„f#êô½Ù鯄ò{ªù%ëbH¢K ò÷É¿Ùu\uü-²ÇŠ®ÏzòÈß7}{‡¾IüŠ·dzº#`½”D¼úð½@삾ߌ.Å?þ¼"à=öÎ×þ½SS÷Úß,ÙeßEù­ò_3é¾~<Àl)¿®Ú]­ûÃ:ëwhÿ­~Cùïjí_6ó}ñ÷kí—•ïʯ´_Å€×È{tû–÷ÝŸ²åû¢¡÷Ý*”¿µÝ,á[[-ÁoÕOZûI÷üHÿg†æ«ä=¥ü˜üká×A e…€®FWt5v]k¼ÖUÛu­ËUûµî“í¿&…_Š>=¿Mè?E’~ÓúK`©öãš÷ãvíÏëïùAi&©š¢¿ÔþŒÖ~"¾Èõ³Û X ±òG4ÿÑ¿,mtv¯t^±‘ŸJóŽ-¨¬M“Á®ö´íx0 zh7íÑl‘ßëé»;1›'­óp£Eõ‹Ù<òÇ*ËËMò{^D©œ¯È§:–Æ«óP ©óô]LùÍBŸ“úJûEÕ/m¯ùS;GûAùO䷴ߪó­iöËðHª¿¡ÿGÍ–ö7«¼_è¾,õ©@0_i¿æ¿%ýH}þ»†õy¿~Ò}§òkö[¼'íŸt~Ù€1€lD€©ísŠ}ÛDúvÊûÛ-í?&ío•vÍ¿`¾!ýó¸ÕKÅ—ûg¦öÏ+áGç¯6Óù§„ô7Ú­€Úk°á£K‰¿Mû­Œ™MýI÷§ïÔíéSÅþ[ѯÔHdª?Žâ/ÆõÇ•ç_ú„Û·©D⟥[júä--Í‚ßãP'ð|ã xüà*þŸ¢èþ£þËÿÿ°ñ ºïknm"}O“òƒ°W")Óƒ“-$#ïê<1'ùït”‹à±Yzñf]™†(ìÚòÈuJÛeRoYâ xÚðc垎 uõÙ‚€KÏŸ—”ß)þB÷õ]´ß©ûμÿ•tkpdïÌKüåi¿Ðÿõ#;ý…0µßVï7´_øÿ~³âÒ¯u_)¿ ·–ÏÑþ)ËX1à{¡ý´ÕñÚöŸ„[$þöÎ@$;Ðÿeë±ØTõï™,ø¡òߟKñŸ¯12~É|!ùêXûS5–æKÆ+÷/F¨íïß…´wA+hç/»~|o6Jd’þ÷¥FÞ/CÀ¸¦©©û¢Ê/{þ¤ ûb‹¼3¬Tÿ¬ ½Èû…óÏêq×¹•.@ü?ß²qeãÊ•ÎNÜÑ3Ä‚¥ùcuTàv´Z÷»‰ìÚã½#l¬ˆXX$U˜̦¤Ü´ý^ÙùîU¹|ò£“Ç‚ßV>ùÛ:›–Ah:0h¼„ÏâW÷Űᢠûí!À .Í=çGíß;gðO>ý8JþÍkhûÖ_Ëÿš~›ö«´ÝMùlõþa©ûŽa?*Õ¿%^P@‰ÿ¤j’úùÚ?µl)ÿ¤*øOé^?5ö=?Ù}cô=(Û/ˆ/°-+ôLº/©ÿRåüÊjŽçIúíŸÊ/çµù¯‘Ù¾­æ§´^°¿F¿@î×BÂÔ'þ»û±èÿãÁ5£äoÚcèÏ{½·[YúÏH¿/[©æ½Ùß/¸}~=¢¨€LþÅÞÒ~!öº»ÏVðc˜’ïJû´-íÇç´QíÏÙ´_qÝÅø“'x`y¿ÃøËœ_ê>>ÖuÙïÐ…ß>pØÔKû‡UÍßÈûupKÕþßAøûoYù¾Nío˜4h?)Šþ“†ðË1>$ýTó±À>þOdþdÿ[·[e ÀìÓ. ~/)÷©„_Sÿeÿ ÿŠþRþíÊߨò~Êú)é@•üæÍ í>\#×ßEY?…gÚoØ~=ÔGþM²_û\¤ýOu¹ÏðýôœQIáû5ý3Õá×#R~â;²_åüTû3 R¤ü¢»O0ßÇ÷±wEîñ7µÏÒþ:ówjÿš«ö»´WfÞoô£@Ð,¿ììü_äû‚þ„ñu‡ö÷ëš¿‘÷[)¿½Ãó}cدCÿyÿ”îó³úù•ù—%ÿ)ìé{=eËù ío•UÿV™ðËÑ>ªòGy»RûgÇVŸŽç­¿Çbä¯ÕõW£³ÿFÕÝ'Jïßj÷Iþ‰÷Ž´ëý.ôWÂ/ºûóéo9Ô~‹ýV©Ÿ^«:¿òšû2ûÏHÐ#¶¬ä~ÖªøgDÕ¯ÇR~à'ºûðQhž1 ƒÁ`0 ƒÁ`0 ƒÁø\üƒÔ endstream endobj 114 0 obj <> endobj 115 0 obj <> endobj 116 0 obj <> endobj 121 0 obj [/Indexed /DeviceRGB 255 <000000FF00006B6BD2FFFFFF666666FF66667B7B7B6666C24A4AB96B6B6B4242 B1F30000FF9090B1B1DA888888737373B1A1A1FFB1B1CC6B6B181818FF33337B 7BCC6666B9E33333B9B9B99090D2DADADA8888CCB98888FFC2C2424242E37B7B FFE3E3DA9999FF1818FF7B7BEB2121B1B1EBFF4A4A8080D2C2C2E3A9A9A93333 33F33333D252529090E3DADAF3CCCCEBEB1818FFA1A1999999A1A1DAB99090FF D2D2525252EBA9A98080E3A1A1E3EBEBF3080808FF08087B7BD2FF73737373C2 5A5AB9B1B1B1292929FF4242E34242C2C2C2E3E3E3DADAEBF38888FFF3F3EB90 90FF2929FF8888C2C2EBB1B1F3FF5A5AD2D2D2EB4242E34A4A9999F3CCCCF3A1 A1F3C2C2F37373D2FF6B6B8080806B6BC26666CC5252B94A4AB1FF9999B9B9E3 B1B1E3909090B1A9A9FFB9B9D26B6BCC7373212121FF39398080CCE339399999 D29090DAC28080FFCCCC4A4A4AE38080FFEBEBFF2121FF8080F32121B9B9EBFF 52528888D28080DA393939DA4A4A9999E39090EBE3E3F3DADAFFD2D2EBF31010 FFA9A9A1A1A1A9A9DAB99999FFDADA5A5A5A8888E3A9A9E3A1A1EBF3F3F3EBEB FF101010FF10107B7BDA7373CC5A5AC2CCCCCCEBEBEBB9B9F3B1B1FFD2D2F3CC CCFFA9A9F3C2C2FF6B6BCC5252C2D273739999DAC28888F329298888DA9999EB E3E3FF8888EBA9A9EBF3F3FFD2D2FFF7B796FC949005E770C2F0F4F7B82899EB 94F741F7FC9490F7B84E6D892D05E770C2F118F7B77BF741F7FC949003EE8803 D600F713EE00016FF7A2E3007DF1C2F164000FF8DF0008402004F7A3A0C40000 1F200C000FF8000000C4000CC40000DF0008000000F713E22A001EC4000CDEFD 30C2F18CF7A10E03EE8803D60000000305E00FC2F1A800E44A05E0F8000032F7 B9C59A3DEC000030001DE803B600C2F1E000CD7C00000900CD5C000000FF92D0 05E10005E17003B600C2F20400CD7CC2F21000F56A033238FFFFFFC2F2780010 260000300021F9000028FF92D0601232FF94D0FF92A005E100F432F805E100C2 F22C66E8880000006021D3FF92D0F432F805E100C2F26C66E94B00000060D91D>]endobj 120 0 obj <>stream xœí} Oi–¶s1Ónó!H ‚Âf0IX&|&\‡5Ù| .FÁËe@_˜ F€Âm#I‡ÉÆÍF ¼?tÏ9ï¥Þ*@fâäö‚ Æ—AçbSHôïÝœiñ×­ôÆ |E ã‹`c±ªw ~~^±Iäo*ô%1Œ/+óŒÕû'6+6Áö³ò3ßBÁxo¨xÌïŸh‘¿B_ƒÁøhÙXœ{2PÜ]ï÷û»Aø¹«ÁøFp3¸Ÿ u‡zçªxƒñm`3Ä¡ýÅÐB¡¹3…¾ ƒñ…н±ØTõ$„xRÅÓúŒoþ`0^UÕ47×gî3ßî÷nãKñÅ•_ }) ãËâ—¿ßߢ©½×Â`0 ˆë}…¾ƒQT³ø3ß(n3ûŒoÑB_ƒÁ( b· } £0ˆ²ñg0¾MDÙø3ß&˜ü Æ7ŠëìûŒooXúŒoi&?ƒñ­àæó ¿_/äã®ü­µ_ð‚~ëë…¾ã7Ÿ·øWz—:7®|×ùžÔëFþÉ|_ôÒÎÇZÏwTè‹`0þA1S/‰òW6®t^¹Ò Mþëyä_?ðùþ—?× —Âäg0.‰ûÀxã †zõn,Zm;{­Ñ÷ïÿ[È¿ñù²L~ãÒ~'(Ÿ¯P °”?=4NÍ=óù’¨¶]¸Nî–ŠkI2ùŒKÂOt¯j©ðw^¿¡üѨ1©¿•ˆbë»V€ë´aý\^ +?ƒqiÜDÅ‚G3”ñ9¿Yï›üA2ß—ÌØö?˜Ïd“Ù$\+?ƒñˆåïÓÑXçw6å¯Öä§:!YhåÏmõ3@~V~ãó0°Ñ¹!Ž&déO+4:(^S…6‹;Tþ7…¸VDi&›Aîù³>îçg0. g°Sµl!@“äÔÂ/Ò}‚ü€ú@ÿd6+²V~㲘Yê\zNGcADgç†$ÿmÝÑ×*óý¬(ùÔögüÙ üŒÏÅÍÅ`pf—‚ ý@AþÃh4-ϱ+a ~D~¬øù²lûŒÏBïÒâRh³Â_ BÀ Èo ?)¿¦~mf¹ŸM²íg0>þÅx|1¾ø!þ!aø$òGÑ}¨üY‹ý…·ýÄþ$Û~ã³P¬ÿP¯Š ,Å—üףј>¥Õ&üÙB“?+J~äüïòZŒlܯB4‰†ô_ôÓL~cX¿™óg}ÉÆ|ãÚèëöð~*mwwyxïã×p:üëÙY8ŽÐgÚÏú_{jFTüPù“IV~ã3ðóœDÕñ c|Ï|¾?(É—ìÅæøº½©ðþ~d?Lã^ ¯6œÏeÀéò*œFàùRûíkÎó¦J!ßÇFôïÉRw]l\øc0.ŒÇOû逹/GõËQ}IÓö'³è¼3™Tþ—­½ìÚOõS¤û€×ÀíÝÿ>ïçOV‡VOV"«4æá“?^:,ÃÔ¸`þ¸èë“I¿;ãâ(Ö?é}ÒÛ;ÛÜ\SÕDLíóŠQ}¶j?xnâþxžòçºà>)ŒJt&ú¯6ä\|xHpÿ%Š?6éýáKöSvFùýã2é—}D8bò3—¿7ê õÂz‚ìŸû'£Øgé½:H’éGÔ8¾ho>±OÔßGþ*âõONVON]~ûס“!|t?ŒÊOQƒØIì›ç"ùÉ÷Ó ¿lR;òñãRh …B+ÐBž„zç~3 ýF²o R(¿Ãö¯ãß—ôO¡‚£éôzƒ¾çgþ£C#'CC@þW-å—ÒI$Ì€AäÏ’ñÏR¹ß¢>+?ƒqÜX‘Qèý-–Óoúœ@Ê÷3™yÛ×ìu%ÒôƒòHÈW¥ò¯"ÅÚ:424´{‚äÔ틤63¾ùµðgù…+ö2Œ‹âþ€ÄÊÊñÿ/­7¶™õ¾,ÖÝl9n^Ⱦþyð°HãWQ×ÑÞíæì¿ündhw„„ÿääDÿ0±¬? ?|á²uvƒ~Ó÷[®„•ŸÁ¸8~(¦FüýÿÆ›NÛïÓõ>‡ò¿ÝGîKáO…SaUëá‚ ŒüjûáW#€¡]Š (þ»ïÎPýQù÷¥ö'ö­Ó…ògÇůÓ0ëêXùŒ‹ãfw1Bñ`eÓxÓÅô'E_ßxÖ$s‚È¿¿Of=œŠDVwÏ^*ú½GvGFliÿè±DP_†½³U•õ§(–XÒß  ~Ö0V~ãsð˜È?V,B¿ÅxÓ-çÝüY[Á¯Qr;ùQ¶w‰æ¹_¥ðCÊOLkþð[úÓ‰ ÿOê¯Ã`üçUo_"ѧËj–Ä_¬èa]+?ƒqq<öuwûíÊŸWíOf{¨ânöóß½Šäߗ‰h½>¢Z?æûCÄSú‡FýÉõ[oìb¹ÈIääe¿êÓ0®ËýjjU‹`åg0.·€äÿ@…ñ^žîõ³Rû Û?Ü¿ M°×zg;ù‡PÞIù²ÞÙCê¿Bã?tbô…_î6ŒöŸ:û¦ˆúBû1Ð"ž¬ü ÆgÀß]è®Gþ#û7'´›å>_6LÿÞÕ« I}ª÷åŒ÷ND±ì=ÁzãT ?ÕûOÞ}âÅjî ågÅg0.çâ›þz’ÿâ çZ åÙÏ¿Qgâ*¥ü²à×`¾Òä¦b?°ý­¥ð¹·Èþ·ôŽóý„é´˜‡œØ×ƒ¦Ÿ'ô0Ÿ¿±¼¿ ù³¦ïÏŸÏ?ÂÒ/¹i6ß;¥þ!)ü#µÞQÊ/»úWëg££Ín£€ Èr¿˜Ù“dåg0>é3Ù_ßíF~£“?ébûß_¥”_VüÃ~¥ò á7ëýôRÒÿDŒðÇ©½‘ðnÿiUc|Øö3Ÿ‹XßðþŸ-úÍ8O±­á—Í_Ìc„_Ò?’Ûß=#é—"ÿÖHúÿ›Ê}¤üb€¿œÜüO¥vïæ\/7#†øeiF?Oèa0.ëÑ´wÂoÙŸ¯üz4 ÖûòÉß|ÕÈù#‘HûIûnûî¶³wgTî“Å~hVfŸÃ”_)ÿÍ ¾4-(Ùop+ŒÓ¼½€/“ŸÁ¸q±®–– „fÿŒó,Û~.ä§^þ„®ö›Ëøà„>Tþ!9Êgä­Áè¿êœ_ð%åËñ½)ç„~‚ZɇÆösÎÏ`\bîîf ÂbÿŒó´‘¿áêUQï¾GçÍÓ}ò“!1ÆG)¿9ÌÇÈù‡TÒ/föÐJ@ûûgy—lüàjšóN`0‡\¤s`ÐßüY‹û.ýüS ´ýªÚŸ@ÛNÚ/çõœ¨‚ñß\ÐkïJùMåˆ~`üö^C„îê˰ò3—…Z¤³bsSð_°¿þ†óDSùÝ ~ V¹’~þ”X¿/,øIåG¡·­æ·÷VŒÔ·ôÐËy8Ù­”?Ë9?ƒqY(î?ž©ûÏU~Ëõ»ÙþI³Ú/&öÐ^±Ž‡˜²«¤ß¾”gî?‡dÊ¿z"‚)D(?.äçø­ŒZÊGäülûŒ ã0z]ùgff*Èúûgœ§ZÕ~*÷çð›Õ~k”ϼ´ý‘°š×£êýNò{½§ÿI¿Ö}±–Ìùû Ǩ}]ìϰò3—BßmuWŽŸgfn û+Ðø»“ß>³'o„_s¾ò‹¥|(é²ÿ<ò{ñž# ü/UüHøi^ŸsÔÀ¸X»;ÃÕ~ã’°îÁûóù'>Jþlþ:E??P_Tûç§§kÐöâpÎõœ¿;‘®^ÌçO!õ÷‰œíùÊß®gõ‘úæÊ{©ˆUïK$–moÊÛu‰A>¬ü ÆE¡ïŸ®æÆïåüëæb^Ùd&ï뎤í—+ùØjt¹ß£»wz:<üÓÙÙªÉâZ¾“ï†ï´/ù›‘KyHåŸü¤ÿ\ƒ!q]õñ#€ø7ˆûçVû¬•2if ꃜu ñ“S{‘ý~ãûXÆ;ûixô•}a®W¿þôŽº÷iBϪ¹’O¿Èùé ¯:rþ.P~ZFL(¿ìyàî~ãÓPm¸þDz§]ÿ„ë¿ucJ/®Ü]:utw»+c¸ûVáûåœÞýˆõVƒ^»ŸîÌ1¢~{ÿðoâ^]«ÏDÂäÏÙ®¥±Tß±'‰~¤±}ª6yð·øWa0¾ÜÖwáõz®æ›ÂŸ?¯Ù6+í=Xt›²ÎÈIòÓHŸÈ~*%Ù¿&‡í…Qßi!ÏœúÈ«= Ÿ`Ý‘{]?Ú~rýÖÚÝ„F½x¯yûàäßè†ÁøÊÑ­¶Rþ_**Ôð^Êøëýÿ7ï>›ôc;ÊïkãŒvs˜ÎÇ 7Œö¾”ÔÇÁ{â†\Æ*^'CrmO9£'<šÃ?ï5¤tOÖûS{ÚEO_FŒñÑø[þó0_/Ž>ïÍŠMIý‰s¦ôz3ö™=”rÛoו벆øÒŒ~q“nû}ºWmkôâÊž«òîÜrdßnûnX ðÙÜ/áè7œ”Â/”_oÓã«EµYïÚcÓsúüÝ3y¨±I?òÍ·mÎÍ‘îí£Ûõí«™}4Ä_êÿÉIÎøDîäÄä¾ÝgõóEð wíWâmÜÇ‘ý>¾cƒqA˜äÿ¹¥E®å1¡–ñšÉûÀ¤©üú>½öþþvYò»º/²~âp8bQ(n/Üë„_Ýw>¢—ñÀé¼h$rÎk—Âï3oÒËýý Æ'!jÿ—‰–‰½ŠW½¿¾Û…ü9Û=»ô}zí'Í'(ë$ôr>á”pþ’ú«Î¹w«Öd¾°^ÄCÌé‘ý|ùƒZ³êf]jØnÜßÏ`| ¢FOß ÿ6Å}¼oOÞžŽå<|IºQ¯“ü¹°ãK¦ù}b–®S÷»V¾§¤ÂÒò§h= ü®¿æ}Ä»7žµ:ú4Ú?÷ß„Áø&`*ÿ¦céÞn—›vÞ›Ê/´?›qŽá?KÐðþ«2éW{åb~n#ýÞ™sø#j6_Šfó%ö#®“&3bÙn›i½ü¿ƒñ á¶EþÇzÝîz¡ûn·ëäžÔ÷ɂ޸º£ÒËôòNÝ)¹œW$üSÎõRŽ„á§•»ÂF­…?õNy±Ž‡-áQ> ƧÀPþ›@yâ=4y«¾üu"r]û‘üI`¿Ë Úá”è—Py?!Ü;÷bFOÔŠ½ÒóGhh_äìü¹“ìp°i?“ŸÁøD«£êf-HzÁüzy—î7åÕd²–öÌ¿vP:ÚŽºäO…çwï~däýéðÙ‰òü4¶/uÒ_°aªÖ”ýÄñòƒß?ŸÁ`bzxïc}{nIý±âWå>>::ZoþØŒýWk¯ÖÄj>Ÿ|Qê§á½Â\^Î'žÎ`0ƒQq·¯÷—n…1BqñÀÀÊïŸÁ`üCã ø~q´9f˜Ügò3_/¢Ñè!î×kæ÷WZ }y ãï…ê¨XÊç9¾˜hOªÜ…˜ü ÆW‹¾¨ä7t/–¢~Áäg0¾^û¯{½cHxE|IýÞ¹‰B_ƒÁø»!Åš_Eh%´‚¬³/˜êí›cåg0¾b ‚ôGBÈþf>P¸ÏÊÏ`|ÕÀ¬ÿ@wÚˆø`ø‘úMMþB_ƒÁø{¥ÿ7ú^¤}¯Ð|ä~0(ˆÇk  Ø`D‡öí×­ØÚ·Û[U;/$`4 ‡ý1íÙ÷hýÿÄÿm1¸ º¿|'€þz«îá`90>FB=»S‚ìóîÌvô:hØp%FŠ’ÙXÚOe-#¯C;à-¸³0ˆ~¿£Ž–¯ë0Ïi[hÃìÂû¢Òƒ!¡­r– ±J¢}Y]ú‚­…E”Q<ž‹åü–æ›Òo ì™MÐ<½G> }®öŸ>85èoñœ8ß¼ö Ù­h¿$‡‡ØÐ¬K7 Žá@÷©MXE÷#hÃJûG%ñiwËlŠñ¸5yKcRøIý~;é—÷‘ößOM‚ðO~?e6EðÈ{`?6ê#í[‘îÛí†%  6¤=vÏZ%ÿéÙ >0_qý˜žk„-˜·”ŸœB#n©šFxn´¸ßˆÜo´´ß&þëkmD×Ú ŽDÄGšÙáàGhHtr?RC¼/ŦP|—dÇnÄthÁ}â|¾ê)U„—ÜïÁ嬀ö¸¨º‚,nÂøp‡/ðöZ´è…XçÒ"ÿÅÅ¥xü7,ûýWÓ"ÙýÅÅà´ ù©Âm«{8‹‘òw$?p\áNݬ`{Ñ2à¡é‚ž:.£W]ûï -ðUvà7¥á é“uóœ’_Í=ôõÓ 1V½;++ñ¯áÃø±jØÅ.B}—(3viÒ~öôþÁyÚo×} þÞšMøÅ4gü›=pŠ?i¿Hš…ðÛÄŸ( •²¥ûÃnÀÝ~up«ßˆyªßO´¿µ,èkR‡bÿÔÔ䔡ü¦P1`Usaý¿ßކ͖´£êߤð‹½]÷Qõå^„€VKôÿÏ5ØTN`—}|Týy¢;<”ú7ZÍzì'í·YýÒ5°é>„‚kZ÷1àëT@(ÿÔý§OÇŸ"åi/--5%ßd$  ‚~´ÿúÔ”ð‹-ké?ŸêÿúǽKAäz$þŽþöaì>¼ ;ƒ6ò— ¦nÕŸ1⸠‘gyžö*ëLò×S…š;•m·­c«Þh¥çE>ùÓm•Èö¨`;üNG”XN¢m–ªJ ñ³fÁàSèoùý\^[ÚEûÅÞ]û ö›ªoj¿®4ÛËk¦ò?²ë¾Ò~Cù×µÝ?’H?,µ_‰¿Cûï’ðdXÖz/›¤~¿aü%ó—…ç—Ú?)ÔßÔ} (÷ úÀý)Ãú;tÉßÞJÛ¶!üZ÷Û¡µ¶Ãó±6Rú•ë—–_ÿXk¿|¨ÂÀ<ÑÞR~“þ û5]`ìÊoñ^»WíWºÄ¿&ŒÿS²ü:ï?Ê/Ô_˜~|HÖKá—q€èýC)Ñ^k¿f¿”~8øAZ±vµd~’¨/´ö —Ÿ•¼'êÓß²šüõÀsäz0ø¯ÿGûýñ½Øè„f#êô½Ù鯄ò{ªù%ëbH¢K ò÷É¿Ùu\uü-²ÇŠ®ÏzòÈß7}{‡¾IüŠ·dzº#`½”D¼úð½@삾ߌ.Å?þ¼"à=öÎ×þ½SS÷Úß,ÙeßEù­ò_3é¾~<Àl)¿®Ú]­ûÃ:ëwhÿ­~Cùïjí_6ó}ñ÷kí—•ïʯ´_Å€×È{tû–÷ÝŸ²åû¢¡÷Ý*”¿µÝ,á[[-ÁoÕOZûI÷üHÿg†æ«ä=¥ü˜üká×A e…€®FWt5v]k¼ÖUÛu­ËUûµî“í¿&…_Š>=¿Mè?E’~ÓúK`©öãš÷ãvíÏëïùAi&©š¢¿ÔþŒÖ~"¾Èõ³Û X ±òG4ÿÑ¿,mtv¯t^±‘ŸJóŽ-¨¬M“Á®ö´íx0 zh7íÑl‘ßëé»;1›'­óp£Eõ‹Ù<òÇ*ËËMò{^D©œ¯È§:–Æ«óP ©óô]LùÍBŸ“úJûEÕ/m¯ùS;GûAùO䷴ߪó­iöËðHª¿¡ÿGÍ–ö7«¼_è¾,õ©@0_i¿æ¿%ýH}þ»†õy¿~Ò}§òkö[¼'íŸt~Ù€1€lD€©ísŠ}ÛDúvÊûÛ-í?&ío•vÍ¿`¾!ýó¸ÕKÅ—ûg¦öÏ+áGç¯6Óù§„ô7Ú­€Úk°á£K‰¿Mû­Œ™MýI÷§ïÔíéSÅþ[ѯÔHdª?Žâ/ÆõÇ•ç_ú„Û·©D⟥[júä--Í‚ßãP'ð|ã xüà*þŸ¢èþ£þËÿÿ°ñ ºïknm"}O“òƒ°W")Óƒ“-$#ïê<1'ùït”‹à±Yzñf]™†(ìÚòÈuJÛeRoYâ xÚðc垎 uõÙ‚€KÏŸ—”ß)þB÷õ]´ß©ûμÿ•tkpdïÌKüåi¿Ðÿõ#;ý…0µßVï7´_øÿ~³âÒ¯u_)¿ ·–ÏÑþ)ËX1à{¡ý´ÕñÚöŸ„[$þöÎ@$;Ðÿeë±ØTõï™,ø¡òߟKñŸ¯12~É|!ùêXûS5–æKÆ+÷/F¨íïß…´wA+hç/»~|o6Jd’þ÷¥FÞ/CÀ¸¦©©û¢Ê/{þ¤ ûb‹¼3¬Tÿ¬ ½Èû…óÏêq×¹•.@ü?ß²qeãÊ•ÎNÜÑ3Ä‚¥ùcuTàv´Z÷»‰ìÚã½#l¬ˆXX$U˜̦¤Ü´ý^ÙùîU¹|ò£“Ç‚ßV>ùÛ:›–Ah:0h¼„ÏâW÷Űᢠûí!À .Í=çGíß;gðO>ý8JþÍkhûÖ_Ëÿš~›ö«´ÝMùlõþa©ûŽa?*Õ¿%^P@‰ÿ¤j’úùÚ?µl)ÿ¤*øOé^?5ö=?Ù}cô=(Û/ˆ/°-+ôLº/©ÿRåüÊjŽçIúíŸÊ/çµù¯‘Ù¾­æ§´^°¿F¿@î×BÂÔ'þ»û±èÿãÁ5£äoÚcèÏ{½·[YúÏH¿/[©æ½Ùß/¸}~=¢¨€LþÅÞÒ~!öº»ÏVðc˜’ïJû´-íÇç´QíÏÙ´_qÝÅø“'x`y¿ÃøËœ_ê>>ÖuÙïÐ…ß>pØÔKû‡UÍßÈûupKÕþßAøûoYù¾Nío˜4h?)Šþ“†ðË1>$ýTó±À>þOdþdÿ[·[e ÀìÓ. ~/)÷©„_Sÿeÿ ÿŠþRþíÊߨò~Êú)é@•üæÍ í>\#×ßEY?…gÚoØ~=ÔGþM²_û\¤ýOu¹ÏðýôœQIáû5ý3Õá×#R~â;²_åüTû3 R¤ü¢»O0ßÇ÷±wEîñ7µÏÒþ:ówjÿš«ö»´WfÞoô£@Ð,¿ììü_äû‚þ„ñu‡ö÷ëš¿‘÷[)¿½Ãó}cدCÿyÿ”îó³úù•ù—%ÿ)ìé{=eËù ío•UÿV™ðËÑ>ªòGy»RûgÇVŸŽç­¿Çbä¯ÕõW£³ÿFÕÝ'Jïßj÷Iþ‰÷Ž´ëý.ôWÂ/ºûóéo9Ô~‹ýV©Ÿ^«:¿òšû2ûÏHÐ#¶¬ä~ÖªøgDÕ¯ÇR~à'ºûðQhž1 ƒÁ`0 ƒÁ`0 ƒÁø\üƒÔ endstream endobj 122 0 obj <> endobj 123 0 obj <> endobj 124 0 obj <> endobj 34 0 obj <> endobj 33 0 obj <>stream xœíX LVç~Î9ßùÎÑR4Žx— ë¬Ä©TÑb祵dêв?ÈP2FA¬âƒ#Î6­/]¼‚6’?ÿsÆCLúvÇ7ì64mºFã%­®ñ¿çýøªÄ¶në²eáœ<çýîß{Þï}Ÿ÷ü?,áp2wþØq0× ¿ñ‘½¤,YW}àkò’U ¬' õ½ÒµE]ýýFó1±øùüÂ+~æÀàŬO(fCìNÿ¯,Ÿ").«Xó¶X~ˆM,-_’™Ïñ^bYþšeÎ-«uŸ KóËžè#óG-+_QÑUŽ•¦¿ÍüÙÔe9jœ­H]à÷Å0}ÆŒ¯¦…n[ø·ê†qL’Ñ}ž¢N#¹fÈŽÃx–©RìQË÷ÅpÖ{È"òˆL'©Da;¯™ù5ö»Èðö£Î Q¹£XM¬p³‘áÖ£¯úJ ä¡ü¾á5i:>Üéæ¡Àé@&Çq®`¬»ðýðÏU.2õ äé*µlê÷:ЍÇ{z=ß#ôr¬Õ-áz~£¿f÷"B” ”M~æ8G±R]ÄnÕ‚j]Œ9D¹^‡]€Õ^)6ø©¨æzÕ}²môÉFCTê‹´ñÓÈr§a¥§±MoãÞÇPCÔ¯;‘êÅ ÈMݲ‰ˆ}ƒ÷¶5…s§s\–V(Òà|éK¶Šœ_#S´æDÇGp^¤lGGŸXžÛGèðYÜ3æ†þ%m± =çvÿ†óY/ºîçÈŽžíî¾ëkÈòÒ¹7á¾…ÔóªÙz‡ö9©÷ãz#Þ‰úc· !›H·_À`ún€z½8"ƒx’ˆ%Rˆ¾ê›” '{ÿÿÀzÙNCº{ !¶‡Ü[Vƒ—h?é•cžÀ‰F˧,7 ôK]xÐq‘÷=ïT#]çZ¿òK+û t2Æ{×±GŸBŽÁYqmØz¿ý)mJ¸tu8Éxt Æ]_å †{tÊ>ªøfdž¯ÎÀ×{1Ë›ˆn¦3¶Bª„k­ƒolMȱרŒ¶ý“hŒÚ¡gŸ_#çw‰Oužéo÷Nb¥cc·AÈô‡¼©ÇaΡ~^;u âqƒÅîÀ.]©³2ïF8…PѽüØãï ¯C#c¥Ñ[ã^3öy¿G³· ›€Î¢ÖnC÷‰3¸›r,Ï) eÆM™ÓÎXk'O¶Óã±ÂKÅ1Öƒ¬§lˆÈ—iëLÊñ†W„wf9ñX@¤3!|DŸî¯Ç¿É÷‹3Æu¥p¥ðœnA–ĺŠ'wMÃSNnþ$h›\ÊKÄJã@ý¤ÀÉÅ» ;ˆnn°'uÖÙw˜ Î:r+á% äL³%o&éúä|l%q·áYýg¤ºµô«k(v“Óf’Ó. @µQŸ$«óôÃMØæœF¹ºƒjµ›™vö©¥xQmF‰:€jfŽšIŽ,ÅZ·m›‡“Xßê»Â}«ÕßQÌø8 ÓpŽsý ýq Õ*”1¯•8Pbç`µpˆ®BŒó49i 9Ð=a-’(<*yPx³ÛÞâç˜"œ#”33’\+çY‰_ÉQŒ½˜×zœ§œa–3;|³ÇYß0ÜÇÜ"9IòÉEŸÏ£Ñ²A4_Hîœ%ùÂø yUruÔO$Es’äLãß„Ì1g,¹vþÎ’<,<å¬(}Õœä"üý/ã%á$‰s‰{wTxÑý¸ÉÄ<9W8*zöQÍ=c¬çwø’œ«¬=Û¯šëä»A|D 6¾ïyG0Ëÿ)vù°È:`Ó»HïÀ!½…<öTè…Ì7ßeÜ.d¬¬à:gä|¼OÃ?óÂW8wž÷¶¸“QéXy~+9« —™+Wù“™Ó"çåCé3ýäEAw®"ܼe|â´ºçð¦Û„Ýî>lÑKÉsá²/y÷uÉËK‰'pÄóÉ‘—ÉÃÀ3&‹gvŽ8Ëo›UÜ›yGТ`}·­$¿ÇÏDúD>”'/EÖaÞ²¡M¾íVkê=çB&4 ƒÞh«?u|•óOëO¬ Ôá×?çeX}òÌ~W½k·WgÞå/¢¿œ¥y·Xóž]:<ƒ˜»¡+ðÊb}c±Á³o ׈³ü6l"̺fmyÇÑ´ßQO%ªto|Öÿh Èo–V"¨?!hkæš Ó†Bg0 ȵ'ux¹Ü¯˜ó"þ"à÷ÿ,áó=CŽˆòĽuû9N¶~$èYþ0¾YßÈÜÿÌù»M–5öc\ôŒKñ ñ‰!;ôçkÖïT%.ºS™ƒ¾þ“Ób¿®ªìÙî7­kÞ˾éBçÛ™+> endobj 47 0 obj <>stream xœÍ\ \M[Ûß»ÓÙç˜éÜ­Â='2Kf2&š$¤”T$Í4Ï!BÆe¾¢kŠ¢ÈP %Q*3 ÆBâÞ ÷rqßgëx¿oí}*q¹¯;}ßû‹}ö´Ö^ëyþë™Ö³MijP4M7µôô‹ð óuw㯠¹ö4×AƒûV„Çà#ïbÞMKYoÿ¡'oN%uüF«ƒôx›Œq«â}­)g¾Š5tN¿¤ßÐ* ±F¶5zhôÕ¢1Rc¬Æ8I35ü4"4k¬ÐX¯±Yc‡Æƒ™'4Nk\Ò(Ó¸­Q¥Q£ñTã†R$5µéˆä¢ž¢Á¢¢±¢I"{Ñ,Q (\4O´X´B´N´M´[”*:,Ê‹.‹ÊEU¢§¢W"¬©¡ÙD³µ¦¶æ·šúš½5hkšjZi:hºkújiFhÎ×\©¯¹[s_w{Û©=zõ2âëí¦×oèСz³¢õêžè™z†úzèu%'ž~Aþža†zvžžza>žz^¾~žzc'ÙL7ÑB¯»ÅD{= ÏÏ7?=›ðY~¾îz־ž=ô¼CôüÔzî¾a¾¡†z&¡znz¡Ažî¾¤g”»gÿÀ@/È3Äß74”œëù†êy‡¸„yzè…êù¸û…{ðŸ'÷½Âô‚BÉsò„Teêâ¦G¾hcj®nc˜[ÿÝP_òX/Ћ¼éèÎ÷¦áY˜›o@¨^˜gTÿYžz¾¡A~nÑ令ª _¡ ᡾Þ¾n âéíâáç*ÔËSåCÿôõÚ-(È/Z((¼Õð}ß°PO?/ɾþ³ÂCõìÜH1k=[Oïp?·n~àÒŸã›YxH ßNÏàp7¿Ðp7¾‘Þ!žnaž!ÂMSO¿0· ·0 _/¯€À0á¾_à\ÏoÂX2BüLf…J½…£µ»[H`€“›{x˜§} w`€çœqanî¤ÓaÖîä#ês§†»îÚ íÜ==|ýüÜÜ„*Çù»¹“:MÔ?¡uÏl…7Ç©?aO˜ámר3¡&ê§c…Wm…[…s³†»×=ûPt¢ðÞáh¦þæXuÑF/Mitî®~Uý­ñ˜ &ù„D„ûû¹…‡Ù7¾0%u»…Yœ¤þ’µšpê‹9êòêò޾êÇž ð*òÊzªú oz7ªÁ¯qmêÆ6ºã«¾ã¦.í¦¾ WÿÌ*Žs> ¾Û¨Žpž ‡ßnÜç¡T¸ú3a»!Â1°ñ[aЇ4:T—£(*ÞÚ$:ÀÝq˜¹Ó&Ž òtšdìecâ=Ù<ÔÇÖ"Ì×Î2|ö”qsì­"ýÜÆGùÏš:zPOçÁ½ô\†tœnÔ»ÓŒ¡†ú®Ãútž9¼o—y#úu?²·˜Qº/0Øc÷Ó󹇒ž]8y8ùù¥¼ô=¿\>udï¯Wó3S¸’3Y©ÊÒ£ûÞ•ßg§ÕœÍ9P{îÄAŠêMu¢œ¨I”)5”2¤ô)gʆ2£†Q}¨ÎÔdÊœNõ¥ºP¶”ÕêJÙQ–Tª5…G  ºSö”5êA9Pã©ATOj*eM ¦zQŽÔj 5„2 ¦Q©±”Õ‘jK5£FPÚTsЦFR:T JƒEéR-)eLµ£ZQšÔhª=ÕšS&Tª ÅP.Ô·”%¡¦SrJFI©”‚ú†jB¹RzK5¥fRk¨ÅT$åG¹Qk©%TåOÍ¢ÖQqT4@¹Së©¥Ô\*ò 6P˨yTåIm¤–Só©`Ê‹úŽZAÅP!”7µ‰ZI- B)*žZE-¤Â(_ Q±T85›ZM-¢"¨9Tu”J¦vQ¨Têµ:A¦¶P¨ÛÔª˜:N öRIÔ]ª„:CeS©ÝT UA]£ ©*ƒÚNUR¥Tµ•:Dí¡îQeÔY*—J§öSw¨rjuš:B%P‰Ô-ê2u’:Fm¦Rש T•Ií¤ª©ÔE*ŸÊ¢¶Q)Ô}ê&u•:E£ ¨óTõ˜FÔ÷ôj¢Â×Òëèõôz#ý½‰Ž§7Ó[èú{z+½ÞNï wÒ‰ô.z7QõÉôz/B§Òûèýt}€>H¢ ƒ>BgÒYôQú}œÎ¦sèt.}’ΣOѧé|º€>CÒEt1}–>GŸ§/ÐéKôeú }•.¡Ké2ºœ¾F_§oÐ7é[ômº‚®¤ïÐwé{t]Mß§ÐéÄâ ì– m£îÒÝh7z³Fgbe¬Õx(j-N,ƒk:i.Ô¼#Öû‰SÄÏ3™¹#+ñ–\“jI£¥OšÈ›˜4)nòkÓ¾M½šÆ5ÝÚôTÓŸ›6›Ólg³£ÍÍ›û6ßÙüF‹þ-âZœj¹¶åÓVº­†´JmuµUY«ZkµîÛÚ¥utkhÓ¢Íð6Nm.¶¹£e¬5YËOk™¬‹lœ,Rvå›oR¿¹ðÍS6–ÝÄf´•µÜvuÛÃÚݵ]µÓuZêëDèìÖm¯k¨;[w¹î“v~íV¶Ëoߦ}~‡–Ì:øu8Ñ¡ìÛß>’o”ï‘?WЊΊ%ŠT=VÏX/Jo­^aÇ%éÔ²S—N#;×7ÓŸª¦¿_¿¨ó Îó:Ÿí\Ý¥C—¬.g»üÐU»«E׈®]/uóë–Þݦ{@÷3=Œ{<ïٮ稞‹{níÉõŠ105øÎ Çà}ïÔÞØÐÞ°¦Ï€>3úìïó¨¯Yß]ý´úùôKèÿMÿ±ý÷ Ð2 p l ÏÀ7ƒü¥ î0xùà—C&9gÔÄ(dè7C}†®š=ÌuØÅáÔðo‡û ß4bĈƒ#><1ÊǸ‰±…ñyãÊÑ}F»š 19hòvÌš1ÆN»ÁTÏÔËt£é¿ÌôÌLÌÎ›ÓæÌíÌ[X¤Xܵt°œoyÜò§qÑVÍ­®Ž_;>güÿX˜Ðq‚Ë„ò‰á³&µ›´Þ¦¹…M¬Í£É¾“Ó&WÙ¶µÝh[e×În±]õ”S–MyoïdŸæ0Ö!Ý¡bj©s§¾vtw\ãønÚ´i ¦=s’;]pç•Îûߺlž>czÙŒæ3ÖÌ(vÕuÝ;³íÌ ™%n½ÜbÜÎÍúvVȬ;îÝW»?‚´–\ªRJiT+¥?køÞŸ›V…ULKe”Ε\ßDš €@ö¿að&¥¿7gpÂ{ñÏLŠá»JÏg 9<·äVà€*å7¤Œ·‹Å]T¸g îÏ€™*iŽÑ¯¨¤»Ŭ‰^'-Ù¾xûòÝ(íÛ´{ÛÞ[wo;1Ê–:|³9Û>‰Z¨bÔ}X[­-;XN*TíºÇ$²+ÿ**xõ˜»µÿO5§'ydUÔU.ë;MóŸ>FZ#!Í«à *hôHÄÍWìòÓ±#÷yçY¸c¬IÜ‘Oô ´¹s ¾‰W ab†Ìt3EÒ>SnAkÐ>SùCyö¬1ñ J3Ò£ö\SVˆ±ˆÁ68O‚L13° Þ¬j*rîÅàŒ‹Å !$¼©.‰j¸5"Χ-¸q VAÒ³ìó¾öS¶cö½  ¸«@Ì® ÖUÁü*-T wj'ÖjËÞÞi UL:½3óXú‘Ä|TŒjÜ Ó¥2îjÚá37Û¡‚È\ÏCž‡§m3#ýËcjq óÁR’öÅí‰Úù½?rG1~Á‘!QqSÉK–ø! ë R’ƒöÇî•ÊÞîÛ2Ç»òY8'<,<Ô?v’B¢\Ë47‰§~û1Ã૪æâÑܨ¸R—¹„éõÔ†‚G"ØÃ¥³¸[ÿNØ›Öt‚ÐíÉ[ ã¾Á½«G±O‹FᶸÕä‘} m+@ZÅ•µ ¾’J®g%ŒJäëɯqKp2ãS`—Êw«CLãáØì¦¡ãõS)Wræ7%x.çÆ>)ŽÛà“‡è3ñ´„–îýðsp¨VÄiC& )Ü${„c³yNJ8¤"÷2k%-•^ ì’׈”íÈç¨jU®VÜ•gQ õPÕˆßÎz…Uq/ªøa£ìÉ!6ö©ÄQ4ÂÏ~Ò¸±Þú7E¸yFç2Ó¢É׃ž!0G/Ÿï{i/fÉ´E¾óü'MðIzÕ¥HÁ &Õ€:ž+ŒܯH Ùê·Ùž¿$ÂXž,êqpú‘¶ìÅÀÞ‡½L¶}^h)’BûÇ@Ãp0X¡½2E¶s<&HïHd/F10ךýñü0Bœf‡õ0ù.´‚VgïÖô®ËRXAsñ°€Ew—žœŸéûpx~Òª®½ÉGÿкAóêR`v‘!fîâm‰ÐŒäÀìÈýqûWåK×”²_œ»tI«.Y Z‰V®ZIêTÅ]¬¢¹JBCÕ!£²R]åò«TVÎ’;O€¾³ž†ÜVÂ]e4‹=q'lˆ£p_𪹓rêœâNI.ˆ4“ÂB¬€Þx¶|¨&ôÿ7ÇÖØ´ù1Ä}ô‰ø±Ë7äÇPÁsRø>©ºC­èq[8Ä€5ˆA‘5AŽ'(ð!¦ö}{–»£%ÐùvO<[÷ÀÉÞEBså\3‰G¡Í~sBy?,&"dÔÃN ¿qjoq¦§IpWåpö1¢nÞŪ~T´„4"еÛß Ë«E°™Œ¦UÌáÄG6®E«vÊË$QëbWÏEÒQÓ]G+ú›Y”«\ª9—Gµ>V›øîÀã"Ò“‹,D3Å(g{æá쬹¨D ß«ÀåøÌ{ÿZ†k¯ ›ÀAò¸Àyøpçþ µPY[1da<<`¹ŽUªŽÃõ­R­!B?±J5†i I3£—©å®¶ìBYÐÝ#A·væeíÛ»sφ³«¥$²¾kbâVǶ·G³æ8”ÊlžI•C›zYW!âú’òÆ·‹Žû, Õtûa)5(Éìø4E¦kQp!ºŠN¤æ^•Iéâ™á~3£‘'òÛµuÉ÷ËÒ¤ƒ™MÝ+l ªD%{Ë:¹õ*‚VRÎJ‚£&°O Œ±6nco< ïA–U>V|-eð*¶wEÙíCOHt :!ö"aíúùm‡ÏÉßc7ØÎN·»9afäì%®H÷éü\} Ï‚8‹Þ!cì' @O„+Ñ^UáW„®zUªž º(á,&êÈŠkÉ®zmq· i9ºçÐcÐÚ_Qu6&)yê:9Í3Ã3aw„|ÁÖ¥[—eH0ëp‹ÒÉð-ì:÷¯¼ªt=®¿G1|§Å¶€Ý(C÷äñ´Ò’ô€)käõjS¡ÕDkŠÊÉø{ï_Mt&¯1SRÏO”'ÏA^Rµæ¬±.ìb2#l¼“ö«% äòê‡'&ÁÚD Š$Ž©Îpï§Xe…f|çšà¯ â$Æ'9nïÊ« yTúˆCUYO£j)h(ÃúrüX¡ž&Q/áDí_’¹'"a6r•rõè.Ø+ª EøÌ‚*‘rDz¸x(„D2¸m¯ÞX×Ä2%w¦Ü9?àz"‹_ )‚è®mïDù3&ºcÍx8êÆ†Ùº 1sÆb„µ¥8 ¾Å}aÚÏw2î\“'õŸ#ˆN »Áõ,¥¯‘Q·‘€qt6ÂM-®©ô‡tÿ+‰‰kÖ§ÊË%±+¬š‡¤Þ‹â3€JZB¡å«·Zè¾±>Ê ')l¤ÚUÍÈ(ý5‡tºÏ›Hf¯*éݵM$X-·…]ú=ªñÂÚ݇bþ¹vÏC0ÎùÇÐc^ÈVyD¸û…DNµA#ýNŸcA^Cx¼Ú2ÁuŸû)‹ûÞ BеÄÜô¼Ì´+èzbwµ{ Ÿ§3 yN**’Þ¼’÷H¯8¬–«9Fx’ŒØZç\SÞZàNâµJC\ªj¥DÃî)<`x±ƒs"oWúêÑ·´e¯¸ˆ¶Ü.#|J¢gg6pœ[Ö%9'1Ru— ¼b÷‹\v¡å¥ä•IÇðÁ7”ñoé,^.¼L;×qB«çÊM%ñ+ׯJ@Ò§yG®)”-$à¦iÔ©š†ˆRREC ÿR¶gaI•ªl(Ľo_ËrQйOEà@ÀÚ›4“2‚¢áH[˜Îí÷fpwÕH¬Ç$§`­Ú%^ ¾vä æ3™{wÁ gˆ_3D½?'juœXÁ!8D,¨l¥œ·t ‘D\¯™6Iz˜NÂMì]öøÈ½Sçf B)·ÉÜÇÝí&` O¡«œÛ$˜”•ÊN¤ü3&=yÈ—— ÉKgÏ ‰ôë…¤f¹¹ã%¸iåhh²;w@KÎe«ß!ît[0:¤¯2èL ã.L7•9éÀé×Sæ×çWU±€?¡ƒ÷E`@>6ä½ÿý:öõÄkÑKòØÅ+—£eH0oë^\ÔZœÂ¬±u¸‡<4h‘ÿÊ©ÒûÌÆËGöU"é­cÓáä1ÜÜt~ôò9 &†ø¹ ©ÁÕI¿^-H:sN¾Áaoè´%¬IÙH̰`Qà’¹!a¾~³æ9!©•gZAaFêãEÍ–ëR¤Ìãmaqº3x†ê=žÍ½wc`+q^áEähøŽ…fä/ž7˜5\À™Â)8%8ÿ£‹91j­är ™SØÀ£@ Ûb-°00Çã 8QüŒ]˜Úxºø…Úänä8ñÿ´e‡ë}‡*‰¬ävá…Ò‹‡=-åø=ƒ¿¼î1Ž¿ä¾•<µÏïaæaã$÷+rK¶@RY_34=x†µô¦ä#µò‰ÎòõV‰$kbAÀ "ŸåOˆ™1F z‹åcƒl<°O]ñ.¶Vm…MøØ {gª&r~[˜@¨§ÏàvªÇx÷˜P&§ß’S}&BþÂÀî9ŒP=·|‡p§ hYnu\†NZètyÂm$âeon%>.¤Ømÿ¢¿ÚáVXwÑ/Q[p|÷© Ù}ÇMG‚/µ¿‰.ì;}¾ðrÚ=T)Wl#q n†µœ†÷è? ·¤jÌÀæ°áæÝ­)×å%CÃlÛ“j}ðbÚ?ÌÀ›œ ÂzÄ>ob„ŃƒÂ“7­Ûñ]’â 㘙l:ê¶Â~å´ !!^RÙY^¡^í§¸æ_ÍŠ_î«íxT }ßñ‰ˆ RNcUŒƒª­øs4ïÐöB$}vÞªS› ½F¹dÞP `¶LŽÜœeÝï.¡½þË7Ðô ŸãÓÜøÏR¤‚“N’A£Ëm&ÁÒ@¯õX³ã‘( üÍûŸò¾T{ÑðtºÙc öGëè¹4ÉÐKÃ>וG® Âe-)‚'þÛ&^ï¬<òšQ7ôB%ØVò²àiê2‚®¹ 5.ÉÌ<ݬ]Í#"Ì"Ül‡ñ1ë#¶ý*yKýÅKP€N¿Z,3›4ÕS±LŠž¿BÑqï-¤ƒØ6ý'Y :¡ô‡šóÂÜ[”“Êip/qiÈbwp7ÃîØÝ È¡È%/HÉ¿ÈDå´D:—´x ‹Þ/2j›àgBÔí󄯫EI؇…‰ïLðı¯ßé\GÁ7!”¸5O¬žÀ*r Ž q°›°7²“Óy{V4°’Œö6FbѸdïë3ä²×Ã<ÜmF¶Ãmêz ÷Ó`︟š)—½ÀRØÌÞ:éj>ÎÉÕÄÄ)»¤4/û¦BöŸÒ¬9og4d’]¿A“Š««Ï‘!!ް‹ ®°xñXXL ¨¶¤V”Oˆ„E’ÜŽt)Ú‰A$)iûé–œ/Lãßì­j-.c @K\@Nq®µXÝAÛJ¸Hõ8ò\TƒÙíXzÛ(bÇ^;rôRNYâ#,qk¢o»]ò(žÆ;ƒí{và ¬óľ)ÉK.<¡X…MìzuEÐÌ̘R)|ÃÍf«.Zô8q Áçž=9åžBÍ6ôFv„uúoxG&‚])Œ)¥¹håvミ “ŽbcÆ›¿haã‡Çˆ1cñŠñÄÞâÛ ÞbhÝø¢Ii'& ƈ-5dú[°Âûm˜äo훞¢¹[X‹XÓ¸‚2eê¦ÌV7…Û¥)´¨›Í'54a‘r_Mâ=žƒvU"X®ÜÌÚKð7óÌÍfu²S®ïÞ¨”ØáR¼G2cƒgbXÚü¤åÛ—^‘Ž`â°â¶t\,í|îµä̺ŒÍϦ*ãétjòÁà­ Ö÷I•ÂIÉŠ\ÇÕc¤w̘›¸Å&鉊fGìòÊDÐÕcÇoÆKÏáÇì/þüÑ8ä1ß'(84,dñÌedH„pÁoÍÕŸ fß8KVoM=´^zD2iÙl4BÚUÒÐïÕ¤ßsˆ,à{Ü —}a *¼²’GFƤC“¼œ¦O3î’»XгŠ841 ÿÑå²Üë”M*q¡Fj>ËíE”àôé½{ºüàûìÑ#-"£Êazù®r˜Q®…ÊÀµ ºóGmY~,8+MXÃQ£z÷®õ´¶¢âÇ£o÷R˜iç̰2}Æ»é' ‹Nä*8ç¬JATÍU†Su” ÒæË*dÞ±|Ù++~|NÊÊÕeí…²9E…|Ù–ðû\Qæ_¡++D°ðy:cîîl¤ÀÃ%È0j¶ÍB©¹äܾ¨”Ü2Êr.“Ÿ¸2ŸqŠÙšOLd ªγÛ{!y×Qô£”\ç¿5O¾•€ùÞâD:œX.»‹ïHTr0âä0ˆ?åïކ~5"ØÂ­aUkj”Ó&Kü09w˜+µæ]h¢¶ïªÜ'N‡ÉmY·±«½:Gú`]¢óæÜ¡ãèºôG‹+Ææ\vz^)'Ò¬õXÏi}ÛáæU# U^nBRº|WÂŽ­G2.ŽÔšÁ-¡WFñ®«è¼®¬}ÁN,_¼–æ:”*ÃÛiFHÀH'R èâ\ÖÎffØT$ks¶¼(-뇳„^ üˆ@çE/ ­þmrþ Ç=•ÿRNAÿ+«Š2㢘.šê_¾Ÿ¸c4§MtÎÚG¬ª ³éìŒG§_žÑùùÌéÄk8ZèvÄíÈÔ–¨²œã1)Ä3ÖuåXi ³öä†}[’’ŽŸØ[€¤wÏÛÛÍv¶öVô™Š»™i¹÷ÕåüÈ0 VŠ´_&MÒ?)Y=9&ÈgAïùõO »ÒW’\¾[!ÚG${.Sžu²Z„É?É\:Ñnªpprl¤’ãAü)Gm{ݬЂÿybþ„W?ÁPÉnf2V‹_œrÜŠCŸ^.'_/%VÁ:Ûx¯ísÒ-Ê}^¥Ûõé#h÷ÄçÔà} Ùƒ«{žºÖZ»Ûc}ã‘¸× y ³úøºäÍ»3³“‰Q™;}ô´hyŠÐE~Ë'¬""à¡À§{"ˆ%T醵­±Âýî [½$¶úN0Á@ò`d t’ò¬ÜUz¸„朹>ìj‡ùá^(Í[¹7)Ó™µ!Y!OÇe½¥Ìš¤5ñëâãwoOØâQÒ’ø¥?Yëì·Ñ$½|ôT…b/7ˆú-ª¤aÈ“ÇDnTƒ3›+AÙ›·—^ºUº']•B£[¸-îÛR`ÌËp“ï¤ÝúIpûRá!„ŽÕúÐ~¡´Ç±n¸U±šK‡0 GxÎ'u[Ã%8_G|¸´Eε‡Û¤-ßͬšP+«`q•?¥ÀéBæþ wY¸W…ïÁbx\¥21fdkϻ٤m?™89YXúè#ÜáÖ©}ÎYäOº9纇Š÷¸"•y™pæUø©D¶Öð%ë>l’Ç¢5R|N{Ÿ™½B¿l½’~æðé‚”tóÈ&p{Mz–´Ò•Õïü†Á¯…_BXÿ%ò€óã/Ñm…R}ùÖì†Vy5Ø<݃õ_XëÒºxñ®ëBa?%n¯€àBH­ÔJ­Mx -[ÀipÍY Téy4È‘xDÅX,ç¸hNÌ„`¿éÈB*[ÑûêÄ_*/¨¼%߸p]Üú%R™åÔÃWý*ÚCSt¿t0RYŽÊi%‹¢¢‚üÃf‡x.pGÒ žò ÓSž$('l_—ºEz7»~åÁ9+žxöѪh0¹%‚¡mÝúl‰Û²aãš-Hwßö˜°à°(¿à¹’¦+¯‹p¿”—‰toç¦Hž¶$­\ H*"™~ƇîüqñÜÎÁ¸s{ùÃþ -òú+ýØ¡–CJ,ªï•–Þ{0®dˆb’æé,wG§Y³œ¦Í:z*ïèÑ<…¬ô<*ç­ÃUjëp•x´ÊõwŠNsª/ ªó_õ/ˆkÆ%n™êÒXîRVêsºâ4 5"n î^ Lf°¾…'À-r nĸ—#Œ…G“#[caÔi<ªF©ÃŒ|0‰¦™Ð QíâÔ‡JDú‚2Ší…{ŠÏ3ÐzŠ/´mtÑ’ì_Ɉ?yÂëÄæp‘ ‹æ™Y¶qE–Rܤz4hCç[wÁP>˜AÓ—. òrp (žz¢ôÄîÌ‚\Ź„v$íJݘ„Ò¥…’~ÏØ'oúñÝ㌪h°']‹çV±ØÜÏÞ~(Ø«žÖpOÁûTrIåàx—漉ŽÀbfKùÖªÙ¹Hw+Ú²|OÌþ;:þ a‚‘;š=Çß? Ò#Ö.\_·113RÕoþ(oG¤‰bÖÏÝ,w}ªã–:?í“æI?-—=>wÄ}‚b®d±OÁ'Y‡Ì‰( eíLÉ?ƒ0­#+ÌóMöšÕ¹{¹„ÔsC;„™sn/÷;'u²ÕŒœ©‰æÄ„éÎO¢ÜjsÐI1Îä@à…²¬YE%Hº×¼ÓÛ1Eþ§ÍÙ-~<‘«kÙŽ4tóÙv @–ÉÆŒË@¹Rav=;+jö^ÞªQzÂ{q5ìsîñ̈^Þ‹­™çðõ\±FCwõèÎÇ ÚÐZ‹À›3fqkÜZ :{@xVлï€ï ¶¬ý™iñÐ!]t`Qú¼=……:¶gm‚wøÄ{!]o4gqÀÜ)…:vg¦D.ôDÞºÈ{‹Gb³“N‘íéÓ{ç^|éf¢Cñ)‰:¸7\dÏçºØØ9¹ØÚ8çŸ=™{–˜6Ì[£G"e‘🙖þ á… íaÈÔc–¥{¹ez¢¢{ êJD‡åÃ.Ыæò¡²cЬqe^4CÕ‚¼V Y ,n3y”¥ð ¡cE­ãËéwóy‘õ.†ˆ¬/ûnSOe©2Z+—™;Ïïõ_bz òä²÷eÜ/W]q;ùXÈZkõè„Û›ì7ÏŸ©8pxaá ©Êò²²ºê}59“‘f‡žŠN~ˆLe}ˆCAd÷°’ŸÍYòÈŽ¨¼ „[¿°gÑšU{—/8äD4T› ƒäÌ’‘Ìöñ«¶—èÛG?B·Ú™E=*d¯n¦>A\"á7qÓ‰¶‘>³äÞsæÍBÖRÕájî°¤ìdö²¼ã­l§—/fx}_:Uéœ'7½VÄùÀlÏæ"ªTº°ÞVá·ÃIªÞkHp>Ñί™0[ »«X¼˜9¼¿ŒieIÀU-Y,|¯tc—„Ä.ŒF QÐÆÐÍRÙèínqk"Ú»"?¯Øqҳ̆¤-ßoE›Ñ÷Ë“Ke±g¶,ßÙ>í?_F Ë×0–›ÍšÛÙ™›Ù•••\›Rd&Ø3BàæJ­:~)tëÚ~>¤Ã1¼q•ëRg^A÷bÞº¼Á«ŸýްŸI€®ìò•+V­@ÒùK¾Ûª É¥YiÆÎð2])?Çl<¾-!I'Ï T, ðØ%ž+ÜVÌZ27Îk^dr“Ê l²¼.gü~ßA¹ÌÚoö…ÛoAW'¬'ú&ëãæçä±}ÿÄ­ùåyß%¬ù~ƒàŠ6+§¡P9™Å)f"Èë7ôêZÑ•7¼K²fòü oÞ÷¸Ðà{p?A$ ¸…¸ZÒ±ú×jòƒ 0±¬ÝúîvCJØ]>%ŒëÉÂmCUÉp;ñ(ÉÝb1>ÈùU©Z’€1±Âoóz€{Zv"‘Þª bW{lˆú>2Å+'²Õ¢üKm˜ån³Cí‘-òß½,›ïªs£rßüQ/ê‡Ï÷¤¥2<üâËðìbÍE•‚VgV*âŽrãØÐ_òø!ßt„ÖÃøDRîAÅÎÔøÔ-祦̂a^3íÐä½#"5lß‚ltZú6¯ävAjиír}8ËbolLþ¼±1+Æ€ø‘ž„Ùà…ÜWLÐ$¶iGÜ%RExæx$î]a ˜BGè &0ª^ó3µÄâ­õ/%bÈÚ‚ŽòÆÇ^’R™ø²šÀÃ-ˆ¾ät‰ëtQ[öÚsAìa´ m]yxiR qê}ýí&¦\\!ŸÀô+œúüé…‚{§Ã:o“ËÞelOÜ—Ùî¦Ã‰A†NνWÊ/1(uMÂÆ„-»S"iî¾`7—ИA n+X}d^oRýÊv»ø²¤ÀöL—à™x§ØF6,f`a”øãx–ªËy®‹d’*£î¬~⹆t¿Úˆt¿T˜}¾öû³ÏgfŸexðoýF^{Þ‚‰‰õ©gœ’Íwݼè°|ÌÚ(b¹/ô 3wõ1B¸ ññy‘½þ–?F”:VÊ=‹½ŽŒ-|rTÇ=£ç Ëã 6ú%躺MX²7Rw°{º‡zuü(a­´>$¬ñS±7H‡ $ºWÍwçÿF–Pª çò ¥îqV¼ò’º89ù%WÝN‘3òÇŸÂÝ %n˜•ÿ™ˆ{uVh-3âqc{íOå‡ÎKÙ|÷àl9Í™—‹²¸f¬gŽËᘤ!‹µd)•T¦‡ÝÁï#“¦!¹ô1¯‚L“%˜}6Á´sC‚©¬5ÌûOô–ôwõVëõVz²ˆË­…²]ådƒ1iÄÙÿ à ·äëÜÿ¿˜U/ƒWc@Ôo_càà5æßŸBÞ!‚¼*!*Ž\‚v—ž :£[9̼íJE°‡øxÐŽÉÙé¬XåŽ7nŠÐ½³‡‰NX¾eÕÙU×â¶{%ÝŸ„NHL?j dzT“ËX­ 퀕ìŽt™1U1‡·þÕÁå7JG¬†ÓD|hõo3@Ç MÜÁrr€£·¾3’@4Þð;ÉŸÄï€q‰Z‚äÔ–Uü¹´]™^ ¤}4¤Wðq èÌõ’T†ÞÁö0Z¡êÊÐF*¤YÏlH³ÖiH³¾Ï|.G»Sú +Ó)‘I‹/ñ3ÕùM $$rC’+™u9h÷Òºȱ€=Ó–,E+cþ:<7x~ì ©ñùª1>{¼ýKÿO¡Ô.ÎixÍÉŠar1ø£Š”cØ!FF¥æUJKT[”)l5ó¹Mups³Ÿ6óxþéãÇó r”Wº‚Åñe©þì>§ƒÿ$í!HúXN×{z|í²wš²¬56æ¬>Òi.wÁû3ì«Í-ž jÃï<²·Ãß)>1ôS-øH¾?²Ö?AÖ_RK÷bË!«>Ù„øÙdœõaJRÍ}«¿Î}8ð9èÿó |¤Ô h°Óaz-oØýQ03ì"Lø„³^Ä ˆ/¥Ut™:5~dñpXÖ Ù(=ÝZãÛæ–¤h[0.!Úb)˜0 »'ž€'÷Äú lÒ)Uõ#ü€¥ƒ?ù¸ð2ÎBI +.‰à6…½ïºÿB}@VžÚB­ÉþcØ’¯‚Н3! æ’>ø´üÌþqh|­C[à Z ^û“@4€ ¿U„jhÝø0ÿnxuÀø~ŸÈ‚,ɯyÉ+.xð’_!2™_!Íî?„– 3ø.V(ˆ Ú\Ð8¬^òè´óðáŽÎ?].ñw®Äñ‡ƒëWÁ8ìÁý$,f‰¿%âZãнüi7ØÕ/òÿhiÔxõÒ¨Ng/zÆüfÅU'âá#Ü©7ÿÁê¸ÿþØÛ±~æ:›c0FmHš!Lš]ÚwäÓI3~F!(ÌøHEÝ îh»ˆ8dËy‡ìûgY­°ª‹V¼Ÿ_ ¡’=Ñû–¤£RT”šY¸Æ6%¸í ×Þ¼NEo^”¿xCƒí>ƒ3¹.±ÛöTçÈùÕçÈ “TÄ饮Yý‚óO'JϱÎâJ¨æÓ™þ œF=¬àÂ?bö?†ª}UŸ8„_³º ¾Uþô‘³ùæç‹"ÈU°8ï"7r¦dîø˜Ø±qóWéLoWñˆ†¥¿¬*þ¬ÒÃF3­o÷5æí¼O¦[þ[™;ˆðö#’ÿċ>ïM}‹ÇÔN!hJÿ|‘[öE^sw€ý(Ô¹ó?†:ÿ*:D¿™eSÃcq-ÃcÀç'‘ê@bõ_<ˆ‹øïÔX¹&X/êD®+'bdz¯!þ/;_.FùóçºG †£™ ¬èÒQVø ÊÀè½âo1¯ïÁ´rš;ÊçN®6ãV7¬ñ"húsè´ü,êê0zOpc« nlPeoÍ”Ž¿1ˆx”Ö›ý7ã/¡E çòÿð'Á?ü;mHÜœßĈPçæñC¨ø?»2£Ñïº~ZÏÿ÷’Eü ¤~&ýàk–Œã9ÐåsEW4!„5¶<ØÿÁU¶2=;ðýl3„­øQ'+ø½ýÈë?W¿lÄùÜÕs0õ6]Q#ºWÙ)L¸¸šÙb‘h»ß)sü-ûè<*Üv:MZ+æìã„"Û’БÂl&ùœ¯bVmEß¡¾›Öl“B“Dîf0© ›ñ!*@GçÞ°?pWg\®m¢9„¬f»XøN ·[4^jÍë³2 -B ùÔQåàB KÁ­JJDpD9˜…Þ…ªfSÀP¥UÊpîm¡<ã§%ܸ¾¬ÿuàßâÞªq%ð”ø©˜(•Ð\Z«Š±äbU ×ô‹™üJço•æ'hN¥\ʪæ2³ßšYëá'ÕTü“ªË¡uEº\(“†RWìZºåçM'vWIC™KW._µ"Âqilä¼È¹áË&¦?cà8<Æ»á_bøžy†R#öô‘îf>m7IóKçJgõDx|[¥ƒO‘Ý9Å,x«ÒĪᤪóÀë£p2—u'Ýý¢ìÏ~·îÜÞMkÓ‘n.ÊŒJž}Èe×h4ù¯ ]lcQ°Å9!y¾¾Ó]-‘•ÓÕƒÿuëâÑŠãòŒÒ} ^KÁ‹  î=ÃeQ´»òUƒÙ–Ìžï¿wìHø¬=ÄeÉQ/€~ b'é¸ ÄSŽ70Å¿ˆÁ±÷cν–jŒuÅ8Á ‚Û.bldFÚC„Ê”D’”óÙ ž¢’ù/¾ÈÀN*Æ!ø ‹ÁàÿÄW33¹ w]XüÍû}ØžÓÃÝÇì˜ýô,U-ƒw¦ƒÞ%e0p‰{A!»Úc}ÔÖßÏh´ÉÀÙ²‚”W¡-ûáÿg«™f!ékòø´ .ûe$¿P[[–ññn;²Ñ/•íÙn…’5S¢ü<‘Ôó;É™#§Ë¯%_'@î'#ì–ßÖ³ÁïÆ"ìÆ=ÙFÙxûw>~T‘s|íÚ­‰³·ŸBÅu¡Ì/†8{ü«/ŒIßµ6>[>uNDš…<ù„¿$!áo‡:á¯>Ú]õ†h*ƒ§¼‘0µ~]·ìÕêwÝêW¨á/ÏóÃK GÐ'䈽;5&‡äâª#¹è–ô=„úù ß!‹¬/ö"Ì>¨ÜI>˜Q·í€–°í€¶lþ?·ñ€,V%µûBþ ”pWnÄ'.´™éÉ7kO-L¾ÅÏpÕ„²×Öfm<ºíÞÁ‚;èáïUXÃüù¬À­o@‹àì8Õhݪ +ùÀÍÒ-ë¿[³ùs›‹A{> ܨgúê¬Íz‘ð_cmöÅÛ9ÿ¯Ê‹R›WåZ6â1ÂÈqø0rî¾ÓañF3ØØ8êO^þcB:@r}æXÝLm—º½I¾¹uø‘V„²ç×íß²åBJFºˆ+høNµ$ý`†ÿAój ¦Š'ƒf¬Ÿ©ÀÝ/„å>ÏÝÿ›I¹¬O¼r<3GÉz½awŠãŒí¬H?RÂ!ÛçÊŽ¤uëwÈs$ÑK¬ˆAR¿È]ié‰GÒ6L<×Ï]k3³!»–OïøÃÓHÃðAûÊdŒ>‚Œ#cXK-Ú²¨ÿá"‹Åþªë_”}_çk{wò·2é¡[×J=«î}CÔ€ýtÆÔÏÎLAO?švðJšâ?íb÷²½ÄYþf–çŸy'ÿa¿zï3ÿÛtœúÔÆ7‚Kü»‰ßÀlåÍú5AR´eeu§>™^®Ã§f±2ꈪ%•(ý„¬²Ø>*—/aþ뉻H™öyçøË{è¬þl‘\á5Jíïò¤5ä+ÏÕ«…ÿì+ ë³(øEhU?Íõ»Óœ±øÕ¤/š‰êª$UZ„j¼…ù)Ýd±½¿XxE£´†¿™&°üKâ ~ˆðýÏÊDgÆÔßv½x«7¸­Oúd…Íч/ïW¦JÔÊ Ž–Bÿ¿vçY,ȾD˜¿´±ÞÏ‹ôl&!D˜&ú®¿šêS&d†}±ò¿9Ï£aô²zßåÅ?è»´VÍ|7ükœñ:æ=.¯ìWü½}Bª¥ öjݺ„øO·ªûtÎGÍZAî ¢Uüq«Këƒq#K¹a(UóCék6“ÅÞÆÿþ’|ùÇÓPúñϵVÂþUO„(¿³¥¶ìÞ_Þf•p)v}>x!l¢•ø/Þ©Axh5¯†z4̼ªâ×± 3@¥O¨=û¿Ÿ(:ƒ¸þõÑÛNU Š„•§«EÜbeGö¶‘1îé=±BâzƉßü ·ç‰1 ›<Á t()Ø[tRas“{q©@‚s°#û¸x$n…›M9 ïÄ»¼p½p÷EÃÊõ·nÛø‰Ùô¡Ã?–ÿ#XÅé7,Ê!løUàú}>öÔÐ(Ùè~K‹ÏÆ>ÄÙ ^ÖGÙ^ü?EÙZ_ƒ¶ìË)’•…;öe¬^³ZçˆdÂjO4ZÚYØ—pàKeü'ôîÿEå^€gf÷õ‹aÉu‘@üÕwãòæ™ýpØâ›ÆëC¤­k6ìWGÆ-‹›ŒÂ¤…>÷w'®Ý"Wëß$´óÀ‘íûÏ)NœØs<¾P:„Q/=ŸJxµ Ï+8UÊâ\fÃ~ k½¾¤Aú¥“?4ù­ºîw¿Ñ^”Ù»Ñní¦f{_Úž¼nývÁ]¸b’úG&TÈÊФìý)Òú-+ëÂ$rÿU3Ç»¹‰ļºä[©…–ë¦ÂV!¹ƒ_hç„poyX};7¨Û){}»nɾwDŒÕÜŒ´ÔoAÝš}¡¥EÉEòu®»‚ÄIeµÓ‚¢C=Û!Ϥ€¬IqiKÑ6´Ýž ÒöòÞcfêÁ“;²·¸ÛÞQØExi6ßõv›®/%ý˜ËEðÌç˜ÏÌÃV䥔åÉÇì–ÈÂÆùúûÎlg[à]-—Åñ+ׯY½~õ†Õ¤E²)K"®œ×~Vpâ…Ìe¦?±·a¯îºE3¿?5Ž,>øbÿ7sh£áߟ4@h|M}X÷÷šßëÁÎzI^·–GHŨ_Ê“Òh)ϹÏ.åéÞx)ÏOñú>ƒ§G=1¢þQbÄâÞ*«/› <€ ëIÕyÙÐ_˜Ð?KýþŒ~Aì‡)ýan÷µz| è´?OQ‹’ÏNo fÔ'ûú;4ªÙë³5ë|¨9¶Juï÷ õ—¶¾hÐ7ì‹-+„­±‹¿¼5v÷·Æ¶|FHrý7‹Ð„æò–ÑŸhíºF €/¿}©uMØ•ñlr,Ó› /¾`¹5ô˜X¨»þ`ŸIj?€¿m±ˆ¯°XäKìJã0O(AŒ(±X_•ð%UÌ«jî¿Cú:(–_½CzÙ3ɰßC/Oµ^þK„oaI=6Â’¸]‰0!Ñ:‰©lú YåúæÍljÞ‚¢þoÿÌ– endstream endobj 126 0 obj 15181 endobj 37 0 obj <> endobj 36 0 obj <>stream xœÌ¼xSǶ/¾eYòNN :Â$’BïÐBï½  ¸ÉÛ²-Y¶šÕûXV±\%[r‘{7c0Ð!ô’Ò““rR.9³ísÞd''Üónî—÷ç~ßÃÒÞ³÷ž™=ë·Öú­™5¢`ÁTŒB¡ Û‘œÆN]—“š(˜AŒ¦¯¯RÉEdÕφŸgÐ^Å6–?7Œà¼€y^ŰúF¼‚_}ùzÄ‹¯ÐN¼„í BY)­”SAXPpа ‘A¯š´ hYÐÚ ÍA;‚öE%eåƒ ‚Jƒ*ƒê‚Zƒºƒú‚Î]ºô^ÐGA_ý5èiÐÏÔ`êóÔ‘ÔW¨¯S'R§Sߦ®¡n¢î FS¨BªŠj æQ ¨¥Tµ™ÚIí¡ž¤^¢Þ Þ¥¾Oý˜úWêÏÁ”à‚Á£‚_ ž<-øÍàÅÁ+ƒ·Gï N Î –«ƒÁÖà²àÚàÎà£"ÂwMœ9+9/œ¶L&ÌàÅ%£‡xâ8^Fà”° ž -Y(DÇaɰDA ?‹–•–ÌKÅšGå éü¬° A:ºž†® ª¶¦ ³„q‚䌬0ÔâÖ•«‡ú˜•“hW˜Œ.‡¥' ;ãÓãD·ù絬˜d¾0,‹'Î ´Ë ‹Of¤ÆHP»¨ª Aò`DÂd~âo­O ðcñ©<á`½Qùíýžy똌ŒTÉà³éƒwý³ýä,!/5aÚæä´X‘0,<=-†¶9}~ØÆ°p^¢(5F6„Íÿý†ßÄöÿO«D‚ô@Çy™¢˜T¡(--&ÐëD/&‹',\ÉK͊Ɉd!ñÄ''$ðÓ³ËSÓ¥<~"’t|r\Lê²Xª4qðsc\Œ ¿'&N”Å‹HOLçóRÖŧgÅÄ¡QÈÚ—Ž:ÞóÏÒ5Ï”n|p{/>955&f°Êui1q¨ÎeC_Â_®…Þ¹n¨‰$ÄíÏÔ³j°ˆ®®¼5|°hóàñª6÷˵ßÝÂnc±ãX'V=Æî`—°“XæÆj±'Ø]ìÖ‡½ƒÂ.``ŸRVJÉC>=Ÿb£Ø)Š“R@qQ )E”bJ ¥”RFqS<”rJÅKñQ*)U”jJ ÅO©¥ÔQê) ”FJ¥™Ò‚8A¥ÒAé¤tQQº)‡)G(=”£”^Ê1ÊqJåå$åå4å å,åå<åÊÊEÊ%ÊeÊÊUÊ5ÊuÊ Ê»”›”[”Û”;”»”{”û””‡”G”÷(ïS> <¦<¡|Hùˆ²Q$î=ØqÊÊÇA ƒ®"Ê@§¿CK }AßAï ‰ 9¿„‹ðžËxŽx^ù§Q’¾°ñ… ÓÿÓðòÇ¿xò¥É/ù_^ñòÍñ#ž0Þdˆ_ü9åÏO™;Fâ#cG’¡C?c°÷°ŒŠ=v´æ•}¯¸^ ~uâ«S^]õjæ«e¯~ÈÉiäœäbÜ×¹ÅÜŽ°°°™aa–ת½Vûzðë³}L昛o4½qòÆ.›>öÑØŸÇiÆOŸ3¾küOÞžpc——LÔOzmÒÀäi“Oé˜=µvê“iÓ¦Oœ¾h6cÅÌ”™ªYSgÙf]ž½höWojßü·Æ¾µvή¹³çÞûÃ<Ƽ)óªç'ÍÏ_¶`æ‚o¿ñöû Ç-\²°hѤEK%-úÛâ˜Å…‹?]2yÉý¥5Ë"—‰–Ï]~t…jEËÊa+-+«WE­ž¶úïk*×bkåë¯{ýŽõßl°møËÆè¥›â6=Ú|`ó?¶dm}uëú­}Û–n#íÛ_Û.ÛÁÞQ1;⋪Ä.åî—w×EŽ‹¼¹'fOýÞ){?ŠÝÇÞ—¹ìþú<Œ¶ÅpbnÆnˆýG\cü^Þ+¼©¼÷Ò7%~’Tœ¼.¹þàúƒRä©£SW¤šS;SßM‹Hs¤H{Ÿ‘.Nÿ{Flæ¨Ì¬Ìá—…—³ºD¹¢»ÙrþœÓ#ž(þRÒ"’~&KÓäy¹‹r*’_)·«(*™úE5ÐP4ïh ºP]»>Mÿ¿ —ŒË¦-¦ŸÍbË*Ë10|–wÏ¿;ÿ¡í ­À¾Àþ™Ãï<àü·k¬ëv¡ºhCÑÅu%Y%+-+{³¬Ý½Ü}×é9ó‡§@ñ/…ßÿ“ôËè—ôeZÀ¹Æ,€|q`3K²M§ß®Æe„#ä<\“ãHZ‘‘r@ÄN’ÆêßøAßi¯¶Wpá‹Ä–²þŠ 6öp/Œm#F¢Š/º™áv}âÎTâ2+“N0-$ÙjUœ–-ƒ[Ü!»íZ;¨ù.OË9HcÁ º— ÍÓäi€– x¹š z\-!lXÆ„“`ɲ„6œØJÌG•O뢖o0KòyEà(%—zÖW“Ï)éerIjlN¦J™-Rj@tùªy±Ê®¸H* *ÅõW`(ªtĸ7à‹u·Áq¼AP“–%“‹ä*¯‚S¡rj@.ˆKX4‡|-â,ù'Ûá|9Àt‹ÅŒ@cIÔïT, S®N˜4½ðé‰ÐÏò~(ãC">ÇÌÎä'Hd¹€­Õ8(=Ë=ciŒwí>[e騶Œšø ·o¾Á¹ù&k„*Ûø¦Œ- 9a)у ·è-†Éä¬{ô^8ËUy䯅/Nôµ¼Ì¥’(õµ©Üä|ãCÅnS®z¯TÖÜã÷}ñ.’ªàú(à#¨¾M…?þÄܱ5^´àáɇo}ØúéÙw¸õ ]å¯*Ó* fƒQÃÕ)Ì: Á…e¹Õµ>¯ÿèþÖ-ä$2ŒGΘrzÇ—wÏ4Þ¿À”0Ñï¥ô à&^F?®/Ö, Ð+seäXòmÖV8^å7z@ Ô¸]gœ¸›ôÈBÎÊÔû~"ݬ„˜ƒñ É%ç¥ vªˆºCöJ]5ež’2.œ —^'ç;%6³_mXg@÷øÝ!« 4Á…±°ˆÁ'Ï7T.eï¿ûKþèÏÛtòÓõBM#×Éè}¦jêšÖ(×KÌF“Ê(·˜,F‹ñµœ•:Fž³+°=‰¶œbP m~»>O¬b]8LóЉaÄy’9pP¶3G¾^ÇìćÆÇZâj ŸU~ÁnÇ…Æ¥ø¬a€xb»¾e|¯ [ép&Ä>€Ï·+[E•Üœªœâ]•·<õÅMu8ã˺겖®Q_­†›î‡2ÄD¤2#6©4R€«µ®¢Ò&8¼qk¿ð½wF쬪D=2+Ò3f§ d…EŸ»û9¥í–¸ãNŽ$ç[ÉI+»¢¯Þ8ÒôÝ ®j·Y²pFI†GRÓ}òГÆnr¼Él0—‰A"NNC.ž,¬í|Üñk79uõíu‹pj™Ÿ÷¿Ì<«Í7yv< +Y›É$i„H¶ÎˆðÔí‘ååæéóâ­¹…Èúœ Õó]Vgž­þ{L‡UM]ΆR¶›Ü& )¶Yl–zS‰Ù¸Œ}ëÇä9z­\¢R@N…‰Á©?¾wäég\iéÌÙÛÒæ6IÝp2៎Áaßç;~¹îøœˆ($±€ÌUÄL¯ÉÆ@ëg¿g‰ Ì*:V—Wâð‹hÉדHVÆxá_µO¡Œ¶ 7‰) ‰’º|¥ž‡Þ»ÜE¹±*€x8 .„³è]¹~oÊ‚mÜúïò]Xò,V¶9Ƙ—g€Ãx`¶ÓD4èFÈ4Wd‚m`ÿ­èM1[÷¦îxzNYeK ­¿Ë­½qþxŸ àâÏUMñ5*üR˜+¶¦ÊÃÚN—YË š¸u68É÷Ó}ð»;ÍI¾AÎ$ç““œÞþðÖƒC×ßá|8ÙòéÝ'î+•e¥ŠSÓ¸ I<É[ÙøØF!~DÒÒ÷‘ã* ¾#Åž »¾úTÉ=ôvKèÂïh¹„5ä4\(ÎOÙ &‹ÙÉ9‘ÚùHoщâ;ÚðþI3ñf xJ,{J%øýÓ˜sÁ̸·—›¶•Èçp2ìó ãá~˜³‹8NøÚÄ¿‘£®9È|Ô·m*‰E‘ãÖOåîX¸)~Àçî»±¿ôÁ‰>æž}ÿbǤ®ý ƒ„C€T*‰ôbtd ƒ'üÒ!ð9ð·Æg¿¹uˆãpIJ®æt¸a+2qeÎ.äúûMÂ㉵ÁB@b1dðš5[·,Hð}â"‰½Òs‹`CòÊáÚSİJä;¡žJŒ&·3¥ô]˜Wòóly68¸ËZN—GÉŽæ¸cYä[äFrÊÊÎý—om‡ŒO¹³È£Š8™v½)¯>dU?Îlög$Ï[C¾¾&œ›)ÊP ž,jè½{R¯^ã666—×£W‡dœxÔŨùëÄšw©­Dó3úìy¢°ƒ;b[©uºòóòóí\›#ϸOâÉΖI²’[3Ž|zó¯pã!Îmx‡)tGÄèõpfû­³/qt&‹Ùdà5fÐ!÷-«¬ª(¯lO¨Û³'^•ÈI‹ÏÙ—6ŸNbgí°¥BX~¤ÂqHçt¥‰h_¶b?ùüÀ"–d‹N?¨ùfwÈF—!´€bkaaÛ)ÁªÑû͇Ààºçpc_{ýðþõÒSä+2Wnc:|ÅÎ:Ð :ÔÞ\¿¤( DõYûd¦Jãµ›ÕÒæeØ]e3ñ¤9€jÿðzõ¿ÐÏ  Ò'$ƒH†kuƒôÓr ΑDmÈÌŒÎa'Hר—|»°°º¨¨·ænÉWsaG«¹ÑR :óêôEj»ÁªAIÍ ƒÈk`Ý€r‰7G£Ÿad+AŠ%Ér 沕E64~pf«b‹Â"·H¹>3rUld³Çz)pØÈ“p±çðÑûÍgë=ÀìF»º@Z`ð¼ÞSÞØ(ö¥geÈ32¹±1q[eq¹‰¬S0Íd]®Ð˜—+ÙÒj{>p¼²D-É@¶†»€ì ¸B2¶~âƒ;;K+G€3Íáä …2þA¤™›é&`°jå yHA©3OÝU™v.“»5N’„@Q ¬È°ïÃW_Ûÿ=ñä/ï=2¥†s (Ó Êð²*‰Õ ,ùœs©ÅpÆŸÿåý‡n“WïåöÑ?“ÈÏ™yÀj±Zò-…&·á§ƒí騺ˆmq‹ßŽê¸Ríð¸+8%žîæôðOp1šÙ^!ŒJR'sE±©¢d€óDu½_œ{ï*©5¹áF¿ª™’7h<`“ŒùÀÞQx¶Nxü=œà,Žžü-É~{f슷9ã¦n%‡!‹æ7¬9ãÏ®TQÏx[£]Q(guø: ;Ôë(/JO«ÛÁpÓ¢«º¼¤Ôß&/bmß+^Кm[R¾«$Ê¥GlÎ Àt¨ëßÉ|ïø¶)¯E‘ã7L´D˾ êâÓ¯ŽÃ‰3Dƒ ö›fJ?;=ƒŒ~U_¬G‘Ï3¬ëW°»C¶åKŠ@(È/sT^‚BV»¹ÒR‰ î´¸ŒeZ§Ñt™Y©OõX÷¡Bbß?Ód!šÙco©ã`Ã…mŠMz€®E,¥ÏÌB@CäÅGL©B®ìË;G{Ékƒã˜9älš›^àvØ A(7z 8#UWé1¹G?¹pú~Gö‘¨ó\^¯¬ÔâÍ>_ëɆ„E…7ñŠri¹tm®Ö˜ t@mÛÑ“¹U6zùÞèµ)¾èînçnOàãûÓRìH=ô•ŒókØB•òR  Z"Ö(U2dÙu.W¡û²ç$·þ«Š» ïʨ_¿r9v¾@ì0Ø·)âu[tl¹?$ ¿¼RGµEL¹†o±˜rõ"rô€ /]pZIK×Å“n\jEÁK‰Ra4)Œ2î2N±G— ”ìL¬öDkíÇ¿ß! ¥C®èŠ›y ?Ç#>9 šY<Í¥mMÍõ(léÁ¿\v‚…쎌ޭ·[ u‡¨€Ò Ôe q+ò$$D“;dsΚAa~‰«õ,ä±®à‹äœ@'‹‰/Ù*q6üñ!Þ² v“/ËTy6aÚ’v¢¿Ù© Ø +¨ý»û'1å6©PªÎl5P拜‘îè‚X¤©‰ä2ŠÌXS¿ªw/÷Äî;ƒOÀ튇Ã-,÷YwñU"eWb¶f“[ $@¤O-­0i•J‘ˆ§Ü*b.¿‹ÓCÆ£'ÜžÞKµ×ÀUp&£aŸ;Ó™m?Pnb!w¢:n¢ÀãÄRæÛôºó¬öÃvšò z“E«çÄïÞ™¢huz4$`Î3áwé+È:³Æb2iØš4mÐâ"Ÿ¬öhsÝ——9 çž2™ °5ú‚â€(ó¹ŸÀhOè¶z ¦Fx)à )LÑiÕ*©T®Ö¶ÎÂü2gäç;­¸5$Ïú ¼g²Žç˜âM(˜=…¬ Ò­I¦ÏÙK®bɶéSAžàÎi8ÚÞðä'›8ÆÌÈÉJK©È®÷WUÕÕgù3>[ÒJ 4#ý€ôOàˇ2æID³ ñÊ,zn¶Æ HâùY8ãK”bO=fÙê‰eü ¸.MI®G\..•;µ½{J2A4¾tû¶åó6Þúª ¯ ÏÉɱ&“BÄaUE…^¤jeF¿æ¨´V߈\BÈÇCÚլΙŸsg~®)ÇñËÝ7ÚB§RPl]7Èf¼ðnXŽèuA€^ý¼®8½ ΠìC1ÙA? wý25â&ý²ßcwÈ–•Ôg^Õy šX°ƒ¾žTÉvý|npäâÔ<‡µ²Ës¾Àq®pŸÚÝK0-~? eì&b&ïZ/ÏEš¬3:ŠTÜæ>‚'iËèáätlßrœÑ3eËžÝ)£•šÂ2°"¡ÿ—É®HÔ…ëØ¹!ÈI¸ ³]ƒ,Šiurù:K²R— $xb¹¸õÖ©Ó0†pøa²Õ gìN+—4ôVy¿¹Áä°çÕY ÕN^qxñkù m³YÖx«Ö…ï©i{×^ämm8õ)œÁª'o[3¬&'`€ÂÂÚæ¼<›Ýf‡¯À¹÷ápoU¦  v­[ÎqËÈèä2”œ›Ÿ²[‹ÌùzƒÉ¬5p3:gº©zªºÉf̸¤2(G#O€|®Ê(44Ú¬4âT(†/25*ô§L‰Ë%WœEÎüb»—›—ŸgϳÂÉÄýÿ¯Nf²èM.ùê@ ƒ؉žœ¦“­õ__ Ð Õñ½^b:2HOàî;¡Œ"1år½A§MKU º½Ãéí†KzáRn~ažÕêÒå³6ëL&Õ^m;ß=M#7³VuÄ^¹y¸¾ô 7g‘I„ÈÔð‹•u]5Ÿßå0JÈ·ámf‹¹R’ÀÜHòùÕË„ÉR>À“²êžîøñð%n×ùÞ¦®@\%Þþ?!£½2 ÿÍ2z¡\ Ä@,Ž>NÆ’k±Å‚lÐRZx9€7½,ä¬Îjò‘/8àaUЉçÒSë.®Ê Ì{ü2ÿ˜¨P £[Šƒ¯6|¯pGĬMä”×Pp°³¬¯ÖûÎï:‚-ÃÖ[ÉCQ—spޱÐêrx>Ö%$žad|uli³ù\NZŽDØz ÎW;NU¾àb¹<'Ó+kh,v]ìãÖ6ùj»Ï7/°Jv—Èš@ðWŸÿ,`'ý“øÕ8çµr_j¥Vm2¦'fKå-G¡ÝævTso@¬[QÙm‚ÚdqŽN.äìI‰Ý»š ª¹_vTà­Y5É›W!¦:sòLÖíÊlã<9[Vâ/ÑÉUY3I7k¾I­ØŒ×ì²ö–“g?¼p¶ÔNL“BÛH*¸æ:ÃÛwâÖñ}GP _äR« f¥AÂÝFJ5 F1P³ÓJeþÞ#ÍwOqìÎÁ©Î*â¥ã‚ò!õ‡2ß1;L@4&¥^dÖ™uƒYÇ"_0ÓŒ!YÒÎÂÉp\gÞÜÓ·vÕ®X2h%ç$ wÖöÀ%;+R“¨_«Åa<éc®=¸sÝî°­›¸ ¼èìh€§Ê‹ª.4|Ó}—{äAODZÀËÝ!pÿÌ `q“Œ~ÚP¤CžH¦(2É-Á¬8bœ¥*-9mG@Ô _e.Ô9÷¸V³È¥ä÷ˆIúN`eƒN$­ôU²f£ËäÒ«lââé—Jþ¡€ØC³Óûöмtx–x¯öD¡«£˜=üç)’Nø\sJ7ÌóÂÍ#ÀcøÂ-âù®PÆ\â ÁÊ-L1 V’–²{Wêb°ߨ¹·¯»ÇßÓÆa<‰v´ñ{GÿõCÄ·ÿ ç’¯CÒþä›È DÛà›ä}ëDÉ‘¿p•õ‹’ö(×#±„‡Á%p |ކsá È$‡“ã¶Ö%ÄsÅbR€l¹¢¬Öžç²:¹W¡¶šÎ¿6Yk.Ë2'èIZøøíO5&)ä“ sié'‡ÚŠ›OrlfÙþÈõ›ÂÙ+6Gf.”âðXÿ«ÌKí{æ-LKãs33c¥<€oL8ñÉÝú÷áV×4–´¦‰óûà;fš 3•_#¨kòW74fúÓ±0kÄi8æ4…àA/s ,ÇОҋNÓ&Ó߃I´Íô·É$9ò™“×éªÚ×ôrÌÐáW¨4™v‰þ&ÓàÈgNžÒgÀHfà>ô| ÞÀ,åË}”À'³oÀ€%Ò;)¤ŽŠCþô3u¨ŸõM5¨ŸÔOÆ»…a¦ )iÕ†@q“ &•ûO‚× GJt‡N R¢þa^Êáš{TBOÌ”ªOT‘û+™.ݸdb…쨌ô(° $§5$ú2¼Ò“ «É>Ö¢ŠÌvÕS™‰•A¾Ø–v2ë’’-šAk¥û>½“ßâìô²ßih½n‚G‚6ò¹ÏÏB5뢰2ɺ¬ÌÌ"·,bnê×ÐSÓÚ]Vátåu<Šü„é0ÜØîáƒ6˜·sßkÚ‰7½0uþt`Y$jßvç¸šÔæúJo­G_$öpä¥DÙAmUíÉÖAÈ>†T |R©mHëáj¢ï¿5¤uý!uð^xD…éŸÇ$g’SH1©$YWfs¸»¬±›ûÝÝp€oàpÖÖ¯&qtéÌÓ ûÞ&GÅ‘óÃÇryëb“÷<"¥ïßN½'¿à¶]él<2È^],nq7Á$Ôædxþ«÷afM(Cyª Â| ¡ûO$þÖ‘ÈûGºÊ››¸§Ï5=÷ñëq‡ÖrŠR˜M‰6¦,Þ»›+òsߎͩî=Vÿ¸å·¶«®¢ ÀϘqôÈ=ÄkA 8”E7+·8Ý• p2ˆÄÈÈ—Ÿ ¿~â˜ÿX·³¯þ>8 JÌn£NÀ’ïÕ–™kÁQPíì®Âu§ÈÿN§õÒ¿'ú™N‘E8I[@Òæ'fUwþí1ä^¶ÙÌz'Ç­pkuHÑß÷4÷BK‰Éý+˜$ ìON}m/¹š%^.nvæ–ä".Tî-Á*ÑRõ¾¬Q`GsΦü"¯H^ÚA™£Ö}g,õUþ |¨•UÄ{®züõ•{àB–ï‘¿þ’;àNÔ^ ñ©šy;d`ÜN ÿ4th'¥´u!ý-ëgz)ÇG¦2}Ova¥ËV^PõX‹Çn["Ôv¶Íœof`±pÊgJÌ@kV™ÙòsÖª¼2%Èa½YmœK™­^ˆÞ³¿Br|ÏI⛦à/pÚû0øÝípS(#–¨…?2Å!&Du—ñ7.I9žú‘ð‡KõµÕ8CÞÚTÑÚ2êÔCÛ¦®›CÓäÉò39yú®*bñEmˆIµq×;Nvœ*òœ¸çtôÙqOC:0ÂÀl#­sZ¢£â£¥‘_¾ãÜÛ—o}×Á}ð˜il°xø¤²»‡Ãˆo*‘ÆíW¤¥ò¹R¹Ù| iSÝéרO%ÌkýK‘WîŸ _¸G]£#™yëˆ<:9*xè 0Ö÷‰ê;ø·¨ÄËFf+"ÜÂít¸ý=Ÿkêר_¯¼;#‰§–¥qv§g$óWøt¬ö«‡ë/üÖé]«²Mb½‚+ŒØ¿qÝ*2ÌbI! éƒ,Ú3áMb-óÉÑ£çþ7õ.Íuæ´2‡œ:êEÊ a&RâU™$….UŽP—1YºD2 d¸ÅÒuR_4o?¹•½0“¿IfR±`08ÚÒøÓ1¸šUq§²úŠ'¾TQ êAuÑɪ–¾»EÇ*GÓɾù¿Àð‰šIØ¡”v á}­!æ‘ÛÐÿ€½Õußu€WÞËø8”ñ.2=W˜­G[}Ý?Õ–“x€ÏáGËgÉqYÈ)Pbñ«qƇ³›w,µ‰¹Â¬¸}éq(dÎ*L«äûdN1ÀÓe¹Þ¡ì[çúŠksí{>·ùG×6âù!¨•a½­Í7FÝÙrúíÕ›â6ä 1ì 1ëÙä fâ÷ÊËàk_¨‡o…Ô¦GM½Wo(ÊXäHòùÝëbÆdnTmKÀâ⥕«K£ËRÛÖ¡A퀛¯YvÀ³ÌÌx©2dƒl»Ô5ë˜Ä±ì©Ùû6œNaù;=ÅÀ|æÓ½åúdM}G¯8¸ò)q´rxºó œt7”ñ¦ÂåLg}éÙ†Ž[çØþ¥·\Än=1kþ¶ýÒÊ$ÕUž2¯Óì0sô%f0ã µå‡OÔ§FìŬ_É™7E)’N@ã%ŸÇäg ùüª¬†ÚššÚza5ÿ/>ë2…ˆ„zäÂá0b -–>ðÖÀŠœµ4XFßC®¦=¢…+ißÑÉ9W™d’ÏÁ[4ý—ƒÑïRëɵLøÄN\锺kÅ—Á]pN{%÷‚ô†¼mÿ{b«eAÙ0ŒdrNd}ZÌæ ^NÿD3³Ì‚ÌäØÄÙ¼yé›Ô© O.•úÛ¼ÍK9ðyϧmp.^#¦<£öZaSY.ª=Ø©)Ô»ô™™õ€M&£Ú¿½m-×—žš™¡Ò°wîáE9nÌ7Ú~ßÙ+UaÁç7çìÛ’¼#ÀG¡ŒhbqŽ™F!_Ø¥h„ìi[¶M@"Œ¨8Ð,(S–êkõ{ÉWXô^Ȧ1|»ØGß§›.Ü“²¶oå‰v£îéó´ùðUb4«ÊR¬J0˜Ö÷LV_×ë¯TVJJ9âR™=)'ŒafT)ºâ»Ýzªõd]åÉ2|øÏ+µMÂÀ½yˆ…2&ü¼;0—N£+€Äš•3Jl©ûlÙ£É8r É#å$û›ñpdE]žµ…ËH² @ÇhøWúU¸@æx› ÚÊ'Çv¸ÄU[È|±:‘ÓËyì“0ü’é‘©L“Å6K-&“Èkf]ƒR‰-v¦Ú@Žl%ý ÌqV» |€ý5ýhP¸’ì²¼\»éŒ’tò3{‰"UÈÏ$äÆ|Êž ðyøÆuøÖ÷¹]-=í]8|pŸ€œåÜÀ<þ·?|K…3ÿ+ÄÀ¨‘ÿŠLÄöÿkq“s\ÿ÷€!ãªáŠH6)½Pˆ ×u‚vïÐÍPÆE„1õrѸxrg9Qy@š*I‘(„—l¿&–8ólÀþkb‰(±9³ç³w¿…›º‡K¦Ó‹ì&Ñ(ËYÉ&§Š,œ_‘SßÕV÷à,Gæ2è z³‰~03[ p½Ánw6×;á®Óo/suXm,›;ωZ`„òÀhQ[ØŒéÆŒ sÆhr½áiY—·±¦£Ás྽Úd1\½Î¬j\à‘V×x<5‡¢ë·lß!ŒOâÄDåĦŽÅߤëRnK_)ºÝT#ºasýPÊ8N„ÁÛLg7|‘Þ ³«NŸÕ HaOµ'95Õ¯)-­íá5îˆˆÌØÃãF®ÏÞ‘CÒç¤kbhFÑqE ìñéq<fgkeéñN.cÇž+¹ÇG_}­5—T.–Z—ž#Òñ;D­¬=ô©Ãí‡A8£†|‰´0•Éü¬4€ Ån_mey“ÏeÌn@»LLª†ÙÈÁÝïPa9òúã&MŸÙqðo¿ûËÇãZù:Óg)”4°+s}"O¡Ò³äåu^ùæ´1€TÂÞC[( ²Z¨ÐÙ¿‹±Äö#Ξéé9}f_Ïnrp{CZb?—ȯoomhhåÿyX`Zl›‡þSaðT¾‘¨,€»è¸¸4A¡Wõ îBÙÄŸê´<“J4'™ UlxBLwcõûï Äìß%–æ6‚Šƒ›Wø-1í8ŒA*o7ÛLf$|Çh1Zäz €mJk®g´Úr„ùÒÑ(ÆÄÇDGeǦMÀgÐõ)´O銭ª£ø ¹1•dg¬4iõ*J!ÉÕ!ú!×@n¹AÐ+ñˆr~ù­ïá¶nλð2ÍÙÄ´{Û฾k·»Ò§R™‘Å1r Z“èѪË×ÛtV½Åd1±É7Õ{Ñ)øßnúÀÞ¿/§@ìsºª7ªV3ú߃{®Ö6>„4æÖíq™¦}ÂÖk•Ö"G÷oÇÊ;jºë|Í ?œZ›,ÙÅ©¼´Ò,Ž–µÉŠ’hEÎâ2vïh?~åh|éCŽQfVƒ\ddWÙ}ùòý#7Îrbò(¼Ã¬µ”ç ļµƒ±bQ– U–H½®´v:á8×<2â’{˜ Ÿ–·´vx½UÅU¯*V·ï_.à* bCú`LK¦µ~ØBœ»Tßd¦K[j/°vm…$3S,OΖڊҸR~·¬ÊPØïöµõJ©Ôê,f5÷È5>üg¹¸öÖk¡ÔßëK«ÏÞ†Ûªî>BKNûw"fðæ±r'ز Ó+•ÀÇMG/>¹åú'˜¤ #R+42]»FúœÓõYlAAc\Ï,kéÕ8 hp1=p6™×Á¬¦.—³éŸù¿…û¯ù¿é{Ö’42T£6êåRåa³SÞ—þõ`pM‘ýÊ`°,äšÖnôD\&ÓYd]Gƒséùꬷiä¼Á³ùôŒéÒÝ|ñF#Û(£Á7]š'G±_¬UQü ÒQ]óÿ5ä.ý#ÀmQ„÷%¡a¶Òá’ŸŠv(f{eîµÖ¨×q È7çJÀ6ÅTÇžŽwá¤+OCßÃvÄnuüÜíi¼•ál’>-'lÆßýéãó=WäåB¡Lž£µìJŽCaÕ-ž–!‰ÞÍo8}ª²ûê-Î㯊*ËÿŠ3.–ÀpfºPÁ¯Ö×WU5ÔgU šCb‰îEva 9›y &xnu|ëï`++^Ð ­Ζ#Àgì’Vh ÌE¯s»ýµ²’T¹Æ¬Îâ&ÈÕæhK᱂ŠúÞŠ:{)(ÇëåîŒ4iN‚ñ7)Ç&ÎS"2—e–h÷Gç©­ e"—:?K¦ÈÈtËêŠ ¬./·Óí¶Še"U# ª·Ê¬CîTLÍ~Ý$ׯiö r†õUDGÔ×SÀMøÍ *±“˜Á$GÐËákÎfwcIUyI%À‹]z­ÑE×H#ÕãÙ’Ê*·¶+©>*.!'!¿G¼KLã$…®K£Á`z<ùµr¬z¿4“­–ËÔÈw)5N—Íj·9¹—Õ È —‹â~|SFïG׿ƒoUrºáYNZz¶= B1yúžY[>^¡“j³ç çsW$*÷ÝnÓ$kRLj6’d)ÈÆ<⦓-Uf…K£Òª4JöÁÉТµ£Ø™_bG`´!~™‡Àø.,ÿ¶¯øh h']¦€‹T¸a3C$@Qž,ð545T¶r…ôH^N 8€ï:}òX·ÿD믨„Í„ŠÙH'q8QáV9_È‘ËÅJ‡ºD=…¥^¸ÝÕJ,aŠçæD'$–î´j‘¨1U—ŒgÒÅ@nK+æÚOi+ºTùˆþñ%2¡Ð+©+)µVsJÊlƒ¶Žœãƒzôú Ê7\žk¿Ø}¾é<ïJ(ã' Z‰×™R§Ø† ²mïöµQÕ;{wrï¿Ù],iì1 [8 R•ìñ:l¶"'×[â,•x­ÄÍOÊÎNÚ|!êþ'7ÞyØ¥öí¼Á±æœæRÀ¾yìĽCòC™M\òE8IêÕøŸ}¢µé‡ñãÒ®Ô`Ôk´\¹B¯B>5³B\Ûäõµœ8´ä­Í»–ð$õmæ0žªx f3htî>¼½4 $ã¼´ƒIÛÂàÈ[í õmƒ >±—˜êÍñÜÇʘB,%N0“é;H:•§3ãhr,9‰œEN/ID¡C™¬DÛ¨Þ@†²ZéáÃcvØkô%p¡öÜÉ›W| îƒZm“¢RÒ .-ÆIéÀ$¦¸BS jÁW=0øÚÍÚúVO3°"ïh·àõJfE¶K’Àò”ñû×'ìä  0 »pêFbqÿDf"|ýõ™Oi ô¯ÉE´£ô_±¼öwMìp˜_†—e‰õþšú_Ù ºÏ\¡œ»{oPE?2û"¿þ¶;½Sq°{AgIgÝ·YÇú&]w¸¨ô²A¯²=ãÐ×ß²ö›8™W_¼°£@‚*:}ò׬ȽßNäÇ)y`/D'ÔÇàpl`>ººfþœõkÌ_wãÃÇׯ=æ"–¥ìŽõ“k²ªF€ÇD&¢YÍÄgO™‹¶ðå<€Hm=î³·ØÝ\[q­ÚzØv·¾«îH£¿ q­î4ÿîˆɦ5FTŸ4¦açh’‰3‡|cîÅMON´yúNpžýÕ­Y=£/ƒ Mwïâäø€ÙV•—¬Ü–½’+Ùš›œ†3¢â32$GÇf¶žý¶â—ßåVVÕûΘ1òÓÿ¤¢­³»ªÆ_ê 5r!/3::…›)Vçg¢0zXÀùÿ<9ÿ¼pþ?¿DÿEN°Éiœ‰ÔI‡¯þÇchmˆxû_ðQÚP‰À~!},Ø,Ú‘µlñî”úì:qîŒYy@—¥Ú¿†t 0*õ2Ó>£!›'ÐaT¿‘vžNFýÝÈoµûÔyê<`'Ùr çøÉTyùpñ«ô˜Ó~ߎ“|Ÿ™ž¯°)‹³½ÊÐ .ÕÝï8T×XWr8€­ƒƒ+nSÿ»·_âÓÅ•ý£‘Ȯò›ð•cß eüfäàC=½àûáöSóÈ—“éÚÆYAÞN#GgØØ*]¾=ªÚ¸ö‚ü"àÄ}Ò²,¡\–™Ð(è}ïÝà«mH%wÀ7Žß=Ø]•é»Ãv,_ 0šÔj‡Ñká2¾9cö'­Öˆ¤Gæ$ Ä™×hN«Õnµq…Öà«åî¬L‰8y¥cGùÚZ9'N5?7ÁQáѤjI±Ìžj È4Ã}íð‡fJÿu¸ˆ¹„¤Dd“žFO’¹¼Å%ÇÎÃXnýŸ&6לkr=Æw; bf¨ äl û"¸š ì½€ çÕ)WéÔ¢àzÌÍp*m TN/ ìæµæ"-¥Ù˜–0@à±önQª…m‰[Ü!;*²ÿU/Þ±Ù ‹‹JqNßC.V&è ›õla¹çѾøúàWSȯg§=dïŒ`¨ˆ1ýÁLÕA…*…¹R{Z)ÎXêáe:E£wt~Îb¼ž^Øä.«P­;-Â*µ¿ÂP<úhn/½Ž„þ#\NÄ0—nݲlÉ…-÷î^¼xûÁÖ ‹ŸV;þ‡–Ä`”ç-œÕ“Z¤^˜ìâfúUXÁ“ýo1Íf]š¡:'.Í6-º!ãØñºŠǹ¹I&5á²bu…¿¬èÌqŽ®Pþ™MlµZ¥¶½‰ÅØm±X€e´ÙœŸŒh^>7¿Ìæó\k†8›Q2VÊ,2È‘»NíÈŒ$¦ç¦Lr½Þ»O õ„n0¯?A!¦ï1ÉÓtÕn<ÐàSl5Ÿ0‚©Ìb‰/£%Þ¥vh¼Ÿï¸ ¡¼0ólâunNW]ƒ¿®ÈÅ>u¼£”á6“ͨŠ·­ãdfiuá3XpŽæ¿¯Ãd×z4åCõü~5¿íønƒ›˜C›¹{¹ç|af¿°¨§öK®«¥Àï¹ _Ì*=NŽ™s®ø½ôåídkÂVÅÞ¿¾AîJpeÿ²U|„ªw(»ŸÃlÜ“¸lñí†K8Ÿ R½™Uüy8z«›{¼~—ÏÕØÏví­–&iÿH&ʼnÃØïÏ“tÃ`/üÎû}7œùêv†Jø¡Ž™¾5Ið™»/Ã`H=~ñ³‹­ü­…\÷»tàÒ(lÆ<–ÁšR˜aOEa>sÖ|òy’þþr8¢Ýo+ëã–Úò­Ö¢²,r>±˜In%'“SÉp2N&'Ãp¸NF›`$9•ìàæÅ0áL8‚|…\DÎ&G¢ï©ätrd ;΃#á«p:÷×}U#À·!çÒ·¡ŒwÿßÚ]Ř@vÂ[pÖµ_£ö~Õ ‡5Âo›FÀ]—ù×COû£àxæú#XLC§š,VÄÐàBzÊë´Ëô†ÿ@n/J˜[ÈÍ4’I‡› ÿoÓ6ëˆ0ëkË]Èw×UŠÒöG¥Ž—p5!µÀ Š8ƒèV×$íµ31n¯Ja/s¤E ‡àR…B.ðçöBìÁÕ/ü:o®›«qYòÒKVãéƒÚj_ç¨Ã±Íûã²x9œ]­„uëèpTðà÷ÊÑ_üíßî~ÊÿCiúÿæ4ýðßÒô/&Âð‡'Â÷qÃhïàVîÇTø€¸ÂìÚU¹³pµÙÂ’6ñ=Mk¯’ãÈ·Èɭݳ¯À¥pÏ—‚ë›ïp¿ïI©›לP¾¿$í–ú¥­Ùä‹Í|ÚO“Ùò=nÿnâ¯[¾ÛOßmøäس[¾K+ž‹ÆPr'”ÑùoÎ,&³ØùÇ3‹/¬[þ(¶çÂnè`’»ÉÈc{án‰ô<òØ122pwïEGè•ïÝûoÙx?è_ùûAìÿôOv\ 6ÿnãh$î\£ë¯Q ÄÆ4Vñ×Ó‡~æðŽ ¦u…2|ÿOýÖG`ÿÁïÏH n¨{à`¿üÈÅÿö·@Îý{ äâ¿þ#,“ðü |é¿åaÿ™þSé®V#F€–ä'´¼‡4¯JõoV½åªgtO£ú?P¾W±:xè­Žü¿²#…t^ÿ]µøwèüÖþÕ¿‹Ñÿi•$¶þ^Ûƒ„ª­¾]iF—]A×á´3T˜Iè˜Ç €hœÔ†€höp9|³,d¯•Æ¿í ©N,”yÒZ·xÄ€_vÑsÊ„µ©ÝáY'}ÿ_uWÖÔ•ö¥›;.Õá6@tLh§ÇZmµjÕÑ™vh«-nmUÀ ØZDE@¶†-NÀQ– T(ˆŽ‚hÔ–¢J]êÒiÅ¶ÎØEkýô{o<8ßwïM€ †1ÁÌŸ<pÏ9ï¾ýÞ²jÔ@_Qó¦¿N€S” ž8XâýNغ╌Ðüh-7‹Å }Àö½æ.ø$&§$¯ðrѹP%^¾ìßàáµ$ÐÃO¬ÈØZYÐö9(„r•/×Ô/ŒáwÍ(dÉáŠd#áIëâ|üðìexŽ?ž>)Á/Î]Á‡ô¯‚úâ ‹8Ü 1 <áÈõFÀíÇÓ›HÎH¯Ðtå©.Z q…ro:kÞŒ,äjJG9Ø¡-WÏÿ¬#Ì– rˆ èXÅg¥[Ýza];ñ)‡A´‘;-Á š]ãÓ&½;¹oµ*zKîzsÕ*ûw]»ÙÜ›¤ý†î†©t’­ý, ¦>û,=º ÖW9 :XUçiº‚Y^^³fŸzûÒ7§Nþãk¯S³Ý|¢Ñgá‰ï¢w%MÍÍ MŸˆõVß™mÐ'Æì«ìËìûÃX4@_Ù&bè{Þ¬f×ÃÎpŸe‘gØÏZ{†r |lÞ©³‘K™ î4ˆ[Û xŽmz±[ª;`)Ct‹âç\z®Ã6I‚¿Ðgp÷È~ݽQ½Ý=ÝtÔ AúÁ˜«.´²µSIÀ¨6 ÈLm…©=2]l.±›)¦”Ë ±ø-¨3ëÃèÜ]›Ì0+ÕñXÙœrë䃧¥¡gª€Ãû!§ˆ©. ®±P1‹’¸,^¿ØKÝÓÒÔ°ä0æ`2?»à‰Ä)ˆÈÚ™Ÿ½ £Ãý2mË*Ë?!>3x0ÑØFqŠßÕf’áæAk-|%ÐB©Žq€ˆÓŽP÷ÒøäÕˆÄC… xâ»+Û Pµð¸Ï¡ùk×lŽEIââÖæ%¹í®ýhG "T¬ ’Ì[ ÆBì‹)ïån,<.<4HÌiëI ¼þêdKbkó±žö1%Ú1BµfE^¥ÇÑÒ¢åŽÝaÙ#Q³[²Ž"wp«²|‰Št.–…àŒxçuÛáyúNéÙŽÿ$=ÛÞ'=k>Cò°™‘½¬&{n¯Ã|K]½”1"6•9FA+{ H™Ûô3qNÆ×@uð™P! Nïg.3O½·à3·Òä’´ýè úâAh¸w ÍEuyžz7qÎw¼„ʼnË)Gµ¨ŽÅ‰‹Ê]–õƉ“£`9(°„ugÌ»±/qíÁƒïktN5Μ~9ïJ¹@Eœ€º™V˜Ÿž?æ6úúï×îÄlwÓcW’ý`W¦¹=sDû à°N<à —Å7ÔÀÜ}w†{®ÔÇt ýš` á[—¯`V¸2¤l¿Z¹=#[Üó¦¯tM Iؽ\¼()’Á¹±%ÊO|§Féù¢ôB”‡rQ¾2WY\´´2L‹´¨±\{2-.=%ÔÂUE‘µu»¶Ø/ÊT‡FÅ%Ç aLâÖ­(#k'›ÖeçE‡·ÂpvÒ‡q2èï DÀ¸’ž|Páá}»‘éiN}{OºÀ§XWï+VMؤÿr/¤…ýôx²Ÿ†PŽ3Ùkå¼§—QÚS9€¬ç¨cçú Âl.<¯žë'Ãh§؃q‘Ìæ]µû*e[Ç@]¶­ö*”¹eæ(³P™‘–©¥H‘žž•*m’Ç(‚ädT?SÉHkJ¢ÔtyêæÉ¸ÖM/—°ÐÕÜü§¡öÇ1‘¢ËË¢Úß^+×þ¼Œj£°ý”ù·$á{Žc¾–bDz·ü«~ÂC›‹ž’MçûìUìòá}³ïÅ•úTÜŸg\Ü×@S™ÍP)³Ñ2S‘‘&ß g„uƒ<:-,•Œªàg+ÕJuâ°n¤]Ìf ²*Ñ8ì°U›¾Š>nŠãºETb"zä&ŽlÏV.gE” Ám#¤L +†ÂÙ«@»Ñ¿3õ¸Œ,'háØQgè´+¥Ò4žªîÔFPë8㚇ÊäU¤àŒkB4k\ÃãÌ×J~–RÁÈëf! yìòJ…ÐÉØË|‚¦aÁÚ5›7mEÅ&ÄöIЬ“Ì A£›!,²@—»j¤$v¥†ÑM¦’ÛzMÐvƒ1Ús¸tÚ/w,t¥nÍè”Ù`¾§[Gte½X%Qfe%1ÇHIÈ¢$ÀV>R¾\¯NØ®»;?Ý£NÎÙHŒ›ó,èõ©4CJUû¸2jÔ$&ú›iqÍÌŽ¿¤ÿÔw®Âz;A¼‰ß˺pÂåæpÂ,Á w1…ðPœpФÿDo3uÂîu2lß6·QæÜÀ7ÊÔl£ sÜ2qš4T›ê?¯¿o+*/_w¥&@>ý¼@ nÞù"[ª–ÏSO¡¨ôØÔH²ÐB /ŠEo–ÉØ rF<ó¿-Ûœ<;#ü4ù6žIúAïóÚy´<*5„\ÊþtYJàg¿CÛšv6îö]°"ô=$œ±ô< ÍE9Êíbx†¨¨çáY„ªtKQV1 ËÙŸŸ¼È"^ÁØ3¹ ÚÏ8B¢n„ ‰¨F ëú’šïñ)"ïpQc¢ãSZ†O  ¯jø>Œ™A$ýê«‚\^„Ó<,㳿àËþÂ_»rø¨.ÜÐ<ËÇSñIü"œäá‘DEú®¨¼`g0–°y¥œù3W ß_•°ý³0>Wýs øÍ$Ž­ÂŒUT1VQç‡G‚“. ÞÞÐ-@1|TQô,¹‹H€™¼ÎŸ ˆë\åx:>q x‰µ3×K1É0ý?ðƒ;<ý×®üf®{8Ñ*æ{ eitÄ!Ë…¾Ià*Ý<œyÿ÷XC/‡EËyOÒ‰ •pó 44°ûVоuü_Ý+‚†’ u-"o4ÇÓÖ+Âä¾â·›Vç{# Z(‘„¼…Þ"ݯL»ÝrlWcè“öZ˸Y$,eâáñø…UI‘ï‰@Û9Yƒ‡Æ-Þà·ÁïÃUˆ|oÍÑ+@¶þøMÕiP…X•ŠÐ–TÆUkIÓÜæ`‰à.œ€g+G4\_X1äájOÈ æâÑ<ìé ãÉ‹ÍÁ'a$ª[qs½DÄðć.ŸàCÅ‹è'x^öÆÿǃP|V€§ÀY˜Í0Ÿdn{ˆvzK/ß |WGÞߊçÓ#ðôÙ¥Þ?5ðŒrþ56-2O¡@k¿ñÖ‹#ÍÆ{/`ˆí_Ü’õÚ|qwÈÀV_Ü–=d÷E7A:Æ\ŒÒ€£1©b«®Þ£žÂ~¡QYÍfá¶6ó)ü—Sߺ@ ¨Å‘>Å|MÊ·u}ü÷ µ9š:Qèú„PDzwOóÆêg~…«Ã‹÷VªKöµ‰+nß³£é[¨u3ÒÉ|¾UZ±>5Õb›}‹x÷¿Å "Yæ‰0×ÄíìtUFçâûa– jÙ±ç‰çÃæ~ð¸Uõ:Ž4œ?äü%æÎ2X+ ÆË9é¹c˜]¢ß1ïE2SW/ûîÌ£¾Ò÷Þù)ÙŠm©ï½ì¦NÊSådä"á.̓®òÝ=®ÄC…ËCi¶»4cš` *æŸGœ)í#¨Ê^¬ÓM%öXþ Gliù=é 㯠õm¿Å‘ý2#p<çw¾ðÇ€O'° ˜ž£Bª1ý†%„ÌT\ò“졉”0…òZQ‘´p¢[wý”úqˆE¨6ö³vè\7ß(ÌXU]$ã*Îjq„±œE5ÇRXÂ`Q%BÈ%}Í`À¦âjGîvq>ß,ûñ»ݺ?®]¨r¥>y¼ÝnÆPmYŸ‰}«õÿ¹m‘m²Ûpý;180< úžójÆñ ŠÅ‡¿)8Ejž;wªòssYîˆ+®éY=( Iq0˜…Ô°_Ñ[új0·Ãâëf‡ì—½Àİr×jm®8Èn×f{$­·_›rÇ®ô3vÏRSî²Dw &M™É­ÕWEД)µÇ±1ãÕ1Œl“÷îñÐhäµ ŠnÜM›@"LŽè¬·8:¶:“tFÜWZômƒ6‘ØH›ÀPú¤#}·KïBc¦OÃ+‚AaÆJ§_ÁðçG„$G3®ÁâýþÚ\ƒ5¡Å»·©ŠÕ%b»Ý¼ÕYcÛ=Æ…ØôßtËLÈæ ô-á7Íõ öƒòh/ežæÜ˜~oo7†d]m³³!]Ç(;IØQîôÓ–çR {éHW#ÏE›5òx2úÑ(ía“l®£Y/Ù ¬{qõ.kÁËÆñø÷Œâ{NšÛÁpú•ö1av ã5ÑôHM¬Vr'˜wÁ•ZBŽ‚Åód,þwB’:wûxr/æÂô ,0!wg•õïì_ _YTb5®wW»ÿm»b÷o½jÝ÷Vê¾ûJ÷mØ'˜îç÷NǸí)j´í2 8² Î-6Ø'Œ³:Ÿ²L½3qÍOq·¥eÀârUyva($X¶­5U? +Þs ¿RÛ,ÎR©²TYd¿<ú$\ÍÇ%ÁV2'§KÙuéŒ>õlaÌ­§QQZº3‰¤®Ç„Ë¥a£õqÕGG{§\«ËT9Õåâò’ü¢=dÝ(‰ ~`µzWŽ•m{+Ã͇Æ–"å…ÃàÞ˜Û²‚9뫞I3’³™W¥£7&mÚ8z©énƒÒìÜÒfª3˜;f×;ú=c»uÏØñà;‡u—ØÙ Ú³ƒhýmj" ýwJ #\ŽÂ_ º°÷DyeÊBªTUBNLŽ\ƒÈÝ…••QÅÂCbC6Šß_ùÁBéq«Ý´œ–៨ðØÌ„E¥ªL”Èy ÑqIçŠÿŒò˜`ºùÝÏÉú.vóšzCïæ0Üc÷»pït˜~M0‹(¿­Ì@H)ÌNË”§¤¥'¥ˆVyÏóY—š”ÌæºÓ‘B™Fž'^ÇåŠÄô´´DabpR J"7KËí-¿~JŸíë%•J‘01%g›)™[|WyWj’ÿ>‹bý$6¥=ÑÔú ›‚©á?˜CS뇛 trá÷_´H[é™Q&ݲ(Æ@(}p`e:Á[0ÝHR"5ôðÓ%C/ +Q>dÈÿugÀë endstream endobj 127 0 obj 21387 endobj 31 0 obj <> endobj 30 0 obj <>stream xœÕ}\Iûÿ†°{kWâjÀ3ÁÞ{ïÁŠ‚Št)¡÷„ÞDP±"D銊 Ø{¯¨g;Ûõôn6Nî}ÿ³ (zzí÷?ç…Í–Ù™§~Ÿgž™ðu>ÁãñºèI\|$2G«!3Ý]lõ­]=½%Ü•ál7û­ÛtЩwOß-$» R~nÇŠÚÝ ",Nã[úd§o©%¾%+:¦jø±x^.oï ªj­Ô5-µ>jCÔF«MR›¡¦«¶PÍPÍDÍVÍC-@mµZœÚ&µdµ µ<µµ}jUjµjçÕ®ªÕ©=P{ªö“TûߊßÏð¿å÷äåOäOçëò ùÆ|;¾”ïÏ坿Çñ7òÓø9ü|þn~%¿–’ÿ€ÿÿ-ÿ¿ê”z;õÎêÝÔ{¨÷S¡>N}–ºžú"uu{uWu™z€z˜z¼z’zŽzAÿeF <ËÝÃßËÑÞA¦=b„ ÚÖþÚõW´gK¤ŽönÚ}ñÄÅÝÃUâ&ªm(‘hË$ÚvŽ.íYú‹ç.ÒÕh™¶®ÄMâe墽ØÔF{£ÄM* mçî¥í¢ú¢mãîfë(stw“Õž!Õ¶Ò–zHlñC?‰wa°¶‡ÄËÕQ*ÅÇÚŽRm{/+7™ÄV[æ®íèfãâm˽Ÿ·sw“i{x¹ãë®ø nj±»T&µñrôiã7.ž=GÕG™ƒ•Œ{¯Ô_Öv·ÃwÚºÛxs£yMfåè&Õ–IüdÜ{¬%Ú¶ŽR+ü^Ü”‡—£² ÞRG7ûÆ·Öö’Ø[yÙºH¤Êv9ª4ŽO»É¨­<<\ü•Ϻ+ïzÿ~G™Tâb7t‘£«µ·TÛÐ ?¶@›“Ií¹2+üt³ œús¼Óñörçú*ñô¶r‘z»ºZqµ÷’XÉ$^Ê“³%.2++/戭£›»LyÞÅ=@âf™k‹uÆe†µnÔ^ù¹ÀÆÊËÝÍÄÊÆ[&Yænïî&qžkë.³²Á—-°qÇ/Q›¼?«Û䬡òAC‰­£‹‹••²É¹®V6¸Íª?ÒúkÊ;çª^± 3ÄÞ°I;:ÊnÌP]¥¼Õ@yj‘òXçýËmê¯5>ºHyßRå§Žê³T6¹ii“cÕ­ªwÍora¶ò‚¾ƒ·– oW+oÙ²¦_fã¶­dºÊAê«Þ´@E8Õç&mI”mÙ*?U—%ïa«lÈEù¬DuÑEy§}“\š¶¦êl“3Žª3Vª§­Tß¼U” K•Ÿï_ê¦:Û¤ oŽ nÊ»5=ÝtÌ^ʧ¼U¯‘)ïõR~º7½KÖäq¯&Çîªç‚ؼ`†¿›ÍŠ…3ÜmÍò˜èÏö´[¬ãe¿dŽÔÁ@Wæh¨çí´t®ó²y¾.VËçû¹ZM3Ðtì m³qƒ{˜ÒÓbÂÐ^–‡õ^9ixŸÀÉ#úMÙ/xê¨þ!ÓFÈx~¢¢0óÅɃEY?œ®,Î~}¦ª4ç×s‡wç²çköì_¨-Ë{wñȾèÁÑý»+Ïvü@A !z&„>1›˜@ %z¦ÄbB‡˜H #zKˆ9Ä$b8ч0 t‰D_ÂÐ#Fýˆ¥Ä\bÑŸXFÌ#FˆåÄ|b 10"c‰AÄ b!1“G &Œ‰EÄ,b<уèB´!&]‰¶˜B‰v„1•Ð$Ú|b¡Et Ô‰éD7¢#A3ˆo‰NE˜Ý ✂&,1Ñ™hEXÚC´&VñDáK¸VÄZbáG¸ÖÄ:"’ð'Üb=Eî„-‘@¬& BBl ¢‰ “°#6kˆ`‹°'61D!%ˆÍD,JÈGa„7áDÄá„áLì"ʈ,"¸Oì NyÄ¢ˆØJ<$ng‰£Ä>"ŸÈ!2‰:â¨ïÂ~ãúí÷¤ìߺÿªƒÌ`:`뀲ãnø|Ú ÝA¿n=xè`›ÁɃO ¡‡ôrlhŸ¡×‡þ6L2¼ÍðGt¡3bˈ½#é‘Å£rF·=|tÀ˜…cv==®ï¸eãvŒ{0~ÁøL(ðóÄÀ‰‡'žtxòÈÉÛ&£)K¦ ©k§žœ6wÚÁ郧ÏX<£læø™7gÍœ5kÏì(5C‹:pÎQݹºt_ëÍÓóŸ»h^ûy+ç=˜ÇÎ7ž¿eAî cM^©?TßG_¾xÎbïÅw–´Y2lÉ^¾Á(Cƒ*CÆò¥!K —þ²l²›ËÖ®˜ºÂ~Å~ã@“Q&RhZfF™y˜=6Ï6h1Ê¢Ä2ØòèJþJƒ•¬zcþ«µµu¥Èf§­À6HÒK’+¹f7Ön½}/û ûÓf—XÇÇãN>N…Î&ÎÁÎç\R]W»¾sïvÛ]Û=Òc’ÇAÏ~ži^”—‘×>é`i¤ô¿2©ìš·ÜÕž…vbï¤ñXFîÊ ö»+ÉFS¹°‰^Síåv `'¸- Å·åÁ~ÌvÔ„C¨rWÍ ƒðøëˆÏn´„‚Ca1Ùž­Fî/§ñc l ƒŒÝíÙî$JÝP”Ä‘–ösBWƒø0‘ ñ×lŽMšûÁî„[ö¥ddŸ…ïäB®‹iì¨î–¦Áކ» Jவo%$ԦΣ¤àâÝ”êCç»Ìñ0 ‰ Žöë¡sÜÅ›ð?ëRã·ƒíšuKœ±Ìcþ2‘`øö»\ßdP¾‚ê<{ñÙïáfmVÜ&°ì Øã²KRjž¢†€ÎF ëX¡V`00Þn’ïPl]ë{ @ütc/Ô¢‘å2ÛÉc õÝ /V'Ï:(Þq¼$§€ìÐDŸAñ¡q¶t{ù0&×Á„ˆfirÍ¢Ð|6†‘hû ÿ Ó > gQp ŒÿÅ“P“ÿZýsQ]`û_$Tü—„=)8Œ£½;…6(Žú²GIäªbwIÈþw¾‹ãfÛüÿØIƒ €ý{Ã]¯îvw¨—àbÖ‘šÊƒù—ÀqPë[ºb-xv£ªìÌE-°;h·g®C±qÊ @£[Ô#´)‚H8ž:•ë·Ò+Ì#ÀOìíåihÁ+€Î3{àΡNåy›yE¸ûˆ1( 5t{v €$<I{óL1’"’„ñzˆÎs‡ìR* ’$Ê¥à}x³6a LåX3‚=Àô#,O6]àÒŒ¡QûûS ÷Þ9)ª8ÿ< aÇq7Pw‘7RgNî6Ÿm¼\j%v14wÁÔ·-¿ 7Þ~/nlŽNS1~@,&*rjSKÑVYU¶.М&˜M7™í6L ‘Æ… oÎWgWÙ±LM¡¥Ò˜ˆ±Ë˯ÀvסÚ=q#‡=a&ï°–$šD!ta¼ÀÂ> Ë%(“„UJÅÝ+?Ê)]O ñ[ÑRv+Ù €ùl\ªH#aîìÌ®‡q§ðå;Yf편-` xÏûhê ½¼ïDÑìQ–¨@ F¿§ÁyP뜶_„zQnÃf ô@ãš·ws•_W\;UTªA™_ºc¢ï:?€¥”…È- ÎÄäy9ÀúbÁ³œ®iShÌﱜF€Eéú{Ý/M83a4‡½ºz†®‹ÍÅ/ÃÔ±˜ƒ˜:c–;”_€× Úq½ºu[׳6Š#þ%èÃl-OØ JÁ€ ÷bûò%Y3Á0ÉÅÌd¾ž9Öº~4êø`–áv¯Î@~­‰(_‰¥—)  $%µ›ÀƵ;Ä0âƒ<¨Mù·'¦dåïIÝŠ@^@¢û† ø0àL×9)ìÄ“{b‚+Ê)Ô‰d[Q 7…TyX®´wŠVëÆJ±ê¤6!7;“œ-’û3¨#èk:¡ÿ”afH oh4 òÎ(ý@tëI9l`kêiÿŠæ‹üPgæå‰¹Hm²Ç¨•úbcSÝwÁÈ»µãÑþ“⪠çŠo`-Qjª²l~×Í.°‹ øn÷ÕW—*ƒ”mΚrÍ¡R*CñŠy…{ »QOË-‡Oöìí¸X¼rº‰ûhð!•¾ 30`’ï ˼9@s<˜d¹lºñlסœ"u¸4ñ× GóŽ—‹ôQÇ]8FK¢¢ÞLM‘%æâtĽ̡ü"ìtCÉEø›âÑÏ~xÃc§°9ÌxjkuB^rR6ÐÜ ÖÇæ®Éx+´ŠˆóÀr+ß¡Áó„Ó(ß¡äMj¨Bkþ«GÞ¥”ª#1Sݹ!§â!ÃB˜È@}ê68–U}´æhÑ}p–UXï²ßa½EÛ¡“õŠ1ºË2ÌèN¡TM±³™[˜mXêà¸(íl£ÑãÁJxž¯©•3ã¬Û^ÅêìzO·WõULµg5ñà´ ûAz3sî!Óï¦*»Û-lŽÝ¾f'ì)\·Dƒù`¾•ÙLZ ù+©¤þ÷oUFÀ¾Ca¯®‚gln˼Ç)ë‹æ40]²|î’ÙvH ¤‘ÚµI¯NíI=~F83xÞb‹™@SðÊÄ.#O‡ÍAo*&46 ¬’I™o±ÿþU§œ ïJ.ì Û°µBÁ3´³7s¤Øtj?­×H#ç}a‡ë¼+nAŠå3aîß=e v ¡.Rƒ<ìƒ:ö7ë7^4m„Rªi•T«AËÇ·ž]œøì‰ìá:fÈÄS3½B#fÿEX†oç>àdøÒé",ÿœœ‹øœ™/+6¬h`Á~ŽWTx⪒ð?*šozÏÒFo¬q€Ý`mØ£ÜVY·»å-ô÷Ój‘Æd=ÉJÑJ‰»0†e¶Ün{ ¯Nû&FÈ´œWÊ9¸lLòoÚ›I£îÔš Ø(,òÌö{í–U„Ÿ4œ ‰»°ó ÛÝã³Åƒv¬HÞ Ò4ó‹Ò«E‚“µ¾ÎQ±Ñ1â÷¸ƒsìp8½8k­ì²v¤Ü©>|hVäx˜p ÃçcÐq{IõèÙ†î –‹ŽÁ,R…¥20a 8‡<C­`}Î)?ÃdÚËÀéÔÑþv¡kB"ìÅ‚W~s"í<µ@h|x‚ GQ ¹!›WoIš !nsüfì°3a‡õEÙZ Ô3×(¥:''%+›<Þ½'ûô|2p·G®s¾MÒ@+Ú½§õ#v$ö×$œL™Q©AI!€puñ÷õts 5æÔˆ8wÕ³Áç³ß2He9áD*Ä:ØËÃÓÂb±n}À¬¿\ÎyR\+>xíBé}ðµÚ8†"*. ;©4Ô@¼hê€xƃ'ˆ¦ 7E¥¨aC…øpö³sù·¯‰"GßSØÆÈÒØùÏðKûñÙ‘ØÊL¡vÁ>œwvA}È9œ=¹Hé ûk‚c‚AˆæÒ=.W ²ÖnÜ!Jû)8fVMYÐæäõñ[×¥ˆOÁ ònræäN¯×;³zÅæü>÷]9(mÎ0Õk VÞþ3±$FÀˆ€}» ®Ê­ØuLÂŽø$FCbè4jà4©±ÈÀÄa:˜ ÆWYÂ6ÒŸ|±>>ñÏó5ÓÒÓ³ì5ܨàèú¸Mq›D¨/µÆ76ƒåiæÅN-/úü°³xVtìüފܫูôpŸ4ÄË ®IõØVªuæÈž'÷+Ü–­Žˆ©„ç æHÇkð;F}ÇñS…]QKP‰Ê¨c0§E ¤.ÁïêA;‹C<ùliø [ÂT]˜hd4h{æT&a’eŠ/Á:îÒ$EÛh¿à¯9é˜Ñ£k5¹gjDAº$&%rƒêrÎpóš/d¾’²?G:‡ºÍ`½VŠøÂ¤è­±©RàHÉö‡´J±8v°[ØW tPYƒ;ª†¼(Ä(^)Ç6%¢Roš¨¬n`MþÒÖpCéO¡ ±++æ¯aÞ*oáž…¿©:Ù ¶¥Pç©Ûh‡f hM¢Q’";²f½â5˜/ï‡í©ˆðal3hN±È¯NŽOZ»Mü–àHÜWáéí¼5ýà 8èÑÝœƒ'EGËól¿‡o*ÚûÖØP®#ß(ŠÃ–:¸.š¶ù›ã¶¬Mo»Éµ4kµwŒ7ðÑxy1luîÒöûD•ùEÇ·ÝÀÜ*bT™ý½ LáÆÜ‡Bãí±?C½¿A£íW³í¹“%œd÷¦àD¶ãzEGò=ᚢ‰ÉåàØTØKöì*¸Èf¥0A)Q‰ [™ ñOÃj,Óë¶Ç'oÕyþE²Tç“­: ÜQv¥Rjw¥ô¡ŒWŸ`oßp±o³Â—DMWÙ»x/—8-ú@²]’'Íö) ߎÊÌ58|XVGjðø¨õa4"QèÊøO05×´©WJAEIÁÙ-âªÛÖnŽß·.NsKüÚ¸­šT½»°}U€ò,ØÜás<È÷(æÂæIœÎs1 e‡Âßá.ìB¿¡«àU²%éb‡Á\†ÃTMÆýBãVÀqÜ!öŽ©(årv€“£ÉÜaûwíÞÇ©rCØŸ‹Sg5áM§^J.ßw¬[i¶Ì!46<&L<ý\1ùJyÙi Y’îk´&X< =«÷& yØì`obT1Bw™—ÁRQp•iþB0˜y-žG †§Ü!›G6ì<¹;5qW[k3–ïó:Q;Æ$pçæÜí¡»Ük™…¸n%kQ9‡ÜgbÁÅ5rït]‰ùÞÍ®Uܺ@9Gh¬,ÞŠòµl9‰FRH¦Ø·–ÝÇ=Ľ©ÃÙÃë‡ÉöïlP÷{eiîMºÇ¦ÝÓ/aç—lѳ®‚~òv=ã±Ø·Ê#Õ+e:g’á\Çé@ŸžtÄðNmmöÁJ‘à;óäé‘nwÁƒªË]Þy|ÎzŸ°¨™sÀ^Ô ñXu…ÚöÑÖGb€º€±…O\˜÷Äjú¸‘tcWèmá×¥a 0„œƒ:½}¿/ùåÔñ#Øv9·à²ûñ{-ÒÁ °ÐSg¥¡Å’Å6V€–&¥'ÅoH)Ãoa)è‡B2»crÜ °öZ"1^¹ÄÈÉÐ6ù¯a¨õ`µ*ÌiÓ¡ú[lÞìý1#äŒÜ˜Q(ÔW!&¡•QX’ºÐÇò–ôÕŸ6q¹Cöîõqã6‰qpí‹=XÝ¿nlûêÑþºc¢½G³®‚‹4TÓ»ˆxf’P3Q ìOÂJ±Ê±xDzeÌè!•+>¯r~ŸÙsHE^B­ì³!MÎÂ7Ý·Øn¶ÙK¹ëKkà F4…Œÿ3†„ÑTúK‘Š™ Iª~ ›°$õQ†]0LǃPgË Ä6õô‹9Ç©=fYy¢å£ÍЀÚÓ¨õ­i°Ýƒº=—«ENì¸.Óoœîidæ/1¥œŠß˜¿ãRÉΣà ÈôßdN£žhSYà°b¨þÔ™+Júæ5LÀ;áiw´å±Ï`9ƒæS»á\µ¡lþ3òBmI8›GÂ6øþ3Ÿsøa*_ù݃¼NÍ”{¨<{’‹ù&qäQ¹—_)d„@C'¡Õ4޲«¡á-ØöƒãN)*Þ¸‘æ &ìË{û2.¨/ù€ ѵ·]j(„jÛNM…jy°»‹„ð]ì¹ç™,"ÏS¿ÁSädÅãžVz±²{!3S¿Cbêûô㨆b­Aï©øê«,²þ†Uu,ìÒUð‚ e»0…i©‰ÛRJK2*ÁAúÉÄÓ¨êƒÚõBVnw­°{yú{ºÒ‚·v–Þ‹—j!Þ½9PóÞ¼êQõ¡‚ëà8!+^TB ^ ÅQwm‰ÛÊù+tV8î,?]]y^,xkˆŠ˜Ú"çc N^fSXñÝÉs·¸ÚÀn<öø‚AÙ”êFÂlÜ]7Ö nåÁ8QQØ$"†<‚ CÂØå£“˜³ìM˜ÉLd§¨…6*¦PÂÁsõ1TMÖŸ4§=˜¢1˜-2nôo¯À ÌšÀØHN»ºà7¨ö¸æÍ ÑÉ_÷Á¶£aÇ)wP[„Æ#‹•."Îê½9R”|ðˆ8Ì4Ì)Ô]º|¥+Fµ‚·fÎùkÁº¸õb85ÄQ“½ÁÀùS&‰ÏL\ «_«Ã¨â?ŒÁЄ‹l5œþ~Ƀ"gæ;¸’|MG+É·wŒEëPêLþÊަ®Àdj6šAönrŒZSÞýÈŸ©…h09“€›ÊV°•8ʜƿV^áò¦}.òØŠiŒâG*hÉþH©úq]«hÖ5ÈgSšÉÛ®`lr ýþ» –Iø»ÜE©°û2¬Ì#a¯éYËùìjf]FÜVìê«ü÷;ïðÈtÜj¸~kP— [f´Ú!\â«9ÅÆd ˜†×@¾»9r Ò-7ùì8¤6€ q©4êBEyÅ0ðŒ>¤Ce=…¨Œ·Gö'îN×¼±÷ð#ðð)“ä¹§;n[š²š ‹‹£2<%8²‰ˆñ£Ñ˜ÙŒõ6ŸlP S‹v¤&mN\—³GÔ±è6³;03¸†vÖóƒ8Ýd1þ°–ud8Ü8‘ÚT•Ÿwlóæ‘‘ó ‚GËOØ”Z½?¯Éulëæ|ÆbÈn®OR)ó'ä "Á°yKQk«a4ô¥Q‡+Ó`kH?=ÛÔŠö>)…3Á+v˜yK¢Rg*v:­X(CZƒÅîýmÚܵàЕЫ ZœUš—Z„£¬wí|‚“Šä>8ÿ8ûe÷ÑU0M¾†³YØ6ܠ؃Ø0+¼Wa$ˆˆváØú··ð›{óOŽû `öæ»I–›˜.³vÎ+©®¬¬ .°ãÐÖ¯x»dö³ÜýgØN¶á€  VíiÔd°ÔØo„²®²òô±t(Mù[K&R…iÁÒ¨˜5AblIÁý5!±!!Zú»­‰nRé?“”Wð¦m›ãצˆ÷B# Ö&ÇoÛ¬rCÒ}6…&¬Š÷Zwuc~Þ¶+eÐH¸¹bóæ@—PJ'À“·fÝEšë‰Ú±ËѼ°+*‡|ø ’*ã΃/Ø`¦—"XÉ ’“C)›qV¢öÀw¨P‰åi6˜“ÝÓ°1¡a'>û†mÅ„¹:ºLÀ̯Éß™‘‘_’~”Ó—V Gm{ÕvI±)^!2–ÉB]¼ç˜ÙÍÓi¤~Mv¼¹/åÜSQ‰> GSCàèãÕn¹ª©hµŒùMškáì4Mlö>–W¹C ;B=Æ¥GìÛé’ÜœÒüÔ@/kw{#Q{X tÜ0…'QÈ»á:nÔ‡a[î?ž\Î(ü•ÞŽõ§S\{ùG<ß=ë¶ÖñØ8XƯ ’o’à“j²Wè›"Ýè &妞é[TbÕ¶äR¶E¦´¦ûg®*u öPæ UN¼/ë;òp,„¥h$4g’ÎmÚraïñâ’i¹»v§5à°ìÍ.‡¼eÉóÁ80Ûu¹íJo¿q4ü–JyTyè «KíWøFù„ù‰ƒ<#" m‡Ìµ5ŒœFC¥Íí*Pê ƒ€f†2Œ&Pè­bŽjMÂRÊ๎ ¯Rh ¤´€‚ñð(YO/¸ì6±£gk.×~…¸D¦üäõf)Æý¨ Ô/i& Ð §¡oíç;›Ní…ÝÆV„]AZÄà¾`ÉËÂ0MÒÆí6KqçvÁ¾\ ؘ2 MÓ¸°S¸ä\9œ{„©0ºæñ ÀŽàת»?ÜzZ Ž…UÉ* ñ£Ðª¼ïRp³ÖxVîn¨èi2~àÔa¦\F•‹—eZ"~a™9ɾd‹™uÞqþÀLôm±ÈXg¾Ã4° Xnw+¤]0Ñ1™ ÜÚñxÿÉJåÁ°Ïo§7 9CÆí¸©5Î,P “vJ]ý>V×ÇÎMzÈ©ë]>y‰ƒxWà#} ûJuw$j;Ò µÂjÝ_°t eu™ÒЭ^8BÃV¤~¢ôœå©y9 Ak¥kS çR~cFEêJLt4uµ±¸LÚ?û‚ç¶È”è¬hï^ÂsTúkØ*á‡;Ű½&Ò¢¤‹=ݬÃéyëûmÁ¹ \ɺS\™œžž”ƒÃûwA˜=SùˆV&å07FËõ¸Œò!UFù*£|[•Cr¦Â°Íˆ;`g³}n·!`¬õ̉ㆢX"0Ìx¡ {œßŸqâˆH`º˜dCTó?Q‚8$®fl$>Ë=|ùé_/¥Ý(<%®xp¦ü¦~wêŠ÷Ô‡Åͨ`Ûf̨†·?AK¿ù‘¡rZå:ìÔë†à¾|Ðg³”hÓtåÌ 6Ÿy ÉIÙݾjî…³„ãàθa{øì5£ÂéP«« €5eqÅÔšäèm…a»c7€$úhuÕÉS»\®a±á"Ø•Z›—RhHëœ@Zu½LD¦. €!ðXï—¾ˆÖ§B—’)l{\hб1 ¯°2=oC È™Ñåa´ 2´2mMn·J°wë™,‡¾Nö H×zbôg»É<øwsÁÑóÝ ÚͲ#à2Æœ 1‰4l‡ÁƒÉuûOC‡ ¼ƒሇXD¹¥† ˜DÂjkÏ,K=ÌÜ$~‹=£Êüö™êìÊQ^IêIp˜¾f\>A¢Ëeº¯œf1o™ƒlǾ›ågj¸ˆ‡ý¾ª®Š*Tòámy³d™‘õN×½Çj-sÝi%7fR“Bü½¼¤¾ÁIÛ³s2sÅXd•CN3tΟûÚÀùÞø¦i.Ê—4ÏÑ¡õ“lØþ VÃI¾i<¶¿Ü’QÜú]JÞ§Ø[r)‰Qgó©Xö;.¼€ƒ_‰…—   l‹%ÅmIÈÃÿPï§gºÙ—fÍ‹¾¿¹‹sѶ©`Ðñ±°qr p YÐb&ÐG™ 4PeeË%Îú`!=ñ˜éOk²¯_í˜Öþ€mä]¨þVøá²:/7ÏþÅmˆ_4·¬]·5fé³ r¡Òo(Ão«Ùå´„cò¨âÁùphÝY›·®Mš9ÛC|¥®¾wÙ†L3±ëŠ#Þù‘å@óû{ÏKÓm‚Bc¢Åe§0U‚|ÒünAí[p÷©qªjÖéÕAaÝ™:ا®« Š÷”û0ŠÛ¿òÅÖÉ©Ç 5f¨^µñ¥Þ~Á¨r–8` S”#uZimcéà™µ³¼¬l¿ú+F`}Èh|óaîæÏ”7Na ëovl¸™en1_t#gllÞðäêð £8Cy÷"Ù3õžvô‰Ã'xìeø–Óf˜ßr`é£ cá’;Õ½åÒü¡ËöåŒ&êK…(%HO•'×ãÒȉ'¸9È-‡¹cÕ4 —vÿ`…s §å1 Ò ú ~ä% þ û5~ãfEWÂŽkôUNHÃÓð)<7"T×z–…½‹·½Ì6x°¤U‹ï.ï xÐV¶Î+D‚ÇV²ÔbΤˆQW*Ò3&ãóÑ–BâÑ•]Ç+EE{Òƒ ,h—SîÁíé‰9´àtv^ÒÞƒZà O‘éN¤~Ih¼Ë'¤ÓEù¹ûD‚K{2|$Ñ 26RŒV¢*Æ-%<d€Âí¹¥iP0M(¨-òÙ,ÕNþÞfÞtc¦cÄ+°Ö®žFìVÌì‘ó¹ ^ƒï÷Ÿ¸]q²à5¸Š¢òCóžÜ:–ña™í¢Œ™Ý¸j&ýɦ œû±ÀaƒS’ëÐ)ÂB’5d[3q‘`5X$–ö®³Œ¬Gà’Mû×0±[Àz° ”'É,ÛuäÀ®jPvnwãø fc ö#§Q½.ú‘œB]ÆúÇI€{ƒräÔî‚ó^ò`&,bzr騷JÔÒï'èüïÞKèô’ÏÆ°ÙŒ×v»­ÀX„:ú-º)¯{j²£•ÏR`¬ ¼×úo”™*¬™óüVºÿþR Y2fŸ.¼wAÿFñ´pH¤®Ù™ùäºpÙE9¢LU±ƒñ,ƒ%³W8U]=rô 7¹ÐÜÉ[q¾¨ª™/ªJÂ&¿¹/R– dé€é`†‡¹…c¹^îdЧ‘ª£iÔáÞ4¨uçfîâ–çÜ®áh«ÁÇœ¥-‰¸¤*cmPëæÞÅ€s}W‹Mí¢9Sû.Zi÷r9ÒŠ1oP¿üxr y‹š9€ *ï}•'ŸÎùóZj0ð4^f°Èy˜ œž÷rõ@……ð' êÉ‘§(¤÷û#²þÛ~ÜjDK©ÕZê’2‹ eirã6v<ì…Úpõ%÷!‚¯™dêz©Ó“渚ݠ¿E}³ 5á1lû8¶B¦h — ªÅ åÅð ;9 Ornz²¢U¿E¾C^ž4DÉMJ÷A ¨ÕÒž+m¼Åùìùj&`¥ƒ÷ @›y¤‹7Z}³Ú?6„Ò ÷Y¾}áäÝ$‘²Ê´Åî7¹/?ÿvþÄÈÚ˽½¯ÜºÝ»}…ê~zÆÎ®ãË…ì,&>%n#ØHß\thè4=§E¦¢•Ë<&€éô€‹~‚Ôƒ3owˆ†Qþ†6®€^êRpòà¶ÚìRqÞÞ’ô€®Î”.K!±±(IÑ*4 ;ÊÎp6&WvË«à,Ôc4qà,jÿÒõ@Fhš‡V íÞo`¸.€óà qó‚·Ë°-Ž¿¦êMÐÆÊ‹?оÛã›öìêÛ[°êŠx™g³^v(`ëÌ$R5±ÁÀ‘¶qr²±óÛ¶+¬‹ß(N­ Œ]…9¤{Ðöä]¿øs~p¦Ûv‘à—Š¼¬ÒZÇÍ 'ö_nÑÇWôÚzd{*–øÜíR G÷屫A\´˜½ç6 Y.)0æ7M ¹¢ÄÀY$ÔáBžçTê3ò”®b_µáD²ynu¼B“¬£œÑ ÷Çï‹aî`Z®œüâ_ªˆh§~>! D /~†‹Ó‚Óð {Ã/ü!û+SêQ$ɲ–¤û&8 çj±b±ž¤€qí½éPüæAÙíc¢Ãw<OìlruùáY™på¾^QëVÇÇÄk î˜çÆÄ9&ë K¥ Ñ9þ£¬…e+IÈ M& äF¤gúo–Œ¤g÷"•nJöy§†çrP•Xµ7ï𾇸²Ñ†b+Jª4Öƒœl±äê?UróÏÖƒ´C؀ϱá›È.fÐÄô…LŸ±¯Pg4 u>7ƒ_!æõwø4Á¹Øzt~ÔTX{$Ðv~7¹)’n¾>BùЫ¯Y$! §±šAó;p—gê̶e”)†²GS¹9Æ“pßß´¦b4&j# l\`qWå{UË,2?^fQû5Ë,zn¿K :Ã\¸ò#/NÿïÜ’/£û«êª4@¥ 쵪3M%¨5D‹’z4ìŸÕcÄŸ–Õ‰D›ü…Y¥†’4N²ŒÍÕ_­Kh+:@›¦"÷©B;˜‡e½QNþÂR ˆ…¼IKØ«Âmw Q÷{•:øÓËI?¬|õK]WÁ/dá9æ Uœ&ŠY ¼%"W»iˆ¸¨u!ôkj}zDš°I3.‘ÄOl½¼6=E d„%¹'ÒyØ™¼‚Š3ZÇvΡjˆbùU70™ _S{’#¤~‘Òˆ0qX” k1zÆ~Øÿ?ì_ï‡ì‡ç4óÃó±6FÚ}T~x¾Ê« ïg5©ÁR®žx[ŸÑ3ÿnÃê‰ÅÍWOtÒ½Ó³qõDu‘ÅåÚÕê‰Nõ«'BÎcJ)P.Œé*¸ùw.hχW›§Gì׸çÔC>,“1qTeôÕÌòª҂ʌK_ºªqÖàƒåUË,Q.¯fëÕº¦†o*Ž4-ÌVæïè÷ù;é†,3±«Ñï‚Èý@óI}þ.04&:Hü÷Öm¢VX;š†Ë-+ÇuN7>Žüþ‚’ìàt¤…XòVpêœæî“Ïv“ÏdÆëêŽaÎÝûÎß¿§{aœ8nsp©±­±™MYEåž=•âF_ÁaìËþ¼Ãh£MÐüaÎ?µn ÚbÙlâ°š,&jЈ(N#~ü—V :¢Aì¤æ0àï”Àœ~, õ¢xYÅÍÉwï†CÍóÊŸ‹_T «Ž}¹ 7öåkâü7r¾\}›}D¼g·¥ÀÊJ:óå…*_ž•Áùrú_ž¾e7‹ `èÈÕ:´fW|²ÎÏå€OËÕù™#GFᇯµ!Y¿Zä²8‰k)±ó·Ž RX暺c•È]VBö¿ }Ððó2„‡àR‡^'{ˆ[¸5>gf¢çäg—¬ÍE'ÉiÊdƒo8ƒJÁÕLÌñù-®aÃåaU üWÊên–÷9sµ–ÔÁ¢+Ž>P‡a% Ød•pp²SÔK‘•-§„™©õ€:1²ÜK¸%*m5v¦‚oÏ€cå%7éÿS1žÍIq ŽóË×ÏÂøp)~ReÒª¿tM­@;ãݰ¬YÇ?°fÚ-Y³æÒZž<¨ìú•2ÛáÛó £,¿YÍS2¯þTJæä¦dE»!AðO ÐðègK+e¶¡ÿ²×7d}Î:rËZÛª–µ¾Ä‚ÉÙÇMP[µ°õhVÍÑš£…ͶÎÅÖn•Û6]€rng*¸õ­CÖ·ûˆ½Ö·6(•+qrY'LJpy²@{¼ÑëàÈà&4iXZ ù¬¦Œ³ãà·oÊà$ºÙzó_ïæ'qûaøšèØH@‡¬Ú˜¼eíöuéâ{¬—ò›…ž„,0²ÑšfnY¥›ð¥Tñeø€»„ÆþÇåj0Çs5Y¿ÀrF§ªÑŒ£Ð6SÆÖÎÞÖ=Ý'owIqÉNŸt7ñøŸ´“à“;ö4œl˜T?¯Ì6}8³.ÐÖÿpÞöƒ@ð/Oדm&LÿêR{ 9o4õM“çÊÜÝ×&Ï{Ë7ãÏbx‘½Ä,D{ÉçÔ÷ìr%56öšB ßgžÏ+y÷7dž§5ŽOÕgÀ¨fó¿ÿÛ ÿ .–Ÿ&üWÅ'ƒ“ž¡ËŸÜt€‡å§q4ªÉÞ§eH®{6›ùþk¦Fþ¾uÀpÑ%-KÞžOÍŽÿ/K 7'€-Aƒ$žàpè{×|öŸuÍp<ý7Ø?-Ä0‚â)ÂI3PFYòÐgüÏ5ýP_ÿ½ÃßÝÓ?vΣ¬kY¾ëÕA•uûاWþAq½r\UMÆ4U‘ÚUäØ?¥"Çÿ´—ï²ÁMûtüƒiŸþ-Mû¼×«ãJÌÿï Þ]8Æþ<ÐoÌÃýq¼*оñùÔܧ·` å;[¨ê‚e¨¨q7Š!gÐÈÏìFácÞ°űuìFa”föçv£øÚ-•Ð|¸°¥ê´ÿ7~Ù×´ØÓ¯ÜÊ Ñpþ§FÜö¼pávÊ]x'àeÆV—¼JÅén4I³Ø9ïšù-°nx˜» ޶r ·ÆÚi_ù”†s©Ò Ü^oë2Ö¥nÌ¥a$µ_Gí}r´ò4ØŠü™\…Œpa}Òl€zÔ©ÿ 46¥ð+ÎP«ÜcÂV»q\òîuÿ¢nÏo‡Lqã*A¨Žñs˜1]ðbÁPƒ„9T6—H°¡žá?ØÑpßfR՟$JW%ÕÍ©¡øÒR~kÏcK¶4ÇN—1 )”¥ !© ÉSÌbiíEg™!ð,ô…gŸ£³øþÝò‘ïú0èàïyHÕFãfnqzsvSDÁ_ßÍþpöëÔ- pðk³`mád¶ÃÔ|5ÙjKùÓúí¶~õv[¿f»­‡ŸÚnK „³á¥/é8'jaPÝWYäØò¶›‚éÐ}ÅH‘:yžŠ²p°·\n.¼‘pþüæ[é?¿ÚüN€÷›%LQpý~ÂêòK>{Mg|"¥Ñž€–ø'íÌØœ•±Sœ±s[òñ·ŽÊøQ915ú²é…V?Ì„Cò3×n®Yùy¹¸:GÚôû㬌µ ;E “Y?1™g½Ø|‚M‡ê'”Zª!Xù)º…mDú_@6Õ[¿Œvm4ƒá¦þ:•ëKIãYª•i~ÿÖY‚0…pɧGùÅ»Xýû¸á ;ƒAªoCú¥1‘Xß×=±£¨ïí øRƼ‰»–qòàɃ{€{­smãp€k\$xþ¾}16{_2ºß>?º…;–¶/트ºtœ0«YîÑέŕD¶AÁÊJ„÷x¦Þ&5b÷£-b÷Óÿv?û§±ûpH³ÑlÇêõ÷iÝÇeC ï4”£„9Îå=­ûúig)ü¹I±²²0…}£‚ŒëîkÀŒ°Ì›ßÞ…‚ÞãF„»QŒ-o~[Ç®ÂNbéî'dù!YQ™`ÙØÄäý‚³£Þ»š‰IH}ÁÊÿÈN€p&›Ú,у=Ç»ŽØküÈoÆöÔc+S`@›p»ž™¿¡P´å°”ûê` é°mÇþÊÓ'ò uÞ—ð ¨Äªñ—'®'¢ÕPö¥uÃê­w‹&òśȷÙD¾hÉD¢cŠ3 ¶ÝÒÁ΢Á¶o¹•¦´í:KsB>¸¥xDî5V,éc4РŸ×)Ë ßp©ÿJ/k`CWº?Ü‘¿af®t•÷O ) HÜYyäø­|ñnþïlb|—5ù°fñAÑβmZæÎ×íýAÅfSi¹øg<–¶˜œúWvM‡;®9lå à'ø)kŸ~ÈOY‹üôúëü„!s…Ûg@ÚW2v\‹y /ÝKökùñf¹比v¦<¥‰kþw4\O|Â)ÅS_\¦hõÙˆAÕ(Gc.ìø,•1Ïû®­Uy6Áì–9ΙûùMÈÅ—ü/àºK½+°t‘ZkÚäWà4ís«J÷>9$nØR»9K¾nNAØÏÐòïÛ2Žú„_üw'¦µ&¦[X@ÿ÷—š7”7·ø¦«À¯éÓUªX ñÇÿZ-äÖñüaó^êêþµ¹èËš†;ð -0¼Ùrƒ¬<­ûÛŠBûÀéÍï¦:ý5û+ ÂLZdÿoŠ`^Ë>¥Þd_Pæë€ªèíïúÍ6Û–š õóˆ¯ë>.épåÖï¦)y’öÿEi\a³Ò¸ÆzÁŠóêieŸ|7„`åþ"Hã=Õ&š/oj¡K•°ÏÈTÒyRŸJ:§¬¼ÒSmU<çãŸ`ùÔ^×0­*nJ­guÿÄ‚ +lªR1ŸŸ×g„?ì¼`:tÆg>‡PÞ'Â5ùÙ‰Ç_ö5yðǟ̃w„œÊdBur.•P^X\¾qóá´(=½°)¾ƒ8¡æì‡|óÇlB½? ž8Ü2 ’M DòÏPÀI–>šÎ¨v@¡ü“w”–9R.¾\³§<§†n‘Aÿ¥>ÇåÖ—;< 5Rã×çŠÆy8ƒôŠJ×ûÜ~+»DÛØ=ŸÿÁø€#ïÅgÆÓQð!y.·Mô|x¦‰z_¥†Ú[#Ú¨ÜåZêZ°© C,׈ձA@Ó%09·¼¸êL¹¸aS0ÏúŸ.x.ë%ú¯0Ncí›ûå$ÅûB¡—?»Õéq‹cúåŸÓãfcºM ØÞ¶Ë—/Ô2ªðx”—¿Û€GºÊg ÐtLÊ«ØwàQ…ø‹7²Çú«g}EÊíŸùòÞ*qøú‚”³T_ S Oã¾=͉›öaÙñŽ”F{ã¾ù'åV•ª+õ\v¼×báÿ7sö°Û­iÆW¿ðí‹)ÐÝ|šçùá9˜×|íuµ*ù1=e_HO¿¿ž¶ôÄ‘ì*ÅÔÏ9U UuCw`—Çýkõ¬Ï|ñ^{ÿ kF_j9ÅRŸhú¾¿ÏákÞ'äLJVüøÇ4þª5‰ÏíÎö—ö Îû`;U¿_×ý=UÎвÙ^5låï=R:…~\óË ´O±Ý?ÃŒ¿L¥Ÿ®tÝl׆u³-0^RJ”?¶´»Å[Ò¡üêé‚ßÓ1W”ŽéþžŽkSħ•tDŠÈÏ‘‘{'ë¤"¤vK„Ü^õ BšcB¦güJ¢-¨5MpÐ?±N :ÃÒ&)ËdKÒà”4ÓL ’­aŸ6LjÛ– þÎ9¦Ú endstream endobj 128 0 obj 16368 endobj 19 0 obj <> endobj 18 0 obj <>stream xœÔ½@GÚ>¾BH»)v0ŽDÇ=ŽkÜ{·±M1Řދ †*º‰Þ{¯î½÷–b;½çœä2K†|ÿÿ,8Žïâ8ÉÝå¾ïÇ’¶ÍîÎ<Ïû>ï;Å,ÂM°X¬ç­}=%oìº1Ûsi3=Ù€~™V ¦•?Îå¼LX”°ÇÑ‚ç‰Ò— ¢ÔÌh2uìÅÉÜ/LætO  ðei¬Vk˜õ“×à3sƒY –¬5Øl°ÃÀÊÀÞÀÅÀÏ Ì Ú Õ@c 5(5¨1h6è648jpÊàšÁƒûŸ|eðÁOl6û6ŸmÆ~•=½½†½‰½ƒmÏvf°åì(v<;•­a²«Ø ì6v/ûûûû:ûmö'ìïØ?r Ÿ7äN2|Åpšá†‹ Wn5Üihmèbh(1TF&fê  Û§ÛìÙ;cÖ¬ÙëEbyˆ¯·Ô|ÞÒ¥KÍÝäæ˜oð”øz™OÅ?Â<Dâ@Ï és+OOs©§¹—o€§ùú]–ö[wn6Ÿ¾y§ùfÏ Ï×sËP·_ws _wÏ ‰ç s/QˆyÀ؆¹»(ÈÃWê+ ’Ì1_+1w5—ˆ=Ý}ñEž2wO1s`¶¹Ø3$ÐW"Á¿Í}%æÞ!®AROs©ÈÜ7È= Ôƒ¹=Þï% ’š‹CDøx >‚‹²I¤÷_±ÔßÑræ±g”ú¸J™ûJ|ñas‘>ÓCäʼͣcRWß ‰¹ÔS&eîãæiîá+¸Êñ}qQâßÑG•øyÿr÷Ùæ!žÞ®!ž’Ñr™ZùåýÌ{kW±8@>z­hô¬G÷÷•J<¼æìô t •˜ÂÐ|§h©¹…ùOïÐ×_ù¥½þµÜ"bžØ38Ô5@èÊ<®wˆ§«Ô3dtçÏ©«Ø5DŠÛÅÃ×Ë+H$Ý Rxyã&öðuw Xë‚ õý´pw 9¸º‡J=mDÞ¢ Oÿ­"©«;~}©…»ßdì·Ã£½›Ûk5z¡•»§‡o@€«ëh‘[]Ýq™kǾ$í=sëØ-lp³x[=VÎÆÑÇX;vtýè©{Fwíý½ñÑÍÝûåÒ£çY~n»çú±K;Éú±ßîc§ŽÝkûc6ŒØå„±à*µy|c.ÛUºyô%wÝÉb¬âÆ6ü+Ës´,ÑO߱Þ^Âc´ €Ñk=ÇŒžéýX —6ö°íñÛã:vµëØVèØ—b´`Éè§âÑMƒÆö>VF(Ó A£7z|÷ãï2zUèØm¤£ç†Œ~Š?KúØå!ý]GD®ÅZy»ÝŽu ‘‡ýÎõbO‡]‚½,7†xïÞ$ñÙ³Yêkµ%ÔÏzk˜¿Í¶ðWÛí²@·½kÍt|k–ù¾Å³_qZòÆ«û—ÎyÍyÙ›S\–Ï}=bż©Ê•ó§©V-˜¹zጲÏNö7•~j ¹â‹3ƒ-•εUýýüÁöjúÂ᎚á‹G:k¼t´»Ý?ÖSÿÁñÞ†OOô5ÄÄ«„±‹Ø@,%毎„%±‘XF¼IL!v›ˆåÄ\âub±™˜GL%¬ˆ-Ä|baMl%Ó b±˜AØÛ‰EÄLb/aA¼EÌ"ìˆÄ:b11›°'vë‰%Ä+ÄDâ9baLñ,áB¤1D8@¸éD,!# 7"ƒˆ#äDáNdñ„‚D‘@Db“Љ„’&¼ˆl"‰P!„7‘C$‘„„ð!r‰"о ¢‰PÂH%ÔDáOÔDQJÜ#jˆ3D-ÑG4ùÄûÄMâqŒè&ˆ*¢œx›¸@&zˆF¢Œø€¸E\!޽D+QLÜ&.G -ÑDTï—ˆãD?ÑBÔwˆËD q€h# =qƒ8K ]DqŸ¸Jœ"‰vBG¼G\#N‰¢ˆ¨&î׉óÄq‚8Dœ$Þ%>d¢•Šy:+ƒ•ÉÊbiXÙ¬V.+•Ï*`²´¬"V1«„¥céY¥¬2V9«‚UɪbUc÷_˪cÕ³X¬&V3«…ÕÊjcµ³:X¬.V7«‡Õ‹B?k€5Èb`dbfaecg`dbfaecg]`]d]b]f]a]e]c]gÝ`ÝdÝbÝfÝa½Íz‡õ.ë=Ö]Ö=Ö}Ö ¬=psÛý¬e¬FCƒö3ìFö7†Ë û9s8Å\#n÷;r%ÙG- ž¡ž‰~ö¹gýž[ûÜ•ç×<sÜŽq7Ç{?ý´NMX5¡åÅ)/¿Ø`ô¼QÇsä=xiÎK—øÓùÝ×Lü›±…ñM“ZÓW'q'ͤŸtlÒÉI÷Ìž7Ûn–aÖ;yùä]“Ó&·¼<ùåÅ/W½ÜýòAàšpžPca~Çœ~eÝ«ÜW'½ºäÕôWO¼öúk_;?ÅhŠõ”‹¯?÷ºåëySSO-úý´Øé§‡Í˜4£kfôÌ£3še1ë«Ù†³¯¿a2ç¥9¯ÍišóÕ›sÞ¬š»tîóÎóšæ‡-Ø´àØ‚÷’ Í,Z³h×"ñ¢ûo¾•½ØfqÅâCKÞXrpÉÅ¥ã—v,›¼ÌbÙ¡å/-ïZ!^9qåü•WVY­ž²z÷êº5ÓÖ¬YóáÚ²uëŸYï²þî†Ò¯nÌÚd¶©nÓO›Ã7·nqßre«ÍÖ÷¶mÝöýöW¶§Y¼hѱcýŽ›;gî<¼kͮ˖‰»ÍwgìynO‰ÕD«fk/ëlfÚ$Ûî°ýhoúÞÓvNv‡ìãLŽ8.p<¹oʾöïÚÿù~äœâ<âò±k¶Û·oÜ-=O#ÏÏ»^3½¬¼‚½ ÷oo•ϳ¾F¾Å~†~:¿¯üeþ·ôûƒV‹Æ‰öˆŽŠóƒWׇì–L—œ–ZI? M {)¬+|~øY¨ì¶$a ¤P g<„‚îÒ§ô,ZDÛò‘™’ÛP‘˜Ÿ'œ‰j ³â  @ž)(ÑjºÓ(-rS‘U‰ÅÑÙ ÈE)&é±ÚÀû"o 4J©…"P*Sx“¦Î”i @IÃÃ%~ !]ŽÂ)‡…p=» !/·"ÝßhéIGXgï wÙEô«ü¬ôÜÔ<@Õä(„(•{¢Uv‰”úhI» e>h¡`9Ð[–ߨÁŠ€­BäI‹H…=s’‡–tȌʃ”“Ÿ9]ë Ø¾Yp‡ŒKsûF[Gà;Zª¯ÒœZ¸Å¦_…sù޽%{5wûÛüöÈ•wZ ¢½r…Y¡Ù¢y)0­*Ó•ÝØ¿ØÁ.ÜÛMhï,Ú VPhâ9ÝÛQTß"¨®ÐU× F›jØ·“ÅðL>Š‘q'Å)PF˃¼ L\Oì¼'ée¦@¯ÍnL­I5Ñ¡#2ò\R‰ò+$„,´ÐÍC6ó_IH´KÄMªÒ‘»3äÙ hµ•­}ð98ÝäsdÞèPâËÔ¶  Ñ‡hüæçè%a¤ˆ÷Ä,ô2âìß¼ÆÃ«¢#L(:qW÷çý§¯˜²‚"úY\Ú}~— ¿Tóá´ƒœ"Rž’ ’å›×'¤Ï’ iŽ õv…i™š²Õš£v¢¹¤gƒ8Ï?;9ÃìUôÒ…Ðàh›¾¿I¸„,C¥Ž–‡‡¨ƒµÄúmøä ^¿yhpŸ­A­n˜­gÁ> +¹"÷`Jq,uBTŒ½†ÂLÐt]_v¸Ó k ë=lmN3^ÿHqëêÛJ ÕA%‚¢à|u1 Êu%å-ÎU»vØŠ‚…ÁαÞ)Ë©¥þï¢ \°.:j=ãn ´äÒô辨ýª³¯³§¿ô86 £H>õž|h Œàc QËåÊå"¯3Éd 2ù ¹õ D0˜—D3ÖdÌ«2°ØºJÁ ø:ù(Væ/Ãw3U—Eéé9úÈ2#p.½lÌ› / üD8™ÍMNމKÁRÏ4¨Ó¢3)^qvhhF°ÙŠ=vë­Üï9 û5‡K@€©³¿ÈÎ7  L&«Œ)Ê–s»“ò“òcµ1YRàB¡·Hÿâõhñ4È…;?«ù¸gPÐ3xºú"8 eíÞu¢"qåNªœ ½9¡Üx™\Ô "]®Ù¯uÊÞŸzYÓËŒê5G-…6}á À}_lîh¦ 3 NäϤÆÃzõAúù#Ðì-îÁll½y—¦b󛂣׸˜ø˜8µ§µ‹cD"Å»—0 $¥&§'S¼K‡Ðaîâ:—ƒm‘ya! u(0õRVŸÂv’wïo\| ÜâÏi›õpÜ£ÓÞÂwù®gôí›Ö%žùi©9À´bÔž)I°^½‰ñj-¹536—©_Hòh;ÆK¥"Q™´¦¶¼¬¶FZ„}Þ!UK¨žF¾z£ÚûPõ7cÞdÚ {û0n¢4:Z«Ç‹Ù¯±ÐË+ÛßÌ8+ü‚|ä®`/XÞc -¯zt«ôÌ‰Ì j‹½ÓºùGàx{”[‡|8e\ž….5¿Pk†M|¢.—¤lëˆí0ƒä‡w¾}×ú2¹"|õ¸k8Léj;ÝÛ%ónÔûYbîŽÊ8Ø[u¬À£ØÐ">–¯àj^Þ- Ö¤õ2òV\^ôÏ>Jµ’¡u½Ž\“…Ñu…‚nð(Úû¤#LtõëRíh8q|ž^V¬*4:}nºËT‹dˆŸÀuŠÆÚ~擼Fy:)_ ì)EQ‚J- ˆ ”‡S—W ï ©*r ©P œ(”I®°»ÖÚ^T]-èîæ,!yÉCú–¼…¦¸•QPÓ°áh#÷F[ùShC;ñÒ-¥ž‘–rcd¦jÓ´©¹À´šþª‹Õ¸Z5Ã$‰oEG/aª©WG.ÍP`'Og&!”ÉË‘UÁ‡«8#§¸ñh§‚[Yå:hˆÍ3ö²c1-.‹däښȨÅIcaðÒôF-0õ}­°à.I ÉÈ{c¡'®l•ž^¡gÑÁŒò*¹ IZ5u²:Q=囼sâ “ Auò4Íé”Ù)ɶdºo |u˜¤Å§Ç¥Çfɳb³@Ðh[áKðºIíÅ,M]:5f4—hY7°fó1]p-R¹‘ŽÂ‘0,ö“’Ö3 RK†§º§aaÓl -HhŽv¥'¦%¥%¥'™f«ÓãA%)a–뜠s=€Þ€¶&µÕWΟî«Í6Õf¦a–­E.*n{J^"PØ•* ›ãMè%dbšgTPìîÓÀØQ•ÝCëX=€?õ°iHçóÁƒü¢wsqõ(eäíø¢P0 «YlÒã<#ÅŽÛÖ€ À¡BÜ/oˆkeâ‘k£~›p V¼ñÀë(tŽDkßY WAÖæ‹í‚Š®œ>p‹qiª6úÿÓ±à2ÜDõô\ËË{‡I-tÈÈwÇ®q'÷G…«â³+ãêæˆ"¬WÄ¡R±kgàqHœº _dÔ‡íu·—’lŠË  Œ—D‹ç¡“ÅPªè˜‚²7ÉÌVeaÇ”]_…C­8“Qt¡WF|0Հ̜¢ÏmRÒ•ž©Ç· Gí$ëÎ]6ŽùYܼÔüT7äªp@LU¤Enãh-i‘• ŽPôg¸5ö*<Õ›£¨c{ŽÓ&Fº÷àôw˜øwçy¾B• ÄlŠ+ìBlA&Ô*+B[\t–€zc­ƒ…T^^Qª/ËHÉLÑ“sR²†ªn(묲ì$ÑœŠXÏÐp•/ð£xv=Χz:Kžð öf–„uš5á—onÇЛ8VHˆ ‹’¨D1a€ò5u 3°£élãz¨Ñ}xœž5¼ƒÉ¸Ê¸G’J¢Dĉ£Ñ´¶ š?ö»[´¦@W˜ËdòR ™Œ€NF&ªºçÔ‘>-†ÐÇïäå ¤›Že ²éyÃÆüü”\ê’óc±$ •ZÛ¡h‘ t%¡¥•Áf~äÏ®+jH5Õ¢ùJ².97“+**4$ !>J®Ò›ˆºäM hêR1žÜ•9d(Ьß÷šb‚¸hi ›:Î/ÉT _×’¢¨Ì‚,¶@/¼_ø™għŃxS Kôc„†ÛŒ—².ß…Ìÿlý*¿ =›I„VåD8 Qƒ*¥U FUˆ–´MSæv 6“ -;W£©,ï.nTO™Ve8HŒŽÞÃxe©–Ü“ª,§)˜IÖu7–ôêX‰x‰y“`Olìî8|’HK§¦E–€vSèFÂg=N®Úm¼ÛF ?æ[mœHµÄ‚ºAÆ¥ÙÉ|£­•L¢n Ÿ;Ã:†À†o ¯ä'¤¹*űû"Mƒ™—•š4€êȉqŽ‘÷üÞ†& | ¾°ú³i;w{;„ l Ûû[ÞZ‰Æ#¶ãö¥{÷—W Æÿ¸a {?.a°ç ãHÀ؃°ø`µ½ˆ>1A&ð³ä̘²”tÓ˜ÒxÈ幇ìée䱔ܘ¦åKMÌQ3šB?W’8š¶*+ÔHǧ$ËÈ ZyëÐf¤‰çz9\8²œ£åÞƒ…¹5ûuóråRã|CÕŸmôï†iz¸»ÞÜ…ã®Ðã:Œyw‡7\ã¯ô±‹Ü‚åÛ*4N€ë>mùìØ áàà…êk€Âby"z͘f1skp¤¶^“š™š%<5œM\µgh§2ϘºŸ__[Û€ÕØò¦Y´; öôW÷6 x³Zƒ̾¾Ù—¢×àKhrFo¡7Ñ^d ¢éÐýòPAÏ—BÞ4´’^ʯIÖJ’=’–ÁûdÞA¡b@yI.jjÖ44ë+’G_+}ì ޾̆[é·ùÐŽ[2ÒÒ5mšÄh”aê„0`Š<¹ˆ…Ô)É $›&d$e7tÄEv éuh˜NÍÚ¹fe¸BS(ð/—æbó¤Š ñì—ܸ{µúÀ°¯·ô¸ ®Êú쇜{ö”£gK™;OѳàÆÓ6üTEZX|P¤¯iœ,9Ñ4áþçØ½´îD:‡ÅyZ«á,ì§8¯ŠBn¨h=æ†ÇÎ l>ƒoÈ®Ñk…¥Eõ9ÍL0{ èá¾ó,(:φi°D[¡‰ÏC1Þ…DP¼KÿtìÕTúažƒ%9”ý´‰s‘‹äÛ˜^¢X=}í:‹¶Áœár-Ñ´âØî‹%G€) ä"‡‘O9ç¸ÐgøU.'^ñÑ7íÆ<—÷Ð+ü ½§ÀIjȧ}¿Dê+à•ú—ËZ²4©©YžKš€T³ì¬øX‘——WbÌô •Ýp¿—æaך MÊj|ýÂ÷Is–æ­äìÊbRˆ0ѬäJ%e¡u åeuu’Ê@á/ Ín²›pC„@ïáÈ;ä>ÙX¤ðþ´ PEFÛax|¸¹ñ:]²¾‰cMØM“ü¯5w‹Ô»ëONC¬e[ænÓ}ÿ¦€÷!"–†lž4óÎfÈÏß:ÿí-ßA4î#| ÿÚÞ o`EmÛ¿Ûj»ãïŸ-ë:Þ/àݼşܻ¥Ž÷vž¹Øí¼ihÿOAB‰I h ía¦°Ûa.ߦœÁŽi6½&³àAz=_ÓQt3ç$¨5-“•H%2¹4B;£xžMŸøGÆÓ¾Ãõ¬Oà[Û.øêbÚq+ÍâìÂ_#,¦9¡º›6¬aOØ'Bùаàˆîâàw7OÁ šQpé›ðÄGÏÍŸŠÌÐø«Ë q¤«¨óÀ -Fls4;˜‚'à0„'ÆDLj$^‘Þ€Zíx>w¬èdi•°X_™W ¨÷{¡¸1Ò£qk¾ø ?0$8 ¨2¤¶¾ª²¶>¸*P8ꀡÝ8é܆ž?¬àOãêá$Î÷Gfrëà~Înn ÚÏA¦ÜúÑfãYkhÀ C“8ˆ²þë‡8ǹ0€'áãÌF=³Áâ"ÜÍgΛÄ-Åe2©³‡XÌ'h$ÉžqÑØ¼¦B6 N¦ý|þú™æìÀ$Ù‚ù1J\xöõïš ÷›^I'ñ!›ô­qÑ.Î¥ÎøZq¢¿`_q¸;pûŠ|:¼jEeÊ+îj&ßHµí—|O)ÑDîI¯®è»IÔ¦÷Éëùõù-µ5ºN0šb[¢ô!b=w™‚)ä]u¯kñ[Ú:‡¿ähx%èGšš.RÍèKþ§»KÅ`ØêíµRÉ€‹Þø|NÏílÎ<°ßþ`e×ìÙÛ\QÞT/Õ{ÇÇ¥¤Ä â’¶öTl|VvcMËáVæEÃÈ6ÂU…é¼åLçKMÝ'Ñ9Ó9ɯLÖúÎ>ÿLç6ú6Ÿ'~RË«ª†ªXà Xð.á[W…—Ïn+ODô @¬FôL¿U«óÉqpt·4?Ò)ÇQÐu.| ’‚ùw{y"OgóE‹œ€Ч²ïã°áz¤>®æ75@ŸÊŠºx=&9 ©’Ê–.ýÅê!sïpm[S½Y&HKÉJ(ŒÌO¨Å¶]:<]Ϻw ¿E«ø›JBë˜lü ¼'«Z£»¡×U÷F·o”Õ]*¡òÈ­)ÁñAò ¹Òì¡Ð&l”K·„_+‘€MÂ۪ȭF^#¯Ž?ŸÂ¸5ff£š•Y­hü—ƒf"g+9ë*¼¢g=¸Ï†=L¿Í–¹™Ÿ™—‘‘V¢)ÎÀ¡oiŽÒ_Èô8ûÅJ#b”1ª$WFÆÖjÉ©¹`€¢¿$±Ž<¸÷ ý^ƒøäâ8ïP 0æv¤WñQ@w(¡P ‹Øfû[V—ü8ß¿ØPY\S_Z^Ð ©+VC+mÞ¼È3Û¿zÀ3ô•vÀbÓÙçöüý“•çox‘ÛÎ 7; ŽuÕ]Qæ™ø»‡b³eöÖ;ê9QÙZ¸ªÏ¤¢SŸ?”ELÊãžQ·^j ¾©¯¯ÉÛÁÊÇe©³€§Û´Žq›­m´Üç.wÔF˳·ÎÖw¿3fߘiçÙTüóÛ°W¥OÁçÏÃIçYt==‘?’º•Nå¢I†c?˜ú»I—_gÁS÷Ù´¾ÌÌôÚ³k°X.\7|øiûMpÛô›e·^³Þêî%ð÷Uú+6”&˜t|ÕÒp PwíY¼ÒiÎâùB´ íæDÑ“˜.úÒw¬oÚÙ§7þ³ûýÅ÷jÒ0UÅpÕOä͸Þ1(}Œ¡4qxÿ’¼,¬¡†Îb]È ÙšpY0X2º½&4p“œŠ&ϧVeÕ–Ô–hÛ™~ ¥Ë%åJ·èåå* ¥£¢QIpÖ–Ô‡PªQóéL¨àœÇÂ_ëIz ²Áû¬j¡?>ikïx^5æ]‚oÀ÷ø'@yrEÌéÐö=‹÷l[+×Tx Kf`‰RæÓzùÖªÎ~agÕqpˆèª/“å;ë(Þ½Ký•­‡'½³ýè›öÎ oA XºK›hÒy­·ñ  Îõ:[x+½CB„"åf c4© 0 0 ×:{9mXè3mÔ*ñZg|ðz§cUèAÿü"“ågDÍâ’ Ñ7Á7àû‚w«Oל®k¹z¿lÜy> 7»5<ÊöPD€0–©È™ß/×ìN Ìiûa“ªöâüzP JŠc>ÜW׋­y}ißY\‚eìð[=ÜXÇÎýPÿ &Á%ü¼ Å­ý}G(,m,h -²EZîÓlYn¨77îXâ^Z_Q\\QŸ¯,F&ä€lª¡¯nðä€í§Hk‰µ@´]æ vHq6ÍÝÆè'ÿ ŸõSHeÐC¿<í,½Roo¯ºeÌû”€ü×éÝÎ\tad7g;lBËIÞßnÁå¸hËY>ŠãÂ8øçaíÁU÷Ùmh#ÿú@]Ukß•÷›G{XàK^_.xà6\¶·!*Âäm‹jŸš5[òVƒiàµÈ%â"‹@ïõ»G•tž>ö NÍüý#¼”¨”HeºW'jjÔ× 4Å^‰º"ˆëïKì„I<ÜÅ÷ ô/—ÔÕUTÖÕJ˜Œã?w,Oá;p×›ooÙ_°sÌMF¯!g í¶*{a‰OQx—çl$4äÞÔi¯¾È XÝÚB3ø*t>§<'Ê›z·6Êe;¿i[˜O!«eؘìvÓõ»Bšù¾g£Ž€(hõ.|é’9õ0]®pÙ°?D* •†V×”—UWKËEÌP”1¢B›vö±'põ‘c}Œ«c~ÆËþÄÙÌ”Ãþ¶ñ ™ ™¦Iiñ™±š˜ÓÀª šäLEiXI< ð‘•nµ>ÂÛœ¨2Qb¼I|ÜšÙ.;pÍ'd$fe¤¥ffŽíh½v†‰èb®m×ÓsêB°kÅ1¡§Ñ7ù>\g4ÃóÉD¦ªÌЄY¯ 3›b›ZwaIˆ6²5ÌÍ4iâB‡WW¡M.6k­…5Íuºê¦Ë‘Ù&{×x‡X¦S’ó7ØcR⡬Te‰®ªY\稢ùèk¾C¯¬\¥¾ønq~r\‰`üãâ[áVXÐØbplÔõ1oö𺄵Â2 lM“§R¼wÒ“€Êl Xlí°ÝÊ Óë ¢nñIË!û‹âë ”¦–§v¤L+Å׷ܸ‚#áÚÍö°HF’MœS¢rA+“¡€¼ôá9+¨RÆMòJPF+•aÞê€z Fsy¥9éG¸ÐTFäϧF^™Äß´ßòÜ#àM†v—°w©ÎÝhÏü×ß|Í>ÿ$¨@ljO€O½ÿ?ܪhQõ%‡°B˜Ú¨ÖC‡J£‹wᮻƼsõô"þEt“ ¶GGZ%c- Ö’V‘…àß½O~‘™d+DÅL&:fGÂÃÙÑà,µ$(åi‡(ÞìÄto_œsP’»š×Í=éõ™Å…Ýíu½ è"+|uâf C©¶¸¬Ë¾fÕêÝÁÞÂ@·h¯øåÔ&ÆùÆÖˆß+i½°¶ÚTÝ»‡ü’~†^äÆ^Lj-ÔÍN¶–(|R©¶Ùª:@Õ––Õ²êX‹ž[=½&I“e Í÷C‚«GÓÒ@âRâ“beQ©J@Ùx:yVK:›ËµýB^ؾ‹ªn³Ð[ÚÐZZQÖŠ©ôä´Ä„Ø„h5ví>J'à|²·UWÀñ©™ 9¥Æ¤Ž#Q6ŠäWÔªcc㣢#…¼j…**>ÜL¢Ð–U”4b~Ÿ¡8jdkpö56\€×Ü»ßZ~ÊòîûçÏÞ½³ëÈ[Â?þ@£Í«§Y~Y”0¢6¦´S½5µÝ úèœ&hÜÄÌ'[,G¾Íþý6VÝÎGôö9²¿×Z˜êËo® ôö òò ªki©«mŽÿQ‰<€q2ö_û„`ÞŸø‡ö!fZœt=¹ÚèÒ]h‰óeýÿ:ÏûãCT1ê8urPòÃüf–*ôQðh‰Þ'ƒ2b/“ùô×’6ê\pQ— i±)щQñ¦²UB Hête&ÅÛ—' Ê’˜íN‘G ‹Ú#qµ ?›ˆ,r¿+ê)Ë—x"]AL¹™d¤e2ݰËF€wq-;qGìq8È }T8^€â:8¡VRaÞ/…/ó† 8‡ï¸ÑC¼¸/½¢.¬=¡!åkŒdn4ä;žŠµ€(z¿/ÅKoô Ìw0›»ÉiGP±¬º¦HW›"L)æä‘€ô”ô„êúò.Pt1U¶23 Ešla²ÈÛÜÙÕ ì2Ý6°ÿâPSñыަ½MmaÇÌúAgQKCu…®¦úÅëF?äï,¯¯Ôê¥Pòmþ^^í'k*à¸Á;‡ù™T¶‡A¹WÚÂQ'ìßüv NºÁþj:_“ž“šLÛ´ê`q˜Â7,"=G$TÔF•'6Ó[ »ý«lÔñ)Éjaå9ŽCCV ûk«¡¢ª»‰+pwÅÑ«pOù-æÃ˜·ú}vØ–ïÌ· "f7@åx׉ˢ²ÂõúÜiˆ³ò€å…¦š‚ÚZa__íU,î Sò“J¢K’ªÀ!P_ØÚ="øiªI?÷Ôð›übyALa\©:#QˆÜ1u£¯´¦ëýž/Ö 2Óó²²3(ÞÉ{ðct•?kÎkæ+íºxÿ6c¯ûtïæ‹øÍU^v¯nºÙ_R×~¡éƒž~aA¡>§„q5Ì%¯¬8´ëÒÝ;.Éñ[+½÷>¼¤ópý‡ÂÒj}~9“tK‚Nƒ,˜nè@' ކJ:¸¸ã£Ø£cÁÄ{l¸nãï`Æá*·0=—I:r{ZD VÎ×àÚ´ö&©)äÀeh*÷hÑz©®ú@ž©í•’u¥Q2u‚"F!D†HŒž…Á±E EL˜¾$»ŸI„'ÊȾ¤âˆ#Ó?GkMÐw¸œ«QqV£uîä/}üLÖŸïÜgÞTŒ~:ƒç|YZSŠLõ‘ù¡Ê˜¹\€¦¡éDMüÍcXö  :¸Q¿ÿ>iøáì6Üûùªer‹µv;$6Àxx—K›}NHê“˧ßëP”„D($ª¬(­B˜¯ÊŒ±”ÿ¾@Ç]އ.ô©8"¨9«ÈJí1ëÉÁÚÊŸåàÃô¶26,B3øðÀç >ª¾Ty |Õœ¤MêŠÐÇé UVTRY©Ð…FÉbÃ…nŠˆDïp8³B7”­Ë,¹T…´L"‘†JÔ™ L ·Ë”¤Øú¦*2܊óå™Ñ84QȃEEÊšüÜôœ a‡¶8£)=uz¤u`@åæô<˜K¡T Ýt[=Œ«e ð«+lz=‹Œ¸øôúÔ¼¬3º³:}^^aV ò³â’’’â… 1I1 ž’—Dè+Kõ•mžuû\]¤žÁO+…cÄk”9WÀln²2zKJb¼U‚­©­Q#J¼Ç–Q1Yšô´Œ 0+/]r¨2Ua¨X& vo ê?ÒÞxµQP¹øí ¸#µ û˜;åç¹z<¿‚ÿÃ_iÃq&oæ ˆ'õuÂòÖ!N¹Ê–ƒÝõ£nψ,òñ~RƼ,=ÊGÙP¾Ž,Sc·F——”ÖW ¸žbàO¹4øuv6•jü ¼ <4 N——Äd*iXd”,"OY%„sfr~nåBzΨÐi6XhYˆ$ô—ËÜ`rÜ`²'7XQFsz꨽µâ|û”¾éÊt×¢pMøèÉŠààbyy^If¶NØY\’Ñ” lCÂíãd  ¦$e¡•ee¹ Åq:AøPb%8Ô’¢MìRèbKòU^\RYQ, Oˆ“ ]#”I¾Ià«Ü®úæÀÖè¾ÔÏ›’Š’:1õ ùÿG|²B‰á8:Æxz)Ì,…ê2˜^jE…KŽF4æýž/ò/ ]>px÷€½ 9áŪZPiÚÕT{ ©F%OJJJHDD©#@¢—W7èôG­»Ö-±²_o£|{«@ŠA(Þ[ì6¯ÜÇ/žu®ôÔ>ß@[/_üÚ™š,AQ¡¦Ra%â©4Àê¤óí÷¸y@V·æœ€7<æñëÁ!ÿ>§&_¦|ü¼<=ËOîø6E•ƒ:ª½¶¦]ðOÃêé­ô߃»±| $™~8\ãω&;å;•z ‹ÄÊ&ñ:dnÒÊ=_hŽ(OhÆÁï‹ï¡p@5 iFTDæ”Qþ»øµÖyÎ`;…(çMk|¥ùu!‚°¾øXÔqp‰ú¬ÿô•ú2upõ(º^ÅÀ¹1üß—‹ÆOAã¾åørá´œsšû3öLŸfôÆÃtø"<óÄD7$ÏÂ#gYÇ.Âþ‹ìPHð‡ì¿øªKÔÙLûA{A{ÍW3L†f}QÛ›ÛLÁ º1¨û‹¯LfÌò¨öÌw¦ÀO½?hÖ&öŽ_Íròަ`_¾W­+7Â:þs›—¾µm˲¥[/¾w÷ü…»L¬® ~¨IŒÀGÆ<Ùðrø:ßv‰#ð>zy]p_LkâûÔp“NÅÖJëEíŽåöÀø„»YÙu×ïöÀEáàä´¬¦xIÈôÞl8îbgõÅ6Ïns]‹ø´Ùm0ØyÔˆ+ìå_ë\‚fy½èy‹Í+ÜîÕ ëK˜ L·Üƒ&ðSß«î<¨¾F7+¡˜Ä:ág_ù£r|Ô Ñ_„Ë9;¸ˆi†&.÷-?“Ü~ø¥2™ŽIé>{þøyc^/Œ~‰ü§f8§Œ»:+jtÀÕ'$OöpȯW‡ŠH4m‡5š¸¬|O¿¿°QR{&™BÇ~« ç[iþ¢ÿb­RØ[[ZRPœÕ‘ŽµÐ–Ñ™¿ýv‡ ׆k‡ùÕF§îÂïïû ×öµ»|`5:5éuº<×ÔuðXÓÞ…ËݶŠ’cA ˆÎI(O¡x•$õlBf“Þ Ýï*‹Í.K$—%—Ë‹Ci°,LìÒxì›;÷!ëhè{“п&(og>~¯ë¯NúdëÉ×6ÛÛ ¼böƒÔè¬Y i¯cbb#úÕ¯y©ÃÇFÃá‘Sáä¹äÊ â“¢ã£QòˆÌÄogT´K<3Œ:’¼J] é’’´ ¬âxÇíšC&pšÍ[£T»âÉ&<¥ŒÖcÁñndŽ@­ænKLÂø:ÙªÕò¼ˆ e¦ÛX„œè•¨T+#Â|b,…ØPÁ-ËÎÖ Þç© \U0—9€Bøp¼ÊAWGÓ˜µGÕGŒxÑðȰ_á%J Ë’åHòMxkò¥!Y¡föÀÛ[¹ªåæÕkËA>(LÔÆ•G›ð¢Ã;µ‰•fG@m]éMÜ‚ßÒ{0¦ÖÑ^ü5–»Ö®>¹ëÆõS§®Þ²<¹j4ós? “‹oþº«¤Aªû­®(Ñý‰³ÇÃZZÐâ#pÆîä»W˜!òåôN>ŽïÕ€ŠNΪB’<ëÓ°q‡“ÈCQ¨*)Òæ¤1A€ %3%dPyåùeåJ± œë'–R¼œÈè˜ððIîu¢ÎºšÂºFA–~T5— 5åå2âƒØ¤¸Ø8ElTR$ ÂúŠªRíåJÆÓ=‡YyôW|xö0Só¿táþýÏwáÒI]0„_/¾º£Óó˜•iFB~d*ûŠ·«¾&e¤€øœòzmIkOmKe( 22âÃäa Ab¼X‡Ÿ4)Ù„É6Ä'RgùŸ-ðŸ¦kf~ oóÚsÈ÷‡8hù£1ýâŸgb†pŸ4—f“ðÍ9ƒ$zs>®|ÒÄN¦r3NÞÂЫžÍ­ Û ¶ß:Õ*ˆ›j§‘èD•>²~pôÈÿ;“÷}Xù‰Æ<ñÕ'Õë/É>žøŸëÿ ¹Áß¹?ã™ÿt‹NUuAŽ~§ÐÅG¾¼EO9¦k àîð•ìÔ‚½çp$e8tæÃ3-–9ÂâË\ IÐĤûzdûa a2zqßY Ç»]\.,¾ÉA‹èµ|d‡f£Y£af£ÙÐ ÿ™ gCkh…fÁ7ÑaŠ+oODæh1ZŠ&"š‹æ!c(€Kà h 'ÃEž4¾Žz‹dÈ_9q$åIGÖ1GxôÍð?˜ùŽQégŽÁõ7­ß‡/ó~vƒÓøÖ0o9#Çn™wù£#$zñáÇ1ƒ›9=ðÛ_’sè ~yz~Ze\QŒiµ²0Pnb±›,:£(T /Œb´n86ÙþõòƒýÞñÛƒÚv— ytO}qyͤ>ÇÖ];<Ä›½•ò†]A+0m*“z‡n”üª? ÖnåBáè÷?Œy_{Ý=ôuÕ]cÿWÞ«~gØsîï {ÞøhØ3ïYô€~ïçViQíGllž¯òOì*wÓ®µë8âv~þÍ)h2ýlœp¨·¤¹Uxä`Ógà p9âjÀ™Ð^y…ÝàÇ&~u³ííê|ò¶f™ºJÆ4©úýLѸíœVòï˜&#Òyój¯ŠÎP¡èPÄeþ:pæ²à±A¢àëåï}ùµã;Ƽú¿`œè¶ÇƉ¦üã8Ñm¿7N”÷Zø£5z FÂ,†»öŽÐÚC{ükÙ3¿ #þ…ÿàýŽŽœ}|7äÁeO‰ÿêùôjÚíi±é)xí<‹ÞvžMûàà<¬gú·q͇z#Þ¡ÿ©ø¶/·°X¾âÌöÛïœ=ýö;g– } Ø[îÚç°ÛjßЉýCÇ„ü­Óãnü¿æqç¢3pן¤ÿA…ßxš·´zsGÞ½¿` Þ„xèðT­ö_eÎƱ=fIƒÁ’ü|ÍŒLûSÔáMw€M4°{ĥˣ©¯{ £x†è~%©¨ß‘TþIRçaÀؤ‚º‰têù‘T.Á懓 ž‡ ™\ð3zmÿcè…+oü–Uøo@q1vŸ&XF±‹!ó@ó5Ìî1æ]ûËÌ›ŽîÓ·þ8Ò˜ìG}Ô=¾øIõwð"¹‘?¯bûGÖ?™óhýd»Ä™„w{øh* çòÂês³;><ûô¥P N%CþC£üAßÙÐ×ÿ`ÁC°ü¬?Ÿ°á „|…F“ 8ˆçÞ¿wêdy'4=cÛ½ÒÝ'J*„ÉÔ²§J•IÙ@uY+–U¾®¶ö6Âæ)Ìz´tÔhõ çþ]&Ì€nÿøègÎØþeœ¹Á˜ûß’ÿíU¨Ð7ŸÊ߇KT½Ë4ÔÃeªªÿ­eª6ýÆ2U £ËTñ&Ì~ðïšä_84ô0ÌÅŸ“³†§þÁ I;–«\wÓGÝ—>ňÿíÄ£¬0ú·÷º%wzˆ7û*åuÝúÂ&`ÚR&ðÝ$y¤•0ÁæaSrsìÃc& àž?ªÓ1ég;öWpÉmƒçÿè1KÙ;à`dëXc«2±aò:÷©+.$«“KR*.Ût¢?Áy ²§]F ˹)缫¡æ¢mü*¦ N9ýêLÿ‹ {ݼó4aùæhp8Ðã¢~¦Ã@ zÞ0æM„Fòy_§äh@¶ä€oúN¾#/1[óí÷—|+çþ±…åÐÖÐD¸\â5ÿ ¡äÓ†ÔF-zhÙêuš¯7ªøÚ~`̤×áØeú€+qw—:j¯ó1!<±`Äœ¡É2µUœ{‚3£œ‹ƒkëµUjj" "‡’s[ëìZ¤ÀÐUÓqšâíÛ‘V.0kå…ÝT6) ‹ŠS*T­ëcÒ·jȆχÏ1óåì!›M×C1«¾­$Ì„ƒ¿õ0²à‰Óç~^`ÆAÏúö_Ö2ôÔ¸ÿaž‘~WWhü 2|%øRÿ1¿gñ»é½ ¹0öéqÏÿmüî<-$ü?³ÈZ=ìþ´$ä!fØ¡w˜¹ý|§ôh ¨¢à¤*=kÍ‘’­d*+->TˆrI UÇ»$QhõKñ0¹ø‡«ñLüU·TõïtKåý^·Ô¦_º¥(´žöÚ뱯ÐÜ?½0jp½N‡Ü{_ÃÆ\ûoZ€éÓ íŸÈo³Ç’‰ ˜ä§þKy%ÞÜ‘UÐê‡æÿ·Äô¡—?i0ülíod6ìðÄü².Ü«7Ê[wêÓ–ÄÍû—ÄÝô󒸺?²$îyâóŽý›Œäú×ÿažyð“gÐIªz(ë<ƒVµLotéScÞB8ƒžôÿwwíAM]i\*¹¹UБÛÈŠ³„eÕºêh­îª»e¥­3¾»¸** EäiE´hx^ŒAyID6ò¨ÄKQÉd«b«ÅǰØÖ÷îèúZëwã vϽÉÔH„@wüÏî9ç÷ïu~ß÷‰äêôêÝ¥ÅW¿ªú]CŸ (Yš½>#8íS2 ì¢`“às">Tºm;DÇ˾ÀÇô´00`OÐHô6ý;D†£?‘>DØÁE"%–þÿ‹¡cS·‘¾ìÿ5ÅhÊÝwa0}…®ÿRõ5Y. òøÄ߃žHϽ.$8ÅGh‘’GgÐ;Ù –ކ<d›Á¯/¬ê/ „8ípÑ ¢‚Þ»%Û‹TÜA¦(ˆ¬šüü/i²#hoš^On†™ áŠ4šfÛ‚Ìœ)Ê$`"|+@!’Ÿ(MLL MÄ?ö綃t!­ÊÊ:&#£„h*ªÃ¹N€ì7Ê”â-YëH´CH{Çn_€ÍQ!ô•Çîam“{²aÊš67aäè&¶qrlã´+ÑP°Õ®=b³´Þ"ØGÔÓ‡%û6å|ž‘áE±0C {@@Œ.%è&´BB kˆàë¢Ãÿ#+á©@ÿÉ’æÎš` l9þ(†œ¡OÚ¤ g¨\‹oЬu˜‚˜U°H· ÿ™¸Øƒð¸ ª«mèÛ}à3,8ÕEÊtM>83½’–à-ž" w9íCûm ôñ ›G/ Ñ[×ÿðSCý±‹ÎÇ®ï‚Kg-FoÃx4vu¨4r‘3Ôê&‹¶ 1Þ~  Œ ¢É%A'¯Áàóÿ¹V^ªËiz'Ë¡>›¤xÂu7ŸàŠæžGc‰ê{Ê…h¨UÌ…Äl¶Óܹ0–ð™xz] @Åy´ï/ŽÆòá?ü +˜Ahó–`–£Ÿ°]¡)p¦Ãi˜ŒêðvÿÎØÎÁûÏg ¡­»Ñ'Œ=šöAÑòûÕùUgzïÅ´˜ù¹[ìíWú³WŸiÄ6HߣݑÒÖþ¢Û´SÄX ׺uzz½²%˜õ±ßW9RË-˜ˆ”Ä;Ìsx>5 -ƒ=fuµé1cu•9l2ÿ€fhîóŒ…%Ȝ՗6F°å¹÷–­_ý6ÿ8 CHÈöØk°ûÓáƒò¿íÜUæ¸>*Œåê&–ÖV:[NÊ;iŒ·€¹¶T¶O°ØN·Û9<¶cÛ°•¢;:ïnaËWšô¶UÚ1F¶Š1um)b{À³!oŒŠ>Äáb÷§’t#u­fS?w3Q8d˜ÊNÖêßk:îá7 yxã%P#Ê €¸óCs—Ÿ‰€ A$A %á‰xÓ#ùM—X¾ëË’ŽÛ.–&”$LávpüØ5GPš’'n!9kÑ_CÈ_U3.ÝQýuóPm>Ëð·e(Ak7ê7Õ½gÔQ[‡b¡À”‹Û_ô TbWÜ(|Vœ,ˆÚÏ~Ïå´±ÂR~*Ç(ot¤ê{r*å‚>IQâ‚^š¦ª ‚•§`säÉË,ygBž(éíV[s™UÍí¹¨“,l ÔlÈïìíBüP͉q_UHÛêÆhÕ¼ØêљӉÑpm9Ð&kTÌï±Dx½‘DŒëD"æéÙ¢R¤D…æY^ý}{tÔῪGì<»7J~îų–`Ð7ž½¢ob˜"ãÌt›Žz"°“ÉÔ ¯7A/Iñ…—¤xVL –â-L õT;wJË) I‡JN˜þÝ<‰íÑ÷³r¨¤ />6OAöÑ`UøF[cü’ö=è‚ VÉFyÖ®œoªv°‹•ö·jnrã±3úÙ¬§ÚÇY;$au'bÔëêvšM£Ui6h|ÈgE^ê’fAšWÎÛp>Í‹¾gŽv]:…} Nìñæ{?4wÁ&XÃo9‰U¿ì?‡†¬úíGcü¨$ðy1ÁL«k…ÊÆÆ¨ñ}h˜m¶-ô­l|tѺoÝ÷Ô;ðn“9Fm¢Ûj I€hŒÂÒtV-ìå)ì3Œ°”,ý±_(·¡oÁf¼…{Ø;Bo™<ÆIF0™üÏò™`×0Û‘}ìun"SpªuÔs—÷Y21‘r¿ýC·j•o«{­ÞSU|w´&,ê¼*K7äëг^1_yW.ÃJå÷ô®ìÂŒæ›è­¨ð뺉ÞANK@ðµy£¹ªÇùë žš‹¹/gÇ®BgÿuÑ =nõoµúp ‚ r ‹³ ŽkN”æ'_J6oîÊÍyÁú¶ÜœàÛ¡aÛÆNë¿Ä×;*‘¤š$Òxi‚”š,KÆv¹©‰iJßÓ5•E§Êœ·eFnÜÊ:ok£œƒ ûIM¥k‰S•Ê“ôWÝ = ˜xö*&ßÁ>ãW­§;L6ÑaÊ´l²Þ} Ž™5lÒ12TàãØ„½ŒM`WØ„5”Miý‹Yžó-½:rcZÂ%‡z¢¤ÆV³’íä°ÝCÀ!Wp3\’Í ÆSK„rÐÍÁÊt;»›{íì øö®‰ endstream endobj 129 0 obj 20198 endobj 16 0 obj <> endobj 15 0 obj <>stream xœÌ}xGúþʲ´›@±²ÁÆ 9„b:Bï½Ó‹mÜ-Ûr“-ɶÜd¹—qï].’‹Ü n`zo!„šJKBBH¿Ì:ãüþÿY8.9rw¹»'²´;;»;ßû~ßûM ‡0ægȉ¯X>u…ÔÇý9ƒ1ç0£Œ˜Ñ\´}ùKø/;x£ «RÞ+Œp(Q9š ošŒ¢Ž¾6Š¿ñÕQ¼Žá„¾,•SÍéæ0œ#žÑ0£‘F"£IF3æ-3Zcde´Íh‘£‘Ä(Ð(ÒeiŒªöí7:jtÊè}£›F·Œ>7úÚ裮w÷uîHî›Ü ÜYÜ¥ÜÕ\+î®×›«äª¸±\ÀÍäpµ\=·…ÛÅ=Â=ŽÀ½Âý€û9÷n¿±±ñcc3c ãñÆSŒç/2^g¼Éx»±£±±Ì8Ä8Ò8Î8˸ÌXoÜj¹sÛ'OY)õ‘I<<oÏŸ?ßÂ%ÄâÑ‹Ub¹ÄÃÏb<þ$ö‘úûŠýÓ,¶‹Å O±…»ÄGl±ró›õÖk-,×Zï´X+öËœ},¶ºøH\-¬$®b?¹x¢…»Tfá3øÃÂUêç&QH¤~òiËåÎr±«_$VºŠýÙS,üÅ2_‰\Ž¿[Hä2g?…ØÍB!µø¹úº±·ÇÇÝ¥~ ™Ÿ÷ÅgpU[¤r…ÜU&ñWXà;nYµfðžÎ ö¾r >m!uÇ%ݤ®ìÛ<9§p–øÉ-b¥‚½‹ØÂM"÷÷qÁ÷ÅUùË$†G”Kü<þz÷)2±‡³ÌÍG,7Ô˶Ê_ßÏâ©·vö÷÷ 1\+5”zr‰B.öqŸf-ñu ”[l“ú:ûYXKç[XYl»I}ÿþÄ_ÍõÏpu LÊ>°8 ÐÙGèëëÌ>­‡Lì¬Ë W‰}ÎþÎ26‹›ÄÝÝOª0÷‘†Šý<°…Ý$®Î>Ë]d¸Rç•«³Lêgëì¨ï”zHýÄÞëݤ gWüö +W)¾ÉàwÛ'G×>ut»áÂí®ø}|œ U®÷uvÅu.ü#tn›¡äúÁ[ìÄVñØþT=« ±|ðìJCÑm†Cֆ﫟ÜÜõѹ¿^jm(·Ãð¹zðž+/}ªÐާ¾»¼×ƧN¬2œØì臡èëã¨ØùôU¸ngÅZÃKn¼“Õ`à þð~ª.±¡.7çdð´øÉK¸*ò1\+<éc(éñT >O×6ø°O‘ q¼ÚyðWààŸPCÅrÃgè“›ú }ªŽ@Ö ~†û=}øéw–® ¼ÂPVfø”>]JñÔå²§¾K¯#"×jyˆŸëžM+B¥n6Ö+ýŶ›W¸oY-óغFî¹m­B²}] ×ŽõAÞ;7û8ïÚ¨ôuÙ½ìIvs&[ì;åMûySÇ8ÌŸö–ã‚écζèíñá‹gNˆX2ËRµtöÄŠ/Oõ6V~uzSÕƒ³šµßŸëkÕýå¡¶jæâ‘öšþwvÔþréXgº}¼K÷Dwýý“= 1•CØ›‰UÄ|bñaGl!V ˆéÄXb+±†XHÌ ÆÛˆµÄÛÄxb;±Ž˜IL vë‰Y„%±“Ø@Ì&&»ˆÄ;Ä$b7aEÌ!&{ˆMÄ b.1…°!¬‰•Ä<âMâ b±ˆA %8Äb”x…0"–fÄ0‚K,%F¯ÆÄ2œNðˆåÄ(â5‚Oì%F&IØBB@P„!"^'^" ‚&^&œˆT"š&|g"ˆ!”„/áB¤±DáG¸DJH 7"“ˆ'ÂBLd D8@¸ÙD"AÈ"‡H"T„œð$r‰d"’Pj"ð"Rˆ("ˆð&ôDQE”·ˆâ,QKôMD>q‡¸Nœ'ŽD=¡#*‰‰‹Ä¢‹h *ˆ»Ä â2q”è&Zˆâ&ñ.qŒ(" -ñq‰8AôÍDññQJ$Z‰BC\#Îû‰}Dq›xŸ8M Úˆ2ââ q†8D´ÅD5ñ)q•¸@ô'‰ÃÄ)âcâ…œËÓ8éœ N&'‹“ÍÉáärò8ùœN!§ˆSÌ)á”rÊ8N9§‚SÉ©âh9:ûk8µœ:ŽžSÏià4rš8ÍœN+§ÓÎéàìãtrº°:èáôröspú89‡8‡9G8G9Ç8Ç9'8'9§8§9g8g9ç8ç989ïr.qÞã\æ¼Ï¹Â¹Ê¹Æ¹Î¹Á¹Éù€ó!ç#ÎÇœO8Ÿrnqnsaéͽ‹8ȱâ1nÔÆqk¸ŸáÀ¯ã™ó”¼¯ù2þû¤))%?¦ÖPu/~)ï¥^n2wHÅÐ7‡f¿bñJå+·‡ÍváÕÕ¯Ö 1Üyxñpøšâµ»&ËLN˜0‚TÁg¯Ëéáô‘7F½Q=ÂoÄYÓjÓKf«Ì$f>fÑfõfGÎé2ò¡9ÏÜÚ<Àüþ(ãQÞ£ÂGµŽ:=Úntáè_„{DKEQŸ…±Åu‹oRoú¾Y;†c9¦bÌ—oÍz«ñ-8v騤q&ã&+÷éxÿ s'xM€–Y÷NÌ™xq’p’~ÒñÉêÉ'§ÜòÃÔ˜©SNóœ>|zÑô;3,g¬{åLzfÒ̪™‡gÞœµuÖ÷³‰Ù£f—Ï>óÎÖ9&sç„ÏùznàÜ„¹gæí™wt3?`~ï÷…¯-<ºð“E‹~^Ü·ø«%+–œZrkiâ²ÕË_[^¶ü‡+g¯ì^e¾J·zúêè5Fk®ù¿µk?Zç¶îÊú„õ]ÞØµñG¬¬j7ÍßÔf½ÂúþæÄÍßoñÞÊÙºõá¶Âí‚í{¶×î°Ýqv§óNÍ.á.ŸÝ£v'ï±°ñ¶5µí±Ûh÷™ÝÏ{ý÷~`ßí°Êá¡c‰#tJuºíœè2Ëe¯K¥Ëy—‡®¾®u®×\ÿâ–.ŽrÙÝËc¨‡Çž+<ÿŸ¤Ý+ËÛÆ[ë3ÚçCßh߯ý²¤nÒý“LÈfˎɧÊT¸+NZÞ ’ý¼;øWå©«ë¡aadØð±á™Ã#N«–ª¾ŽœY¡ž¨VßÚ½&º#fmLt,/¶.N÷Sü¦øû ‹Î%Æ% “ôÉ»“¿nàJÊš”žÔÙ©Mi+ÓŠaÚ°þé@+Ó÷Z“Ûpο ¦ýø^‹ƒ}<½]Ü·‡,”µ² SÄøàZaÁtJ‹¾—‘ï&”†=Ô€’d€=*õŠhJ°EÆ\#‡õ»-\Öå¸]Ãé_­¥øn ¬Ü¾ŒäL¥©”dÝâi‘ávÑf2è¨%·¤+ò€dk˵™Â@~ãâ|‚TQžIñ@•‘DÉà r ªé/aÂw(7ŒIDÎǙۀC¸Œ‚q¦Ñd9¿3)?È:):Z¶í0] 7d›ÂümjqŠiJ““•‰™‰™Ñi {b‰3Šö›†ì µ ðV³è˜ìœš’&JÉHÉéT­\#q÷Û·{o¬Í//–WjÚ›¾„™7MKöåæêÓ¨aÌaPŘ\ô¨29 EPE#ÝГ}¨ír~WlNp¦P/ œc¢¢)9Œ«"Ý3"‹@ 5$HÏÊÍÍ¡7*+ªò+Í›Jü·‹P< ÜUa’\8²ŠtK‹Êû(˜NÞÞutþf{éwá0fKÄEÆL[àM.3rhwç€@ÍÞqŽú¡þì¡â¢u¦(#7€sŠm©¢PûtUmgÖퟅFMxEÂÏ,áðÇôWOˆXËiú‡c›­êŸG£4?'9¤%·'åGã& RíÝ¥ð–yN‚“LUš¤ Êó³›Sñ—” ŒoddsbA”ÞÚ¢.S´øºËU6qØÎiZÒ:38hA…¦þê·­M¿Csò•9ØVf 44Ú3)¨“UÉØÐ÷µ¤$%¼Àî}´6›~¹wáP]ÙÕ,³a¿¬Ú~¾–óù>¦Nçö/`þBd’`{Dä²X|å--¹87*\¦k¼_Tt%?U‰öø ½ŒeÊøWâŠU`75 %ÁfUäâ|JKÎÏT–«ãEÂŒÏyÕüAjÔ3¿ÔÉ´&wál8ÎGB¸l„`R1nA‘Œ¼”Pöˆ`OxäŠJà%ƒ×H¸_ƒ¼ne‡§^äY')Z]D | ÕØÙq}äÓŽ£…Bkt›®ã ¼~èÛ‰Œ&¹Ø,p -é1)ÆÍEmBÏ{õNSÇxIÑ«‰"lePÏLÕp˜yp6-åG{Ç„„y;z©ÊØ <ÝIÆ¢1<_û•®Z$#Õ€¥©Œ˜&zf1‹‘ ðm8 Ó_ ,Ç Qè­¯ÆÂ~ð#†¬Åä-Jñ¡O”í@óдàÝ[·„ãáªÒCgðCŽ8Xɼ| ®­2ÐÎe!¿PÑ=ÚŒ3Yg²M+Iû4UF)ó>ò–“ãsb=…6’N=¾Åö€BFó-Ð8‘ ºnùÓá†â¾^aâ)ÄE…Fª‚Aê@@í’‚HWŸ<Ñ —‹  ÔöÑp`1œÃíßÌ"Ó_Æ¿_ü€2ÂS悸h“) ÓÓâs0‹Ð&ä<ª¢(»C¨MáiÑ]Ù˜¤Sj$p#ºeŠ&`…Z=Ÿµû·ØîÙQ¹ØîЊ„ÛṢʲ¼Æ 3|×M 5“»]ÌÊ®% eoí!ãk@IøþmÔ€ ¶…G`¿'ƒÁZrINH »ñ¤ ›Ù>ÐÁ«anóÁñ‚‚ó¹Þ2òjlYXE¡¬‡Tîï©›d5·œBoÙä-·UúEzÅIÁz`ÕäwÈïpÄûà[ ºžƒFphogˆ¸SØéVéÕ´”ÒB•??ÂS­V‚hž˜»¥Ê.Ï·®šˆ¦!'ä' ñÐõòÉ’–£¢úŠ MwëŸsyP•:«Ž2/Ç~ê6úh9B°ö)?•Ëú©$¸ÄDÛa<¿%‡:RP\NZ§…jÀE ¾Iîß«Su ø#†hÙWˆ»ÅC±ÕG$0Oµ§AVNq~¦¢2¿P‡ª6£h¸tË6/¿ÊÖpÊïÃÍ-p¶žÃŒ‡¯Ñ®¶>!N8*ù•5…ÔÇ4$\¢`?îÓð^ïV¯6{ÍüZ¯ÍµDãÑø'Ãᨿ^„ŠàR: -m?j@YX¶O†2Ušº‡ 'YÎ6õce×? ÆÑ|ÿ© ×½^ùüðÉ€ZÎg^íçñŠÊÉ ä«á.=´LÊOiLiI0ù•gÆÜÀ•”)úM ö?c1£û×ÒHŒ›×¹!Wܼ +þËüé„&ÂÉÈ^”ìEC£sè\Äy2B$"7aã9@Ÿ³‚/ "YÖÄü؈ýÉ'¸ésኂ”¯?§£,xkv2x‰„>p,Ž®ÐYÀ×P˜à FÉÈsqeá˜MØÌ©¤+5ùmïôZÓ(¬ÞU¸ÌS‚ßñvØÛ)6ÊAUÐ-2¼J®… Ž0ãê1cÇã;bÆZÁ¯&Ñ`SLô†HJp@5U¤}Nth§˜/ÂÉÅÛ÷túÚ3ôÆô1ø}G_Ÿ 9½MÅí¢cÆQî²  6ùœÇNüþ½³íÕÞv¢að6Ž|£» žsЏ—™wht›NêHûx»ôUäêÔÈ|pž‚ït͆ÃÈ£EM¥y±‘ ‰±qQÂèð5ˆ¢|tòÆ­¶åä–Ž¹ëvËý…ž±.àj›#–hÂíö)~‹¬Þ‹à1š§4¦u•~¤ï: nPšrûVt/è–‘ïņÕÔ›TÁ{ãAT’šÕw´ä¢\üÊW(Á&¸²$¿á“GDXEŠBy°Wì*@=F l4x,,™Ï°¸Êüçß¡^Ž™â)c>&Û¡OÊ÷Y,õð³wß¶PYñãIÈnùˆ¢tðó~8â»y "…‚ádkAÎ!8÷€™i…Z>ë·«b4&GXƒ]‚~,;·bi—§®á¥vŒÁ[VEZ§G€3ÜJªélÈΉ Ë–ùEëÕ¢«i ftKöÚˆý×í²šÉ¥ƒCïTCŸÃÑzpw M¡¹û#&ÄŒ¡£7HÁWD±£4ÓÕ ™»~ФÀ«R*ª—©zƒù»ŠÁnàRrNA ¾V[E{É\Fn½&&pÁÝCßÜØÔ3N¸¿08«¦®¦¢]ÔÜ ´™3Á{D·®²ãðHÐY'­¡– ì¢WÔGt¡^ö;,gÙWv•gåÕTŠ“‰{L4Ý[&ž6Mé±×.¤ùþ—e-½˜@ehUoÍ_‰Ùï‡^¢½£Ã•`/p(•4*Ë¢ŠBZ>Ò5i:{NŸo¸ ¾¦ ²„‘ vŒ“Ðä6C?÷ÄFa‡}}ðui¹c¾²Rqlû§ÞwÁiЙ}­šBßô·ÓÐøŠyì2ÈcÊr t?_‚|Ñ }‚‹-̇,.Îñ-\„³Úâ .dp@KNOÉG)A~ŸÔâ^ˆA …ŸËø!ˆïé9°li)È=øÅÉPO½°B–ç_hEUa(˜E42ó8©ßBá.¼? á¸@2.<.>Ĩ԰ ¯îÊò‚ÅaAÀLª.iÁ#_’àÞàJ®Áé&]p:؟܇n¬?ÁìŠÎ‰Æ4ø“Ø{56KLé™YZ)Áw«™Ÿi'OOg‡¯®®Æ†®NI“Vp›ŒÔ+5&9˜qpÈÁPÑEUéç³ÎdaU옊]t'½œìKÈNjÆBÑË+H-5w ×Á/Ð9Ù“Í&Š䬾ݟj*î;!Ä @Žzæ/3ÂùØŽcíXÀÚÑAÎ?8X#¤»Â^JUVnFZVf®0·8=äRuþUÞî2™Ç–._:\} FXVŸÝ Nb/ë_M;I°‰ë½º;›;;=Y³‘Ï ¸e¸ a&|‰ËÕêwØüª_KÎÎTç‚ëSEÂWÙ— !T-? Úó¾æ'"{^-¿9Ô‡§cÿa6˜®Ýg+â= MH„!OûAK.ÍP‚CC*/¾š†›ûù~|y8Ž«lÖ¢aÖâœ'ä7y}BXlÈJ´ÁttŒ-KÊ™f (7K›š ²S²S¨§rûÔ”Þ Å.8·?`ªãÃÙŒEYWv¶>ÍÌàÕú©*–\&—­ßKÁÏKÊMNK®JÌ‹*¢V£×Ñë¦ÌJ´YN6&†±Á×¹…‡x%2eoV|&è¥ Ÿ¬¬ú ,‘eE‚3'MÆ%TU¤ħEç£]°ÜôÛŸt¥g1£±ö?ÐÏÑr>†³àµ.n?—9Kƒ“…ÅçØ4Á_FތӃlš€,·¯ACÆ9œ„£„ð Ú3+Š ó±Q÷§â¢ŸcÐÆæ«°·CøÜÄrÛÓŽû=Ï…\WÁ{-Ý­ºëà>ÛŽ“ú´Ø…Q˜®˜#™c4x¿°è‹ïŸdäG‰šìÊ“›”2ÿ‚²ì´Ìœ|a~QZ6(¢Ú%Mnî^±KC›B¨‹hnÇ”´¸z¾Å ÚA#õïfÑ\ÎoIÈ‹ ©r÷Yî)‰êH̺|)¶ä€âÜŒÖ4l"•œlKHI.[Ÿ©4]‹–ÊÏE—Ç–ÅšIßS׃\,»&“ÉI]|z\õzh9ð²i¾Ï~Îò*ùp:3®¸%;[‡35ÖDZÖ<ȺH68m“ó›‹C€»Á`î¡Á’GóJ +ÃB÷¸Eñ0(D£áh¬³ßstTTbbbr<Î!csŠE°ütéa4 ñ–îYæR%ëh¯©j,Œ+ˆ,Fç&bìQå5ÅMBÁý:kÑ  ñ° v—9ùb™ìDY÷:œ;Þ£é;*ÌÛS¡<:¾¸µ³í>NûûGÊåTÝ~bß¾ËE†Œ³ nÌ­ì;HdüËñE±À„%F†:!úØa(»òA‘¨,ÊkMÍ)El·Ë=Ù›£Ýs˜Vó¡’ù´êLaÁ¡,3ƒ_d9x‡MŸsµ´,E¡*B'˜a¦p ÜÕ¬ý:×°OF–$&g$7'Ä€`ããƒ|‘Ÿ)ô"Áå¢â«ƒ »”PúXàì \3èyU¸‡¬Ö (¸LžÍöë¨"â½Ø<ÁöëÜc{#€†™y­¬¢Ã2bÓcó°:Sš~MÊ*5yú ³*´HNæ$g'§Êäì8£B¥ÞqqáÊ𠸬„ÌÄtï}&ù…™ ¯KÈŒ×øÂב©Ÿ»¿WtÄöåÁ¡îIØê‹±ÎHÈE H·¯µ'5-+;+§Ì¯D–]é•«‘,]}Ø’q8ï»ú¸ïè +tç ëãü8./òqÄT*ðX6bªÙˆÉjžÌⲂ\JðQqyIV‰y[‘b³Aõ¸¨U.Á3 ¤ÁÂláŠ\P­Eò-†¢ÎêH1[4ºŠtKUç³ac°Ëo›X±q·Ð÷¬g•°öþâͬ>‹¨gÆaõûÄsÙî>»X}†£»+5ðc>ùÁ±—æ°>`Íîÿ'Bá’ˆkçêæ.Úf\Ò©)nÔý:œª }7ltö×ï û%<\ì×À]Î/¶Ê 2þ‘Ä¢(àTIáñÈ=0E¼UŸPrÌ@UQNWZ*–˜™,"ÏËÈŽ$Mtž¼i²)zFC"¾8)›-Y›ŸsˆíEî•‘ûâr£Kl¡çÀ7¦5|hÍÀ¥< à½Ì7í•å Ø]ÿ2GÙ©^˜­Öm&à 8äójïÁ\æ Æì ÏõŽÀIéíµ{‡÷"°œÚÐas¸sMææ§Y-¾}æßß|h—àÌ}Ú†ÜÑB4Ù£=pš %Wö|-R5Íw·‰\‡“ß•h8WÀmp(ÎŽÀÐ ½ŠÆ¾¹Ér½LU¢ÏLÉJÉ]€¼U|Á„UžtmR‘<É-É!Ô:È%ÐÉWæ (EÃá#¥5 mëubN3±PÀ?Þä‰L õüN(àañ: =ü*¶#®+Âìžôð6°žÚîè¸]áŸ_ç*tª÷-ÀõÈ)*X˜ Â(I™¢¶¶¢²6?1G]. nO(ŠïÎÊ0­ ÏŽÕHëm‹UÕ€ª)¯¨iPîL9¤‡§{”°MlèOÅ2üG.<‚(z!ß%:·SÔoBžÈË?&<Û€T¿¾ U8]JTUÃÿ놀˜ 1…Ëxõ¯¢‘™rSàÒÝÈxÉd …–xÐÿü8 ¾²â&â{&¨|…-pÂ'ÁñuŠBmôÅÊhz9Ò×V’[% mˆºîƒ3™Ç³2²3 Ó nù‹@·ÞÅùá].}4r›…SNñ](ƇÏâƒi8L)5ý3±<”ô|ÙoË›Æt‡Åp4‡ `sÈÙ|G$ãiùeçªÊâ8ëÊG{šy_±5ÄiBà,H½;Bàt­£!u±ï¸M]réÝlãåe#”Û×ywfd‚”L¡À)s1Õ¤çvÚÇ¨ÞææÞcõ‹÷Æ(¼q žˆá9+ª¼±Xçå²ÓÚãð½£yúö“¬Š†K!…‘À…íl—€(˜€ñ:‹KºNÈ=*¨Vi­»8@ꔿ±|ž056]™HÁ#oè¡YÁù¿9oU>W˜›œ„‘p³,®hÛAJ³¥ð¥l}lÇÓk}ö“îH´!á'ÀÅœgc^2¶‹l›Ý÷÷¶¶âc­øaŸèhÿZúm>RÿjËûÌÀ¢¯î»¸Ì2&†o’{k$y‹ ¨ë;“öñq>¡;¼}vá°9³o ¹ŽBéäòB×noH¥š¢äÇ’ª¸3‰”åÑoÈ‹ÚJêõ õ%ÝàØÞPëÙî«™ÔGAoòrX«cí Qý¡CA(Ø ¶øzYERÛ™Eôær¿Ðöëtg‹YŠ@+üؽ˅j¶ÿ˜Zg³¼C­éØ{ª¯¡¡¯Ç·Þ)>$Ç ““@ Ô19ùmû®b¹j`;´„‹1uïœ_÷í38T!$FçVÆä›góóSyÏ,~nv”ÚÍÀúý/Óÿ¿oH Äš~³ŒÂ™ØÎäÂ4ì&7€õŽ.+½wNó(äò%6¢¤`Á`÷N‚“-|wÀ[bGû«ýÂ"€²Qž„–"BÂÉe'öÐlB„X;DôÀ¢åA(imÒÄiL˜éð%¸£a„ «?•¡h„a†£WçÞñaW¦A/:r¬ñSp“zϾ{µP¿‡®«ðqqU9ImD¾;<ýÜåªiîhü¼á€HÛ\Q¬ÔF†¤ÅüxŸè³Ü߸€ LŸ J`Wæ¯È–™# ¡¡èõ…‡·_?uX¢]´ïLñ±”{å ùÉ… ´åì+EßýJ˜å Ö¶ô ètœþåÄåĦ$g&•Gg«@ ° Üà±ËÏÙ_é |ApUj}ZOæCåzmy1Ð…he~ÿgùœŸâBZBÛ|¯êÀº€®¨‡ÉT>¹¨Ø_e¸”ŸÊuS5_jªtàSÃïë:ý‡%¸ÈÌd×Xï IP˜;ØA¡µ$X(Ÿt+¨BV±¡% åæHú9@cßÿñð× $çÍ5(é*F§»‡Ùð ´äÂ÷Ø@—8¼2'-;--µ:W›U(m^à^ÑM‚ùÁ¡–8/e†T‘3RC‹À йÈjÞ0ò:óeš(›iìw9Ðe„@Å\eæÒròdlV<ð®!^[W¢ÉÐËô/m=]à,uuýþñhè2ëIŽùÞík„hÌêV`*5öƒÐøêÝé…‚²õ§š›ëAkAUiqAA±¶£Xgœêª–31•mÿèõ¼âêÎê.ÓÒÚü¬Nœö‘Õ€2£¯!ã ïzg7©L€›_R,Ó9uû‡@K™öh=‡}IïºÔ :¨&Myýέë\‚6¡ØÓûz p—{AIßí·Å˜¹øó]HÝå0Ì[ô@Ê,&…(ãÁ/lSB3fäs`3ÅedЃ–óýVFÆšÌÇ>}Úך.‚ëf?/¹Ž»`O¡›[°DºŒªáëÏ´Ô] AYá‘”-Ű£r‡·ížÅžÎh<šA)˜Ù¬Ãcjá,àܯ!ó[*ÛÚÕútgd°±;-Gn@åeGEŠ=—ãÐýhÁ@›íFƒ¥> C©Hò^J{V}ycyq Û»Œñs¹¢êVùœòÀ*¶¿ÿ>Ö,)÷.wËz;ÿ ¬Ú,£Fàܪ€/ƒ§Ëü1Õ¦¤™ (ç}ІÿL&-ÀÿXçÑǼû‘ ÔÀñË „àÖ FC·žn¨<¨³m®Vë==§øŠBÉOüB›%”à’Þ¯ÔÁnäJ±ýf¹2¯ÞKèÖæ[ŒE±Ø_.ÙyÚã ¸šb=>¾'¼Ó¯ITšïZJ nk+«=9ò¶õÁq–ËlÆî`cvÿVËñ¸ðdÿz“—4ÈÍeÎt{4 ÌÐÎÜ¿´ge§ëÃ-T ¹­Y¦ êö=ñ€£~Wsª¼«JwŠMøKàÊ»ÁwMjfþåÏzŠx§¶ìpìèönØ9Ÿ£¢ÀVe¹];5ðÒ€7z:~;Àïq¼“-²MB­ÙiRÈÕ ÊÊMwNb‰ ú§Ñ^¾¾^î5~M-µ5M;ulë?f/tÀýèc0ÊüC„‡·?8ACG8—N"¸ 9%1-!Í,2/*#PqñqÑÁÕN7‹ ÂóÊÕÑ‘‰ [WyîATlzBvvVZa1;Øqq³†Y®—j°ss„À”YÎÜ¢]q’ñ*Ö ™òðÔ sdfiÞZ]a½ÏITRÕ¶3mç÷B3ž 6¾,?©Ì¼ ´ä6–UiÊ÷…”šJ\¤áN@sý«?†¡¦ù…q¥€j«Öµ¶(««DhºAöDï'¨ï.Ô–†È…‰$ÖñõþMÌMr¶ïm l€ÓG|~‘`wëÏ÷Zäëáçìe¾P["rÚD0üK\wBUÂÏü$ ±H¤`*©)ÈÜwù´:¤VØPì]¸ˆÒAûüx¾ $cÚ®4•9rD"4¹!ã}¯lu¸!¿ AÛ_&°J­lJ9`άÀÅ< ' &$x……Ê£Á:àZî¿_¾/ìsð9ýÏBc8¬¹:*¸PX”V²¸þÒÜ3*__‰g­oSó T.d‡Ž0Ðy‡þ‘¯ËŽ ¡£$pU«<Ö¥ªŠØ9£Èщž€z“~Jo*ª.¨¨Ìk”৺ªÈðääÄäDQ¼:I ")o]`kkµ¶éøÚ&d´b{ˆ‡»ÐÕ5|oÒLj›ãqt›œ¢Ô{ãpõ ¸ú uh3ôÌBôZÝw=pìyØXgêA“oáë#‘ÌëÌK4âó•·‚!—ÍÂ*µ 5ÅáRŒ¬$Ç$±Î¿˜íÓÕt]ÚÚ5ÍÆQ¥ðÙyúmoš,ÏšZ¸á!¿ibzXª{p†*5Pkܽ7ï¬÷9ÖÝXÖÙ äÛ©‰è4oõ%åúr}n[Ö”‚¾Sº øÿL§ââžtØÊ“ “Ë(Èá <0Êdt„mP0–¨^ Mm}…¦±º4F^)ü 󦦕sÀ×ß<äÂùX͵Ú4wÞ™MŸÜ9sêö'Vg抂Œ[ò}&ÌTùº{¨êï}_ßÊRŸiÜ_ÚÏì'.즷ÚÚnßÜkwòäþÞ“'ìl%ÛÑõÕRoÿ/Ÿ]½¾ºFÏöØ©ØX¹Îü÷œ$Þ~ã…Ž=‰MçøãÁßïØÉ÷Hà¡•&Æ$›°™"K,ÍfÌ_”ä^ß•.Ù;Ùz°;X"ööP9$Îx¾Åá= »h$<Ãÿ¾¼á¢®8F•—+ŒS'Å€X–žŸ€)·0RÓo‰ƒ–·ãÀ¦_·ðNð™ý[xìÄÙ­ï±sŠfÔûb¼À±Ø¥ôφ¯ÓnvžJ[@-€¤¨f‘àL|]h“ïië–å`7‡»{P‚œ±¸p½ù˜%»VºUËöµW–7—%䨊Dѹ‰ ‹ÒTµ«Pl.$íìê­póñŽÔêñó'«ffò«6µ¶¾gþ8Zò3JÐ0ð¦7-—…Çâ É=XÛ{Fßp·7a _.m?Ô[ì=MèÅJBä×q£ƒÍîs!5™Î‹ÉKËNÉfµ%Aá¡i9 Q\j˜{³ª:¾˜}Ø×x´ËK·C“œ)ª9Çsæc»‡ÔÀÎu ×—µ›€p¥®î!\­=ó®ÒŽ,½Å\êßEÛñ÷l´õ_<€2KZP®ÌÔ˜éoÁ¡­WZZŠkjDµ7Á%Ÿœ—¤ÑF&–ƒvИßV7`úë[¦ûùï÷O¦3@zRnl^lZrV¢.*3 H( ëñ½B«ºïœtG¢PpêVÿ t„~ó퉈?§oçÖæ¢j¨«§æ xºæÖ½QXæE7j=ím‚Öú9‹^²0?6Å«ì>Xý‰¾GTVSVX¨×è±Ó& Î;}Ûo´5±ut÷ê¸êÖ½A¨¬cOк¿ÖáZÙÓWý1®CSk¨;¸þ3¬2~›IüÌ4i¡¨ïf¼ˆÁ” ßà2»`7݇¸$ « ªJrÓÌtÈ9€<—X¼Adbd¼ A¡¦áµáõáÕ‘Uf»¾SôbP^’y*•Ò¡#dGbeD™|e›ZÚÀáü¼ Þ6dnÍmI°64|;äù©–œ—VÞ¥@ó>d~‘LÏã=¡g§Wp_l`ží9a´ô1>s·^“ *ÍtÊR?eh´2Tx½ýœ3lŒ}3gèQ˜è§}Éö˜Kƒ1Vn3¶ûº€5Ô„×áóÁ©O»üêÝIJqpFd‰R˜¯J‹Q”\æ±ËgÿLJrÎ «z²«@5Ȉ)H.4\ ‡‰´»Aöô´µuïwo1ô6ºØ ÑH:ŽMý¤r«OšTO HMJKH÷Ú|!õtkRvb»RQ˜P (}™¦¾!¸Ü'"2!2@äï§VõÖ¤çƒbª)Hãé¨pO‹ÉVº`×¾Ñ#=2M\&+T¥‡c4(•oM`]InZVÔ¢ÉMÛ—ž8/Næí£Ž !5.-V·¡tRê‚ 4Ö”m¢éu?iaT×qÀgðý{Ü«ŒK7¾j`RÒÚw`¦Vgg§¥¦edвsÓ²@U¨ññ THìš}ÿåò]¸ V˜Ý“ZYƒpŽÚƒ†}ÆÿºâÀ¾ü¼Ø˜¤¤„ÄxaLd|PS2mPM]Uuc¯‹Þz—C “—Pâ¼#t<…†òŸ jÞ3 j2cé¯?äõ‘“ò`Ú&' o¢ræJž yï} ~æH'ö0Ë/qÀ§\8³žNˆKJЉr±Qá|šÚÛ-9Ý·¿¶G+ ,ŒOJNŽI0 ŽR'âfs ¬ì(H/Ë®¥å¦¤¥d„~2† ß+Uæ*Y@P°,8/¢6DÇÌâ=6p#¦ƒRÕé^E~¡™a€ò ö•–Õ¤èDûÊrSÛR“6¨%Îk;Öæ»§Zy¦F¥:iüóÃ2"% ’új‚ëŠJ2 kE5…YE€*å'ïL²Uù'ªA8å]X__U¥/L(ˆ¬*&”&÷¶$$î ÑF&äcÔhÊjõ!¥¾¡ª•Tä¢T%J@ÊÙžúÞŒÌÔt ¸´¤ôø ¿Ö“àDk2¾P©ÌK(báVVW\櫊HPËDNÊÈD÷„”ÞôÒÊCù5é ÒË«¼}½#Ò"ó„{ÒÃRv±þ™V2I•0³Ò\óº Çßr¿Î&„ë˜Yô"G§Eëª%ðMÄ·¯Q䄳½ò]ž^…EéééyYÂÊÂlËu¾:OO©Ô}ÇE‡O¾ºtäÚiÇòCÂ#)ÕY81þªª¬Pß<èckT¾m¬ï\ÓãÙ©ŽÆš5º(uB\ltŒ0$":DPþzßÚF½¾áðºžÅ³7í\jWðñJ¡JA×}þ¬|°ý)‰BîëTpØZ(øn󡨢æ‘õ•UzáßÍgœ™Úž¿y¼g©o–˜:é-d±H»õÔvÑRô:¯—ö§f¥>¦°…?@‹ýOY!oÔF'k@¨¡àºÒCgJC „y[锽)¾@J¡‰Á»¶z—v« i×Ýþô6>2¶DÆßð¶óá0´Š÷&ÂíÛÏuvÃ`| ’§¤ ›+ö1,û˜sú.ÌºË €Cè[<ìhQw³.Вס{0Ñôĉ‰uÍy- × ôD5øw>|hºõØäÉ®Z\{`f<¢\e“˜nÝþpb€›ÚØ›½yž:1×ÀLúò±ÍËVmݼfÕö“W¯;qÙ0!¢Î×0Áy;æ1¾ G„÷σ¯Ñ»ýÃíÁàv"r¨4²§1 —b”Í>'·ë—à«¶{6yî2: pÿ¹%4=ÞQØØ.„Kê"™ Ô¿O¡ ¸œ>B^®lÙ×^â³,M¢R‚Rd” #3zz°‹ývå ¸N*é9ÚWæ>™í˜}  ÿŒÕP[÷8½ Wñ¦óÛ踭bJ· kmÿa-ë9_ö}É…=ý"ºï×›p©–••’ì22’Û’sM[I†![É”\Ж™q Ó,ä¥ä±£À‡I4i59³~Ã)OQ]ˆ.ö`…> Ådrp‰KXk&ƒ+É©Œ?½¬Zrüä´ëJj5ù½ùØïè ne6cI7À±yGþnhæÉÐËáÈ&EU¿ Æä VªoÀÑcàøå{wh`å‹â6沯¼ºµ¯Ümª¥J±-Y(!’Šã‹")V§È·=™F¸îNHÉŒFeEHêÔÅ ¥Àì§O¿€üá]^z‘·^R¼ ê@^E޳²»UWÞºoäÝ9½òÎ ¶}VÖ+ÚáÁ&fœ=BPˬ‚ÇhdE‚åáa+(Ás–ì€<?ÆW²Gâéê¼E9P›Ãò:E0„ƱڀR4|0ç•":* ½ÅN“¬*Ì<òÅ©PÏay@®¼`#¥…ö¿ ä_H(g×çDE+½““âã‘dÀÌTh…x1Ñnq”` º‚Z-šº;3"T›üô‚<Í·p‹iE; ß¼,ÔÉÒéºéwÓD°L‡YŸ^SV¦ ;±SY«2¨cÊ´qóã ¥½òåÄWyD¨ü$¤Èó\KMË ¤òÌ óMÀÃ-äl¾l¾UŒŒ^²Ñjé¢3›>¸yúÌ6Yb è“C—Ší#ùlHåpÿTì¢Îyï³S¾!h]Ìf:..99)9˜Å$¦ç‰à ²Ï¶~ñâ=~ö²âp]¦°<31+&[—‰“4*¿,·B(8Ý\î.r%‘¹§› ØPnuþ]­µùµMÂ,ßBu=¨šœ*-%¸„èF:"Dƒ¡RURÙ¨­ê+2$xgÞçÀOû_£Ñ'+á'üÇ£=Æv¿þ'Æv™ÄJBc츠)Éi‰é‰fùêœø,@eedæh¤]6'D%ê¢ðŠÜ‚Ü‚ôôã—›Ž‚r*+!=&&&A.Ä­€‘CÅ¢y/\KZú‰çÔòâk a/ _½Î;M¢W—òàKÏZ`ˆ5Î[ž5ùÑÚöwk qcj¯³R¾£'ÔÊO¾ çûÞ:õiÊ‘Ÿ¶#KV.ÕzìSGA‡F×Q¢ËÒfdƒö“ÇÐÃ>³Ñ[žjtÿß6ú3úôþÑ%øqþ;ý^ G*AN%d*¿:Ä—?øž¡.s™ ˜C{oðبÅç!ò»Î~p¬Aj]**{Ÿrã2Â2] 2Üq€ÎZˆ†£aŸ,…#êjÒs[D©Y)”eäe§ä_5EKÌÇ=h šö"8½ ·C8 NNÐMÓÑnÑnc8¾ŠÌÑ"´G34MÂÁd\ÃW¡9œ&ú›…Ò.pŽ+¤GÆ>YN‘ó¬ånÿ¦å‚—HfÜ vÓõGGj>¸Éfxo¿ \þ•í5Øøå´û# Óÿ›Ž‡þ‰´¶¥¬@¨6ÜÝUd"Š"?=ðiôÞ:Ò 'Na‘™š ¡¯.&Ý/Í?Z¥JÊ«-è4$n_ºs  ÙF#L'¿´h ÊšFt«[·ÁÎ×ÚCØ?v` v“nö3áåìle¶¾3›|ÿåŽ |Á÷häh4ކ+y¿ê‚u³øp†±áïS“q«/„¢ H«Øél^/8;YÿB³“¯#+æ—î5hKh«ùërÄæ2Ýá¢s)Û–”hP§ÈsÆèLƒDÈâÁXÌÇ|yp×Ũ“A‡D²Óòzë¾/zMmëÞ¶·ÑÙZgšÙËú¢ÛC:}ÌÐK[öûðþ²”>®Ù¦¡yÊÝ[”y*QX]\/øŠ‚ ÊŽœ>5û“F4Ò«Ï=þÏϽü‡æ€^yæP%šÊÌѶ¼åX„¢•hå™Mp%\W¢UgΠUƒß7ÁgV!ü}Ó&Þ??Nƒ3'ñû­õîc’/û¼ÏÝå0³ïr™À,èbÇugóÿ·Vˆ£³Ÿ?·kæñÚñÛ¬öz²~¼ú¯?ùÇÖ ¨åpîß©¼áÿ@åQ«òÑéÛ]möÛÁñeû>&ÔâŸgÔqõ¢Ô âÙœZ@ìbR_° ý?;9­f"Öÿ,gS0eŸƒ´ÿ_Ñ0LØç=+]Ú+ࢊŸYég|øõ-h~™ ]™<º'Ñ…BÙ$pMNvH¤Bà²RÒ!-9´S?µå’ܰRýæâ b@}”ÇÒkýÚ·~lz¸¼ºì§N:¶¬¢|hH7ó;4;·+¼ÝDžüøý¿GÍüf5»þ©…Ô^;ùúWçß,¤Öüƒ…Ô›=[üDÆÏXE=Lj½C éPŠþ®‹æŸ[Òãöïo‹ah‚I2l.ñã}.,UÑ—rè{φ”šþÑm&Æ¡7§Á!j‘û¼ßŽq¸‡E¦åÈž?ÆñŸæäEÌÉç¹é:ˆîÄŒ|f/ˈ—1ŸÝË3–ß ½š±˜†N\¸«Ü…VV Ýxóã³g>úÐêìB‘‡ñÑ^Û­[ìí¶í°?pâDÏc¢'¡«¨!hˆa8|„àÖ;Æ LÑû8ÁúCbô_dÑüÛÏ…ËŸ¼×A!ü=Qô¦Í0L›g#l4—!m’ ig8ÇEÊý?ÄÁO xÀ`UZ¿”Â=ͨ‹†¾¬ïþ4^ ŒÑ Fów Šú Êø7 ê"¸ 7>YB€-!xë.|ëÉä6pžfRî¦+þ;€ n?Çb2n‘>_ ¢–ÍÍöÂY>†Š®‚+2zqÞõ°ÿ¥í#0ìâ»zaÛ£ñùã<ªÙÅÆŸ£HþãÝP’ Q7 #;’²êeuQí Tê[+<ôaûÁ> Éíj£ªÈèøøäX@†”ëØ^U8õÎÝ;p*®‚S¹L#ÓXuÍ"aüˆvõðpunòÜ×ÞÜÒÞîÑì"˜eìâé‰yìkkiÅÇš\DO&u}õ“ºÒ™í¿;½æo¿‚fØü{`ûSðýö‡ÏCÿ¥ÍºÐfXü;Í÷ÏÐp>xÀ…:¸ŸÞ’¢Î=üLM¢yxAdfjFjjJifqz Š³TR mTQ…Á0á?°³L!ãÿ{ÿ‡§&¢ÆÏ~ø¿‡aœ‰4?Q ‚¿ÿð9ºî¿…ßo0~Ÿ×†ÁP&_còÁf¢aô~ÿ68õ™ƒ“÷'zjp2üíˆé˜Ñÿ{@31 ž7¿ì~za4c<;©þ„ÿ%Œþg£qûó-þq¾õïaο&}÷¯æ_ÿ5ºLÃtyv“a²Ä°Ù.Ì6ð%òîA óÞo' ˜ÿq |˜Fdù×Üù þý;Gú4/œ<_„bvÝëcóçSª3ê™ôˆO×!Í&r(’ ö¾Ø†t?¡uÌÇ/Þ·ËÒíQÁS”ûFøÏþ!Êöhäp´ÿ—á?ÈÏGiÜêHÃ,E¯ü›(j‰øÐït‡õyÜù´”%ãéÿTÇ„`ÆÀLø¢øݸ0šÙø¬‰ÏÿŽŒÇü2þYUÿ—wÝÏ {æSý+»œ'>{ö8“(¯…¡}‡û`Šžs“ 7‹Û#é´øÎÛp4¸NÖ:A"½6npØ V€½ŸD ÔüÚ>ÎO.™ ¤Ì”\ Î7ÝÉ/„K:n^ÇDï¨qÔøäJ²vQeP®ä'øE††‚X›¾«.$Ó¼ æm¶›¨t ˆÚA9ó¥6¼ üd¶cð±)‘”˜=6ì—ð~‹*E¥ y&×Âã÷Ùÿw@z¿ÝÃoeÊ|ªò.ú¿Y•üüžÒÒ&@õ 3|à”œl›@)à®JÒ&=9»k’yg%]À‡áA "H¶ùÛ"°ˆ͹9]i” »½L¢ÉhÎÓ÷ñˆ/P*ȺdmH‘…¢H°#&Ê‘½Ø¬’tHÍe7p$ c¦?sS &ÝÅQ&G™~{ŒûÝ;pÝoGÃr>$AMPÙXJÇ‚óyø0bÀÅLáõ“ü#ÐÀ÷šï†(@¡øÐþļßí9[ 7c&ß›š™_5œÌ7˜oø¨±¥ýú %ŒÜ:à€«Šîƒïƒe8àg˜ü÷ÇþôÑšÊÌv@}qôm4Yž˜à)Ú¶Ï£ÐØçP[;éz°žBœ»3!çÜqÝá‰Kmp€£)¸½'¡·ýâü—ÿÿê®Æ)ªëŠC˜ýˆEËìs :‘ÝmSG"µM™1‰6NˆM $“Ä4È4ˆHBÈ(‚«Aà-áËÈÈ®´?!ú°iCÜ6èŒ V͈±:!3ç­šÞûÞ¾ýHÞ[ö»¿àÝ{Îy¿óõ»ç„ÂÀÄCÚ}È?{kzBz⮌dZ½-õÂ0ø ÞþK}NÚ)RY8`ãfPÀ÷dDЦ›H«l¹¶¡9*Ðɵ°_‹Ô ´i-h•I‘Ww0¨€“7Ñ~|9möǨöW%¼Ä.@±ì}Ч•h+ú^{Q-‚|Ð@,DñE/Àè.m›Vß{üÑ*tÿd zX´åáÆ'¾îüA˹kØ«í1õ5\-×u8uïð?Ì®ªƒrªGs=P}Gïù€ê¡Ç< ú3½È€ê{DTSJ?XEžßØÇƒ°$Ž+V0ÁÔÖi¬`ÉhÑQ„M­@«Ø¥ÚñŽúªúRòùçãSwÇÿ©>­µ¤”6–„‹i#­®(7Ü•úê“/ëfÅÛ °fJ÷ ÐÆ¡ë. éu¿Õ’wg†#Yü³³„7k»M•ÍÇu|DÓï¯n)碌Ô`QÍbãï_t?ýñÑÎúøçdЯ‘Gpƒü#¸é“;®ÁG"ó"¬kP¢¹ÂZDxN¹LC¹+å.æ”Û‹¾Dw|®Ü†{~b×4ñ×Ì.á,mÀŒSMÑØíÑíwƒ©{’­ýª´€¾I_ÞÑþ`«Tÿ>Î(”3Ì(Ž®É;whçoBìý#ê;'#Ì«=¥ì2iJ!ö‹Ö#œÛ1ްÊ÷µnmƒÔ´;êV¥ÄÞ¢Ó¦xÊ}¼øhY•FyÙÖýn‚µuÁ·íÁT¿·É5‘¨Úça'œ°kmþDæl^ ·Pš×ûš±ó-˜ì“é|ç¤T!QV \§ìµ‘‚' tNõ äŒ&á9Ùš“x±ãÔÉŽ¶ô†WŽäÑ…GBó óéBZm8TQyúÔÙO;‰q8£¦MÀx(à>´tbƒ<¬ÃÁõWöñwP ³’•_¬‚E%e´±\—ž|ø-z¯›Ð91³¶Ý\ZnzW×óª3=ÇBDÌ1ï¬ÔÎqø7/ÿq&`L^èŠe·qˆ=缡uÛ¡Ä•×im ÄaœR‰àT´ŠºE*ÀiKÝÖÛÎ×põ6ê¿8Y|Rl¡+ßr¹mqm¸0Óo¸üSVÃåŠxÃE‹Øì?p>Qº@ û2Z8å­éŸòÛ)NùΞҜ£9jj4ù僙’2ΦÕÉ»Íu¦ês™®¿¦´èL3a*ŠnxÄá¾Å'ì/êümÌ˶©M+A¶ä¨–Xƒî¹–ªÜ¬¼}t–:NÒ’^ï܇µ'ZKtƒeŠ™Ñ¬Pµô0Î9f•¡8ˆ—v83¹óÄB3{óz:dÏë¹"o^O6HûÔ%<Õ7ñíº"æó»ÁT¤ÏÕ€ý™É5òºð6:ò°­5eÝë]  }%×Cbrm®gÃÊ–ùm±F{Ü‹ò½†!.‹홉ýDk²M/˜ —}¦õ2§DõNþyZõÚ›|É7î ÇpÀ!³æ"9Òì&r‹ÍP¶½]u€Nâ}ëA~««©N]‚8¨†XUwC[cyÅá}U¡¦=Õ†zZ}¶¾¡YGEt¤4ni瞨í¡Á¯¥ 6aŒ[âxÍCq4zfÕAcìvW¹‚Û‡#Ýøs‹™ ÙÙànQ|«*÷PeÖwíXÁKÜ*8373#]÷óz•7å áª8¯w6&` §¤f·¸±"!Øk RÖ`¯ã¢Ý~|çpg¹t»ùÊÄÉB™‘¯€‚´fH}†òtÈ›êE?ŸÜ!/áá4ÁE¶Á W¦ùš\“Û3~ÓÌ&šáE³²qèÖØúÚÀ…~~ÿR; ä endstream endobj 130 0 obj 19707 endobj 13 0 obj <> endobj 12 0 obj <>stream xœÍ}\Çû÷.Çí­ Ë¹¨wgE±&VDÄB *Ø@¤WiR¤‰2Ø@Å "M° RìØ `‰b×XcbñY’ÿ;{‡#Æ´_ÞÏ…soËìÌS¿Ï3ÏLhJ]¢iº¹¹«÷× OgÇ^#ý¼]„S½ù¶4ßNo/Â#ðéó?Œ·§ÆnyÖŒ—5¥ÒÛõnÕŽ-hÙŽѼ8«e+´³‚N¢wÑ?ѯéJ555 5©šL­«Z/µþjCÔ†«™ªU³R³SóT T›¯¶Dm…Z¼Ú&µdµLµ½jùjÅj§Õ.ª]U»©v_í‰Úkµ÷"5+Òq¢¶"]Q?‘¾h¸h¬h’È^ä- …Šæ‹–ˆbED‰¢TÑNÑ~Q±è˜èŒ¨TtSôDôBÄ‹þOQo¦ÞZ]G]¡®§ÞW}¨úu3u+uu7uõ@õ0õ¥êqê‰êiÝ&OšÚ½Gž£üüÃ<Ý=‚ßèëë+œÂÕWÆ®žî¾Š®ä`Ž«·Ÿ¿«oPo…•««"ÈÃUáæéíªe9aúèñfŠnfã'+Ì\}]½‚¼=c=]}]»+ÜüÞª g?_Ï O?ßÀÞŠ GE ¿«³'yÈ5ÔÙÕ_¸ÐSáïàãHŽž ÷Gß WEŸÂÓ×Ù;ØEx=9ïæç¤ðð#×}ÈÒÔ¿À @çOÿ yãcSUƒ<ƒ„÷z’Ë ?7r§‹Ÿs°0šškAŽž¾Š ×Ð á=N® Ï@oÇ0ò^Ò”€§² Áž¾îµoï©puw pñv T¶+P¥v|Š:£vô÷÷S>ë§¼«æýžA®Þn½Ç{ú8*¬Écc‚(Ö;SË¢¿Æ4“à?¡“®³ƒ½ƒ}|…º¸:¹(O»z9ú;V¸xº¹ùú)Ï{û…»úº®ºñá@uW~uv ðóµqtrìçîçë:k´‹_£3qÐXg?òÕ±MÍY³:g­”Z9»ºxz{;:*›íãèLÚ¡ú'°úÚ$å£U¯˜L8ánU§e7F¨®ŽRÞ:Iyj¼òؤæåÎÕ×j¯¼ÏZùm¢zç(Õ£un²®s쬺Uõ®1u.+/Xzûqöñv š\÷‡1iÛ1ÈL9HK՛ƪ§ú1«N[®Ê¶\”ßžªË®5ƒpQ6ä­|ÖUuÑ[y§{¼ë¶¦êl3žª3Žª§U¿‚Uÿ„+T~‡×¼ÔWu¶NÁ|•/ö­{ºî˜”O«^¤¼7@ùíW÷® :Ô9öS=GQÔº±#Â|§îç2}ü(WKãÙnLÜ'šzL2 ò´2ö²=gÖd‹oÇ)cB}œ¦ g;°‡bÆ žì÷ê8S¿w'û!}:;ôí1ô›®s ¿ÕÖ¯Û<£þÝ“8]´{ûó3Å{R~*‘ºK]¥ÎRG¨\j3•NÝ£¾£.R‡¨SÔQê4u‡zD#j#Kü÷Jz½š^CÇÑñôZz½žN 7ÐéMôfz ½•N$~Lo§SèT:N§3èt&Eï$ž7½‡ÞKgÓ9ô>:—Σ÷Óùôº€.¤‹èbú }ˆ>L¡ÒÇèãt }‚>IŸ¢OÓgè³ô9ú<}¾H—Òet9}‰¾L_¡¯ÒßÑ×èët}ƒ¾IߢoÓwè»ô=ú>ý€JàawGÂÐ4ê=„¢³Õº¨YªmP{#ê('ÚIÜÿ,õu꿉lj3Å]f /‘HæIv°ÝÙ–oäÚh[£õ6ÞÝø‡&M›tibÑ$²IISµ¦úM'5½ÝŒn6¨™O³ï4úhx7·o^Üü§ÍZÄ´Øß¢ Åù¿µìÑÒºep+µV𭯵òmu¿H§KgIWK3ZlíÞ:…ëÌ¥k6Öì­9AóC6}ÚÄ´9 ¥£5TëhÑÎÒþ^§½Ž©N¹Î³¶ƒÚZ·ÍiףݤvËÛ=jŸÑþ¥¬‹l†l·ì„|µ¼L¢X®¸ªxÑ¡i‡YÖv¤;öîhßqvÇÝ":ýÒ¹ygEçA³»8w ˩.OººvÍÓU×m¯;[º5ê6 Û¬nIÝÎt×ìþm÷ z ½³z{÷¸Ð3¢gVÏ+½ä½õŠí­Ó»¢Oï>Ö}ûŽï›Þ÷ÿ¾YóÍão¹oÝ¿ÝÖ¯Y?—~7úìÔè;`Õ@z ÏÀŠAúƒâwœ6ø¡þtý³Cô‡¤|c°À rèZC±¡¡‹áo‡å+5Ò2fôÝpëák†?Ñ{ÄÌÿ72w$?jî¨Õ£ˌߙD™\7u2M1baÞÌ|¢y¤ùƒÑÍG÷]8ºÒ¢‡Å‹ÝcF‰sb숱þcóÆþ2.z|ãñù–î–±–7&¬ž(›h3ñ»I³'°jkµÔº½õë-Öxòöɦ´Ÿb7åòÔNS½¦^žÖkZô´ÓgO¿b3Ìæ’íÛ9¶gèÎØn§°gwf¦îÌq3ÛSöí+68¼vŒqé´Ïéçç—F.Ù®2××»nýÜæ¹q×us¿ã1Ìc›ÇÈÒàAKþv@Oá•>ÖûÕ‡_-ñF£Ò %ZÂÖ$è™DóËA—+ƺbèÍàÕ•>b<„Á ¿úˆ¡sÈé¹Ð’Ó˜ç#Öàb¿·•-ÈS2>›ÃêUíq¾½÷fÀ®ê”8F-™æêb³`Qìê0YGɶ脘-hÚ—²nßæ-Û·Ÿ‡€J©–ÐÁ$¾74ñMj…@ö h#-8GZ¬Ê&?+$ÒŠóûËNgz‘áäÌoh2º KFÚø[:ˤƒoHHO‚@ /AL©ñ‰ð„[ZýnⶈÅzuÀc±é³NÐÚ<¹ Ü9ÖaÂLüü'#ÖØáü»Ã늷ì”oÎÌÚœ‹N tÿÍÆ¬Fe”TiB†6ˆg9†J1É`¼·†ÅblÊ@þ ‡W‰Ä0’9¬^#SBÑïTOr“Q’{ó8hSuA z püqÕЫôÁs$¸uUÖâ+Ä8èWrUàaÅDò§- 5ô :ãæÐ¹ôÝM¸ÍÜC%›dÈÎ8‹N¢+.'ô‹Y)¥0cÿYt(à¨Ó^‡ìi› É o0 ‡[r0ˆ)Ïö<ÅÍ×TŽ1¸¥:˜1ÒwWs¼Æwõ)ÇfŒñJ ñx{ꃱV08 —б˜·1N—ÀV(% ‡:d†8Bj8ÆrX¿+¦± 6})ƒß #`L·÷ØP‹Å\Å!Ó]§š 7švéíÛ׮˕ 5‚'䯒²­Ûºk‚‚ÐEc3RÍÉ0¸î¸42yÄÞ©òì©=/¢RT”ºç(‹ó͸ËE¦»Ûš™˜Ø–¿|U|é’¼†m°”PžÛ9ˆàíÅx(ƒåøî×ÄØ€¥UäÜvГ(忚[P(<¯©dŽ^Õbïç «{ ¬ácæA+>Z+5©r?‡[zn^®wžÕwßäašôÖ ·ÆºxžR¬Ky44{kå¸+Õ{”ÞäÖìè.ÿä‡ydÈ7‡Ä‡®ua I°oŒ$$y jh6‚f)~!¿÷0»-‹ýÊ š?‚ ¾|ÝýÜý°ùn d†l}=-Yhì§"Š©©‰mÙë×Åå„(D;ÞCÇgÐü=Íoƒ9\lZâбE‡æå¸¿èJÙ÷>=±:GüÐzA³å¿dɱŒ wp ˜†œÑ¬-!™ó’–¦,?Ì®xÆ­½³'ï,ÑäáI~BÖÌYéÆV›™@hIó׈©*À-ùFLU£ª@19*€–U¬„gù@±Feb´æW«èÈwˆ®SÆuAƒ<Ç™[˜¸uA¤C˜Îî|ÁôœÙ¯ŸÑÏèήseçJ÷ý‚Þ"`ÜÞX\S>dgGÄÆâÖ4¿¡‹¿Å݇tÅMq3ƒ×¤û½n½†fr•6)»$p÷yQ…&ä0 B—Òž:Y–õ’>uï—ËmN™¦buBr]¯ê5Gk+qÉP<÷·ŠÅò8Äw#2xšž)¬f¬õ’öÚÈ÷N+õ<ÊС»N±xî ^)Â"³Ž*¹ýÈ"x@l`ÿgÏßÑ×®_äÓ¸ÁG™Œ„i ›c–'ÈÞIf¯ðˆ Elï™ö}åF½¯W™ƒ‚7¿+QŠ<,&&ïz ë£36p`ɀ΃çÐ º¾…{PZžS'÷*$·²=†pó0PjM­ÙQù‰0(åàà#@ŸoF¸—B|Æ~ò¯œ mÒY« viv±Î•H'ÜÉË»³i]Lt¢ :JÅ.EËÐdåè3’•öýE¢¤âãw*íWqh‹øž¤…ÁÇóvã[÷À-±ú«ƒö¹œÄSGä#%63M¦x$ç-á.L¬ãfß½>ù§Ãï}ôÃUÊù㼆P÷Ò‘‘ºÝ§™mWúâMáå2ùg$®²×[îàé¬WèzïúvLùØ2ý]P'¤ï5ÖlŒ©kg•æt>ODð®×[t •l:¹‡}0äúm1Þ «8£!#ƒæ{-ž…´qÓZ¡›º¸å‚ÉÁör¥cƒ¢ºT ¨z…Põ 9÷¡æZ•Ýü—¼5:‘PÄZ«¼·˜~å¸ ¡Hû¦Xä¾Þ;qŽ<1tKÔ‘p0˜ªµgAÂÌz¹„X¸ûÆ%„Éæ®_²~Ér7³ 7þ~ &ý>±9wgîΔCè(ºäQ`¼ ›ÖrIX’ÙÌIKwÚÄÊj|ðG{<…t¡”¨1éžà‚Ï8—™² x³,!lU$ò`ñ]¥#F¥aÅnYÞi37ÍD¦hºŸË’TF•x®–0©Z$s•Ðös0œ¹1{ü´0fž<&…¡ÈlUp¢ Ò™  Q›ÐÎe0kÙºÞ¹wvæBÐÉ£{½vÛm&‚QÕV%Àߪ“–GKòÑÖe[çn»6y"…~ás#"C–: VÅpHz0û£¹¶åÛq˜%Â,sZ<ÛÝÞzöDBÚfý!=ü¦â9H˜ë»K¾-l}øW:0aćj<ÇÆä.7Ü ÷Á!x6ñÇ`ú‹‹{î”È·ö?fˆîý¿<£ËUþ03„.ĉu1í]Žï3 Ÿf¥®ŒO•½D._³±nQë‹åPDp d²ßV‰<무õ‚"1•>꤉–äˆ(g4%v»)½:Á1è,âæWq¨tî÷\›cCv;ˆGuÕDZø„5tó“¿ yší‡&h·rëÛeRþ¥2âÖâ¾ïÂx¢.@ôÉÄÓ¸mš3ÉŠmÞÛÐQíã÷TQKbW.”auIFôžåIˆý~ïÞ‡òÊó5DRʯ@HÂpâO8þ5žD¿n“˳«^ :&кÚÓ‹À³«”<M0Ã[MÏg‹q7ÓUr܈— Ç0±*[¬¼Iõ4éš-ÜåøNÄ- Úa")9ŽÃ`O‡G0ĸŸ /´æ_«°E–ЭXÁ1FIúÍtìÕkæþ‡2>ŠàŒ( ÒOžxÐþ¨mÅì‡è!ªH;Z|ð@òIt‡å£T榕Bß ­ì•XûúL˜Q*»„õFIÑÖùÎû]KBÊ ‡»ß¯€vr~/QÅDÕàøJMè% ® £_¥1„×c…p4@8êÂ@O2HèÌ<à[Þ®j)®C,A.b)ËÔGÚ` íEü¶-\ÀöÅ›P G% 6¼wÅ]Æá–Q2hËÄ•lßJºt,=Ì=,*bî"yèB„LX-ÔR„MµFzÈnƒkªÖ¬¢ÐbtO;xù­\¸!‚…ž 6nˆ³ñ ßÔÜýÉI'dÅk³ã֬د]‹Ð;hÂJ!RéÁà~U…x _(C ‰ZêÂ;ÁúFs×nÀ"|MLP0¾Æ÷ƒÖbçà«b¸ª’I­D¤r` ÛÙꃄ#0ÆÛ°9NÃPæ) }‚‡ GšÕ‰cäXNè3\õ×Fºçtx¦ôâÞÜÓE;üd¸Jy¦Þo¾•äݘ³˜2³ ´r”Í>=ûõµÆš³,ÂMŽcñÃïZüèRôººñÒN¿«Zg›; õEv˜1<ã|½B¯r^_¸våîùÀ¯ÛçÒ¸‹vš¡¡hbØ$/;ÖËÞÑϱ>¡‰™ ÅgÊoÀ.1ÏÙé2vÚls7y ŸG¨/b§»~sãõ %°†¦¢w‚åy+»ÈÊé\Usfl•\ ­˜M{v&æ#örþ´ƒí§™Œ÷Ì:-Àê¸Åƒ@F¸ÔóçŸ vèòÍ+Üf†Ç|o'ùvè&†BdUN'ØæŠ´ø<μ×I‡ÒJ{Ì7ÿè=Á—0í.vf%˜ÞlJTöžñ¦Òó  Mœtvéo`é¬^é êLuo7 ÑY©¾2ð ×*¾€[\µ=,Íí°Eæ0Ôrq0v4 Š0‡°Æ&£½“òFçrô¶Ã¿@oh7è¬1Ñ%ÜÎ^¾òBk27œÏÍ)A(%lëL¶;¶â.ìŸfhdg=nŒýÑk7»@Hu{a1_Mh°€&">pØ,plA>MÈ9O®Y†šü™D¯œÉ™30ïWoqiµ•>#„©‰—Ãþ ã`7s~ãl:ôÅ=—½‚®• ö¬`Ä «RõÏCWw}-Afþæ³V’¼ÕëÓ·åfmÌF7Xh/xõͰ©Ò‹8ìÆäá³äÕûᬸŠQ'gº*ýÈG:ƒ:!ôV<ƒƒ¥à¥]@ýWO\CçÈç0Ä@Æ,QDwhFþ%–à'¾¯É¥lX·~ÝŽô-ù¨QÛ¸ Öê1«›e8œ÷”IßêÛ{N¤ƒuÞö†îÐíí3йçyLÿ€LúÖ`îl¾«õd{—ñãì÷?–ŸsN.}»ïæÊóíF˜ÙÏ43s(¸tå@a©X€3´¥á0<çp*n ©¤ƒ¾¼$ðd"˜ ˆŠ k2¹˜—árbbR4?=GXÈ'’€ñ†$¤c°~•¡˜ÈHà(ÜQÁG’k ‰ÀæµE9 Ï­ÄôSÐ@OPyÎþ+Ùç’ß“½ ¿3ëèÌë&¹ zé¨×w#üÑ…V{w¯Ûœ,ß°6~íö4·u5j㙾?Zö˜ŸÈ•íŸ2ØÐ~ê˜1·oßÉ=rV^‡Ãà%°¸šEüQþz½¤¡ë,.—¸ã·Œ3v¿c„chòR—É‚^b _~Ã솑⎌')î\ç7éö’ñÁ½ÄzÝ*”¸^Âe’‡Þ*O ©¯‰å$ÒÅM¹ªŸLùŸ•ü@èÇîl®í¿¥Vv¹"ØØI)ÖàTé-´¶šß.»Z"~#¿”àþ–†7q«8ö˜Ùd ææ‰HlŠEåÆÐ֛Ş«uÞyÑ—XÜ&ŠA#3-Kœsü³ç^Âv,{'9¾fÿÆ]ÛŽíÙy P ÷ÉgÁNrxñÇåãYÜÕ˜³ÚŽ Ãi™Ç׳eø&Wžá‰l €÷²Šô†'Ø $‚wi+‚™¼'- $Ë¥í(YÇJ<—Ïš2ËžšÄbZòéØÅ¨m|cõZ^ ðv}5 pðFZ¥g„,f9Lp²í‹p{„[nùv×äýæå®wQ:—uàt§´ˆ­‹xèyܱÌ4{0$±ú^´#d‹ÛFŸxC-†.2XèáèäŒÜ_bøÞÈÌE׈“¸{ÝŽÍù™)¹$VøÐ,$iÞ úrî 0xÙ ½„a/ß _m¤I &r]ëëêÞÕýêÞo‡Üî,ï¦^”ã6c¦‹«Ý ל‚œœ"9ßù=WE0’¸‚áåÄuJÝDãJå£]«ýù㣮5 Sg¼¬ô{I߆F"¸DÔш5m¢¾»KCHèÌv>³¬³*&ÅŬ_¦½}A|r&A‰DÿðÄ+²ë/ÝÏ›Êaª] Nžpm}r*ºÊ’ß¹·dɲ¥ý¥ù4Þ—«ŠÄ£Å¸™„ÄbIªZA¾h«0. ÃDñ‘äFPTNï- 4Òk ¶·D iY~+ÐÄ®iO$ª.¦m¤üv¾·ôu‘O°#1sµÉÈGWØgÆg ý‘½Ü6ºgxÉÖ.X»`ÝüËW-]³ˆ•ÞÇÆ;O饃5Ÿ€Že…[ÏÜ–Z‰aƒ›CïÜ´Û+®k¯–¬—à_'sÐÍpw õFÚ“§ž8½kóŽô­riÅ0禟[RÙŒ”¤Ý{·Íqóñu–iÀ.Á}¢["0'ô4ømÀ-GˆiFœŸÅ÷áªBq>”ÁÍÔ«@K>Œ¯µÐì¾VÈwe¶æ$'ý|š?Þ{ ýH$¸×CÜëèõ– E± d ³¹™]xþlŽƒ±a€7î‹E2ÜTßmìb܆åçšÏ¿VÆymE{Ûò–dÅôÙ¾V Y;Éî;R’v¦oØ…N°@ô©F î¸B<ÌuæÊá“wä@ä!?)± –M`V=e–Åú¡Å± Vi­_´å²à&¹3íä(™Q·lf÷ú9&ò029àÚüá ‚ÐH–üvŽ ÷–¹UËCîBŽ„Ñbh&!̶c‘„o…ÛTµÂJi¨VÌVPAœX#Áy•ƒ\⢵1)KŠæe:¡©ì8û™ãG»ç\]&Ãí˜XÜñÙ·Ð… …?=Ù]÷cûäÒûóÒ .è@ã~×pû!f~Se~ólÑXv>hJbsV&Æmݵ31±%;=';¹–Ï,ª’…Ð\öÉ$x„-–!Ü áÞÅXä7ûŠéNÝ Ð%&h70¿€Ko%Ü¢ùqÇÅøÇ,‹^´(,"*ÍA‘kf'NÚ¯¸ev¼Á~¶KõØLlZ쪕ññ[7¯MAÛЖÅÛÃO8j¥…¥,Ú…n¡¼â5/TùÍ®|4¦Áô2¡ƒˆƒ‡.Æ­?½ÿÙÅôè íºü@¤ÂÜg‚ƒÌË~žmŒ>9µ‚Yv»øìEÄž.˜n1s~è[ùP³ ™+8`]Çe‘€»=°4d«f0Ò¸¼9ÖgpB•©7†lü ±ß|'Á^Àrxã D\M$r…PICÀ"QL%ôBÐÛd˜üfu™_°ÓnÁ…è"ÜÕ30¡<àeÕ&û"Ï‘ðÒq"XÇœq$¸‡gÔÉ™®X˜•ø˜>›ŸÔjèñÝ…D@èáNN¿ð¸:?{¡,çgô=õ{fwîÑK­©ƒûˆ¥§ÌMR{¶í¨L¬6uS&Öº§<>b@O­Ãvb>ŒßÅmrŽ·A3XÜÇ +Ö˜j³5Ó[æXÂ…î_xg¡ïÍ×Т¤(Ô%[&Œ– Òe5TFpX k€š0…ñQ»~" võì'Í/ëMrغŠ1#yým×oŸ‘ 6W ÅÝ"(á͸¢Å©~Ʊ Ã,‚ýîãæ+Øûö$¸Ë\Ã.GxȽ b»x-&«Ý_MY¬ÃÌèg·˜µ_ÉMÞì{=C/wœ>¶‘8£¹„Ôk“±Ä˜¶V&` 4X©.$óGÈÕ[вjÖTFº²ÈÖe˘¶Ø7Çßà`-p?Q–“tö \ê6ŸGx)‘®ÄzG9ßiîÁ“ÛÁø ô„^—_¿?¶'xÚyÒ^¨Ûº–ºÇjÔRú(Ä7D‚4%  ”ùíkвã»V׉¸ŽQaá‚Ï¥¼ðâáBö[zû«òß‚jÙ˜|"AÔ*:¸‚´4”o“îÈ™%›o ßx0:%±GórNd¦G…%ɶ…Ň­±‹] ZÌÒS‹vÍÝá~Ùp_'%[‡;βs󛄬}|pÁPÖÒú# Úì²zN€š8Û}Фã]µ$§Çç 4”²¬x>+]<ÿPò²ô¶QnBÉ.' µœCfEy¡p²rv+uYç²(6¼­/ Y<Öç~iV!:‰’¢7ÌOcAƒ•†M7 ËÀ¹ŒF÷ ç=|Ï8|ÌŽ1¸ïÎuo¡èpÆâ勳~µ ç»ÊÍÔ 3ÇZz;Μé½ÿ왬ý ùï‹ïÓˆ|‰`håznš³óôé¹Î‡æå<ì’;]n«¾}khPPhhp`hâö퉉)$êŸ[ ¢ S”"XZ‹^‰.|öø#KŸ¿ IRrÔTàèm>¿6Y„竦1¤?}#Á „X²••ö\•Á¯âïÞ 2PLðY ˆ±ºr«ˆïU“Þ•3 '7ßÅÞ×¹ ­!Ys·/M¢©ß˜Ø‡V£c‹ÏËv{9à$±|ãÑ”p'/Vºv—ë„-†mqw4lìrÜ‚…6LܱԤsˆ=‘îQ?C…©°iÖ¨;Ûõ˜··Ïî¼zV&56ÛÉýa[h†^”e½g¥»ªŸçô]fŽšá›š——žz4NV—¹:aÕ–uÚÐá·ævöþóèÊvŒ"˜\숆ÑD0Psr‡ÄµëV&!í¬¤È9Aa³üã¶O‘‡N½¼cɤ}·p×é¾é3æÎ_¾t®|Ç9BйÁ ¿†Â7nB‡› Â×%áKý+C8}só!CJÍïÞ.+½yoôÅArõÜ,o×YÂ_Ö¾œY9rxt“«ü+_dxýJ$îSå¢|N¿t4yîâ­úϹº||Žßúªû#áü3̓ó\Õ¹Nü¹j÷ÖÿÔÑS4¸ þm üÌáö XÃ/bÜV˜XÃrˆu{LÎÉ&@—)¸ ùÆD>À:žÂBGUWHÎ}š2¬vÏÊånŘ`]ñ%JA·ö—0ñä‰d½ƒ…Eð”C‹ç[:öío±¸Ý›^ÐíAiæ©|Ù®ŠcïSË™UClÇ™#Öræ¡  ‰§Šå·Ê¶Dßg±â8÷ÑIòG  îÛ tD|Æa3"ã ÂfĈ›Uþ4ÓíG±?Ñ?A7r?ñ\AnÎÄå%\IÙ“‹´7£uÑ;æ%DËaCð*oÔM„;.˜ …ezМ±¬j:op¸ŸÒŽ@k6b‰VVDú’è *Üš™¹{÷¶cîŸâ[iAûÚ¤w‰@¬i<ñò¹ÄÈò+gñPII®âþŸptSp{xÞa=¡æ0¿SÑvâq·G)+ãÒeE’°e¡ËC;%hóîÃ);î ÎBph…õM@OpŽ™$ü¬!Ä–ßVÿ:DîbÉõÀjÂØ¨Òö Qð&ýH¿ºC‡B|QÎûðyÜòƒ‹ÓÂ3¼‹,võ ÍúÒõ^çµ%X¾&jetj+}fu¦¸è´€z¯ dkWÏÔïªÜBLýfj9ûpô!ør`€»Š‘t}ôú‘I°î.;~þJm™á-å\?oÀÁ)¬W%•X‰¿•Ü*ãuüF" "p•1‹ ‡SQH@ߑʜ³È.(ÄÙ¡€ä%X«…ŒÑ‰I×®8qM¦,QSvÿ1Á•?Áã? ïî64@Êàà+7îÂá»7¯ÐèÆË§üÀ"þ ?Š‹Î[”šæY`:š¸ŸV†ßâN¸ão 9¨_=ÿnµ¼³ÔÊÓgbMœŽ?û!¿äòÑ“×Ë{ûãáäã†]a8 Nà FÄîz9FØM3Šƒ¡Ð˱ÛýŽãöБÜeíAŸé\ ¢íjX ôö‚Zé£/ìHunTæ|6𫬠IzvímºÚ ŸyηxÞFúŽ@•YÜfæxÌŽ9ȉõ˜àî²­ ZÖ‡‰í[2õböÇŠ†"^¥#ú,“Â…™Ý°:´‘¶ã+m¸i»ûO]´rÉʘXméO3Ò¢W¸m4Ÿ¡u0pã¢ô{­ýn…9Á™ÞéÚ.›BVÍFÈ~žK ÑL·a«±ØüñI0ô%qÖcaˆ 4Ç=ÞÈìpWqм£îts#£é¥oß*½.¯y¿RoœYÐ^ç3 OÈÖŒŸûy²Ýæõù V~€48ÜZøÜ­…æîÝí>µW?©ÎÀ†ÖC˜£`wæ›×G«·ápÍUˆrù&Ü0Þ{TÀ~É?TØŒ[ÂÕb­Ú2ç;*÷VSìœR·Ø¹ä‹ÅÎnH¤­Á\çÙ?ðŠ­ë{ÅiÊ+¾WÜ Û‚bQ1è Âtò¿¦!ú|Â×¥,þ‘Òšªaà\Oªª "XËÇ¿!€Ð…`–ˆ¯Í·ºýPp6ÐúG0ø4nˆ .rO™ý‰s=åá’˜…hùدˆLbßncæÆ/‹C‰ÑÐzyÜÔ”ƒ)Ûv£Cìõ™F2Ueù#qê@½•ožçä1ÏVL`à?ãT°£~_|6ʤÏofª*å uª”~ÐÀšf¶¾–žòÚúd3¡>ùUu}ò?TVNúûÝ'Ñ(ö?tXÖmk=Á ‚ñbž?X-…Ll¸©¯ß䃼7D$eÌ=‚N CÂz€zË@‡ùt=Á ëÝ@&w˜¸v}MgvØ,ÿÙqÛ§ÉC§žž³{qmÇvî¼åKçýC‚‹õˆàÖ âTb{çSÓÙBÛßG!C€§ òû™¸æ-/=&çh$|‹ ¤r$7ÈÌlðà2Ó;÷ËJïß5+,«^œël;ÝÙeú ç¼¢ƒ¹¹å5†¶Úu_ ÌÑ¿et¥ƒq ØÁ‘ÿ}1#Êð]]»þ?¨®Ç1¼Å'^ðŸ£g‚ýžÕU1]AÏ]à˳º²%}‡Õ?ôþ<¦¬'^Wˆ¯k%}ýg„LÊ‚¹¯qp«¯œz¬%±a¿wpë–¯W:8vQR’ÒÁeí_-8¸ÛÐÜ„Š#c¡â(å-W5‹HÔ,†·VÇÆ`Œ›`còiBŽÈ ä&ãND¦ ò¹øÿß•\")u•JNêÇ  %Ì&û+2Cß-˜Üã ×½nÁ8«U¹<Eð”#ŽTžZ|úxù®·(ôÞëgër›Sæ©X",ºÀç†0¢ z·ˆuGPÆ”‘æše¿i2@CçŽó¶ŸíêaAnnû©Œ]®c=þœ¤i¸ðôgÇ?CömØù½ú 4{.‚›Â}–ÌÆ-kââ׬Y¼9+ùÖñä,tš}0¹XO×jZŸh´8v‘ì)‡V°Éi99ÛgFFt-3œä=„…suDìj- ŒPà©¿&jÒnÄ_ülñp°Ûïàà¿oÄôÑüŒ?ú“k¶ÎüŽ‘§•v¦zWé…†—qIÄýuiñÖEQߺÔÀ\†¾Wügå¯9ßNý«/‘Ç”Ú(](Äø!úý?¢×Jiý`ó…2¨þ‹‚ÚßN70§üQø®ÔÑäûÿš JÛáöD>kÄÅTMU‹©^%Õ]N¥P.§j{ÿtÿ.¤Ä1Oî¼oÚ}Ò™áдÚ)ÂÖß-¬ú-u#È÷ú'ø@‰|§\®6D|s‚|-Vû6ôÙ¯X“˜8¶ÎétÕD^ê’rº Ò" £E^²jeYý)ñº H×gNÄ )ñûûçpHá?+l~'l¿jÔúÛ·dnû«@ÿ6 JógKœMìßX‰{}^«E¶:â U¨^Gz¥ï:4XË÷ûPÄRÈŸú¯2Àݲø¨¿ÊÔý©ú1ïZUÌûïˆ>Á¶g”µ¹l' Ý8ñaŽt0–4”bù–÷‡Ÿ+)ùêm°?X|¶ÿxé»+,ùl·¾vSü ˜74®6ᬬŒ K“>K– —¹@3ñfؤ©Yvæwío¢}hwüÍ4ºK ý:#Kd{xöF3©ebìÃ,_GŸuhcìú›YX̤³«˜”§ÅgQÊ ?7½8­QG7™ Üuìæ†X[†¼ç3E¡ùäµ"R¨T©”ß ¡ýs°x›žiZ9Ú7ªhCh_¥ñœá§iÞ…7büæ ?·— ÂoÀ[1n_5ã ¼aîã7ÂŒÙÂ'4Ÿu›«ŠìËG2•íÕ«„e$¸ég–“TÚöWiRHóU•K¸ªpÆ y¯pZ /ª¦jáUw¯B(ióLʈ޶$áåÚ‚ä;l ½xùÒ˜˜9Ó–, ‰ ^*ìñœ|‚ç“0e#óeÌIíÍ&3Ÿö§*ô¿°¤¡Ò§ºF!^³ÒŽÁ„è|23¶ê5ýÈSý«"ÉçÍÍ‚Ÿó ¸ˆF!ù¦èMå·\üªSikWîEÚEh_XŠçîÛ†£Èoy`”¥éQ¿„)ȹDxzÚÍð3G,¦ï|íl^E¾,»l´AoY˜EÐ÷š9ca˜³ ŽT ä"¿]ìéà?ÔÎ~2b­¼Ž|ìÅoåg;¥’ ©àãRh~„s±øÉª š‰!š`_Fy¨M1{Ît/±ÀÄ87GÆ 7#ìÂM]"‰Ù±N¢a{å\nƒ­«X â³ Xó¬à @øë/qïãý?tápë_wàɼw¹Õë‡BXRµz~0þtÖàxÅŸOê¶æΊ‰² n¨È£ÎÎ %…*4´ÛHŸü»ûƒHµ5Ë¿\€¢4s @=Dè–1ÃÄŠïøt7-é„Wük«—Jb§ûØE±v’Ë+ŸFwØ·’?a)ÛÃýz .<ï0ô¯M÷ë>Ú/`þ° º,lùÄN ز{wÒÞ‚ƒò“gÚ²moÑæC¨œ­Nç6œÞ}B¬OòÊâ Ãlý=-rJö+œ›²(uY:ÚRV¦Ç±ŸL®T¨,«;Ð7¤ÖI ,ê§•JVK'ßÑiõ><îéTýRaFèË“öÅÞÄ´ÖxÇD¡Ùµ€Ôö$èßÛD]Õ|bCcú/v ?¢^P®LYÕtÂàA1é< â`êÚ7t'xGÙiLKÕ[Û’º·ëp×{ÃÀ(Ìñ÷"ÿøäéòЩgæìª7Iº`ù²¹u*]j¬€•^ø¯Piß#üÂ/Z‡j-y|“>óÉ왚N*¬º®o@ÿ…Y±îðÃÇz>åÌ6èªS+9Q– ´w°7ˆÛÊ÷øPJÔ#'°G…z´kQ!×_GX«1}v t wô‘¯ÒgŸËý í;õÖ0üçÝåëÅû8òð‡æIÊ’÷L»Ç srw@SYËÃnw’“W®I“I"¢ç,Ÿ‡X·ÙÛ2ówÈ«ÈÏýX>£V ±‚9ù—¦Õ†à<ðÿÊâ—>*û¦4(JÛF«ŒJ©÷¿oV¤«ñ¸ªó º?•2¨ìþ9ìL\^äa¸S[¢àûXT£+×C?»ihkyÌã‡ô¤qÂÚ„èå¡ÄnÙ{ðÀ¡òL9^%¨“A}uŠÔÉŠùQؼò_ÝÍÏ—·ù´bè?”úa ËÏQùk·>„=¼qC ÞzÐàËe¨Z`T[‡úÏïÙ¹T6 P¤†ðA€@ü6Ò9ÿCòK£{Wù6¨0_Ï[ØÓ@þ[_V¦–ÿuÙøX™RG_â` ØZ¹ñ£úW5ˆ û ˜%[ Íj8ªœòõþ”ïê;Ug†›ª -¾T"ÖÏ‘‘X>mË›ù§¥y$ži‚i´¨odaÚãìì,f€‹‹²Œåóô¤•k” ¹¢• ¹cY”sàrŽ\`®äs¤°û×îš%]ý¤Aêü³;qf4à5þGó"—>Îv}f‘á?S—5ûc}ßgßð¿«²©»‹b~EµøC¨xô‡_ÌÔðøFùŒŠm>Crj÷—¶Ñ.«?ÉU-*›*ˆÐÇ¿‚ X†u0ÿ'ú©ôó«6#$¶K·ê§/¯½úÇò>«´S«7³+«“[QV·‘^ûv„–vƒóp¨¡WOŸ¼•€m…—ÖŸ;y}JXC•0>S¦ò¯Ö¨hÙ×–¨ÔnùWTZXwÃlþ;‰Ç1»T³Òà/psàJ‹Rî‘[ƒ‚vºÔò"VŒÆÚæ’Mxp}¼T.op·ÇËõ*­jÇÿ„¯ÿâÐ[æ;×½˜p臺²!äÝêôQ:á¨ð£Aç^“R<ê5âõ¿É*VÀHÔÍ%1‡’3 ײ…ãåÓ,‘>ÛY¹×éçt¹î¸Vcî hCÈ ö{”J óH|PTyö=ùÛö”}'?y6aëÆÃ¬@~{W%ù½¶„fÎÛ¦$ÿ';%¸¿èWŸÏÐ3cëÊu{åÆ6³ÐLÖ²f58.ãs•¼;§ä]¢ßÆêmÀá00"I"Po°ÿÊÈ»2]@\'©6ú¨uŒôþp{€ßMJX—E Kв…1 Ð\¹j~\øº¥ëQ2+-G; Žå°uöÊ­AaOnÖæ*þ«¼‘¢”w©c¼ në§ê²oßöUšIÞU30jQtd”Ÿr ²Q‡ÖLÒ>*Ê)¸šÍ~Ý&À_=ï6Џ½ú¥:ÿå,âA¾mÝÞ|ÄíÚö—G#í‹{Ay{ÿwÿ—ÄAÔ[|vT•3Rå ‰vvV‘Iˆ›þ§„"f­SÕ°†íµª>âPÝEiƒ„nžüꕜCº~íÆ7ÿ•»•~>$¯Ž)?6®ò:ÊL©û·/¾@ó†D÷ØöW«I|¾´MÊߨܺ|²âQÕ¿W7ké[ñÕ|T×._ç9åëU.|Šjƒ?µÕº´oß¾ABÖŽyíŸó™$àŸYHRþq©Ñg8¥rµÙaj¨âñ'©²¬ZÜ0YªÅø£8Tãëºäéüò´þ…0æ¾,Áuýµr!DÅ_¬/µ½%&h;Ÿ†I¶ÛhÜ:4Æk›6…ëš6£¨ÿ¸´ endstream endobj 131 0 obj 15288 endobj 49 0 obj <> endobj 132 0 obj <> endobj 32 0 obj <> endobj 133 0 obj <> endobj 14 0 obj <> endobj 134 0 obj <> endobj 35 0 obj <> endobj 17 0 obj <> endobj 135 0 obj <> endobj 38 0 obj <> endobj 136 0 obj <> endobj 20 0 obj <> endobj 137 0 obj <> endobj 2 0 obj <>endobj xref 0 138 0000000000 65535 f 0000059929 00000 n 0000309447 00000 n 0000059780 00000 n 0000057408 00000 n 0000000015 00000 n 0000003797 00000 n 0000070930 00000 n 0000070782 00000 n 0000059977 00000 n 0000061662 00000 n 0000060059 00000 n 0000286162 00000 n 0000285943 00000 n 0000304090 00000 n 0000266126 00000 n 0000265911 00000 n 0000305513 00000 n 0000245603 00000 n 0000245387 00000 n 0000308090 00000 n 0000070634 00000 n 0000070666 00000 n 0000070696 00000 n 0000070728 00000 n 0000057619 00000 n 0000003817 00000 n 0000014555 00000 n 0000072680 00000 n 0000071077 00000 n 0000228909 00000 n 0000228681 00000 n 0000302810 00000 n 0000189153 00000 n 0000188951 00000 n 0000305367 00000 n 0000207184 00000 n 0000206965 00000 n 0000306836 00000 n 0000081652 00000 n 0000081684 00000 n 0000081716 00000 n 0000057814 00000 n 0000014577 00000 n 0000018601 00000 n 0000083406 00000 n 0000081803 00000 n 0000191674 00000 n 0000191460 00000 n 0000301560 00000 n 0000092378 00000 n 0000092410 00000 n 0000092442 00000 n 0000058009 00000 n 0000018622 00000 n 0000024794 00000 n 0000094121 00000 n 0000092518 00000 n 0000103093 00000 n 0000103125 00000 n 0000103157 00000 n 0000058204 00000 n 0000024815 00000 n 0000029011 00000 n 0000104836 00000 n 0000103233 00000 n 0000113808 00000 n 0000113840 00000 n 0000113872 00000 n 0000058399 00000 n 0000029032 00000 n 0000034052 00000 n 0000115551 00000 n 0000113948 00000 n 0000124523 00000 n 0000124555 00000 n 0000124587 00000 n 0000058594 00000 n 0000034073 00000 n 0000036984 00000 n 0000126266 00000 n 0000124663 00000 n 0000135238 00000 n 0000135270 00000 n 0000135302 00000 n 0000058789 00000 n 0000037005 00000 n 0000041587 00000 n 0000136970 00000 n 0000135367 00000 n 0000145942 00000 n 0000145974 00000 n 0000146006 00000 n 0000058984 00000 n 0000041608 00000 n 0000046623 00000 n 0000147685 00000 n 0000146082 00000 n 0000156657 00000 n 0000156689 00000 n 0000156721 00000 n 0000059180 00000 n 0000046644 00000 n 0000050507 00000 n 0000158402 00000 n 0000156798 00000 n 0000167376 00000 n 0000167411 00000 n 0000167446 00000 n 0000059380 00000 n 0000050529 00000 n 0000055217 00000 n 0000169127 00000 n 0000167523 00000 n 0000178101 00000 n 0000178136 00000 n 0000178171 00000 n 0000059580 00000 n 0000055239 00000 n 0000057386 00000 n 0000179841 00000 n 0000178237 00000 n 0000188815 00000 n 0000188850 00000 n 0000188885 00000 n 0000191438 00000 n 0000206942 00000 n 0000228658 00000 n 0000245364 00000 n 0000265888 00000 n 0000285920 00000 n 0000301537 00000 n 0000302734 00000 n 0000303998 00000 n 0000305268 00000 n 0000306689 00000 n 0000308007 00000 n 0000309262 00000 n trailer << /Size 138 /Root 1 0 R /Info 2 0 R >> startxref 309673 %%EOF Node-path: powersupply/itest/Bilt/trunk/libMagnet_V110/Manuel_esrf_maintenace_ed2.pdf Node-kind: file Node-action: add Prop-content-length: 36 Text-content-length: 260751 Text-content-md5: 188e68083c15fb6ced1336a7e0ea6a11 Content-length: 260787 K 14 svn:executable V 1 * PROPS-END %PDF-1.3 %Çì¢ 5 0 obj <> stream xœí[sÔ6Çß÷Sø úG7Kòc)i›)°}î@.6HB§|ãò-*[Ö®´çÈ« b’ÃÎdv~èrt$K]¬ýX±š‹ŠuŸðåð|öq¶{ÐVï®g+ÅDÛc¥MÝTJX÷WsÓÖÚtAw8«ž_Î^ÍX­Z[%«ßPú·K×Ö²û×'?<¯žÍ»TUÅYÍD5?qi´m«™7WBñZèÊX^7¶šŸÏžþñÃü¯™©V» ó£ÙÓ›ÉZj.Õ€N;$j+x_Òydg& e4ç¹îHSk%DHêGb%?Æ%ÏçwÙ!]3íÊ0  ¸*Ø^Ž`¼ãÁ»´¡‚>ƒžÙ‡e~m˜È•YeÍBl¸€–"fˆˆkÎ;dëVÉF§ÈZÙÈl]\@ÛoíÀ3PhÄP¤8o ‚IåMˆ}€¥ALøC]ù&Ù2Þ4›ð‰'б6ÄÛó©»gP·¿:„:›¶ÐÏ Os³x˜›¾ˆfí:Õ?Ì¿û*6Z6+ÎtnZ<ÌC»g²±© bt #åmç!ÔŸ0ñ¢Þêf–ë€N¼Ó•å*Ÿzߊ[×9I£óE<…–"¥¾"¶#ñB†VÈ`Ãa‘F¼¥us>”ÑbÑEÖÞxƸXy¼âˆHZC©5ãjµm[ÎW:ÒØƒyTñŽ“/‹Pê "îÖÔŠj‡‹NtÿÁa+ˆva¾ Vp.bZRÛOÛ‡r†\ º/}3h]÷’oÃïŠ:Ħµ C™íÍ«W3^uŸNâ„oE²ÆT®ÔËnPÝ ×²ÓUƸu)i¸ó¯X t7C¯Ï„ ã©ï€Z+Xðø™/S‚©•P‚·¡_¾ö]5³K]ðÆwJŒI]c”Ö%ŒØ÷7~³© PuÜʈŸëÖU¨b"®+묗¢ÉGìUk°Œ©PÉûËÆr|CÍ!B’?öÎi­L%Ej*±Ì÷ˆ£OaÄkX Gs5æè³¢J;„ÅFL iEMîØ÷$ÒM ܳ㺔Úôü=tÚç…¤Ó‰¾IÛJ¨!C¼+3)L¾œ7Þ­*_•Wõã1wþgš¯Ô[TÌE£N§ˆ{ÒšD ý=ƒTÈ'!b{Y3|[À|^ê8Bµz¡Æ"M§ÓZ3ôfvƒ€ûëÄgß™Í}ÙŒ•ÖÄ®óB>dõ†›kܦ‰kÔO dê‚8ÔLëæx ’–oªvCŠÎ[?´=©_iCqZÿÁˆWþAw]¬ZgêîpîÑø‘:\¹ ¨è=©‚à%¾ìÌíBýâ³ÖνÁæ/Ë’…¶sÓB9-ÁM\2'_L†Û5ûtZägÎMì¸Ý@ô¦uísÔKKkXDB„"Dˆ¡;Dš =Qô™z¨_ŒÜQš»™D[ípYÛž— g¤ÊËäõJå5¢’‡…ØXq¿‡É¨dÍåÊêW¬Ë‘䑈Ÿ|¨n2¬w›|òH±‡o¡¤IVAÖÌ=¶†æéò‰¬] •7ë ¦Ž $â¤zB„=f4µ‘”Ð#E¼an]A Šd(6"Õ.aÞ•± u CHH‘$$!B„"ô5h 6Üß\më:SÂPHZýé)SË@ìhˆ¶BtÚE¥bQ`ÿˆAº+C$GÄúásw¾&H·å9g3"ÔŸ–Éy¤Œˆ’F"î­Öí}Ö§Ø1H“#ÞB"†£ÇËeWÄNx$£lZ€$5¼ÌÐ Z{F wîТ Ž™T'Aè;DS[ ôHÑ#o˜[WGêvêÇÃÈgy+ò)Âq‘/á!&­HÑš=Ud$?‚(o½e¼’ud„X¼Éô¥_B îhÍrRý;!B„"uý] GîÂ~fG]sÞŒëÀ²…™í)¼·0?Dá!«"ÈŠNÙÊÖ`—Q¼mòvåuàš½ØŸ<ò^Ïš=bÄ…HòˆŠýššÓºk]¸‘'Ö˜J+R„"ô`ÑÔ„©Àí¨À²]Ð_;”ž¶û #~(ÒÈ1=$GäEç²´õ@dkQ‹ˆ’Nµïìåw×È­ š¢]Ö}*~©#¨&+é&B„"4q45EDjôþP¿•\¦FËvÃÖj$œÊO ¼B´!òöÄ'ˆò·ú`‡Øà­>‘¨¼õ9½ÖÝb¹8(ÈXTnSÙ–~D”:‚×#ÎAª1¹v)_A…ëÍZ¨‘•Ñàè±¶‹ Ø…& 'BD& r“èý„"!EBj;H{!ù==´•Êör·¾_¢ ö«Ó]گݯ^³K‹Ô6RCÈAÌo±_½Ö…ÛÔ§ÈÝ9eÇFrŒZô¤B4x"DZŠ´Ô–´Ô!€\‚œ‹£e£–)ä*›²=rD{޼€Kʆ!B„6@S°áþ&-ƒº*ÙòkŠÄÈó¥ÐñYoÈ ˆ©R+[ÊŸIC~|£ÑÜæoˆ€×AäUÀÝ‘¿g8~M¶lÝñ)r¨ÑVÈýoe7#7ÎmôrýÆ !B„z(ˆ–õnú&-»žH”ýž8æ3²´é ge—±!'ç,Dee&Dˆ!B„º[ôm3|ð‚µìZpmîEÒ-ÁüÏ‚­9ãUv¹îFÛžã¯àëÜJ3rf ‘Û0õ²£a·Þ./Z÷í_ë°5SrĤ5 s€¶¨5 ¶#;ö0TÙº9,ÏÈ{΋X`N5µŽ‹!B„¦§7&aÄ=kª½yõjÖ}þzÿÓ`endstream endobj 6 0 obj 2113 endobj 26 0 obj <> stream xœí][¯·uF_ϯØoqŠžïäô-NÜ­ÈÒ zA€@‘,Ùé9Ǻ&ο5úõ9? äpÈáåã g{b(ŽÛ³D..®ûZäÌ~u"e'âþ„ÿxzwõêêÕI6NÏBéAž3öŸŠêqPÚyðˆ™Ó¯¾½úòŠ b4§ìŸ§‡Ðÿ±xÍÀÝÿ&Ôé?½;}zc±Rq¢d ìtóÜâÇQO=1A¦NÚÐAšÓÍÝÕ'¿ùùÍ®ôÀ3ʹyvõÉ[âW”‹ô±Á0:mÑn=HJt>J+JgÈ‘ƒŒTOóØ­ ªÀöÇ3H1F=š•M13Πq `Í2³œü@jÌÊ:1󯽈µâ²`¦eS4æYÆÖ&¥ÉY‚¾ª'Îû¥aÔïêQ`â›4qX ÄP@Ï=Ó…¡¢}ÒâÑ:'®U{‹ßÔ”‚]¿­´ƒyaAÃx áiV¸•àzV¯Èü(­Xt‘ƒ'žÊ óJ'\ó®¡¢ÔmCiáHS¶A}Fß7±å,Ü1ñš90ÃN×”¹Èïþ‚Ö5èA½.©Üš˜ï”Ôú3N£¬Óà1è>ôj0Z÷ÒÖá]N°ƒÕ¸Ô£´}vsúòŠžÜ—â„ÿêMk¬ã6‰' iT–s'MÌ |VsòÞEjÝ4FD•©½„ &0ý_ÈÊS @ïcÜŒüÞ;!#aù¨ýkÏON˜Ô)×óQ·5ßÔ ·žÅ\°(y°â›9dèe ›2.)c:1é sFÙÎåí–SœÂ2–ŽY õúËÓ]øN¦»ðid¡t£X"í<Ê.(ŠBÌ&KŽuC¨æ»}4‡H£PB8&Lv³zE^ƒÂ(›KŒíOg<*Uêì‰_{"4c1 έo¢a¯k\€…­mœf47›œÔg]¸ÀÄOkü¼–cÐTÆY âÆË‘ÎW¤ý²‹.Àœ9Í• c>Ñš|Y¹Ø4QµÙ¬m>¤ÛûyW«ê}—ü®§õ~¾­ísbÄTNæµEzWoè¾&x„§5sžÔ†¸ põ¹‰çUâÊ9ÑG*p„}–pý±\€®ÍRlEKzÓ㆓ú¥7=ekË—ðÇ_?múZØ FRn)>˜Ô©¥Ôþ¹fÆÙÖ Èm¢Þ'ÐÃ>Ý”‚84È»/@þÇdÝÔ NìÚ€¬?yÝ‘f©Pg²´ ãÊ®Û[L=_Ë®r=A`²¾dz6ô¢Çdfs·N›¶ÕN®óïëM¿ªe "pÑÀ£íCÏ¢] æÙöÓ— âÁŠßÕt…²_Q¶¢ôŸÕi  ¨Pœ>-yYË$L»2­ÄwÝcžª²õ³SÚk!õ`l¹D«ç5®JçuÍì¾\¡Ì7œ!ÒëZJ‰‹‰9Ÿ¥y¯[i_ôÌn•Àeâœ/Ù#°o Õ@ÇÀAÚ¼²¡„ˆ¾põ´Ö PáýosC©wª`jŸWëó¿íýldÍ}Dœ]e‚Dè%Ð’ß×ýK-3`/mךnûŸjê϶—vý°‘Óö¹|`/íI*jt:1Ó} äØºû¼ÐÙµPò¾4`_ZƒÖFм‚º#Ž$^ÐéŒÕ‰Äwl}³SÖÏöÀaÐÝפè#âlOÔP&Ñ‚‰}™ìÙM0°"¬­9ÀÉ€²¥ÏW\ Yhs"͆ý´âƒGœÍükÆÕ ¥>]óÑ2#¥*­·3´GÕ‘;õ ÊÛ<¯ëM?­qMùŠ8[ M-ÆIoêÖ»r=@&@¶¢¶2"ëPm’ð¾¡FXAJw°™`Ì ²Àðˆ‘ TÑX«¹¦£ÛÓ˜_z¾¤Eà×µ=©ÕýU3¦n´"ûüÀN@%ú¶õEÞV8¯ÆÞÖDtµQÚ¨’y€PÕå…·›eKÔ ±õ5ÀIW»¯†ZLë9Ïi˜àzÅ}ß×DÊ Fí8+È%»++Ý0ªpáe½ë¸ÚÇÂ'uXéc! â·ŸÔY`ˆdßµ -Y8ÀC ¢v‚žñÛŸ×äs<•§q97þ‚=iáNƥЃžNÆÿÁnœ£, ÎCúŽ¢@ß´8ú*œÖAnqt¤m4/ú’H@è1ƒ õ¥Ó»ûóðŸÕèÏnÇwŸœkϧßié îiÜÔ ž5|ɉŒ6#Ðd?0ed]ùÓßaÊØ:;N‘¿ð¦Ø¸’å?4a¬&f£tw“Ä.c¡à¯{BAŸIï§ ¤š0gãÒÆ"?èKºÃêòHu³1R¾ôlHlèû.B+î¸íñÑeÏ›Œâ¡¿yn‘”X타¼ï&Ô†>η…!ÔòÆËÜˉÙd¾x_K ØDß•›€û[;š±IÉ-9­ÒdÆæ$NøÏ]~ËÈgñ½Sµåk¡ˆ kcÒöúÑ:4ÉKÀÖ²›°ã&È&©@oûeAz°ëÜé"Añ®æýÙGd훥©F}Qæj7% îsË}[îï’.”Ç;N 6'"€6·{mG•–R&^xz"¾ ®ï„ø×ÖU˜ÄÕõÞHWšß-£„˜Ò'$Œ,k_uHÙÒ5àÑV"^_f™êF~*ø°ˆy "Û/cû€@Xé4¯çÔIBXÜôK n‡ü¥?­·-¿aRª4L‚5Z7¹À!/ô"MÀ4°bß®ž×tõÉÓßJeA_Z±#·Ùô”gç6À¶ú&ÍtõÅØ¾»+ µB_êtIN5ßë ¨*p }Þ;ôÊ—N¢Ý›‰®“ÈÜÇ íû;‰¼˜W•—sX0 ôЪnÜý&ôؾ«A-W€P'u  z~'-m›>öÓì•Õìy™†Èy”6LúYYWŽ«}w:%5\,N:Ö`âÜÎMž€§¯kK½oNì»À›îñM½â»Z ñ p}ê%”¾¶ð¹•´$p-±qèD¹åfzè“tè´Œ>°¼ùñ„Ð 5Û¾¯=û%‹ U[W6Ï.»nñÜè× Àír.¬øûzT;²«½†³ãûº•À\ZÔfaк vÑÖFŒ62IPyËuCßM= ²¾„P¿ë¬¥§‡eÉÆî¾—mÛ‡Gëïv%âd] b‘½«Žh—ÏÑÄ@ †ÐúëVm6ö¼’™ÛGû%гÏóR¦íêú[+2ÅWv6úsm\䤂/Ì—NˆàaÐÃZŒ@f=a(ïÏIâèÛrík2*¨ÕëÛ<˜Üq&x޾MÛ>ûà¸ÿ`æI6´èAå‚€TüDE?Pj¹zƒó‡ööª«Ÿçœ—÷/Ó &TÓ‡Àò‹Ìûr¬sßÛ  ÈXPß…–³Û.}3`+¯ã®'l•Ë;;¸dûú}“€7?ºÌŠò‚®ÛŽ{Ø×–Ƀæé úT ”^`Ù?×Ë®ì}·L^ÖèAz æ+Eè­29] Îõ¹0PO>›&6o焼#–‚âØˆÉ`⎫ ›Ü ¶½rðÚõa›êC@ºp×W^´²×Übâ!_Rr´ßžŠg½×LÛÕ¨¿ëèý˾O­_½mWÑû¿Êô¬ž„Ñw=våíÆ$M;ûuìÿkædû?£Ò2X@{ï§•uëlÄ„vîÃÎËñD•s0]±ïÛ³ßÆw¿À ¯ uÞ‘O<à|¯ë^RÚÀM€÷Dæ¯k¥çÍj+•Fø*W\nr‚ÓÇ5É Ü—ÈGG›û°&=}sÅ„­Ù¹$r°»¸»ÒZħÛéIpEü“ ‚—ËØ ÑíÕó¼b§?Ù%þÍþÿ‡-óøj$îÈ}¨)aÊ}n½,ãslÓ6Ž]àñuP]ÐW3jœÂhñ˜ OÑM8v»%s• tF‘ò1œ#ó8tÇWŒ(“ã/¦äugüš‰’æ½5¾ˆÝˆ0é õ” ©9¤öfʾÈã+>r1‹kÎ’Óc¯Ë(M›8vÇ»¾^ìZ¨Sõä¾­7J÷=çÍ©û¸»¥ÂZ'[š¨Ä¦*rùlðWf]híaÒC 0`¾Ü"§’²1 O®e$YüìðÃy²’,~fõ7`œÏ˯Å0JFlÏlx”KžÝ± È6½ÕlñEŒ{·m˜×ùµk´ä2»ÈT¬ób† ²|\ùŒû Œ{ëaLšŸ 0$4î%÷W»õ0j$É«‰‚¾d2]˜¼–ƒ¶ªn¹Ålá'÷ÉEz€±†\U³ÉQ¹Ð–Ã_Õ}ß)@$„73>-©+ŒxÚ©hî;0÷5à‹7#˜Æù”ˆ[¯«b~2?ÝÙJá¸üc›!š}ý1¨­ƒ¤ÎßFÌ!)‰#ê,…N6–))JŸ8¾È~OË,ÊÁØ4’Ø9þ#õ´³sA‚î…Õ„°LÉ‘zÞ}….Ã?éªRþ±6ÿ¤0ù¶*«](I!`™’#õüû ]†f:­MøÇÛüÓRæÛªh¬va²’Í?.Ãs„žw‡/r¾1¢‡Œm¢í£©æÙŽlö>f@™G×€eJŽÔ{ì²ÐeØgÍ6W;Õæ7$ßVEcµ aDõ¸ ÏzÞ¾ÈeøfÍ5c›n³Mš4~—äÄWeÙ X&¤è<Ë]à"ìâÎJ³è`ÚüÒ£N·SÑWí ìçÀ2%Eéyvø"—á›ÍJ¤Iù6¶£Â¨D²¥Òûæ¾¹v@¥‹ÊÐùˆpè—1KË/•ñK6ùÅ É\-ÑRæœRR=ÆáBßã8|‘Ë虹;kÝvÁœtÍðe‹%ÅÅ~¸ýWù¸ NQy†ü2œs¿Ê6X×.%ÜéLº»‚àb;’‰êqœ¢ò¬; ùEX'ˆp>ZgÝTE¬ôçF10kðlúמÝO­#:Zÿ:Z‚M-÷ ¶ŸÚŒc¡üwÊȸûDí@ÆM©¤wIíØJJ*Ez%•®ýHåŒCÚÔ+)v¤ld×f…¾FC ÷Û‰//Üsá¼5Ï+óX&¤è|°8tË 6|#^´»&6ÑJi¾k–BËÓ”]Y3ÁÕ‡/òØn•žšQ¢‹r$(ðŠÇ,IRù&Ž]à2s\÷³Ê6̸¶ãVàÿÉ›ý-¼YLˆ»®àâŽ8.hJŠvKêCgGIêÌ aòšœÐñD•6s¹*Goý#c"º»ôQ<.ƒ3TÎîû¬ÝÝ~‹¾_‘ð#ÂÜýº0;Y &5º› xòþ<{qtºé•hº3OŠïX¹[c)‡óAã¦ß(޲f5(|U-]ña…MlŸ%Z¾¹'µÝ)ÎÀm02ŠPË#,S ¤ssâC,t™2Ûúy«yó¯+ÜÅÛÇÚÐx[ï> ±|;ÂýÐtqý¼úÚHŽë]kº›i¬XˇOÝ/²×íu·4oÝ[º•Å¥ë”T€,|b;yj'FT»–’-Øf£·Ï<ÜF€² XâŠÇ8¼@ÎD^ä2 D&a½ŒUoŸbN—am¶Cxô óeXðYÎ˰ èA-öÖeØ|Ô×µîµ~<*× ¡@ßnz'# §1nk/Rûˆ§H3ïtìB—ôNVwØGàÀ/Sœï²}Þ)HLóB fÀm­µÔg@œR ÍôíØ….£oÔý¸³©’ùô­Õ0¿” öá_×Jjs[—Ëj¯#sEyx¾Ÿ™ËOüÕ­$,32„?89¦T £ÍM(†÷åÆK¦ºH:†»—Õ Ó}©q‚ÍlçÆîò’³&ã[£ÔÞºŒgóül¤ lg¢zŒ£3dñÂÕQè/sMˆMÂŒÒpÞñy­¶Àìö™~‚ë]+˜>ã¼Ì ê_bª’ŠÍW× =±j°o€,Zu2³k¼ÄfyÞU➟GÉ»x\´!E–h×1è/ª]6‘QƒvõýTV§vdçh×,Ï»JÜþÙVÖ©¼‹ÇDRd‰vƒþ¢Ú%Üïî~Úµ3IY×®µŒjUÆñ2–Ó–­Öp•޳å´ý{oo*û÷"4ãìl÷·L,µw<_ÛÖ"É`ÜÊy/Og™MpgÉ'ø¢_Ùìƒ î¾hA¦!c<òE½°åö|Z¤SxV¢Y¡¿˜ ž¯q–ÐÈ´îЬµLåVãá1ì7i´ñéДp\¢„Äd}¤sÁ3Á}°% wwžF¿çÀölø|–ùšß„[Âω‹X¾Yœ”Óhˆé„™NãÊË‘ÅÖÉ”~ކDi—t:y2¤=7_É *Ý_*meaˆú1ï1BÂÎó 3•£ãïH áKmEÛTŽŽJ¨¤37E4èÔAa,Ä-{HSŒ4•:U9w0Mhq ã¨eÔI[æÙ¿g*è$<'¥A­¤ši|“.ÞØPÉ6­Õùê@©€€ ¯—¾¬L‡ÏvCTp ‘Eˆ4.â²vã½;‰4jæ1¨„ÊL\•j¦2ŸœJW+Õ¦“RŸÂè@§ž5ê¥_V$ÐÉÝpÃ#•Æ«ˆ\*ì8Sé,> stream xœÕ]KŽ·F¶sŠÞE<-¾šÍöƈl"Ç’=ÉÊ@0š‘%ÒȲH®ákøYä*AVR9CØöOv}ì®æü#$`ŒjÈb±Xo[¯+QKU‰þOøáâåÉë“וªþnl[7•QÎÿßʶ«mÛ¹óiª¯^<:µé\•ü¿ú-„þÅãuµîÿPÇ?_¼¬îžy¬ÒTRÔBUgO=Ž®ë¬é’•2²V¶j¬W½<¹õûÛg>ik%”³~ÈÙåÉ­·=H×ÚJm&Ðó¤j§ä°ÅôbµBŠ6ÕZ)'È›ÒÔÖ(P F)µXOH-óë½êA¶Öïa] é” ´W„„K:ïÉD‚;ÐPÑïRÎܧ{~@i8›@~Ï&K áŠR Ⱥ k^ö WwF769§=‹+J{1_MBÁvÎ)ˆ¢Ê“ ú‘îðŽŽúiÉNȦٳÁ_#DæÝ±{´íßO «lõÝ$lV¹n}݃‚67³27ƒˆ•Ùzƒbeþf<âÖêfÁLϦY™§3ö:Ù¸”1è 8í·3R†Q¤£ÀÄ74pØÔÂI@OG¦'Mû Å7Nºµù->§”‚]¿% ÚÁ¼° S:ÐpÁâà ·"\—tE5Žj­šMd=/„T õŠ'\Ó®­f)ÛNÊ…!9˜ñ&Þ0zÞDJY¸câ©M­œªN¥ê=ÿ IØPк® œ›˜îTPùé†QÞhèÙé>Å óæ%/ÃÏXF°CS\w訶Ý;«ȪÿÓ‡8á'NX£U%Ud'+Øú¿ºªU&D4Õ!| Û³ nê2³Ynu*!ñ¨£¥ÖJÇÉv6Œ9›jaíÚ4­×´x•‰°¹Fšî„wÛ›k›Å²ùÍ)5_%N›ë<ÿ»x{ñ~ÏG€1Ò¢Ÿ-Ǿ«‹ézª‘ûztsüiz<*RÜõ!ïµzS÷½Ì«%o`UxEÐOÑÌ“‚À (fò”œWü§éþ1ïËX»âV”|:Îó=±$òî7xêTkÚöFúºRvß[ðÌ]¡ÁP*r¯@P¶ß»ž_X£¾`Y°=iÑZI¨nj÷ÿ˜„Ž~²‡Qf¨t—úJâ Õ2xõ=^OTqã ¯ù{¥›¡¸Ž@{È6¼ °3@I®Û]^+¹!+yÝÎÌýáU^|7|â®ËxP¬<ÊC ¢üVßdñâyómý±¾äZSåÈóf£çœÙÿ΋¬ýº—ÜJK$Ž÷”à³ÉMvµ’jÌIm, òÞˆ$yïx/EŠÛ¸itÝÇ1 ùÇûÍÚ1Ó3- ñJÓ¬¾@pé³r¾jûBj!欗¿L@"r3õ Ì ï H ïUû¾û’ÂWÚg_܉Ž ôðQ@×?©|ç©_¯5}Ç?)zß>,ó æ<&~FBCùu²x Þ›i^Ë^.Ø,ÍF‰àVžÑó†C‡•0„÷,±X©ÞLnÕçù­ÚÝèÍ…s›]ó¶"ã1„5ãGºüÑÍG>¹7ö³7Êx½:ÜÆŒXaõácøZ[*©ã5GP £zvˆDêÓ‰oX¸¸œ1"¹×MAï(èíA”l~â½ABè´ä’rârÕ:Ý%FNŒ7ôô õÉ'ŽRN\PP@oõ v€ê=M£œÓ³~^Ñ3{{úü‚—”ଇJˆ”µ5óÞý¬(Åè§—*«¯2¡k;1ç;=Çü\H±I_ à0 ¸á,³¸’¼«gl#‚¸@£C.Áßzõ`Pwåµ€ð‚}°¢šV´Ê0.>o抨ØÃ=£œÏ_ƒ€ç7ßGÈ—›ÝJ8¹ãáÖæÕ%¯Í›÷©¸Í›GWñËK^ Ðón’€Å)Î'ŽYžäÅ…9pj´©Û&î ‚ÁËÀyoˆÀ™€á©nkÕ6zøÂÝH¸Ä:[úR¸·üŽá¾¥Ó¦éáQÿYÔ•R¯¥°øKfû|íª.Üp©žwÑVüÞ'÷°5©øSr¥_BÒ¸Ãw…é5kÞa¢Ïš¬wéÓ¯î{P³û kñ×1v8÷M«wî ­|ùç÷¸ßßóú¬v¼·ÝÔY^LsìWƼkñÁWÙt°m±à³Ž+áIÄl^ƒXñMŸ(ïfÀ‘¢¤j £ŽYiæ•æx,ÜgŠÖ;¿ÁD°¡6E,Ÿy[ß)ý+xà}ü†Çˆ»T A«ha"¡@Î{Pü–”GOÿbþ',þWÿˆ.à’yg}ÃIp SÖãóžžáëয[i§ºÕ²Ù=­ru*½R›X¯|šÜtã˃»’´fžÁŸë¥Hù7ìWƒ\âµ!º³µcËÃatqåè†Sû}_[=FóÖ>y(ÍÄËba†v ÿó_±=wendstream endobj 44 0 obj 3345 endobj 57 0 obj <> stream xœÍZÛr5}߯ÐI;Ñ}4<@H*PE’…§TQÆv‚ÃÚŽ;À7ñ |Qø ¤ÑhFã>Zk'—Â.»¼m©Õ×Ó==º`¼’ñðþ8<]]¬.˜æ²ë?kÛ6†iéüo+Ú®±mXsç‰éØ·ç«Ç+ÞèαÙoö=¤þîùºF…¯žuþ÷á)»»ñ\…f‚7\²ÍsÏ£ë:Ë£\‚I-iYëDcÛœ®nýt{órÕ6’Kgý’ÍÑêÖe ©FY¡ô@: $Ù8)ziI-¼¯j­åM ˜Æj)«ƒH2RÊkçq¡Dù¼ó@² ·^‡tIÂIdgD„#ºïxÁM20zà]j™‡TçGT†Í@ò:ë¢X@†3*)ën¦9 $×tZ;'9§Œ*úâŒÊ¾Ø€[¢4¨s@I”UY„lÑ+ª ኮzC²ã˜}ü,R4ç]Úw/r÷9h“ÙŸ$+mZõd6+]7îRÊf3&³éq OfëE÷ÉüCtqk•¹fLo¦1™ûœ4nn‚œtL7úvZˆ´êº l|CI½…uð‰ô<];¡ËÜû(î<8©Ö–U<¡’­/É@v°/è¤J2VÙa‡µ2^GôDWµVŽÙDá9òZzå¯AkË…¾ÛNˆk@š[°LªÛø‘Ù×m$¤¹ ÷ظ–Ü4ÒI¶2TþðA¬)é=—S—6Î5å4~º~• 5Ýct^Ê1ü¢ €94åu‡®jéÞ†=^ ¾C‹“þªmkug¯(éxÒ¢Ë îË“óh‰Y«rõcçjöâ5T1©UÛå΋]÷µ’•‹z@Ùo‡*&….KzDYGVžÚ Ã%%öÿF^ E[Þ˜º*+ÆÀ>ž¢_–ÙRöçT!`®çôD ã ºñŠ’€ßQ¹€ô â€ôu'ö@Ç:ãÒXNöªcH‹í˜° ]e)‰/%-@Î<ÓÞ ˆëD—âþÙ-j G™þÉE ¥Öv…tâdú:˜>Û_–DÉ;zâ ¼±Â%ÿ?»=˜Ë?AìH> ~¤-¹ Ûw˜¢déµÖ­Ïeí»JÕ¸žþ3­k}al}ƒ—K#¸ŒX+­êØZ¶¦Ÿ ¡3@íÙ£˜Îê‹þXéUm… ºúæ¦ÿÇ×TY`ã-u!®\IòUÀ9 <8DH9¥´¦b@Ô/ãÆVÊ1ŽîW‘¯ˆ-¸f¨Ì ˜Õ{©RÍî€f(„u ‚¸ o]Q¼€ A=[Œ Ã4IpînÊ®ù‰åF+ßX×qÔÙkK-òj1ûÅu ÈU €U^yû ¢°%?¤Úæ@=/ ÓŸXVÅ•“sÒ'Öd 95G´]Úû!g¿Ü«ëTÎbG`Bçc³Ž¨š&Ð)^ÅUy'Z‡­2ëžÀêªÌçôÄ)=È\P#U£f:§•)çr4ý­œG»ŸÊÿ¦ì÷ë£$ò:Qÿ¡:Ö… ¨‘‹;·Tm P]Ãä@ ؃ òñ¢êĺ*'ò N{ßÁÆ Ó¨÷lÌýX§P9LrQë ¬ª*Õ± Pš¥BK„˜˜u}k­üS]^ÄþOÃÓ|ã8XØ=’Ø]ý‚N*™6Óð|”ñ(®’VvI°ô@î|ûTf_†ÍºÔºà „Oñ`ö†uõ¼Žؘ¶;[?“劵»e¬ËÒº¹ˆ^àŒºöÈHuøN‹¥²sã çS²õ MxÕÚ è1äÇ4ËuùäSjcnT!òhZ';zVÚgæ˜Ê&xÁ±×ÃLÎ~±ôÀ`\÷îjqÑ¢ÖAN]û‘ñ!h þ¬âU÷2îÓ<éLs\t;ÞLw¯ÚDú†äá¾D>UM5:ë zlêo4HöÇJ°ïüÏKÿs²’Úk-•°áªçéÊx.éÓ¶ÿäSÑ4"|ò}Q¸JÓú³íêiÍ]‰–y…²«.½4o…¯bÌÛ­¿ z:Œ™ãûú¤×ý©Ÿø®û+-[‡ÛSÑnJà”“ˆœ2 ×á~׊­¥È“”äÚ:Ñ™r Få%ã=Ç«©Æ_›Éä«É/Jg|Euô67ܺLI>úüÂûÌðhÖÖGŽëSÆññv¯ñvoøþ*¿V†endstream endobj 58 0 obj 1834 endobj 66 0 obj <> stream xœíY’ݶñNñþb§<‚ ¨ªDeÙrE±kÛ¶+5ÖH²ÍhW’kľEŽËä3òwغ٠>ðÍGRÉ*«Äf£Ùhô†ÆòžnD#ÕFŒâ?îž<=xºÑB Ó³6}Óm´²îo#û¡1ýˆsé¶±›OÜ:ìý½ùœ…þÅѵM;þ7‘†ÿ¾{º¹zä¨J½‘¢jstßцÁÏ—Ü(-e6½•Mg7G§|ùáÑŸúF eC9:9øàÅj›ÖÈVÐä«äÔÅôȃz!E±z#e€<!]c´R‘Ô±uJ©Ù÷„leù{Gi„q} 3’VéÈû†°pBÛÝ ,ØÌÆ~ð*•ÌuÚ甇£r}ÖE¶Î(§ [wiCF4§#È6ƒn;ƒAÖ¶][‹3ÊûÎ|D:Í0Êt瘂(©2 é í ÃÂKŠõÌ«ä d×­éà¯AÑš»dÌÝä 1çPôdÌðCÜ›¶› Ó‰)scg“Å"€ {´aèï ¥ŒX¢XLÃç4IX7ÂJA÷½Ðµ•ºL}ÒâÁ9§¶7å.>¤œ2½~A>Èðδ‹´ª<Ü­’´­úEå±z£’‹l<óBH53/Ø¡zm„ÔsݶRÎ)”`T×ð‚É×5$ , •èeÕæPª1ò/$`MA—èwàRCÜSAõg˜°œÓhSнéÕ`pêœ#ŽŽÒºD±útíhsë@nÆ?cŠÿU•Öô©€ ^°3Nj›^èÆz'xûÒÁ¶ªÇÝhµ’Ñ»>÷þÇX9(ªÑS³v£,#­@DøÁ' F‹‚Æ,̦0sLž¥@ÐÇ/ž¤pÑÏBK'S¨«ã>Ä™^©ä+?ñ¢³9BÜôòjS³ëžx¯åЕ‰? ÝyMÅÌôð5•é3Úð¡ÿ☄Fe|Ji½¤=¼GÉ×I뤊<Ó0’ÏÌÿÝó0èœQ<§B Žx02eÿ¡C•KhaÊ Á°u•ÚÁuÂé ¯B·±ÙTu™1‹8ö@•_ä¨ß¯ FµÛ\Ð#7¹èÊLìì s-Û9Ô£:ò(÷ «LCÆ%ÕùŸ—Ä|1ðå ºÌÃ?é¬#ª¦Œ.¶à(j—K+] n»Mí¬™ Á0°û¯té¶!a6ÚÀç Z4¦uêvغdrÝîyƒlXRJ·ýP]8¤uBAeî­Ã‚@™>>)†hìL·™ qŸ:Ùrha4ŽéãΡ…¡µÅ‡?¢¬†)¦"•%Ž)_LCÆÆÉ”h­*÷‘Q€8sÊöÏð@‘Êqc‹ß`ìœÑÁŽÒÒ4PÐå4e«·žh7Çî6ÒNðýæô@v} @x@jž8øzsv 6u9ïïÝÿ.;Ü<™°vñÑ—ˆþ‰ ÙÍøÐÚZ€Edj%ãg1uCxXìÂø5Ùu¸0ðHþà} !Œk¤™Dd Óï= =X,ÊH$2ÆD¾$ì€;™DÂð$ÀûHBàŽD !`Gàû@Â% ˜‹È$†'Þ0‰È$†'ÞÚ(Ü‘È$†'Þ­i1I$ O¼$”јDd Óï 1HL"2‰„áI€÷‘„›k"Y 1‰üÞ“hÙ#HdŒ‰|Hôkgd Óï³KkM7$NZx=tiù¹Æ¥9l‹Ù €™KË|L>,s{äÒê™ð¢H\xQÌx˜{wíR_àTÇ'Ùu¸éy_×Þý%uØêP¡³Œ~/k#ôƒÞ¥I %ÐÅyo¥ÑÛì½¢#’ð­€”{…)gŸã݇Eo³;‰žRΞ½Bm³ðöÜ¢·Ù¾½© ô6›n´BøÝl•ÑÀÀ[`pÞvÐÕ﵉8mzòrN3ɶêÕµ‡_'a4ÍYòT2¢Wëh û2û¤Z:‹é9>£˜B:ÒÔY4Ž‘uæRQ0FÚ:‹£1&Îè£0Š4vs4CôQDZ;‹]1µø= ]HsgQ'G•`ÐAÚ;‹Ñ÷kFƒ²O*“5Ø?ž×Ë¢D=ý®Uß!}­)7F4ÂlŒãlú4Ô5M£-."è¦ÒÆЩŸ2t¢•mtLžyÓQV0hš~¸aì†4›Ú#[÷BÕJI³ÀÖ‹%Ä“c%x¶¬ uê›@ÊÈd ¯b™l¶d/tZdFé;ÊÓ7t…tï;lfÚ9x9˜lf7©ŒžQºŒ¢>  ¦aT. •§^pƒQCÂ4«³á-ê¥U6ˆu?ã"ð² @ìê̺Î3îÑÜ¥ÔëDÿ< œ,£\ -Fôe_¹^6Ì02}, ãV;¨‹SL‡ ¾{çÆ·k]¢¹ÐÅo? w—Œÿ›:²LÃuö$¸ï´L"dÂ:3دªÔëlF%Åa´÷5åkA¡¼TYªuΑ !Ú ‘8ýÂC:W§ýi}3¨´¶ü퇳è¯Ýú¿þï£ÿ[ý?~ýßGÿw8ú‡V°¹Qé$’ïž^’xøŒŽs,8uX˜ÿÅw¸w†¢’ nøïÁºWÌ/lÂ1ýàŠö6H7¨-èfE4íÂh g÷ GŒ²œ/baA­òÊ;ׯ  KbÒ,ƒù`tb ¼¹¢×E \ÀªsOLd¨³fƯí\†lf¶«œ¶)Û‚ºÝ›iºŸPÏô%ÅéƒRfæä ÖšŠ¢\e¹ý{£}ÇŒ¶.I®›”HØ0Œ¿èÌ2Ù¾‘ÁdC¸aL©af‹³ä›sNj²Li½4KÆÝ}Lãá5ŠKO†Þ§L0 UlÈÄl†Ýþ¢8&A¶M1WF‡Whç.I]aÖI1šHç?Ðï1¼ÇÁhÛ<"Ę(ú¹ì÷€@'Í?ì÷r˜ô½µ0úåfZ¿ šU瘆Ì,¨.Þ^¦´˜q,×J²¨™¸P×fúQ*RlªÊiÖÂÎõ‡…–õáa•åqsz úu‘Ȧ.z0êü¤Jô¢Êo0Ýf”ži¸Š{Hk{@^R¬yôk•hÆ(¢“j]§òcòÚrž <Ë iIš©ÿ>Ã!epéu߃üN¾™š@]}¡*Á:¥)B]ØY(h­®^Ö%S…¢öͨ’™Ú(ÃɰÆm,ò¢Tì3šÞ0³)†<ÕÄÙüchÓK:V1˜zØcêq3ƒÉLþAeÓ‘üĆÀé®3¡jŠÅ€Õ_¦X¼ÅQֱꋾ—n»|hyüñWU)ï'ÛbŸŒG`¶«}O5¦´ô‚»ËÐbd^Wìgò¶²óªK(€Wb 3u óÛ-–8©¯¶R6Ýñ¤ËØÞdwÄP§E!: ¥‹¾3¿Ö+ç×Ä ýMójÓ?7PFíXë¦t6AŒb1ñîu•CYWZ- Æ.,[îšîìa¹ó*9ÄÝÁLÃˆÆ Ú6µ˜¯Gˆu’Êw@1æHíŠæ²¿óX ÝÐa`j&aZ\fµ]R¬=íy0.sÕ=HmîÐO1ŠÎèØÎEØKÑZÓ¢Õ–åf;û¹‹Ø§°:½Úyúýߢ7ܲâ²b¿ÁÖ†%§¶µá[´cçjåá.lÆÀ ^ëÒÆ•†"f¯E¿ 6Œ:3V\U ¨KCŽD캅 «¡’Ùx·§5øeÈT·,©1 `Îx…uê7tÔ™‚TLÏchré¹Ë±ô¡õ7Š1Õ®º‚a]ù–ÑÅ ^àbªGLKÓÙÝfµ%ÑÜyy;ƒT7™«*¢0ù sªÆRs‡”«º¶é­kø×i÷NHŠÅ-ËÑ 9ô%)Ìÿ±ìÄ(Ùe™q WoŽ×f-ć)÷Œò3ÊR›ëæu.õ§²Õ€}Tp¼L·±T™Úi¹´eç/3hW|C©e ƒ?,PdÜÀG”{ëGJk×z™"1ëÑŒ ÇÃðp…8¬Ÿ¨´ö9°UIÓF!Ñ” {Kí‚Q›wL4Lø­+039qA4°’8XG×E %«JIÕ†Šñ€±ï[BÅÖœsçºüþ&ã!g7VôeB ¶åÅqfãû¢ÉlÙpÁËu¯h*O^¸RÌâ¢3†ul1]¬[F(E´­ÛÈÿV&¿·³ u™:rWåD}KÐf6¼×qÊ ÐŠuœƒïñÀ ¡¶Jç­kç“w?Tº×Ràn%&¨Ô{ cÉø€…‰%•Æ>*þ”+†uFíXÝ;gwó#Ìf¸­ÛÓ~qÏÄ8˜ºà+6ên•ó¾‹åjù¬cÃȤ Õ±åXX7ŽU»˜Ë«{•3²‹”Í.ë ëd3÷Ø?2ĄNj˜®‚Ù]Õ1¸5ó<Ù‹*³Î8„˜]*±Tج›ì<Ô%Î~¹‰B§á^)&Ì2ûJ¼dJ& n’Ò­ÝÍT5[«[øw•rÖm¸,àžÖ…vMúöé ™|¢0E:ODÞM‡ÁÕßÜïPh9²‡B9I¢’ º™^¤~} ™ëÖ+ßÃ\þè@ùRî-?îosV™Szå;ƒ~Õ§‡ …//ߣ½å®ðÙ¥Ìã%s­ ÷òÙÁŒWÖ…çGùYÄK%xÚ~)£ÔFêQ÷WÚÙcI;ýÆ[F˹Rèy¾aØ| ñÑŽGÍ2V|‰)½Š‰ñ³˜º$<´Î~ŽÖVœø("C¹òû­š–#uE8XL×}i…¿œ0 ex[OBN@Âðï#ƒ Ã30&„î‘6…çÄBzYž…„áYï# ó0FÔ ;(…øYÈï ab!cL,À÷…Œ1±1&z‹l*>'ÒûÈ@ð,$ ÏxYHž€1±`:¤ ñ9±ÞG‚g!axÀûÈBÂð,Œ‰…N"]ˆÏ‰…ô>²< óÞG: ubL,´ëBxN,¤÷‘€àYHžð>²0< #zp¥:Ù˜¾žåçt³Ou|‡rVãÁ3Áag&2@E®z®ñà™‹(ÊÁ%g>&—¹ˆ*1¥W1á‡+qá‡kÆÃä”3“ËÎÄGòÈ•ßê8ðê0ãtÝãže߃€žžÖôð~µ&†(ìáýóè_“Y'ø‚sàÖm…ý£îá/(ì¾ü³ÑÃŒFö.þ¹“3>€ñûçÖ깬Ì@YÇç(ësš^¶ý› Ÿ<9sÇéÝ€[=Ú)mŠþmÅHãl f˜+À@ŽFÇÐΠW…á,Ž<)À¶0h Ž)é(Á<¢ÓÓùœŒd4I::ÎY& 0¢WhÎASHZ1¦³.'S(ÁCù×Yê“ÓQæ‚Æv–4äŽÚ£˜OÆ7:ý4À“HóûÇóÆôÉ(ϲ|çÖòцÕ7¨e˜éÇ8(Vùi’ŠÃÄx–®ÃlZÌ|5Ifaj9Kr`>*fþš¤ƒ09›Ñ`|¶ºiüƒ°³DÀy£4Lëã¹]ðx6ÖâH9TO êcµ¶r>ß“ë¢ul&dr¯~Eìê³ÑQ;‚:ÌŠÛ„èÌ#÷(Lº½°A쀼§õÑ;}vÖç¹Çßç}þR vÂu¢õå³ë´Ðï»÷û0{GJûâ0ÖKJ‹YöY8ñDë•°.?a®ëÚÒùby;³NªàN¢¢ïbéÞ\·Yƒ)3¿À¬c=)°ÅYÅ.Å1—”éºTºáþY§?Jù[¨VH~ëþ€ºŸ¨×Ó‚2?Q±‹>Ÿï»Ãbˆ=`Æ]Y^¥$èúüºÅ(˹æ ØÅ¯il?^bØ5C^Ùq®ßy WÃósÓÕKrúQqô»Ýx$êöî¼4XwXä\Ç+•h›^AI* æÉpé"¼“mº›j°52ºêâŸJîÄ¡k° gùöyëðòf§º•©7â>Àâݘ׺³ _‘A¬Ûe² /pë6#{æx³Ë€¨’3Bõ'}†q;-–<Vð ëP‹ñ§b`1jW‹¹þ.YÌ>ïÙ¨[ʯ»‚!Ï4¬»xfç[sèš9óÁ:9×íð[µgmùŠŒu{b§uÇiJGƒÝÌ©ou4dÆ â]ˆsƒrê&r0¤µÔ@o’Ì$žÇéÐsºëóÉbÛ¦ì)±ÙÞeb†ˆñ¢t,£&Ì” n# “b0›QëÑ1†ÆÜ³úŽìˆõ[?bpW(˜‹Øê€_wáY}´³Î^Ĭó\z¯©Þ‡û$àÁk¯Š¡×ƒOZ>¨Æv6ê!cuûybZ“Â3Ûßçu÷1Uí¶b‚qéû/zÿoÕåjÅÍ®P2»þÈ@ÝÁ ÆQU$3%II!Çí©û0•no!â‹w,DÔ¯Øùœ£‚«âf:ó…ƒ5¢or©ô\jo¨ÚJé1¿÷ùYPiP³@Cß´f<6i½…³Æ•~–”¹À‡ƒº A{]s83áȧs,«§Zèv½j… ·þ’a­œendstream endobj 67 0 obj 5294 endobj 74 0 obj <> stream xœí\}µÿÿ>ÅþTÜÆöz½^¤ª"Ôª¹ªª ªŽ»¼\î’Ü]>S?B¿ð)ê]Û»ãŸwýyZÝ=rX¥®¤¨…ªŽ9}ßáé’•Ò²V¦ê¬¬[[==x÷ïï}{ÐÕJ(k\“£Óƒw¯PS7F6:€Îª­’ãйuBŠ.mÕ)äj€´µÑJETÇÔ*¥ã ÙÈüx—ÈÔ¸9Ð…I«t¤½b$œò~ v¦¡âÞ圹Ïçü§á(€Üœu–,@çuÂ;Ö<@¶îuÓšdmÓ6Ùµ¸à´ïÍÀs6i@(˜Î1qTyH£g|6€„Þê…É^ȶÝe‚ïxˆ¢ýîyìNMdûƒ2ÊÄV_a3ÊöôÉŠÚÜNÊÜŽv€*³qEÊüW¿ÄiÚ3›&ekìt²µ) (è!ïæÛk)c«óV ãÖµ°ÒDÐ#Ïtm¥Îc¥¸wÆ©éL~ŠgœR0ëk6  ô‹ZÕDNŠø°Â-‚딨|«Î¨ÉDÖžx!¤Z¨íp…Y!õR¶­” CJ9˜•u|ÍèË:2PÊÂ:*ÑÖʪêPªÁó?H¾Àšƒîðq_à\Çt¦‚ËO?¶rF£™œîç^ zg^ò2ü¸ÈvŽëoÕ  {GÕ²þ !NüWIXÓ¨J:Ãm‰%ŒaMkçªNØÚø¨¦òÖ¥Ò&ë0zD“ˆ½®µ–62ý£$¥3¨:òàÒ[«µH¼d_w¶é£µ~äyÐh5-Í'â1ÇuÃA/¦˜"5ã)õ×~D×M¥Òùä‰ïž‚À®»œ÷}«Æº–F?)ú£€^h¡óèfçC9èdŠb&wzÉG½„ÔN='Qž@ ¯—v¼à\=áÔçhC$ö^¡#.„@zGÍw¶ Ó:±"é„îsÐç>üPN¿Q¹D㌵µîÈÇ/JÅ©«˜ãâÏ^ÏqVôÀjé]•qîWž8ceŸ„zÞ‚6tM<·ûí„‹æsÁA!„霤ó̃†ÝT\“ÇÞ¤ !)™ Y:¡kŽŒ˜£>]2æ€V€Ñ #`NWɱͣÉ;N\öÚ܉¦ð=GÿŒ³p¬#¬#P€+ÄJ7“UÓ\œ8çkoç;šCç“\]6²vãÉì8ßë6›-]Xj.–€G|*9U¡Ýn–€\ýdÝþªKØ»9Z–jÛˆ&];*Œ§Ën9WÔ)Õ-ÂOJÀ7ÐŒ®ÎÌl›ùWœ@@Mɼ@7 ç`EN8èa®—Z1.ÖñÀ¤W:±’™ À6"ñƇªÓµm·ùp!€žƒ1¶\ûø¿o¸µØÉŸ—¸žèê´ìWŒä)ïŒdÎõ@_J;–…=0¥ÀVÀ ®8áU™‹ç@þ¬(‚À&fÒ–ÆÀo\¢ '@?fåÙ Ù¯,?˜P™<“,Õ ú(Jjæê9ã3ð­ è³^ Yw8zÀ.I /‹€2‚Å.S Àœ½7ŠÓU¦²gœ91Û(»H¨Rºò!+Yÿ2â»vÐÎOEz–wcœ·S(ã8à¡6²Ò߇²©íÿú]nv€a½äŠ{ÆødsEפlûù¤ÈvAÜÎ+]q@ê9»@«M(£ú•õ-óÛo,žØÐ¶_&ž Ë±Sר½.9™+ ­rQÇx'!w, 3®Ãe‹$i5^¡žîˆg=¥9å Ñ#I嶤ý"°»]vyd#é)Ú5À„@¨ò‚ûÓqÄñZê°ëŸ—Á.ÖÁI›¿ò€“øÏ m ¥0È‘ ¬IR'þŽJ’ô¯h÷‹ÛzJ‰>òè2ZŠ>ßêSOÁp/’yÅ ˜¬èõNã}\2Þ'K&œñá.2Œî -.xJ#¦ëÅ’³ó+ߪRÊ<áZŽ÷/>߯8è}މ/ú5ï‚^©¤² &TŒ !•.‚u6±ïªCo%Nߊç¯T<g'˜ ³ßºÄö®QBçxêm­ {lg«Iz?äËôˆSôˆ+öCOd낈仿nÓÙÑ…9æ¯ùì€ \r'x0¤ÿ’-´ÛnZ1ÝD<å­õÃÍý&ßñiðqFéêÁ´_p^ò]ê•ïè‚„f!¢B «ó#ÞpN€Ž€÷€ˆ:á#>á­€\qÁtrê.Ðf~9èÒ>ä+ÐUxÉIõGŠ)’ ع‘úÇÁñßႯ8óWЋùª=P[ò'"éŒjΠŸAÓœòþ†ó&hGk¥XHS…t¼gœ9MK™ú¸¨ã1“`¤šoÒèx=/ãÒ¤+—3i‡ª.š!Ì67w 5/øò#:z·YXÑÀgœ^ €€ ÈÊ«¬¡¦èÁ„]ç|Bef ožXGìf–G›ÔñÒ ¸ XZ U†&O*;àrÌI[½ãÑk-Ú«œŸýT¬È½‘rÅ^sÛY¨ä´%Ž^ÌÎåÄW4)Ü®mØ"༟q\;x×”.Ð Há9 €ƒ@¹P-àê@ôHªù´'>ò‘ÄÚ`Š»0R­Ø½Á-÷ÁÃ1¿&èÖwÉy8{Í—dETˆ su„E@^Ó-3 e†tECÖ5t¼à#‚Ž_z¢'¸1f$A×XCÝÕR«5ÞƒEË)M :än,À1¤»mÅà\E¡²å„ .`€aÀ•IS^Q7æýCú¼nìë¢MJw)©Ô>½âk›×“¤êaÓµµ]­‹fÂÒ]Ã÷¤Œìk”fN®¹Ð,Ðw¼#ÈÕ„%;›â¢èAPèÚ‰ˆÖH»©g9œ JR,R¶µ˜ƒ²¨¨0r‡Ÿ‘íŠa,Óê2# r.?rßv£¹ àø˜†É7Ê.”YwŸ{Oqïhò¾Øe1:˜öJžŒ'Ÿ6è–È%^°KÌé¬lWB-0"Øæ€H¾,¤- ¢!Þ-&Ëñ2+&@«6âÐcÎ °w^êÞ1'éˆà Á¦Û©Pýˆ;$‡µˆœãÛgKc ¬þå² ;˜ž(ï=€W£w ˆæÙs4QÃvÅxÆ?.òqÑ¡qïE¯Ø{md°5¸à,¸“5¶½U"N&|šúY]îS;SÛ^®~eg+êÉój˜]Ù.eeEtq% %ø³2êË|=àjY~ø `‚Ê.Ð1‡ïž£Ë%¾pº§ õ¼‰¾,• ˆÈedá&dYF¶4Iq˜-wDµª”wì.˜Ø®•GE7‡—yGÝpqMçþ)Ûß­‹K÷9ZÔMÿûØç€€/ ÓV¹`;¶0yǼí£.tåüi=“ß*¸ L—gÄN9ê¯@2˜>°@eÑ}Ù~"¿ƒÙ8ç‹;%Û&ÏœI,cÞCn„5¯ÙC–ÎßÎC⑉ȻÃ4Þr‡äaô>–6ίÞE}ûDÎêS2 ;Pމ!­Àë2ŒòxÖX­ òZZà&­ƒf Å«ÍãøBurƒå°6” ºÌ u#Ú<rÏȤ>áë:FZT á~dÒüÝmûP«ïÖ„Wt¥Ö¤lÙ(£*{“åž,J;‚úȲŠûxK›<‹;Au_ÙÓ è̺¬\ÍŸù¤œœ0QÊ•‹'ErË8¿<Éß=®‡,Ò9âüaËf%oÑÓ„àY†•bHÒjïóʪòËÞ:¥œ¹\€çÞ¬¾-ª…-«Ú]©˜'L}•å *ÑýÅß{$r³Cmÿ¦ /i”=YÂ×g«0rxb;©ú‹€©Âhn1ÖªÑ߇ª¿¦U*E3‚©…G@~hZ!5 Ðsi¤G0µðtZ:Ù4Ʀ`F0µðÈï±­Q½Jê#àœÄ\†6••¡¹ö2%RÍ•`¤Rk¦c,4œ©ˆŸ"©Ô*'Ã3b¢Â3bAÃæ$LZÍ7.eRïGÖÚëeÝ!YLÿݘnYè`=­Œß±"ð–K1KƒžxX^82a®v£»Ÿóäêî¤Ñ*O«äå‰ô •rãÿ|Õ%'½ç Å­Øûœ¥’·2¸xø>ŸÀÕòŽ¢WÚ  ¸*fpét[÷Ë»Á¿ŠXéÁ°C€ÐïØŽã—0³È‘Ça%o•7%†`ÚÕ<îdhMTÉËLíh ãdÁÉ8‚§"Ïó&mý|èvÇiGpPV„З%þw«…"¥À^°WÀÚ¶|9Ú"›œÃµ‰>Ò¥Äôî—àæÐIÚ€h0‡ÍØ&ÔUÓÌÍm­! àµ,*7O¸:•܃ãö›¥’‡ñXa×Û¨óÍFCºxÊ›ýZ£Î½K®÷¾&Vv/ ˜Õ2K[Vˆ‘¿GÀî¸yÌáÏÿ XÑ endstream endobj 75 0 obj 4227 endobj 82 0 obj <> stream xœå[ÍnÜ6¾ïSèÖ¤èÊüIkÄŒ¦@ãlo‚…·¶c{í}¦>B_¦È©y‹RKqWÚù(6v/­À™’Ùáü|3Tî QJUˆæ'ýrz=»›ÝF¨zýwc]YFùð§•®.­kÖœxS¼ú8{3¥©}Ñû³øR|}©›ÿÖ¬»¿Ÿ^‡‹ÀUšBŠR¨bqxÔumE”KÊÈRÙÂyYV¾X\Ï^üòrñÛÌ•J(oÃ’ÅÙìÅCCÒ¥¶R›–tÙTé•\«Ø®"É )\•³R¶”UC©Jk”J¬–‘T)¥vÎRËüy’-… :´¤›H’^™${AD8£ûÎ[üV†‚xH-sLu~MeX´¤ ³ÉŠd¸¡’±NéF`šë†äËÚèÊöIÞëJgïâ†Ê¾·¯ˆÒ@P Î’’(«¼E·T Â#]u]²²ª¦(øM¤!ê´ï(r1h“Ùß¶$«lZuÒ:›U¾nI?4¤ÍÕ&˜«uè³ Ŭƒù§xÅÎêjǘÁL›`nï8Ädåû&è’ÎéÆVßÚH™V½§«ÀÆ%­-lJá¥M¤‹htã¥És_{q’“v6¯â%•hý@²ƒ}é@¯t’á”e‡kuxÑU\å¬Ú¤È2 /„T;áÕÝxµZ[!Í®o{)wiׂyoã3³çm$¤¾ 'lœ+Q•Ê«b.USù›ÿ!éJ: ç zÁ¹}MõŸz½*$ ½)º?G7¨CzÉûð¯¬$Ìá(¯ƒÌª£Eñf&‹æ§8é7¬Ñª!qûN&L°¦²Ár…¾´Õ1»TBú$wµ©ˆ¶çö¦4FúdôW IÊPâM²Á%]õiSJ79ýœ²¿öTFmŠÈ*f/!´u}!º¢>D{j£¤Ï³_QØÈ;°oy«òæZgciÊÝäØgue¨…&oÔÛ¸Ê#Ò‰‘ä¼®SU¼¢—TE`ˆKªõGÊþ† ±Šu¸q?Õñ½Öõ\ø«/¬ ži¶®Ñs:ºÚ@·“½»«ä8ݵxÕ"­zŽ×ß¶¢¤‡m¹u;Ììî¡D5&ÒÛx^íµJ eï)©jÍæ[³Íë€ÖšË`r³^óšn;ßÞ\Ý´I—ºëw}A°[ ~FI”tEÌâ,®ªÍ7žoƒFå7®âeØ-÷K*P‘'ü’Šõ@Wo()gˆþª ìoä H_≡ K—"™ÞËzà‚NvƒÌÐó<%U,k Hµ¥€ãÙï å~JI÷Ü[†eæÂúNɻН‹Nà[}!NiÀ‚(±xNÝ 8eê0”4yIÿd¹Íq$ÕVn0Ç«(–ºJ2ÊKS’¤¤÷”ôýní€k Ì_tU¹SfçF¸Ò‡j5·á~l®òj«bÕÖ#ZënvUÎùcŸù§Laë“RÒaŸª¹’}, *Hh¬ï×§¾µ¯êj­¨ÎȺÊË ÅY¯8¥6 <À+@ÃLØÑ'¼RS!À‰Dö%åDdÅb ”9¦Æ{½Ë|ƒD‰$ª ½ŠÑ]PÅ' Œ¶o]ÊÁ™:4CÚ%^·¬ê•Eÿ\ÒUÔx—Dé‹lØŒŽv¬'…ð’ۛۀ„¸§÷ʃ›WÔ6¼ €ÃZB?³P óò Á!MÓÇôfqì‚×Bç™§ô‘šø)üÛÏßX÷ª?ÑÉßÔÖé;ƒV——+§ãh%q œžâ ,yŸõ€¹¨òÔyæÆrE+kIåŠGílYi²½.ýš¾}JpÉ( äå5{Ï}5¨“@²¼@•7B-×Ôa•öIˆ/¬Ü»¤I‹1ð0 ÀQÀw,×ç¼€\Òkv¦º5³ôÚ ôðù> ŒAF 4•aï)È4ߎN†€>@.ÞõóxåñLwãw™dÕ'Ý[ˆ ^§sÓQØ¢E¸Äÿ*Zˆ’R>¦ºiW²Z¯ÙÏ3¥–U§Ð‚¥“0úˆ œ€ƒ÷ß½h…r ›}`¥{ b¾NŒœx@]ì„ €q=Œ¹Àªw/)VyÊ– dü?¨¬¾úz`løÄÞ•œ×tö 9¹âr_;çƒy¤þòÚ°*Ÿº–ö È eg#uœÔ+X©„'“[¤áÝþ'*:¯¶çæ ¸§í‹‡9x¯#<áá*žï‚.8×@ûBQAfÒ6 ×3ÀÎ[âÜØº¬kÝ©¬SÞÆ'˜Û¯ö"äÐIÔÔâû÷”*Ñ {M˜N¾¬DË™òº!^<@(<ï‹iþἘòÞ’Œ«¬ô®±ÝÀù"±÷G#/hnfQ÷9ñƒÀëú¶a7Ù`húˆ2ÒÂòJV /í=ÈD›O½òË·tcäJ«Þ7Aý'.ÞxF-oîÌ«Ñ;ì R(¯Ë˜jX_»©¼ ðЏYÞPu9e,¿.4RUõßM¿z`8Œ3òÑ“‚aÄõ #C4Þ`É‘Rx-hÞòãˆé3Ó¦ÏV™=Þ(û¼>g Þ(‡q/åÁFîd `èi(––ÄÉ_(æ DžOòF1iZ;Õx¯<¼¼<x ïAj– ¾v¤-ˆYÞ[ÃÞOó`ÕSVxŽyÙ~ËÞ˜þ)›\¢ °,­;8ñ#ùjox;iøþù-͹ÑûhòYçk;¸áïT–4c溢Ñe ÂÖÿ¦ùù„ÍÈÉendstream endobj 83 0 obj 2123 endobj 4 0 obj <> /Contents 5 0 R >> endobj 25 0 obj <> /Contents 26 0 R >> endobj 42 0 obj <> /Contents 43 0 R >> endobj 56 0 obj <> /Contents 57 0 R >> endobj 65 0 obj <> /Contents 66 0 R >> endobj 73 0 obj <> /Contents 74 0 R >> endobj 81 0 obj <> /Contents 82 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 4 0 R 25 0 R 42 0 R 56 0 R 65 0 R 73 0 R 81 0 R ] /Count 7 /Rotate 0>> endobj 1 0 obj <> endobj 9 0 obj <> endobj 11 0 obj [/Indexed /DeviceRGB 255 <000000FF00006B6BD2FFFFFF666666FF66667B7B7B6666C24A4AB96B6B6B4242 B1F30000FF9090B1B1DA888888737373B1A1A1FFB1B1CC6B6B181818FF33337B 7BCC6666B9E33333B9B9B99090D2DADADA8888CCB98888FFC2C2424242E37B7B FFE3E3DA9999FF1818FF7B7BEB2121B1B1EBFF4A4A8080D2C2C2E3A9A9A93333 33F33333D252529090E3DADAF3CCCCEBEB1818FFA1A1999999A1A1DAB99090FF D2D2525252EBA9A98080E3A1A1E3EBEBF3080808FF08087B7BD2FF73737373C2 5A5AB9B1B1B1292929FF4242E34242C2C2C2E3E3E3DADAEBF38888FFF3F3EB90 90FF2929FF8888C2C2EBB1B1F3FF5A5AD2D2D2EB4242E34A4A9999F3CCCCF3A1 A1F3C2C2F37373D2FF6B6B8080806B6BC26666CC5252B94A4AB1FF9999B9B9E3 B1B1E3909090B1A9A9FFB9B9D26B6BCC7373212121FF39398080CCE339399999 D29090DAC28080FFCCCC4A4A4AE38080FFEBEBFF2121FF8080F32121B9B9EBFF 52528888D28080DA393939DA4A4A9999E39090EBE3E3F3DADAFFD2D2EBF31010 FFA9A9A1A1A1A9A9DAB99999FFDADA5A5A5A8888E3A9A9E3A1A1EBF3F3F3EBEB FF101010FF10107B7BDA7373CC5A5AC2CCCCCCEBEBEBB9B9F3B1B1FFD2D2F3CC CCFFA9A9F3C2C2FF6B6BCC5252C2D273739999DAC28888F329298888DA9999EB E3E3FF8888EBA9A9EBF3F3FFD2D2FFF7B796FC949005E770C2F0F4F7B82899EB 94F741F7FC9490F7B84E6D892D05E770C2F118F7B77BF741F7FC949003EE8803 D600F713EE00016FF7A2E3007DF1C2F164000FF8DF0008402004F7A3A0C40000 1F200C000FF8000000C4000CC40000DF0008000000F713E22A001EC4000CDEFD 30C2F18CF7A10E03EE8803D60000000305E00FC2F1A800E44A05E0F8000032F7 B9C59A3DEC000030001DE803B600C2F1E000CD7C00000900CD5C000000FF92D0 05E10005E17003B600C2F20400CD7CC2F21000F56A033238FFFFFFC2F2780010 260000300021F9000028FF92D0601232FF94D0FF92A005E100F432F805E100C2 F22C66E8880000006021D3FF92D0F432F805E100C2F26C66E94B00000060D91D>]endobj 10 0 obj <>stream xœí} Oi–¶s1Ónó!H ‚Âf0IX&|&\‡5Ù| .FÁËe@_˜ F€Âm#I‡ÉÆÍF ¼?tÏ9ï¥Þ*@fâäö‚ Æ—AçbSHôïÝœiñ×­ôÆ |E ã‹`c±ªw ~~^±Iäo*ô%1Œ/+óŒÕû'6+6Áö³ò3ßBÁxo¨xÌïŸh‘¿B_ƒÁøhÙXœ{2PÜ]ï÷û»Aø¹«ÁøFp3¸Ÿ u‡zçªxƒñm`3Ä¡ýÅÐB¡¹3…¾ ƒñ…н±ØTõ$„xRÅÓúŒoþ`0^UÕ47×gî3ßî÷nãKñÅ•_ }) ãËâ—¿ßߢ©½×Â`0 ˆë}…¾ƒQT³ø3ß(n3ûŒoÑB_ƒÁ( b· } £0ˆ²ñg0¾MDÙø3ß&˜ü Æ7ŠëìûŒooXúŒoi&?ƒñ­àæó ¿_/äã®ü­µ_ð‚~ëë…¾ã7Ÿ·øWz—:7®|×ùžÔëFþÉ|_ôÒÎÇZÏwTè‹`0þA1S/‰òW6®t^¹Ò Mþëyä_?ðùþ—?× —Âäg0.‰ûÀxã †zõn,Zm;{­Ñ÷ïÿ[È¿ñù²L~ãÒ~'(Ÿ¯P °”?=4NÍ=óù’¨¶]¸Nî–ŠkI2ùŒKÂOt¯j©ðw^¿¡üѨ1©¿•ˆbë»V€ë´aý\^ +?ƒqiÜDÅ‚G3”ñ9¿Yï›üA2ß—ÌØö?˜Ïd“Ù$\+?ƒñˆåïÓÑXçw6å¯Öä§:!YhåÏmõ3@~V~ãó0°Ñ¹!Ž&déO+4:(^S…6‹;Tþ7…¸VDi&›Aîù³>îçg0. g°Sµl!@“äÔÂ/Ò}‚ü€ú@ÿd6+²V~㲘Yê\zNGcADgç†$ÿmÝÑ×*óý¬(ùÔögüÙ üŒÏÅÍÅ`pf—‚ ý@AþÃh4-ϱ+a ~D~¬øù²lûŒÏBïÒâRh³Â_ BÀ Èo ?)¿¦~mf¹ŸM²íg0>þÅx|1¾ø!þ!aø$òGÑ}¨üY‹ý…·ýÄþ$Û~ã³P¬ÿP¯Š ,Å—üףј>¥Õ&üÙB“?+J~äüïòZŒlܯB4‰†ô_ôÓL~cX¿™óg}ÉÆ|ãÚèëöð~*mwwyxïã×p:üëÙY8ŽÐgÚÏú_{jFTüPù“IV~ã3ðóœDÕñ c|Ï|¾?(É—ìÅæøº½©ðþ~d?Lã^ ¯6œÏeÀéò*œFàùRûíkÎó¦J!ßÇFôïÉRw]l\øc0.ŒÇOû逹/GõËQ}IÓö'³è¼3™Tþ—­½ìÚOõS¤û€×ÀíÝÿ>ïçOV‡VOV"«4æá“?^:,ÃÔ¸`þ¸èë“I¿;ãâ(Ö?é}ÒÛ;ÛÜ\SÕDLíóŠQ}¶j?xnâþxžòçºà>)ŒJt&ú¯6ä\|xHpÿ%Š?6éýáKöSvFùýã2é—}D8bò3—¿7ê õÂz‚ìŸû'£Øgé½:H’éGÔ8¾ho>±OÔßGþ*âõONVON]~ûס“!|t?ŒÊOQƒØIì›ç"ùÉ÷Ó ¿lR;òñãRh …B+ÐBž„zç~3 ýF²o R(¿Ãö¯ãß—ôO¡‚£éôzƒ¾çgþ£C#'CC@þW-å—ÒI$Ì€AäÏ’ñÏR¹ß¢>+?ƒqÜX‘Qèý-–Óoúœ@Ê÷3™yÛ×ìu%ÒôƒòHÈW¥ò¯"ÅÚ:424´{‚äÔ틤63¾ùµðgù…+ö2Œ‹âþ€ÄÊÊñÿ/­7¶™õ¾,ÖÝl9n^Ⱦþyð°HãWQ×ÑÞíæì¿ündhw„„ÿääDÿ0±¬? ?|á²uvƒ~Ó÷[®„•ŸÁ¸8~(¦FüýÿÆ›NÛïÓõ>‡ò¿ÝGîKáO…SaUëá‚ ŒüjûáW#€¡]Š (þ»ïÎPýQù÷¥ö'ö­Ó…ògÇůÓ0ëêXùŒ‹ãfw1Bñ`eÓxÓÅô'E_ßxÖ$s‚È¿¿Of=œŠDVwÏ^*ú½GvGFliÿè±DP_†½³U•õ§(–XÒß  ~Ö0V~ãsð˜È?V,B¿ÅxÓ-çÝüY[Á¯Qr;ùQ¶w‰æ¹_¥ðCÊOLkþð[úÓ‰ ÿOê¯Ã`üçUo_"ѧËj–Ä_¬èa]+?ƒqq<öuwûíÊŸWíOf{¨ânöóß½Šäߗ‰h½>¢Z?æûCÄSú‡FýÉõ[oìb¹ÈIääe¿êÓ0®ËýjjU‹`åg0.·€äÿ@…ñ^žîõ³Rû Û?Ü¿ M°×zg;ù‡PÞIù²ÞÙCê¿Bã?tbô…_î6ŒöŸ:û¦ˆúBû1Ð"ž¬ü ÆgÀß]è®Gþ#û7'´›å>_6LÿÞÕ« I}ª÷åŒ÷ND±ì=ÁzãT ?ÕûOÞ}âÅjî ågÅg0.çâ›þz’ÿâ çZ åÙÏ¿Qgâ*¥ü²à×`¾Òä¦b?°ý­¥ð¹·Èþ·ôŽóý„é´˜‡œØ×ƒ¦Ÿ'ô0Ÿ¿±¼¿ ù³¦ïÏŸÏ?ÂÒ/¹i6ß;¥þ!)ü#µÞQÊ/»úWëg££Ín£€ Èr¿˜Ù“dåg0>é3Ù_ßíF~£“?ébûß_¥”_VüÃ~¥ò á7ëýôRÒÿDŒðÇ©½‘ðnÿiUc|Øö3Ÿ‹XßðþŸ-úÍ8O±­á—Í_Ìc„_Ò?’Ûß=#é—"ÿÖHúÿ›Ê}¤üb€¿œÜüO¥vïæ\/7#†øeiF?Oèa0.ëÑ´wÂoÙŸ¯üz4 ÖûòÉß|ÕÈù#‘HûIûnûî¶³wgTî“Å~hVfŸÃ”_)ÿÍ ¾4-(Ùop+ŒÓ¼½€/“ŸÁ¸q±®–– „fÿŒó,Û~.ä§^þ„®ö›Ëøà„>Tþ!9Êgä­Áè¿êœ_ð%åËñ½)ç„~‚ZɇÆösÎÏ`\bîîf ÂbÿŒó´‘¿áêUQï¾GçÍÓ}ò“!1ÆG)¿9ÌÇÈù‡TÒ/föÐJ@ûûgy—lüàjšóN`0‡\¤s`ÐßüY‹û.ýüS ´ýªÚŸ@ÛNÚ/çõœ¨‚ñß\ÐkïJùMåˆ~`üö^C„îê˰ò3—…Z¤³bsSð_°¿þ†óDSùÝ ~ V¹’~þ”X¿/,øIåG¡·­æ·÷VŒÔ·ôÐËy8Ù­”?Ë9?ƒqY(î?ž©ûÏU~Ëõ»ÙþI³Ú/&öÐ^±Ž‡˜²«¤ß¾”gî?‡dÊ¿z"‚)D(?.äçø­ŒZÊGäülûŒ ã0z]ùgff*Èúûgœ§ZÕ~*÷çð›Õ~k”ϼ´ý‘°š×£êýNò{½§ÿI¿Ö}±–Ìùû Ǩ}]ìϰò3—BßmuWŽŸgfn û+Ðø»“ß>³'o„_s¾ò‹¥|(é²ÿ<ò{ñž# ü/UüHøi^ŸsÔÀ¸X»;ÃÕ~ã’°îÁûóù'>Jþlþ:E??P_Tûç§§kÐöâpÎõœ¿;‘®^ÌçO!õ÷‰œíùÊß®gõ‘úæÊ{©ˆUïK$–moÊÛu‰A>¬ü ÆE¡ïŸ®æÆïåüëæb^Ùd&ï뎤í—+ùØjt¹ß£»wz:<üÓÙÙªÉâZ¾“ï†ï´/ù›‘KyHåŸü¤ÿ\ƒ!q]õñ#€ø7ˆûçVû¬•2if ꃜu ñ“S{‘ý~ãûXÆ;ûixô•}a®W¿þôŽº÷iBϪ¹’O¿Èùé ¯:rþ.P~ZFL(¿ìyàî~ãÓPm¸þDz§]ÿ„ë¿ucJ/®Ü]:utw»+c¸ûVáûåœÞýˆõVƒ^»ŸîÌ1¢~{ÿðoâ^]«ÏDÂäÏÙ®¥±Tß±'‰~¤±}ª6yð·øWa0¾ÜÖwáõz®æ›ÂŸ?¯Ù6+í=Xt›²ÎÈIòÓHŸÈ~*%Ù¿&‡í…Qßi!ÏœúÈ«= Ÿ`Ý‘{]?Ú~rýÖÚÝ„F½x¯yûàäßè†ÁøÊÑ­¶Rþ_**Ôð^Êøëýÿ7ï>›ôc;ÊïkãŒvs˜ÎÇ 7Œö¾”ÔÇÁ{â†\Æ*^'CrmO9£'<šÃ?ï5¤tOÖûS{ÚEO_FŒñÑø[þó0_/Ž>ïÍŠMIý‰s¦ôz3ö™=”rÛoו벆øÒŒ~q“nû}ºWmkôâÊž«òîÜrdßnûnX ðÙÜ/áè7œ”Â/”_oÓã«EµYïÚcÓsúüÝ3y¨±I?òÍ·mÎÍ‘îí£Ûõí«™}4Ä_êÿÉIÎøDîäÄä¾ÝgõóEð wíWâmÜÇ‘ý>¾cƒqA˜äÿ¹¥E®å1¡–ñšÉûÀ¤©üú>½öþþvYò»º/²~âp8bQ(n/Üë„_Ýw>¢—ñÀé¼h$rÎk—Âï3oÒËýý Æ'!jÿ—‰–‰½ŠW½¿¾Û…ü9Û=»ô}zí'Í'(ë$ôr>á”pþ’ú«Î¹w«Öd¾°^ÄCÌé‘ý|ùƒZ³êf]jØnÜßÏ`| ¢FOß ÿ6Å}¼oOÞžŽå<|IºQ¯“ü¹°ãK¦ù}b–®S÷»V¾§¤ÂÒò§h= ü®¿æ}Ä»7žµ:ú4Ú?÷ß„Áø&`*ÿ¦céÞn—›vÞ›Ê/´?›qŽá?KÐðþ«2éW{åb~n#ýÞ™sø#j6_Šfó%ö#®“&3bÙn›i½ü¿ƒñ á¶EþÇzÝîz¡ûn·ëäžÔ÷ɂ޸º£ÒËôòNÝ)¹œW$üSÎõRŽ„á§•»ÂF­…?õNy±Ž‡-áQ> ƧÀPþ›@yâ=4y«¾üu"r]û‘üI`¿Ë Úá”è—Py?!Ü;÷bFOÔŠ½ÒóGhh_äìü¹“ìp°i?“ŸÁøD«£êf-HzÁüzy—î7åÕd²–öÌ¿vP:ÚŽºäO…çwï~däýéðÙ‰òü4¶/uÒ_°aªÖ”ýÄñòƒß?ŸÁ`bzxïc}{nIý±âWå>>::ZoþØŒýWk¯ÖÄj>Ÿ|Qê§á½Â\^Î'žÎ`0ƒQq·¯÷—n…1BqñÀÀÊïŸÁ`üCã ø~q´9f˜Ügò3_/¢Ñè!î×kæ÷WZ }y ãï…ê¨XÊç9¾˜hOªÜ…˜ü ÆW‹¾¨ä7t/–¢~Áäg0¾^û¯{½cHxE|IýÞ¹‰B_ƒÁø»!Åš_Eh%´‚¬³/˜êí›cåg0¾b ‚ôGBÈþf>P¸ÏÊÏ`|ÕÀ¬ÿ@wÚˆø`ø‘úMMþB_ƒÁø{¥ÿ7ú^¤}¯Ð|ä~0(ˆÇk  Ø`D‡öí×­ØÚ·Û[U;/$`4 ‡ý1íÙ÷hýÿÄÿm1¸ º¿|'€þz«îá`90>FB=»S‚ìóîÌvô:hØp%FŠ’ÙXÚOe-#¯C;à-¸³0ˆ~¿£Ž–¯ë0Ïi[hÃìÂû¢Òƒ!¡­r– ±J¢}Y]ú‚­…E”Q<ž‹åü–æ›Òo ì™MÐ<½G> }®öŸ>85èoñœ8ß¼ö Ù­h¿$‡‡ØÐ¬K7 Žá@÷©MXE÷#hÃJûG%ñiwËlŠñ¸5yKcRøIý~;é—÷‘ößOM‚ðO~?e6EðÈ{`?6ê#í[‘îÛí†%  6¤=vÏZ%ÿéÙ >0_qý˜žk„-˜·”ŸœB#n©šFxn´¸ßˆÜo´´ß&þëkmD×Ú ŽDÄGšÙáàGhHtr?RC¼/ŦP|—dÇnÄthÁ}â|¾ê)U„—ÜïÁ嬀ö¸¨º‚,nÂøp‡/ðöZ´è…XçÒ"ÿÅÅ¥xü7,ûýWÓ"ÙýÅÅà´ ù©Âm«{8‹‘òw$?p\áNݬ`{Ñ2à¡é‚ž:.£W]ûï -ðUvà7¥á é“uóœ’_Í=ôõÓ 1V½;++ñ¯áÃø±jØÅ.B}—(3viÒ~öôþÁyÚo×} þÞšMøÅ4gü›=pŠ?i¿Hš…ðÛÄŸ( •²¥ûÃnÀÝ~up«ßˆyªßO´¿µ,èkR‡bÿÔÔ䔡ü¦P1`Usaý¿ßކ͖´£êߤð‹½]÷Qõå^„€VKôÿÏ5ØTN`—}|Týy¢;<”ú7ZÍzì'í·YýÒ5°é>„‚kZ÷1àëT@(ÿÔý§OÇŸ"åi/--5%ßd$  ‚~´ÿúÔ”ð‹-ké?ŸêÿúǽKAäz$þŽþöaì>¼ ;ƒ6ò— ¦nÕŸ1⸠‘gyžö*ëLò×S…š;•m·­c«Þh¥çE>ùÓm•Èö¨`;üNG”XN¢m–ªJ ñ³fÁàSèoùý\^[ÚEûÅÞ]û ö›ªoj¿®4ÛËk¦ò?²ë¾Ò~Cù×µÝ?’H?,µ_‰¿Cûï’ðdXÖz/›¤~¿aü%ó—…ç—Ú?)ÔßÔ} (÷ úÀý)Ãú;tÉßÞJÛ¶!üZ÷Û¡µ¶Ãó±6Rú•ë—–_ÿXk¿|¨ÂÀ<ÑÞR~“þ û5]`ìÊoñ^»WíWºÄ¿&ŒÿS²ü:ï?Ê/Ô_˜~|HÖKá—q€èýC)Ñ^k¿f¿”~8øAZ±vµd~’¨/´ö —Ÿ•¼'êÓß²šüõÀsäz0ø¯ÿGûýñ½Øè„f#êô½Ù鯄ò{ªù%ëbH¢K ò÷É¿Ùu\uü-²ÇŠ®ÏzòÈß7}{‡¾IüŠ·dzº#`½”D¼úð½@삾ߌ.Å?þ¼"à=öÎ×þ½SS÷Úß,ÙeßEù­ò_3é¾~<Àl)¿®Ú]­ûÃ:ëwhÿ­~Cùïjí_6ó}ñ÷kí—•ïʯ´_Å€×È{tû–÷ÝŸ²åû¢¡÷Ý*”¿µÝ,á[[-ÁoÕOZûI÷üHÿg†æ«ä=¥ü˜üká×A e…€®FWt5v]k¼ÖUÛu­ËUûµî“í¿&…_Š>=¿Mè?E’~ÓúK`©öãš÷ãvíÏëïùAi&©š¢¿ÔþŒÖ~"¾Èõ³Û X ±òG4ÿÑ¿,mtv¯t^±‘ŸJóŽ-¨¬M“Á®ö´íx0 zh7íÑl‘ßëé»;1›'­óp£Eõ‹Ù<òÇ*ËËMò{^D©œ¯È§:–Æ«óP ©óô]LùÍBŸ“úJûEÕ/m¯ùS;GûAùO䷴ߪó­iöËðHª¿¡ÿGÍ–ö7«¼_è¾,õ©@0_i¿æ¿%ýH}þ»†õy¿~Ò}§òkö[¼'íŸt~Ù€1€lD€©ísŠ}ÛDúvÊûÛ-í?&ío•vÍ¿`¾!ýó¸ÕKÅ—ûg¦öÏ+áGç¯6Óù§„ô7Ú­€Úk°á£K‰¿Mû­Œ™MýI÷§ïÔíéSÅþ[ѯÔHdª?Žâ/ÆõÇ•ç_ú„Û·©D⟥[júä--Í‚ßãP'ð|ã xüà*þŸ¢èþ£þËÿÿ°ñ ºïknm"}O“òƒ°W")Óƒ“-$#ïê<1'ùït”‹à±Yzñf]™†(ìÚòÈuJÛeRoYâ xÚðc垎 uõÙ‚€KÏŸ—”ß)þB÷õ]´ß©ûμÿ•tkpdïÌKüåi¿Ðÿõ#;ý…0µßVï7´_øÿ~³âÒ¯u_)¿ ·–ÏÑþ)ËX1à{¡ý´ÕñÚöŸ„[$þöÎ@$;Ðÿeë±ØTõï™,ø¡òߟKñŸ¯12~É|!ùêXûS5–æKÆ+÷/F¨íïß…´wA+hç/»~|o6Jd’þ÷¥FÞ/CÀ¸¦©©û¢Ê/{þ¤ ûb‹¼3¬Tÿ¬ ½Èû…óÏêq×¹•.@ü?ß²qeãÊ•ÎNÜÑ3Ä‚¥ùcuTàv´Z÷»‰ìÚã½#l¬ˆXX$U˜̦¤Ü´ý^ÙùîU¹|ò£“Ç‚ßV>ùÛ:›–Ah:0h¼„ÏâW÷Űᢠûí!À .Í=çGíß;gðO>ý8JþÍkhûÖ_Ëÿš~›ö«´ÝMùlõþa©ûŽa?*Õ¿%^P@‰ÿ¤j’úùÚ?µl)ÿ¤*øOé^?5ö=?Ù}cô=(Û/ˆ/°-+ôLº/©ÿRåüÊjŽçIúíŸÊ/çµù¯‘Ù¾­æ§´^°¿F¿@î×BÂÔ'þ»û±èÿãÁ5£äoÚcèÏ{½·[YúÏH¿/[©æ½Ùß/¸}~=¢¨€LþÅÞÒ~!öº»ÏVðc˜’ïJû´-íÇç´QíÏÙ´_qÝÅø“'x`y¿ÃøËœ_ê>>ÖuÙïÐ…ß>pØÔKû‡UÍßÈûupKÕþßAøûoYù¾Nío˜4h?)Šþ“†ðË1>$ýTó±À>þOdþdÿ[·[e ÀìÓ. ~/)÷©„_Sÿeÿ ÿŠþRþíÊߨò~Êú)é@•üæÍ í>\#×ßEY?…gÚoØ~=ÔGþM²_û\¤ýOu¹ÏðýôœQIáû5ý3Õá×#R~â;²_åüTû3 R¤ü¢»O0ßÇ÷±wEîñ7µÏÒþ:ówjÿš«ö»´WfÞoô£@Ð,¿ììü_äû‚þ„ñu‡ö÷ëš¿‘÷[)¿½Ãó}cدCÿyÿ”îó³úù•ù—%ÿ)ìé{=eËù ío•UÿV™ðËÑ>ªòGy»RûgÇVŸŽç­¿Çbä¯ÕõW£³ÿFÕÝ'Jïßj÷Iþ‰÷Ž´ëý.ôWÂ/ºûóéo9Ô~‹ýV©Ÿ^«:¿òšû2ûÏHÐ#¶¬ä~ÖªøgDÕ¯ÇR~à'ºûðQhž1 ƒÁ`0 ƒÁ`0 ƒÁø\üƒÔ endstream endobj 21 0 obj <> endobj 22 0 obj <> endobj 23 0 obj <> endobj 24 0 obj <> endobj 8 0 obj <>stream xœkhÙDÀ€ endstream endobj 7 0 obj <>stream xœc`Ù endstream endobj 29 0 obj [/Indexed /DeviceRGB 255 <000000FF00006B6BD2FFFFFF666666FF66667B7B7B6666C24A4AB96B6B6B4242 B1F30000FF9090B1B1DA888888737373B1A1A1FFB1B1CC6B6B181818FF33337B 7BCC6666B9E33333B9B9B99090D2DADADA8888CCB98888FFC2C2424242E37B7B FFE3E3DA9999FF1818FF7B7BEB2121B1B1EBFF4A4A8080D2C2C2E3A9A9A93333 33F33333D252529090E3DADAF3CCCCEBEB1818FFA1A1999999A1A1DAB99090FF D2D2525252EBA9A98080E3A1A1E3EBEBF3080808FF08087B7BD2FF73737373C2 5A5AB9B1B1B1292929FF4242E34242C2C2C2E3E3E3DADAEBF38888FFF3F3EB90 90FF2929FF8888C2C2EBB1B1F3FF5A5AD2D2D2EB4242E34A4A9999F3CCCCF3A1 A1F3C2C2F37373D2FF6B6B8080806B6BC26666CC5252B94A4AB1FF9999B9B9E3 B1B1E3909090B1A9A9FFB9B9D26B6BCC7373212121FF39398080CCE339399999 D29090DAC28080FFCCCC4A4A4AE38080FFEBEBFF2121FF8080F32121B9B9EBFF 52528888D28080DA393939DA4A4A9999E39090EBE3E3F3DADAFFD2D2EBF31010 FFA9A9A1A1A1A9A9DAB99999FFDADA5A5A5A8888E3A9A9E3A1A1EBF3F3F3EBEB FF101010FF10107B7BDA7373CC5A5AC2CCCCCCEBEBEBB9B9F3B1B1FFD2D2F3CC CCFFA9A9F3C2C2FF6B6BCC5252C2D273739999DAC28888F329298888DA9999EB E3E3FF8888EBA9A9EBF3F3FFD2D2FFF7B796FC949005E770C2F0F4F7B82899EB 94F741F7FC9490F7B84E6D892D05E770C2F118F7B77BF741F7FC949003EE8803 D600F713EE00016FF7A2E3007DF1C2F164000FF8DF0008402004F7A3A0C40000 1F200C000FF8000000C4000CC40000DF0008000000F713E22A001EC4000CDEFD 30C2F18CF7A10E03EE8803D60000000305E00FC2F1A800E44A05E0F8000032F7 B9C59A3DEC000030001DE803B600C2F1E000CD7C00000900CD5C000000FF92D0 05E10005E17003B600C2F20400CD7CC2F21000F56A033238FFFFFFC2F2780010 260000300021F9000028FF92D0601232FF94D0FF92A005E100F432F805E100C2 F22C66E8880000006021D3FF92D0F432F805E100C2F26C66E94B00000060D91D>]endobj 28 0 obj <>stream xœí} Oi–¶s1Ónó!H ‚Âf0IX&|&\‡5Ù| .FÁËe@_˜ F€Âm#I‡ÉÆÍF ¼?tÏ9ï¥Þ*@fâäö‚ Æ—AçbSHôïÝœiñ×­ôÆ |E ã‹`c±ªw ~~^±Iäo*ô%1Œ/+óŒÕû'6+6Áö³ò3ßBÁxo¨xÌïŸh‘¿B_ƒÁøhÙXœ{2PÜ]ï÷û»Aø¹«ÁøFp3¸Ÿ u‡zçªxƒñm`3Ä¡ýÅÐB¡¹3…¾ ƒñ…н±ØTõ$„xRÅÓúŒoþ`0^UÕ47×gî3ßî÷nãKñÅ•_ }) ãËâ—¿ßߢ©½×Â`0 ˆë}…¾ƒQT³ø3ß(n3ûŒoÑB_ƒÁ( b· } £0ˆ²ñg0¾MDÙø3ß&˜ü Æ7ŠëìûŒooXúŒoi&?ƒñ­àæó ¿_/äã®ü­µ_ð‚~ëë…¾ã7Ÿ·øWz—:7®|×ùžÔëFþÉ|_ôÒÎÇZÏwTè‹`0þA1S/‰òW6®t^¹Ò Mþëyä_?ðùþ—?× —Âäg0.‰ûÀxã †zõn,Zm;{­Ñ÷ïÿ[È¿ñù²L~ãÒ~'(Ÿ¯P °”?=4NÍ=óù’¨¶]¸Nî–ŠkI2ùŒKÂOt¯j©ðw^¿¡üѨ1©¿•ˆbë»V€ë´aý\^ +?ƒqiÜDÅ‚G3”ñ9¿Yï›üA2ß—ÌØö?˜Ïd“Ù$\+?ƒñˆåïÓÑXçw6å¯Öä§:!YhåÏmõ3@~V~ãó0°Ñ¹!Ž&déO+4:(^S…6‹;Tþ7…¸VDi&›Aîù³>îçg0. g°Sµl!@“äÔÂ/Ò}‚ü€ú@ÿd6+²V~㲘Yê\zNGcADgç†$ÿmÝÑ×*óý¬(ùÔögüÙ üŒÏÅÍÅ`pf—‚ ý@AþÃh4-ϱ+a ~D~¬øù²lûŒÏBïÒâRh³Â_ BÀ Èo ?)¿¦~mf¹ŸM²íg0>þÅx|1¾ø!þ!aø$òGÑ}¨üY‹ý…·ýÄþ$Û~ã³P¬ÿP¯Š ,Å—üףј>¥Õ&üÙB“?+J~äüïòZŒlܯB4‰†ô_ôÓL~cX¿™óg}ÉÆ|ãÚèëöð~*mwwyxïã×p:üëÙY8ŽÐgÚÏú_{jFTüPù“IV~ã3ðóœDÕñ c|Ï|¾?(É—ìÅæøº½©ðþ~d?Lã^ ¯6œÏeÀéò*œFàùRûíkÎó¦J!ßÇFôïÉRw]l\øc0.ŒÇOû逹/GõËQ}IÓö'³è¼3™Tþ—­½ìÚOõS¤û€×ÀíÝÿ>ïçOV‡VOV"«4æá“?^:,ÃÔ¸`þ¸èë“I¿;ãâ(Ö?é}ÒÛ;ÛÜ\SÕDLíóŠQ}¶j?xnâþxžòçºà>)ŒJt&ú¯6ä\|xHpÿ%Š?6éýáKöSvFùýã2é—}D8bò3—¿7ê õÂz‚ìŸû'£Øgé½:H’éGÔ8¾ho>±OÔßGþ*âõONVON]~ûס“!|t?ŒÊOQƒØIì›ç"ùÉ÷Ó ¿lR;òñãRh …B+ÐBž„zç~3 ýF²o R(¿Ãö¯ãß—ôO¡‚£éôzƒ¾çgþ£C#'CC@þW-å—ÒI$Ì€AäÏ’ñÏR¹ß¢>+?ƒqÜX‘Qèý-–Óoúœ@Ê÷3™yÛ×ìu%ÒôƒòHÈW¥ò¯"ÅÚ:424´{‚äÔ틤63¾ùµðgù…+ö2Œ‹âþ€ÄÊÊñÿ/­7¶™õ¾,ÖÝl9n^Ⱦþyð°HãWQ×ÑÞíæì¿ündhw„„ÿääDÿ0±¬? ?|á²uvƒ~Ó÷[®„•ŸÁ¸8~(¦FüýÿÆ›NÛïÓõ>‡ò¿ÝGîKáO…SaUëá‚ ŒüjûáW#€¡]Š (þ»ïÎPýQù÷¥ö'ö­Ó…ògÇůÓ0ëêXùŒ‹ãfw1Bñ`eÓxÓÅô'E_ßxÖ$s‚È¿¿Of=œŠDVwÏ^*ú½GvGFliÿè±DP_†½³U•õ§(–XÒß  ~Ö0V~ãsð˜È?V,B¿ÅxÓ-çÝüY[Á¯Qr;ùQ¶w‰æ¹_¥ðCÊOLkþð[úÓ‰ ÿOê¯Ã`üçUo_"ѧËj–Ä_¬èa]+?ƒqq<öuwûíÊŸWíOf{¨ânöóß½Šäߗ‰h½>¢Z?æûCÄSú‡FýÉõ[oìb¹ÈIääe¿êÓ0®ËýjjU‹`åg0.·€äÿ@…ñ^žîõ³Rû Û?Ü¿ M°×zg;ù‡PÞIù²ÞÙCê¿Bã?tbô…_î6ŒöŸ:û¦ˆúBû1Ð"ž¬ü ÆgÀß]è®Gþ#û7'´›å>_6LÿÞÕ« I}ª÷åŒ÷ND±ì=ÁzãT ?ÕûOÞ}âÅjî ågÅg0.çâ›þz’ÿâ çZ åÙÏ¿Qgâ*¥ü²à×`¾Òä¦b?°ý­¥ð¹·Èþ·ôŽóý„é´˜‡œØ×ƒ¦Ÿ'ô0Ÿ¿±¼¿ ù³¦ïÏŸÏ?ÂÒ/¹i6ß;¥þ!)ü#µÞQÊ/»úWëg££Ín£€ Èr¿˜Ù“dåg0>é3Ù_ßíF~£“?ébûß_¥”_VüÃ~¥ò á7ëýôRÒÿDŒðÇ©½‘ðnÿiUc|Øö3Ÿ‹XßðþŸ-úÍ8O±­á—Í_Ìc„_Ò?’Ûß=#é—"ÿÖHúÿ›Ê}¤üb€¿œÜüO¥vïæ\/7#†øeiF?Oèa0.ëÑ´wÂoÙŸ¯üz4 ÖûòÉß|ÕÈù#‘HûIûnûî¶³wgTî“Å~hVfŸÃ”_)ÿÍ ¾4-(Ùop+ŒÓ¼½€/“ŸÁ¸q±®–– „fÿŒó,Û~.ä§^þ„®ö›Ëøà„>Tþ!9Êgä­Áè¿êœ_ð%åËñ½)ç„~‚ZɇÆösÎÏ`\bîîf ÂbÿŒó´‘¿áêUQï¾GçÍÓ}ò“!1ÆG)¿9ÌÇÈù‡TÒ/föÐJ@ûûgy—lüàjšóN`0‡\¤s`ÐßüY‹û.ýüS ´ýªÚŸ@ÛNÚ/çõœ¨‚ñß\ÐkïJùMåˆ~`üö^C„îê˰ò3—…Z¤³bsSð_°¿þ†óDSùÝ ~ V¹’~þ”X¿/,øIåG¡·­æ·÷VŒÔ·ôÐËy8Ù­”?Ë9?ƒqY(î?ž©ûÏU~Ëõ»ÙþI³Ú/&öÐ^±Ž‡˜²«¤ß¾”gî?‡dÊ¿z"‚)D(?.äçø­ŒZÊGäülûŒ ã0z]ùgff*Èúûgœ§ZÕ~*÷çð›Õ~k”ϼ´ý‘°š×£êýNò{½§ÿI¿Ö}±–Ìùû Ǩ}]ìϰò3—BßmuWŽŸgfn û+Ðø»“ß>³'o„_s¾ò‹¥|(é²ÿ<ò{ñž# ü/UüHøi^ŸsÔÀ¸X»;ÃÕ~ã’°îÁûóù'>Jþlþ:E??P_Tûç§§kÐöâpÎõœ¿;‘®^ÌçO!õ÷‰œíùÊß®gõ‘úæÊ{©ˆUïK$–moÊÛu‰A>¬ü ÆE¡ïŸ®æÆïåüëæb^Ùd&ï뎤í—+ùØjt¹ß£»wz:<üÓÙÙªÉâZ¾“ï†ï´/ù›‘KyHåŸü¤ÿ\ƒ!q]õñ#€ø7ˆûçVû¬•2if ꃜu ñ“S{‘ý~ãûXÆ;ûixô•}a®W¿þôŽº÷iBϪ¹’O¿Èùé ¯:rþ.P~ZFL(¿ìyàî~ãÓPm¸þDz§]ÿ„ë¿ucJ/®Ü]:utw»+c¸ûVáûåœÞýˆõVƒ^»ŸîÌ1¢~{ÿðoâ^]«ÏDÂäÏÙ®¥±Tß±'‰~¤±}ª6yð·øWa0¾ÜÖwáõz®æ›ÂŸ?¯Ù6+í=Xt›²ÎÈIòÓHŸÈ~*%Ù¿&‡í…Qßi!ÏœúÈ«= Ÿ`Ý‘{]?Ú~rýÖÚÝ„F½x¯yûàäßè†ÁøÊÑ­¶Rþ_**Ôð^Êøëýÿ7ï>›ôc;ÊïkãŒvs˜ÎÇ 7Œö¾”ÔÇÁ{â†\Æ*^'CrmO9£'<šÃ?ï5¤tOÖûS{ÚEO_FŒñÑø[þó0_/Ž>ïÍŠMIý‰s¦ôz3ö™=”rÛoו벆øÒŒ~q“nû}ºWmkôâÊž«òîÜrdßnûnX ðÙÜ/áè7œ”Â/”_oÓã«EµYïÚcÓsúüÝ3y¨±I?òÍ·mÎÍ‘îí£Ûõí«™}4Ä_êÿÉIÎøDîäÄä¾ÝgõóEð wíWâmÜÇ‘ý>¾cƒqA˜äÿ¹¥E®å1¡–ñšÉûÀ¤©üú>½öþþvYò»º/²~âp8bQ(n/Üë„_Ýw>¢—ñÀé¼h$rÎk—Âï3oÒËýý Æ'!jÿ—‰–‰½ŠW½¿¾Û…ü9Û=»ô}zí'Í'(ë$ôr>á”pþ’ú«Î¹w«Öd¾°^ÄCÌé‘ý|ùƒZ³êf]jØnÜßÏ`| ¢FOß ÿ6Å}¼oOÞžŽå<|IºQ¯“ü¹°ãK¦ù}b–®S÷»V¾§¤ÂÒò§h= ü®¿æ}Ä»7žµ:ú4Ú?÷ß„Áø&`*ÿ¦céÞn—›vÞ›Ê/´?›qŽá?KÐðþ«2éW{åb~n#ýÞ™sø#j6_Šfó%ö#®“&3bÙn›i½ü¿ƒñ á¶EþÇzÝîz¡ûn·ëäžÔ÷ɂ޸º£ÒËôòNÝ)¹œW$üSÎõRŽ„á§•»ÂF­…?õNy±Ž‡-áQ> ƧÀPþ›@yâ=4y«¾üu"r]û‘üI`¿Ë Úá”è—Py?!Ü;÷bFOÔŠ½ÒóGhh_äìü¹“ìp°i?“ŸÁøD«£êf-HzÁüzy—î7åÕd²–öÌ¿vP:ÚŽºäO…çwï~däýéðÙ‰òü4¶/uÒ_°aªÖ”ýÄñòƒß?ŸÁ`bzxïc}{nIý±âWå>>::ZoþØŒýWk¯ÖÄj>Ÿ|Qê§á½Â\^Î'žÎ`0ƒQq·¯÷—n…1BqñÀÀÊïŸÁ`üCã ø~q´9f˜Ügò3_/¢Ñè!î×kæ÷WZ }y ãï…ê¨XÊç9¾˜hOªÜ…˜ü ÆW‹¾¨ä7t/–¢~Áäg0¾^û¯{½cHxE|IýÞ¹‰B_ƒÁø»!Åš_Eh%´‚¬³/˜êí›cåg0¾b ‚ôGBÈþf>P¸ÏÊÏ`|ÕÀ¬ÿ@wÚˆø`ø‘úMMþB_ƒÁø{¥ÿ7ú^¤}¯Ð|ä~0(ˆÇk  Ø`D‡öí×­ØÚ·Û[U;/$`4 ‡ý1íÙ÷hýÿÄÿm1¸ º¿|'€þz«îá`90>FB=»S‚ìóîÌvô:hØp%FŠ’ÙXÚOe-#¯C;à-¸³0ˆ~¿£Ž–¯ë0Ïi[hÃìÂû¢Òƒ!¡­r– ±J¢}Y]ú‚­…E”Q<ž‹åü–æ›Òo ì™MÐ<½G> }®öŸ>85èoñœ8ß¼ö Ù­h¿$‡‡ØÐ¬K7 Žá@÷©MXE÷#hÃJûG%ñiwËlŠñ¸5yKcRøIý~;é—÷‘ößOM‚ðO~?e6EðÈ{`?6ê#í[‘îÛí†%  6¤=vÏZ%ÿéÙ >0_qý˜žk„-˜·”ŸœB#n©šFxn´¸ßˆÜo´´ß&þëkmD×Ú ŽDÄGšÙáàGhHtr?RC¼/ŦP|—dÇnÄthÁ}â|¾ê)U„—ÜïÁ嬀ö¸¨º‚,nÂøp‡/ðöZ´è…XçÒ"ÿÅÅ¥xü7,ûýWÓ"ÙýÅÅà´ ù©Âm«{8‹‘òw$?p\áNݬ`{Ñ2à¡é‚ž:.£W]ûï -ðUvà7¥á é“uóœ’_Í=ôõÓ 1V½;++ñ¯áÃø±jØÅ.B}—(3viÒ~öôþÁyÚo×} þÞšMøÅ4gü›=pŠ?i¿Hš…ðÛÄŸ( •²¥ûÃnÀÝ~up«ßˆyªßO´¿µ,èkR‡bÿÔÔ䔡ü¦P1`Usaý¿ßކ͖´£êߤð‹½]÷Qõå^„€VKôÿÏ5ØTN`—}|Týy¢;<”ú7ZÍzì'í·YýÒ5°é>„‚kZ÷1àëT@(ÿÔý§OÇŸ"åi/--5%ßd$  ‚~´ÿúÔ”ð‹-ké?ŸêÿúǽKAäz$þŽþöaì>¼ ;ƒ6ò— ¦nÕŸ1⸠‘gyžö*ëLò×S…š;•m·­c«Þh¥çE>ùÓm•Èö¨`;üNG”XN¢m–ªJ ñ³fÁàSèoùý\^[ÚEûÅÞ]û ö›ªoj¿®4ÛËk¦ò?²ë¾Ò~Cù×µÝ?’H?,µ_‰¿Cûï’ðdXÖz/›¤~¿aü%ó—…ç—Ú?)ÔßÔ} (÷ úÀý)Ãú;tÉßÞJÛ¶!üZ÷Û¡µ¶Ãó±6Rú•ë—–_ÿXk¿|¨ÂÀ<ÑÞR~“þ û5]`ìÊoñ^»WíWºÄ¿&ŒÿS²ü:ï?Ê/Ô_˜~|HÖKá—q€èýC)Ñ^k¿f¿”~8øAZ±vµd~’¨/´ö —Ÿ•¼'êÓß²šüõÀsäz0ø¯ÿGûýñ½Øè„f#êô½Ù鯄ò{ªù%ëbH¢K ò÷É¿Ùu\uü-²ÇŠ®ÏzòÈß7}{‡¾IüŠ·dzº#`½”D¼úð½@삾ߌ.Å?þ¼"à=öÎ×þ½SS÷Úß,ÙeßEù­ò_3é¾~<Àl)¿®Ú]­ûÃ:ëwhÿ­~Cùïjí_6ó}ñ÷kí—•ïʯ´_Å€×È{tû–÷ÝŸ²åû¢¡÷Ý*”¿µÝ,á[[-ÁoÕOZûI÷üHÿg†æ«ä=¥ü˜üká×A e…€®FWt5v]k¼ÖUÛu­ËUûµî“í¿&…_Š>=¿Mè?E’~ÓúK`©öãš÷ãvíÏëïùAi&©š¢¿ÔþŒÖ~"¾Èõ³Û X ±òG4ÿÑ¿,mtv¯t^±‘ŸJóŽ-¨¬M“Á®ö´íx0 zh7íÑl‘ßëé»;1›'­óp£Eõ‹Ù<òÇ*ËËMò{^D©œ¯È§:–Æ«óP ©óô]LùÍBŸ“úJûEÕ/m¯ùS;GûAùO䷴ߪó­iöËðHª¿¡ÿGÍ–ö7«¼_è¾,õ©@0_i¿æ¿%ýH}þ»†õy¿~Ò}§òkö[¼'íŸt~Ù€1€lD€©ísŠ}ÛDúvÊûÛ-í?&ío•vÍ¿`¾!ýó¸ÕKÅ—ûg¦öÏ+áGç¯6Óù§„ô7Ú­€Úk°á£K‰¿Mû­Œ™MýI÷§ïÔíéSÅþ[ѯÔHdª?Žâ/ÆõÇ•ç_ú„Û·©D⟥[júä--Í‚ßãP'ð|ã xüà*þŸ¢èþ£þËÿÿ°ñ ºïknm"}O“òƒ°W")Óƒ“-$#ïê<1'ùït”‹à±Yzñf]™†(ìÚòÈuJÛeRoYâ xÚðc垎 uõÙ‚€KÏŸ—”ß)þB÷õ]´ß©ûμÿ•tkpdïÌKüåi¿Ðÿõ#;ý…0µßVï7´_øÿ~³âÒ¯u_)¿ ·–ÏÑþ)ËX1à{¡ý´ÕñÚöŸ„[$þöÎ@$;Ðÿeë±ØTõï™,ø¡òߟKñŸ¯12~É|!ùêXûS5–æKÆ+÷/F¨íïß…´wA+hç/»~|o6Jd’þ÷¥FÞ/CÀ¸¦©©û¢Ê/{þ¤ ûb‹¼3¬Tÿ¬ ½Èû…óÏêq×¹•.@ü?ß²qeãÊ•ÎNÜÑ3Ä‚¥ùcuTàv´Z÷»‰ìÚã½#l¬ˆXX$U˜̦¤Ü´ý^ÙùîU¹|ò£“Ç‚ßV>ùÛ:›–Ah:0h¼„ÏâW÷Űᢠûí!À .Í=çGíß;gðO>ý8JþÍkhûÖ_Ëÿš~›ö«´ÝMùlõþa©ûŽa?*Õ¿%^P@‰ÿ¤j’úùÚ?µl)ÿ¤*øOé^?5ö=?Ù}cô=(Û/ˆ/°-+ôLº/©ÿRåüÊjŽçIúíŸÊ/çµù¯‘Ù¾­æ§´^°¿F¿@î×BÂÔ'þ»û±èÿãÁ5£äoÚcèÏ{½·[YúÏH¿/[©æ½Ùß/¸}~=¢¨€LþÅÞÒ~!öº»ÏVðc˜’ïJû´-íÇç´QíÏÙ´_qÝÅø“'x`y¿ÃøËœ_ê>>ÖuÙïÐ…ß>pØÔKû‡UÍßÈûupKÕþßAøûoYù¾Nío˜4h?)Šþ“†ðË1>$ýTó±À>þOdþdÿ[·[e ÀìÓ. ~/)÷©„_Sÿeÿ ÿŠþRþíÊߨò~Êú)é@•üæÍ í>\#×ßEY?…gÚoØ~=ÔGþM²_û\¤ýOu¹ÏðýôœQIáû5ý3Õá×#R~â;²_åüTû3 R¤ü¢»O0ßÇ÷±wEîñ7µÏÒþ:ówjÿš«ö»´WfÞoô£@Ð,¿ììü_äû‚þ„ñu‡ö÷ëš¿‘÷[)¿½Ãó}cدCÿyÿ”îó³úù•ù—%ÿ)ìé{=eËù ío•UÿV™ðËÑ>ªòGy»RûgÇVŸŽç­¿Çbä¯ÕõW£³ÿFÕÝ'Jïßj÷Iþ‰÷Ž´ëý.ôWÂ/ºûóéo9Ô~‹ýV©Ÿ^«:¿òšû2ûÏHÐ#¶¬ä~ÖªøgDÕ¯ÇR~à'ºûðQhž1 ƒÁ`0 ƒÁ`0 ƒÁø\üƒÔ endstream endobj 39 0 obj <> endobj 40 0 obj <> endobj 41 0 obj <> endobj 46 0 obj [/Indexed /DeviceRGB 255 <000000FF00006B6BD2FFFFFF666666FF66667B7B7B6666C24A4AB96B6B6B4242 B1F30000FF9090B1B1DA888888737373B1A1A1FFB1B1CC6B6B181818FF33337B 7BCC6666B9E33333B9B9B99090D2DADADA8888CCB98888FFC2C2424242E37B7B FFE3E3DA9999FF1818FF7B7BEB2121B1B1EBFF4A4A8080D2C2C2E3A9A9A93333 33F33333D252529090E3DADAF3CCCCEBEB1818FFA1A1999999A1A1DAB99090FF D2D2525252EBA9A98080E3A1A1E3EBEBF3080808FF08087B7BD2FF73737373C2 5A5AB9B1B1B1292929FF4242E34242C2C2C2E3E3E3DADAEBF38888FFF3F3EB90 90FF2929FF8888C2C2EBB1B1F3FF5A5AD2D2D2EB4242E34A4A9999F3CCCCF3A1 A1F3C2C2F37373D2FF6B6B8080806B6BC26666CC5252B94A4AB1FF9999B9B9E3 B1B1E3909090B1A9A9FFB9B9D26B6BCC7373212121FF39398080CCE339399999 D29090DAC28080FFCCCC4A4A4AE38080FFEBEBFF2121FF8080F32121B9B9EBFF 52528888D28080DA393939DA4A4A9999E39090EBE3E3F3DADAFFD2D2EBF31010 FFA9A9A1A1A1A9A9DAB99999FFDADA5A5A5A8888E3A9A9E3A1A1EBF3F3F3EBEB FF101010FF10107B7BDA7373CC5A5AC2CCCCCCEBEBEBB9B9F3B1B1FFD2D2F3CC CCFFA9A9F3C2C2FF6B6BCC5252C2D273739999DAC28888F329298888DA9999EB E3E3FF8888EBA9A9EBF3F3FFD2D2FFF7B796FC949005E770C2F0F4F7B82899EB 94F741F7FC9490F7B84E6D892D05E770C2F118F7B77BF741F7FC949003EE8803 D600F713EE00016FF7A2E3007DF1C2F164000FF8DF0008402004F7A3A0C40000 1F200C000FF8000000C4000CC40000DF0008000000F713E22A001EC4000CDEFD 30C2F18CF7A10E03EE8803D60000000305E00FC2F1A800E44A05E0F8000032F7 B9C59A3DEC000030001DE803B600C2F1E000CD7C00000900CD5C000000FF92D0 05E10005E17003B600C2F20400CD7CC2F21000F56A033238FFFFFFC2F2780010 260000300021F9000028FF92D0601232FF94D0FF92A005E100F432F805E100C2 F22C66E8880000006021D3FF92D0F432F805E100C2F26C66E94B00000060D91D>]endobj 45 0 obj <>stream xœí} Oi–¶s1Ónó!H ‚Âf0IX&|&\‡5Ù| .FÁËe@_˜ F€Âm#I‡ÉÆÍF ¼?tÏ9ï¥Þ*@fâäö‚ Æ—AçbSHôïÝœiñ×­ôÆ |E ã‹`c±ªw ~~^±Iäo*ô%1Œ/+óŒÕû'6+6Áö³ò3ßBÁxo¨xÌïŸh‘¿B_ƒÁøhÙXœ{2PÜ]ï÷û»Aø¹«ÁøFp3¸Ÿ u‡zçªxƒñm`3Ä¡ýÅÐB¡¹3…¾ ƒñ…н±ØTõ$„xRÅÓúŒoþ`0^UÕ47×gî3ßî÷nãKñÅ•_ }) ãËâ—¿ßߢ©½×Â`0 ˆë}…¾ƒQT³ø3ß(n3ûŒoÑB_ƒÁ( b· } £0ˆ²ñg0¾MDÙø3ß&˜ü Æ7ŠëìûŒooXúŒoi&?ƒñ­àæó ¿_/äã®ü­µ_ð‚~ëë…¾ã7Ÿ·øWz—:7®|×ùžÔëFþÉ|_ôÒÎÇZÏwTè‹`0þA1S/‰òW6®t^¹Ò Mþëyä_?ðùþ—?× —Âäg0.‰ûÀxã †zõn,Zm;{­Ñ÷ïÿ[È¿ñù²L~ãÒ~'(Ÿ¯P °”?=4NÍ=óù’¨¶]¸Nî–ŠkI2ùŒKÂOt¯j©ðw^¿¡üѨ1©¿•ˆbë»V€ë´aý\^ +?ƒqiÜDÅ‚G3”ñ9¿Yï›üA2ß—ÌØö?˜Ïd“Ù$\+?ƒñˆåïÓÑXçw6å¯Öä§:!YhåÏmõ3@~V~ãó0°Ñ¹!Ž&déO+4:(^S…6‹;Tþ7…¸VDi&›Aîù³>îçg0. g°Sµl!@“äÔÂ/Ò}‚ü€ú@ÿd6+²V~㲘Yê\zNGcADgç†$ÿmÝÑ×*óý¬(ùÔögüÙ üŒÏÅÍÅ`pf—‚ ý@AþÃh4-ϱ+a ~D~¬øù²lûŒÏBïÒâRh³Â_ BÀ Èo ?)¿¦~mf¹ŸM²íg0>þÅx|1¾ø!þ!aø$òGÑ}¨üY‹ý…·ýÄþ$Û~ã³P¬ÿP¯Š ,Å—üףј>¥Õ&üÙB“?+J~äüïòZŒlܯB4‰†ô_ôÓL~cX¿™óg}ÉÆ|ãÚèëöð~*mwwyxïã×p:üëÙY8ŽÐgÚÏú_{jFTüPù“IV~ã3ðóœDÕñ c|Ï|¾?(É—ìÅæøº½©ðþ~d?Lã^ ¯6œÏeÀéò*œFàùRûíkÎó¦J!ßÇFôïÉRw]l\øc0.ŒÇOû逹/GõËQ}IÓö'³è¼3™Tþ—­½ìÚOõS¤û€×ÀíÝÿ>ïçOV‡VOV"«4æá“?^:,ÃÔ¸`þ¸èë“I¿;ãâ(Ö?é}ÒÛ;ÛÜ\SÕDLíóŠQ}¶j?xnâþxžòçºà>)ŒJt&ú¯6ä\|xHpÿ%Š?6éýáKöSvFùýã2é—}D8bò3—¿7ê õÂz‚ìŸû'£Øgé½:H’éGÔ8¾ho>±OÔßGþ*âõONVON]~ûס“!|t?ŒÊOQƒØIì›ç"ùÉ÷Ó ¿lR;òñãRh …B+ÐBž„zç~3 ýF²o R(¿Ãö¯ãß—ôO¡‚£éôzƒ¾çgþ£C#'CC@þW-å—ÒI$Ì€AäÏ’ñÏR¹ß¢>+?ƒqÜX‘Qèý-–Óoúœ@Ê÷3™yÛ×ìu%ÒôƒòHÈW¥ò¯"ÅÚ:424´{‚äÔ틤63¾ùµðgù…+ö2Œ‹âþ€ÄÊÊñÿ/­7¶™õ¾,ÖÝl9n^Ⱦþyð°HãWQ×ÑÞíæì¿ündhw„„ÿääDÿ0±¬? ?|á²uvƒ~Ó÷[®„•ŸÁ¸8~(¦FüýÿÆ›NÛïÓõ>‡ò¿ÝGîKáO…SaUëá‚ ŒüjûáW#€¡]Š (þ»ïÎPýQù÷¥ö'ö­Ó…ògÇůÓ0ëêXùŒ‹ãfw1Bñ`eÓxÓÅô'E_ßxÖ$s‚È¿¿Of=œŠDVwÏ^*ú½GvGFliÿè±DP_†½³U•õ§(–XÒß  ~Ö0V~ãsð˜È?V,B¿ÅxÓ-çÝüY[Á¯Qr;ùQ¶w‰æ¹_¥ðCÊOLkþð[úÓ‰ ÿOê¯Ã`üçUo_"ѧËj–Ä_¬èa]+?ƒqq<öuwûíÊŸWíOf{¨ânöóß½Šäߗ‰h½>¢Z?æûCÄSú‡FýÉõ[oìb¹ÈIääe¿êÓ0®ËýjjU‹`åg0.·€äÿ@…ñ^žîõ³Rû Û?Ü¿ M°×zg;ù‡PÞIù²ÞÙCê¿Bã?tbô…_î6ŒöŸ:û¦ˆúBû1Ð"ž¬ü ÆgÀß]è®Gþ#û7'´›å>_6LÿÞÕ« I}ª÷åŒ÷ND±ì=ÁzãT ?ÕûOÞ}âÅjî ågÅg0.çâ›þz’ÿâ çZ åÙÏ¿Qgâ*¥ü²à×`¾Òä¦b?°ý­¥ð¹·Èþ·ôŽóý„é´˜‡œØ×ƒ¦Ÿ'ô0Ÿ¿±¼¿ ù³¦ïÏŸÏ?ÂÒ/¹i6ß;¥þ!)ü#µÞQÊ/»úWëg££Ín£€ Èr¿˜Ù“dåg0>é3Ù_ßíF~£“?ébûß_¥”_VüÃ~¥ò á7ëýôRÒÿDŒðÇ©½‘ðnÿiUc|Øö3Ÿ‹XßðþŸ-úÍ8O±­á—Í_Ìc„_Ò?’Ûß=#é—"ÿÖHúÿ›Ê}¤üb€¿œÜüO¥vïæ\/7#†øeiF?Oèa0.ëÑ´wÂoÙŸ¯üz4 ÖûòÉß|ÕÈù#‘HûIûnûî¶³wgTî“Å~hVfŸÃ”_)ÿÍ ¾4-(Ùop+ŒÓ¼½€/“ŸÁ¸q±®–– „fÿŒó,Û~.ä§^þ„®ö›Ëøà„>Tþ!9Êgä­Áè¿êœ_ð%åËñ½)ç„~‚ZɇÆösÎÏ`\bîîf ÂbÿŒó´‘¿áêUQï¾GçÍÓ}ò“!1ÆG)¿9ÌÇÈù‡TÒ/föÐJ@ûûgy—lüàjšóN`0‡\¤s`ÐßüY‹û.ýüS ´ýªÚŸ@ÛNÚ/çõœ¨‚ñß\ÐkïJùMåˆ~`üö^C„îê˰ò3—…Z¤³bsSð_°¿þ†óDSùÝ ~ V¹’~þ”X¿/,øIåG¡·­æ·÷VŒÔ·ôÐËy8Ù­”?Ë9?ƒqY(î?ž©ûÏU~Ëõ»ÙþI³Ú/&öÐ^±Ž‡˜²«¤ß¾”gî?‡dÊ¿z"‚)D(?.äçø­ŒZÊGäülûŒ ã0z]ùgff*Èúûgœ§ZÕ~*÷çð›Õ~k”ϼ´ý‘°š×£êýNò{½§ÿI¿Ö}±–Ìùû Ǩ}]ìϰò3—BßmuWŽŸgfn û+Ðø»“ß>³'o„_s¾ò‹¥|(é²ÿ<ò{ñž# ü/UüHøi^ŸsÔÀ¸X»;ÃÕ~ã’°îÁûóù'>Jþlþ:E??P_Tûç§§kÐöâpÎõœ¿;‘®^ÌçO!õ÷‰œíùÊß®gõ‘úæÊ{©ˆUïK$–moÊÛu‰A>¬ü ÆE¡ïŸ®æÆïåüëæb^Ùd&ï뎤í—+ùØjt¹ß£»wz:<üÓÙÙªÉâZ¾“ï†ï´/ù›‘KyHåŸü¤ÿ\ƒ!q]õñ#€ø7ˆûçVû¬•2if ꃜu ñ“S{‘ý~ãûXÆ;ûixô•}a®W¿þôŽº÷iBϪ¹’O¿Èùé ¯:rþ.P~ZFL(¿ìyàî~ãÓPm¸þDz§]ÿ„ë¿ucJ/®Ü]:utw»+c¸ûVáûåœÞýˆõVƒ^»ŸîÌ1¢~{ÿðoâ^]«ÏDÂäÏÙ®¥±Tß±'‰~¤±}ª6yð·øWa0¾ÜÖwáõz®æ›ÂŸ?¯Ù6+í=Xt›²ÎÈIòÓHŸÈ~*%Ù¿&‡í…Qßi!ÏœúÈ«= Ÿ`Ý‘{]?Ú~rýÖÚÝ„F½x¯yûàäßè†ÁøÊÑ­¶Rþ_**Ôð^Êøëýÿ7ï>›ôc;ÊïkãŒvs˜ÎÇ 7Œö¾”ÔÇÁ{â†\Æ*^'CrmO9£'<šÃ?ï5¤tOÖûS{ÚEO_FŒñÑø[þó0_/Ž>ïÍŠMIý‰s¦ôz3ö™=”rÛoו벆øÒŒ~q“nû}ºWmkôâÊž«òîÜrdßnûnX ðÙÜ/áè7œ”Â/”_oÓã«EµYïÚcÓsúüÝ3y¨±I?òÍ·mÎÍ‘îí£Ûõí«™}4Ä_êÿÉIÎøDîäÄä¾ÝgõóEð wíWâmÜÇ‘ý>¾cƒqA˜äÿ¹¥E®å1¡–ñšÉûÀ¤©üú>½öþþvYò»º/²~âp8bQ(n/Üë„_Ýw>¢—ñÀé¼h$rÎk—Âï3oÒËýý Æ'!jÿ—‰–‰½ŠW½¿¾Û…ü9Û=»ô}zí'Í'(ë$ôr>á”pþ’ú«Î¹w«Öd¾°^ÄCÌé‘ý|ùƒZ³êf]jØnÜßÏ`| ¢FOß ÿ6Å}¼oOÞžŽå<|IºQ¯“ü¹°ãK¦ù}b–®S÷»V¾§¤ÂÒò§h= ü®¿æ}Ä»7žµ:ú4Ú?÷ß„Áø&`*ÿ¦céÞn—›vÞ›Ê/´?›qŽá?KÐðþ«2éW{åb~n#ýÞ™sø#j6_Šfó%ö#®“&3bÙn›i½ü¿ƒñ á¶EþÇzÝîz¡ûn·ëäžÔ÷ɂ޸º£ÒËôòNÝ)¹œW$üSÎõRŽ„á§•»ÂF­…?õNy±Ž‡-áQ> ƧÀPþ›@yâ=4y«¾üu"r]û‘üI`¿Ë Úá”è—Py?!Ü;÷bFOÔŠ½ÒóGhh_äìü¹“ìp°i?“ŸÁøD«£êf-HzÁüzy—î7åÕd²–öÌ¿vP:ÚŽºäO…çwï~däýéðÙ‰òü4¶/uÒ_°aªÖ”ýÄñòƒß?ŸÁ`bzxïc}{nIý±âWå>>::ZoþØŒýWk¯ÖÄj>Ÿ|Qê§á½Â\^Î'žÎ`0ƒQq·¯÷—n…1BqñÀÀÊïŸÁ`üCã ø~q´9f˜Ügò3_/¢Ñè!î×kæ÷WZ }y ãï…ê¨XÊç9¾˜hOªÜ…˜ü ÆW‹¾¨ä7t/–¢~Áäg0¾^û¯{½cHxE|IýÞ¹‰B_ƒÁø»!Åš_Eh%´‚¬³/˜êí›cåg0¾b ‚ôGBÈþf>P¸ÏÊÏ`|ÕÀ¬ÿ@wÚˆø`ø‘úMMþB_ƒÁø{¥ÿ7ú^¤}¯Ð|ä~0(ˆÇk  Ø`D‡öí×­ØÚ·Û[U;/$`4 ‡ý1íÙ÷hýÿÄÿm1¸ º¿|'€þz«îá`90>FB=»S‚ìóîÌvô:hØp%FŠ’ÙXÚOe-#¯C;à-¸³0ˆ~¿£Ž–¯ë0Ïi[hÃìÂû¢Òƒ!¡­r– ±J¢}Y]ú‚­…E”Q<ž‹åü–æ›Òo ì™MÐ<½G> }®öŸ>85èoñœ8ß¼ö Ù­h¿$‡‡ØÐ¬K7 Žá@÷©MXE÷#hÃJûG%ñiwËlŠñ¸5yKcRøIý~;é—÷‘ößOM‚ðO~?e6EðÈ{`?6ê#í[‘îÛí†%  6¤=vÏZ%ÿéÙ >0_qý˜žk„-˜·”ŸœB#n©šFxn´¸ßˆÜo´´ß&þëkmD×Ú ŽDÄGšÙáàGhHtr?RC¼/ŦP|—dÇnÄthÁ}â|¾ê)U„—ÜïÁ嬀ö¸¨º‚,nÂøp‡/ðöZ´è…XçÒ"ÿÅÅ¥xü7,ûýWÓ"ÙýÅÅà´ ù©Âm«{8‹‘òw$?p\áNݬ`{Ñ2à¡é‚ž:.£W]ûï -ðUvà7¥á é“uóœ’_Í=ôõÓ 1V½;++ñ¯áÃø±jØÅ.B}—(3viÒ~öôþÁyÚo×} þÞšMøÅ4gü›=pŠ?i¿Hš…ðÛÄŸ( •²¥ûÃnÀÝ~up«ßˆyªßO´¿µ,èkR‡bÿÔÔ䔡ü¦P1`Usaý¿ßކ͖´£êߤð‹½]÷Qõå^„€VKôÿÏ5ØTN`—}|Týy¢;<”ú7ZÍzì'í·YýÒ5°é>„‚kZ÷1àëT@(ÿÔý§OÇŸ"åi/--5%ßd$  ‚~´ÿúÔ”ð‹-ké?ŸêÿúǽKAäz$þŽþöaì>¼ ;ƒ6ò— ¦nÕŸ1⸠‘gyžö*ëLò×S…š;•m·­c«Þh¥çE>ùÓm•Èö¨`;üNG”XN¢m–ªJ ñ³fÁàSèoùý\^[ÚEûÅÞ]û ö›ªoj¿®4ÛËk¦ò?²ë¾Ò~Cù×µÝ?’H?,µ_‰¿Cûï’ðdXÖz/›¤~¿aü%ó—…ç—Ú?)ÔßÔ} (÷ úÀý)Ãú;tÉßÞJÛ¶!üZ÷Û¡µ¶Ãó±6Rú•ë—–_ÿXk¿|¨ÂÀ<ÑÞR~“þ û5]`ìÊoñ^»WíWºÄ¿&ŒÿS²ü:ï?Ê/Ô_˜~|HÖKá—q€èýC)Ñ^k¿f¿”~8øAZ±vµd~’¨/´ö —Ÿ•¼'êÓß²šüõÀsäz0ø¯ÿGûýñ½Øè„f#êô½Ù鯄ò{ªù%ëbH¢K ò÷É¿Ùu\uü-²ÇŠ®ÏzòÈß7}{‡¾IüŠ·dzº#`½”D¼úð½@삾ߌ.Å?þ¼"à=öÎ×þ½SS÷Úß,ÙeßEù­ò_3é¾~<Àl)¿®Ú]­ûÃ:ëwhÿ­~Cùïjí_6ó}ñ÷kí—•ïʯ´_Å€×È{tû–÷ÝŸ²åû¢¡÷Ý*”¿µÝ,á[[-ÁoÕOZûI÷üHÿg†æ«ä=¥ü˜üká×A e…€®FWt5v]k¼ÖUÛu­ËUûµî“í¿&…_Š>=¿Mè?E’~ÓúK`©öãš÷ãvíÏëïùAi&©š¢¿ÔþŒÖ~"¾Èõ³Û X ±òG4ÿÑ¿,mtv¯t^±‘ŸJóŽ-¨¬M“Á®ö´íx0 zh7íÑl‘ßëé»;1›'­óp£Eõ‹Ù<òÇ*ËËMò{^D©œ¯È§:–Æ«óP ©óô]LùÍBŸ“úJûEÕ/m¯ùS;GûAùO䷴ߪó­iöËðHª¿¡ÿGÍ–ö7«¼_è¾,õ©@0_i¿æ¿%ýH}þ»†õy¿~Ò}§òkö[¼'íŸt~Ù€1€lD€©ísŠ}ÛDúvÊûÛ-í?&ío•vÍ¿`¾!ýó¸ÕKÅ—ûg¦öÏ+áGç¯6Óù§„ô7Ú­€Úk°á£K‰¿Mû­Œ™MýI÷§ïÔíéSÅþ[ѯÔHdª?Žâ/ÆõÇ•ç_ú„Û·©D⟥[júä--Í‚ßãP'ð|ã xüà*þŸ¢èþ£þËÿÿ°ñ ºïknm"}O“òƒ°W")Óƒ“-$#ïê<1'ùït”‹à±Yzñf]™†(ìÚòÈuJÛeRoYâ xÚðc垎 uõÙ‚€KÏŸ—”ß)þB÷õ]´ß©ûμÿ•tkpdïÌKüåi¿Ðÿõ#;ý…0µßVï7´_øÿ~³âÒ¯u_)¿ ·–ÏÑþ)ËX1à{¡ý´ÕñÚöŸ„[$þöÎ@$;Ðÿeë±ØTõï™,ø¡òߟKñŸ¯12~É|!ùêXûS5–æKÆ+÷/F¨íïß…´wA+hç/»~|o6Jd’þ÷¥FÞ/CÀ¸¦©©û¢Ê/{þ¤ ûb‹¼3¬Tÿ¬ ½Èû…óÏêq×¹•.@ü?ß²qeãÊ•ÎNÜÑ3Ä‚¥ùcuTàv´Z÷»‰ìÚã½#l¬ˆXX$U˜̦¤Ü´ý^ÙùîU¹|ò£“Ç‚ßV>ùÛ:›–Ah:0h¼„ÏâW÷Űᢠûí!À .Í=çGíß;gðO>ý8JþÍkhûÖ_Ëÿš~›ö«´ÝMùlõþa©ûŽa?*Õ¿%^P@‰ÿ¤j’úùÚ?µl)ÿ¤*øOé^?5ö=?Ù}cô=(Û/ˆ/°-+ôLº/©ÿRåüÊjŽçIúíŸÊ/çµù¯‘Ù¾­æ§´^°¿F¿@î×BÂÔ'þ»û±èÿãÁ5£äoÚcèÏ{½·[YúÏH¿/[©æ½Ùß/¸}~=¢¨€LþÅÞÒ~!öº»ÏVðc˜’ïJû´-íÇç´QíÏÙ´_qÝÅø“'x`y¿ÃøËœ_ê>>ÖuÙïÐ…ß>pØÔKû‡UÍßÈûupKÕþßAøûoYù¾Nío˜4h?)Šþ“†ðË1>$ýTó±À>þOdþdÿ[·[e ÀìÓ. ~/)÷©„_Sÿeÿ ÿŠþRþíÊߨò~Êú)é@•üæÍ í>\#×ßEY?…gÚoØ~=ÔGþM²_û\¤ýOu¹ÏðýôœQIáû5ý3Õá×#R~â;²_åüTû3 R¤ü¢»O0ßÇ÷±wEîñ7µÏÒþ:ówjÿš«ö»´WfÞoô£@Ð,¿ììü_äû‚þ„ñu‡ö÷ëš¿‘÷[)¿½Ãó}cدCÿyÿ”îó³úù•ù—%ÿ)ìé{=eËù ío•UÿV™ðËÑ>ªòGy»RûgÇVŸŽç­¿Çbä¯ÕõW£³ÿFÕÝ'Jïßj÷Iþ‰÷Ž´ëý.ôWÂ/ºûóéo9Ô~‹ýV©Ÿ^«:¿òšû2ûÏHÐ#¶¬ä~ÖªøgDÕ¯ÇR~à'ºûðQhž1 ƒÁ`0 ƒÁ`0 ƒÁø\üƒÔ endstream endobj 53 0 obj <> endobj 54 0 obj <> endobj 55 0 obj <> endobj 60 0 obj [/Indexed /DeviceRGB 255 <000000FF00006B6BD2FFFFFF666666FF66667B7B7B6666C24A4AB96B6B6B4242 B1F30000FF9090B1B1DA888888737373B1A1A1FFB1B1CC6B6B181818FF33337B 7BCC6666B9E33333B9B9B99090D2DADADA8888CCB98888FFC2C2424242E37B7B FFE3E3DA9999FF1818FF7B7BEB2121B1B1EBFF4A4A8080D2C2C2E3A9A9A93333 33F33333D252529090E3DADAF3CCCCEBEB1818FFA1A1999999A1A1DAB99090FF D2D2525252EBA9A98080E3A1A1E3EBEBF3080808FF08087B7BD2FF73737373C2 5A5AB9B1B1B1292929FF4242E34242C2C2C2E3E3E3DADAEBF38888FFF3F3EB90 90FF2929FF8888C2C2EBB1B1F3FF5A5AD2D2D2EB4242E34A4A9999F3CCCCF3A1 A1F3C2C2F37373D2FF6B6B8080806B6BC26666CC5252B94A4AB1FF9999B9B9E3 B1B1E3909090B1A9A9FFB9B9D26B6BCC7373212121FF39398080CCE339399999 D29090DAC28080FFCCCC4A4A4AE38080FFEBEBFF2121FF8080F32121B9B9EBFF 52528888D28080DA393939DA4A4A9999E39090EBE3E3F3DADAFFD2D2EBF31010 FFA9A9A1A1A1A9A9DAB99999FFDADA5A5A5A8888E3A9A9E3A1A1EBF3F3F3EBEB FF101010FF10107B7BDA7373CC5A5AC2CCCCCCEBEBEBB9B9F3B1B1FFD2D2F3CC CCFFA9A9F3C2C2FF6B6BCC5252C2D273739999DAC28888F329298888DA9999EB E3E3FF8888EBA9A9EBF3F3FFD2D2FFF7B796FC949005E770C2F0F4F7B82899EB 94F741F7FC9490F7B84E6D892D05E770C2F118F7B77BF741F7FC949003EE8803 D600F713EE00016FF7A2E3007DF1C2F164000FF8DF0008402004F7A3A0C40000 1F200C000FF8000000C4000CC40000DF0008000000F713E22A001EC4000CDEFD 30C2F18CF7A10E03EE8803D60000000305E00FC2F1A800E44A05E0F8000032F7 B9C59A3DEC000030001DE803B600C2F1E000CD7C00000900CD5C000000FF92D0 05E10005E17003B600C2F20400CD7CC2F21000F56A033238FFFFFFC2F2780010 260000300021F9000028FF92D0601232FF94D0FF92A005E100F432F805E100C2 F22C66E8880000006021D3FF92D0F432F805E100C2F26C66E94B00000060D91D>]endobj 59 0 obj <>stream xœí} Oi–¶s1Ónó!H ‚Âf0IX&|&\‡5Ù| .FÁËe@_˜ F€Âm#I‡ÉÆÍF ¼?tÏ9ï¥Þ*@fâäö‚ Æ—AçbSHôïÝœiñ×­ôÆ |E ã‹`c±ªw ~~^±Iäo*ô%1Œ/+óŒÕû'6+6Áö³ò3ßBÁxo¨xÌïŸh‘¿B_ƒÁøhÙXœ{2PÜ]ï÷û»Aø¹«ÁøFp3¸Ÿ u‡zçªxƒñm`3Ä¡ýÅÐB¡¹3…¾ ƒñ…н±ØTõ$„xRÅÓúŒoþ`0^UÕ47×gî3ßî÷nãKñÅ•_ }) ãËâ—¿ßߢ©½×Â`0 ˆë}…¾ƒQT³ø3ß(n3ûŒoÑB_ƒÁ( b· } £0ˆ²ñg0¾MDÙø3ß&˜ü Æ7ŠëìûŒooXúŒoi&?ƒñ­àæó ¿_/äã®ü­µ_ð‚~ëë…¾ã7Ÿ·øWz—:7®|×ùžÔëFþÉ|_ôÒÎÇZÏwTè‹`0þA1S/‰òW6®t^¹Ò Mþëyä_?ðùþ—?× —Âäg0.‰ûÀxã †zõn,Zm;{­Ñ÷ïÿ[È¿ñù²L~ãÒ~'(Ÿ¯P °”?=4NÍ=óù’¨¶]¸Nî–ŠkI2ùŒKÂOt¯j©ðw^¿¡üѨ1©¿•ˆbë»V€ë´aý\^ +?ƒqiÜDÅ‚G3”ñ9¿Yï›üA2ß—ÌØö?˜Ïd“Ù$\+?ƒñˆåïÓÑXçw6å¯Öä§:!YhåÏmõ3@~V~ãó0°Ñ¹!Ž&déO+4:(^S…6‹;Tþ7…¸VDi&›Aîù³>îçg0. g°Sµl!@“äÔÂ/Ò}‚ü€ú@ÿd6+²V~㲘Yê\zNGcADgç†$ÿmÝÑ×*óý¬(ùÔögüÙ üŒÏÅÍÅ`pf—‚ ý@AþÃh4-ϱ+a ~D~¬øù²lûŒÏBïÒâRh³Â_ BÀ Èo ?)¿¦~mf¹ŸM²íg0>þÅx|1¾ø!þ!aø$òGÑ}¨üY‹ý…·ýÄþ$Û~ã³P¬ÿP¯Š ,Å—üףј>¥Õ&üÙB“?+J~äüïòZŒlܯB4‰†ô_ôÓL~cX¿™óg}ÉÆ|ãÚèëöð~*mwwyxïã×p:üëÙY8ŽÐgÚÏú_{jFTüPù“IV~ã3ðóœDÕñ c|Ï|¾?(É—ìÅæøº½©ðþ~d?Lã^ ¯6œÏeÀéò*œFàùRûíkÎó¦J!ßÇFôïÉRw]l\øc0.ŒÇOû逹/GõËQ}IÓö'³è¼3™Tþ—­½ìÚOõS¤û€×ÀíÝÿ>ïçOV‡VOV"«4æá“?^:,ÃÔ¸`þ¸èë“I¿;ãâ(Ö?é}ÒÛ;ÛÜ\SÕDLíóŠQ}¶j?xnâþxžòçºà>)ŒJt&ú¯6ä\|xHpÿ%Š?6éýáKöSvFùýã2é—}D8bò3—¿7ê õÂz‚ìŸû'£Øgé½:H’éGÔ8¾ho>±OÔßGþ*âõONVON]~ûס“!|t?ŒÊOQƒØIì›ç"ùÉ÷Ó ¿lR;òñãRh …B+ÐBž„zç~3 ýF²o R(¿Ãö¯ãß—ôO¡‚£éôzƒ¾çgþ£C#'CC@þW-å—ÒI$Ì€AäÏ’ñÏR¹ß¢>+?ƒqÜX‘Qèý-–Óoúœ@Ê÷3™yÛ×ìu%ÒôƒòHÈW¥ò¯"ÅÚ:424´{‚äÔ틤63¾ùµðgù…+ö2Œ‹âþ€ÄÊÊñÿ/­7¶™õ¾,ÖÝl9n^Ⱦþyð°HãWQ×ÑÞíæì¿ündhw„„ÿääDÿ0±¬? ?|á²uvƒ~Ó÷[®„•ŸÁ¸8~(¦FüýÿÆ›NÛïÓõ>‡ò¿ÝGîKáO…SaUëá‚ ŒüjûáW#€¡]Š (þ»ïÎPýQù÷¥ö'ö­Ó…ògÇůÓ0ëêXùŒ‹ãfw1Bñ`eÓxÓÅô'E_ßxÖ$s‚È¿¿Of=œŠDVwÏ^*ú½GvGFliÿè±DP_†½³U•õ§(–XÒß  ~Ö0V~ãsð˜È?V,B¿ÅxÓ-çÝüY[Á¯Qr;ùQ¶w‰æ¹_¥ðCÊOLkþð[úÓ‰ ÿOê¯Ã`üçUo_"ѧËj–Ä_¬èa]+?ƒqq<öuwûíÊŸWíOf{¨ânöóß½Šäߗ‰h½>¢Z?æûCÄSú‡FýÉõ[oìb¹ÈIääe¿êÓ0®ËýjjU‹`åg0.·€äÿ@…ñ^žîõ³Rû Û?Ü¿ M°×zg;ù‡PÞIù²ÞÙCê¿Bã?tbô…_î6ŒöŸ:û¦ˆúBû1Ð"ž¬ü ÆgÀß]è®Gþ#û7'´›å>_6LÿÞÕ« I}ª÷åŒ÷ND±ì=ÁzãT ?ÕûOÞ}âÅjî ågÅg0.çâ›þz’ÿâ çZ åÙÏ¿Qgâ*¥ü²à×`¾Òä¦b?°ý­¥ð¹·Èþ·ôŽóý„é´˜‡œØ×ƒ¦Ÿ'ô0Ÿ¿±¼¿ ù³¦ïÏŸÏ?ÂÒ/¹i6ß;¥þ!)ü#µÞQÊ/»úWëg££Ín£€ Èr¿˜Ù“dåg0>é3Ù_ßíF~£“?ébûß_¥”_VüÃ~¥ò á7ëýôRÒÿDŒðÇ©½‘ðnÿiUc|Øö3Ÿ‹XßðþŸ-úÍ8O±­á—Í_Ìc„_Ò?’Ûß=#é—"ÿÖHúÿ›Ê}¤üb€¿œÜüO¥vïæ\/7#†øeiF?Oèa0.ëÑ´wÂoÙŸ¯üz4 ÖûòÉß|ÕÈù#‘HûIûnûî¶³wgTî“Å~hVfŸÃ”_)ÿÍ ¾4-(Ùop+ŒÓ¼½€/“ŸÁ¸q±®–– „fÿŒó,Û~.ä§^þ„®ö›Ëøà„>Tþ!9Êgä­Áè¿êœ_ð%åËñ½)ç„~‚ZɇÆösÎÏ`\bîîf ÂbÿŒó´‘¿áêUQï¾GçÍÓ}ò“!1ÆG)¿9ÌÇÈù‡TÒ/föÐJ@ûûgy—lüàjšóN`0‡\¤s`ÐßüY‹û.ýüS ´ýªÚŸ@ÛNÚ/çõœ¨‚ñß\ÐkïJùMåˆ~`üö^C„îê˰ò3—…Z¤³bsSð_°¿þ†óDSùÝ ~ V¹’~þ”X¿/,øIåG¡·­æ·÷VŒÔ·ôÐËy8Ù­”?Ë9?ƒqY(î?ž©ûÏU~Ëõ»ÙþI³Ú/&öÐ^±Ž‡˜²«¤ß¾”gî?‡dÊ¿z"‚)D(?.äçø­ŒZÊGäülûŒ ã0z]ùgff*Èúûgœ§ZÕ~*÷çð›Õ~k”ϼ´ý‘°š×£êýNò{½§ÿI¿Ö}±–Ìùû Ǩ}]ìϰò3—BßmuWŽŸgfn û+Ðø»“ß>³'o„_s¾ò‹¥|(é²ÿ<ò{ñž# ü/UüHøi^ŸsÔÀ¸X»;ÃÕ~ã’°îÁûóù'>Jþlþ:E??P_Tûç§§kÐöâpÎõœ¿;‘®^ÌçO!õ÷‰œíùÊß®gõ‘úæÊ{©ˆUïK$–moÊÛu‰A>¬ü ÆE¡ïŸ®æÆïåüëæb^Ùd&ï뎤í—+ùØjt¹ß£»wz:<üÓÙÙªÉâZ¾“ï†ï´/ù›‘KyHåŸü¤ÿ\ƒ!q]õñ#€ø7ˆûçVû¬•2if ꃜu ñ“S{‘ý~ãûXÆ;ûixô•}a®W¿þôŽº÷iBϪ¹’O¿Èùé ¯:rþ.P~ZFL(¿ìyàî~ãÓPm¸þDz§]ÿ„ë¿ucJ/®Ü]:utw»+c¸ûVáûåœÞýˆõVƒ^»ŸîÌ1¢~{ÿðoâ^]«ÏDÂäÏÙ®¥±Tß±'‰~¤±}ª6yð·øWa0¾ÜÖwáõz®æ›ÂŸ?¯Ù6+í=Xt›²ÎÈIòÓHŸÈ~*%Ù¿&‡í…Qßi!ÏœúÈ«= Ÿ`Ý‘{]?Ú~rýÖÚÝ„F½x¯yûàäßè†ÁøÊÑ­¶Rþ_**Ôð^Êøëýÿ7ï>›ôc;ÊïkãŒvs˜ÎÇ 7Œö¾”ÔÇÁ{â†\Æ*^'CrmO9£'<šÃ?ï5¤tOÖûS{ÚEO_FŒñÑø[þó0_/Ž>ïÍŠMIý‰s¦ôz3ö™=”rÛoו벆øÒŒ~q“nû}ºWmkôâÊž«òîÜrdßnûnX ðÙÜ/áè7œ”Â/”_oÓã«EµYïÚcÓsúüÝ3y¨±I?òÍ·mÎÍ‘îí£Ûõí«™}4Ä_êÿÉIÎøDîäÄä¾ÝgõóEð wíWâmÜÇ‘ý>¾cƒqA˜äÿ¹¥E®å1¡–ñšÉûÀ¤©üú>½öþþvYò»º/²~âp8bQ(n/Üë„_Ýw>¢—ñÀé¼h$rÎk—Âï3oÒËýý Æ'!jÿ—‰–‰½ŠW½¿¾Û…ü9Û=»ô}zí'Í'(ë$ôr>á”pþ’ú«Î¹w«Öd¾°^ÄCÌé‘ý|ùƒZ³êf]jØnÜßÏ`| ¢FOß ÿ6Å}¼oOÞžŽå<|IºQ¯“ü¹°ãK¦ù}b–®S÷»V¾§¤ÂÒò§h= ü®¿æ}Ä»7žµ:ú4Ú?÷ß„Áø&`*ÿ¦céÞn—›vÞ›Ê/´?›qŽá?KÐðþ«2éW{åb~n#ýÞ™sø#j6_Šfó%ö#®“&3bÙn›i½ü¿ƒñ á¶EþÇzÝîz¡ûn·ëäžÔ÷ɂ޸º£ÒËôòNÝ)¹œW$üSÎõRŽ„á§•»ÂF­…?õNy±Ž‡-áQ> ƧÀPþ›@yâ=4y«¾üu"r]û‘üI`¿Ë Úá”è—Py?!Ü;÷bFOÔŠ½ÒóGhh_äìü¹“ìp°i?“ŸÁøD«£êf-HzÁüzy—î7åÕd²–öÌ¿vP:ÚŽºäO…çwï~däýéðÙ‰òü4¶/uÒ_°aªÖ”ýÄñòƒß?ŸÁ`bzxïc}{nIý±âWå>>::ZoþØŒýWk¯ÖÄj>Ÿ|Qê§á½Â\^Î'žÎ`0ƒQq·¯÷—n…1BqñÀÀÊïŸÁ`üCã ø~q´9f˜Ügò3_/¢Ñè!î×kæ÷WZ }y ãï…ê¨XÊç9¾˜hOªÜ…˜ü ÆW‹¾¨ä7t/–¢~Áäg0¾^û¯{½cHxE|IýÞ¹‰B_ƒÁø»!Åš_Eh%´‚¬³/˜êí›cåg0¾b ‚ôGBÈþf>P¸ÏÊÏ`|ÕÀ¬ÿ@wÚˆø`ø‘úMMþB_ƒÁø{¥ÿ7ú^¤}¯Ð|ä~0(ˆÇk  Ø`D‡öí×­ØÚ·Û[U;/$`4 ‡ý1íÙ÷hýÿÄÿm1¸ º¿|'€þz«îá`90>FB=»S‚ìóîÌvô:hØp%FŠ’ÙXÚOe-#¯C;à-¸³0ˆ~¿£Ž–¯ë0Ïi[hÃìÂû¢Òƒ!¡­r– ±J¢}Y]ú‚­…E”Q<ž‹åü–æ›Òo ì™MÐ<½G> }®öŸ>85èoñœ8ß¼ö Ù­h¿$‡‡ØÐ¬K7 Žá@÷©MXE÷#hÃJûG%ñiwËlŠñ¸5yKcRøIý~;é—÷‘ößOM‚ðO~?e6EðÈ{`?6ê#í[‘îÛí†%  6¤=vÏZ%ÿéÙ >0_qý˜žk„-˜·”ŸœB#n©šFxn´¸ßˆÜo´´ß&þëkmD×Ú ŽDÄGšÙáàGhHtr?RC¼/ŦP|—dÇnÄthÁ}â|¾ê)U„—ÜïÁ嬀ö¸¨º‚,nÂøp‡/ðöZ´è…XçÒ"ÿÅÅ¥xü7,ûýWÓ"ÙýÅÅà´ ù©Âm«{8‹‘òw$?p\áNݬ`{Ñ2à¡é‚ž:.£W]ûï -ðUvà7¥á é“uóœ’_Í=ôõÓ 1V½;++ñ¯áÃø±jØÅ.B}—(3viÒ~öôþÁyÚo×} þÞšMøÅ4gü›=pŠ?i¿Hš…ðÛÄŸ( •²¥ûÃnÀÝ~up«ßˆyªßO´¿µ,èkR‡bÿÔÔ䔡ü¦P1`Usaý¿ßކ͖´£êߤð‹½]÷Qõå^„€VKôÿÏ5ØTN`—}|Týy¢;<”ú7ZÍzì'í·YýÒ5°é>„‚kZ÷1àëT@(ÿÔý§OÇŸ"åi/--5%ßd$  ‚~´ÿúÔ”ð‹-ké?ŸêÿúǽKAäz$þŽþöaì>¼ ;ƒ6ò— ¦nÕŸ1⸠‘gyžö*ëLò×S…š;•m·­c«Þh¥çE>ùÓm•Èö¨`;üNG”XN¢m–ªJ ñ³fÁàSèoùý\^[ÚEûÅÞ]û ö›ªoj¿®4ÛËk¦ò?²ë¾Ò~Cù×µÝ?’H?,µ_‰¿Cûï’ðdXÖz/›¤~¿aü%ó—…ç—Ú?)ÔßÔ} (÷ úÀý)Ãú;tÉßÞJÛ¶!üZ÷Û¡µ¶Ãó±6Rú•ë—–_ÿXk¿|¨ÂÀ<ÑÞR~“þ û5]`ìÊoñ^»WíWºÄ¿&ŒÿS²ü:ï?Ê/Ô_˜~|HÖKá—q€èýC)Ñ^k¿f¿”~8øAZ±vµd~’¨/´ö —Ÿ•¼'êÓß²šüõÀsäz0ø¯ÿGûýñ½Øè„f#êô½Ù鯄ò{ªù%ëbH¢K ò÷É¿Ùu\uü-²ÇŠ®ÏzòÈß7}{‡¾IüŠ·dzº#`½”D¼úð½@삾ߌ.Å?þ¼"à=öÎ×þ½SS÷Úß,ÙeßEù­ò_3é¾~<Àl)¿®Ú]­ûÃ:ëwhÿ­~Cùïjí_6ó}ñ÷kí—•ïʯ´_Å€×È{tû–÷ÝŸ²åû¢¡÷Ý*”¿µÝ,á[[-ÁoÕOZûI÷üHÿg†æ«ä=¥ü˜üká×A e…€®FWt5v]k¼ÖUÛu­ËUûµî“í¿&…_Š>=¿Mè?E’~ÓúK`©öãš÷ãvíÏëïùAi&©š¢¿ÔþŒÖ~"¾Èõ³Û X ±òG4ÿÑ¿,mtv¯t^±‘ŸJóŽ-¨¬M“Á®ö´íx0 zh7íÑl‘ßëé»;1›'­óp£Eõ‹Ù<òÇ*ËËMò{^D©œ¯È§:–Æ«óP ©óô]LùÍBŸ“úJûEÕ/m¯ùS;GûAùO䷴ߪó­iöËðHª¿¡ÿGÍ–ö7«¼_è¾,õ©@0_i¿æ¿%ýH}þ»†õy¿~Ò}§òkö[¼'íŸt~Ù€1€lD€©ísŠ}ÛDúvÊûÛ-í?&ío•vÍ¿`¾!ýó¸ÕKÅ—ûg¦öÏ+áGç¯6Óù§„ô7Ú­€Úk°á£K‰¿Mû­Œ™MýI÷§ïÔíéSÅþ[ѯÔHdª?Žâ/ÆõÇ•ç_ú„Û·©D⟥[júä--Í‚ßãP'ð|ã xüà*þŸ¢èþ£þËÿÿ°ñ ºïknm"}O“òƒ°W")Óƒ“-$#ïê<1'ùït”‹à±Yzñf]™†(ìÚòÈuJÛeRoYâ xÚðc垎 uõÙ‚€KÏŸ—”ß)þB÷õ]´ß©ûμÿ•tkpdïÌKüåi¿Ðÿõ#;ý…0µßVï7´_øÿ~³âÒ¯u_)¿ ·–ÏÑþ)ËX1à{¡ý´ÕñÚöŸ„[$þöÎ@$;Ðÿeë±ØTõï™,ø¡òߟKñŸ¯12~É|!ùêXûS5–æKÆ+÷/F¨íïß…´wA+hç/»~|o6Jd’þ÷¥FÞ/CÀ¸¦©©û¢Ê/{þ¤ ûb‹¼3¬Tÿ¬ ½Èû…óÏêq×¹•.@ü?ß²qeãÊ•ÎNÜÑ3Ä‚¥ùcuTàv´Z÷»‰ìÚã½#l¬ˆXX$U˜̦¤Ü´ý^ÙùîU¹|ò£“Ç‚ßV>ùÛ:›–Ah:0h¼„ÏâW÷Űᢠûí!À .Í=çGíß;gðO>ý8JþÍkhûÖ_Ëÿš~›ö«´ÝMùlõþa©ûŽa?*Õ¿%^P@‰ÿ¤j’úùÚ?µl)ÿ¤*øOé^?5ö=?Ù}cô=(Û/ˆ/°-+ôLº/©ÿRåüÊjŽçIúíŸÊ/çµù¯‘Ù¾­æ§´^°¿F¿@î×BÂÔ'þ»û±èÿãÁ5£äoÚcèÏ{½·[YúÏH¿/[©æ½Ùß/¸}~=¢¨€LþÅÞÒ~!öº»ÏVðc˜’ïJû´-íÇç´QíÏÙ´_qÝÅø“'x`y¿ÃøËœ_ê>>ÖuÙïÐ…ß>pØÔKû‡UÍßÈûupKÕþßAøûoYù¾Nío˜4h?)Šþ“†ðË1>$ýTó±À>þOdþdÿ[·[e ÀìÓ. ~/)÷©„_Sÿeÿ ÿŠþRþíÊߨò~Êú)é@•üæÍ í>\#×ßEY?…gÚoØ~=ÔGþM²_û\¤ýOu¹ÏðýôœQIáû5ý3Õá×#R~â;²_åüTû3 R¤ü¢»O0ßÇ÷±wEîñ7µÏÒþ:ówjÿš«ö»´WfÞoô£@Ð,¿ììü_äû‚þ„ñu‡ö÷ëš¿‘÷[)¿½Ãó}cدCÿyÿ”îó³úù•ù—%ÿ)ìé{=eËù ío•UÿV™ðËÑ>ªòGy»RûgÇVŸŽç­¿Çbä¯ÕõW£³ÿFÕÝ'Jïßj÷Iþ‰÷Ž´ëý.ôWÂ/ºûóéo9Ô~‹ýV©Ÿ^«:¿òšû2ûÏHÐ#¶¬ä~ÖªøgDÕ¯ÇR~à'ºûðQhž1 ƒÁ`0 ƒÁ`0 ƒÁø\üƒÔ endstream endobj 61 0 obj <>stream ÿØÿîAdobedÿÛC  $, !$4.763.22:ASF:=N>22HbINVX]^]8EfmeZlS[]YÿÛC**Y;2;YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYÿÀ¦ê"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?_k“^ꗪ춰9‹ËèƒÉnyäqøt9¬¤‘ü±ŒÿÀišÿ‰î¥ÿ_Rÿèf´µ;-6F´”Ï-âDÚ6]Šç¸#8Ç|úqÍ}->ZpŒRÜò*ÆS“wØ©ö…òÆ/ûæšn“þxÅÿ| –çJ½¶¶ÍHøÉÈ%sÓ#9-·¨[)i¡TU`¬L©ò’p3ÏSZsÓœ»2µ'üñ‹þù}©?çŒ_÷È­;Ý [«ËxÖišÎ×ÍwYãlÓÈQÎzžž£4'Ñï­­Zâh6D¡Ke×+»¦Fr?S Ôå³*TeÈþÔŸóÆ/ûäQö¤ÿž1ß"–}.òßí^lA~ÈPMó©Ù¿î÷ç9)×ZMÝœé ÊG ¾q¾d““œ£­_=>èŸg.ÌgÚ“þxÅÿ|Š>ÔŸóÆ/ûäU»}æI.RvކÜÜ Î¤8태`ÿ{ ïLþÉš[{m-Ê<…¼Ä(B‘ÈÁãó»ñSí©Þ×+ÙK±_íIÿÔŸóÆ/ûäUû­AáËmD3Hÿ:’0¨s´þ8K©è‘ZM ¤IvÓÊñ¤s°_&MÝzr¼ýz~5—·§{zþûjOùãýò(ûRÏ¿ï‘Sêpiö’ÜZÂne¸‚y»—c0ûÜuúš·©höÖŸÛ^[L~ÀÐ,{˜|Þf3ž=èöÐÓÏþù‡±–¾FoÚ“þxÅÿ| >ÔŸóÆ/ûàUJ+{X·ö¤ÿž1ßµ'üñ‹þøRŠ,-ý©?çŒ_÷À£íIÿÔŸóÆ/ûàUJ(°X·ö¤ÿž1ßµ'üñ‹þøRŠ,-ý©?çŒ_÷À£íIÿÔŸóÆ/ûàULQŠ,-ý©?çŒ_÷À£íIÿÔŸóÆ/ûàULQŠ,-ý©?çŒ_÷À£íIÿj¨34él:ϧÿß¹?øŠ†]5öíŽ[$?v4W ÇÐe@Ïã]#XÇ~©5œÂǬÌ\u÷žqšÒ[>¹f,ÕÄ+ÐÞß•hooÊž–rÐÞß•X6D\°*‚í.pIÆj3i›c&q'›³gô¥x…™ÚÛò£í íùTÍdøHÔ!bÅK=}*´‘ùo·r·ºÓVaaÿhooÊ´7·åSAh<·iqŸ%W'>Æ£’ÒHã,J¸Ü ò¹éšWŽÁf7í íùQö†öüªKh[iÙˆV]»X““HmY!¸.tdÉÈçò4]†}¡½¿*>ÐÞß•Z¸²‰MÑVÚ"Û…ç¸ŸŠžÀÕ‰¾ÐÞß•hooʡŪ²7ÚÛò£í íùT8£Y7ÚÛò£í íùT8£Y7ÚÛò£í íùT8£Y7ÚÛò£í íùT8£Y7ÚÛò£í íùT8£Y7ÚÛò£í íùT8£Y7ÚÛò£í íPâŒQdßhoj>ÐÞÕ(Å@Mö†ö£í íPâŒQdßhoj>ÐÞÕ(Å@Mö†ö£í íPâŒQdßhoj>ÐÞÕ(Å@Mö†ö§™v®\œã8UúÕlRÉ K¹w(ØJçG(Ý)»Œw“þøãH·Šå„e²£$2ÇçZדÜ$ó]ùqé¥JˆØ g°^äÖ—2Kÿ\ÿöe¦£tϳï3dpp ÿZŒÎƒøŸþøãOŠâ(od3Ä&ˆ³+)ê=G½Z¹²·Ò¢{™ÜùŸ,ê@_ßÛüŽZHíTaÔÉšPèY„s¥Ob0}ªÚx¡’5W¶ó@üÌn>¸ÅgF3ßï'òjÏo¼~µÕN­挧I5 Dg[Ô¿ëê_ý ÖŽ¥yc<—f¥º–1¹WnÂàIÎ0¤þƺÔõTÛI 칟0‘ÕÛÐJ°<)©ùmiÿ}7ÿ^Œ«Q\ªR³Hó]:¾UtÄÕ5X.¢¾A:Ï~дÌåv'– ŽNqÜ´ÍGUŠëûkˆaöù-Ì{‚ð#Û’yö8ëRÿÂ+©ÿÏ[Oûí¿øš…53ÿ-m?ï¶ÿâk,"û_֟䊶!ôþ¿¦CsªÅ.¥­Ý,3m½¶h"R9(«“Î1•5±¯FÓÚê/Ŭ8å–W„¤ÆÐ> Èk3þMOþ{ZßMÿÄÓáÔ nße»×-Ÿý¢O x¸ÎÖ.>ÚÍJ;ŽÕu[K¨uA7^uûÀÇx@‹°¯ûYè=)¿ÚÐßj"U'M‘¾Õ2Fv*î8ÎAïÞÿ¦§ÿ=­?ï¦ÿâhÿ„SSÿžÖŸ÷Óñ5jXD­ÍýiþD?¬>‚Í«ÚÍ4ŒR÷i¦É³ç³}îO'9"£¶Õ`KaŸ`µ¸·™—nG˜ÊFÞy#ñOÿ„SSÿžÖŸ÷Óñ4Â)©ÿÏkOûé¿øš9°–·7õ¯ù‡ûEïb)uh™îö[̱0Ø@§nâ{3s×±=*¦§r—³Z˜ÑÕ`´Š»²îÉ=9¡ÿ¦§ÿ=­?ï¦ÿâhÿ„SSÿžÖŸ÷Óñ5p«…ƒRR&Q¯%f‡Þkv·—v‹i(·6ñÅ÷·!$ó` žÜúæ¢]b;[/²Ù­Ô£ÎŠUûA]±m!ˆœ‘Žƒ¯æïøE5?ùíiÿ}7ÿGü"šŸüö´ÿ¾›ÿ‰¨RÂ%n2šÄ7~R–¥&Ÿq5Äöñ]¬Ó>ý­·b’rÜä“׎XÔuX®ÿ¶¼¸fo’ÜǸ/=¹'Ÿc޵/ü"šŸüö´ÿ¾›ÿ‰£þMOþ{ZßmÿÄÕ{\+²sÛþù –º»QßúýL/..·áÔÿçµ§ýößüMðŠjóÚÓþûoþ&º~»Cù‘Õêö0¼º<ºÝÿ„SSÿžÖŸ÷Ûñ4Â)©ÿÏkOûí¿øš>»Cù}^¯c Ë£Ë­ßøE5?ùíiÿ}·ÿGü"šŸüö´ÿ¾Ûÿ‰£ë´?™Õêö0¼º<ºÝÿ„SSÿžÖŸ÷Ûñ4Â)©ÿÏkOûí¿øš>»Cù}^¯c Ë£Ë­ßøE5?ùíiÿ}·ÿGü"šŸüö´ÿ¾Ûÿ‰£ë´?™Õêö0¼º<ºÝÿ„SSÿžÖŸ÷Ûñ4Â)©ÿÏkOûí¿øš>»Cù}^¯cˣ˭ïøE5Oùíiÿ}7ÿGü"š§üö´ÿ¾›ÿ‰£ë´?™Õêö0|º<ºÞÿ„STÿžÖŸ÷Óñ4Â)ªÏkOûé¿øš>»Cù}^¯cˣ˭ïøE5Oùíiÿ}7ÿGü"š§üö´ÿ¾›ÿ‰£ë´?™Õêö0|º<ºÞÿ„STÿžÖŸ÷Óñ4Â)ªÏkOûé¿øš>»Cù}^¯cˣ˭ïøE5Oùíiÿ}7ÿGü"š§üö´ÿ¾›ÿ‰£ë´?™Õêö(Ú7“¥Üúx‹ÿA’¯i÷éÎþzÄÆU%I$žÃ½K†õˆ æ²Ã 2¾YX{‚¤—û Xÿ¨Gþ'ÿ®Z˜Š2oÞZÿ]ŽˆSœRºg9w((Ø9&·¯$I>O]Bçÿd©°µAVÒ‘‡!’R=ÁäTpøwZ€8K‹W9ey€Ÿ\2‘ŸzÃ*xŠN i?Ÿùá°õTÜ[_ð O®<”ÓÇ• 1 Éãßçúb‹\ZϯX½¤M¼ñBrnǵXþÃÖ¿¿¤ÿà2ñºkhZá,ÚlyÝ*¨@kÇú•Ú½XÛçþG¬±ÐŠ|´Ýíý\æ4uƬ?ë™þb»;iŒPÈ‹_08#Ë[ÙKaâ)-fd2EILs´÷ú×j4fòóÿŽõëÚÅÕ‡5ÛÑžE8K–ÅX¤òÌ„ÅЯ'ÖÉlËG‡=3Ö¬ÿc·üüÿãŸýz?±Ûþ~ñÏþ½r{jO¯æ_³™ ̰Û[ÃHñÏÝÉî*¼’o‚(ñ/<ç®M]þÆoùùÿÇ?úôc7üüÿãŸýzjK¯æ“"7ÅÉRˆl+AÆ:ÔBr#+Ž|Ï0ô>þµkû¿ççÿÿëÑýŒßóóÿŽõèö´»þaÉ2¼—>c)*ü6â<ÃúzTWyòÆ01î}Í]þÆoùùÿÇ?úôc7üüÿãŸýzjK¯æ“+­È ‚™o(Åݾ”“Ü™£!·dã?9ÇåV±›þ~ñÏþ½ØÍÿ??øçÿ^mK¿æ“)Ã"Ç‘²nY1œt§½ÉO¹FfÛÐôÅYþÆoùùÿÇ?úôc7üüÿãŸýz=µ-ïù‡$Êò\ùžväÿZpzUvŠÒþÆoùùÿÇ?úôc7üüÿãŸýzj½%³üÃÙÌÍÚ(Ú+Kû¿ççÿÿëÑýŒßóóÿŽõéýbŸq{9»EEic7üüÿãŸýz?±›þ~ñÏþ½X§Ü=œŒÝ¢¢´¿±›þ~ñÏþ½ØÍÿ??øçÿ^¬SîÎFnÑFÑZ_ØÍÿ??øçÿ^ìfÿŸŸüsÿ¯GÖ)÷g#7h£h­/ìfÿŸŸüsÿ¯Gö3ÏÏþ9ÿ×£ëû‡³‘›´Q´V—ö3ÏÏþ9ÿ×£û¿ççÿÿëÑõŠ}ÃÙÈÍÚ(Ú+Kû¿ççÿÿëÑýŒßóóÿŽõèúÅ>áìäfíl¥ýŒßóóÿŽõèþÆoùùÿÇ?úô}bŸpör3v 6 ÒþÆoùùÿÇ?úôc7üüÿãŸýz>±O¸{9»ic7üüÿãŸýz?±›þ~ñÏþ½X§Ü=œŒÝ‚‚´¿±›þ~ñÏþ½ØÍÿ??øçÿ^¬SîÎFnÁFÁZ_ØÍÿ??øçÿ^ìfÿŸŸüsÿ¯GÖ)÷g#7`£`­/ìfÿŸŸüsÿ¯Gö3ÏÏþ9ÿ×£ëû‡³‘›°UKÆ tsÀ*¸÷ùEnÿc7üüÿãŸýzréR¨ÂÞ0Ëÿ×§M4ïpöR9û‹¨ä³·ˆ;“ì‚ѓۿçMÓþif#îùxϾáþÑÿeÍÿ?¯ÿ|ÿõé­¤HÿzíÕsýj¾·NÖþ¿ öR½Ì¨îÒÏQ–V‰d`ÌP7@sÁ÷¥‹Wui¾Ñ‹˜§ûèç‚{éÛ§øcTi2¨ÂÞ¸úôeMÿ?Òß'ük…ªoí~jªúÇñ9ûq›yb˃ëÃf?ßo­u—:K¬2J×Lå¶ õÀú×!#Ÿ1ºu5߆qå´]Ì*IÊNLêü?ÿ!sþ¾þ‡%o×?áÓ[[>·ÿC’ºp =«‡üWòüQø>ÿÌ*µíõ½Œaî%D'î©` AŸ¨öñVwSíYšœÞF¥hßi·¶Ì2óŒ©æ>>ðçñ¬iEJVeIÙ\ÓGY]20È`rõ :—(o¹äœÐþU•ws1ºcÉìƒh@¥[Ì‘”¶H=°Gn;ÔP¸Äáî<µ‹ ¿ Ä’©9#h$"õãõN–ÿ×K‡9¤Ž²"º0daÀäëKTôùXÿ×¼ú«xï/åÿ׬d­&‹NêâÑI‡þòþ_ýz0ÿÞ_Ëÿ¯R1h¤Ãÿy/þ½ï/åÿ× ¢“ýåü¿úôaÿ¼¿—ÿ^€ŠL?÷—òÿëчþòþ_ýzZ)0ÿÞ_Ëÿ¯FûËùõèh¤Ãÿy/þ½ï/åÿ× ¢“ýåü¿úôaÿ¼¿—ÿ^€ŠL?÷—òÿëчþòþ_ýzZ)0ÿÞ_Ëÿ¯FûËùõèh¤Ãÿy/þ½ï/åÿ× ¢“ýåü¿úôaÿ¼¿—ÿ^€ŠL?÷—òÿëчþòþ_ýzZ)0ÿÞ_Ëÿ¯FûËùõèh¤Ãÿy/þ½ï/åÿ× ¢šK(ÉÁ¯§P¨ÿÈñ{ÿ\Wù%w•Áê?ò<^ÿ×þI]åwbþ ~Ÿ¢1§»Øf8]Ôô`Tùš_ßÏ´Ÿ÷ÒÿAuvö^šê ¦H- Š¡*™öâ´Údm=ÅõÅäg#’8÷f ¡J…$ãæã‘Èç–Èбûïùö“þú_ñ£÷ßóí'ýô¿ãTÿ·“Î[u³»k³¼P²•H-»hùdSœã¶sÅø†Öy?uÃA¾43ìÂ"©N§';Ôp ® V@\ý÷üûIÿ}/øÑûïùö“þú_ñ¬Ûoi×Eü¦fUò1î \€Ä¢ÀûHド^…§"$º™Ü(†™ipÈIV6l“‚¡qÉÁ,€½ûïùö“þú_ñ£÷ßóí'æ¿ãTOˆí“÷DC›91 †umÇ8Ê˜Û dŸáÝÎ.Ûê)qu< Ëå»Ù~RF2:äGÞ år9¢ÈU®¦Ëˆ#Ép烃ÜRùwÿÝ‹òÿìªÕ6ßöÑÿô3\ìÚcßêšÏ•ebd3ª-쉠>Dxd+Ãæúu¬ »ó?ÃüO$lywÿÝ‹òÿì¨òïÿ»åÿÙVf§â Ë7¸–V[0&H¤hÂ$q»û˜n†6/×›7Z­åµôHˆ·G$6÷N± #•&@áÀVëÝH^Ãûïðÿ!ûO$Zòïÿ»åÿÙQåßÿv/Ëÿ²¬Ë-oPxme¸û+,‘ÚÊëL¤‹‡Ø%Ž I<îÎ0½Mµ-F[$tlRúH.al€tÑ6‰ u!þbwÈËð{ï¿ÃüƒÚy#¡òïÿ»åÿÙQåßÿv/Ëÿ²¬é5QÙ"µ‚9e–k»"dqH#†‘rI9È#ÓoqnËU¸¹¼·-c†hÔìY<ü¦òŽ GË•;ðþûü?È=§’'Ssˆ.6¹À+Ç8'Ôúš{÷­¿ë¯þÈÔÚ¥]/r¾¡ES¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(ßøñ¸ÿ®mü«ÎdÿXÿS^{ÿ7õÍ¿•yÌŸëêkÒÀì̧¹ÖxwþBÚßý|ýJß“ý[} `ø{þBúçý|ýJÞ“ý[} sâÿŠþ_’ ?ßù‹EŸß܇tšÙJèÀÌp¬W®ñé\É\Ñ»VzÏp·«\[L1…Äp²•`ŒÝwAS_^‹1Kq$òyh‘mÉ;Y¿ˆÑOz°“¹jŠŽ XUÞ cÖ9 –]¤Ö¤¤PQEQPÞ\¥”÷R1ÁHÁzN?*š€ *;‰ã¶·–y›lQ!wl€IâˆdiW/ ž>W*O@{Ó8úƒÛ€IE ÕÊZIJH†‘#ù}]‚Õ…ME^ÒínòG"¢;&æÆ Wd sž«Ÿ¡ø±EPEPEPEóÇnåmª]PË0P?2(J(¨lîRòÊ ¨ÃçdPÝ@##?MEWûZ›æ´XägDGfÚ¡·àõÏT#Ü{âÅQEQEQEQEQEQE$ŸêÛèii$ÿVßCK@£ÿ#Åïýq_ä•Ý»ª)g`ª:’p+„Ô¿äx½ÿ®+ü’»‰þê×Xÿô1]د†Ÿ¢ü‘=Ù’ÎãL×Äc’.D/Œ‚¸#®EW6ÖòFËs«MpN ’5òØ0`À*€H*§æ§¡ ïÑ\Ö40­mìm®Åѽón0áäwL¾íƒ$4tîy¨í¬4Ûk/²¥Þcó!“&EÎb…íÿL—?SÓ·CEžK·û3j2=²…D…¥M‰ ìÀ0!BÙ8ÈÏ'-nœ¾+æŠEÇ”ë"(&‚À²€AcŒ×GEžh·»‡íypeo1rr]‹tÀ$ÈÇÓ¦«­œ7“] Òï"í Ò‚dœç’q¸¹!p ³E®œCZ »GûƬ,hŒìˆªÒÎ@Ác€2}N€§Q@$Òôù®â[WÁV‘¡RÌÚA8ÉãéÅ:m>Êâæ;™í-å¸%x•™pr0HÈÁæ¬ÑLÎÕUUm¡ ¡ƒ!Ê¢žG§jjiöIö––ëöœùø‰G›œçw7S×ÔÕš(´ú}•Ì>Lö–òÄɱâV]Ä’[u$ž}ÍIöx~ÓöŸ&?´lòüÝ£vÜçnzã<⥢€)ê©övv ¢^I8uª/µ[ÿÏx¿ï±Z4Tµp3¾Õoÿ=âÿ¾Åj·ÿžñßb´h¥Ê;™ßj·ÿžñßbµ[ÿÏx¿ï±Z4QÊ3¾Õoÿ=âÿ¾Åj·ÿžñßb´h£”.g}ªßþ{Åÿ}Š>Õoÿ=âÿ¾ÅhÑG(\ÎûU¿ü÷‹þû}ªßþ{Åÿ}ŠÑ¢ŽP¹ö«ùïýö(ûU¿ü÷‹þû£E¡s;íVÿóÞ/ûìQö«ùïýö+FŠ9BæwÚ­ÿç¼_÷Ø£íVÿóÞ/ûìVr…Ìïµ[ÿÏx¿ï±GÚ­ÿç¼_÷Ø­(å ™ßj·ÿžñßbµ[ÿÏx¿ï±Z4QÊ3¾Õoÿ=âÿ¾Åj·ÿžñßb´h£”.g}ªßþ{Åÿ}Š>Õoÿ=âÿ¾ÅhÑG(\ÎûU¿ü÷‹þû}ªßþ{Åÿ}ŠÑ¢ŽP¹ö«ùïýö(01M'€ŠÑªš—üy7ûÉÿ¡ 9Bä¿ñãqÿ\ÛùWœÉþ±þ¦½óþ<'ÿ®Mü«Î¤ÿXÿS]ø™œ÷:ßÈ_\ÿ¯ƒÿ¡É[Ò«o¡¬È_\ÿ¯ƒÿ¡É[Ò«o¡®|_ñ_ËòAGàûÿ1k›y!Âê°Ù\Ç<êCJ íi9Îq‚?ÉÔW6–³*QæV2Ãi±6×O¸‚R³–!$Vcû§Ë~k¶Ò\ α\ou‚QãËuÈmË݇zÔ¢›kK1åV1ßO[û»¹³“ìÑ[ÊÇ9-Ðÿ1 “É<€O8¨,´Ë°,–ä·–ñÅ5Øf Lñª–ÎNHC‘Çî»ï5¿E+Œä&´’ÊÒ)%mæ†5ó dΡpŽŽ»pIbÆ7°Ýóô<Š’ïBºy”¸–BÁ™<†‹HÒ;±Ý"–_¾£r ÇfqÀÕÑEÀÅ:t£Ãº­²@¢æèÝ0¼»>ÒO¸+×úUHt‹•Õ'’v•žf2ù±ÆŽ»boU2ð Œܺ ô´Qp0’ÂøEïí#µòd–)R(²ªNW!NÅ$õÚpOÍÁ$ÓCWÖäií#6~Ä8ØG—nª w»~ÀÚ¥t4Qp04»¸®ì康c2Û"Í;ÊîÎ~ör¼¡á [¨iÒ˨´†Ãí5ÜÃuò"51î\± >ëœ(#æõ&º(¸÷‡´©ìn γ‰<­“Hæ ³>GÌ6 ÏѾiFzN(ÜZ5ŒÒ\j1Åö6œ–ŠYcpd¹`¸bãÌðHéê1]}\:ÇIk>úâ=…íßì+¹@Gógd+ƒ´ °ìx8&´,t©â×ZæUœ¿›#´Ùˆ#£nÚ¹Ìl£kÞÊ ô4Qp9íNÆî}fˆà´rÅåÍ„ˆ0.›÷™ûü/;µ6må­'…Y¶@ e]¹0oWuÈ9P±áø>^O k£¢‹ÌA¤¼1ÃçiÒÝÚ'ú¾A*ÇfÖØ6ƸÚý ?>‰±§©ÚI6‘?fóÙ6–‹Ì@ï¿Aœgq‚ Ô¢‹Í]é÷¯¨ÚL-äó!xKFÁcw‡‘ñ)?§žKT/¥_Mmam-’´6VË îu>yY!bôaÆì{…ïÕÑEÀËÕíL÷ÒIeý¡lˆêÖøCó’»_Bð ç?7¹¬m?D»Š{'¸Ž6$ƒk£C¶%D@ÈXƒ å_…ùNî£,k­¢‹Îk¶s_Ës,ˆ A\Äõ2'>þƨØÚZjš¨’ËOŽx¼Õ£ØÄ%À9ò؃÷ÐÎpy5ØÑEÀä§Ñ.äŽr‹½-„-~öB§. A°Çƒ /NW[EQE†QEQEQEQE$ŸêÛèii$ÿVßCK@¥ÿ#Åïýq_ä•ÜO÷SþºÇÿ¡Šáõù/ëŠÿ$®âºŸõÖ?ý W~+á§è¿$cOvhRÉ8–£”1©ääzðk”Ðrº¾v°lzÔÓ´ÓÞ#2„\w¹üXÕš¢–·1^O,WˆfHÈÐ’Ü*©·ËéÞ®6Öâwº£"BŒ‚Q†ñ2œ|ü‘÷sÔzŠ.5á±H ‘—DÀ#.ñŒäg¦3‘Чk¢%¬OfÙG—å)[eË/ë Îüãs“߸Ölúz[¼å¤B¬$aŸ™X0ÈÎHÈNqß<ÕµM5g¡)ÊÚ„š¤f@ò†,ÛiÚ `$`ð2x>†Ÿ=í¼É#Ÿ1BŠŒÌsœ`“÷[§`MT—HóÕá–ôRÒºª¦4ƒe³‚>vÇqÈtˆº7ovr6ýÎv‡wvH"C߯9Çùi÷þ¾á^]…½¸¼xÞ@"ò’E;[#,á·t.Ñ’qƒÖ¬BÔJÈÒíÛœ») ‘Ô#i# 0} A&šóEx%¸Ü÷VÂÛ0üüžŸ?Û©ëL‹GH¯dhP³;‰óƒ6s—9ÈŽ8äg#Tß_ëî Ì»ÜÀóÚ‰þ`(S?08#ŽyìsTÓW‰®§F,H‘• ‰˜¾@R2x\ð=}8–;ø–Ëg4»’Ud>Zí¤c 8°$ã¶«>-Ü­5ÜÖÓIòlSn|¿—xù”±ÏúÃÜrTõ»奋W—ëœn ùÁeAò’A,•’ åxH¯GAÆ;ûäõ¯q£´ñK¸et_̯ `I9Á;qÛŸQ*{6 Ë¡hjv… ¬…°@Q‹>s‚  °8$@>†¢þÕ‰î HÛWlL$(ÄÒ*G[#÷'”Ó®tö–÷íqLU °2nPTHFFr$=Ç })²i¯#‰ãs·”d;8%$Þ1Ï–ç·<‰Sþ¿áƒÞuk%Fw›b.>wFU`HRFrG##‘ëVmî#¹BñÁÁ ¥YO¡v<ö"³—Gm¶è÷¥¨D‡à„WFÃsÉýÚŒŒwãÒäVòÃu3£!Žy<ÇÈ9EPýóœþç!IBÞërêE}©%»¬Qåå2Å~í™Ws¨9`0pOqëSÛÞÛܹHœ“Ã(Êz©# 9ŒŽG¨ªÓéÒÉ;˜çD†I£žEhË1d+ÐîAØ÷¦éšLzsåTòÔÇGaÇ.Ü–<˜xé‚ÔùwÔ/+ù }«Gˆ‘¾çJл"…ØàŒA^@9ê:ô°u+P #aÚ<$.Ä•8l2@ãòär8ϯñV¥e¯õ÷yë¡sûBÔʨ²îÝŒ:©)Ï@\  œŒyÈõZ×W†kxçrSÌŠ7ˆ˜¸-»§oºzŠOCRAa%¬˜‚à, U|¡¸•U^€BŽ6úãbôv„Âñ\$ DZ<€H£pÈÏË'b9ö¤•;oý}üËV² ÍóFÆÊ®H%¸ù@*A'âê+m¾arÍœ,q³±©Â‚qÈçÜzÕ!¤bÞö3?Íw ›g Ťb@ÏLÈp=ºš—RÓVùáˆâ  \Cæ¦ã#Ÿ”sŸZV§Í¾ƒ¼¬Kiz—s\¤c+ (9W ŠÀƒÓ¿¿cÜU4¾¼]3ûIü‡€ÀgòB•ew»$Nƒ®{`ܲ³f@”}§@ … ÛUà9ú ɦÍö?°Ét ˜ˆÂª‘mr»vŒ±$=äܹ/÷Á¼HÚ’=Õ¼0dî”G&øÙvæ&qÔx³ÍX–ê(§H¤.¬øÃym³$àØÀ$ñ‚{QUÓOap³I0góÄíµ0 ò|¼N=OzŠïIûMòÜo‡‰#“2C¾EÚAÚ‘µN:`ò[Ö•©¶µÒ߈ï+VÕR9J³*Í íp]Wå8çp‚G ò)ãS´(]d-‚ ŒYóœeÁ Œ‚ô5—m§]Í-ºJ¦ kDT‹ÌEÞ@xصØ#Á?/^‡µÓ¦Íöy£ûP;ßxÌ_/Ô€AÜOÍ•+ó@æ¥kKÿ_q)Íô,BÔʨ²îÝŒ:©)Ï@\  œŒyÈõYõ»O³  c2’˜Â·Ì¬Ê¤¯67rH<Oìtûp¹- ŒY]žH¥Ü ¢”vîqŽ0#6öQ‰þkHDjÛ8f Fzf1‘ïÔP•-.Çy—n.¢¶Ú$.Y³…Ž6v u8PN9ûZ‰u;7›ÊIÃ6T •€+–è3‘Žy< šf¥¦­óÃ!3Ä@ž50ØÏü£œúúÓSK ‘,¿+M£äcù}€ÆzqR•;jõr¾„æõVúkfGýÔ+6åRÙ°ÆëòôêsÀâ˜u[5Ø ½÷mÊ}çÈÛŒç 1Ðç§4—vh’gíócT`W íbÃ<ò§,w¨ï¤ýŠè;ÿ»†-áàdÿÏ?Ö„©Úíƒr¹jÒõ.æ¹HÆVPr®§~Ùì{Šu[6 ‘òØÚLNÁePU±‚2ËÈõÏJ4Ëìø|¡/˜¥P®å@„õèB¯^Nx¥ý“p&¶ˆÌoo HXG‚…^6Mß7Í÷9ÀLŠj4Üžº ò±£.¡mºvtm¥#³€zN0ËÏNEN²FÑ,Šêc``x ô9¬™43,4²Áq3;7ïíàʠ .G÷zzÖ¬1`Ž%û¨¡Gp:ä*f ’åz”œ¯¨¾t_óÑ?ï¡GüôOûèSé`ò dPµSRÿ&ÿy?ô!SÂ1;@üÍA©Ç“¼Ÿú  ÷Ÿñá?ýroå^u'úÇúšô[ÏøðŸþ¹7ò¯:“ýcýMvàvdOs­ð÷ü…õÏúø?ú•½'ú¶úÁð÷ü…õÏúø?ú•½'ú¶úçÅÿü¿$~¿ó°¢]. Zú7K5Áó s¶CÁ8ÎqÒ·k4[\Z ,í."óžU/3®Xq°úã­s¦ìí¸æŸB x¡f±ºŽÂ+@÷,#+Vhü§äãÔÿO­K®ÜÉn,DsÏËq±Ú„-Ûv·uªÔ¦òæ{S,ñG †BRbäüŒ¸ÆÁýïZ’{dž[i°6òÉV^4åÒîゲ2"Ö’ÊÊio&’T[&”,R>P7Î`S÷±¹uÈ&Tñ´ˆeŠ å"K2l+îe9ù²Ø(ßwvqÆr*Ôº\R<²,²Å3Î'Ync,GÀ ºä§Û_Dinæ2^Nm¥·Hd]ÊZošBÛ‰^ßÆÒ¸ÉÆ0*J&Â¹Û ¥Ì²%EvÂ6ÚÎ2Àcq’¶*½Ö´%Š&ÓÒY#iíÕ®PŠà†!¹Gû݈8´t”P† ‰à•V¦ÒØ‘÷²á”Œg³Àç®cþ·O- šx-Ñâs*æ=»I, tDÓÜä“X·h,\yè/9c*« Ƹ9õó8íœâ«Iâ«a¶’e’!êò;·ÜEÆÈS|qáDQ±åÊŽ¯ëž})¦Â—íx­ ™Ü±ä`‚ˆ¥ztýÚ\ޏ$Tri(×2\Ãq=½ÄŽXÉÒ@*ŠTR0|´=3‘×µ:ÛU‚êá#%txÖE—f 7/xdÎ6äœñN:‚ý± KyäXÜG$¨ ¬l@ ÝyžHÁÀštiyÀ–så¦ÕF°NOÌrÈÎ Æîh:zý±§K‰ãYI$HÀ,Œ“ÝxŽAÉÈ7ñ¢ÏqŽGž#ãfr]SŒ?Ëó2ýí§Ÿc‰.5û+[ùm.ËhйmèÙ7Ÿ•Iqò‚yP8÷j臄››–ŽÜ*Ã)¶5WG¹<Æ£’N=ù§M¡[Îø’iÚÛ|öl¨LȬç¹ÞÇïwúQ š¤ë=œaž&šàDé(\í(í¸Åx)ÈÎpŒÒ´ñ=¤‚`%Ñ.C÷VuP8n0Î>þÓ‚8$1­4ÓFèÞk»™æŽA"I!Q·ŒU Èfã<õàb8ôh’$„ÜÜ´1Ì1–]±e`£Ÿº£-“Žüœ€Fž"°}BK0ÌdBëò•bÌ€–/ü-Õ@8ã9µ¥ éÏ{"É1¡‘·€p nÈ*HaŽr¤úuȦ¦˜‰$˜¹¹¹vòöª³ä±ÝY,@'Œ`aÑi°¥ŒÖ’´“Ç>ÿ4¹¾ï½Â€}€ç'©$€QƒÄÖw£–IZAŠ&ŽC’¬ËÊ1QŒ9òõpy雑é K ³ÝÜÜI žb´…Gð²ã  tvçA%XAÈ$~ Š…4ÄI$ÅÍÈ…Ë·¯µUŸ%ˆ êÌyb|1ËåÛK"oPÛX!à ô#ÖŸKŽ.è×¢²¦ßk=®™¥¥­¢¼rJ ‡r(VP@E+É2g9ìx9â•·ˆžãOE!‰¥ºµ†(Øä‘*ÂÌ;e€‘úw§ZC:*+–»¾½ºÑí.¬ÛíokqhÙ?} O͸|ÀcŽx–}cT[£§ÁsÝÆîXâJªÄÜ#H¸ÿ\ß?w§?(IEcYj·7–áŬpÍ‹'˜w”Þ@qÁ`ùp2§xc‚¢¶­qsrò"<)mk¨ZÄèc,îKÂù ¸8Áèy瀊ŠÁеkýBXšêÕa‚æ´Br€òññq†6ÔÆ6Hõ-R5[{TûL³\Þ:±@å#Žm¡Hi<·ië@MÍìj7o„ÙÁç\Ç ‚†`€ÛyÌw+€üç5RëÄW+iÃ[Ú¼†{ä?»î«×–V d1àP_E`Ϫ_A,Ön°µóÞŠ2Àïó L3¨$,Nw\úÁnƒy%ö©w4ñyR‹h£uãï$×zŒ•Î2qêzÐAEPEPEP[‹ûki<¹eýæ3±T³ê@ÉÅMñ\D$†E‘SšÍÒ=·šÜÌìÆSœùä~¦‰V=fE‹£BPFÎãÔߪ·BnhQXÞ%³µº²®-¡™’êÝTȈ 4a€Ïb8>´ÝFúk´Çf–ñÛéÖ‹pјÉóçÂ. ç ÔqÇ2Q·Es·ž"{;çd…ä3Ý©‹8,‰NG¿îÐÈùºr(¿m@^é°<ö2Ü‹­ÈʬCC0Ë&Xà`‘ó Ü— ŠŠå¥×õ"Ò {Häû"3\7ʶÉ"uiËÊ'?>7{|ÚöwÓM©Ooå Æ „ä…;I£sÃå(@C *+›ŠöM3ȱÛ"Åe3yÌ[n‘ò{é–?óÆ^NÓ˜òæÁ­îÖ»¿/1óÔ«¨i ‘÷H6åç€utV zŽ¡5ûi¨ö©s}÷(ÁV&ÀMàƒûáÎã÷O¯´=Jå4kO'ìÖâÒÕã(K¹‘"ùƒg4q´çiäg€®ŠæíµëÙ£¶Ýkµæò#ÿVÀy»“Ï^¿Â®p:ƒ¹ûµ¥¤_Myç ÚÜ‘‡Q?u³ƒžC)!Æ3ÈÚ¥H  *(¢€ (¢€#‹î÷›ùšƒRÿ&ÿy?ô!SÅ÷ûÍüÍA©Ç“¼Ÿú£ ï?ãÂúäßʼêOõõ5è·Ÿñá?ýroå^u'úÇúšíÀìÈžç[áÿù ëŸõðô9+zOõmô5ƒáÿù ëŸõðô9+zOõmô5Ï‹þ+ù~H(üæ-Vmù¸—U´µ†î[hÞ dc¡,U£ï)þñ®SSJŠÀ»×– :?:EŠæI%ˆ2”\ùo±™|Æ ='0œºüQCuw#ù¶Æá¾8þV…rå}Iëž}¸v»EgÛj–²ÚÝÞ ¤6Ðá˲ðÊWÊ€3Œ0<ó’}ª„ºÿÙ/nMô2ÛF#„E ­,ìeÉÝ»há;°û¾¤d°ôV\ÚšÜi0^ÙI…’âóÁą̀ã¸?Ä22;ƒÐÔ–šÅµÞ£=ŠOìèÙ pOÊį$pØ<ôàà¡EaYëI4rù÷k¤q"  <Ù€œs¶#œœaF9'2¯ˆ­È›[µòPÉ6UH‰Cº1$681žIç„lQYpköSê†Á÷»Ú0w¡Ë.w  îÃrT:ò3¤¬Yœe p ÇÍÀ9>øç) uQ@ ‘ÊÙÎ\zÜûQûÿùõ—þúOþ*ùzµÿ®‡ÿ@jÛRÔ,b½ºº’ù Ñ·Ic‡È—g˜È¼39$gy´•‰7?ÿ>²ÿßIÿÅQûÿùõ—þúOþ*™`óÅ©ÝYMs%ÒÇ S,’ª‡Ë´€”vÏ'ž˜Ó§dïÿçÖ_ûé?øªk<ˆ’ÞER@É+ÆN;zÒª×ÿñëÿm#ÿÐÅ@EEU¾½b –âIäòÑ"Û’v³¢žõ‘©kètÙdµiá›Êi!%T‡SŽŽsŸ”ùlqÃd €03¡¢°­5‚¿hyóʲ²,j¨yQ'&>bÂÉæwñ‚jÙ–a#”_˜ª•g¨(Hâ^Š@Ï8ÁÁ`5¨¬ÔÖbk<Û\¬.ÀåWî .Ü2Ypo_c†ÿm§œ¶ëgv×G~`URÊWa ÛGË"œç³ž(RŠÅºÖ„±DÚzK$m=ºµÀ C²Ä7(ã ?{±¿Š4û•˜ÄÌÂ8Ì£k#o@@Ï vun3“ŒjŠŽ |øVO.HÉê’ 2‘ÁüFAê Ô”†QEQEQEQEQE$ŸêÛèii$ÿVßCK@£ÿ#Åïýq_ä•ÜO÷SþºÇÿ¡Šáõ/ù/ëŠÿ$®âºŸõÖ?ý W~+á§è¿$cOv_¦I÷ãÿ{ú}G)Û±ˆ8VÉÇaƒ\¦„”S<è¿ç¢ßB:/ùèŸ÷Тà>«Od“J&W’€Ç™Á#܃øŠ›Î‹þz'ýô(ó¢ÿž‰ÿ} .#¶´ŽÜ³‚ï#ýé$l±ÿì*Y#IbxåExÜeaÀõwžt_óÑ?ï¡GüôOûèQpwgm{ŽòÚˆÁÜTõÁïÉ¢K;igÉm ÌQ# -€Û€Ï\ýFiþt_óÑ?ï¡GüôOûèQp!M>Ê7•ã´·F™Ä’Av!yÏ­}•Ò2\Ú[̬âFD¬ Ç#®8Ï¥MçEÿ=þúyÑÏDÿ¾…>ÏÚ~ÓäÇöž_›´nÛœíÏ\gœTSiöW1ÜÏio-ÄxÙ+Ĭ˃‘‚FF57üôOûèQçEÿ=þú\Agmm,Ò[ÛC “Ò´h¹ç–#©äõõ¦\iöWHÉsio2³‰I°-Œ9qÆ}*o:/ùèŸ÷У΋þz'ýô(¸ öx|Ï3É~ÿ3vÑÛvîÏ®Þ3éÅDÚ}“ F´·*¨#Ƹ ztÃ0Ç£Z›Î‹þz'ýô(ó¢ÿž‰ÿ} .'³¶¹YâÚ–@ªâD H=@$‘õ¢ÚÎÚÑvÚÛCà.#@£'vË1üO­?΋þz'ýô(ó¢ÿž‰ÿ} .è¦yÑÏDÿ¾…t_óÑ?ï¡EÀ}Ï:/ùèŸ÷У΋þz'ýô(¸¢™çEÿ=þúyÑÏDÿ¾…¼¶ó4±K5¼÷ŒL0ßPA÷Æjkkhí¬a‰c–fbÌÇÜšwüôOûèQçEÿ=þúî+ $i*…‘ÔÀ0ÈÈ9êð¨ç³¶¹–.-¡–HNèšD PñÊ“Ðð:zSüè¿ç¢ßB:/ùèŸ÷Ð¥qŒvÂá®´"v!šMƒq =r#èH¦[éöV¨©mio «™G¨ F ¸ã>•7üôOûèQçEÿ=þú\_O²‘ây--Ý¡s$e£RQ‰ÉaÇžsëR¥¼1Í,ÑÃK6<ÇUŸ'¾/üôOûèQçEÿ=þú\’Þ<Ï2ßÍO.MÊõçå>£“ǹõ¢[xfuyaŽFOºYA+È<~*§ê¥/üôOûèQçEÿ=þú\n4û+¤d¹´·™YÄŒ$‰XŽG\qŸJO²Y¡™m-İ'—ˆ—tk‚6©Çð=jo:/ùèŸ÷У΋þz'ýô(¸-á]¸†1±Ì‹…+凹ÜÙ>çÖˆmá·ó<ˆc‹Ìs#ìP»˜õcޤúÒùÑÏDÿ¾…t_óÑ?ï¡EÀ}Ï:/ùèŸ÷У΋þz'ýô(¸¢™çEÿ=þú¢>bþt\/¸Þoæj Kþ<›ýäÿÐ…O|¾A$àûšƒRÿ&ÿy?ô!@ï?ãÂúäßʼêOõõ5è·Ÿñá?ýroå^u'úÇúšíÀìÈžç[áÿù ëŸõðô9+zOõmô5ƒáÿù ëŸõðô9+zOõmô5Ï‹þ+ù~H(üæ-S¼°77ÏÔöÒÄŽ¢r© îSýÑW(®SRŒš\[aû4²ÚÉeY"ÚÌCXáÉ’yÈëÉÌØÑ,­470LN|ÅevÁTR¿8lçËC““‘דZTP#>ÓGµµÓæ²dL;r@cÆF?…Gãšûšy/îä¹ù6LÂ0ÑíÞ8ô‘Ç õö©E0*½ŠIi¼’Êá$IK³e™•ÃóÛ’: 8⡳ÒRÎâ)VâwHbha‰öí‰ ^÷rMhQHf-Ίb-5ctdÞæ åå¥bGÈÀÿ®q‚Ôfg¡*X]Cu4-äM̤päcŽ?½aœp8+bŠwN =`¸2%ÄþVöA¸ Ä–< Ç$±Á$sÓ‹J¥YÉv`Ç |¼ížsÖE!…Q@ ÿ—«_úèô¦\hÐÝHÿjšâ{vÞE»¸Ø…Ô«@Ýј`±w`agòv?ËÛž7ãüjø—ÿÓ¯þ;Vž„²íˆµ–Yžâk™ä ­,»AÚ¹!p  Ìzgž½1r±¿â_ÿN¿øíñ/ÿ§_üvÄlÕkÿøõÿ¶‘ÿèb³ÿâ_ÿN¿øí*}‡zìû6ìñ¹Í;$öÉ<¶Ò1`mä2.;’¬¼þ k6OYËp´“íKu·0ÎÕIq+~ ~;VEgB·ÅÆÉ§C>wTŒ‘ˆÁ|Ö`F1Üf¦M1#¸ó"¹¹HÉVxƒäHʘ‚ýsó`ãœäæõÀÍM%·ò ÍËBDYqÒ íÀçW÷t÷9’×KŠÞè]e–ãGÛóîØ2@p#P0Nçš½E 2cÐ!†8bŠæå!ŒÄÍ(DÐ¥‰\ôEÎ}jht¥‚)/.Äj!Pà@ÆÀ±÷÷p1жt(¦{;E³…"ŽI4@ª­Œ g‘ÆsÐp*ÅRQEQEQEQEQE’«o¡¥¤“ý[} -pz—ü¿õÅ’Wq?ÝOúëþ†+‡Ô¿äx½ÿ®+ü’»‰þê×Xÿô1]ø¯†Ÿ¢ü‘>¥ú(¦»„\Ÿ ©®SAÔSU‰ÎT¯×VÉÙ®µÌÄ$à(' òà~$þtÒ½ÄÙrŠÏ³ÔÅÍë[ùxR¬ñH»Šº‚rTât°÷阭¯îŸ÷KrÌÒϰ¼›–’mç yä `ð3žÕ~ÊBçF­›¬³ÚµÂDvy°Æ¡Ž ÎO¦<ΞÕÅý̺|w)nV)^ˆÇ(,ÊdO•Æ ¦Hë“êÕ)^Ì\èÙ¢²&Öd‰ü²îº Á•Kºœ‚¨OG^ª;ûeÚ”­4:s,W@M(- oåHG–çîÁ#=¨T¥¥Ãt5h¬XïÞÊÞQåLìn<¨¡‘™Ý?v†e Oñ7uŽp±ê³™äf€¬~TAc|©4ŒƒªçiÀ9<€ËÎ(ö2Ý:6hªÚƒK{öI! *‡ÞU÷(+呃œ‰aÈ?Z4­AµžC‰>âK"¹ì:nßÚ¥Ó’W2/ÑXºÚ”ºœKÀhíbI2c ÆÆë·+³Ž~mþÕbãU03µÍ¾ 6“¤’DFã# õëÆ[£4ía{HšôV5–¥0[µ´›šQiK´«7V@X€˜éÜe²MO¦j~ÿñë$qºy‘¹WÁpIP3Èû¥‡ž™R¥%}M3JŠÈ—Y‘ k¹ÞIU.Ãlm´“µ “Ó÷íOVwvché ÉlÎØp\!o¨.É힀öSìñ5(¬¿í|Æ»`Ì›@‘wñ'–œr7Éû½EE6±äJDÖçÏŒ2ŽFeÜLX'ýbóŒŒÏ"¥6í`牳ET±¼{«rïm$N­´©Ær7$sè9ÏÖ¬ooùäÿ˜ÿͧfRwÔ}Ííÿ<ŸóãFöÿžOùñ¤1ôS7·üòÌÛþy?æ?Æ€E3{Ï'üÇøÑ½¿ç“þcühôS7·üòÌÛþy?æ?Æ€E3{Ï'üÇøÑ½¿ç“þcühôS7·üòÌÛþy?æ?Æ€E3{Ï'üÇøÑ½¿ç“þcühôS7·üòÌÛþy?æ?Æ€E3{Ï'üÇøÑ½¿ç“þcühôS7·üòÌF>SþŸã@ªº—üy7ûÉÿ¡ ²¬C)È5[Rÿ&ÿy?ô!@ï?ãÂúäßʼêOõõ5è·Ÿñá?ýroå^u'úÇúšíÀìÈžç[áÿù ëŸõðô9+zOõmô5ƒáÿù ëŸõðô9+zOõmô5Ï‹þ+ù~H(üæ-Q½¼¹ŠöÞÖÒÞ)¤–9$&YŒaB”•³÷ÇåW«>ú Ïík»Hà—ËŠH™e”Ç÷ŠA ßÜ?rš„Ú½¼ZoÚËG\ÄyV0$©RÄã‚qžÆxËŽ«mÝ}®X­c‚qyd ˜ÕûãûÇj¡q¢Ê³ÂÞt‘yÛ×í[2¸v!“'ƒ…9àõÈæ5Ñní£hàhÞëˆRâKp@Š4zå†67Ë’`IȦ#v)7¼Ë˜Ï–û~WÉ(?0ìyéÏ=êŒZå„ÓÜ…º¶6ÖñÆíp&R€»0ÚOA÷G⪖$ÐèWš|òÆâ%‹ze‚þá#'ÔŸ¦*;­*þúðÝϺy["ŠîEÝ´Jd ÿ­Ïçn;ÐïŸÙþÑæÇäló<ÍÃnÜg9éŒsš…µ+µK¦½¶[g;VS*„cÏç¡üª¨ÓtdµO-eIVp»Ù”°”I´³eŽHÁo|ãµGse:‰ @¬ÎZH!¹’N+Tnb‘Œ†Ý€hIgæÝ@žFß7t€y{¾îïLöÍ fŸgßuý§NdÍÎ1·×¨éê+ÏF½´Ò¾Î%Œ¾ø‹"Lñ‰À‘‘¼ Ëó.ìȦ‹"öÎ)%¤¿iFŽUšWuŒ$qÕs'àƒ·;zóÀ÷Ö­VßÏóbHÒå­¥ófT(ÊH=NLã íç¯Ô—öqyÞmÔ ämówH—»îîôÏlÖDú-ÆôxÊÈb’ઋ™-÷,®$ÉdðAä¹)§@–;af3å\$±¢K$!‚À±cpË/B‹€<šÝÂaI„±ùO·cîà÷ÎF=sRU; g²°ŽH÷ï,Ëæ1s–o™²Xòy8Éþîx¹Hcåê×þºýª(ug’î56ê¶ÓO%´R 2åÓ~íËŒýÛà†'§'ÿËÕ¯ýt?úUh4ˤ»_Éû5½Ô×I r]ÌžgÊWy§Ç;GCm;N%^ÌHÁÍ9t)ø6Øš’)IY¥¢ aiû€‚O¼€k­ý›ý£eÔ ölùØ+ÎïN‡¯¡¦JÀ[¬æöØBÀ°“Í]¤œçÔŠÌM*óìö®¶ƒìIÃ&Iiv:0ÉÇîÁòÆ@ÝÔw™mt©¿¶£t°o>kR_ËfXmb~XÛ'ïcž´kPÕm¬^(šX̲F‹ !Ü.à:œdŸÂ¦[û7ûF˨ìÙó± >V3Þ_CX–º5ý­”6‹ögŒÉm,²1 »Nìù\GÞéÇ%ž5½¸’) 0ci.f3N@'ýÀ~]Ø8#îà€t1ȒƲFêñ¸ ¬§!èA§U]>)à·Xçd ÌÑñ¹É%²0¡ÝÆI' Ò­RQEQEQEQEQE’«o¡¥¤“ý[} -pz—ü¿õÅ’Wq?ÝOúëþ†+‡Ô¿äx½ÿ®+ü’»‰þê×Xÿô1]ø¯†Ÿ¢ü‘=Ù~˜ÿ~?÷¿¡§ÓïÇþ÷ô5Êh>ª› Ó\9dfÛfuV 2 àðjµY×Ò™¤ŠØD«M.v©àà3×ÔSM­˜º“Á§Û[ÏæÄ®)EF*ªH$*“…íDš}´™ù]âÙŽFB 낤`2GByëL¶»Ì ¹DWe-ÆIWúzT—·‹h‘þêI¤•öGxÜí‚ÄH…cÉ=p*¹¥{ÜI!¦Y³£ØU•T ®6£ŒŒœgtâ…Ó-ñ * ± † ‚~Q8J[kôšU†H¦·¸`Íäʼávää¤|ëО¸êAt“Ís m ‰óÐ’Šü{a‡ëKž]ÇÊ» —O¶•Ùʺ»¶âñÈÈÙÀAUã§¥û<8€ÀÆ€¿)^ö$Uiµ8a·Ôfe®ŸŸ42qÉòóèî9«Ôs>ádW’ÊÞA&ä ÈâBÊåX6йŽ8íŸSMþϵٷÊÀÛ´Ç'Ù'9,!º‚IÎI«TQÍ.ádS:e¡@` $³±fÎ2“–rÐS£Óíc´–Ù"Ä2®Ç]Ç‘´'\çî€*Õs˸r®ÄV^F#¸Mê3ÆHê¥OOf#ñ¤{i™â¹ÌŒ$Ù³‘ÓîñŽ”ÛÛ¿²Æ»SÌ–C¶4Î2qžOaïUÝíº™®#†HG." ¯}ߥ Ë£±f->Ú'G ìèÛƒÉ#;gu$œa›Žœšu½•½³—‰8Ú2å‚EáGÀô8!”r Õ+ Eo¶²[\G‰æC+¨Û*qÈÁ8àƒ†Áç§”žìvD§Û:Úé†f Œ–9nAóŽ=8XÛ*2,AQ$*¹ríÛLl^:qV(£š]ÂÈ­ u™Y8™ƒ¿'%€èFÑ‚=3Ö¢e¦0c,pFæv-ÉSÄç?*àõF1йE R[0²"··ŽÙ D'$³f>¤žOaÏ`*Z(¤Ý÷QE€(¬Ã{ss#‹5‰bRWÌ”¸ƒƒ€1Ǿ ±itòÈðÏŽt§*ÊzÂ…rÝRòøZË)o5ÌòeŠ- í\ÙbesÏN¸u­ìw.Ñ…’9‘Þ)†@KžÇ”n„Ž28 ”2Í¥Ò]ÂÒF*É$Gw\£”?†TÔÚpý“í;dÙöŸ³c;¼ß+=znçéùPê* Û¤²±¸»”1ŽÚV Ô…8÷â›is-Æÿ6Êâ×n1ç4gwÓc7뎴fŠ( Š( ŠÏTÎV;;§€Hb7*¦àÛO·à0#;qÆzsR¶£n, ¼BÒA9ˆFTr|ÆUSƒŽ>a@è¨.î’Ò’@ÅZHâzåÜ ü2„ºG¾–Ðó"%'¶°ÈJžŠ( E÷ûÍüÍA©Ç“¼Ÿú©âû‡ýæþf Ô¿ãÉ¿ÞOýR½çüxOÿ\›ùWIþ±þ¦½óþ<'ÿ®Mü«Î¤ÿXÿS]Ø™Üë|?ÿ!}sþ¾þ‡%oIþ­¾†°|?ÿ!}sþ¾þ‡%o0Ê‘ê+ŸüWòüQø>ÿÌZ)¡øä0>˜4»Ç£ß&¹ME¢“xôoûäѼz7ýòhh¤Þ=þù4oÿ|šZ)7Fÿ¾MÇ£ß&€ŠMãÑ¿ï“Fñèß÷É ¢“xôoûäѼz7ýòhh¤Þ=þù4oÿ|šI¹B‘äÇ¡ǽ¿ÿŸ©ï”ÿâiwFÿ¾MÇ£ß&Ú„ýÿüýKÿ|§ÿGïÿçê_ûå?øš]ãÑ¿ï“Fñèß÷ɧÌÂÂ~ÿþ~¥ÿ¾Sÿ‰¦²Hà .$e¼àç°ö§ïÿ|š7Fÿ¾MÌ,…¢“xôoûäѼz7ýòjF-›Ç£ß&ãÑ¿ï“@ E&ñèß÷É£xôoûäÐÑI¼z7ýòhÞ=þù4´Roÿ|š7Fÿ¾M-›Ç£ß&ãÑ¿ï“@ E&ñèß÷É£xôoûäÐÑI¼z7ýòhÞ=þù4´Roÿ|š7Fÿ¾M-›Ç£ß&ãÑ¿ï“@ŸêÛèiiŒÛ”¨'Ž˜§Ð©Èñ{ÿ\Wù%wýÔÿ®±ÿèb¸}KþG‹ßúâ¿É+¸Ÿî§ýuÿCߊøiú/ÉÓê^¦?ßýïèiôÇûñÿ½ý rš¬+ÈâÚæSo’4±ÏŒ¯<Ç äž½±[´QdÕ™2Š’³2l"FkHí˽µ cç8#{ŒQ‚}ºTú¤S3Ù\CNmg2´h@f7N73—’8¿~Š<Ò²±Îk6Wz¤M7ö~×û%Õ¼Q»¡tgEÚÇ£;Yx'†­µÓè—‹¸íæk(¾Û ±,a6²"ÃØ©Á[`p2r+¡¢œÕîƒ-Ŧ¹¹®¤¸œ,‚_Ü"‚ʤ&KGéŠéh¢€ (¢€ (¢€(ê(ë,H ‡puQ“´ã$ä? Ó$Ô!’&ŽÌ‹‹†U8Sþ×÷GÖ´h§qXŽÚ!om ’#@€žø¬Ónç¶¾µ‚ÞK(¥´–·dFF!Œdí@7q…à¯ËÆGE!œŽ©×:͵ÍîÒÛË$Q¥³´N϶;’r mn©ãçÓe{»»oìï2ìÚ/Ù¥ýßúég1òNWh*>LãgÀÏkEPÑí ´êñ,rKu<­Œ|Û¤b¤ã¾Ý¿ íW袀 (¢€ (¢€2m&‹OŒZݰ„Åò£·ÝuíÏLã¨ëš±lMÕñºTe…#1ÆX/“’p{p1øÕê)ÜV3¯Òxµ+[Øm¤¹Xá–Ž&PÙsæ cä=óÈã®3u 2}Bé®&°Œùél…Y•Š"\oulú©‘•#'å'£¢Îyt[ÙM« É­|›Û‰Š'–~Vi¶°Ê·ÌC¯ãã4ßì9>Ëæm¸ûOöŸ³íOåìûVüìݳîsŒg>õÑÑ@ڢɨhš¼Éæ<2ÃpÌm¤dg¶xÉÆqž˜&²Àòé7vÂÃPŒ6Û›¥‘Ÿ=B’î:ºØSœ ­ª(Œ“O’[©íÆ–¦óû>%†U)‹7/6Ö›(ÁÂnÛ·8žÿJÔ§Õ&šÞ9 ¹—ÎCs”‘l1:ÇóÞ’—œäd8 ]eËÝéFâÌ%®•%…°™Z[hÌ;¦\q&.¬‡,rvúªç_GG´µ†É¢¸Ÿt…H@XíBTÎ?…A 3¤èÑ@6k³f´û ŽæY>Ñæ ‹kÈÏë» 61·¨ëŽk&ÓAžÞYƯ6Pî]¼˜î ÊG±À~ÄäqžYEs“hW~]à{Û‹¥¸»‚M¥‘Õhw1*ªCŒ€w«ú~œlµ{ÉÎ0K*­,í),­&FX’}¹úÖ¥QEȾáÿy¿™¨u/øóo÷“ÿB4_pÿ¼ßÌÔüy·ûÉÿ¡ @Ayÿÿ×&þUçR¬©¯E¼ÿ ÿë“*ó©?Ö?Ô×vfD÷:ßÿÈ_\ÿ¯ƒÿ¡É[õáÿù ëŸõðô9+~¹ñÅ/ɃïüŠ(®SP¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(ƒÔ¿äx½ÿ®+ü’»‰þê×Xÿô1\>¥ÿ#Åïýq_ä•ÜO÷SþºÇÿ¡ŠïÅ|4ýäŒiõ/S$ @+‚T罆€{Ï'üÇøÑ½¿ç“þcüiôP7·üòÌÛþy?æ?ÆŸE3{Ï'üÇøÑ½¿ç“þcüiôP7·üòÌÛþy?æ?ÆŸE3{Ï'üÇøÑ½¿ç“þcüiôP7·üòÌÛþy?æ?ÆŸE3{Ï'üÇøÑ½¿ç“þcüiôP7·üòÌÛþy?æ?ÆŸE3{Ï'üÇøÑ½¿ç“þcüiôP7·üòÌÛþy?æ?ÆŸE3{Ï'üÇøÑ½¿ç“þcüiôP7·üòÌÛþy?æ?ÆŸE3{Ï'üÇøÑ½¿ç“þcüiôP7·üòÌÛþy?æ?ÆŸE3{Ï'üÇøÑ½¿ç“þcüiôP7·üòÌÛþy?æ?ÆŸE3{Ï'üÇøÑ½¿ç“þcüiôP7·üòÌÛþy?æ?ÆŸE3{Ï'üÇøÐ]±ÄMŸ¨ÿ}ØÔªa±žIǽWÔãÍ¿ÞOýUª«¨ÿÇ›¼Ÿú /?ãÂúäßʼêOõõ5è·Ÿñá?ýroå^u'úÇúšíÀìÈžç[áÿù ëŸõðô9+|œOAXÿ¾¹ÿ_ÿC’·¤ÿVßC\ø¿â¿—ä‚Á÷þ`¥UÀúóYšœ>~¥h¿f·¹Ä2“œ(æ>~éçð­JBŠ\9Q¼c2?AùV—#¹rWV0̳8là‡Í.Ó\ ©&6Yr¼× ÆÞp.[^Ïr|ÜÛÅ2##Ù,ªxpqü`ƒœuç‹rÚ[Í—-¼RG¸¾Ö@F㜜zò:s[ÂÓ¬í feY Àz×¹üëWR-mÜ•º˜ñê—ÒC†â"àpÑz%¸~¸^ƒŽxK»Ë,èæ'û=¼þb”;%ÂÆÃåÏO^4æÓ­eŽD0F¢WW“jæÛ¾n9çùšZ[ˆVo‰s„Ø6Œä=ò3Uíi§{_×ù“É-®g]jw[ÉpF2ÓFˆTåZ0ç$çvtÀë׎nCs"Íw"  ÙàäU{e½…ÈÊRÛÛ[^Ù%²G3å£Nú¹0vŽ9Áç¾=ª}#þ@Ö?õïþ‚*h­-àP°ÛÅVÞ lcWØW]ËôUíh?ç÷þMÿÄÑý­üñ¾ÿÀ)¿øš9_`ºî_¢¨kAÿ¤¯r¾ÁuÜЪºüy·ûÉÿ¡ °¬C)HÈ#½WÔãÍ¿ÞOýRçüxOÿ\›ùWIþ±þ¦½óþ<'ÿ®Mü«Î¤ÿXÿS]¸™Üë|?ÿ!}sþ¾þ‡%oIþ­¾†°|?ÿ!}sþ¾þ‡%oIþ­¾†¹ñÅ/ɃïüŪ+¨3—ò¬®dUvMÀÆ*H=X¢¯U]%3nçþ›Íÿ£°Š-ˆ·¯çE¶wù¬UYÊ¥»1=«2H‘FÒHê‘ ,ÌÇ@êI¦j+‰´ïúø?ú*J¡­ÈÍök8á’ãÎ}òÅPÍãwÞ!pX¢O*Çð$FD,eÔHÀ°\ò@ÆN=²?1N®[ûNò ¶2IÂæM¬ñ¨’$fäI¼œ•É9銱k«4wƒÎ¼óôñæ¤wTù툊€Ta›-*€£¤`jl3¡¢¸Ë[ëäÓÞçí+·r[¼²JËƦÙO™¸£Üë·$‘ƒÍlè·Ww7Ž.nDKd`#£–’@qPOʋȜ’¢Àl$‰"–ÕÀ%r§<ƒ‚?§Woï­Ýâ·¸‚ݳ¼bWÛ繸—*Æ/Œ/Ê›OÍבÛ¹%Õîà{Ÿ0&O–# κž¿{!†H°”Vš”±Ï©)¹gòƪ傆$‚S,K† £zð Šú^·)¸ÿL»ŠKd2Ä%„‚WÄ,ŠUw7Í ª ÇBFh°=ÈX^Ü&™sw5ëC,æÞW$"ä,¥†ÕÜÁ€-ò’»FÒr6õ ¹"²²v¹û4s8Üùb?,lcœ>Be‚®?{qE€ÒIE-«€JåNy~M’xbeYeþèfž@ãñeR=kŽƒQ¼†KKØ[æ’)%‘GÚœÏ/ÛÌè¼&ÓóñÔcc[žK}_Ox›k(Ná®-ÔÈš,íÈkÞ3Zˆu5k©ãC=»$l-¤3B¥J€c{Œ1Ïr3S_j7öó½¯ÛcŽ(ed7sÈ–;"eRÆ6\Ÿ1ø ׃’Àtï"F¡¤u@H\±Ç$àÄ(y5 #ªBåŽ9'~$Y:̃@ˆÜã’á%sˆâBW-¸È­µN üÊNX Ȭ·r_xrÚyž9í±&øØ2°[¥PAÈAÒ‹ÐÔbxZc Ë”g(nÁ<À—þúµ…£ê³Ýk-OÅ,O7’eV–@VUEØ~r%ŽW¯4þ×yj©­ÎÏ>îàáãVU?l:pH÷|üÇž˜,[M!‘£¦EŠçpqïƒùËK«¸lueB×wE–è H|¥pPå±Àc¿5‰5ûÅ}rö¬wHén’ÝÉ,J°ßœT*¼…©ûØî,cQ™áY„-,bSŒ!a¸ç$qÿoûäúV¾¡teÓ–kÈÉ—#li¸L7•ÆÐ>dÀRCQ¸W¼º³Öæ{5ß+[Æ{wy„GtÁq×ï*ôæ‹ÒÑ\²_Ï6«¥Žµö¨dxÃMˆœ®RrÀmP3û´#9ÁõçÕµ! Dº‚//zÆÓ8Crë,‰¡¹Â&U6œ¿F ÖÑYv7rK«ÝÀ÷>`LŸ,FAœu=~öC 225Þ­©G&¢Ëu4Iq‹}áž5E}³fW;P嘩ÝÀù”Àu´W9r×+­YÛÜ]3¬3Å;JWitvôÀRUTg-óãq8ªwZÕ嶉cqöÅ[±‹¦k‰#n†v(Øwc!Jœ2ó“X¾Šå5ïæÒ®s3Oö©/-ˆpª³mÆ9-”Ó¦y©¿´o±Q^ÀЇ‰cW‘w\ÆUKHc%º·Ì¬ª6ò0KÒÑYz%Ü—_i\ùå… Nx1ÛäoNrH*kRŠ( Š( “ý[} -$ŸêÛèihƒÔ¿äx½ÿ®+ü’»‰þê×Xÿô1\>¥ÿ#Åïýq_ä•ÜO÷SþºÇÿ¡ŠïÅ|4ýäŒiîË£¥E7úû_úèô©GJ†oõö¿õÐÿè \¨Ñ”åÔæŽÊûåíp\‹dàùeœ¯”O9Æ$MÞá±Úúƒk×ÒOjm¢%``ä9»y8ç=O.›º´7äüѦ6óË …lç°yF;ïö$v›59ï7ç͆8¶c¦Æsœûïý(4j·«m|g†Þ;ˆo"µ@ŒÎ‹æ°Ä¥°dÎ0:cÞ›£¨M~Úb=ª\Ä_}Á…Š0U‰°x þø î?túñnm+ÌKÐ&Ã\\Çr‡nB2ö‚3ÈÌ`žœqÖ¡]"ê;ƒ{ä"ýËùŽÖäÄCÁ7‚"Nwâõ¿¦Ýý¿L´¼Ùåý¢—fs·rƒŒ÷ëVª +T²±·´ˆ±ŽÖ%-Ô…÷â§ Š( Š( Š( Š( Š( Š( £˜â û'ùT•Æ~Ï.:ì?ʚ܉.¡Ý=»¾É7üÃŽø=ñóƒQÁuݬ²Å¸¦É$c8SEå­½ìj³®í§ ŽöüjLŠE@¬.€6šë¶†ÔÛ¬øN5ëÏúö‡ÿB–¯Ötgõçý{Ãÿ¡K\‹flú[«7OÔnïR ƒgÙÜ xÝgÜáHÊ—R 88-‚GQ’.î¬8ôûöÑŽ‘!µŽØZ›o=]ÜlØ̽Þ=1ß"FkG«XKž;ëW„¦E™Jä.â3ž¡A?Ašµ˜MòÛC%»fæó®ûWgwÄ þ,Š ¦\Þj–÷בڡŽHɉ\È0‹.Ö¨çt£Œq·9íQǢܤ— d‡Ïƒ“Ñn¤˜öþëõÏÖ€6—V°yÞ¾µiíxÄÊYNà¸#<Ä©¤7ÖÂámÍÄ"v%D{Æâ@ F:äЊä­-nï ºC¶-:Ü$rȲGæ²É (!ÐmÝ廿úgF /P…Õä—ðË:L¢¼¦t„/ïcÊ>™ãœ 3­ØlÑ]C4wýdŠEe´°ç¾1޹#Ö¥‡S¶v·‰îmEÌñ‰$˜6àFr½ /œv¬;Mî=MoF›"#7’\eVùœdq.@é•íœÑc£^[ZCfÍnѶ–YCÊÑ,cj®ß˜(rHûÝ8ä ‚úÚå™mî!™”+0ÃeIÇb9µRï\³µ¾‚Ñ®-Ì®äJ¦`³îaéòŽ¸ëš©¥éO`ºRþåVÒÍà'v1’GÊ1'¯5VóF¼ºˆÙn·K_6â_?y/ûÕ”cfÜpeþ÷;{g¤!‘£¦EŠçpqèp#T­u» ›K;u kx…d‘C1ã*y`Nê/¥uyyötó¢Š5Ž&-³irrHûàçÓdä·‡§0à 1Ê¢Ñ,ßý&X—jnЦ7ä6J’1Œ9Ít'V°,fúÔHÒBùË’ã\gï Ž:ò(MNÚC ÅsjðJÙÀî!•@^Äe±×ƒÎxÅŸE¹’ÚxÖHwIôc$õž@ÉÛ°þ™¦ßh3]ê3LÆÝà–P쓕ͱ Œc¤ù|n6­`–‰t÷Ö«lçjLfPŒyà6pOò4ë[Ï´OyÍ¿f˜EœçvQ>ß…cÝi·ss,N¯ÓùžH¹’w‚]<o—¡ÜP)Ú…æ•dð°·•Š!H@ܰĀ}Þ„£sØcƒž7÷S]¾CŸJ‰YË>ð¡AùHlä`rxãœúöõÀWo”Ð}NÏüûGÿ Š“Qÿ6ÿy?ô!QhòÓ¿ëÚ?ýTºüy·ûÉÿ¡ ©nĶ ¼ÿ ÿë“*ó©?Ö?Ô×¢ÞÇ„ÿõÉ¿•yÔŸëêk³³&{o‡ÿä/®×ÁÿÐä­é?Õ·ÐÖ‡ÿä/®×ÁÿÐä­é?Õ·Ð×>/ø¯åù £ð}ÿ˜µWû>ÌU®s!.dQ’rx É«U·÷>cG-²(•Ð 1±^»Ç¥sÆýnÅ„±…eI7NíÊù“ÈàœGBjÍRf½‚{Q4¶ò$Ò!!*GÈÍœî?Ýô§ß^‹1Kq$òyh‘mÉ;Y¿ˆÑOz%~ ­Ð™ ®r¿½DdVÉà1üt~U%G,*ï 1ë…K®ÒGëRT”QPÝ\¥¬K$ˆi?—ÕØ(ýXPÔQET0\¤òÜÆ¡·FÙîJ«qø0©¨¢ŠŽ |øVO.HÃtY‰³×žyñ@QEV×O·µÉšò·tÓ<¤à'ÀÎ:àz µQÏ̟ߟþÿ?øÔÔQvD?fOïÏÿŸühû2~ûüÿãSQEØYý™?¿7ýþñ£ìÉýù¿ïóÿMEadCödþüÿ÷ùÿƳ'÷çÿ¿Ïþ55]…‘Ù“ûóÿßçÿ>ÌŸß›þÿ?øÔÔQvD?fOïÍÿŸühû2~ûüÿãSQEØYý™?¿?ýþñ£ìÉýùÿïóÿMEadCödþüß÷ùÿƳ'÷æÿ¿Ïþ55]…‘Ù“ûóÿßçÿ>̟ߟþÿ?øÔÔQvD?fOïÏÿŸühû2~oûüÿãSQEØYý™?¿7ýþñ¤kH™J³LTŒf|Ö§¢‹°² §w§%ÌÂeškyví/0ì`GsùÕʉî`мñ+¡œBRþÊ“þ‚—ß”_üEÙRÐRûò‹ÿˆ«lµÿŸ˜ï±GÛ-çæûìS×°´*eIÿAKïÊ/þ"ì©?è)}ùEÿÄU¿¶ZÿÏÌ?÷أ햿óóýö(×°hTþÊ“þ‚—ß”_üEÙRÐRûò‹ÿˆ«lµÿŸ˜ï±GÛ-çæûìQ¯`Щý•'ý/¿(¿øŠ?²¤ÿ ¥÷åÿVþÙkÿ?0ÿßb¶ZÿÏÌ?÷Ø£^Á¡Sû*Oú _~QñeIÿAKïÊ/þ"­ý²×þ~aÿ¾ÅlµÿŸ˜ï±F½ƒB§öTŸô¾ü¢ÿâ(þÊ“þ‚—ß”_üE[ûe¯üüÃÿ}Š>Ùkÿ?0ÿßb{…Oì©?è)}ùEÿÄQý•'ý/¿(¿øŠ·öË_ùù‡þû}²×þ~aÿ¾Åö ŸÙRÐRûò‹ÿˆ£û*Oú _~Qñoí–¿óóýö(ûe¯üüÃÿ}Š5ì?²¤ÿ ¥÷åÿHt†a‡Ô¯™OQû±ŸÄ&jçÛ-çæûìQöË_ùù‡þûkØ4%Š4†$Š5Û(UQØA¨ÿÇ›¼Ÿú©ÑÖE Œ¬§¡S‘Pj?ñæßï'þ„) ‚óþ<'ÿ®Mü«Î¤ÿXÿS^‹yÿÿ×&þUçR¬©®Ü̉îu¾ÿ¾¹ÿ_ÿC’·¤ÿVßCX>ÿ¾¹ÿ_ÿC’·¤ÿVßC\ø¿â¿—ä‚Á÷þbÖv}c R¤×–ñÈ'›*ò¨#÷ؚѢ¹Ó±m®ïlî.tô·º‚g’V9<§çŠf«dײØ.$òã¸/!ŽC(òÜdAê@ã×Ò´(¡»‚V05m6Yd‘b¶k‚ÖË ¬¬á¬ƒwï c¸uC¹rß'°ÌÙmןM[ÈL÷O%¸Ìòæ9báÎFìz㣢•Æs_Ù'XŽyrÁâhäIce‰T2|Ó’Ãnç›àÓ¥‡ÃZuš@©4&Ù¤E `¬ˆÎ}F>õµE”±Ñ.!·e†åäh6NL ¸|©,»W/ѱæžsƒÃ65^ÒvðüvâGàVá8f@ eA]¹*3·8­j(¸´:YIå•ôMÖ-+²Øâ‚R níœuÏÍÓ“RZè×PÄÒ̾múÜ[?™’UV•”“Æv¸= ƒž+¥¢‹Ê æ-.Ê"hœÙª]íu-#ˆí;²å(*ÇÓ_C˜ÛÀ¦ ¶µWý›ÌÊHM§a_)@Úÿw'æÏñ0m\ [; àÕ ’HÊ@¨÷>òp¸Æîäç*FÓÃðÙ *y<@n™glËÅ*‚Æ€.T±A’å^îHËèh¢àr‹ JšvŸ Ú)Ų}± æº<,äüÜ,йàgÔ×TÆËÊ{/27»¸žE‰!i 4‡c~óåÆÃÏñ}ÑÓ5ÒÑEÀæ,t‹´¶ÜDÇPóíXHÒ`¡!YH9ã;\rÀwªç@¸öp˜%M²BžA„åRÛ¤Üà•ÜJ¶ä¸ÉW_E.ÆÒHu{¹šÛËY2|Ó %ÎxéË â¡ÈRTñw¢]É&¢Ëïq*\bMЪH®®7cÌlnA†!FÞʹëh¢àeÃi&Ÿq|övÛ¢6èÑÇææÌ ›²Oñ“,zñ’qU-ô«Û6„3[_F`{yË1y™·ÊK6ü°#§üµcëú(¸Îíí¦ Ìp¬K3‰$,’o|1fê€ zg&Ûý®òêÂV²’Þ8. ·˜è[T‹œ)#esÉà“©EfÙÅwgá˜"Ž%7ÐYª¬lF 09ÇQëEîžW×V¡¤‘­¤KºG*ycÀÉ'$ú’kJŠå.ô[‹µt³±]>Þ@PBÅ+gS!HäÉÈçåé€+NÞÍ“XŠt°ò"¸ºþíBà Úr9ꜧ v(¢àQE!…Q@Q@Q@Q@ 'ú¶úZI?Õ·ÐÒШÿÈñ{ÿ\Wù%wýÔÿ®±ÿèb¸}KþG‹ßúâ¿É+¸Ÿî§ýuÿCߊøiú/ÉÓê\^þëìp,»7îš(±œ}÷TÏá»?…XWR¶{»dŽ2¡–xd;ºa$V?Ž×!¡úµ´Z•µ‚K —3HQâñ-Ÿq^¸ù@ÿ –=NÂX ñßZ¼ •óe+»ˆÎz…ýkóD¼ºˆØî·KO:â_?{ýêÊ1³n82ÿ{½³€ø4) åµÍÄPƒë#+ÜËrHT) '£H `œœ€4N­ln¾Ï°™ qL¥¥]Ê‚§œž=0K(Ï5޵mu`/dšÖfe ÓŒ¨f`7ô x©ù·Ù4“C¹I%a$$M:Jy#hK¶˜vä•r;`¨ëœ†[è—–¦Âdky%³··Œ!vUvD•æÚp1.AÁÎ1Ö€6ßP³O³ï»·_´ãÈÌŠ<ÜãyùºŽž¢ MfÀÛÉ<·PÁs½»¤Ué ޽N2\k/VÑõ Û)!O³:Sw@‘;%¾P|ÜîÜÊ“¸€ùôKñ¼ee1IpUEÔ–å–Wd²r+·x9(pÜB»³4ccˆÛ,>V8Ÿs¹p=Ç­6;Ëim Ôw½°ŒÊà¦S»¦åX«¢]ÁÚÛ5¨¶3ÛNÌw<¯(UçdÇ®1üUm4ɗöV;£7©êv³DU±œdWÇÎJtõ„©s3ÝÚÇm âœÎ»$;ø=3óöM[»½†ÎKU¶ý¦o% ÅXŒç×n¹…&5ä—Ò¤"g‘Ï“챬‘.|ÅPIÌ_wùºñZ‡Nhíô¨á1°:¼…e´g$Œ$g=0O9  Χ`v7Ö¡mÈY‰™q'7<ñÍS°24búÔȲJùËç8\gï:ðk ×ÓÁ¼gËÍ·’‰#\Ë!uYcv![å"?º3É g¸Ðîe¶ž5xwIôc$õž@éÛ ŸÓ4¬º…°!f¹µI žZ¨˜’̪;|ÇiãÔÎ*+ýZÚÒ Ò’Ã-ͤ ;Û‰@|Ï#¨ŽqÜV_ü#óyZ¾M¹–òÞXa~r»å™ù8à~ñ3Žëì*=WBÔ/å”y‘°o;l¯u&0ñHоV6.7¨ÜHRz’(cV¼¹±†)-í¡ZD‰¼ÉŒduUƲ2ÜôéÞ§{ÈmþΗ“[ÛÜO€±™GÌÜd.p[’;wSu+g»¶Hã*g†C»¦EcøáMfêú,—ײJ^9àX$V¹– €9*ŸëÞ~RGN¼ðvÛV¶•?},0Iç¼ (Ë#¢ãݶc×û­VÎÕ.÷OËi M,êd ~î~}EdÂ?7•«äÛ™o-å†'ç+¾YŸ“Žï8î¾Â›/†ä™®¢vQ¦áÒcq+•2‡CŠG˜FrsƒÀ-ЭÄ,ºÍY¿ÕÃpOËëÀ'ŽÂ¥¨•¦) hã Ö€ä…àýÓ›œqÇ>Õ-QEYgŠÖ+û‰Ûd0±‘ÛáDjIãÚ¬ÖmÕœ·ë$ /”ŸkI$uÆõ ªÊW ŒïTê1ŒÓ@ÆÍ¯¥½…ÌÐ0ýžeVÏÙØÞIèUJOLzu’mYÄòÛÃn¯8º±‡“j±òD¤’ c#€y׊ÃC›íªe™níš>Sp{“ ÄÀ…P»pcÀÇ÷³Úˆt‹¨-oâZê quæ¬wYÃFU‰ ó.ÑóÙÛÏ' B+éM嵬öþT³C,ó† Q‘xõ~Aààrà^¬?LšÚâÎGhöà ÂRpždˆÊ‹ÇÝP¥GNàtôQEQEQEQEQEQEQER×ýSÿ×Y?ô3Qêñæßï'þ„)ö¿êßþºÉÿ¡šf¡ÿmþòèB‡¸-ˆo?ãÂúäßʼêOõõ5è·Ÿñá?ýroå^u'úÇúšíÀìÈžç[áÿù ëŸõðô9+zOõmô5ƒáÿù ëŸõðô9+zOõmô5Ï‹þ+ù~H(üæ-aDº\@µôn–kƒæ<@çl‡‚qœã¥nÖh¶¸´YÚ\Eç<ª^f\°ãaõÇZçMÙÛqÍ>„ñBÍcu„VîXFV0¬ÑùOÉÇ©þŸZ—]¹’ÜXˆçž–ãc´ [¶ínê;U©MåÌö¦X-⎠„¤ÅÉùqƒûÞµ$öÉ<¶Ò1`mä2.;’¬¼þ iË¥ÝÇddE­%•”ÒÞM$¨·L-(X¤| oœ6À§ïc;rëKàñSÍ#ÇIj ‘“i&F‘ãÙØ9eòõ;±ƒW%Òâ‘å‘e–)žq:È›sùb>}ÐG õ>Øké¸%¦œÈÈ¡¤, 3+ïFäc*ÄÛÎ0@IC­uH®.…©ŠX®0åã}¿&݇‚G"E#õìx£KÕ"ÕÞ¥HÔFwI´gr+à`“ÀeÏ׌ÔcF‹w™ö›Ÿ´1c$á•^@ÁAS€áe@#o“6™¦Ã¦@a¤e;9r ùQPt²Ç4Tx†ÌÞKjwyÑȱíWó™<ü¬và²ðØ<ô88'Ö’ Q daos5Ęû›'Ï\‘‰1À'8íÍ@„æå£†?.%1 Œ»~\œÓ‰éÎriË Úƒ1’Iæi÷‰L“ tUeP$c;ÊŒò ‚*4Ñ'i¢¼»K—rÍ>åf;• 2‘ƒå©éÆ008«W)4ƲËÀCE*¶çS´®rÙÏŽs×ך«6¦·L¶Rad¸†<ðx3*8îñ ŒŽàô5%¦±mw¨Ïb‡û#z6Bœò±+É6=88tz\I`¶­,²œN]¶îgó|ÎpûÞƒ¥6ÏIK;ˆ¥[‰Ý!‰¡†'Û¶$%xPOÜQÉ4JÏX"I£—ϸ¸ó]#‰aæÌã±äã 1É9•|EnD„Úݯ’†I²ªDJщ!±ÁŒð2Hè8mΊb-5ctdÞæ åå¥bGÈÀÿ®q‚Ôfg¡*X]Cu4-äM̤päcŽ?½aœp8(H5û)õC`ûÝí;Ðå—;†Ðw a¹*yÔªpiëÁ‘.'ò·´‚ À f$±àn9%Ž #žœ \¤0¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š($ÿVßCKI'ú¶úZàõ/ù/ëŠÿ$®âºŸõÖ?ý W©Èñ{ÿ\Wù%wýÔÿ®±ÿèb»ñ_ ?Eù#}Kƒ¥•Zúëìp,»7îš(±œ}÷TÏá»?…rh¨f¹H$Y!Ž1ÈÌòm .2qýÑžNxã׈WÓZ2ê6f%Î\N»Fœÿ´¿÷Ðõ  ´T-yl—ij÷­ÌƒrB\aÏ!z‘Áü:ˆn<Ï"håòÜÆû¬:©ÇB=(J+8ëVÚFÑ.-߈Ygq2þçaPCßxõÆ6š·å´¶†ê;ˆ^ØÆepS©ÝÓŒšŠ¥ý¯¦ý›í?Ú6~Fÿ/Íó×nìgnsŒãœTæòØ\-¹¸„NĨxÜHˆÇ\€Aú@QPÁyms$±Áq ²BvȨáŠx`:_J¬šÍ·’yn¡‚8ç{v3H«‡RA{ã uÁ€/ÑU%Ôì ’Xæ¾µŽH@iåPP`OGæ)ßÚmûÚíþ×ÿ<<Á¿¦~îsÓŸ¥Y¢«&¡g#Ê‘ÝÛ»Dâ9È F'O<xÇ­Koq Ô+5´ÑÍgkÆÁ”öàŠ’ŠÌ‡^°š{ —v¦ÚÚ8ÝîêPfIè>èïüB´c‘%$‰ÕãpYNCЃ@¢Š(¢Š(¢Š(¨|–;$òG¼ä… Fpp}*j‰®]“1Sƒ¶6`8ÏP=髃*_ùû›òOþ&*_ùû›òOþ&“í)ýÉ¿ïËÿ…iOîMÿ~_ü)ê-ò¥ÿŸ¹¿$ÿâhò¥ÿŸ¹¿$ÿâi>ÒŸÜ›þü¿øQö”þäß÷åÿÂCA|©çîoÉ?øš<©çîoÉ?øšO´§÷&ÿ¿/þ}¥?¹7ýùð£PÐ_*_ùû›òOþ&*_ùû›òOþ&“í)ýÉ¿ïËÿ…iOîMÿ~_ü(Ô4Ê—þ~æü“ÿ‰£Ê—þ~æü“ÿ‰¤ûJroûòÿáGÚSû“ß—ÿ 5 ò¥ÿŸ¹¿$ÿâhò¥ÿŸ¹¿$ÿâi>ÒŸÜ›þü¿øQö”þäß÷åÿÂCA|©çîoÉ?øš<©çîoÉ?øšO´§÷&ÿ¿/þ}¥?¹7ýùð£PÐ_*_ùû›òOþ&*_ùû›òOþ&“í)ýÉ¿ïËÿ…iOîMÿ~_ü(Ô4Ê—þ~æü“ÿ‰£Ê—þ~æü“ÿ‰¤ûJroûòÿáGÚSû“ß—ÿ 5 Ê=¡™¹$–ÆI''§Ö¡Ô?ãÍ¿ÞOýTñȲ¦äÎ2G ƒÁÁàÔ‡üy·ûÉÿ¡ ‘ÞÇ„ÿõÉ¿•yÔŸëêkÑo?ãÂúäßʼêOõõ5ÝÙ‘=ηÃÿò×?ëàÿèrVôŸêÛèkÃßò×?ëàÿèrVû ©£Ï‹þ+ù~H(üæSC69CŸlRî?ÜoÒ¹ME¢“qþã~”n?ÜoÒ€ŠMÇûúQ¸ÿq¿JZ)7î7éFãýÆý(h¤Ü¸ß¥÷ô ¢“qþã~”n?ÜoÒ€ŠMÇûúQ¸ÿq¿JZ)7î7éFãýÆý(h¤Ü¸ß¥÷ô ¢“qþã~”n?ÜoÒ€ŠMÇûúQ¸ÿq¿JZ)7î7éFãýÆý(h¤Ü¸ß¥÷ô ¢“qþã~”n?ÜoÒ€ŠMÇûúQ¸ÿq¿JZ)7î7éFãýÆý(h¤Ü¸ß¥÷ô ¢“qþã~”n?ÜoÒ€ŠMÇûúQ¸ÿq¿JZ)7î7éFãýÆý(“ý[} -1·0ÚŒñ“O Rÿ‘â÷þ¸¯òJî'û©ÿ]cÿÐÅpú—ü¿õÅ’Wq?ÝOúëþ†+¿ðÓô_’1§». ¥«[Muc²ØFeY¢•DŒUNÉðHÛèjèª×÷_cµ2„ÞÅÒ4\àv ¹=†XdàñØô®CCUµ½¸ò¯nb†&¶ÀÒN\ù°ºŽ8&2ÆAçšngqu«¾­um@¼¦5mÛd ʤ«qÈž2j´Ú­ärßZM †æ[ƒ„‚Y]cb„° ±–Þ:(Ææä£ªÜ5¦§9Kˆ·e-ó+Fð±´¸dd{ç'ý…  6žÔÛ$¾\ª¾C»}¦UUhÑ!…~c1#¯C·[I²šÏÎó–ÝAÂF"…ã'¹$„çnH Fϛĭ^2éó<âlHÆZ0ÙÜvl JbyuÄ’ëïiçÛED€¼reÞw¬FlUr»^î1š€*¾ƒ}4–Ò}b±·Æé;†˜«ÄÀœ(òóåuˆÝÆqZv6WZ}×”¥ÜŤPóI2ïÚw;|Ì>QÐ 1ÆMHµû§1Gý— žY„K’è‡(íœÈŠxÙÎÀ ŒŸ–§Ó5)ïµ[ˆÊ*Á ¹wd¬¢YQ±Ç̧ËêqÐqÉÀpX_Á$7k«] ‘$W¹cæïØw—òþ÷îÀÛ·Æ ŠÏÃÏie$ м†{Fã’Á÷ùÈùºòiÚ‡ˆÅŒ÷ öo6(ÒM’!|3¢3•$¦Á÷pÌA:àº×Ùä{»]©k1F0ÎI,-šfãŽzžxÀ èz,šl‘y¡H·ƒÈI>Ó,¥ÇËÎÖùc(ùF{r1É.—z±yq:Éži<±s%¹1÷‚] ©,»y ð@-;W¹ÚÕ¬æÞóˆƒÎÒ°«¿ ñ«3(B1Žr¹bI«:6¶Ú¤Ÿñå4P¼~lRp ñ€Å Äp¥‡ž@+iZÍ”vK+ÂL¤´žBÚN8þðÏÓòªÚV•/a,p¬Olí>öË¢„«· ¤ÇŒäw㌢2åO˜ª­“¶F3Áè;céïÖ@Óh3ÛYÛ\ S ”qÀ¿1a: "f, ü§l_wæ7^9Ñ—Lyíµ˜EEÔ l`3°R<‘Çu'ò­J(œ»Òu ëÖ¼ž;xÝ<­‘Cw"ïÚ&2Öç€s·ëcLµ6V) ­–rÙðY‹™‰-ÉêzõÀè-Ñ@Q@Q@Q@fj7’ØX^Oß3í1 -H㓵H,pÇÖ´êº$²-âÃ/“/š ¾ÐÀªyÁèzt óM3àÔone†Ö«S<‚IG³‘<°žXØbg ù€ä‘Æ8ç5®»uwwÉ1Ûy–ñ<reXŽCäš8Ús´ò3Å¥Ò.£¸7±ÞB/Ü¿˜ínLD0Œx â$çqþ/Q†Aáÿ³$vÐÜÿ¡†GG2ˆ \8 û¤ÈÚ‹‘‘€ Ê(¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€15¦D”Áš]Ä($שÍU³{“[¸ÕeCêFÜzTú‚Êë2ÛÌa”1 <ô9íUì…È€µÔ›¥sŠØzÿŸÇ®;³j×ý[ÿ×Y?ô3LÔ?ãÍ¿ÞOýSíÕ¿ýu“ÿC4ÍCþ<ÛýäÿÐ…r=Í–Ä7Ÿñá?ýroå^u'úÇúšô[ÏøðŸþ¹7ò¯:“ýcýMvàvdOs­ð÷ü…õÏúø?ú•¿Xÿ¾¹ÿ_ÿC’·ëŸüWòüQø>ÿÌ(¢Šå5 (¢€ (¢€ (¢€ (¨/ç6¶dÅ>=p3Mj"z*„V’Ưý§p íŸ`Pÿ3Oþ̼ÿ ¥ÏþCÿãu§³óDóù(ªÙ—Ÿô¹ÿÈünìËÏú \ÿä?þ7KÙù æò.QTÿ²îÿè)sÿÿøÝÙwô¹ÿÈüng惛ȹESþË»ÿ ¥ÏþCÿãteÝÿÐRçÿ!ÿñº=Ÿšo"å• Þg-×ö„ÒùJ_c„!°2AƒÐzÖ©àRƒˆÔ®UYﬠ»}Bæ#:,‚8–=ªÈ2“úÔÿÙrÐVûò‹ÿˆ£“Ì9¼‰è¨?²äÿ ­÷åÿGö\Ÿô¾ü¢ÿâ(äó ùÑPeÉÿA[ïÊ/þ"ì¹?è+}ùEÿÄQÉæò'¢ þË“þ‚·ß”_üEÙrÐVûò‹ÿˆ£“Ì/äOEW}2eBSU»ÜÖ"3ï„–ÆssampF ±+ãÓ N6É袊’‚Š( Š( Š( Š( Š( Rÿ‘â÷þ¸¯òJî'û©ÿ]cÿÐÅpú—ü¿õÅ’Wq?ÝOúëþ†+¿ðÓô_’1§».TWGs E2îFÇr äG ƒ‚äš’ªßÝIl D²¼ÒlŸh+6sƒýßJäFŒtKBn3—2 ™|ÂHüû·c ¼g(ô§I£iòÂ𵲈œ–(¤¨æ/+€'Î…¸Ô[¥¯þ·ÿ«W soæ:Ü;¡PÛ€*ÅzàzzS°®W—F±™¦2B̳ †GØ7ªç H',?1ç“RɦÙÊîÒÀ®^C+$†c–r:}Î1Ò ƒWŠçR6°ÃpÈ»•§0Hz’ †ÛŽ6¶N@èrq¥He(t«HdI$y÷¬’Ìò0;YGÌÄœaÛŽƒq=jH,m­¥2ÃÇmÛˆcónbç>¿1b=2qŒššI5 #ª)!Ac’pâHG"J¥£uu©*sÈ8#ê#ð  èz}ÄŽÒÅ#ß”8Lº•b Í’rIêjy4Û9]ÚXËÈe`ÄÌcòÎGLlã*ÝJ*ÒEID}ë$³<ŒÖQó1'vã§ÌOZu®kg!’Ø66¨i„kýÔ‹Àáp8‚­Ñ@ jUKIo™‹N{öç§n‚ED³Æ×/n2ÆŠì¸<+ÿã­ùP´QETQOÒL‘¶ZØã†Ú“øÔ´QEQEQLgÈl¹Ú0¤ö'œtéÔûâŸ@BÖèÎÍ™±ÉÛ#(Õ5Ù“ûóÿßçÿ>̟ߟþÿ?øÓã‘%RѺº‚W*r2ü#ð¨Þî’hÞUF†1,…¸ ‡v 'áoÊØY ödþüß÷ùÿƳ'÷çÿ¿Ïþ4øÜKH¡‚° )SϨ<ƒìiô]…‘Ù“ûóÿßçÿ>̟ߟþÿ?øÔÔQvD?fOïÏÿŸühû2~oûüÿãO‘ÄjƒH_•KN;}zöêiô]…‘Ù“ûóÿßçÿ>̟ߟþÿ?øÔÔQvD?fOïÏÿŸühû2~ûüÿãSQEØYý™?¿7ýþñ£ìÉýùÿïóÿMEadCödþüÿ÷ùÿƳ'÷çÿ¿Ïþ55]…‘Ù“ûóÿßçÿ>ÌŸß›þÿ?øÔÔQvC#bM©œdžI'““ɨuøóo÷“ÿBf«jñæßï'þ„) çüxOÿ\›ùWIþ±þ¦½óþ<'ÿ®Mü«Î¤ÿXÿS]Ø™Üê|-(žÿW”t’mß›¹®Ž¹¿ Ä ¾Õ¡#—gäÎ+¤®|_ñ_ËòAGàûÿ0¢Š+”Ô(¢Š(¢Š(¢Š*–·ÿ Kÿú÷“ÿA5v«jP=Ιuc/,L‹õ ŠqÝ ìX±lÚF~¿ÌÕŒ×=o«Mo ÄtËâW9>CžþÀŠ—ûv_úß߉?øšé•96ÚüÑšš±¹šËÖQ'›L·™H&º+$n2®20ÈêWþÝ—þwß÷âOþ&¢¸ÕEÔ- Æw4MÉ%«²žsÈ+Sì¥ý4ñ)]$Ð\‹}51«¶(ÐM¦æÊ,FxÜyï].žm¾ÅØÿÔóŒç9ÉÝ»<îÎsžsœóšÅ‹QŽâŽæ8á%£T´pœä€ާó5*ë,ŒìšEê³ÌE³Çdü¼ðüÊ_ÓAÏ{4f°ÿ·%ÿ ]ÿþÉÿÄÑý¹/ýïÿðOþ&e/é ç‰7‰›×¼n?ñÓWÛ¡®R¼¸Õ,ÞÒ=:ñ@T…”A’šèuª.X¤ÇvÙˆâG§ÿ×´ú«Ù¬K Óeaok=­Ø’Ö6Ûnî AqV?µ£ÿŸkßü—ÿ‰¤Ó¸&¬gë—Ò ÿÜ¥Ä`‚hÖw”I)ꄨ!—•ç´Á±òŠœë-q<±}•ìbº†+’Ò‰Dx çLçÃŽ1“:êP#;%¥Ú³ÌEœ£qÀ?/<?Q%Ý”qùi§N±å[h± ®6œmíµqééJϰ ×oŶ-ÂZ)c ˆÁ’$l’yÈ—#¦ÜcæëPßkR.·,–éíoæÚă–fµò!œñ‘ÓkDÝÙÖ3§\Ö3_°I€‡\mèp8éÀ¦¬úz¡UÒæ PÆ@ÓäÁR+÷:aTcÑG¥}‚ë¸iúž¡>£ ¥ÔpÂ@™¥FæÚ"Û»ÿ[ЖÈñž73XÐ]Y[,kqÆ  K h'$ / ô©¿µ£ÿŸkßü—ÿ‰¢Ï°]w4œü¦³toùéÿõíþ‚)¯ª©RÖõ›°û,ƒ?‰\TÚ|m§ZÁ&7Å #cÔ(”´Z‚Õ–(¢ŠÌ°¢Š(¢Š(¢Š(¢Š(¢Š(ƒÔäx½ÿ®+ü’»‰þê×Xÿô1\>¥ÿ#Åïýq_ä•ÜO÷SþºÇÿ¡ŠïÅ|4ýäŒiîËuGQ®4áÿOÿEIWª9íà¹@—Ç2²(aŸ^k•2XãÅSÓ?ãÚOúøŸÿF½'öNÿ@ûOûò¿áVaŠ8#ÃGôTPüXZÜÄÐÝ¡ºžd¿ ÷a{R!Pef gqÏ,G?J¥c¡ ŽMù‘a²vó$‘¾ylù Np px^£溺) ââµÔ§´e»–îVýËÝF!•6²Ë1V.r@cÉûàUµµ¿…ç[Qt“¨¿•öò̬êbêv•²Lîî u4P/‡’tûG™=Äл<è% Îìy®ÎxÛ辜î¬Ç}RX4ËtŒRÅq\Ìÿ­ó  rs¸…Þw`©à‘ººÚ(2Ñ'†JnŠE![r[t…LH~V“;¾rØ,HÏ+.?7ɶûWöŸØG˜ ÏÞ_äØ@¾ G˜pùñ’6ÓÑ@ŤZ¨‰®nä»7‰qjžXo°‰ˆQÁ¾z€A#&§ÔãœkRHRèY´p,í}ÅGŸÂ”ù¸cvóƒÏ®‚Šæ Žù–ñå{õAn«Éf—®A-åˆóÿ-1І5}ÍÉðôeé\”Þ¥‹J"Þ7€pü™Çúgæ­Š(‹hn<ÙͳßÁ§½Ã¶ù!ºy¼¨Bä+,¸âNIÛÇûµ±d/«n.õßÈ_1™B¦BòHRcå½ðú7(  Vó?¶eó¾ßæyÉöo'•åm]Û¿åŸÞó3»æÇNvÖ`]Eàb}F;† ç;þY|è²Sp+ŒyÙØ6c¯®¶Šç"³º“YkG–ý4ø¼Ð¤JãxÛÉÇæ2`ç<œdU[/íy¯,廞ê9˜@Â1o& ìC&âD§w™Ë¸vþ]mÇí¿"?+í~~ÁänÎ<¿"/ÍÝÇ›¿nüü¹ÙVV)羂+958ôÖ™´*¾|¹·‚dùÂŸÝ ôÉùHnk§¢€9Ø>Ø.¬ÖO·“K›¬'¡ùçÌä‚ Àî5äÔRD÷Æ!_#É‚I3.[9Úê£ø?Öe ÕÑQ@¶Ð][èÚ¢Z¬‹|f¹xƒÌÌÈWwËŒéÆsžsXóÅ)»¸}8ê1Z°f–xî]ð<âB‚D‡æ1ýÃÆyã5ÙQ@ÄBéDBöMNAä²´èÅ÷¿Þ |¾V<ãïs¾£Ô?´<«Ï³ý¿íÿé>fß3g•¶O+gðnÏ“÷>lç?Å]]ÎÜZ^ Z D¸¿6Œñ¼²‡l±)>ÿ›øAÛ €¤‚»I¨Ü&¬ÒóîáX÷¥¶Ø%‘™„²’®£î¹—*zÿ{=…ÌIý¥öõùhF7nÛö˜üÏ3¶1˜ÿ–{³P…Ô^ u‰õîD/œïùeó¢ÉMÀ®ÜyÙØ6c¯®¶Šæ®î’:‹CÖØ631`cŒýó’Hfr æ> ¶>R:Z( Š( Š( Š( aEPUõøóo÷“ÿBb«êñæßï'þ„( çüxOÿ\›ùWIþ±þ¦½óþ<'ÿ®Mü«Î¤ÿXÿS]Ø™Üê|,Åïõwa†i²G§ÎõÑ×?'„/EåÔöºì¶Ë<­&Ä„ñ’HÜ3ŒÒÂ'«ÐÏsÿ~ÏÿQZ4êO›žÛt}‰‡4U¬t4W=ÿž­ÿC=×ýûoþ.øDõoúî¿ïÛñu—±§üÿƒ/š]ކŠç¿áÕ¿ègºÿ¿mÿÅÑÿž­ÿC=×ýûoþ.cOùÿÒìt4W=ÿž­ÿC=×ýû?ü]ð‰êßô3Ýß³ÿÅÑìiÿ?àÚ]ކŠç¿áÕ¿ègºÿ¿gÿ‹£þ=[þ†{¯ûößü]ÆŸóþ 9¥Øèh®{þ=[þ†{¯ûöøº?áÕ¿ègºÿ¿mÿÅÑìiÿ?àÚ]ކŠç¿áÕ¿ègºÿ¿gÿ‹£þ=[þ†{¯ûößü]ÆŸóþ 9¥Øèh®{þ=[þ†{¯ûößü]ð‰êßô3Ýß³ÿÅÑìiÿ?àÚ]ކŠç¿áÕ¿ègºÿ¿mÿÅÑÿž­ÿC=×ýûoþ.cOùÿÒìt4W=ÿž­ÿC=×ýûoþ.øDõoúî¿ïÛñt{Ïø0æ—c¡¢¹ïøDõoúî¿ïÙÿâèÿ„OVÿ¡žëþýŸþ.cOùÿÒìt4W=ÿž­ÿC=×ýûoþ.øDõoúî¿ïÙÿâèö4ÿŸðaÍ.ÇCEsßð‰êßô3Ýß¶ÿâèÿ„OVÿ¡žëþý·ÿG±§üÿƒiv:+žÿ„OVÿ¡žëþý·ÿGü"z·ý ÷_÷í¿øº=?çüsK±ÐÑ\÷ü"z·ý ÷_÷í¿øº?áÕ¿ègºÿ¿mÿÅÑìiÿ?àÚ]ކŠç¿áÕ¿ègºÿ¿mÿÅÑÿž­ÿC=×ýûoþ.cOùÿÒìt4W=ÿž­ÿC=×ýûoþ.øDõoúî¿ïÛñt{Ïø0æ—c¡¢¹ïøDõoúî¿ïÛñtÂ'«ÐÏuÿ~Ûÿ‹£ØÓþÁ‡4» ÏÂ'«ÐÏuÿ~Ûÿ‹£þ=[þ†{¯ûöøº=?çüsK±ÐÑ\÷ü"z·ý ÷_÷ìÿñtÂ'«ÐÏuÿ~Ûÿ‹£ØÓþÁ‡4» ÏÂ'«ÐÏuÿ~Ûÿ‹£þ=[þ†{¯ûößü]ÆŸóþ 9¥Øèh®{þ=[þ†{¯ûößü]ð‰êßô3Ýß¶ÿâèö4ÿŸðaÍ.Æ&£ÿ#Åïýq_ä•ÜO÷SþºÇÿ¡Šå.|36•7ö…ƤײIû£¾<\çqþî+«Ÿî§ýuÿC¦&Qj®öÓò& «Ü·EW) QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEUmCþ<ÛýäÿÐ…Yª×ÿñæßï'þ„(+ÏøðŸþ¹7ò¯:“ýcýMz-çüxOÿ\›ùWIþ±þ¦»°;2'¹ëTQEqQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEcx›þAñ×Qÿ µO?ÝOúëþ†*È>/úê?ô©çû©ÿ]cÿÐÅ\þüÄ·eº(¢³QEíÀ´²žá†D1³;àf¡X5VPZòÎ2z¯Ù™±íã?•7\ÿ¡ÿ^òè&«ë6ë.¡¦fk¤ÎbqÌ‘†QÑX äzñMh…»-ý›TÿŸûOüoþ9GÙµOùÿ´ÿÀFÿã•ZãX’#~“o*C.å¦bŠçåTcÀnÁºà Ömþ½qy¡ß5Œ\‘ZHò³ÊÑ´G2&SåÉ ÆÇ§îô$à¸XÛû6©ÿ?öŸøßür³jŸóÿiÿ€ÿÇ*¥Æ¾–ÖKu, åù÷0VÉ!)$z“åtã¯^(žûRK>9-á…¥ºØû&ÞŽž\Œy* ¨8Æ<œ þͪÏý§þ7ÿ£ìÚ§üÿÚà#ñÊͰ×Z[KiRףȊFyËH¯"¡P2>`<ÄËïpqÍ+X’ÿì¦kO³‹»´CûÍçhÛ»w}õÇ\Ž»O\,Yû6©ÿ?öŸøßür“ìÚ§üÿÚà#ñÊÊÔ5©£–ÚìųO†âpå%>dž\Sn02„›²ð;M½pÖ“Hú{FñËHdH‚œòYã 1Žp¤ ‚N2T¸X¿ömSþí?ð¿øåfÕ?çþÓÿÿŽTz–ªÖ6–ò ik‡‘IVÚX†ØðýÐyöäR>"›Ë–Oìé-íÅÌæG(UwHU+’w•Ƚ p±£ömSþí?ð¿øåfÕ?çþÓÿÿŽVd:íÄ #]B²D†öS"¿Ì"†M Û‚yè3œœTqkó[Á!–Êé®%œÞ³l« ÄT<*á$’X‚ác_ìÚ§üÿÚà#ñÊ>ͪÏý§þ7ÿªðëJö`ØÉŸ!¼ÒPäPÀg¡l6ÒW  ]Ô\,T±žYDñϰËž[VùCnUº¡§ÇÖ§ÿ_#ÿEGWè{‚ ‚öàZYOpÃ"g wÀÍOT5Ïùjõï'þ‚i-XÞÖ U”¼³Œž«öfl{gxÏåKömSþí?ð¿øå]Íci°½÷’\] Öêegm›RVP»3³T™ïœóNâ±sìÚ§üÿÚà#ñÊ>ͪÏý§þ7ÿ¬Öñ‰5Žå»D–Ùc›,èÏüÙ+~õN2G^GS[PÕî<÷YaÚ,íîžâ(®YAeHÙJ¸ž%Ç `’y*´\,mý›TÿŸûOüoþ9GÙµOùÿ´ÿÀFÿã•›{â­b{‘eÚ‡ž5c9Z%œ®ÜLLÉàƒŽÕnëVxuxl#·W2òí&Ð I8Áä×=¨¸XŸìÚ§üÿÚà#ñÊO³jŸóÿiÿ€ÿÇ+"ëÄS³46Ñ(‘¤ŒÛË—òæO:49f@99MãœôÌÃ]hâºh­wGgæËpdœî%‘rœÇ÷lv’ | t.4~ͪÏý§þ7ÿ£ìÚ§üÿÚà#ñʯk¬I5Ìk%§—·ÛG'™’Î…ùÛŽˆÏ9ÎxÆ>j©w­$^ XþÕ ¬2%«[1$†LásÎ ‹°ózñEÂÆŸÙµOùÿ´ÿÀFÿã”}›TÿŸûOüoþ9T­Ìj£í†ñeši9D» •~fT “´„'jò‡“Ÿš‘I?á}QnïòM9¦vûC•,b$áI!yämÀã — _fÕ?çþÓÿÿŽQömSþí?ð¿øå7N•Þ÷UWveK¥Tä(òb8ƒ$ŸÄÖ†ê.3fkû#—ÛÏH‘°HJ0ÜÁAÉc܊ѪÁͬ?õóþJ¿CÚà· (¢ÂŠ( «_ÿÇ›¼Ÿú«5Zÿþ<ÛýäÿÐ…Eyÿÿ×&þUçR¬©¯E¼ÿ ÿë“*ó©?Ö?Ô×vfD÷=jŠ(®"Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š(  oÈ>/úê?ô©çû©ÿ]cÿÐÅAâoùÅÿ]Gþ‚Õ<ÿu?ë¬ú«ŸÁ˜–ì·EVEQ@õxÞmö(Ô³¼ªrTâ©É«i3¦«:ømíüƒuŒ†VÛzÀÈ–!Èl·,ÇæÏÞ>¦º|ŸZ2}hÐ59ǓÒ\yÒMhï–`pTn6œ ÁŽ@žNO4ø®4°Eä,áÕÄ’]—pFqó3Ž[ŒãæoSžƒ'ÖŒŸZ4 Nr)|= Bc¹V ¡P]‡hK.ì1  ùG< ž ýßìþUݲýš#_¿j¼uçî/_JÜÉõ£'ÖSœy|=%Çœ÷01Ë7–×DÅ–1ò÷mä3gŽr}hè6C{1!¼Ö½c(Æq‰ n[€‰½Nz<ŸZ2}M¦×úÖÑÀní’8ñ刧˜ð06• ¯v$t5¸ðø†x…ͶÉâòeÿHå×,y9ÎIv$õ$äšè2}M>¦Síz˜în- q"²´À©´¸ÛœrTÇ\žç1 t!½˜Þk^±”c8Ä…·­À?ÄÞ§=O©£'ÔÑ jsëqáõx˜\Ûf.Ÿéxçp-ÏÎCÀ¶H$ž§50Ôô…P£E»$ü§#ø¿3ß¡Ímdúš2}M¦nŽâo¶Ü'1Mqº6ìÀF‹‘íkJŠ)7q¥`ªz¼o6{jYÞU¹*qW(¡;ÔËö=Õ¤ GÔ•OíÚ|ÿ¶CþfϵŸ/vs»ËÝ·9ç8ëÏ^k Éõ£'Öž‚Ôç_!âæR¡®‰í`À -…Uáp>QÇŸ-LJæ’áä¹¶f¸GIÚ>ò²¢°ëÆDiÓÓë]O­>´hœþË“R7:¥“ÀÝmÑÈBX2Êd(r³…“žäPKáë{…¸Žæ<ÞcÝf 2‚IbN°ç¶=:<ŸZ2}hÐ59¥>W,.¡û…Má+ä Ý„ÁU#n1´c§<¾sÍÌÅ‚Ý$Üňp 2ÍÃd|ÇŽMty>´dúš4 L5¿ÐÓÊÛwl<©^týøáÛvã×¾öüè7ú³šÐÝÛyùžbyãæÞInsžKη2}M>¦S;Í ;³r·py™,¹Ê+¬© œœ2r}M@O‡J:5Ô-#'–ׄ¢+E-„à‘ò€HWK“êhÉõ4h˜«©èÉ+Ê—°+¼žkqͰ'#<ü qÓ€zóN‹VÒbÆÝB„Tù®wp3ާ¯<ž§¾q[>¦ŒŸSF©‰w¨Úßùö“Ç<¦â&Û ,ŠÄœvÀ5·FO­›AERQEUkÿøóo÷“ÿBf«_ÿÇ›¼Ÿú¦"+ÏøðŸþ¹7ò¯:“ýcýMz-çüxOÿ\›ùWIþ±þ¦»°;2'¹ëTQEqQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEcx›þAñ×Qÿ µO?ÝOúëþ†*È>/úê?ô©çû©ÿ]cÿÐÅ\þüÄ·eº(¢²((¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š*µÿüy·ûÉÿ¡ ³U¯ÿãÍ¿ÞOýSçüxOÿ\›ùWIþ±þ¦½óþ<'ÿ®Mü«Î¤ÿXÿS]Ø™Üõª(¢¸‹ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€1¼Mÿ ø¿ë¨ÿÐZ§Ÿî§ýuÿC‰¿äýuú Tó†1€VVœgéW?‚?1-ÙnŠ©ö›ùõ_ûûÿØÑö›ùõ_ûûÿØÖC-ÑU>Óqÿ>«ÿû>Óqÿ>«ÿû·ETûMÇüú¯ýýÿìhûMÇüú¯ýýÿìhÝSí7óê¿÷÷ÿ±£í7óê¿÷÷ÿ±  tUO´ÜϪÿßßþÆ´ÜϪÿßßþÆ€-ÑU>Óqÿ>«ÿû>Óqÿ>«ÿû·ETûMÇüú¯ýýÿìhûMÇüú¯ýýÿìhÝSí7óê¿÷÷ÿ±£í7óê¿÷÷ÿ±  tUO´ÜϪÿßßþÆ´ÜϪÿßßþÆ€-ÑU>Óqÿ>«ÿû>Óqÿ>«ÿû·ETûMÇüú¯ýýÿìhûMÇüú¯ýýÿìhÝSí7óê¿÷÷ÿ±£í7óê¿÷÷ÿ±  tUO´ÜϪÿßßþÆ´ÜϪÿßßþÆ€-ÑU>Óqÿ>«ÿû>Óqÿ>«ÿû·ETûMÇüú¯ýýÿìhûMÇüú¯ýýÿìhÝSí7óê¿÷÷ÿ±£í7óê¿÷÷ÿ±  tUO´ÜϪÿßßþÆ´ÜϪÿßßþÆ€-ÑU>Óqÿ>«ÿû>Óqÿ>«ÿû·ETûMÇüú¯ýýÿìhûMÇüú¯ýýÿìhÝSí7óê¿÷÷ÿ±£í7óê¿÷÷ÿ±  tUO´ÜϪÿßßþÆ´ÜϪÿßßþÆ€-ÑU>Óqÿ>«ÿû>Óqÿ>«ÿû·U¯ÿãÍ¿ÞOýS~Óqÿ>«ÿûdÏ<ñùf@H%¼ÌãOj.yÿÿ×&þUçR¬©¯E¼ÿÿë›*ó©?Ö?Ô×~fD÷=jŠ(®"Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š(  oÈ>/úê?ô«uSÄßò‹þºýªÝUO‚?1-ØQEaEPEPEPEPEPEPEPEPEPEPEPEP%•!‰¤‘‚¢Œ’j·ö”G¤¤z‹9øšMWþ=¡ôûLú5k_uZJ×d¶îdÿiEÿ÷ßø/ÿGö”_óï}ÿ€rÿñ5§ÈcC*ªÈ@ܪۀ=À8€§î¢Ñ LŸí(¿çÞûÿåÿâiSP…äT)q9Âù°<`ŸL°5«º³µ¦Íœ_õóþZ9bÁ¶‰™‚)f É&©NH®ÝOFKYX¡ ƒFµÆ‰ù÷“ÿA5¬À©$­v6Ýô2¿´¢ÿžßø/ÿGö”_óÂûÿåÿâk[uR—TŽ=V>i;¹áŽJŽÂHsÛg¸§h‹R·ö”_óÂûÿåÿâhþÒ‹þ}ï¿ð_þ&®JÌ;©»· 4Ž<Á•U$3x‚ ìE:;ëiX¬w» $+‚w’¿ï Ç^(´CR‡ö”_óï}ÿ€rÿñ4iEÿ>÷ßø/ÿSbÙ.®RYaŽ xÑÚv”Ë;¡SØSzœv«1ß[K"GÄ/#Æ&UW²Œ÷}úQh†¥í(¿çÞûÿåÿâhþÒƒ#z\Æ Æém¤ERTZÛ«?^oø‘jõï'þ‚i¨Å°m ½ÿúæßʼæOõõ5è×ßñåqÿ\ÛùWœÉþ±þ¦»p[2g¹ëTQEqQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEcx›þAñ×Qÿ µ[ªž&ÿ|_õÔè-Vêª|ù‰nŠ(¬ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€)j¿ñíý|Áÿ£V´·Ukˆ#¹…¢”§ƒ‚9} UþΓ¶¥{ÿ¿øŠ´Õ¬KÜÓÝFêÌþÏ“þ‚W¿ù ÿˆ£û>Oú ^ÿä/þ"žÅò$½†çí¶÷–‹ ²E‘å !Êî Ý61߯ÒEvšÖI¤Uh…ËîŒüÑI,Šãa#œ|Ã$r:Œ*Ïö|Ÿô½ÿÈ_üEÙòÐJ÷ÿ!ñiÜ>Eûs7’¿hòüÑÆ<í>à™ëŽqÓ'­Iº³?³äÿ •ïþBÿâ(þÏ“þ‚W¿ù ÿˆ£Náò4÷U `æÖ/úùƒÿF¥GýŸ'ý¯òÿJšpóQ溹¸Á•$(#¡ùTg„Òw¸;°Öÿä ÿ^òè&´·TÆ“DñH»‘ÁV Õ1¦ºŒ.£zª: Æqø”&’jÖÜÓÝXsé2­ÔÂñ’ygûBÀ6ù,èG•¸•ßÑ#݃×8«?ÙòÐJ÷ÿ!ñgÉÿA+ßü…ÿÄSÓ¸¾E Ýi´¹-á6é,—S3ry©*®H‘æ >þX¹Òæ]N;Ë5· n‘¡,QNÕ™HÈhÄ Œ÷qÇZŸû>Oú ^ÿä/þ"ìù?è%{ÿ¿øŠ4î#$xzóyšIa’U“Ì9dƒy/pO̹dâpxÏB:sZzFšöÈÞXY"EÚ®ÎCy’»e›–ÿX9=NNJö|Ÿô½ÿÈ_üEÙòÐJ÷ÿ!ñiÜ>Fžê¡®Ÿø‘ßÿ×¼Ÿú ¨ÿ³äÿ •ïþBÿâ)K ³ÞÝÍûѹ@z 8üi¦“½ÁÝ­‹7ßñåqÿ\ÛùWœÉþ±þ¦½û›+úæßʼæOõõ5Û‚Ù“=ÏZ¢Š+ˆ°¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š( ŲùZdNFGœ?ô¬?øJ¦ÿž1þGüh¢»èSŒà¹‘›vaÿ TßóÆ?Èÿð•Mÿ> endobj 63 0 obj <> endobj 64 0 obj <> endobj 69 0 obj [/Indexed /DeviceRGB 255 <000000FF00006B6BD2FFFFFF666666FF66667B7B7B6666C24A4AB96B6B6B4242 B1F30000FF9090B1B1DA888888737373B1A1A1FFB1B1CC6B6B181818FF33337B 7BCC6666B9E33333B9B9B99090D2DADADA8888CCB98888FFC2C2424242E37B7B FFE3E3DA9999FF1818FF7B7BEB2121B1B1EBFF4A4A8080D2C2C2E3A9A9A93333 33F33333D252529090E3DADAF3CCCCEBEB1818FFA1A1999999A1A1DAB99090FF D2D2525252EBA9A98080E3A1A1E3EBEBF3080808FF08087B7BD2FF73737373C2 5A5AB9B1B1B1292929FF4242E34242C2C2C2E3E3E3DADAEBF38888FFF3F3EB90 90FF2929FF8888C2C2EBB1B1F3FF5A5AD2D2D2EB4242E34A4A9999F3CCCCF3A1 A1F3C2C2F37373D2FF6B6B8080806B6BC26666CC5252B94A4AB1FF9999B9B9E3 B1B1E3909090B1A9A9FFB9B9D26B6BCC7373212121FF39398080CCE339399999 D29090DAC28080FFCCCC4A4A4AE38080FFEBEBFF2121FF8080F32121B9B9EBFF 52528888D28080DA393939DA4A4A9999E39090EBE3E3F3DADAFFD2D2EBF31010 FFA9A9A1A1A1A9A9DAB99999FFDADA5A5A5A8888E3A9A9E3A1A1EBF3F3F3EBEB FF101010FF10107B7BDA7373CC5A5AC2CCCCCCEBEBEBB9B9F3B1B1FFD2D2F3CC CCFFA9A9F3C2C2FF6B6BCC5252C2D273739999DAC28888F329298888DA9999EB E3E3FF8888EBA9A9EBF3F3FFD2D2FFF7B796FC949005E770C2F0F4F7B82899EB 94F741F7FC9490F7B84E6D892D05E770C2F118F7B77BF741F7FC949003EE8803 D600F713EE00016FF7A2E3007DF1C2F164000FF8DF0008402004F7A3A0C40000 1F200C000FF8000000C4000CC40000DF0008000000F713E22A001EC4000CDEFD 30C2F18CF7A10E03EE8803D60000000305E00FC2F1A800E44A05E0F8000032F7 B9C59A3DEC000030001DE803B600C2F1E000CD7C00000900CD5C000000FF92D0 05E10005E17003B600C2F20400CD7CC2F21000F56A033238FFFFFFC2F2780010 260000300021F9000028FF92D0601232FF94D0FF92A005E100F432F805E100C2 F22C66E8880000006021D3FF92D0F432F805E100C2F26C66E94B00000060D91D>]endobj 68 0 obj <>stream xœí} Oi–¶s1Ónó!H ‚Âf0IX&|&\‡5Ù| .FÁËe@_˜ F€Âm#I‡ÉÆÍF ¼?tÏ9ï¥Þ*@fâäö‚ Æ—AçbSHôïÝœiñ×­ôÆ |E ã‹`c±ªw ~~^±Iäo*ô%1Œ/+óŒÕû'6+6Áö³ò3ßBÁxo¨xÌïŸh‘¿B_ƒÁøhÙXœ{2PÜ]ï÷û»Aø¹«ÁøFp3¸Ÿ u‡zçªxƒñm`3Ä¡ýÅÐB¡¹3…¾ ƒñ…н±ØTõ$„xRÅÓúŒoþ`0^UÕ47×gî3ßî÷nãKñÅ•_ }) ãËâ—¿ßߢ©½×Â`0 ˆë}…¾ƒQT³ø3ß(n3ûŒoÑB_ƒÁ( b· } £0ˆ²ñg0¾MDÙø3ß&˜ü Æ7ŠëìûŒooXúŒoi&?ƒñ­àæó ¿_/äã®ü­µ_ð‚~ëë…¾ã7Ÿ·øWz—:7®|×ùžÔëFþÉ|_ôÒÎÇZÏwTè‹`0þA1S/‰òW6®t^¹Ò Mþëyä_?ðùþ—?× —Âäg0.‰ûÀxã †zõn,Zm;{­Ñ÷ïÿ[È¿ñù²L~ãÒ~'(Ÿ¯P °”?=4NÍ=óù’¨¶]¸Nî–ŠkI2ùŒKÂOt¯j©ðw^¿¡üѨ1©¿•ˆbë»V€ë´aý\^ +?ƒqiÜDÅ‚G3”ñ9¿Yï›üA2ß—ÌØö?˜Ïd“Ù$\+?ƒñˆåïÓÑXçw6å¯Öä§:!YhåÏmõ3@~V~ãó0°Ñ¹!Ž&déO+4:(^S…6‹;Tþ7…¸VDi&›Aîù³>îçg0. g°Sµl!@“äÔÂ/Ò}‚ü€ú@ÿd6+²V~㲘Yê\zNGcADgç†$ÿmÝÑ×*óý¬(ùÔögüÙ üŒÏÅÍÅ`pf—‚ ý@AþÃh4-ϱ+a ~D~¬øù²lûŒÏBïÒâRh³Â_ BÀ Èo ?)¿¦~mf¹ŸM²íg0>þÅx|1¾ø!þ!aø$òGÑ}¨üY‹ý…·ýÄþ$Û~ã³P¬ÿP¯Š ,Å—üףј>¥Õ&üÙB“?+J~äüïòZŒlܯB4‰†ô_ôÓL~cX¿™óg}ÉÆ|ãÚèëöð~*mwwyxïã×p:üëÙY8ŽÐgÚÏú_{jFTüPù“IV~ã3ðóœDÕñ c|Ï|¾?(É—ìÅæøº½©ðþ~d?Lã^ ¯6œÏeÀéò*œFàùRûíkÎó¦J!ßÇFôïÉRw]l\øc0.ŒÇOû逹/GõËQ}IÓö'³è¼3™Tþ—­½ìÚOõS¤û€×ÀíÝÿ>ïçOV‡VOV"«4æá“?^:,ÃÔ¸`þ¸èë“I¿;ãâ(Ö?é}ÒÛ;ÛÜ\SÕDLíóŠQ}¶j?xnâþxžòçºà>)ŒJt&ú¯6ä\|xHpÿ%Š?6éýáKöSvFùýã2é—}D8bò3—¿7ê õÂz‚ìŸû'£Øgé½:H’éGÔ8¾ho>±OÔßGþ*âõONVON]~ûס“!|t?ŒÊOQƒØIì›ç"ùÉ÷Ó ¿lR;òñãRh …B+ÐBž„zç~3 ýF²o R(¿Ãö¯ãß—ôO¡‚£éôzƒ¾çgþ£C#'CC@þW-å—ÒI$Ì€AäÏ’ñÏR¹ß¢>+?ƒqÜX‘Qèý-–Óoúœ@Ê÷3™yÛ×ìu%ÒôƒòHÈW¥ò¯"ÅÚ:424´{‚äÔ틤63¾ùµðgù…+ö2Œ‹âþ€ÄÊÊñÿ/­7¶™õ¾,ÖÝl9n^Ⱦþyð°HãWQ×ÑÞíæì¿ündhw„„ÿääDÿ0±¬? ?|á²uvƒ~Ó÷[®„•ŸÁ¸8~(¦FüýÿÆ›NÛïÓõ>‡ò¿ÝGîKáO…SaUëá‚ ŒüjûáW#€¡]Š (þ»ïÎPýQù÷¥ö'ö­Ó…ògÇůÓ0ëêXùŒ‹ãfw1Bñ`eÓxÓÅô'E_ßxÖ$s‚È¿¿Of=œŠDVwÏ^*ú½GvGFliÿè±DP_†½³U•õ§(–XÒß  ~Ö0V~ãsð˜È?V,B¿ÅxÓ-çÝüY[Á¯Qr;ùQ¶w‰æ¹_¥ðCÊOLkþð[úÓ‰ ÿOê¯Ã`üçUo_"ѧËj–Ä_¬èa]+?ƒqq<öuwûíÊŸWíOf{¨ânöóß½Šäߗ‰h½>¢Z?æûCÄSú‡FýÉõ[oìb¹ÈIääe¿êÓ0®ËýjjU‹`åg0.·€äÿ@…ñ^žîõ³Rû Û?Ü¿ M°×zg;ù‡PÞIù²ÞÙCê¿Bã?tbô…_î6ŒöŸ:û¦ˆúBû1Ð"ž¬ü ÆgÀß]è®Gþ#û7'´›å>_6LÿÞÕ« I}ª÷åŒ÷ND±ì=ÁzãT ?ÕûOÞ}âÅjî ågÅg0.çâ›þz’ÿâ çZ åÙÏ¿Qgâ*¥ü²à×`¾Òä¦b?°ý­¥ð¹·Èþ·ôŽóý„é´˜‡œØ×ƒ¦Ÿ'ô0Ÿ¿±¼¿ ù³¦ïÏŸÏ?ÂÒ/¹i6ß;¥þ!)ü#µÞQÊ/»úWëg££Ín£€ Èr¿˜Ù“dåg0>é3Ù_ßíF~£“?ébûß_¥”_VüÃ~¥ò á7ëýôRÒÿDŒðÇ©½‘ðnÿiUc|Øö3Ÿ‹XßðþŸ-úÍ8O±­á—Í_Ìc„_Ò?’Ûß=#é—"ÿÖHúÿ›Ê}¤üb€¿œÜüO¥vïæ\/7#†øeiF?Oèa0.ëÑ´wÂoÙŸ¯üz4 ÖûòÉß|ÕÈù#‘HûIûnûî¶³wgTî“Å~hVfŸÃ”_)ÿÍ ¾4-(Ùop+ŒÓ¼½€/“ŸÁ¸q±®–– „fÿŒó,Û~.ä§^þ„®ö›Ëøà„>Tþ!9Êgä­Áè¿êœ_ð%åËñ½)ç„~‚ZɇÆösÎÏ`\bîîf ÂbÿŒó´‘¿áêUQï¾GçÍÓ}ò“!1ÆG)¿9ÌÇÈù‡TÒ/föÐJ@ûûgy—lüàjšóN`0‡\¤s`ÐßüY‹û.ýüS ´ýªÚŸ@ÛNÚ/çõœ¨‚ñß\ÐkïJùMåˆ~`üö^C„îê˰ò3—…Z¤³bsSð_°¿þ†óDSùÝ ~ V¹’~þ”X¿/,øIåG¡·­æ·÷VŒÔ·ôÐËy8Ù­”?Ë9?ƒqY(î?ž©ûÏU~Ëõ»ÙþI³Ú/&öÐ^±Ž‡˜²«¤ß¾”gî?‡dÊ¿z"‚)D(?.äçø­ŒZÊGäülûŒ ã0z]ùgff*Èúûgœ§ZÕ~*÷çð›Õ~k”ϼ´ý‘°š×£êýNò{½§ÿI¿Ö}±–Ìùû Ǩ}]ìϰò3—BßmuWŽŸgfn û+Ðø»“ß>³'o„_s¾ò‹¥|(é²ÿ<ò{ñž# ü/UüHøi^ŸsÔÀ¸X»;ÃÕ~ã’°îÁûóù'>Jþlþ:E??P_Tûç§§kÐöâpÎõœ¿;‘®^ÌçO!õ÷‰œíùÊß®gõ‘úæÊ{©ˆUïK$–moÊÛu‰A>¬ü ÆE¡ïŸ®æÆïåüëæb^Ùd&ï뎤í—+ùØjt¹ß£»wz:<üÓÙÙªÉâZ¾“ï†ï´/ù›‘KyHåŸü¤ÿ\ƒ!q]õñ#€ø7ˆûçVû¬•2if ꃜu ñ“S{‘ý~ãûXÆ;ûixô•}a®W¿þôŽº÷iBϪ¹’O¿Èùé ¯:rþ.P~ZFL(¿ìyàî~ãÓPm¸þDz§]ÿ„ë¿ucJ/®Ü]:utw»+c¸ûVáûåœÞýˆõVƒ^»ŸîÌ1¢~{ÿðoâ^]«ÏDÂäÏÙ®¥±Tß±'‰~¤±}ª6yð·øWa0¾ÜÖwáõz®æ›ÂŸ?¯Ù6+í=Xt›²ÎÈIòÓHŸÈ~*%Ù¿&‡í…Qßi!ÏœúÈ«= Ÿ`Ý‘{]?Ú~rýÖÚÝ„F½x¯yûàäßè†ÁøÊÑ­¶Rþ_**Ôð^Êøëýÿ7ï>›ôc;ÊïkãŒvs˜ÎÇ 7Œö¾”ÔÇÁ{â†\Æ*^'CrmO9£'<šÃ?ï5¤tOÖûS{ÚEO_FŒñÑø[þó0_/Ž>ïÍŠMIý‰s¦ôz3ö™=”rÛoו벆øÒŒ~q“nû}ºWmkôâÊž«òîÜrdßnûnX ðÙÜ/áè7œ”Â/”_oÓã«EµYïÚcÓsúüÝ3y¨±I?òÍ·mÎÍ‘îí£Ûõí«™}4Ä_êÿÉIÎøDîäÄä¾ÝgõóEð wíWâmÜÇ‘ý>¾cƒqA˜äÿ¹¥E®å1¡–ñšÉûÀ¤©üú>½öþþvYò»º/²~âp8bQ(n/Üë„_Ýw>¢—ñÀé¼h$rÎk—Âï3oÒËýý Æ'!jÿ—‰–‰½ŠW½¿¾Û…ü9Û=»ô}zí'Í'(ë$ôr>á”pþ’ú«Î¹w«Öd¾°^ÄCÌé‘ý|ùƒZ³êf]jØnÜßÏ`| ¢FOß ÿ6Å}¼oOÞžŽå<|IºQ¯“ü¹°ãK¦ù}b–®S÷»V¾§¤ÂÒò§h= ü®¿æ}Ä»7žµ:ú4Ú?÷ß„Áø&`*ÿ¦céÞn—›vÞ›Ê/´?›qŽá?KÐðþ«2éW{åb~n#ýÞ™sø#j6_Šfó%ö#®“&3bÙn›i½ü¿ƒñ á¶EþÇzÝîz¡ûn·ëäžÔ÷ɂ޸º£ÒËôòNÝ)¹œW$üSÎõRŽ„á§•»ÂF­…?õNy±Ž‡-áQ> ƧÀPþ›@yâ=4y«¾üu"r]û‘üI`¿Ë Úá”è—Py?!Ü;÷bFOÔŠ½ÒóGhh_äìü¹“ìp°i?“ŸÁøD«£êf-HzÁüzy—î7åÕd²–öÌ¿vP:ÚŽºäO…çwï~däýéðÙ‰òü4¶/uÒ_°aªÖ”ýÄñòƒß?ŸÁ`bzxïc}{nIý±âWå>>::ZoþØŒýWk¯ÖÄj>Ÿ|Qê§á½Â\^Î'žÎ`0ƒQq·¯÷—n…1BqñÀÀÊïŸÁ`üCã ø~q´9f˜Ügò3_/¢Ñè!î×kæ÷WZ }y ãï…ê¨XÊç9¾˜hOªÜ…˜ü ÆW‹¾¨ä7t/–¢~Áäg0¾^û¯{½cHxE|IýÞ¹‰B_ƒÁø»!Åš_Eh%´‚¬³/˜êí›cåg0¾b ‚ôGBÈþf>P¸ÏÊÏ`|ÕÀ¬ÿ@wÚˆø`ø‘úMMþB_ƒÁø{¥ÿ7ú^¤}¯Ð|ä~0(ˆÇk  Ø`D‡öí×­ØÚ·Û[U;/$`4 ‡ý1íÙ÷hýÿÄÿm1¸ º¿|'€þz«îá`90>FB=»S‚ìóîÌvô:hØp%FŠ’ÙXÚOe-#¯C;à-¸³0ˆ~¿£Ž–¯ë0Ïi[hÃìÂû¢Òƒ!¡­r– ±J¢}Y]ú‚­…E”Q<ž‹åü–æ›Òo ì™MÐ<½G> }®öŸ>85èoñœ8ß¼ö Ù­h¿$‡‡ØÐ¬K7 Žá@÷©MXE÷#hÃJûG%ñiwËlŠñ¸5yKcRøIý~;é—÷‘ößOM‚ðO~?e6EðÈ{`?6ê#í[‘îÛí†%  6¤=vÏZ%ÿéÙ >0_qý˜žk„-˜·”ŸœB#n©šFxn´¸ßˆÜo´´ß&þëkmD×Ú ŽDÄGšÙáàGhHtr?RC¼/ŦP|—dÇnÄthÁ}â|¾ê)U„—ÜïÁ嬀ö¸¨º‚,nÂøp‡/ðöZ´è…XçÒ"ÿÅÅ¥xü7,ûýWÓ"ÙýÅÅà´ ù©Âm«{8‹‘òw$?p\áNݬ`{Ñ2à¡é‚ž:.£W]ûï -ðUvà7¥á é“uóœ’_Í=ôõÓ 1V½;++ñ¯áÃø±jØÅ.B}—(3viÒ~öôþÁyÚo×} þÞšMøÅ4gü›=pŠ?i¿Hš…ðÛÄŸ( •²¥ûÃnÀÝ~up«ßˆyªßO´¿µ,èkR‡bÿÔÔ䔡ü¦P1`Usaý¿ßކ͖´£êߤð‹½]÷Qõå^„€VKôÿÏ5ØTN`—}|Týy¢;<”ú7ZÍzì'í·YýÒ5°é>„‚kZ÷1àëT@(ÿÔý§OÇŸ"åi/--5%ßd$  ‚~´ÿúÔ”ð‹-ké?ŸêÿúǽKAäz$þŽþöaì>¼ ;ƒ6ò— ¦nÕŸ1⸠‘gyžö*ëLò×S…š;•m·­c«Þh¥çE>ùÓm•Èö¨`;üNG”XN¢m–ªJ ñ³fÁàSèoùý\^[ÚEûÅÞ]û ö›ªoj¿®4ÛËk¦ò?²ë¾Ò~Cù×µÝ?’H?,µ_‰¿Cûï’ðdXÖz/›¤~¿aü%ó—…ç—Ú?)ÔßÔ} (÷ úÀý)Ãú;tÉßÞJÛ¶!üZ÷Û¡µ¶Ãó±6Rú•ë—–_ÿXk¿|¨ÂÀ<ÑÞR~“þ û5]`ìÊoñ^»WíWºÄ¿&ŒÿS²ü:ï?Ê/Ô_˜~|HÖKá—q€èýC)Ñ^k¿f¿”~8øAZ±vµd~’¨/´ö —Ÿ•¼'êÓß²šüõÀsäz0ø¯ÿGûýñ½Øè„f#êô½Ù鯄ò{ªù%ëbH¢K ò÷É¿Ùu\uü-²ÇŠ®ÏzòÈß7}{‡¾IüŠ·dzº#`½”D¼úð½@삾ߌ.Å?þ¼"à=öÎ×þ½SS÷Úß,ÙeßEù­ò_3é¾~<Àl)¿®Ú]­ûÃ:ëwhÿ­~Cùïjí_6ó}ñ÷kí—•ïʯ´_Å€×È{tû–÷ÝŸ²åû¢¡÷Ý*”¿µÝ,á[[-ÁoÕOZûI÷üHÿg†æ«ä=¥ü˜üká×A e…€®FWt5v]k¼ÖUÛu­ËUûµî“í¿&…_Š>=¿Mè?E’~ÓúK`©öãš÷ãvíÏëïùAi&©š¢¿ÔþŒÖ~"¾Èõ³Û X ±òG4ÿÑ¿,mtv¯t^±‘ŸJóŽ-¨¬M“Á®ö´íx0 zh7íÑl‘ßëé»;1›'­óp£Eõ‹Ù<òÇ*ËËMò{^D©œ¯È§:–Æ«óP ©óô]LùÍBŸ“úJûEÕ/m¯ùS;GûAùO䷴ߪó­iöËðHª¿¡ÿGÍ–ö7«¼_è¾,õ©@0_i¿æ¿%ýH}þ»†õy¿~Ò}§òkö[¼'íŸt~Ù€1€lD€©ísŠ}ÛDúvÊûÛ-í?&ío•vÍ¿`¾!ýó¸ÕKÅ—ûg¦öÏ+áGç¯6Óù§„ô7Ú­€Úk°á£K‰¿Mû­Œ™MýI÷§ïÔíéSÅþ[ѯÔHdª?Žâ/ÆõÇ•ç_ú„Û·©D⟥[júä--Í‚ßãP'ð|ã xüà*þŸ¢èþ£þËÿÿ°ñ ºïknm"}O“òƒ°W")Óƒ“-$#ïê<1'ùït”‹à±Yzñf]™†(ìÚòÈuJÛeRoYâ xÚðc垎 uõÙ‚€KÏŸ—”ß)þB÷õ]´ß©ûμÿ•tkpdïÌKüåi¿Ðÿõ#;ý…0µßVï7´_øÿ~³âÒ¯u_)¿ ·–ÏÑþ)ËX1à{¡ý´ÕñÚöŸ„[$þöÎ@$;Ðÿeë±ØTõï™,ø¡òߟKñŸ¯12~É|!ùêXûS5–æKÆ+÷/F¨íïß…´wA+hç/»~|o6Jd’þ÷¥FÞ/CÀ¸¦©©û¢Ê/{þ¤ ûb‹¼3¬Tÿ¬ ½Èû…óÏêq×¹•.@ü?ß²qeãÊ•ÎNÜÑ3Ä‚¥ùcuTàv´Z÷»‰ìÚã½#l¬ˆXX$U˜̦¤Ü´ý^ÙùîU¹|ò£“Ç‚ßV>ùÛ:›–Ah:0h¼„ÏâW÷Űᢠûí!À .Í=çGíß;gðO>ý8JþÍkhûÖ_Ëÿš~›ö«´ÝMùlõþa©ûŽa?*Õ¿%^P@‰ÿ¤j’úùÚ?µl)ÿ¤*øOé^?5ö=?Ù}cô=(Û/ˆ/°-+ôLº/©ÿRåüÊjŽçIúíŸÊ/çµù¯‘Ù¾­æ§´^°¿F¿@î×BÂÔ'þ»û±èÿãÁ5£äoÚcèÏ{½·[YúÏH¿/[©æ½Ùß/¸}~=¢¨€LþÅÞÒ~!öº»ÏVðc˜’ïJû´-íÇç´QíÏÙ´_qÝÅø“'x`y¿ÃøËœ_ê>>ÖuÙïÐ…ß>pØÔKû‡UÍßÈûupKÕþßAøûoYù¾Nío˜4h?)Šþ“†ðË1>$ýTó±À>þOdþdÿ[·[e ÀìÓ. ~/)÷©„_Sÿeÿ ÿŠþRþíÊߨò~Êú)é@•üæÍ í>\#×ßEY?…gÚoØ~=ÔGþM²_û\¤ýOu¹ÏðýôœQIáû5ý3Õá×#R~â;²_åüTû3 R¤ü¢»O0ßÇ÷±wEîñ7µÏÒþ:ówjÿš«ö»´WfÞoô£@Ð,¿ììü_äû‚þ„ñu‡ö÷ëš¿‘÷[)¿½Ãó}cدCÿyÿ”îó³úù•ù—%ÿ)ìé{=eËù ío•UÿV™ðËÑ>ªòGy»RûgÇVŸŽç­¿Çbä¯ÕõW£³ÿFÕÝ'Jïßj÷Iþ‰÷Ž´ëý.ôWÂ/ºûóéo9Ô~‹ýV©Ÿ^«:¿òšû2ûÏHÐ#¶¬ä~ÖªøgDÕ¯ÇR~à'ºûðQhž1 ƒÁ`0 ƒÁ`0 ƒÁø\üƒÔ endstream endobj 70 0 obj <> endobj 71 0 obj <> endobj 72 0 obj <> endobj 77 0 obj [/Indexed /DeviceRGB 255 <000000FF00006B6BD2FFFFFF666666FF66667B7B7B6666C24A4AB96B6B6B4242 B1F30000FF9090B1B1DA888888737373B1A1A1FFB1B1CC6B6B181818FF33337B 7BCC6666B9E33333B9B9B99090D2DADADA8888CCB98888FFC2C2424242E37B7B FFE3E3DA9999FF1818FF7B7BEB2121B1B1EBFF4A4A8080D2C2C2E3A9A9A93333 33F33333D252529090E3DADAF3CCCCEBEB1818FFA1A1999999A1A1DAB99090FF D2D2525252EBA9A98080E3A1A1E3EBEBF3080808FF08087B7BD2FF73737373C2 5A5AB9B1B1B1292929FF4242E34242C2C2C2E3E3E3DADAEBF38888FFF3F3EB90 90FF2929FF8888C2C2EBB1B1F3FF5A5AD2D2D2EB4242E34A4A9999F3CCCCF3A1 A1F3C2C2F37373D2FF6B6B8080806B6BC26666CC5252B94A4AB1FF9999B9B9E3 B1B1E3909090B1A9A9FFB9B9D26B6BCC7373212121FF39398080CCE339399999 D29090DAC28080FFCCCC4A4A4AE38080FFEBEBFF2121FF8080F32121B9B9EBFF 52528888D28080DA393939DA4A4A9999E39090EBE3E3F3DADAFFD2D2EBF31010 FFA9A9A1A1A1A9A9DAB99999FFDADA5A5A5A8888E3A9A9E3A1A1EBF3F3F3EBEB FF101010FF10107B7BDA7373CC5A5AC2CCCCCCEBEBEBB9B9F3B1B1FFD2D2F3CC CCFFA9A9F3C2C2FF6B6BCC5252C2D273739999DAC28888F329298888DA9999EB E3E3FF8888EBA9A9EBF3F3FFD2D2FFF7B796FC949005E770C2F0F4F7B82899EB 94F741F7FC9490F7B84E6D892D05E770C2F118F7B77BF741F7FC949003EE8803 D600F713EE00016FF7A2E3007DF1C2F164000FF8DF0008402004F7A3A0C40000 1F200C000FF8000000C4000CC40000DF0008000000F713E22A001EC4000CDEFD 30C2F18CF7A10E03EE8803D60000000305E00FC2F1A800E44A05E0F8000032F7 B9C59A3DEC000030001DE803B600C2F1E000CD7C00000900CD5C000000FF92D0 05E10005E17003B600C2F20400CD7CC2F21000F56A033238FFFFFFC2F2780010 260000300021F9000028FF92D0601232FF94D0FF92A005E100F432F805E100C2 F22C66E8880000006021D3FF92D0F432F805E100C2F26C66E94B00000060D91D>]endobj 76 0 obj <>stream xœí} Oi–¶s1Ónó!H ‚Âf0IX&|&\‡5Ù| .FÁËe@_˜ F€Âm#I‡ÉÆÍF ¼?tÏ9ï¥Þ*@fâäö‚ Æ—AçbSHôïÝœiñ×­ôÆ |E ã‹`c±ªw ~~^±Iäo*ô%1Œ/+óŒÕû'6+6Áö³ò3ßBÁxo¨xÌïŸh‘¿B_ƒÁøhÙXœ{2PÜ]ï÷û»Aø¹«ÁøFp3¸Ÿ u‡zçªxƒñm`3Ä¡ýÅÐB¡¹3…¾ ƒñ…н±ØTõ$„xRÅÓúŒoþ`0^UÕ47×gî3ßî÷nãKñÅ•_ }) ãËâ—¿ßߢ©½×Â`0 ˆë}…¾ƒQT³ø3ß(n3ûŒoÑB_ƒÁ( b· } £0ˆ²ñg0¾MDÙø3ß&˜ü Æ7ŠëìûŒooXúŒoi&?ƒñ­àæó ¿_/äã®ü­µ_ð‚~ëë…¾ã7Ÿ·øWz—:7®|×ùžÔëFþÉ|_ôÒÎÇZÏwTè‹`0þA1S/‰òW6®t^¹Ò Mþëyä_?ðùþ—?× —Âäg0.‰ûÀxã †zõn,Zm;{­Ñ÷ïÿ[È¿ñù²L~ãÒ~'(Ÿ¯P °”?=4NÍ=óù’¨¶]¸Nî–ŠkI2ùŒKÂOt¯j©ðw^¿¡üѨ1©¿•ˆbë»V€ë´aý\^ +?ƒqiÜDÅ‚G3”ñ9¿Yï›üA2ß—ÌØö?˜Ïd“Ù$\+?ƒñˆåïÓÑXçw6å¯Öä§:!YhåÏmõ3@~V~ãó0°Ñ¹!Ž&déO+4:(^S…6‹;Tþ7…¸VDi&›Aîù³>îçg0. g°Sµl!@“äÔÂ/Ò}‚ü€ú@ÿd6+²V~㲘Yê\zNGcADgç†$ÿmÝÑ×*óý¬(ùÔögüÙ üŒÏÅÍÅ`pf—‚ ý@AþÃh4-ϱ+a ~D~¬øù²lûŒÏBïÒâRh³Â_ BÀ Èo ?)¿¦~mf¹ŸM²íg0>þÅx|1¾ø!þ!aø$òGÑ}¨üY‹ý…·ýÄþ$Û~ã³P¬ÿP¯Š ,Å—üףј>¥Õ&üÙB“?+J~äüïòZŒlܯB4‰†ô_ôÓL~cX¿™óg}ÉÆ|ãÚèëöð~*mwwyxïã×p:üëÙY8ŽÐgÚÏú_{jFTüPù“IV~ã3ðóœDÕñ c|Ï|¾?(É—ìÅæøº½©ðþ~d?Lã^ ¯6œÏeÀéò*œFàùRûíkÎó¦J!ßÇFôïÉRw]l\øc0.ŒÇOû逹/GõËQ}IÓö'³è¼3™Tþ—­½ìÚOõS¤û€×ÀíÝÿ>ïçOV‡VOV"«4æá“?^:,ÃÔ¸`þ¸èë“I¿;ãâ(Ö?é}ÒÛ;ÛÜ\SÕDLíóŠQ}¶j?xnâþxžòçºà>)ŒJt&ú¯6ä\|xHpÿ%Š?6éýáKöSvFùýã2é—}D8bò3—¿7ê õÂz‚ìŸû'£Øgé½:H’éGÔ8¾ho>±OÔßGþ*âõONVON]~ûס“!|t?ŒÊOQƒØIì›ç"ùÉ÷Ó ¿lR;òñãRh …B+ÐBž„zç~3 ýF²o R(¿Ãö¯ãß—ôO¡‚£éôzƒ¾çgþ£C#'CC@þW-å—ÒI$Ì€AäÏ’ñÏR¹ß¢>+?ƒqÜX‘Qèý-–Óoúœ@Ê÷3™yÛ×ìu%ÒôƒòHÈW¥ò¯"ÅÚ:424´{‚äÔ틤63¾ùµðgù…+ö2Œ‹âþ€ÄÊÊñÿ/­7¶™õ¾,ÖÝl9n^Ⱦþyð°HãWQ×ÑÞíæì¿ündhw„„ÿääDÿ0±¬? ?|á²uvƒ~Ó÷[®„•ŸÁ¸8~(¦FüýÿÆ›NÛïÓõ>‡ò¿ÝGîKáO…SaUëá‚ ŒüjûáW#€¡]Š (þ»ïÎPýQù÷¥ö'ö­Ó…ògÇůÓ0ëêXùŒ‹ãfw1Bñ`eÓxÓÅô'E_ßxÖ$s‚È¿¿Of=œŠDVwÏ^*ú½GvGFliÿè±DP_†½³U•õ§(–XÒß  ~Ö0V~ãsð˜È?V,B¿ÅxÓ-çÝüY[Á¯Qr;ùQ¶w‰æ¹_¥ðCÊOLkþð[úÓ‰ ÿOê¯Ã`üçUo_"ѧËj–Ä_¬èa]+?ƒqq<öuwûíÊŸWíOf{¨ânöóß½Šäߗ‰h½>¢Z?æûCÄSú‡FýÉõ[oìb¹ÈIääe¿êÓ0®ËýjjU‹`åg0.·€äÿ@…ñ^žîõ³Rû Û?Ü¿ M°×zg;ù‡PÞIù²ÞÙCê¿Bã?tbô…_î6ŒöŸ:û¦ˆúBû1Ð"ž¬ü ÆgÀß]è®Gþ#û7'´›å>_6LÿÞÕ« I}ª÷åŒ÷ND±ì=ÁzãT ?ÕûOÞ}âÅjî ågÅg0.çâ›þz’ÿâ çZ åÙÏ¿Qgâ*¥ü²à×`¾Òä¦b?°ý­¥ð¹·Èþ·ôŽóý„é´˜‡œØ×ƒ¦Ÿ'ô0Ÿ¿±¼¿ ù³¦ïÏŸÏ?ÂÒ/¹i6ß;¥þ!)ü#µÞQÊ/»úWëg££Ín£€ Èr¿˜Ù“dåg0>é3Ù_ßíF~£“?ébûß_¥”_VüÃ~¥ò á7ëýôRÒÿDŒðÇ©½‘ðnÿiUc|Øö3Ÿ‹XßðþŸ-úÍ8O±­á—Í_Ìc„_Ò?’Ûß=#é—"ÿÖHúÿ›Ê}¤üb€¿œÜüO¥vïæ\/7#†øeiF?Oèa0.ëÑ´wÂoÙŸ¯üz4 ÖûòÉß|ÕÈù#‘HûIûnûî¶³wgTî“Å~hVfŸÃ”_)ÿÍ ¾4-(Ùop+ŒÓ¼½€/“ŸÁ¸q±®–– „fÿŒó,Û~.ä§^þ„®ö›Ëøà„>Tþ!9Êgä­Áè¿êœ_ð%åËñ½)ç„~‚ZɇÆösÎÏ`\bîîf ÂbÿŒó´‘¿áêUQï¾GçÍÓ}ò“!1ÆG)¿9ÌÇÈù‡TÒ/föÐJ@ûûgy—lüàjšóN`0‡\¤s`ÐßüY‹û.ýüS ´ýªÚŸ@ÛNÚ/çõœ¨‚ñß\ÐkïJùMåˆ~`üö^C„îê˰ò3—…Z¤³bsSð_°¿þ†óDSùÝ ~ V¹’~þ”X¿/,øIåG¡·­æ·÷VŒÔ·ôÐËy8Ù­”?Ë9?ƒqY(î?ž©ûÏU~Ëõ»ÙþI³Ú/&öÐ^±Ž‡˜²«¤ß¾”gî?‡dÊ¿z"‚)D(?.äçø­ŒZÊGäülûŒ ã0z]ùgff*Èúûgœ§ZÕ~*÷çð›Õ~k”ϼ´ý‘°š×£êýNò{½§ÿI¿Ö}±–Ìùû Ǩ}]ìϰò3—BßmuWŽŸgfn û+Ðø»“ß>³'o„_s¾ò‹¥|(é²ÿ<ò{ñž# ü/UüHøi^ŸsÔÀ¸X»;ÃÕ~ã’°îÁûóù'>Jþlþ:E??P_Tûç§§kÐöâpÎõœ¿;‘®^ÌçO!õ÷‰œíùÊß®gõ‘úæÊ{©ˆUïK$–moÊÛu‰A>¬ü ÆE¡ïŸ®æÆïåüëæb^Ùd&ï뎤í—+ùØjt¹ß£»wz:<üÓÙÙªÉâZ¾“ï†ï´/ù›‘KyHåŸü¤ÿ\ƒ!q]õñ#€ø7ˆûçVû¬•2if ꃜu ñ“S{‘ý~ãûXÆ;ûixô•}a®W¿þôŽº÷iBϪ¹’O¿Èùé ¯:rþ.P~ZFL(¿ìyàî~ãÓPm¸þDz§]ÿ„ë¿ucJ/®Ü]:utw»+c¸ûVáûåœÞýˆõVƒ^»ŸîÌ1¢~{ÿðoâ^]«ÏDÂäÏÙ®¥±Tß±'‰~¤±}ª6yð·øWa0¾ÜÖwáõz®æ›ÂŸ?¯Ù6+í=Xt›²ÎÈIòÓHŸÈ~*%Ù¿&‡í…Qßi!ÏœúÈ«= Ÿ`Ý‘{]?Ú~rýÖÚÝ„F½x¯yûàäßè†ÁøÊÑ­¶Rþ_**Ôð^Êøëýÿ7ï>›ôc;ÊïkãŒvs˜ÎÇ 7Œö¾”ÔÇÁ{â†\Æ*^'CrmO9£'<šÃ?ï5¤tOÖûS{ÚEO_FŒñÑø[þó0_/Ž>ïÍŠMIý‰s¦ôz3ö™=”rÛoו벆øÒŒ~q“nû}ºWmkôâÊž«òîÜrdßnûnX ðÙÜ/áè7œ”Â/”_oÓã«EµYïÚcÓsúüÝ3y¨±I?òÍ·mÎÍ‘îí£Ûõí«™}4Ä_êÿÉIÎøDîäÄä¾ÝgõóEð wíWâmÜÇ‘ý>¾cƒqA˜äÿ¹¥E®å1¡–ñšÉûÀ¤©üú>½öþþvYò»º/²~âp8bQ(n/Üë„_Ýw>¢—ñÀé¼h$rÎk—Âï3oÒËýý Æ'!jÿ—‰–‰½ŠW½¿¾Û…ü9Û=»ô}zí'Í'(ë$ôr>á”pþ’ú«Î¹w«Öd¾°^ÄCÌé‘ý|ùƒZ³êf]jØnÜßÏ`| ¢FOß ÿ6Å}¼oOÞžŽå<|IºQ¯“ü¹°ãK¦ù}b–®S÷»V¾§¤ÂÒò§h= ü®¿æ}Ä»7žµ:ú4Ú?÷ß„Áø&`*ÿ¦céÞn—›vÞ›Ê/´?›qŽá?KÐðþ«2éW{åb~n#ýÞ™sø#j6_Šfó%ö#®“&3bÙn›i½ü¿ƒñ á¶EþÇzÝîz¡ûn·ëäžÔ÷ɂ޸º£ÒËôòNÝ)¹œW$üSÎõRŽ„á§•»ÂF­…?õNy±Ž‡-áQ> ƧÀPþ›@yâ=4y«¾üu"r]û‘üI`¿Ë Úá”è—Py?!Ü;÷bFOÔŠ½ÒóGhh_äìü¹“ìp°i?“ŸÁøD«£êf-HzÁüzy—î7åÕd²–öÌ¿vP:ÚŽºäO…çwï~däýéðÙ‰òü4¶/uÒ_°aªÖ”ýÄñòƒß?ŸÁ`bzxïc}{nIý±âWå>>::ZoþØŒýWk¯ÖÄj>Ÿ|Qê§á½Â\^Î'žÎ`0ƒQq·¯÷—n…1BqñÀÀÊïŸÁ`üCã ø~q´9f˜Ügò3_/¢Ñè!î×kæ÷WZ }y ãï…ê¨XÊç9¾˜hOªÜ…˜ü ÆW‹¾¨ä7t/–¢~Áäg0¾^û¯{½cHxE|IýÞ¹‰B_ƒÁø»!Åš_Eh%´‚¬³/˜êí›cåg0¾b ‚ôGBÈþf>P¸ÏÊÏ`|ÕÀ¬ÿ@wÚˆø`ø‘úMMþB_ƒÁø{¥ÿ7ú^¤}¯Ð|ä~0(ˆÇk  Ø`D‡öí×­ØÚ·Û[U;/$`4 ‡ý1íÙ÷hýÿÄÿm1¸ º¿|'€þz«îá`90>FB=»S‚ìóîÌvô:hØp%FŠ’ÙXÚOe-#¯C;à-¸³0ˆ~¿£Ž–¯ë0Ïi[hÃìÂû¢Òƒ!¡­r– ±J¢}Y]ú‚­…E”Q<ž‹åü–æ›Òo ì™MÐ<½G> }®öŸ>85èoñœ8ß¼ö Ù­h¿$‡‡ØÐ¬K7 Žá@÷©MXE÷#hÃJûG%ñiwËlŠñ¸5yKcRøIý~;é—÷‘ößOM‚ðO~?e6EðÈ{`?6ê#í[‘îÛí†%  6¤=vÏZ%ÿéÙ >0_qý˜žk„-˜·”ŸœB#n©šFxn´¸ßˆÜo´´ß&þëkmD×Ú ŽDÄGšÙáàGhHtr?RC¼/ŦP|—dÇnÄthÁ}â|¾ê)U„—ÜïÁ嬀ö¸¨º‚,nÂøp‡/ðöZ´è…XçÒ"ÿÅÅ¥xü7,ûýWÓ"ÙýÅÅà´ ù©Âm«{8‹‘òw$?p\áNݬ`{Ñ2à¡é‚ž:.£W]ûï -ðUvà7¥á é“uóœ’_Í=ôõÓ 1V½;++ñ¯áÃø±jØÅ.B}—(3viÒ~öôþÁyÚo×} þÞšMøÅ4gü›=pŠ?i¿Hš…ðÛÄŸ( •²¥ûÃnÀÝ~up«ßˆyªßO´¿µ,èkR‡bÿÔÔ䔡ü¦P1`Usaý¿ßކ͖´£êߤð‹½]÷Qõå^„€VKôÿÏ5ØTN`—}|Týy¢;<”ú7ZÍzì'í·YýÒ5°é>„‚kZ÷1àëT@(ÿÔý§OÇŸ"åi/--5%ßd$  ‚~´ÿúÔ”ð‹-ké?ŸêÿúǽKAäz$þŽþöaì>¼ ;ƒ6ò— ¦nÕŸ1⸠‘gyžö*ëLò×S…š;•m·­c«Þh¥çE>ùÓm•Èö¨`;üNG”XN¢m–ªJ ñ³fÁàSèoùý\^[ÚEûÅÞ]û ö›ªoj¿®4ÛËk¦ò?²ë¾Ò~Cù×µÝ?’H?,µ_‰¿Cûï’ðdXÖz/›¤~¿aü%ó—…ç—Ú?)ÔßÔ} (÷ úÀý)Ãú;tÉßÞJÛ¶!üZ÷Û¡µ¶Ãó±6Rú•ë—–_ÿXk¿|¨ÂÀ<ÑÞR~“þ û5]`ìÊoñ^»WíWºÄ¿&ŒÿS²ü:ï?Ê/Ô_˜~|HÖKá—q€èýC)Ñ^k¿f¿”~8øAZ±vµd~’¨/´ö —Ÿ•¼'êÓß²šüõÀsäz0ø¯ÿGûýñ½Øè„f#êô½Ù鯄ò{ªù%ëbH¢K ò÷É¿Ùu\uü-²ÇŠ®ÏzòÈß7}{‡¾IüŠ·dzº#`½”D¼úð½@삾ߌ.Å?þ¼"à=öÎ×þ½SS÷Úß,ÙeßEù­ò_3é¾~<Àl)¿®Ú]­ûÃ:ëwhÿ­~Cùïjí_6ó}ñ÷kí—•ïʯ´_Å€×È{tû–÷ÝŸ²åû¢¡÷Ý*”¿µÝ,á[[-ÁoÕOZûI÷üHÿg†æ«ä=¥ü˜üká×A e…€®FWt5v]k¼ÖUÛu­ËUûµî“í¿&…_Š>=¿Mè?E’~ÓúK`©öãš÷ãvíÏëïùAi&©š¢¿ÔþŒÖ~"¾Èõ³Û X ±òG4ÿÑ¿,mtv¯t^±‘ŸJóŽ-¨¬M“Á®ö´íx0 zh7íÑl‘ßëé»;1›'­óp£Eõ‹Ù<òÇ*ËËMò{^D©œ¯È§:–Æ«óP ©óô]LùÍBŸ“úJûEÕ/m¯ùS;GûAùO䷴ߪó­iöËðHª¿¡ÿGÍ–ö7«¼_è¾,õ©@0_i¿æ¿%ýH}þ»†õy¿~Ò}§òkö[¼'íŸt~Ù€1€lD€©ísŠ}ÛDúvÊûÛ-í?&ío•vÍ¿`¾!ýó¸ÕKÅ—ûg¦öÏ+áGç¯6Óù§„ô7Ú­€Úk°á£K‰¿Mû­Œ™MýI÷§ïÔíéSÅþ[ѯÔHdª?Žâ/ÆõÇ•ç_ú„Û·©D⟥[júä--Í‚ßãP'ð|ã xüà*þŸ¢èþ£þËÿÿ°ñ ºïknm"}O“òƒ°W")Óƒ“-$#ïê<1'ùït”‹à±Yzñf]™†(ìÚòÈuJÛeRoYâ xÚðc垎 uõÙ‚€KÏŸ—”ß)þB÷õ]´ß©ûμÿ•tkpdïÌKüåi¿Ðÿõ#;ý…0µßVï7´_øÿ~³âÒ¯u_)¿ ·–ÏÑþ)ËX1à{¡ý´ÕñÚöŸ„[$þöÎ@$;Ðÿeë±ØTõï™,ø¡òߟKñŸ¯12~É|!ùêXûS5–æKÆ+÷/F¨íïß…´wA+hç/»~|o6Jd’þ÷¥FÞ/CÀ¸¦©©û¢Ê/{þ¤ ûb‹¼3¬Tÿ¬ ½Èû…óÏêq×¹•.@ü?ß²qeãÊ•ÎNÜÑ3Ä‚¥ùcuTàv´Z÷»‰ìÚã½#l¬ˆXX$U˜̦¤Ü´ý^ÙùîU¹|ò£“Ç‚ßV>ùÛ:›–Ah:0h¼„ÏâW÷Űᢠûí!À .Í=çGíß;gðO>ý8JþÍkhûÖ_Ëÿš~›ö«´ÝMùlõþa©ûŽa?*Õ¿%^P@‰ÿ¤j’úùÚ?µl)ÿ¤*øOé^?5ö=?Ù}cô=(Û/ˆ/°-+ôLº/©ÿRåüÊjŽçIúíŸÊ/çµù¯‘Ù¾­æ§´^°¿F¿@î×BÂÔ'þ»û±èÿãÁ5£äoÚcèÏ{½·[YúÏH¿/[©æ½Ùß/¸}~=¢¨€LþÅÞÒ~!öº»ÏVðc˜’ïJû´-íÇç´QíÏÙ´_qÝÅø“'x`y¿ÃøËœ_ê>>ÖuÙïÐ…ß>pØÔKû‡UÍßÈûupKÕþßAøûoYù¾Nío˜4h?)Šþ“†ðË1>$ýTó±À>þOdþdÿ[·[e ÀìÓ. ~/)÷©„_Sÿeÿ ÿŠþRþíÊߨò~Êú)é@•üæÍ í>\#×ßEY?…gÚoØ~=ÔGþM²_û\¤ýOu¹ÏðýôœQIáû5ý3Õá×#R~â;²_åüTû3 R¤ü¢»O0ßÇ÷±wEîñ7µÏÒþ:ówjÿš«ö»´WfÞoô£@Ð,¿ììü_äû‚þ„ñu‡ö÷ëš¿‘÷[)¿½Ãó}cدCÿyÿ”îó³úù•ù—%ÿ)ìé{=eËù ío•UÿV™ðËÑ>ªòGy»RûgÇVŸŽç­¿Çbä¯ÕõW£³ÿFÕÝ'Jïßj÷Iþ‰÷Ž´ëý.ôWÂ/ºûóéo9Ô~‹ýV©Ÿ^«:¿òšû2ûÏHÐ#¶¬ä~ÖªøgDÕ¯ÇR~à'ºûðQhž1 ƒÁ`0 ƒÁ`0 ƒÁø\üƒÔ endstream endobj 78 0 obj <> endobj 79 0 obj <> endobj 80 0 obj <> endobj 85 0 obj [/Indexed /DeviceRGB 255 <000000FF00006B6BD2FFFFFF666666FF66667B7B7B6666C24A4AB96B6B6B4242 B1F30000FF9090B1B1DA888888737373B1A1A1FFB1B1CC6B6B181818FF33337B 7BCC6666B9E33333B9B9B99090D2DADADA8888CCB98888FFC2C2424242E37B7B FFE3E3DA9999FF1818FF7B7BEB2121B1B1EBFF4A4A8080D2C2C2E3A9A9A93333 33F33333D252529090E3DADAF3CCCCEBEB1818FFA1A1999999A1A1DAB99090FF D2D2525252EBA9A98080E3A1A1E3EBEBF3080808FF08087B7BD2FF73737373C2 5A5AB9B1B1B1292929FF4242E34242C2C2C2E3E3E3DADAEBF38888FFF3F3EB90 90FF2929FF8888C2C2EBB1B1F3FF5A5AD2D2D2EB4242E34A4A9999F3CCCCF3A1 A1F3C2C2F37373D2FF6B6B8080806B6BC26666CC5252B94A4AB1FF9999B9B9E3 B1B1E3909090B1A9A9FFB9B9D26B6BCC7373212121FF39398080CCE339399999 D29090DAC28080FFCCCC4A4A4AE38080FFEBEBFF2121FF8080F32121B9B9EBFF 52528888D28080DA393939DA4A4A9999E39090EBE3E3F3DADAFFD2D2EBF31010 FFA9A9A1A1A1A9A9DAB99999FFDADA5A5A5A8888E3A9A9E3A1A1EBF3F3F3EBEB FF101010FF10107B7BDA7373CC5A5AC2CCCCCCEBEBEBB9B9F3B1B1FFD2D2F3CC CCFFA9A9F3C2C2FF6B6BCC5252C2D273739999DAC28888F329298888DA9999EB E3E3FF8888EBA9A9EBF3F3FFD2D2FFF7B796FC949005E770C2F0F4F7B82899EB 94F741F7FC9490F7B84E6D892D05E770C2F118F7B77BF741F7FC949003EE8803 D600F713EE00016FF7A2E3007DF1C2F164000FF8DF0008402004F7A3A0C40000 1F200C000FF8000000C4000CC40000DF0008000000F713E22A001EC4000CDEFD 30C2F18CF7A10E03EE8803D60000000305E00FC2F1A800E44A05E0F8000032F7 B9C59A3DEC000030001DE803B600C2F1E000CD7C00000900CD5C000000FF92D0 05E10005E17003B600C2F20400CD7CC2F21000F56A033238FFFFFFC2F2780010 260000300021F9000028FF92D0601232FF94D0FF92A005E100F432F805E100C2 F22C66E8880000006021D3FF92D0F432F805E100C2F26C66E94B00000060D91D>]endobj 84 0 obj <>stream xœí} Oi–¶s1Ónó!H ‚Âf0IX&|&\‡5Ù| .FÁËe@_˜ F€Âm#I‡ÉÆÍF ¼?tÏ9ï¥Þ*@fâäö‚ Æ—AçbSHôïÝœiñ×­ôÆ |E ã‹`c±ªw ~~^±Iäo*ô%1Œ/+óŒÕû'6+6Áö³ò3ßBÁxo¨xÌïŸh‘¿B_ƒÁøhÙXœ{2PÜ]ï÷û»Aø¹«ÁøFp3¸Ÿ u‡zçªxƒñm`3Ä¡ýÅÐB¡¹3…¾ ƒñ…н±ØTõ$„xRÅÓúŒoþ`0^UÕ47×gî3ßî÷nãKñÅ•_ }) ãËâ—¿ßߢ©½×Â`0 ˆë}…¾ƒQT³ø3ß(n3ûŒoÑB_ƒÁ( b· } £0ˆ²ñg0¾MDÙø3ß&˜ü Æ7ŠëìûŒooXúŒoi&?ƒñ­àæó ¿_/äã®ü­µ_ð‚~ëë…¾ã7Ÿ·øWz—:7®|×ùžÔëFþÉ|_ôÒÎÇZÏwTè‹`0þA1S/‰òW6®t^¹Ò Mþëyä_?ðùþ—?× —Âäg0.‰ûÀxã †zõn,Zm;{­Ñ÷ïÿ[È¿ñù²L~ãÒ~'(Ÿ¯P °”?=4NÍ=óù’¨¶]¸Nî–ŠkI2ùŒKÂOt¯j©ðw^¿¡üѨ1©¿•ˆbë»V€ë´aý\^ +?ƒqiÜDÅ‚G3”ñ9¿Yï›üA2ß—ÌØö?˜Ïd“Ù$\+?ƒñˆåïÓÑXçw6å¯Öä§:!YhåÏmõ3@~V~ãó0°Ñ¹!Ž&déO+4:(^S…6‹;Tþ7…¸VDi&›Aîù³>îçg0. g°Sµl!@“äÔÂ/Ò}‚ü€ú@ÿd6+²V~㲘Yê\zNGcADgç†$ÿmÝÑ×*óý¬(ùÔögüÙ üŒÏÅÍÅ`pf—‚ ý@AþÃh4-ϱ+a ~D~¬øù²lûŒÏBïÒâRh³Â_ BÀ Èo ?)¿¦~mf¹ŸM²íg0>þÅx|1¾ø!þ!aø$òGÑ}¨üY‹ý…·ýÄþ$Û~ã³P¬ÿP¯Š ,Å—üףј>¥Õ&üÙB“?+J~äüïòZŒlܯB4‰†ô_ôÓL~cX¿™óg}ÉÆ|ãÚèëöð~*mwwyxïã×p:üëÙY8ŽÐgÚÏú_{jFTüPù“IV~ã3ðóœDÕñ c|Ï|¾?(É—ìÅæøº½©ðþ~d?Lã^ ¯6œÏeÀéò*œFàùRûíkÎó¦J!ßÇFôïÉRw]l\øc0.ŒÇOû逹/GõËQ}IÓö'³è¼3™Tþ—­½ìÚOõS¤û€×ÀíÝÿ>ïçOV‡VOV"«4æá“?^:,ÃÔ¸`þ¸èë“I¿;ãâ(Ö?é}ÒÛ;ÛÜ\SÕDLíóŠQ}¶j?xnâþxžòçºà>)ŒJt&ú¯6ä\|xHpÿ%Š?6éýáKöSvFùýã2é—}D8bò3—¿7ê õÂz‚ìŸû'£Øgé½:H’éGÔ8¾ho>±OÔßGþ*âõONVON]~ûס“!|t?ŒÊOQƒØIì›ç"ùÉ÷Ó ¿lR;òñãRh …B+ÐBž„zç~3 ýF²o R(¿Ãö¯ãß—ôO¡‚£éôzƒ¾çgþ£C#'CC@þW-å—ÒI$Ì€AäÏ’ñÏR¹ß¢>+?ƒqÜX‘Qèý-–Óoúœ@Ê÷3™yÛ×ìu%ÒôƒòHÈW¥ò¯"ÅÚ:424´{‚äÔ틤63¾ùµðgù…+ö2Œ‹âþ€ÄÊÊñÿ/­7¶™õ¾,ÖÝl9n^Ⱦþyð°HãWQ×ÑÞíæì¿ündhw„„ÿääDÿ0±¬? ?|á²uvƒ~Ó÷[®„•ŸÁ¸8~(¦FüýÿÆ›NÛïÓõ>‡ò¿ÝGîKáO…SaUëá‚ ŒüjûáW#€¡]Š (þ»ïÎPýQù÷¥ö'ö­Ó…ògÇůÓ0ëêXùŒ‹ãfw1Bñ`eÓxÓÅô'E_ßxÖ$s‚È¿¿Of=œŠDVwÏ^*ú½GvGFliÿè±DP_†½³U•õ§(–XÒß  ~Ö0V~ãsð˜È?V,B¿ÅxÓ-çÝüY[Á¯Qr;ùQ¶w‰æ¹_¥ðCÊOLkþð[úÓ‰ ÿOê¯Ã`üçUo_"ѧËj–Ä_¬èa]+?ƒqq<öuwûíÊŸWíOf{¨ânöóß½Šäߗ‰h½>¢Z?æûCÄSú‡FýÉõ[oìb¹ÈIääe¿êÓ0®ËýjjU‹`åg0.·€äÿ@…ñ^žîõ³Rû Û?Ü¿ M°×zg;ù‡PÞIù²ÞÙCê¿Bã?tbô…_î6ŒöŸ:û¦ˆúBû1Ð"ž¬ü ÆgÀß]è®Gþ#û7'´›å>_6LÿÞÕ« I}ª÷åŒ÷ND±ì=ÁzãT ?ÕûOÞ}âÅjî ågÅg0.çâ›þz’ÿâ çZ åÙÏ¿Qgâ*¥ü²à×`¾Òä¦b?°ý­¥ð¹·Èþ·ôŽóý„é´˜‡œØ×ƒ¦Ÿ'ô0Ÿ¿±¼¿ ù³¦ïÏŸÏ?ÂÒ/¹i6ß;¥þ!)ü#µÞQÊ/»úWëg££Ín£€ Èr¿˜Ù“dåg0>é3Ù_ßíF~£“?ébûß_¥”_VüÃ~¥ò á7ëýôRÒÿDŒðÇ©½‘ðnÿiUc|Øö3Ÿ‹XßðþŸ-úÍ8O±­á—Í_Ìc„_Ò?’Ûß=#é—"ÿÖHúÿ›Ê}¤üb€¿œÜüO¥vïæ\/7#†øeiF?Oèa0.ëÑ´wÂoÙŸ¯üz4 ÖûòÉß|ÕÈù#‘HûIûnûî¶³wgTî“Å~hVfŸÃ”_)ÿÍ ¾4-(Ùop+ŒÓ¼½€/“ŸÁ¸q±®–– „fÿŒó,Û~.ä§^þ„®ö›Ëøà„>Tþ!9Êgä­Áè¿êœ_ð%åËñ½)ç„~‚ZɇÆösÎÏ`\bîîf ÂbÿŒó´‘¿áêUQï¾GçÍÓ}ò“!1ÆG)¿9ÌÇÈù‡TÒ/föÐJ@ûûgy—lüàjšóN`0‡\¤s`ÐßüY‹û.ýüS ´ýªÚŸ@ÛNÚ/çõœ¨‚ñß\ÐkïJùMåˆ~`üö^C„îê˰ò3—…Z¤³bsSð_°¿þ†óDSùÝ ~ V¹’~þ”X¿/,øIåG¡·­æ·÷VŒÔ·ôÐËy8Ù­”?Ë9?ƒqY(î?ž©ûÏU~Ëõ»ÙþI³Ú/&öÐ^±Ž‡˜²«¤ß¾”gî?‡dÊ¿z"‚)D(?.äçø­ŒZÊGäülûŒ ã0z]ùgff*Èúûgœ§ZÕ~*÷çð›Õ~k”ϼ´ý‘°š×£êýNò{½§ÿI¿Ö}±–Ìùû Ǩ}]ìϰò3—BßmuWŽŸgfn û+Ðø»“ß>³'o„_s¾ò‹¥|(é²ÿ<ò{ñž# ü/UüHøi^ŸsÔÀ¸X»;ÃÕ~ã’°îÁûóù'>Jþlþ:E??P_Tûç§§kÐöâpÎõœ¿;‘®^ÌçO!õ÷‰œíùÊß®gõ‘úæÊ{©ˆUïK$–moÊÛu‰A>¬ü ÆE¡ïŸ®æÆïåüëæb^Ùd&ï뎤í—+ùØjt¹ß£»wz:<üÓÙÙªÉâZ¾“ï†ï´/ù›‘KyHåŸü¤ÿ\ƒ!q]õñ#€ø7ˆûçVû¬•2if ꃜu ñ“S{‘ý~ãûXÆ;ûixô•}a®W¿þôŽº÷iBϪ¹’O¿Èùé ¯:rþ.P~ZFL(¿ìyàî~ãÓPm¸þDz§]ÿ„ë¿ucJ/®Ü]:utw»+c¸ûVáûåœÞýˆõVƒ^»ŸîÌ1¢~{ÿðoâ^]«ÏDÂäÏÙ®¥±Tß±'‰~¤±}ª6yð·øWa0¾ÜÖwáõz®æ›ÂŸ?¯Ù6+í=Xt›²ÎÈIòÓHŸÈ~*%Ù¿&‡í…Qßi!ÏœúÈ«= Ÿ`Ý‘{]?Ú~rýÖÚÝ„F½x¯yûàäßè†ÁøÊÑ­¶Rþ_**Ôð^Êøëýÿ7ï>›ôc;ÊïkãŒvs˜ÎÇ 7Œö¾”ÔÇÁ{â†\Æ*^'CrmO9£'<šÃ?ï5¤tOÖûS{ÚEO_FŒñÑø[þó0_/Ž>ïÍŠMIý‰s¦ôz3ö™=”rÛoו벆øÒŒ~q“nû}ºWmkôâÊž«òîÜrdßnûnX ðÙÜ/áè7œ”Â/”_oÓã«EµYïÚcÓsúüÝ3y¨±I?òÍ·mÎÍ‘îí£Ûõí«™}4Ä_êÿÉIÎøDîäÄä¾ÝgõóEð wíWâmÜÇ‘ý>¾cƒqA˜äÿ¹¥E®å1¡–ñšÉûÀ¤©üú>½öþþvYò»º/²~âp8bQ(n/Üë„_Ýw>¢—ñÀé¼h$rÎk—Âï3oÒËýý Æ'!jÿ—‰–‰½ŠW½¿¾Û…ü9Û=»ô}zí'Í'(ë$ôr>á”pþ’ú«Î¹w«Öd¾°^ÄCÌé‘ý|ùƒZ³êf]jØnÜßÏ`| ¢FOß ÿ6Å}¼oOÞžŽå<|IºQ¯“ü¹°ãK¦ù}b–®S÷»V¾§¤ÂÒò§h= ü®¿æ}Ä»7žµ:ú4Ú?÷ß„Áø&`*ÿ¦céÞn—›vÞ›Ê/´?›qŽá?KÐðþ«2éW{åb~n#ýÞ™sø#j6_Šfó%ö#®“&3bÙn›i½ü¿ƒñ á¶EþÇzÝîz¡ûn·ëäžÔ÷ɂ޸º£ÒËôòNÝ)¹œW$üSÎõRŽ„á§•»ÂF­…?õNy±Ž‡-áQ> ƧÀPþ›@yâ=4y«¾üu"r]û‘üI`¿Ë Úá”è—Py?!Ü;÷bFOÔŠ½ÒóGhh_äìü¹“ìp°i?“ŸÁøD«£êf-HzÁüzy—î7åÕd²–öÌ¿vP:ÚŽºäO…çwï~däýéðÙ‰òü4¶/uÒ_°aªÖ”ýÄñòƒß?ŸÁ`bzxïc}{nIý±âWå>>::ZoþØŒýWk¯ÖÄj>Ÿ|Qê§á½Â\^Î'žÎ`0ƒQq·¯÷—n…1BqñÀÀÊïŸÁ`üCã ø~q´9f˜Ügò3_/¢Ñè!î×kæ÷WZ }y ãï…ê¨XÊç9¾˜hOªÜ…˜ü ÆW‹¾¨ä7t/–¢~Áäg0¾^û¯{½cHxE|IýÞ¹‰B_ƒÁø»!Åš_Eh%´‚¬³/˜êí›cåg0¾b ‚ôGBÈþf>P¸ÏÊÏ`|ÕÀ¬ÿ@wÚˆø`ø‘úMMþB_ƒÁø{¥ÿ7ú^¤}¯Ð|ä~0(ˆÇk  Ø`D‡öí×­ØÚ·Û[U;/$`4 ‡ý1íÙ÷hýÿÄÿm1¸ º¿|'€þz«îá`90>FB=»S‚ìóîÌvô:hØp%FŠ’ÙXÚOe-#¯C;à-¸³0ˆ~¿£Ž–¯ë0Ïi[hÃìÂû¢Òƒ!¡­r– ±J¢}Y]ú‚­…E”Q<ž‹åü–æ›Òo ì™MÐ<½G> }®öŸ>85èoñœ8ß¼ö Ù­h¿$‡‡ØÐ¬K7 Žá@÷©MXE÷#hÃJûG%ñiwËlŠñ¸5yKcRøIý~;é—÷‘ößOM‚ðO~?e6EðÈ{`?6ê#í[‘îÛí†%  6¤=vÏZ%ÿéÙ >0_qý˜žk„-˜·”ŸœB#n©šFxn´¸ßˆÜo´´ß&þëkmD×Ú ŽDÄGšÙáàGhHtr?RC¼/ŦP|—dÇnÄthÁ}â|¾ê)U„—ÜïÁ嬀ö¸¨º‚,nÂøp‡/ðöZ´è…XçÒ"ÿÅÅ¥xü7,ûýWÓ"ÙýÅÅà´ ù©Âm«{8‹‘òw$?p\áNݬ`{Ñ2à¡é‚ž:.£W]ûï -ðUvà7¥á é“uóœ’_Í=ôõÓ 1V½;++ñ¯áÃø±jØÅ.B}—(3viÒ~öôþÁyÚo×} þÞšMøÅ4gü›=pŠ?i¿Hš…ðÛÄŸ( •²¥ûÃnÀÝ~up«ßˆyªßO´¿µ,èkR‡bÿÔÔ䔡ü¦P1`Usaý¿ßކ͖´£êߤð‹½]÷Qõå^„€VKôÿÏ5ØTN`—}|Týy¢;<”ú7ZÍzì'í·YýÒ5°é>„‚kZ÷1àëT@(ÿÔý§OÇŸ"åi/--5%ßd$  ‚~´ÿúÔ”ð‹-ké?ŸêÿúǽKAäz$þŽþöaì>¼ ;ƒ6ò— ¦nÕŸ1⸠‘gyžö*ëLò×S…š;•m·­c«Þh¥çE>ùÓm•Èö¨`;üNG”XN¢m–ªJ ñ³fÁàSèoùý\^[ÚEûÅÞ]û ö›ªoj¿®4ÛËk¦ò?²ë¾Ò~Cù×µÝ?’H?,µ_‰¿Cûï’ðdXÖz/›¤~¿aü%ó—…ç—Ú?)ÔßÔ} (÷ úÀý)Ãú;tÉßÞJÛ¶!üZ÷Û¡µ¶Ãó±6Rú•ë—–_ÿXk¿|¨ÂÀ<ÑÞR~“þ û5]`ìÊoñ^»WíWºÄ¿&ŒÿS²ü:ï?Ê/Ô_˜~|HÖKá—q€èýC)Ñ^k¿f¿”~8øAZ±vµd~’¨/´ö —Ÿ•¼'êÓß²šüõÀsäz0ø¯ÿGûýñ½Øè„f#êô½Ù鯄ò{ªù%ëbH¢K ò÷É¿Ùu\uü-²ÇŠ®ÏzòÈß7}{‡¾IüŠ·dzº#`½”D¼úð½@삾ߌ.Å?þ¼"à=öÎ×þ½SS÷Úß,ÙeßEù­ò_3é¾~<Àl)¿®Ú]­ûÃ:ëwhÿ­~Cùïjí_6ó}ñ÷kí—•ïʯ´_Å€×È{tû–÷ÝŸ²åû¢¡÷Ý*”¿µÝ,á[[-ÁoÕOZûI÷üHÿg†æ«ä=¥ü˜üká×A e…€®FWt5v]k¼ÖUÛu­ËUûµî“í¿&…_Š>=¿Mè?E’~ÓúK`©öãš÷ãvíÏëïùAi&©š¢¿ÔþŒÖ~"¾Èõ³Û X ±òG4ÿÑ¿,mtv¯t^±‘ŸJóŽ-¨¬M“Á®ö´íx0 zh7íÑl‘ßëé»;1›'­óp£Eõ‹Ù<òÇ*ËËMò{^D©œ¯È§:–Æ«óP ©óô]LùÍBŸ“úJûEÕ/m¯ùS;GûAùO䷴ߪó­iöËðHª¿¡ÿGÍ–ö7«¼_è¾,õ©@0_i¿æ¿%ýH}þ»†õy¿~Ò}§òkö[¼'íŸt~Ù€1€lD€©ísŠ}ÛDúvÊûÛ-í?&ío•vÍ¿`¾!ýó¸ÕKÅ—ûg¦öÏ+áGç¯6Óù§„ô7Ú­€Úk°á£K‰¿Mû­Œ™MýI÷§ïÔíéSÅþ[ѯÔHdª?Žâ/ÆõÇ•ç_ú„Û·©D⟥[júä--Í‚ßãP'ð|ã xüà*þŸ¢èþ£þËÿÿ°ñ ºïknm"}O“òƒ°W")Óƒ“-$#ïê<1'ùït”‹à±Yzñf]™†(ìÚòÈuJÛeRoYâ xÚðc垎 uõÙ‚€KÏŸ—”ß)þB÷õ]´ß©ûμÿ•tkpdïÌKüåi¿Ðÿõ#;ý…0µßVï7´_øÿ~³âÒ¯u_)¿ ·–ÏÑþ)ËX1à{¡ý´ÕñÚöŸ„[$þöÎ@$;Ðÿeë±ØTõï™,ø¡òߟKñŸ¯12~É|!ùêXûS5–æKÆ+÷/F¨íïß…´wA+hç/»~|o6Jd’þ÷¥FÞ/CÀ¸¦©©û¢Ê/{þ¤ ûb‹¼3¬Tÿ¬ ½Èû…óÏêq×¹•.@ü?ß²qeãÊ•ÎNÜÑ3Ä‚¥ùcuTàv´Z÷»‰ìÚã½#l¬ˆXX$U˜̦¤Ü´ý^ÙùîU¹|ò£“Ç‚ßV>ùÛ:›–Ah:0h¼„ÏâW÷Űᢠûí!À .Í=çGíß;gðO>ý8JþÍkhûÖ_Ëÿš~›ö«´ÝMùlõþa©ûŽa?*Õ¿%^P@‰ÿ¤j’úùÚ?µl)ÿ¤*øOé^?5ö=?Ù}cô=(Û/ˆ/°-+ôLº/©ÿRåüÊjŽçIúíŸÊ/çµù¯‘Ù¾­æ§´^°¿F¿@î×BÂÔ'þ»û±èÿãÁ5£äoÚcèÏ{½·[YúÏH¿/[©æ½Ùß/¸}~=¢¨€LþÅÞÒ~!öº»ÏVðc˜’ïJû´-íÇç´QíÏÙ´_qÝÅø“'x`y¿ÃøËœ_ê>>ÖuÙïÐ…ß>pØÔKû‡UÍßÈûupKÕþßAøûoYù¾Nío˜4h?)Šþ“†ðË1>$ýTó±À>þOdþdÿ[·[e ÀìÓ. ~/)÷©„_Sÿeÿ ÿŠþRþíÊߨò~Êú)é@•üæÍ í>\#×ßEY?…gÚoØ~=ÔGþM²_û\¤ýOu¹ÏðýôœQIáû5ý3Õá×#R~â;²_åüTû3 R¤ü¢»O0ßÇ÷±wEîñ7µÏÒþ:ówjÿš«ö»´WfÞoô£@Ð,¿ììü_äû‚þ„ñu‡ö÷ëš¿‘÷[)¿½Ãó}cدCÿyÿ”îó³úù•ù—%ÿ)ìé{=eËù ío•UÿV™ðËÑ>ªòGy»RûgÇVŸŽç­¿Çbä¯ÕõW£³ÿFÕÝ'Jïßj÷Iþ‰÷Ž´ëý.ôWÂ/ºûóéo9Ô~‹ýV©Ÿ^«:¿òšû2ûÏHÐ#¶¬ä~ÖªøgDÕ¯ÇR~à'ºûðQhž1 ƒÁ`0 ƒÁ`0 ƒÁø\üƒÔ endstream endobj 86 0 obj <> endobj 87 0 obj <> endobj 88 0 obj <> endobj 51 0 obj <> endobj 50 0 obj <>stream xœíX{pTÕÿÎ9÷µ›@6ORVå.—D$ !<$< ›d7äQ5!vQËn˜H A Øg-ÑV‹¬( «w j`˜JÑ`:´c™©¯Bµµéh­éèT¤/H¿sÏ&%øê8ÎÔ?z>~÷wÎ÷}÷;ç;ܳ€QÐ *o®Î VI àcQÝŠ`‹h'ÿ €Ì­[»F:÷ÀTœg/k¹}ÅKÏ1”tiéíÍë— ÿÄácwcC°þçmËj0Þؾ¾IÉöûìë°=¡qÅšueE¡ØÞ À¶7¯¬ Š÷“¦c§V×µ°EÊ$€ÑP©ß\Ñ_>>2[V®^k÷p{˪†–›_¾v)ú{0^ |Óʙϵä¡ÔÝL—`íÇP‹Ï‡õˆ‡ :i·ðikåð®ÜSa•¥Ÿñé¿‘ýð}K3jÑ^‹Þ½Èh«C&VŒNÒañ=°cD»éIzÒ²ÎøåÜCí–ûPÏãm§á-r}6À.´…3ü-ŒÜ ¸@&¢´“?’Z‰ZÂûÇ8ËÑ»ÇûSxþJRH ‘ãè“D7[c½µ¢O/Ê+ —I3YIV‘³Ÿ2:£®¤Ûi5éIæ— ä>%I™©6cwo"fÈ£ÝÕØs-Ü5Uȯ%U¤†4’IŽ¡—  |Lsè<œu.°€/½'/—CéSªh Æ–A± CLǬ¼ØG޹-Ù€²çò{°º`/€(ƒŸñ>á,¼pvPx^3É,²ŲŠl"[q>Ú/“d7é&Çp|§É«tf-¤³£ÜB¦Gèiú ú6í§ïÓ0[ÊjÙj¶d¯°W¤R©KÚ+“ÎÉD6­™JRR”Û”v”Õ¦.W·ª÷«¨ÏÙ'ÃÌ+ó*‡Å˜ÕzÌd#l‡µjQ”#ð,J¼Ïó@ŒeÂeñ²ÅO–YAV“uÃ=Nž ûÉÌåU”7ÈYò{ògòK.P…¦Ñ¬áü*i5]L—ÓéCt7} wd7=Nß oaŽýô<æÇ’X*»†yY J »…­c[X„dgÙ®[¼tƒT -”nÃÜOIýÒ{¸’Tfr†&-5%9)Ñ‘0zT|œÝ¦©Š,1J Ûk”t33`J™FiioAT/SLU%#}L=`¹é#=Ýè¹ì O·ðt{‡>æædë^C7é1ô²¤Ê‡õï›VýF«.eZQØp¹ð Ý›ÞèÑMнfÉÚÆ7àÁxÑ8{±QÜ`ÏɆ¨=«qX3KŒ–()) V…–xgG)h£pTf¹áñše†‡ÁdÞ`½YYåózœ.—?'Û$ÅuF­ F‘™e¹@±Õ©›ªÕÞÄÓv=š}"ÔÑã€Ú@V|½Q¼Õg² Ÿ÷‘˜eÎ7<æü»ûÓs²{È5>ÓVÜC ÆwÊ[£e­Ÿ÷–Tìk³ÜÇ û˜»û,äMoÒy3jÓÍ®*ßåVúý4'»bÏ…£6¼:OcÏʃ’ô\$×ñ4E †—kwè¦Í(2Cwp±Æ†LX°Þuxl¹ûèàï Ü«‡j|†Ëœç4üAÏUÑ-Xß]æÖËFZr²£ŽD1ÓÑÑ ±Jü¨Ë+ Ã6«f¹óŽzhª ‘Q†[ÄÔët‰Ï0iF>4äC¨.ݰø ÎhÎ_ ä˜ÍBÎpzè<àF0>© Æ4J†ã<ð*ß.Ã[íCu3+Ëœ4‰ïµ—GV`µgäd¯5+Œ‡nVà”A¥_òÏÎÅ)w¹ø*·÷¸¡fk•O´u¨uwn–ߤn91dI]È-­C–á×nç#À/t©¦–9ü/Á‘–ìmœm’´/07;¯•äŒP¥/3jwfB~\š<Š¡P‰¡—„¡`Ï`k­¡;ŒP´¢"Ôâ ¥Ô3x¢Ýiº;ü'Õœ&fÃL.ö1'õ‹u2ðq¨y—*â:_±¿mìòòŽø Ç¢ 4Ž(·M„N{┫™Ði;vzµCQÇCÄ–ÃR¸6DD´^ˆØ_€ˆüCî+­DœAÞ`Ô \ë˜[±îv ¼>õ©"ŠßoPwHõÜ_y Aûú•¢î4öñÚˆ8ÔMGÝfäTèTÊ s¨/ùï1ô!pÌÊ-¨Oc’‹Í±pÜ*ÆÓŽ"c~êw÷c{ò"Wm¾ò2è¶gÁv çŽc¨/œÏò+?ÐgÃsñ5ï€v@älõs%ö|™ŸÄýú/÷!Ž˜í Ö>3¶R{…®íó}ÿ;hµWïöšØ¿y_»‚ûSkn­ûȸ¯×_‹!ÖVfŒ„¶ÿs$†õ¡—ƒ¯±U/D¾ ì,Ô±T¨ÓæãM—ŸÌwH<äÂN7bÖfáþ`pß¿ÝñPR‚.I‰š»Tï¡×.Š´Å"rHÐS‚Ú/èIA?´WÐAe‚JÍT$È-¨@Ð\A³)‚$ALqߌ|qñÄkˆÏ!žE<ƒˆ !ö#žDìA<ŠxÑØ‚¨C,µb>#BGô„ }‚ô¨  BA7ʤ ’QAàv#¿‰xчxq Ñ‹xqÑxÑ…øb=¢¾tjŠ-Å63ÜCÖºËÔð^5¼K ïTÃ+Õp³^¦†Ôð­jx‰ö«aŸ:A¯éÚ5ÚUÚX-]KÓR´$Í¡Öâ5»¦iŠ&iTÃ=l&³ ZQ]D*ÌuPQ«›ŸT=Ä^µÄ”"b&U@EMQº™ŸeÒíÖͤ‡ F ¹o›“_JŽ!ƒÛv:cì÷CZÖ§KúˆVEåúã0ŽÌŸÓºÕq/©\[Ú°¥ smØÒ¦“Õ0µ"ظ>#ð ùBëOoO·ÒÕ È_|«àngÇ|N—¿(ÍÑR`%7Ç•¾ÉyLü ‡ßæx¼ìBpSNaN!7á›Fó{`Ì”¾iŽËyŒì™¨NÄ©ÄsÁ/ä$üh°ø°ª(=´Ím-ÿ–PÆD‹¤ð©†?±š€‘ÇA!Mn»„2EÕù(Ù;0fÌ»xq qVÞ”6yrÖ=Ž—Ú&§sJ&.âJEDh?sñ^™ýã"Ý|éOüG×Å{O]¼Ï÷Ð(æC¯ú:À p-ÿòÿò5•b¸é+ /4vëJƉŒEðëÖ©ÿY>ߌ"áoaþ”øü|HðÄžØÆ“jÍ$œ? ü‚ŠçpÑ·kªÊn̪©ñææOŸ2eÍ”)–0ÿEýÕʇðáàÅÐ-™}ɋܶBÔ|æØÒ„¹ç5§f©÷Ev]â=­þàR¥ým5›ñCqÿ ¹xޱ endstream endobj 89 0 obj 2882 endobj 34 0 obj <> endobj 33 0 obj <>stream xœíX l×=3óæÍ@ƒ¨ÅŽehJ°ˆ…€!&eIX ¥Ü/p 6Žë:6&ì`djQCÁbIÅjCõõëº! Y(rÓ¤ u+Z“¶¥$J#‹hÄâßsŸÿ8`‘„¶©ZUžÑ™ûöwç¾{Ïÿax߇ƒÔoÎ1 æêó7>²–”ä.k¯÷þ`MX²ze+yÄ)B}·x]A{a|Œ+|>7ÿªŸñ:Ðw1ëc Ù¿Ëÿ+˧‰Ç KV®}aaóû,¿Ä).]’›Ïñޒܵ˜ÛV>ë>“–æ–<ÓGæ]Vºbe{½ï$é7ºP/ëîF [¨­ªm‹_+-÷^N…*ìc€]K¥ñ)ì4Ø-ÈQË‘ Ù¯Ç³í$ÂD™3U+l ”s§PVÙÒ?uÄ6ö½¨³Ñ*ÒžŒ=ÄL'ÙiwŠ‘Æ=6ןc'¢åfw$V™þBl2ógQ—å¨t¶!$ußôY3¾‚zä»ÍÑߪ‹À1ÉF÷õxš: æš;cX±W-ÞÃYï"“È!2œtŒ&ÛyÕ̯´ßÁL諾•;†5Ä 7 3ÝtWA©þѽ0”ß=Ú¨¦"M'FÛÜä9­Èà¸áÎUŒp7¾ý¹ÊF†žŠA™¶‘EýáÞ@õxWoà{Äã ^Žuº1zRïÆoô·Ðà^B„²–²ÞOÂlçV©KØ£Q¡ 1›(ÕëQ©ó°Æ+ÆF4*¸^E·,ݲPH}‰6~™îd¬ò4¶ëíÜû8*‰*â5gF{q(ð†Q·,"f_çǽeMäÜ)—© 48_úR¬ç×ÈP‡¬ÙÁø.¨C”-híÏsû­Þ–C÷¹©I[ìFç¹ð¯ã‚@Ö Öý ÙÚ¹Ý]Ëw}™^:÷&Ü71ˆzþA5XoÓ>§ôüBoÂÛ?vȲˆtûô¥ï†¨wØK fOñD*Ña}‹D_‚ãdoãÿï[/ÛiHwo#Âöˆ{Ûªõ†ØOy¥˜#p§£NÀòiËõýR;v\ì}/8H×ÙÖ¯ü"dË~‚1Þ ìÕ§±ÀàŽº6l=3ÜmHWû¢w¼:Ú~.¾ê.F2ý+M?‡îD$;-ÑT3^‡ÉÄ U‰ÁîΫ¤ÏïCOJ›.AÝ N1­ˆs—ÁW Ç=ÚdÕ3z+6ÏWgáë}˜áÃ.·S[UĵÖÃ7¶&dŽØk”mÿ$ê;tîó+å<ðñ‰Î1ý-Þ)¬rlì1ˆ˜þˆ÷õ8Â9ÔÏk¡ŽaŒÔqXìönו:+ón„“ìåoÂ^'yí8ê+uÞœð°ßû=¼eØ ´5Uv3J¸O‚ÁEØ”#xN!)3nJœÆZ y²…>˜ˆÞhg=Ìú ÊÚ˜|™¶Î Œ¯{(rwc†“ˆyD:cÂGô÷)þ òkò 8c\— W ÏéFdJ¬«Dr×d<í$àŽáO‚¶É¦¼L¬2< ÐOòœlô³Ë±“èà{|[µ}—9±à¬'·^"Îdûqòf²N¢OÎÅ6òa?w;¦é?c´[E¿ºŽB÷9m:9í"òT3õ)BŠº@?ÜŒíΔª»¨P›°…ù d×c¿ZŠÕ©3©æ¨éäÈb¬s›Ù¶™q8žõX@}W¸o`ú; u:BÎ ®¦?öB¾Zæµ"ç"ŠìX#¢Ëç<ƒ>NzItOZ‹$ JÞì°·øùCæAc£çOÝ›åÌŒ$×ʹ1+ñ+9 ÐÉHÑ‹y­ÓyÊf:³¢·:õMÃ}Ì-’“$ÿ˜\ôÙ<” ‚|!¹Cr–ä ã+äUÉÕŸH r’äLãß„Ì1g,¹vþÎ’<,<pVÀG_6'¹ˆ~ï‹xI8Iâ\âÞ]ô n21OÎŽ Î>Aþèc¿{Ä—ä\e­àl¿l®“ïñØøA¼çÅ ÿ§ØíÃ"OXè5J‡ì½‡õVòØ·±R/d¾ùãv!c5dEtÔ pVÎÇû$ú3¯6z•sçxó±Õ€27ÏÊñ›ÈYå¸Â\¹ÚŸÀœ;Ïô“¹ŠpSñ¦ñ‰WÐäžÇn=ö¸û±U/%Ï=+¾ä݃ԩ,//%žÄQÏ'G^!G͘LžÙyâ¿mVsoæB£ê… ¶z˜üžH<ëùD RK¼[G|„yËîƒfùv´›¬I÷ uvêQK. {ìžÔñ‡œFl¥ǹþyo¦õ˜Ñ'ÇìwÍKµöxÕæ]þ"úËYšw‹7ïٮóˆ»z%^ù\¬¦o,6˜&ðzsÞ8ÇoÃz¬kÖ–wF[ðõ$¢a÷æ§ý¦Âüfi"Âúc‚¶f® ;ÍÈwú"\{JWã —Íý 9/æ/~ÿÏ^0ß3䈀'î¯Ûó:Åú‘ s]øÃøjl}#³ÿ3çïÖ[ZüÕØqÑ9.Å'Ä$†LìМ¯X¿Se¸äNbúZôON£ýš*·g¹_·®{-[ø¦mo d®ðàƒlþy~ñ0çÚéÞØ*>w™äW£³ÃÊE²ùÑh›ù%9)5-.m6ªj< Nz|hÏ´±ƒ“úôîéi'¥íú¡êêCVëÑ#‡©©¶«kjjî¾WSƒ®ëÿõØuwÝ]w×Ýuÿ[·\vì_Û8"¬þñàòÝÿ7.…!æ©Ä>×,ùi².?£/›R/ÚO¾X4í‡Ùsçg~ã¹áóæM5rZê““Ç­LM5£`í€û¯*r ×¢÷5ÿ²;_0QÆY‡ý¤îÇ ‹zL¸G|ÓÜ”õQV Ûªînôk=©ûæ=xýèm‚ endstream endobj 90 0 obj 2200 endobj 48 0 obj <> endobj 47 0 obj <>stream xœ‘¿kTAÇw/þ8€• L%Q ‘4‚œä œñÈ%˽}óÞ-ìí.»û0O{ ó£±Lk#V©E,,ìlã_`›Mžˆûîг´XØïÌ÷3³CI½F(¥ÍõöÚʃýb4вŠ\Wh˜¯…ù™ò~ypòíäÙìé¾zy.,œ%/Â÷KáÝÅðö|xsabñ„îÐúycmú:õ™Å&´µ)¬È†n.-݆AQoAü!¡ý°÷heµ‹Õ è BË$ôòº‚£rx RmANÀµJ„Z¹ÜuÀÀä"áGS M0hG¹xá ³LyLÀkŠË<©ð1žjåÁXõQT¢UO;ï¸ÆC$öî-OzôCæ+®QÆÌDó|„±þæ™P·ŠBßúœÔ(­/í5ޝ>Ýÿò‘†×f¯—çõŸ»å¯Ã¹òNY?Šgöp®q|kÿÔöéí3„ü-àØç endstream endobj 91 0 obj 453 endobj 37 0 obj <> endobj 36 0 obj <>stream xœÌ¼xSǶ/¾eYòNN :Â$’BïÐBï½  ¸ÉÛ²-Y¶šÕûXV±\%[r‘{7c0Ð!ô’Ò““rR.9³ísÞd''Üónî—÷ç~ßÃÒÞ³÷ž™=ë·Öú­™5¢`ÁTŒB¡ Û‘œÆN]—“š(˜AŒ¦¯¯RÉEdÕφŸgÐ^Å6–?7Œà¼€y^ŰúF¼‚_}ùzÄ‹¯ÐN¼„í BY)­”SAXPpа ‘A¯š´ hYÐÚ ÍA;‚öE%eåƒ ‚Jƒ*ƒê‚Zƒºƒú‚Î]ºô^ÐGA_ý5èiÐÏÔ`êóÔ‘ÔW¨¯S'R§Sߦ®¡n¢î FS¨BªŠj æQ ¨¥Tµ™ÚIí¡ž¤^¢Þ Þ¥¾Oý˜úWêÏÁ”à‚Á£‚_ ž<-øÍàÅÁ+ƒ·Gï N Î –«ƒÁÖà²àÚàÎà£"ÂwMœ9+9/œ¶L&ÌàÅ%£‡xâ8^Fà”° ž -Y(DÇaɰDA ?‹–•–ÌKÅšGå éü¬° A:ºž†® ª¶¦ ³„q‚䌬0ÔâÖ•«‡ú˜•“hW˜Œ.‡¥' ;ãÓãD·ù絬˜d¾0,‹'Î ´Ë ‹Of¤ÆHP»¨ª Aò`DÂd~âo­O ðcñ©<á`½Qùíýžy똌ŒTÉà³éƒwý³ýä,!/5aÚæä´X‘0,<=-†¶9}~ØÆ°p^¢(5F6„Íÿý†ßÄöÿO«D‚ô@Çy™¢˜T¡(--&ÐëD/&‹',\ÉK͊Ɉd!ñÄ''$ðÓ³ËSÓ¥<~"’t|r\Lê²Xª4qðsc\Œ ¿'&N”Å‹HOLçóRÖŧgÅÄ¡QÈÚ—Ž:ÞóÏÒ5Ï”n|p{/>955&f°Êui1q¨ÎeC_Â_®…Þ¹n¨‰$ÄíÏÔ³j°ˆ®®¼5|°hóàñª6÷˵ßÝÂnc±ãX'V=Æî`—°“XæÆj±'Ø]ìÖ‡½ƒÂ.``ŸRVJÉC>=Ÿb£Ø)Š“R@qQ )E”bJ ¥”RFqS<”rJÅKñQ*)U”jJ ÅO©¥ÔQê) ”FJ¥™Ò‚8A¥ÒAé¤tQQº)‡)G(=”£”^Ê1ÊqJåå$åå4å å,åå<åÊÊEÊ%ÊeÊÊUÊ5ÊuÊ Ê»”›”[”Û”;”»”{”û””‡”G”÷(ïS> <¦<¡|Hùˆ²Q$î=ØqÊÊÇA ƒ®"Ê@§¿CK }AßAï ‰ 9¿„‹ðžËxŽx^ù§Q’¾°ñ… ÓÿÓðòÇ¿xò¥É/ù_^ñòÍñ#ž0Þdˆ_ü9åÏO™;Fâ#cG’¡C?c°÷°ŒŠ=v´æ•}¯¸^ ~uâ«S^]õjæ«e¯~ÈÉiäœäbÜ×¹ÅÜŽ°°°™aa–ת½Vûzðë³}L昛o4½qòÆ.›>öÑØŸÇiÆOŸ3¾küOÞžpc——LÔOzmÒÀäi“Oé˜=µvê“iÓ¦Oœ¾h6cÅÌ”™ªYSgÙf]ž½höWojßü·Æ¾µvή¹³çÞûÃ<Ƽ)óªç'ÍÏ_¶`æ‚o¿ñöû Ç-\²°hѤEK%-úÛâ˜Å…‹?]2yÉý¥5Ë"—‰–Ï]~t…jEËÊa+-+«WE­ž¶úïk*×bkåë¯{ýŽõßl°møËÆè¥›â6=Ú|`ó?¶dm}uëú­}Û–n#íÛ_Û.ÛÁÞQ1;⋪Ä.åî—w×EŽ‹¼¹'fOýÞ){?ŠÝÇÞ—¹ìþú<Œ¶ÅpbnÆnˆýG\cü^Þ+¼©¼÷Ò7%~’Tœ¼.¹þàúƒRä©£SW¤šS;SßM‹Hs¤H{Ÿ‘.Nÿ{Flæ¨Ì¬Ìá—…—³ºD¹¢»ÙrþœÓ#ž(þRÒ"’~&KÓäy¹‹r*’_)·«(*™úE5ÐP4ïh ºP]»>Mÿ¿ —ŒË¦-¦ŸÍbË*Ë10|–wÏ¿;ÿ¡í ­À¾Àþ™Ãï<àü·k¬ëv¡ºhCÑÅu%Y%+-+{³¬Ý½Ü}×é9ó‡§@ñ/…ßÿ“ôËè—ôeZÀ¹Æ,€|q`3K²M§ß®Æe„#ä<\“ãHZ‘‘r@ÄN’ÆêßøAßi¯¶Wpá‹Ä–²þŠ 6öp/Œm#F¢Š/º™áv}âÎTâ2+“N0-$ÙjUœ–-ƒ[Ü!»íZ;¨ù.OË9HcÁ º— ÍÓäi€– x¹š z\-!lXÆ„“`ɲ„6œØJÌG•O뢖o0KòyEà(%—zÖW“Ï)éerIjlN¦J™-Rj@tùªy±Ê®¸H* *ÅõW`(ªtĸ7à‹u·Áq¼AP“–%“‹ä*¯‚S¡rj@.ˆKX4‡|-â,ù'Ûá|9Àt‹ÅŒ@cIÔïT, S®N˜4½ðé‰ÐÏò~(ãC">ÇÌÎä'Hd¹€­Õ8(=Ë=ciŒwí>[e騶Œšø ·o¾Á¹ù&k„*Ûø¦Œ- 9a)у ·è-†Éä¬{ô^8ËUy䯅/Nôµ¼Ì¥’(õµ©Üä|ãCÅnS®z¯TÖÜã÷}ñ.’ªàú(à#¨¾M…?þÄܱ5^´àáɇo}ØúéÙw¸õ ]å¯*Ó* fƒQÃÕ)Ì: Á…e¹Õµ>¯ÿèþÖ-ä$2ŒGΘrzÇ—wÏ4Þ¿À”0Ñï¥ô à&^F?®/Ö, Ð+seäXòmÖV8^å7z@ Ô¸]gœ¸›ôÈBÎÊÔû~"ݬ„˜ƒñ É%ç¥ vªˆºCöJ]5ež’2.œ —^'ç;%6³_mXg@÷øÝ!« 4Á…±°ˆÁ'Ï7T.eï¿ûKþèÏÛtòÓõBM#×Éè}¦jêšÖ(×KÌF“Ê(·˜,F‹ñµœ•:Fž³+°=‰¶œbP m~»>O¬b]8LóЉaÄy’9pP¶3G¾^ÇìćÆÇZâj ŸU~ÁnÇ…Æ¥ø¬a€xb»¾e|¯ [ép&Ä>€Ï·+[E•Üœªœâ]•·<õÅMu8ã˺겖®Q_­†›î‡2ÄD¤2#6©4R€«µ®¢Ò&8¼qk¿ð½wF쬪D=2+Ò3f§ d…EŸ»û9¥í–¸ãNŽ$ç[ÉI+»¢¯Þ8ÒôÝ ®j·Y²pFI†GRÓ}òГÆnr¼Él0—‰A"NNC.ž,¬í|Üñk79uõíu‹pj™Ÿ÷¿Ì<«Í7yv< +Y›É$i„H¶ÎˆðÔí‘ååæéóâ­¹…Èúœ Õó]Vgž­þ{L‡UM]ΆR¶›Ü& )¶Yl–zS‰Ù¸Œ}ëÇä9z­\¢R@N…‰Á©?¾wäég\iéÌÙÛÒæ6IÝp2៎Áaßç;~¹îøœˆ($±€ÌUÄL¯ÉÆ@ëg¿g‰ Ì*:V—Wâð‹hÉדHVÆxá_µO¡Œ¶ 7‰) ‰’º|¥ž‡Þ»ÜE¹±*€x8 .„³è]¹~oÊ‚mÜúïò]Xò,V¶9Ƙ—g€Ãx`¶ÓD4èFÈ4Wd‚m`ÿ­èM1[÷¦îxzNYeK ­¿Ë­½qþxŸ àâÏUMñ5*üR˜+¶¦ÊÃÚN—YË š¸u68É÷Ó}ð»;ÍI¾AÎ$ç““œÞþðÖƒC×ßá|8ÙòéÝ'î+•e¥ŠSÓ¸ I<É[ÙøØF!~DÒÒ÷‘ã* ¾#Åž »¾úTÉ=ôvKèÂïh¹„5ä4\(ÎOÙ &‹ÙÉ9‘ÚùHoщâ;ÚðþI3ñf xJ,{J%øýÓ˜sÁ̸·—›¶•Èçp2ìó ãá~˜³‹8NøÚÄ¿‘£®9È|Ô·m*‰E‘ãÖOåîX¸)~Àçî»±¿ôÁ‰>æž}ÿbǤ®ý ƒ„C€T*‰ôbtd ƒ'üÒ!ð9ð·Æg¿¹uˆãpIJ®æt¸a+2qeÎ.äúûMÂ㉵ÁB@b1dðš5[·,Hð}â"‰½Òs‹`CòÊáÚSİJä;¡žJŒ&·3¥ô]˜Wòóly68¸ËZN—GÉŽæ¸cYä[äFrÊÊÎý—om‡ŒO¹³È£Š8™v½)¯>dU?Îlög$Ï[C¾¾&œ›)ÊP ž,jè½{R¯^ã666—×£W‡dœxÔŨùëÄšw©­Dó3úìy¢°ƒ;b[©uºòóòóí\›#ϸOâÉΖI²’[3Ž|zó¯pã!Îmx‡)tGÄèõpfû­³/qt&‹Ùdà5fÐ!÷-«¬ª(¯lO¨Û³'^•ÈI‹ÏÙ—6ŸNbgí°¥BX~¤ÂqHçt¥‰h_¶b?ùüÀ"–d‹N?¨ùfwÈF—!´€bkaaÛ)ÁªÑû͇Ààºçpc_{ýðþõÒSä+2Wnc:|ÅÎ:Ð :ÔÞ\¿¤( DõYûd¦Jãµ›ÕÒæeØ]e3ñ¤9€jÿðzõ¿ÐÏ  Ò'$ƒH†kuƒôÓr ΑDmÈÌŒÎa'Hר—|»°°º¨¨·ænÉWsaG«¹ÑR :óêôEj»ÁªAIÍ ƒÈk`Ý€r‰7G£Ÿad+AŠ%Ér 沕E64~pf«b‹Â"·H¹>3rUld³Çz)pØÈ“p±çðÑûÍgë=ÀìF»º@Z`ð¼ÞSÞØ(ö¥geÈ32¹±1q[eq¹‰¬S0Íd]®Ð˜—+ÙÒj{>p¼²D-É@¶†»€ì ¸B2¶~âƒ;;K+G€3Íáä …2þA¤™›é&`°jå yHA©3OÝU™v.“»5N’„@Q ¬È°ïÃW_Ûÿ=ñä/ï=2¥†s (Ó Êð²*‰Õ ,ùœs©ÅpÆŸÿåý‡n“WïåöÑ?“ÈÏ™yÀj±Zò-…&·á§ƒí騺ˆmq‹ßŽê¸Ríð¸+8%žîæôðOp1šÙ^!ŒJR'sE±©¢d€óDu½_œ{ï*©5¹áF¿ª™’7h<`“ŒùÀÞQx¶Nxü=œà,Žžü-É~{f슷9ã¦n%‡!‹æ7¬9ãÏ®TQÏx[£]Q(guø: ;Ôë(/JO«ÛÁpÓ¢«º¼¤Ôß&/bmß+^Кm[R¾«$Ê¥GlÎ Àt¨ëßÉ|ïø¶)¯E‘ã7L´D˾ êâÓ¯ŽÃ‰3Dƒ ö›fJ?;=ƒŒ~U_¬G‘Ï3¬ëW°»C¶åKŠ@(È/sT^‚BV»¹ÒR‰ î´¸ŒeZ§Ñt™Y©OõX÷¡Bbß?Ód!šÙco©ã`Ã…mŠMz€®E,¥ÏÌB@CäÅGL©B®ìË;G{Ékƒã˜9älš›^àvØ A(7z 8#UWé1¹G?¹pú~Gö‘¨ó\^¯¬ÔâÍ>_ëɆ„E…7ñŠri¹tm®Ö˜ t@mÛÑ“¹U6zùÞèµ)¾èînçnOàãûÓRìH=ô•ŒókØB•òR  Z"Ö(U2dÙu.W¡û²ç$·þ«Š» ïʨ_¿r9v¾@ì0Ø·)âu[tl¹?$ ¿¼RGµEL¹†o±˜rõ"rô€ /]pZIK×Å“n\jEÁK‰Ra4)Œ2î2N±G— ”ìL¬öDkíÇ¿ß! ¥C®èŠ›y ?Ç#>9 šY<Í¥mMÍõ(léÁ¿\v‚…쎌ޭ·[ u‡¨€Ò Ôe q+ò$$D“;dsΚAa~‰«õ,ä±®à‹äœ@'‹‰/Ù*q6üñ!Þ² v“/ËTy6aÚ’v¢¿Ù© Ø +¨ý»û'1å6©PªÎl5P拜‘îè‚X¤©‰ä2ŠÌXS¿ªw/÷Äî;ƒOÀ튇Ã-,÷YwñU"eWb¶f“[ $@¤O-­0i•J‘ˆ§Ü*b.¿‹ÓCÆ£'ÜžÞKµ×ÀUp&£aŸ;Ó™m?Pnb!w¢:n¢ÀãÄRæÛôºó¬öÃvšò z“E«çÄïÞ™¢huz4$`Î3áwé+È:³Æb2iØš4mÐâ"Ÿ¬öhsÝ——9 çž2™ °5ú‚â€(ó¹ŸÀhOè¶z ¦Fx)à )LÑiÕ*©T®Ö¶ÎÂü2gäç;­¸5$Ïú ¼g²Žç˜âM(˜=…¬ Ò­I¦ÏÙK®bɶéSAžàÎi8ÚÞðä'›8ÆÌÈÉJK©È®÷WUÕÕgù3>[ÒJ 4#ý€ôOàˇ2æID³ ñÊ,zn¶Æ HâùY8ãK”bO=fÙê‰eü ¸.MI®G\..•;µ½{J2A4¾tû¶åó6Þúª ¯ ÏÉɱ&“BÄaUE…^¤jeF¿æ¨´V߈\BÈÇCÚլΙŸsg~®)ÇñËÝ7ÚB§RPl]7Èf¼ðnXŽèuA€^ý¼®8½ ΠìC1ÙA? wý25â&ý²ßcwÈ–•Ôg^Õy šX°ƒ¾žTÉvý|npäâÔ<‡µ²Ës¾Àq®pŸÚÝK0-~? eì&b&ïZ/ÏEš¬3:ŠTÜæ>‚'iËèáätlßrœÑ3eËžÝ)£•šÂ2°"¡ÿ—É®HÔ…ëØ¹!ÈI¸ ³]ƒ,Šiurù:K²R— $xb¹¸õÖ©Ó0†pøa²Õ gìN+—4ôVy¿¹Áä°çÕY ÕN^qxñkù m³YÖx«Ö…ï©i{×^ämm8õ)œÁª'o[3¬&'`€ÂÂÚæ¼<›Ýf‡¯À¹÷ápoU¦  v­[ÎqËÈèä2”œ›Ÿ²[‹ÌùzƒÉ¬5p3:gº©zªºÉf̸¤2(G#O€|®Ê(44Ú¬4âT(†/25*ô§L‰Ë%WœEÎüb»—›—ŸgϳÂÉÄýÿ¯Nf²èM.ùê@ ƒ؉žœ¦“­õ__ Ð Õñ½^b:2HOàî;¡Œ"1år½A§MKU º½Ãéí†KzáRn~ažÕêÒå³6ëL&Õ^m;ß=M#7³VuÄ^¹y¸¾ô 7g‘I„ÈÔð‹•u]5Ÿßå0JÈ·ámf‹¹R’ÀÜHòùÕË„ÉR>À“²êžîøñð%n×ùÞ¦®@\%Þþ?!£½2 ÿÍ2z¡\ Ä@,Ž>NÆ’k±Å‚lÐRZx9€7½,ä¬Îjò‘/8àaUЉçÒSë.®Ê Ì{ü2ÿ˜¨P £[Šƒ¯6|¯pGĬMä”×Pp°³¬¯ÖûÎï:‚-ÃÖ[ÉCQ—spޱÐêrx>Ö%$žad|uli³ù\NZŽDØz ÎW;NU¾àb¹<'Ó+kh,v]ìãÖ6ùj»Ï7/°Jv—Èš@ðWŸÿ,`'ý“øÕ8çµr_j¥Vm2¦'fKå-G¡ÝævTso@¬[QÙm‚ÚdqŽN.äìI‰Ý»š ª¹_vTà­Y5É›W!¦:sòLÖíÊlã<9[Vâ/ÑÉUY3I7k¾I­ØŒ×ì²ö–“g?¼p¶ÔNL“BÛH*¸æ:ÃÛwâÖñ}GP _äR« f¥AÂÝFJ5 F1P³ÓJeþÞ#ÍwOqìÎÁ©Î*â¥ã‚ò!õ‡2ß1;L@4&¥^dÖ™uƒYÇ"_0ÓŒ!YÒÎÂÉp\gÞÜÓ·vÕ®X2h%ç$ wÖöÀ%;+R“¨_«Åa<éc®=¸sÝî°­›¸ ¼èìh€§Ê‹ª.4|Ó}—{äAODZÀËÝ!pÿÌ `q“Œ~ÚP¤CžH¦(2É-Á¬8bœ¥*-9mG@Ô _e.Ô9÷¸V³È¥ä÷ˆIúN`eƒN$­ôU²f£ËäÒ«lââé—Jþ¡€ØC³Óûöмtx–x¯öD¡«£˜=üç)’Nø\sJ7ÌóÂÍ#ÀcøÂ-âù®PÆ\â ÁÊ-L1 V’–²{Wêb°ߨ¹·¯»ÇßÓÆa<‰v´ñ{GÿõCÄ·ÿ ç’¯CÒþä›È DÛà›ä}ëDÉ‘¿p•õ‹’ö(×#±„‡Á%p |ކsá È$‡“ã¶Ö%ÄsÅbR€l¹¢¬Öžç²:¹W¡¶šÎ¿6Yk.Ë2'èIZøøíO5&)ä“ sié'‡ÚŠ›OrlfÙþÈõ›ÂÙ+6Gf.”âðXÿ«ÌKí{æ-LKãs33c¥<€oL8ñÉÝú÷áV×4–´¦‰óûà;fš 3•_#¨kòW74fúÓ±0kÄi8æ4…àA/s ,ÇОҋNÓ&Ó߃I´Íô·É$9ò™“×éªÚ×ôrÌÐáW¨4™v‰þ&ÓàÈgNžÒgÀHfà>ô| ÞÀ,åË}”À'³oÀ€%Ò;)¤ŽŠCþô3u¨ŸõM5¨ŸÔOÆ»…a¦ )iÕ†@q“ &•ûO‚× GJt‡N R¢þa^Êáš{TBOÌ”ªOT‘û+™.ݸdb…쨌ô(° $§5$ú2¼Ò“ «É>Ö¢ŠÌvÕS™‰•A¾Ø–v2ë’’-šAk¥û>½“ßâìô²ßih½n‚G‚6ò¹ÏÏB5뢰2ɺ¬ÌÌ"·,bnê×ÐSÓÚ]Vátåu<Šü„é0ÜØîáƒ6˜·sßkÚ‰7½0uþt`Y$jßvç¸šÔæúJo­G_$öpä¥DÙAmUíÉÖAÈ>†T |R©mHëáj¢ï¿5¤uý!uð^xD…éŸÇ$g’SH1©$YWfs¸»¬±›ûÝÝp€oàpÖÖ¯&qtéÌÓ ûÞ&GÅ‘óÃÇryëb“÷<"¥ïßN½'¿à¶]él<2È^],nq7Á$Ôædxþ«÷afM(Cyª Â| ¡ûO$þÖ‘ÈûGºÊ››¸§Ï5=÷ñëq‡ÖrŠR˜M‰6¦,Þ»›+òsߎͩî=Vÿ¸å·¶«®¢ ÀϘqôÈ=ÄkA 8”E7+·8Ý• p2ˆÄÈÈ—Ÿ ¿~â˜ÿX·³¯þ>8 JÌn£NÀ’ïÕ–™kÁQPíì®Âu§ÈÿN§õÒ¿'ú™N‘E8I[@Òæ'fUwþí1ä^¶ÙÌz'Ç­pkuHÑß÷4÷BK‰Éý+˜$ ìON}m/¹š%^.nvæ–ä".Tî-Á*ÑRõ¾¬Q`GsΦü"¯H^ÚA™£Ö}g,õUþ |¨•UÄ{®züõ•{àB–ï‘¿þ’;àNÔ^ ñ©šy;d`ÜN ÿ4th'¥´u!ý-ëgz)ÇG¦2}Ova¥ËV^PõX‹Çn["Ôv¶Íœof`±pÊgJÌ@kV™ÙòsÖª¼2%Èa½YmœK™­^ˆÞ³¿Br|ÏI⛦à/pÚû0øÝípS(#–¨…?2Å!&Du—ñ7.I9žú‘ð‡KõµÕ8CÞÚTÑÚ2êÔCÛ¦®›CÓäÉò39yú®*bñEmˆIµq×;Nvœ*òœ¸çtôÙqOC:0ÂÀl#­sZ¢£â£¥‘_¾ãÜÛ—o}×Á}ð˜il°xø¤²»‡Ãˆo*‘ÆíW¤¥ò¹R¹Ù| iSÝéרO%ÌkýK‘WîŸ _¸G]£#™yëˆ<:9*xè 0Ö÷‰ê;ø·¨ÄËFf+"ÜÂít¸ý=Ÿkêר_¯¼;#‰§–¥qv§g$óWøt¬ö«‡ë/üÖé]«²Mb½‚+ŒØ¿qÝ*2ÌbI! éƒ,Ú3áMb-óÉÑ£çþ7õ.Íuæ´2‡œ:êEÊ a&RâU™$….UŽP—1YºD2 d¸ÅÒuR_4o?¹•½0“¿IfR±`08ÚÒøÓ1¸šUq§²úŠ'¾TQ êAuÑɪ–¾»EÇ*GÓɾù¿Àð‰šIØ¡”v á}­!æ‘ÛÐÿ€½Õußu€WÞËø8”ñ.2=W˜­G[}Ý?Õ–“x€ÏáGËgÉqYÈ)Pbñ«qƇ³›w,µ‰¹Â¬¸}éq(dÎ*L«äûdN1ÀÓe¹Þ¡ì[çúŠksí{>·ùG×6âù!¨•a½­Í7FÝÙrúíÕ›â6ä 1ì 1ëÙä fâ÷ÊËàk_¨‡o…Ô¦GM½Wo(ÊXäHòùÝëbÆdnTmKÀâ⥕«K£ËRÛÖ¡A퀛¯YvÀ³ÌÌx©2dƒl»Ô5ë˜Ä±ì©Ùû6œNaù;=ÅÀ|æÓ½åúdM}G¯8¸ò)q´rxºó œt7”ñ¦ÂåLg}éÙ†Ž[çØþ¥·\Än=1kþ¶ýÒÊ$ÕUž2¯Óì0sô%f0ã µå‡OÔ§FìŬ_É™7E)’N@ã%ŸÇäg ùüª¬†ÚššÚza5ÿ/>ë2…ˆ„zäÂá0b -–>ðÖÀŠœµ4XFßC®¦=¢…+ißÑÉ9W™d’ÏÁ[4ý—ƒÑïRëɵLøÄN\锺kÅ—Á]pN{%÷‚ô†¼mÿ{b«eAÙ0ŒdrNd}ZÌæ ^NÿD3³Ì‚ÌäØÄÙ¼yé›Ô© O.•úÛ¼ÍK9ðyϧmp.^#¦<£öZaSY.ª=Ø©)Ô»ô™™õ€M&£Ú¿½m-×—žš™¡Ò°wîáE9nÌ7Ú~ßÙ+UaÁç7çìÛ’¼#ÀG¡ŒhbqŽ™F!_Ø¥h„ìi[¶M@"Œ¨8Ð,(S–êkõ{ÉWXô^Ȧ1|»ØGß§›.Ü“²¶oå‰v£îéó´ùðUb4«ÊR¬J0˜Ö÷LV_×ë¯TVJJ9âR™=)'ŒafT)ºâ»Ýzªõd]åÉ2|øÏ+µMÂÀ½yˆ…2&ü¼;0—N£+€Äš•3Jl©ûlÙ£É8r É#å$û›ñpdE]žµ…ËH² @ÇhøWúU¸@æx› ÚÊ'Çv¸ÄU[È|±:‘ÓËyì“0ü’é‘©L“Å6K-&“Èkf]ƒR‰-v¦Ú@Žl%ý ÌqV» |€ý5ýhP¸’ì²¼\»éŒ’tò3{‰"UÈÏ$äÆ|Êž ðyøÆuøÖ÷¹]-=í]8|pŸ€œåÜÀ<þ·?|K…3ÿ+ÄÀ¨‘ÿŠLÄöÿkq“s\ÿ÷€!ãªáŠH6)½Pˆ ×u‚vïÐÍPÆE„1õrѸxrg9Qy@š*I‘(„—l¿&–8ólÀþkb‰(±9³ç³w¿…›º‡K¦Ó‹ì&Ñ(ËYÉ&§Š,œ_‘SßÕV÷à,Gæ2è z³‰~03[ p½Ánw6×;á®Óo/suXm,›;ωZ`„òÀhQ[ØŒéÆŒ sÆhr½áiY—·±¦£Ás྽Úd1\½Î¬j\à‘V×x<5‡¢ë·lß!ŒOâÄDåĦŽÅߤëRnK_)ºÝT#ºasýPÊ8N„ÁÛLg7|‘Þ ³«NŸÕ HaOµ'95Õ¯)-­íá5îˆˆÌØÃãF®ÏÞ‘CÒç¤kbhFÑqE ìñéq<fgkeéñN.cÇž+¹ÇG_}­5—T.–Z—ž#Òñ;D­¬=ô©Ãí‡A8£†|‰´0•Éü¬4€ Ån_mey“ÏeÌn@»LLª†ÙÈÁÝïPa9òúã&MŸÙqðo¿ûËÇãZù:Óg)”4°+s}"O¡Ò³äåu^ùæ´1€TÂÞC[( ²Z¨ÐÙ¿‹±Äö#Ξéé9}f_Ïnrp{CZb?—ȯoomhhåÿyX`Zl›‡þSaðT¾‘¨,€»è¸¸4A¡Wõ îBÙÄŸê´<“J4'™ UlxBLwcõûï Äìß%–æ6‚Šƒ›Wø-1í8ŒA*o7ÛLf$|Çh1Zäz €mJk®g´Úr„ùÒÑ(ÆÄÇDGeǦMÀgÐõ)´O銭ª£ø ¹1•dg¬4iõ*J!ÉÕ!ú!×@n¹AÐ+ñˆr~ù­ïá¶nλð2ÍÙÄ´{Û฾k·»Ò§R™‘Å1r Z“èѪË×ÛtV½Åd1±É7Õ{Ñ)øßnúÀÞ¿/§@ìsºª7ªV3ú߃{®Ö6>„4æÖíq™¦}ÂÖk•Ö"G÷oÇÊ;jºë|Í ?œZ›,ÙÅ©¼´Ò,Ž–µÉŠ’hEÎâ2vïh?~åh|éCŽQfVƒ\ddWÙ}ùòý#7Îrbò(¼Ã¬µ”ç ļµƒ±bQ– U–H½®´v:á8×<2â’{˜ Ÿ–·´vx½UÅU¯*V·ï_.à* bCú`LK¦µ~ØBœ»Tßd¦K[j/°vm…$3S,OΖڊҸR~·¬ÊPØïöµõJ©Ôê,f5÷È5>üg¹¸öÖk¡ÔßëK«ÏÞ†Ûªî>BKNûw"fðæ±r'ز Ó+•ÀÇMG/>¹åú'˜¤ #R+42]»FúœÓõYlAAc\Ï,kéÕ8 hp1=p6™×Á¬¦.—³éŸù¿…û¯ù¿é{Ö’42T£6êåRåa³SÞ—þõ`pM‘ýÊ`°,äšÖnôD\&ÓYd]Gƒséùꬷiä¼Á³ùôŒéÒÝ|ñF#Û(£Á7]š'G±_¬UQü ÒQ]óÿ5ä.ý#ÀmQ„÷%¡a¶Òá’ŸŠv(f{eîµÖ¨×q È7çJÀ6ÅTÇžŽwá¤+OCßÃvÄnuüÜíi¼•ál’>-'lÆßýéãó=WäåB¡Lž£µìJŽCaÕ-ž–!‰ÞÍo8}ª²ûê-Î㯊*ËÿŠ3.–ÀpfºPÁ¯Ö×WU5ÔgU šCb‰îEva 9›y &xnu|ëï`++^Ð ­Ζ#Àgì’Vh ÌE¯s»ýµ²’T¹Æ¬Îâ&ÈÕæhK᱂ŠúÞŠ:{)(ÇëåîŒ4iN‚ñ7)Ç&ÎS"2—e–h÷Gç©­ e"—:?K¦ÈÈtËêŠ ¬./·Óí¶Še"U# ª·Ê¬CîTLÍ~Ý$ׯiö r†õUDGÔ×SÀMøÍ *±“˜Á$GÐËákÎfwcIUyI%À‹]z­ÑE×H#ÕãÙ’Ê*·¶+©>*.!'!¿G¼KLã$…®K£Á`z<ùµr¬z¿4“­–ËÔÈw)5N—Íj·9¹—Õ È —‹â~|SFïG׿ƒoUrºáYNZz¶= B1yúžY[>^¡“j³ç çsW$*÷ÝnÓ$kRLj6’d)ÈÆ<⦓-Uf…K£Òª4JöÁÉТµ£Ø™_bG`´!~™‡Àø.,ÿ¶¯øh h']¦€‹T¸a3C$@Qž,ð545T¶r…ôH^N 8€ï:}òX·ÿD믨„Í„ŠÙH'q8QáV9_È‘ËÅJ‡ºD=…¥^¸ÝÕJ,aŠçæD'$–î´j‘¨1U—ŒgÒÅ@nK+æÚOi+ºTùˆþñ%2¡Ð+©+)µVsJÊlƒ¶Žœãƒzôú Ê7\žk¿Ø}¾é<ïJ(ã' Z‰×™R§Ø† ²mïöµQÕ;{wrï¿Ù],iì1 [8 R•ìñ:l¶"'×[â,•x­ÄÍOÊÎNÚ|!êþ'7ÞyØ¥öí¼Á±æœæRÀ¾yìĽCòC™M\òE8IêÕøŸ}¢µé‡ñãÒ®Ô`Ôk´\¹B¯B>5³B\Ûäõµœ8´ä­Í»–ð$õmæ0žªx f3htî>¼½4 $ã¼´ƒIÛÂàÈ[í õmƒ >±—˜êÍñÜÇʘB,%N0“é;H:•§3ãhr,9‰œEN/ID¡C™¬DÛ¨Þ@†²ZéáÃcvØkô%p¡öÜÉ›W| îƒZm“¢RÒ .-ÆIéÀ$¦¸BS jÁW=0øÚÍÚúVO3°"ïh·àõJfE¶K’Àò”ñû×'ìä  0 »pêFbqÿDf"|ýõ™Oi ô¯ÉE´£ô_±¼öwMìp˜_†—e‰õþšú_Ù ºÏ\¡œ»{oPE?2û"¿þ¶;½Sq°{AgIgÝ·YÇú&]w¸¨ô²A¯²=ãÐ×ß²ö›8™W_¼°£@‚*:}ò׬ȽßNäÇ)y`/D'ÔÇàpl`>ººfþœõkÌ_wãÃÇׯ=æ"–¥ìŽõ“k²ªF€ÇD&¢YÍÄgO™‹¶ðå<€Hm=î³·ØÝ\[q­ÚzØv·¾«îH£¿ q­î4ÿîˆɦ5FTŸ4¦açh’‰3‡|cîÅMON´yúNpžýÕ­Y=£/ƒ Mwïâäø€ÙV•—¬Ü–½’+Ùš›œ†3¢â32$GÇf¶žý¶â—ßåVVÕûΘ1òÓÿ¤¢­³»ªÆ_ê 5r!/3::…›)Vçg¢0zXÀùÿ<9ÿ¼pþ?¿DÿEN°Éiœ‰ÔI‡¯þÇchmˆxû_ðQÚP‰À~!},Ø,Ú‘µlñî”úì:qîŒYy@—¥Ú¿†t 0*õ2Ó>£!›'ÐaT¿‘vžNFýÝÈoµûÔyê<`'Ùr çøÉTyùpñ«ô˜Ó~ߎ“|Ÿ™ž¯°)‹³½ÊÐ .ÕÝï8T×XWr8€­ƒƒ+nSÿ»·_âÓÅ•ý£‘Ȯò›ð•cß eüfäàC=½àûáöSóÈ—“éÚÆYAÞN#GgØØ*]¾=ªÚ¸ö‚ü"àÄ}Ò²,¡\–™Ð(è}ïÝà«mH%wÀ7Žß=Ø]•é»Ãv,_ 0šÔj‡Ñká2¾9cö'­Öˆ¤Gæ$ Ä™×hN«Õnµq…Öà«åî¬L‰8y¥cGùÚZ9'N5?7ÁQáѤjI±Ìžj È4Ã}íð‡fJÿu¸ˆ¹„¤Dd“žFO’¹¼Å%ÇÎÃXnýŸ&6לkr=Æw; bf¨ äl û"¸š ì½€ çÕ)WéÔ¢àzÌÍp*m TN/ ìæµæ"-¥Ù˜–0@à±önQª…m‰[Ü!;*²ÿU/Þ±Ù ‹‹JqNßC.V&è ›õla¹çѾøúàWSȯg§=dïŒ`¨ˆ1ýÁLÕA…*…¹R{Z)ÎXêáe:E£wt~Îb¼ž^Øä.«P­;-Â*µ¿ÂP<úhn/½Ž„þ#\NÄ0—nݲlÉ…-÷î^¼xûÁÖ ‹ŸV;þ‡–Ä`”ç-œÕ“Z¤^˜ìâfúUXÁ“ýo1Íf]š¡:'.Í6-º!ãØñºŠǹ¹I&5á²bu…¿¬èÌqŽ®Pþ™MlµZ¥¶½‰ÅØm±X€e´ÙœŸŒh^>7¿Ìæó\k†8›Q2VÊ,2È‘»NíÈŒ$¦ç¦Lr½Þ»O õ„n0¯?A!¦ï1ÉÓtÕn<ÐàSl5Ÿ0‚©Ìb‰/£%Þ¥vh¼Ÿï¸ ¡¼0ólâunNW]ƒ¿®ÈÅ>u¼£”á6“ͨŠ·­ãdfiuá3XpŽæ¿¯Ãd×z4åCõü~5¿íønƒ›˜C›¹{¹ç|af¿°¨§öK®«¥Àï¹ _Ì*=NŽ™s®ø½ôåídkÂVÅÞ¿¾AîJpeÿ²U|„ªw(»ŸÃlÜ“¸lñí†K8Ÿ R½™Uüy8z«›{¼~—ÏÕØÏví­–&iÿH&ʼnÃØïÏ“tÃ`/üÎû}7œùêv†Jø¡Ž™¾5Ið™»/Ã`H=~ñ³‹­ü­…\÷»tàÒ(lÆ<–ÁšR˜aOEa>sÖ|òy’þþr8¢Ýo+ëã–Úò­Ö¢²,r>±˜In%'“SÉp2N&'Ãp¸NF›`$9•ìàæÅ0áL8‚|…\DÎ&G¢ï©ätrd ;΃#á«p:÷×}U#À·!çÒ·¡ŒwÿßÚ]Ř@vÂ[pÖµ_£ö~Õ ‡5Âo›FÀ]—ù×COû£àxæú#XLC§š,VÄÐàBzÊë´Ëô†ÿ@n/J˜[ÈÍ4’I‡› ÿoÓ6ëˆ0ëkË]Èw×UŠÒöG¥Ž—p5!µÀ Š8ƒèV×$íµ31n¯Ja/s¤E ‡àR…B.ðçöBìÁÕ/ü:o®›«qYòÒKVãéƒÚj_ç¨Ã±Íûã²x9œ]­„uëèpTðà÷ÊÑ_üíßî~ÊÿCiúÿæ4ýðßÒô/&Âð‡'Â÷qÃhïàVîÇTø€¸ÂìÚU¹³pµÙÂ’6ñ=Mk¯’ãÈ·Èɭݳ¯À¥pÏ—‚ë›ïp¿ïI©›לP¾¿$í–ú¥­Ùä‹Í|ÚO“Ùò=nÿnâ¯[¾ÛOßmøäس[¾K+ž‹ÆPr'”ÑùoÎ,&³ØùÇ3‹/¬[þ(¶çÂnè`’»ÉÈc{án‰ô<òØ122pwïEGè•ïÝûoÙx?è_ùûAìÿôOv\ 6ÿnãh$î\£ë¯Q ÄÆ4Vñ×Ó‡~æðŽ ¦u…2|ÿOýÖG`ÿÁïÏH n¨{à`¿üÈÅÿö·@Îý{ äâ¿þ#,“ðü |é¿åaÿ™þSé®V#F€–ä'´¼‡4¯JõoV½åªgtO£ú?P¾W±:xè­Žü¿²#…t^ÿ]µøwèüÖþÕ¿‹Ñÿi•$¶þ^Ûƒ„ª­¾]iF—]A×á´3T˜Iè˜Ç €hœÔ†€höp9|³,d¯•Æ¿í ©N,”yÒZ·xÄ€_vÑsÊ„µ©ÝáY'}ÿ_uWÖÔ•ö¥›;.Õá6@tLh§ÇZmµjÕÑ™vh«-nmUÀ ØZDE@¶†-NÀQ– T(ˆŽ‚hÔ–¢J]êÒiÅ¶ÎØEkýô{o<8ßwïM€ †1ÁÌŸ<pÏ9ï¾ýÞ²jÔ@_Qó¦¿N€S” ž8XâýNغ╌Ðüh-7‹Å }Àö½æ.ø$&§$¯ðrѹP%^¾ìßàáµ$ÐÃO¬ÈØZYÐö9(„r•/×Ô/ŒáwÍ(dÉáŠd#áIëâ|üðìexŽ?ž>)Á/Î]Á‡ô¯‚úâ ‹8Ü 1 <áÈõFÀíÇÓ›HÎH¯Ðtå©.Z q…ro:kÞŒ,äjJG9Ø¡-WÏÿ¬#Ì– rˆ èXÅg¥[Ýza];ñ)‡A´‘;-Á š]ãÓ&½;¹oµ*zKîzsÕ*ûw]»ÙÜ›¤ý†î†©t’­ý, ¦>û,=º ÖW9 :XUçiº‚Y^^³fŸzûÒ7§Nþãk¯S³Ý|¢Ñgá‰ï¢w%MÍÍ MŸˆõVß™mÐ'Æì«ìËìûÃX4@_Ù&bè{Þ¬f×ÃÎpŸe‘gØÏZ{†r |lÞ©³‘K™ î4ˆ[Û xŽmz±[ª;`)Ct‹âç\z®Ã6I‚¿Ðgp÷È~ݽQ½Ý=ÝtÔ AúÁ˜«.´²µSIÀ¨6 ÈLm…©=2]l.±›)¦”Ë ±ø-¨3ëÃèÜ]›Ì0+ÕñXÙœrë䃧¥¡gª€Ãû!§ˆ©. ®±P1‹’¸,^¿ØKÝÓÒÔ°ä0æ`2?»à‰Ä)ˆÈÚ™Ÿ½ £Ãý2mË*Ë?!>3x0ÑØFqŠßÕf’áæAk-|%ÐB©Žq€ˆÓŽP÷ÒøäÕˆÄC… xâ»+Û Pµð¸Ï¡ùk×lŽEIââÖæ%¹í®ýhG "T¬ ’Ì[ ÆBì‹)ïån,<.<4HÌiëI ¼þêdKbkó±žö1%Ú1BµfE^¥ÇÑÒ¢åŽÝaÙ#Q³[²Ž"wp«²|‰Št.–…àŒxçuÛáyúNéÙŽÿ$=ÛÞ'=k>Cò°™‘½¬&{n¯Ã|K]½”1"6•9FA+{ H™Ûô3qNÆ×@uð™P! Nïg.3O½·à3·Òä’´ýè úâAh¸w ÍEuyžz7qÎw¼„ʼnË)Gµ¨ŽÅ‰‹Ê]–õƉ“£`9(°„ugÌ»±/qíÁƒïktN5Μ~9ïJ¹@Eœ€º™V˜Ÿž?æ6úúï×îÄlwÓcW’ý`W¦¹=sDû à°N<à —Å7ÔÀÜ}w†{®ÔÇt ýš` á[—¯`V¸2¤l¿Z¹=#[Üó¦¯tM Iؽ\¼()’Á¹±%ÊO|§Féù¢ôB”‡rQ¾2WY\´´2L‹´¨±\{2-.=%ÔÂUE‘µu»¶Ø/ÊT‡FÅ%Ç aLâÖ­(#k'›ÖeçE‡·ÂpvÒ‡q2èï DÀ¸’ž|Páá}»‘éiN}{OºÀ§XWï+VMؤÿr/¤…ýôx²Ÿ†PŽ3Ùkå¼§—QÚS9€¬ç¨cçú Âl.<¯žë'Ãh§؃q‘Ìæ]µû*e[Ç@]¶­ö*”¹eæ(³P™‘–©¥H‘žž•*m’Ç(‚ädT?SÉHkJ¢ÔtyêæÉ¸ÖM/—°ÐÕÜü§¡öÇ1‘¢ËË¢Úß^+×þ¼Œj£°ý”ù·$á{Žc¾–bDz·ü«~ÂC›‹ž’MçûìUìòá}³ïÅ•úTÜŸg\Ü×@S™ÍP)³Ñ2S‘‘&ß g„uƒ<:-,•Œªàg+ÕJuâ°n¤]Ìf ²*Ñ8ì°U›¾Š>nŠãºETb"zä&ŽlÏV.gE” Ám#¤L +†ÂÙ«@»Ñ¿3õ¸Œ,'háØQgè´+¥Ò4žªîÔFPë8㚇ÊäU¤àŒkB4k\ÃãÌ×J~–RÁÈëf! yìòJ…ÐÉØË|‚¦aÁÚ5›7mEÅ&ÄöIЬ“Ì A£›!,²@—»j¤$v¥†ÑM¦’ÛzMÐvƒ1Ús¸tÚ/w,t¥nÍè”Ù`¾§[Gte½X%Qfe%1ÇHIÈ¢$ÀV>R¾\¯NØ®»;?Ý£NÎÙHŒ›ó,èõ©4CJUû¸2jÔ$&ú›iqÍÌŽ¿¤ÿÔw®Âz;A¼‰ß˺pÂåæpÂ,Á w1…ðPœpФÿDo3uÂîu2lß6·QæÜÀ7ÊÔl£ sÜ2qš4T›ê?¯¿o+*/_w¥&@>ý¼@ nÞù"[ª–ÏSO¡¨ôØÔH²ÐB /ŠEo–ÉØ rF<ó¿-Ûœ<;#ü4ù6žIúAïóÚy´<*5„\ÊþtYJàg¿CÛšv6îö]°"ô=$œ±ô< ÍE9Êíbx†¨¨çáY„ªtKQV1 ËÙŸŸ¼È"^ÁØ3¹ ÚÏ8B¢n„ ‰¨F ëú’šïñ)"ïpQc¢ãSZ†O  ¯jø>Œ™A$ýê«‚\^„Ó<,㳿àËþÂ_»rø¨.ÜÐ<ËÇSñIü"œäá‘DEú®¨¼`g0–°y¥œù3W ß_•°ý³0>Wýs øÍ$Ž­ÂŒUT1VQç‡G‚“. ÞÞÐ-@1|TQô,¹‹H€™¼ÎŸ ˆë\åx:>q x‰µ3×K1É0ý?ðƒ;<ý×®üf®{8Ñ*æ{ eitÄ!Ë…¾Ià*Ý<œyÿ÷XC/‡EËyOÒ‰ •pó 44°ûVоuü_Ý+‚†’ u-"o4ÇÓÖ+Âä¾â·›Vç{# Z(‘„¼…Þ"ݯL»ÝrlWcè“öZ˸Y$,eâáñø…UI‘ï‰@Û9Yƒ‡Æ-Þà·ÁïÃUˆ|oÍÑ+@¶þøMÕiP…X•ŠÐ–TÆUkIÓÜæ`‰à.œ€g+G4\_X1äájOÈ æâÑ<ìé ãÉ‹ÍÁ'a$ª[qs½DÄðć.ŸàCÅ‹è'x^öÆÿǃP|V€§ÀY˜Í0Ÿdn{ˆvzK/ß |WGÞߊçÓ#ðôÙ¥Þ?5ðŒrþ56-2O¡@k¿ñÖ‹#ÍÆ{/`ˆí_Ü’õÚ|qwÈÀV_Ü–=d÷E7A:Æ\ŒÒ€£1©b«®Þ£žÂ~¡QYÍfá¶6ó)ü—Sߺ@ ¨Å‘>Å|MÊ·u}ü÷ µ9š:Qèú„PDzwOóÆêg~…«Ã‹÷VªKöµ‰+nß³£é[¨u3ÒÉ|¾UZ±>5Õb›}‹x÷¿Å "Yæ‰0×ÄíìtUFçâûa– jÙ±ç‰çÃæ~ð¸Uõ:Ž4œ?äü%æÎ2X+ ÆË9é¹c˜]¢ß1ïE2SW/ûîÌ£¾Ò÷Þù)ÙŠm©ï½ì¦NÊSådä"á.̓®òÝ=®ÄC…ËCi¶»4cš` *æŸGœ)í#¨Ê^¬ÓM%öXþ Gliù=é 㯠õm¿Å‘ý2#p<çw¾ðÇ€O'° ˜ž£Bª1ý†%„ÌT\ò“졉”0…òZQ‘´p¢[wý”úqˆE¨6ö³vè\7ß(ÌXU]$ã*Îjq„±œE5ÇRXÂ`Q%BÈ%}Í`À¦âjGîvq>ß,ûñ»ݺ?®]¨r¥>y¼ÝnÆPmYŸ‰}«õÿ¹m‘m²Ûpý;180< úžójÆñ ŠÅ‡¿)8Ejž;wªòssYîˆ+®éY=( Iq0˜…Ô°_Ñ[új0·Ãâëf‡ì—½Àİr×jm®8Èn×f{$­·_›rÇ®ô3vÏRSî²Dw &M™É­ÕWEД)µÇ±1ãÕ1Œl“÷îñÐhäµ ŠnÜM›@"LŽè¬·8:¶:“tFÜWZômƒ6‘ØH›ÀPú¤#}·KïBc¦OÃ+‚AaÆJ§_ÁðçG„$G3®ÁâýþÚ\ƒ5¡Å»·©ŠÕ%b»Ý¼ÕYcÛ=Æ…ØôßtËLÈæ ô-á7Íõ öƒòh/ežæÜ˜~oo7†d]m³³!]Ç(;IØQîôÓ–çR {éHW#ÏE›5òx2úÑ(ía“l®£Y/Ù ¬{qõ.kÁËÆñø÷Œâ{NšÛÁpú•ö1av ã5ÑôHM¬Vr'˜wÁ•ZBŽ‚Åód,þwB’:wûxr/æÂô ,0!wg•õïì_ _YTb5®wW»ÿm»b÷o½jÝ÷Vê¾ûJ÷mØ'˜îç÷NǸí)j´í2 8² Î-6Ø'Œ³:Ÿ²L½3qÍOq·¥eÀârUyva($X¶­5U? +Þs ¿RÛ,ÎR©²TYd¿<ú$\ÍÇ%ÁV2'§KÙuéŒ>õlaÌ­§QQZº3‰¤®Ç„Ë¥a£õqÕGG{§\«ËT9Õåâò’ü¢=dÝ(‰ ~`µzWŽ•m{+Ã͇Æ–"å…ÃàÞ˜Û²‚9뫞I3’³™W¥£7&mÚ8z©énƒÒìÜÒfª3˜;f×;ú=c»uÏØñà;‡u—ØÙ Ú³ƒhýmj" ýwJ #\ŽÂ_ º°÷DyeÊBªTUBNLŽ\ƒÈÝ…••QÅÂCbC6Šß_ùÁBéq«Ý´œ–៨ðØÌ„E¥ªL”Èy ÑqIçŠÿŒò˜`ºùÝÏÉú.vóšzCïæ0Üc÷»pït˜~M0‹(¿­Ì@H)ÌNË”§¤¥'¥ˆVyÏóY—š”ÌæºÓ‘B™Fž'^ÇåŠÄô´´DabpR J"7KËí-¿~JŸíë%•J‘01%g›)™[|WyWj’ÿ>‹bý$6¥=ÑÔú ›‚©á?˜CS뇛 trá÷_´H[é™Q&ݲ(Æ@(}p`e:Á[0ÝHR"5ôðÓ%C/ +Q>dÈÿugÀë endstream endobj 92 0 obj 21387 endobj 31 0 obj <> endobj 30 0 obj <>stream xœÕ}\Iûÿ†°{kWâjÀ3ÁÞ{ïÁŠ‚Št)¡÷„ÞDP±"D銊 Ø{¯¨g;Ûõôn6Nî}ÿ³ (zzí÷?ç…Í–Ù™§~Ÿgž™ðu>ÁãñºèI\|$2G«!3Ý]lõ­]=½%Ü•ál7û­ÛtЩwOß-$» R~nÇŠÚÝ ",Nã[úd§o©%¾%+:¦jø±x^.oï ªj­Ô5-µ>jCÔF«MR›¡¦«¶PÍPÍDÍVÍC-@mµZœÚ&µdµ µ<µµ}jUjµjçÕ®ªÕ©=P{ªö“TûߊßÏð¿å÷äåOäOçëò ùÆ|;¾”ïÏ坿Çñ7òÓø9ü|þn~%¿–’ÿ€ÿÿ-ÿ¿ê”z;õÎêÝÔ{¨÷S¡>N}–ºžú"uu{uWu™z€z˜z¼z’zŽzAÿeF <ËÝÃßËÑÞA¦=b„ ÚÖþÚõW´gK¤ŽönÚ}ñÄÅÝÃUâ&ªm(‘hË$ÚvŽ.íYú‹ç.ÒÕh™¶®ÄMâe墽ØÔF{£ÄM* mçî¥í¢ú¢mãîfë(stw“Õž!Õ¶Ò–zHlñC?‰wa°¶‡ÄËÕQ*ÅÇÚŽRm{/+7™ÄV[æ®íèfãâm˽Ÿ·sw“i{x¹ãë®ø nj±»T&µñrôiã7.ž=GÕG™ƒ•Œ{¯Ô_Öv·ÃwÚºÛxs£yMfåè&Õ–IüdÜ{¬%Ú¶ŽR+ü^Ü”‡—£² ÞRG7ûÆ·Öö’Ø[yÙºH¤Êv9ª4ŽO»É¨­<<\ü•Ϻ+ïzÿ~G™Tâb7t‘£«µ·TÛÐ ?¶@›“Ií¹2+üt³ œús¼Óñörçú*ñô¶r‘z»ºZqµ÷’XÉ$^Ê“³%.2++/戭£›»LyÞÅ=@âf™k‹uÆe†µnÔ^ù¹ÀÆÊËÝÍÄÊÆ[&Yænïî&qžkë.³²Á—-°qÇ/Q›¼?«Û䬡òAC‰­£‹‹••²É¹®V6¸Íª?ÒúkÊ;çª^± 3ÄÞ°I;:ÊnÌP]¥¼Õ@yj‘òXçýËmê¯5>ºHyßRå§Žê³T6¹ii“cÕ­ªwÍora¶ò‚¾ƒ·– oW+oÙ²¦_fã¶­dºÊAê«Þ´@E8Õç&mI”mÙ*?U—%ïa«lÈEù¬DuÑEy§}“\š¶¦êl“3Žª3Vª§­Tß¼U” K•Ÿï_ê¦:Û¤ oŽ nÊ»5=ÝtÌ^ʧ¼U¯‘)ïõR~º7½KÖäq¯&Çîªç‚ؼ`†¿›ÍŠ…3ÜmÍò˜èÏö´[¬ãe¿dŽÔÁ@Wæh¨çí´t®ó²y¾.VËçû¹ZM3Ðtì m³qƒ{˜ÒÓbÂÐ^–‡õ^9ixŸÀÉ#úMÙ/xê¨þ!ÓFÈx~¢¢0óÅɃEY?œ®,Î~}¦ª4ç×s‡wç²çköì_¨-Ë{wñȾèÁÑý»+Ïvü@A !z&„>1›˜@ %z¦ÄbB‡˜H #zKˆ9Ä$b8ч0 t‰D_ÂÐ#Fýˆ¥Ä\bÑŸXFÌ#FˆåÄ|b 10"c‰AÄ b!1“G &Œ‰EÄ,b<уèB´!&]‰¶˜B‰v„1•Ð$Ú|b¡Et Ô‰éD7¢#A3ˆo‰NE˜Ý ✂&,1Ñ™hEXÚC´&VñDáK¸VÄZbáG¸ÖÄ:"’ð'Üb=Eî„-‘@¬& BBl ¢‰ “°#6kˆ`‹°'61D!%ˆÍD,JÈGa„7áDÄá„áLì"ʈ,"¸Oì NyÄ¢ˆØJ<$ng‰£Ä>"ŸÈ!2‰:â¨ïÂ~ãúí÷¤ìߺÿªƒÌ`:`뀲ãnø|Ú ÝA¿n=xè`›ÁɃO ¡‡ôrlhŸ¡×‡þ6L2¼ÍðGt¡3bˈ½#é‘Å£rF·=|tÀ˜…cv==®ï¸eãvŒ{0~ÁøL(ðóÄÀ‰‡'žtxòÈÉÛ&£)K¦ ©k§žœ6wÚÁ郧ÏX<£læø™7gÍœ5kÏì(5C‹:pÎQݹºt_ëÍÓóŸ»h^ûy+ç=˜ÇÎ7ž¿eAî cM^©?TßG_¾xÎbïÅw–´Y2lÉ^¾Á(Cƒ*CÆò¥!K —þ²l²›ËÖ®˜ºÂ~Å~ã@“Q&RhZfF™y˜=6Ï6h1Ê¢Ä2ØòèJþJƒ•¬zcþ«µµu¥Èf§­À6HÒK’+¹f7Ön½}/û ûÓf—XÇÇãN>N…Î&ÎÁÎç\R]W»¾sïvÛ]Û=Òc’ÇAÏ~ži^”—‘×>é`i¤ô¿2©ìš·ÜÕž…vbï¤ñXFîÊ ö»+ÉFS¹°‰^Síåv `'¸- Å·åÁ~ÌvÔ„C¨rWÍ ƒðøëˆÏn´„‚Ca1Ùž­Fî/§ñc l ƒŒÝíÙî$JÝP”Ä‘–ösBWƒø0‘ ñ×lŽMšûÁî„[ö¥ddŸ…ïäB®‹iì¨î–¦Áކ» Jவo%$ԦΣ¤àâÝ”êCç»Ìñ0 ‰ Žöë¡sÜÅ›ð?ëRã·ƒíšuKœ±Ìcþ2‘`øö»\ßdP¾‚ê<{ñÙïáfmVÜ&°ì Øã²KRjž¢†€ÎF ëX¡V`00Þn’ïPl]ë{ @ütc/Ô¢‘å2ÛÉc õÝ /V'Ï:(Þq¼$§€ìÐDŸAñ¡q¶t{ù0&×Á„ˆfirÍ¢Ð|6†‘hû ÿ Ó > gQp ŒÿÅ“P“ÿZýsQ]`û_$Tü—„=)8Œ£½;…6(Žú²GIäªbwIÈþw¾‹ãfÛüÿØIƒ €ý{Ã]¯îvw¨—àbÖ‘šÊƒù—ÀqPë[ºb-xv£ªìÌE-°;h·g®C±qÊ @£[Ô#´)‚H8ž:•ë·Ò+Ì#ÀOìíåihÁ+€Î3{àΡNåy›yE¸ûˆ1( 5t{v €$<I{óL1’"’„ñzˆÎs‡ìR* ’$Ê¥à}x³6a LåX3‚=Àô#,O6]àÒŒ¡QûûS ÷Þ9)ª8ÿ< aÇq7Pw‘7RgNî6Ÿm¼\j%v14wÁÔ·-¿ 7Þ~/nlŽNS1~@,&*rjSKÑVYU¶.М&˜M7™í6L ‘Æ… oÎWgWÙ±LM¡¥Ò˜ˆ±Ë˯ÀvסÚ=q#‡=a&ï°–$šD!ta¼ÀÂ> Ë%(“„UJÅÝ+?Ê)]O ñ[ÑRv+Ù €ùl\ªH#aîìÌ®‡q§ðå;Yf편-` xÏûhê ½¼ïDÑìQ–¨@ F¿§ÁyP뜶_„zQnÃf ô@ãš·ws•_W\;UTªA™_ºc¢ï:?€¥”…È- ÎÄäy9ÀúbÁ³œ®iShÌﱜF€Eéú{Ý/M83a4‡½ºz†®‹ÍÅ/ÃÔ±˜ƒ˜:c–;”_€× Úq½ºu[׳6Š#þ%èÃl-OØ JÁ€ ÷bûò%Y3Á0ÉÅÌd¾ž9Öº~4êø`–áv¯Î@~­‰(_‰¥—)  $%µ›ÀƵ;Ä0âƒ<¨Mù·'¦dåïIÝŠ@^@¢û† ø0àL×9)ìÄ“{b‚+Ê)Ô‰d[Q 7…TyX®´wŠVëÆJ±ê¤6!7;“œ-’û3¨#èk:¡ÿ”afH oh4 òÎ(ý@tëI9l`kêiÿŠæ‹üPgæå‰¹Hm²Ç¨•úbcSÝwÁÈ»µãÑþ“⪠çŠo`-Qjª²l~×Í.°‹ øn÷ÕW—*ƒ”mΚrÍ¡R*CñŠy…{ »QOË-‡Oöìí¸X¼rº‰ûhð!•¾ 30`’ï ˼9@s<˜d¹lºñlסœ"u¸4ñ× GóŽ—‹ôQÇ]8FK¢¢ÞLM‘%æâtĽ̡ü"ìtCÉEø›âÑÏ~xÃc§°9ÌxjkuB^rR6ÐÜ ÖÇæ®Éx+´ŠˆóÀr+ß¡Áó„Ó(ß¡äMj¨Bkþ«GÞ¥”ª#1Sݹ!§â!ÃB˜È@}ê68–U}´æhÑ}p–UXï²ßa½EÛ¡“õŠ1ºË2ÌèN¡TM±³™[˜mXêà¸(íl£ÑãÁJxž¯©•3ã¬Û^ÅêìzO·WõULµg5ñà´ ûAz3sî!Óï¦*»Û-lŽÝ¾f'ì)\·Dƒù`¾•ÙLZ ù+©¤þ÷oUFÀ¾Ca¯®‚gln˼Ç)ë‹æ40]²|î’ÙvH ¤‘ÚµI¯NíI=~F83xÞb‹™@SðÊÄ.#O‡ÍAo*&46 ¬’I™o±ÿþU§œ ïJ.ì Û°µBÁ3´³7s¤Øtj?­×H#ç}a‡ë¼+nAŠå3aîß=e v ¡.Rƒ<ìƒ:ö7ë7^4m„Rªi•T«AËÇ·ž]œøì‰ìá:fÈÄS3½B#fÿEX†oç>àdøÒé",ÿœœ‹øœ™/+6¬h`Á~ŽWTx⪒ð?*šozÏÒFo¬q€Ý`mØ£ÜVY·»å-ô÷Ój‘Æd=ÉJÑJ‰»0†e¶Ün{ ¯Nû&FÈ´œWÊ9¸lLòoÚ›I£îÔš Ø(,òÌö{í–U„Ÿ4œ ‰»°ó ÛÝã³Åƒv¬HÞ Ò4ó‹Ò«E‚“µ¾ÎQ±Ñ1â÷¸ƒsìp8½8k­ì²v¤Ü©>|hVäx˜p ÃçcÐq{IõèÙ†î –‹ŽÁ,R…¥20a 8‡<C­`}Î)?ÃdÚËÀéÔÑþv¡kB"ìÅ‚W~s"í<µ@h|x‚ GQ ¹!›WoIš !nsüfì°3a‡õEÙZ Ô3×(¥:''%+›<Þ½'ûô|2p·G®s¾MÒ@+Ú½§õ#v$ö×$œL™Q©AI!€puñ÷õts 5æÔˆ8wÕ³Áç³ß2He9áD*Ä:ØËÃÓÂb±n}À¬¿\ÎyR\+>xíBé}ðµÚ8†"*. ;©4Ô@¼hê€xƃ'ˆ¦ 7E¥¨aC…øpö³sù·¯‰"GßSØÆÈÒØùÏðKûñÙ‘ØÊL¡vÁ>œwvA}È9œ=¹Hé ûk‚c‚AˆæÒ=.W ²ÖnÜ!Jû)8fVMYÐæäõñ[×¥ˆOÁ ònræäN¯×;³zÅæü>÷]9(mÎ0Õk VÞþ3±$FÀˆ€}» ®Ê­ØuLÂŽø$FCbè4jà4©±ÈÀÄa:˜ ÆWYÂ6ÒŸ|±>>ñÏó5ÓÒÓ³ì5ܨàèú¸Mq›D¨/µÆ76ƒåiæÅN-/úü°³xVtìüފܫูôpŸ4ÄË ®IõØVªuæÈž'÷+Ü–­Žˆ©„ç æHÇkð;F}ÇñS…]QKP‰Ê¨c0§E ¤.ÁïêA;‹C<ùliø [ÂT]˜hd4h{æT&a’eŠ/Á:îÒ$EÛh¿à¯9é˜Ñ£k5¹gjDAº$&%rƒêrÎpóš/d¾’²?G:‡ºÍ`½VŠøÂ¤è­±©RàHÉö‡´J±8v°[ØW tPYƒ;ª†¼(Ä(^)Ç6%¢Roš¨¬n`MþÒÖpCéO¡ ±++æ¯aÞ*oáž…¿©:Ù ¶¥Pç©Ûh‡f hM¢Q’";²f½â5˜/ï‡í©ˆðal3hN±È¯NŽOZ»Mü–àHÜWáéí¼5ýà 8èÑÝœƒ'EGËól¿‡o*ÚûÖØP®#ß(ŠÃ–:¸.š¶ù›ã¶¬Mo»Éµ4kµwŒ7ðÑxy1luîÒöûD•ùEÇ·ÝÀÜ*bT™ý½ LáÆÜ‡Bãí±?C½¿A£íW³í¹“%œd÷¦àD¶ãzEGò=ᚢ‰ÉåàØTØKöì*¸Èf¥0A)Q‰ [™ ñOÃj,Óë¶Ç'oÕyþE²Tç“­: ÜQv¥Rjw¥ô¡ŒWŸ`oßp±o³Â—DMWÙ»x/—8-ú@²]’'Íö) ߎÊÌ58|XVGjðø¨õa4"QèÊøO05×´©WJAEIÁÙ-âªÛÖnŽß·.NsKüÚ¸­šT½»°}U€ò,ØÜás<È÷(æÂæIœÎs1 e‡Âßá.ìB¿¡«àU²%éb‡Á\†ÃTMÆýBãVÀqÜ!öŽ©(årv€“£ÉÜaûwíÞÇ©rCØŸ‹Sg5áM§^J.ßw¬[i¶Ì!46<&L<ý\1ùJyÙi Y’îk´&X< =«÷& yØì`obT1Bw™—ÁRQp•iþB0˜y-žG †§Ü!›G6ì<¹;5qW[k3–ïó:Q;Æ$pçæÜí¡»Ük™…¸n%kQ9‡ÜgbÁÅ5rït]‰ùÞÍ®Uܺ@9Gh¬,ÞŠòµl9‰FRH¦Ø·–ÝÇ=Ľ©ÃÙÃë‡ÉöïlP÷{eiîMºÇ¦ÝÓ/aç—lѳ®‚~òv=ã±Ø·Ê#Õ+e:g’á\Çé@ŸžtÄðNmmöÁJ‘à;óäé‘nwÁƒªË]Þy|ÎzŸ°¨™sÀ^Ô ñXu…ÚöÑÖGb€º€±…O\˜÷Äjú¸‘tcWèmá×¥a 0„œƒ:½}¿/ùåÔñ#Øv9·à²ûñ{-ÒÁ °ÐSg¥¡Å’Å6V€–&¥'ÅoH)Ãoa)è‡B2»crÜ °öZ"1^¹ÄÈÉÐ6ù¯a¨õ`µ*ÌiÓ¡ú[lÞìý1#äŒÜ˜Q(ÔW!&¡•QX’ºÐÇò–ôÕŸ6q¹Cöîõqã6‰qpí‹=XÝ¿nlûêÑþºc¢½G³®‚‹4TÓ»ˆxf’P3Q ìOÂJ±Ê±xDzeÌè!•+>¯r~ŸÙsHE^B­ì³!MÎÂ7Ý·Øn¶ÙK¹ëKkà F4…Œÿ3†„ÑTúK‘Š™ Iª~ ›°$õQ†]0LǃPgË Ä6õô‹9Ç©=fYy¢å£ÍЀÚÓ¨õ­i°Ýƒº=—«ENì¸.Óoœîidæ/1¥œŠß˜¿ãRÉΣà ÈôßdN£žhSYà°b¨þÔ™+Júæ5LÀ;áiw´å±Ï`9ƒæS»á\µ¡lþ3òBmI8›GÂ6øþ3Ÿsøa*_ù݃¼NÍ”{¨<{’‹ù&qäQ¹—_)d„@C'¡Õ4޲«¡á-ØöƒãN)*Þ¸‘æ &ìË{û2.¨/ù€ ѵ·]j(„jÛNM…jy°»‹„ð]ì¹ç™,"ÏS¿ÁSädÅãžVz±²{!3S¿Cbêûô㨆b­Aï©øê«,²þ†Uu,ìÒUð‚ e»0…i©‰ÛRJK2*ÁAúÉÄÓ¨êƒÚõBVnw­°{yú{ºÒ‚·v–Þ‹—j!Þ½9PóÞ¼êQõ¡‚ëà8!+^TB ^ ÅQwm‰ÛÊù+tV8î,?]]y^,xkˆŠ˜Ú"çc N^fSXñÝÉs·¸ÚÀn<öø‚AÙ”êFÂlÜ]7Ö nåÁ8QQØ$"†<‚ CÂØå£“˜³ìM˜ÉLd§¨…6*¦PÂÁsõ1TMÖŸ4§=˜¢1˜-2nôo¯À ÌšÀØHN»ºà7¨ö¸æÍ ÑÉ_÷Á¶£aÇ)wP[„Æ#‹•."Îê½9R”|ðˆ8Ì4Ì)Ô]º|¥+Fµ‚·fÎùkÁº¸õb85ÄQ“½ÁÀùS&‰ÏL\ «_«Ã¨â?ŒÁЄ‹l5œþ~Ƀ"gæ;¸’|MG+É·wŒEëPêLþÊަ®Àdj6šAönrŒZSÞýÈŸ©…h09“€›ÊV°•8ʜƿV^áò¦}.òØŠiŒâG*hÉþH©úq]«hÖ5ÈgSšÉÛ®`lr ýþ» –Iø»ÜE©°û2¬Ì#a¯éYËùìjf]FÜVìê«ü÷;ïðÈtÜj¸~kP— [f´Ú!\â«9ÅÆd ˜†×@¾»9r Ò-7ùì8¤6€ q©4êBEyÅ0ðŒ>¤Ce=…¨Œ·Gö'îN×¼±÷ð#ðð)“ä¹§;n[š²š ‹‹£2<%8²‰ˆñ£Ñ˜ÙŒõ6ŸlP S‹v¤&mN\—³GÔ±è6³;03¸†vÖóƒ8Ýd1þ°–ud8Ü8‘ÚT•Ÿwlóæ‘‘ó ‚GËOØ”Z½?¯Éulëæ|ÆbÈn®OR)ó'ä "Á°yKQk«a4ô¥Q‡+Ó`kH?=ÛÔŠö>)…3Á+v˜yK¢Rg*v:­X(CZƒÅîýmÚܵàЕЫ ZœUš—Z„£¬wí|‚“Šä>8ÿ8ûe÷ÑU0M¾†³YØ6ܠ؃Ø0+¼Wa$ˆˆváØú··ð›{óOŽû `öæ»I–›˜.³vÎ+©®¬¬ .°ãÐÖ¯x»dö³ÜýgØN¶á€  VíiÔd°ÔØo„²®²òô±t(Mù[K&R…iÁÒ¨˜5AblIÁý5!±!!Zú»­‰nRé?“”Wð¦m›ãצˆ÷B# Ö&ÇoÛ¬rCÒ}6…&¬Š÷Zwuc~Þ¶+eÐH¸¹bóæ@—PJ'À“·fÝEšë‰Ú±ËѼ°+*‡|ø ’*ã΃/Ø`¦—"XÉ ’“C)›qV¢öÀw¨P‰åi6˜“ÝÓ°1¡a'>û†mÅ„¹:ºLÀ̯Éß™‘‘_’~”Ó—V Gm{ÕvI±)^!2–ÉB]¼ç˜ÙÍÓi¤~Mv¼¹/åÜSQ‰> GSCàèãÕn¹ª©hµŒùMškáì4Mlö>–W¹C ;B=Æ¥GìÛé’ÜœÒüÔ@/kw{#Q{X tÜ0…'QÈ»á:nÔ‡a[î?ž\Î(ü•ÞŽõ§S\{ùG<ß=ë¶ÖñØ8XƯ ’o’à“j²Wè›"Ýè &妞é[TbÕ¶äR¶E¦´¦ûg®*u öPæ UN¼/ë;òp,„¥h$4g’ÎmÚraïñâ’i¹»v§5à°ìÍ.‡¼eÉóÁ80Ûu¹íJo¿q4ü–JyTyè «KíWøFù„ù‰ƒ<#" m‡Ìµ5ŒœFC¥Íí*Pê ƒ€f†2Œ&Pè­bŽjMÂRÊ๎ ¯Rh ¤´€‚ñð(YO/¸ì6±£gk.×~…¸D¦üäõf)Æý¨ Ô/i& Ð §¡oíç;›Ní…ÝÆV„]AZÄà¾`ÉËÂ0MÒÆí6KqçvÁ¾\ ؘ2 MÓ¸°S¸ä\9œ{„©0ºæñ ÀŽàת»?ÜzZ Ž…UÉ* ñ£Ðª¼ïRp³ÖxVîn¨èi2~àÔa¦\F•‹—eZ"~a™9ɾd‹™uÞqþÀLôm±ÈXg¾Ã4° Xnw+¤]0Ñ1™ ÜÚñxÿÉJåÁ°Ïo§7 9CÆí¸©5Î,P “vJ]ý>V×ÇÎMzÈ©ë]>y‰ƒxWà#} ûJuw$j;Ò µÂjÝ_°t eu™ÒЭ^8BÃV¤~¢ôœå©y9 Ak¥kS çR~cFEêJLt4uµ±¸LÚ?û‚ç¶È”è¬hï^ÂsTúkØ*á‡;Ű½&Ò¢¤‹=ݬÃéyëûmÁ¹ \ɺS\™œžž”ƒÃûwA˜=SùˆV&å07FËõ¸Œò!UFù*£|[•Cr¦Â°Íˆ;`g³}n·!`¬õ̉ㆢX"0Ìx¡ {œßŸqâˆH`º˜dCTó?Q‚8$®fl$>Ë=|ùé_/¥Ý(<%®xp¦ü¦~wêŠ÷Ô‡Åͨ`Ûf̨†·?AK¿ù‘¡rZå:ìÔë†à¾|Ðg³”hÓtåÌ 6Ÿy ÉIÙݾjî…³„ãàθa{øì5£ÂéP«« €5eqÅÔšäèm…a»c7€$úhuÕÉS»\®a±á"Ø•Z›—RhHëœ@Zu½LD¦. €!ðXï—¾ˆÖ§B—’)l{\hб1 ¯°2=oC È™Ñåa´ 2´2mMn·J°wë™,‡¾Nö H×zbôg»É<øwsÁÑóÝ ÚͲ#à2Æœ 1‰4l‡ÁƒÉuûOC‡ ¼ƒሇXD¹¥† ˜DÂjkÏ,K=ÌÜ$~‹=£Êüö™êìÊQ^IêIp˜¾f\>A¢Ëeº¯œf1o™ƒlǾ›ågj¸ˆ‡ý¾ª®Š*Tòámy³d™‘õN×½Çj-sÝi%7fR“Bü½¼¤¾ÁIÛ³s2sÅXd•CN3tΟûÚÀùÞø¦i.Ê—4ÏÑ¡õ“lØþ VÃI¾i<¶¿Ü’QÜú]JÞ§Ø[r)‰Qgó©Xö;.¼€ƒ_‰…—   l‹%ÅmIÈÃÿPï§gºÙ—fÍ‹¾¿¹‹sѶ©`Ðñ±°qr p YÐb&ÐG™ 4PeeË%Îú`!=ñ˜éOk²¯_í˜Öþ€mä]¨þVøá²:/7ÏþÅmˆ_4·¬]·5fé³ r¡Òo(Ão«Ùå´„cò¨âÁùphÝY›·®Mš9ÛC|¥®¾wÙ†L3±ëŠ#Þù‘å@óû{ÏKÓm‚Bc¢Åe§0U‚|ÒünAí[p÷©qªjÖéÕAaÝ™:ا®« Š÷”û0ŠÛ¿òÅÖÉ©Ç 5f¨^µñ¥Þ~Á¨r–8` S”#uZimcéà™µ³¼¬l¿ú+F`}Èh|óaîæÏ”7Na ëovl¸™en1_t#gllÞðäêð £8Cy÷"Ù3õžvô‰Ã'xìeø–Óf˜ßr`é£ cá’;Õ½åÒü¡ËöåŒ&êK…(%HO•'×ãÒȉ'¸9È-‡¹cÕ4 —vÿ`…s §å1 Ò ú ~ä% þ û5~ãfEWÂŽkôUNHÃÓð)<7"T×z–…½‹·½Ì6x°¤U‹ï.ï xÐV¶Î+D‚ÇV²ÔbΤˆQW*Ò3&ãóÑ–BâÑ•]Ç+EE{Òƒ ,h—SîÁíé‰9´àtv^ÒÞƒZà O‘éN¤~Ih¼Ë'¤ÓEù¹ûD‚K{2|$Ñ 26RŒV¢*Æ-%<d€Âí¹¥iP0M(¨-òÙ,ÕNþÞfÞtc¦cÄ+°Ö®žFìVÌì‘ó¹ ^ƒï÷Ÿ¸]q²à5¸Š¢òCóžÜ:–ña™í¢Œ™Ý¸j&ýɦ œû±ÀaƒS’ëÐ)ÂB’5d[3q‘`5X$–ö®³Œ¬Gà’Mû×0±[Àz° ”'É,ÛuäÀ®jPvnwãø fc ö#§Q½.ú‘œB]ÆúÇI€{ƒräÔî‚ó^ò`&,bzr騷JÔÒï'èüïÞKèô’ÏÆ°ÙŒ×v»­ÀX„:ú-º)¯{j²£•ÏR`¬ ¼×úo”™*¬™óüVºÿþR Y2fŸ.¼wAÿFñ´pH¤®Ù™ùäºpÙE9¢LU±ƒñ,ƒ%³W8U]=rô 7¹ÐÜÉ[q¾¨ª™/ªJÂ&¿¹/R– dé€é`†‡¹…c¹^îdЧ‘ª£iÔáÞ4¨uçfîâ–çÜ®áh«ÁÇœ¥-‰¸¤*cmPëæÞÅ€s}W‹Mí¢9Sû.Zi÷r9ÒŠ1oP¿üxr y‹š9€ *ï}•'ŸÎùóZj0ð4^f°Èy˜ œž÷rõ@……ð' êÉ‘§(¤÷û#²þÛ~ÜjDK©ÕZê’2‹ eirã6v<ì…Úpõ%÷!‚¯™dêz©Ó“渚ݠ¿E}³ 5á1lû8¶B¦h — ªÅ åÅð ;9 Ornz²¢U¿E¾C^ž4DÉMJ÷A ¨ÕÒž+m¼Åùìùj&`¥ƒ÷ @›y¤‹7Z}³Ú?6„Ò ÷Y¾}áäÝ$‘²Ê´Åî7¹/?ÿvþÄÈÚ˽½¯ÜºÝ»}…ê~zÆÎ®ãË…ì,&>%n#ØHß\thè4=§E¦¢•Ë<&€éô€‹~‚Ôƒ3owˆ†Qþ†6®€^êRpòà¶ÚìRqÞÞ’ô€®Î”.K!±±(IÑ*4 ;ÊÎp6&WvË«à,Ôc4qà,jÿÒõ@Fhš‡V íÞo`¸.€óà qó‚·Ë°-Ž¿¦êMÐÆÊ‹?оÛã›öìêÛ[°êŠx™g³^v(`ëÌ$R5±ÁÀ‘¶qr²±óÛ¶+¬‹ß(N­ Œ]…9¤{Ðöä]¿øs~p¦Ûv‘à—Š¼¬ÒZÇÍ 'ö_nÑÇWôÚzd{*–øÜíR G÷屫A\´˜½ç6 Y.)0æ7M ¹¢ÄÀY$ÔáBžçTê3ò”®b_µáD²ynu¼B“¬£œÑ ÷Çï‹aî`Z®œüâ_ªˆh§~>! D /~†‹Ó‚Óð {Ã/ü!û+SêQ$ɲ–¤û&8 çj±b±ž¤€qí½éPüæAÙíc¢Ãw<OìlruùáY™på¾^QëVÇÇÄk î˜çÆÄ9&ë K¥ Ñ9þ£¬…e+IÈ M& äF¤gúo–Œ¤g÷"•nJöy§†çrP•Xµ7ï𾇸²Ñ†b+Jª4Öƒœl±äê?UróÏÖƒ´C؀ϱá›È.fÐÄô…LŸ±¯Pg4 u>7ƒ_!æõwø4Á¹Øzt~ÔTX{$Ðv~7¹)’n¾>BùЫ¯Y$! §±šAó;p—gê̶e”)†²GS¹9Æ“pßß´¦b4&j# l\`qWå{UË,2?^fQû5Ë,zn¿K :Ã\¸ò#/NÿïÜ’/£û«êª4@¥ 쵪3M%¨5D‹’z4ìŸÕcÄŸ–Õ‰D›ü…Y¥†’4N²ŒÍÕ_­Kh+:@›¦"÷©B;˜‡e½QNþÂR ˆ…¼IKØ«Âmw Q÷{•:øÓËI?¬|õK]WÁ/dá9æ Uœ&ŠY ¼%"W»iˆ¸¨u!ôkj}zDš°I3.‘ÄOl½¼6=E d„%¹'ÒyØ™¼‚Š3ZÇvΡjˆbùU70™ _S{’#¤~‘Òˆ0qX” k1zÆ~Øÿ?ì_ï‡ì‡ç4óÃó±6FÚ}T~x¾Ê« ïg5©ÁR®žx[ŸÑ3ÿnÃê‰ÅÍWOtÒ½Ó³qõDu‘ÅåÚÕê‰Nõ«'BÎcJ)P.Œé*¸ùw.hχW›§Gì׸çÔC>,“1qTeôÕÌòª҂ʌK_ºªqÖàƒåUË,Q.¯fëÕº¦†o*Ž4-ÌVæïè÷ù;é†,3±«Ñï‚Èý@óI}þ.04&:Hü÷Öm¢VX;š†Ë-+ÇuN7>Žüþ‚’ìàt¤…XòVpêœæî“Ïv“ÏdÆëêŽaÎÝûÎß¿§{aœ8nsp©±­±™MYEåž=•âF_ÁaìËþ¼Ãh£MÐüaÎ?µn ÚbÙlâ°š,&jЈ(N#~ü—V :¢Aì¤æ0àï”Àœ~, õ¢xYÅÍÉwï†CÍóÊŸ‹_T «Ž}¹ 7öåkâü7r¾\}›}D¼g·¥ÀÊJ:óå…*_ž•Áùrú_ž¾e7‹ `èÈÕ:´fW|²ÎÏå€OËÕù™#GFᇯµ!Y¿Zä²8‰k)±ó·Ž RX暺c•È]VBö¿ }Ððó2„‡àR‡^'{ˆ[¸5>gf¢çäg—¬ÍE'ÉiÊdƒo8ƒJÁÕLÌñù-®aÃåaU üWÊên–÷9sµ–ÔÁ¢+Ž>P‡a% Ød•pp²SÔK‘•-§„™©õ€:1²ÜK¸%*m5v¦‚oÏ€cå%7éÿS1žÍIq ŽóË×ÏÂøp)~ReÒª¿tM­@;ãݰ¬YÇ?°fÚ-Y³æÒZž<¨ìú•2ÛáÛó £,¿YÍS2¯þTJæä¦dE»!AðO ÐðègK+e¶¡ÿ²×7d}Î:rËZÛª–µ¾Ä‚ÉÙÇMP[µ°õhVÍÑš£…ͶÎÅÖn•Û6]€rng*¸õ­CÖ·ûˆ½Ö·6(•+qrY'LJpy²@{¼ÑëàÈà&4iXZ ù¬¦Œ³ãà·oÊà$ºÙzó_ïæ'qûaøšèØH@‡¬Ú˜¼eíöuéâ{¬—ò›…ž„,0²ÑšfnY¥›ð¥Tñeø€»„ÆþÇåj0Çs5Y¿ÀrF§ªÑŒ£Ð6SÆÖÎÞÖ=Ý'owIqÉNŸt7ñøŸ´“à“;ö4œl˜T?¯Ì6}8³.ÐÖÿpÞöƒ@ð/Oדm&LÿêR{ 9o4õM“çÊÜÝ×&Ï{Ë7ãÏbx‘½Ä,D{ÉçÔ÷ìr%56öšB ßgžÏ+y÷7dž§5ŽOÕgÀ¨fó¿ÿÛ ÿ .–Ÿ&üWÅ'ƒ“ž¡ËŸÜt€‡å§q4ªÉÞ§eH®{6›ùþk¦Fþ¾uÀpÑ%-KÞžOÍŽÿ/K 7'€-Aƒ$žàpè{×|öŸuÍp<ý7Ø?-Ä0‚â)ÂI3PFYòÐgüÏ5ýP_ÿ½ÃßÝÓ?vΣ¬kY¾ëÕA•uûاWþAq½r\UMÆ4U‘ÚUäØ?¥"Çÿ´—ï²ÁMûtüƒiŸþ-Mû¼×«ãJÌÿï Þ]8Æþ<ÐoÌÃýq¼*оñùÔܧ·` å;[¨ê‚e¨¨q7Š!gÐÈÏìFácÞ°űuìFa”föçv£øÚ-•Ð|¸°¥ê´ÿ7~Ù×´ØÓ¯ÜÊ Ñpþ§FÜö¼pávÊ]x'àeÆV—¼JÅén4I³Ø9ïšù-°nx˜» ޶r ·ÆÚi_ù”†s©Ò Ü^oë2Ö¥nÌ¥a$µ_Gí}r´ò4ØŠü™\…Œpa}Òl€zÔ©ÿ 46¥ð+ÎP«ÜcÂV»q\òîuÿ¢nÏo‡Lqã*A¨Žñs˜1]ðbÁPƒ„9T6—H°¡žá?ØÑpßfR՟$JW%ÕÍ©¡øÒR~kÏcK¶4ÇN—1 )”¥ !© ÉSÌbiíEg™!ð,ô…gŸ£³øþÝò‘ïú0èàïyHÕFãfnqzsvSDÁ_ßÍþpöëÔ- pðk³`mád¶ÃÔ|5ÙjKùÓúí¶~õv[¿f»­‡ŸÚnK „³á¥/é8'jaPÝWYäØò¶›‚éÐ}ÅH‘:yžŠ²p°·\n.¼‘pþüæ[é?¿ÚüN€÷›%LQpý~ÂêòK>{Mg|"¥Ñž€–ø'íÌØœ•±Sœ±s[òñ·ŽÊøQ915ú²é…V?Ì„Cò3×n®Yùy¹¸:GÚôû㬌µ ;E “Y?1™g½Ø|‚M‡ê'”Zª!Xù)º…mDú_@6Õ[¿Œvm4ƒá¦þ:•ëKIãYª•i~ÿÖY‚0…pɧGùÅ»Xýû¸á ;ƒAªoCú¥1‘Xß×=±£¨ïí øRƼ‰»–qòàɃ{€{­smãp€k\$xþ¾}16{_2ºß>?º…;–¶/트ºtœ0«YîÑέŕD¶AÁÊJ„÷x¦Þ&5b÷£-b÷Óÿv?û§±ûpH³ÑlÇêõ÷iÝÇeC ï4”£„9Îå=­ûúig)ü¹I±²²0…}£‚ŒëîkÀŒ°Ì›ßÞ…‚ÞãF„»QŒ-o~[Ç®ÂNbéî'dù!YQ™`ÙØÄäý‚³£Þ»š‰IH}ÁÊÿÈN€p&›Ú,у=Ç»ŽØküÈoÆöÔc+S`@›p»ž™¿¡P´å°”ûê` é°mÇþÊÓ'ò uÞ—ð ¨Äªñ—'®'¢ÕPö¥uÃê­w‹&òśȷÙD¾hÉD¢cŠ3 ¶ÝÒÁ΢Á¶o¹•¦´í:KsB>¸¥xDî5V,éc4РŸ×)Ë ßp©ÿJ/k`CWº?Ü‘¿af®t•÷O ) HÜYyäø­|ñnþïlb|—5ù°fñAÑβmZæÎ×íýAÅfSi¹øg<–¶˜œúWvM‡;®9lå à'ø)kŸ~ÈOY‹üôúëü„!s…Ûg@ÚW2v\‹y /ÝKökùñf¹比v¦<¥‰kþw4\O|Â)ÅS_\¦hõÙˆAÕ(Gc.ìø,•1Ïû®­Uy6Áì–9ΙûùMÈÅ—ü/àºK½+°t‘ZkÚäWà4ís«J÷>9$nØR»9K¾nNAØÏÐòïÛ2Žú„_üw'¦µ&¦[X@ÿ÷—š7”7·ø¦«À¯éÓUªX ñÇÿZ-äÖñüaó^êêþµ¹èËš†;ð -0¼Ùrƒ¬<­ûÛŠBûÀéÍï¦:ý5û+ ÂLZdÿoŠ`^Ë>¥Þd_Pæë€ªèíïúÍ6Û–š õóˆ¯ë>.épåÖï¦)y’öÿEi\a³Ò¸ÆzÁŠóêieŸ|7„`åþ"Hã=Õ&š/oj¡K•°ÏÈTÒyRŸJ:§¬¼ÒSmU<çãŸ`ùÔ^×0­*nJ­guÿÄ‚ +lªR1ŸŸ×g„?ì¼`:tÆg>‡PÞ'Â5ùÙ‰Ç_ö5yðǟ̃w„œÊdBur.•P^X\¾qóá´(=½°)¾ƒ8¡æì‡|óÇlB½? ž8Ü2 ’M DòÏPÀI–>šÎ¨v@¡ü“w”–9R.¾\³§<§†n‘Aÿ¥>ÇåÖ—;< 5Rã×çŠÆy8ƒôŠJ×ûÜ~+»DÛØ=ŸÿÁø€#ïÅgÆÓQð!y.·Mô|x¦‰z_¥†Ú[#Ú¨ÜåZêZ°© C,׈ձA@Ó%09·¼¸êL¹¸aS0ÏúŸ.x.ë%ú¯0Ncí›ûå$ÅûB¡—?»Õéq‹cúåŸÓãfcºM ØÞ¶Ë—/Ô2ªðx”—¿Û€GºÊg ÐtLÊ«ØwàQ…ø‹7²Çú«g}EÊíŸùòÞ*qøú‚”³T_ S Oã¾=͉›öaÙñŽ”F{ã¾ù'åV•ª+õ\v¼×báÿ7sö°Û­iÆW¿ðí‹)ÐÝ|šçùá9˜×|íuµ*ù1=e_HO¿¿ž¶ôÄ‘ì*ÅÔÏ9U UuCw`—Çýkõ¬Ï|ñ^{ÿ kF_j9ÅRŸhú¾¿ÏákÞ'äLJVüøÇ4þª5‰ÏíÎö—ö Îû`;U¿_×ý=UÎвÙ^5låï=R:…~\óË ´O±Ý?ÃŒ¿L¥Ÿ®tÝl׆u³-0^RJ”?¶´»Å[Ò¡üêé‚ßÓ1W”ŽéþžŽkSħ•tDŠÈÏ‘‘{'ë¤"¤vK„Ü^õ BšcB¦güJ¢-¨5MpÐ?±N :ÃÒ&)ËdKÒà”4ÓL ’­aŸ6LjÛ– þÎ9¦Ú endstream endobj 93 0 obj 16368 endobj 19 0 obj <> endobj 18 0 obj <>stream xœÔ½@GÚ>¾BH»)v0ŽDÇ=ŽkÜ{·±M1Řދ †*º‰Þ{¯î½÷–b;½çœä2K†|ÿÿ,8Žïâ8ÉÝå¾ïÇ’¶ÍîÎ<Ïû>ï;Å,ÂM°X¬ç­}=%oìº1Ûsi3=Ù€~™V ¦•?Îå¼LX”°ÇÑ‚ç‰Ò— ¢ÔÌh2uìÅÉÜ/LætO  ðei¬Vk˜õ“×à3sƒY –¬5Øl°ÃÀÊÀÞÀÅÀÏ Ì Ú Õ@c 5(5¨1h6è648jpÊàšÁƒûŸ|eðÁOl6û6ŸmÆ~•=½½†½‰½ƒmÏvf°åì(v<;•­a²«Ø ì6v/ûûûû:ûmö'ìïØ?r Ÿ7äN2|Åpšá†‹ Wn5Üihmèbh(1TF&fê  Û§ÛìÙ;cÖ¬ÙëEbyˆ¯·Ô|ÞÒ¥KÍÝäæ˜oð”øz™OÅ?Â<Dâ@Ï és+OOs©§¹—o€§ùú]–ö[wn6Ÿ¾y§ùfÏ Ï×sËP·_ws _wÏ ‰ç s/QˆyÀ؆¹»(ÈÃWê+ ’Ì1_+1w5—ˆ=Ý}ñEž2wO1s`¶¹Ø3$ÐW"Á¿Í}%æÞ!®AROs©ÈÜ7È= Ôƒ¹=Þï% ’š‹CDøx >‚‹²I¤÷_±ÔßÑræ±g”ú¸J™ûJ|ñas‘>ÓCäʼͣcRWß ‰¹ÔS&eîãæiîá+¸Êñ}qQâßÑG•øyÿr÷Ùæ!žÞ®!ž’Ñr™ZùåýÌ{kW±8@>z­hô¬G÷÷•J<¼æìô t •˜ÂÐ|§h©¹…ùOïÐ×_ù¥½þµÜ"bžØ38Ô5@èÊ<®wˆ§«Ô3dtçÏ©«Ø5DŠÛÅÃ×Ë+H$Ý Rxyã&öðuw Xë‚ õý´pw 9¸º‡J=mDÞ¢ Oÿ­"©«;~}©…»ßdì·Ã£½›Ûk5z¡•»§‡o@€«ëh‘[]Ýq™kǾ$í=sëØ-lp³x[=VÎÆÑÇX;vtýè©{Fwíý½ñÑÍÝûåÒ£çY~n»çú±K;Éú±ßîc§ŽÝkûc6ŒØå„±à*µy|c.ÛUºyô%wÝÉb¬âÆ6ü+Ës´,ÑO߱Þ^Âc´ €Ñk=ÇŒžéýX —6ö°íñÛã:vµëØVèØ—b´`Éè§âÑMƒÆö>VF(Ó A£7z|÷ãï2zUèØm¤£ç†Œ~Š?KúØå!ý]GD®ÅZy»ÝŽu ‘‡ýÎõbO‡]‚½,7†xïÞ$ñÙ³Yêkµ%ÔÏzk˜¿Í¶ðWÛí²@·½kÍt|k–ù¾Å³_qZòÆ«û—ÎyÍyÙ›S\–Ï}=bż©Ê•ó§©V-˜¹zጲÏNö7•~j ¹â‹3ƒ-•εUýýüÁöjúÂ᎚á‹G:k¼t´»Ý?ÖSÿÁñÞ†OOô5ÄÄ«„±‹Ø@,%毎„%±‘XF¼IL!v›ˆåÄ\âub±™˜GL%¬ˆ-Ä|baMl%Ó b±˜AØÛ‰EÄLb/aA¼EÌ"ìˆÄ:b11›°'vë‰%Ä+ÄDâ9baLñ,áB¤1D8@¸éD,!# 7"ƒˆ#äDáNdñ„‚D‘@Db“Љ„’&¼ˆl"‰P!„7‘C$‘„„ð!r‰"о ¢‰PÂH%ÔDáOÔDQJÜ#jˆ3D-ÑG4ùÄûÄMâqŒè&ˆ*¢œx›¸@&zˆF¢Œø€¸E\!޽D+QLÜ&.G -ÑDTï—ˆãD?ÑBÔwˆËD q€h# =qƒ8K ]DqŸ¸Jœ"‰vBG¼G\#N‰¢ˆ¨&î׉óÄq‚8Dœ$Þ%>d¢•Šy:+ƒ•ÉÊbiXÙ¬V.+•Ï*`²´¬"V1«„¥céY¥¬2V9«‚UɪbUc÷_˪cÕ³X¬&V3«…ÕÊjcµ³:X¬.V7«‡Õ‹B?k€5Èb`dbfaecg`dbfaecg]`]d]b]f]a]e]c]gÝ`ÝdÝbÝfÝa½Íz‡õ.ë=Ö]Ö=Ö}Ö ¬=psÛý¬e¬FCƒö3ìFö7†Ë û9s8Å\#n÷;r%ÙG- ž¡ž‰~ö¹gýž[ûÜ•ç×<sÜŽq7Ç{?ý´NMX5¡åÅ)/¿Ø`ô¼QÇsä=xiÎK—øÓùÝ×Lü›±…ñM“ZÓW'q'ͤŸtlÒÉI÷Ìž7Ûn–aÖ;yùä]“Ó&·¼<ùåÅ/W½ÜýòAàšpžPca~Çœ~eÝ«ÜW'½ºäÕôWO¼öúk_;?ÅhŠõ”‹¯?÷ºåëySSO-úý´Øé§‡Í˜4£kfôÌ£3še1ë«Ù†³¯¿a2ç¥9¯ÍišóÕ›sÞ¬š»tîóÎóšæ‡-Ø´àØ‚÷’ Í,Z³h×"ñ¢ûo¾•½ØfqÅâCKÞXrpÉÅ¥ã—v,›¼ÌbÙ¡å/-ïZ!^9qåü•WVY­ž²z÷êº5ÓÖ¬YóáÚ²uëŸYï²þî†Ò¯nÌÚd¶©nÓO›Ã7·nqßre«ÍÖ÷¶mÝöýöW¶§Y¼hѱcýŽ›;gî<¼kͮ˖‰»ÍwgìynO‰ÕD«fk/ëlfÚ$Ûî°ýhoúÞÓvNv‡ìãLŽ8.p<¹oʾöïÚÿù~äœâ<âò±k¶Û·oÜ-=O#ÏÏ»^3½¬¼‚½ ÷oo•ϳ¾F¾Å~†~:¿¯üeþ·ôûƒV‹Æ‰öˆŽŠóƒWׇì–L—œ–ZI? M {)¬+|~øY¨ì¶$a ¤P g<„‚îÒ§ô,ZDÛò‘™’ÛP‘˜Ÿ'œ‰j ³â  @ž)(ÑjºÓ(-rS‘U‰ÅÑÙ ÈE)&é±ÚÀû"o 4J©…"P*Sx“¦Î”i @IÃÃ%~ !]ŽÂ)‡…p=» !/·"ÝßhéIGXgï wÙEô«ü¬ôÜÔ<@Õä(„(•{¢Uv‰”úhI» e>h¡`9Ð[–ߨÁŠ€­BäI‹H…=s’‡–tȌʃ”“Ÿ9]ë Ø¾Yp‡ŒKsûF[Gà;Zª¯ÒœZ¸Å¦_…sù޽%{5wûÛüöÈ•wZ ¢½r…Y¡Ù¢y)0­*Ó•ÝØ¿ØÁ.ÜÛMhï,Ú VPhâ9ÝÛQTß"¨®ÐU× F›jØ·“ÅðL>Š‘q'Å)PF˃¼ L\Oì¼'ée¦@¯ÍnL­I5Ñ¡#2ò\R‰ò+$„,´ÐÍC6ó_IH´KÄMªÒ‘»3äÙ hµ•­}ð98ÝäsdÞèPâËÔ¶  Ñ‡hüæçè%a¤ˆ÷Ä,ô2âìß¼ÆÃ«¢#L(:qW÷çý§¯˜²‚"úY\Ú}~— ¿Tóá´ƒœ"Rž’ ’å›×'¤Ï’ iŽ õv…i™š²Õš£v¢¹¤gƒ8Ï?;9ÃìUôÒ…Ðàh›¾¿I¸„,C¥Ž–‡‡¨ƒµÄúmøä ^¿yhpŸ­A­n˜­gÁ> +¹"÷`Jq,uBTŒ½†ÂLÐt]_v¸Ó k ë=lmN3^ÿHqëêÛJ ÕA%‚¢à|u1 Êu%å-ÎU»vØŠ‚…ÁαÞ)Ë©¥þï¢ \°.:j=ãn ´äÒô辨ýª³¯³§¿ô86 £H>õž|h Œàc QËåÊå"¯3Éd 2ù ¹õ D0˜—D3ÖdÌ«2°ØºJÁ ø:ù(Væ/Ãw3U—Eéé9úÈ2#p.½lÌ› / üD8™ÍMNމKÁRÏ4¨Ó¢3)^qvhhF°ÙŠ=vë­Üï9 û5‡K@€©³¿ÈÎ7  L&«Œ)Ê–s»“ò“òcµ1YRàB¡·Hÿâõhñ4È…;?«ù¸gPÐ3xºú"8 eíÞu¢"qåNªœ ½9¡Üx™\Ô "]®Ù¯uÊÞŸzYÓËŒê5G-…6}á À}_lîh¦ 3 NäϤÆÃzõAúù#Ðì-îÁll½y—¦b󛂣׸˜ø˜8µ§µ‹cD"Å»—0 $¥&§'S¼K‡Ðaîâ:—ƒm‘ya! u(0õRVŸÂv’wïo\| ÜâÏi›õpÜ£ÓÞÂwù®gôí›Ö%žùi©9À´bÔž)I°^½‰ñj-¹536—©_Hòh;ÆK¥"Q™´¦¶¼¬¶FZ„}Þ!UK¨žF¾z£ÚûPõ7cÞdÚ {û0n¢4:Z«Ç‹Ù¯±ÐË+ÛßÌ8+ü‚|ä®`/XÞc -¯zt«ôÌ‰Ì j‹½ÓºùGàx{”[‡|8e\ž….5¿Pk†M|¢.—¤lëˆí0ƒä‡w¾}×ú2¹"|õ¸k8Léj;ÝÛ%ónÔûYbîŽÊ8Ø[u¬À£ØÐ">–¯àj^Þ- Ö¤õ2òV\^ôÏ>Jµ’¡u½Ž\“…Ñu…‚nð(Úû¤#LtõëRíh8q|ž^V¬*4:}nºËT‹dˆŸÀuŠÆÚ~擼Fy:)_ ì)EQ‚J- ˆ ”‡S—W ï ©*r ©P œ(”I®°»ÖÚ^T]-èîæ,!yÉCú–¼…¦¸•QPÓ°áh#÷F[ùShC;ñÒ-¥ž‘–rcd¦jÓ´©¹À´šþª‹Õ¸Z5Ã$‰oEG/aª©WG.ÍP`'Og&!”ÉË‘UÁ‡«8#§¸ñh§‚[Yå:hˆÍ3ö²c1-.‹däښȨÅIcaðÒôF-0õ}­°à.I ÉÈ{c¡'®l•ž^¡gÑÁŒò*¹ IZ5u²:Q=囼sâ “ Auò4Íé”Ù)ɶdºo |u˜¤Å§Ç¥Çfɳb³@Ðh[áKðºIíÅ,M]:5f4—hY7°fó1]p-R¹‘ŽÂ‘0,ö“’Ö3 RK†§º§aaÓl -HhŽv¥'¦%¥%¥'™f«ÓãA%)a–뜠s=€Þ€¶&µÕWΟî«Í6Õf¦a–­E.*n{J^"PØ•* ›ãMè%dbšgTPìîÓÀØQ•ÝCëX=€?õ°iHçóÁƒü¢wsqõ(eäíø¢P0 «YlÒã<#ÅŽÛÖ€ À¡BÜ/oˆkeâ‘k£~›p V¼ñÀë(tŽDkßY WAÖæ‹í‚Š®œ>p‹qiª6úÿÓ±à2ÜDõô\ËË{‡I-tÈÈwÇ®q'÷G…«â³+ãêæˆ"¬WÄ¡R±kgàqHœº _dÔ‡íu·—’lŠË  Œ—D‹ç¡“ÅPªè˜‚²7ÉÌVeaÇ”]_…C­8“Qt¡WF|0Հ̜¢ÏmRÒ•ž©Ç· Gí$ëÎ]6ŽùYܼÔüT7äªp@LU¤Enãh-i‘• ŽPôg¸5ö*<Õ›£¨c{ŽÓ&Fº÷àôw˜øwçy¾B• ÄlŠ+ìBlA&Ô*+B[\t–€zc­ƒ…T^^Qª/ËHÉLÑ“sR²†ªn(묲ì$ÑœŠXÏÐp•/ð£xv=Χz:Kžð öf–„uš5á—onÇЛ8VHˆ ‹’¨D1a€ò5u 3°£élãz¨Ñ}xœž5¼ƒÉ¸Ê¸G’J¢Dĉ£Ñ´¶ š?ö»[´¦@W˜ËdòR ™Œ€NF&ªºçÔ‘>-†ÐÇïäå ¤›Že ²éyÃÆüü”\ê’óc±$ •ZÛ¡h‘ t%¡¥•Áf~äÏ®+jH5Õ¢ùJ².97“+**4$ !>J®Ò›ˆºäM hêR1žÜ•9d(Ьß÷šb‚¸hi ›:Î/ÉT _×’¢¨Ì‚,¶@/¼_ø™għŃxS Kôc„†ÛŒ—².ß…Ìÿlý*¿ =›I„VåD8 Qƒ*¥U FUˆ–´MSæv 6“ -;W£©,ï.nTO™Ve8HŒŽÞÃxe©–Ü“ª,§)˜IÖu7–ôêX‰x‰y“`Olìî8|’HK§¦E–€vSèFÂg=N®Úm¼ÛF ?æ[mœHµÄ‚ºAÆ¥ÙÉ|£­•L¢n Ÿ;Ã:†À†o ¯ä'¤¹*űû"Mƒ™—•š4€êȉqŽ‘÷üÞ†& | ¾°ú³i;w{;„ l Ûû[ÞZ‰Æ#¶ãö¥{÷—W Æÿ¸a {?.a°ç ãHÀ؃°ø`µ½ˆ>1A&ð³ä̘²”tÓ˜ÒxÈ幇ìée䱔ܘ¦åKMÌQ3šB?W’8š¶*+ÔHǧ$ËÈ ZyëÐf¤‰çz9\8²œ£åÞƒ…¹5ûuóråRã|CÕŸmôï†iz¸»ÞÜ…ã®Ðã:Œyw‡7\ã¯ô±‹Ü‚åÛ*4N€ë>mùìØ áàà…êk€Âby"z͘f1skp¤¶^“š™š%<5œM\µgh§2ϘºŸ__[Û€ÕØò¦Y´; öôW÷6 x³Zƒ̾¾Ù—¢×àKhrFo¡7Ñ^d ¢éÐýòPAÏ—BÞ4´’^ʯIÖJ’=’–ÁûdÞA¡b@yI.jjÖ44ë+’G_+}ì ޾̆[é·ùÐŽ[2ÒÒ5mšÄh”aê„0`Š<¹ˆ…Ô)É $›&d$e7tÄEv éuh˜NÍÚ¹fe¸BS(ð/—æbó¤Š ñì—ܸ{µúÀ°¯·ô¸ ®Êú쇜{ö”£gK™;OѳàÆÓ6üTEZX|P¤¯iœ,9Ñ4áþçØ½´îD:‡ÅyZ«á,ì§8¯ŠBn¨h=æ†ÇÎ l>ƒoÈ®Ñk…¥Eõ9ÍL0{ èá¾ó,(:φi°D[¡‰ÏC1Þ…DP¼KÿtìÕTúažƒ%9”ý´‰s‘‹äÛ˜^¢X=}í:‹¶Áœár-Ñ´âØî‹%G€) ä"‡‘O9ç¸ÐgøU.'^ñÑ7íÆ<—÷Ð+ü ½§ÀIjȧ}¿Dê+à•ú—ËZ²4©©YžKš€T³ì¬øX‘——WbÌô •Ýp¿—æaך MÊj|ýÂ÷Is–æ­äìÊbRˆ0ѬäJ%e¡u åeuu’Ê@á/ Ín²›pC„@ïáÈ;ä>ÙX¤ðþ´ PEFÛax|¸¹ñ:]²¾‰cMØM“ü¯5w‹Ô»ëONC¬e[ænÓ}ÿ¦€÷!"–†lž4óÎfÈÏß:ÿí-ßA4î#| ÿÚÞ o`EmÛ¿Ûj»ãïŸ-ë:Þ/àݼşܻ¥Ž÷vž¹Øí¼ihÿOAB‰I h ía¦°Ûa.ߦœÁŽi6½&³àAz=_ÓQt3ç$¨5-“•H%2¹4B;£xžMŸøGÆÓ¾Ãõ¬Oà[Û.øêbÚq+ÍâìÂ_#,¦9¡º›6¬aOØ'Bùаàˆîâàw7OÁ šQpé›ðÄGÏÍŸŠÌÐø«Ë q¤«¨óÀ -Fls4;˜‚'à0„'ÆDLj$^‘Þ€Zíx>w¬èdi•°X_™W ¨÷{¡¸1Ò£qk¾ø ?0$8 ¨2¤¶¾ª²¶>¸*P8ꀡÝ8é܆ž?¬àOãêá$Î÷Gfrëà~Înn ÚÏA¦ÜúÑfãYkhÀ C“8ˆ²þë‡8ǹ0€'áãÌF=³Áâ"ÜÍgΛÄ-Åe2©³‡XÌ'h$ÉžqÑØ¼¦B6 N¦ý|þú™æìÀ$Ù‚ù1J\xöõïš ÷›^I'ñ!›ô­qÑ.Î¥ÎøZq¢¿`_q¸;pûŠ|:¼jEeÊ+îj&ßHµí—|O)ÑDîI¯®è»IÔ¦÷Éëùõù-µ5ºN0šb[¢ô!b=w™‚)ä]u¯kñ[Ú:‡¿ähx%èGšš.RÍèKþ§»KÅ`ØêíµRÉ€‹Þø|NÏílÎ<°ßþ`e×ìÙÛ\QÞT/Õ{ÇÇ¥¤Ä â’¶öTl|VvcMËáVæEÃÈ6ÂU…é¼åLçKMÝ'Ñ9Ó9ɯLÖúÎ>ÿLç6ú6Ÿ'~RË«ª†ªXà Xð.á[W…—Ïn+ODô @¬FôL¿U«óÉqpt·4?Ò)ÇQÐu.| ’‚ùw{y"OgóE‹œ€Ч²ïã°áz¤>®æ75@ŸÊŠºx=&9 ©’Ê–.ýÅê!sïpm[S½Y&HKÉJ(ŒÌO¨Å¶]:<]Ϻw ¿E«ø›JBë˜lü ¼'«Z£»¡×U÷F·o”Õ]*¡òÈ­)ÁñAò ¹Òì¡Ð&l”K·„_+‘€MÂ۪ȭF^#¯Ž?ŸÂ¸5ff£š•Y­hü—ƒf"g+9ë*¼¢g=¸Ï†=L¿Í–¹™Ÿ™—‘‘V¢)ÎÀ¡oiŽÒ_Èô8ûÅJ#b”1ª$WFÆÖjÉ©¹`€¢¿$±Ž<¸÷ ý^ƒøäâ8ïP 0æv¤WñQ@w(¡P ‹Øfû[V—ü8ß¿ØPY\S_Z^Ð ©+VC+mÞ¼È3Û¿zÀ3ô•vÀbÓÙçöüý“•çox‘ÛÎ 7; ŽuÕ]Qæ™ø»‡b³eöÖ;ê9QÙZ¸ªÏ¤¢SŸ?”ELÊãžQ·^j ¾©¯¯ÉÛÁÊÇe©³€§Û´Žq›­m´Üç.wÔF˳·ÎÖw¿3fߘiçÙTüóÛ°W¥OÁçÏÃIçYt==‘?’º•Nå¢I†c?˜ú»I—_gÁS÷Ù´¾ÌÌôÚ³k°X.\7|øiûMpÛô›e·^³Þêî%ð÷Uú+6”&˜t|ÕÒp PwíY¼ÒiÎâùB´ íæDÑ“˜.úÒw¬oÚÙ§7þ³ûýÅ÷jÒ0UÅpÕOä͸Þ1(}Œ¡4qxÿ’¼,¬¡†Îb]È ÙšpY0X2º½&4p“œŠ&ϧVeÕ–Ô–hÛ™~ ¥Ë%åJ·èåå* ¥£¢QIpÖ–Ô‡PªQóéL¨àœÇÂ_ëIz ²Áû¬j¡?>ikïx^5æ]‚oÀ÷ø'@yrEÌéÐö=‹÷l[+×Tx Kf`‰RæÓzùÖªÎ~agÕqpˆèª/“å;ë(Þ½Ký•­‡'½³ýè›öÎ oA XºK›hÒy­·ñ  Îõ:[x+½CB„"åf c4© 0 0 ×:{9mXè3mÔ*ñZg|ðz§cUèAÿü"“ågDÍâ’ Ñ7Á7àû‚w«Oל®k¹z¿lÜy> 7»5<ÊöPD€0–©È™ß/×ìN Ìiûa“ªöâüzP JŠc>ÜW׋­y}ißY\‚eìð[=ÜXÇÎýPÿ &Á%ü¼ Å­ý}G(,m,h -²EZîÓlYn¨77îXâ^Z_Q\\QŸ¯,F&ä€lª¡¯nðä€í§Hk‰µ@´]æ vHq6ÍÝÆè'ÿ ŸõSHeÐC¿<í,½Roo¯ºeÌû”€ü×éÝÎ\tad7g;lBËIÞßnÁå¸hËY>ŠãÂ8øçaíÁU÷Ùmh#ÿú@]Ukß•÷›G{XàK^_.xà6\¶·!*Âäm‹jŸš5[òVƒiàµÈ%â"‹@ïõ»G•tž>ö NÍüý#¼”¨”HeºW'jjÔ× 4Å^‰º"ˆëïKì„I<ÜÅ÷ ô/—ÔÕUTÖÕJ˜Œã?w,Oá;p×›ooÙ_°sÌMF¯!g í¶*{a‰OQx—çl$4äÞÔi¯¾È XÝÚB3ø*t>§<'Ê›z·6Êe;¿i[˜O!«eؘìvÓõ»Bšù¾g£Ž€(hõ.|é’9õ0]®pÙ°?D* •†V×”—UWKËEÌP”1¢B›vö±'põ‘c}Œ«c~ÆËþÄÙÌ”Ãþ¶ñ ™ ™¦Iiñ™±š˜ÓÀª šäLEiXI< ð‘•nµ>ÂÛœ¨2Qb¼I|ÜšÙ.;pÍ'd$fe¤¥ffŽíh½v†‰èb®m×ÓsêB°kÅ1¡§Ñ7ù>\g4ÃóÉD¦ªÌЄY¯ 3›b›ZwaIˆ6²5ÌÍ4iâB‡WW¡M.6k­…5Íuºê¦Ë‘Ù&{×x‡X¦S’ó7ØcR⡬Te‰®ªY\稢ùèk¾C¯¬\¥¾ønq~r\‰`üãâ[áVXÐØbplÔõ1oö𺄵Â2 lM“§R¼wÒ“€Êl Xlí°ÝÊ Óë ¢nñIË!û‹âë ”¦–§v¤L+Å׷ܸ‚#áÚÍö°HF’MœS¢rA+“¡€¼ôá9+¨RÆMòJPF+•aÞê€z Fsy¥9éG¸ÐTFäϧF^™Äß´ßòÜ#àM†v—°w©ÎÝhÏü×ß|Í>ÿ$¨@ljO€O½ÿ?ܪhQõ%‡°B˜Ú¨ÖC‡J£‹wᮻƼsõô"þEt“ ¶GGZ%c- Ö’V‘…àß½O~‘™d+DÅL&:fGÂÃÙÑà,µ$(åi‡(ÞìÄto_œsP’»š×Í=éõ™Å…Ýíu½ è"+|uâf C©¶¸¬Ë¾fÕêÝÁÞÂ@·h¯øåÔ&ÆùÆÖˆß+i½°¶ÚTÝ»‡ü’~†^äÆ^Lj-ÔÍN¶–(|R©¶Ùª:@Õ––Õ²êX‹ž[=½&I“e Í÷C‚«GÓÒ@âRâ“beQ©J@Ùx:yVK:›ËµýB^ؾ‹ªn³Ð[ÚÐZZQÖŠ©ôä´Ä„Ø„h5ví>J'à|²·UWÀñ©™ 9¥Æ¤Ž#Q6ŠäWÔªcc㣢#…¼j…**>ÜL¢Ð–U”4b~Ÿ¡8jdkpö56\€×Ü»ßZ~ÊòîûçÏÞ½³ëÈ[Â?þ@£Í«§Y~Y”0¢6¦´S½5µÝ úèœ&hÜÄÌ'[,G¾Íþý6VÝÎGôö9²¿×Z˜êËo® ôö òò ªki©«mŽÿQ‰<€q2ö_û„`ÞŸø‡ö!fZœt=¹ÚèÒ]h‰óeýÿ:ÏûãCT1ê8urPòÃüf–*ôQðh‰Þ'ƒ2b/“ùô×’6ê\pQ— i±)щQñ¦²UB Hête&ÅÛ—' Ê’˜íN‘G ‹Ú#qµ ?›ˆ,r¿+ê)Ë—x"]AL¹™d¤e2ݰËF€wq-;qGìq8È }T8^€â:8¡VRaÞ/…/ó† 8‡ï¸ÑC¼¸/½¢.¬=¡!åkŒdn4ä;žŠµ€(z¿/ÅKoô Ìw0›»ÉiGP±¬º¦HW›"L)æä‘€ô”ô„êúò.Pt1U¶23 Ešla²ÈÛÜÙÕ ì2Ý6°ÿâPSñыަ½MmaÇÌúAgQKCu…®¦úÅëF?äï,¯¯Ôê¥Pòmþ^^í'k*à¸Á;‡ù™T¶‡A¹WÚÂQ'ìßüv NºÁþj:_“ž“šLÛ´ê`q˜Â7,"=G$TÔF•'6Ó[ »ý«lÔñ)Éjaå9ŽCCV ûk«¡¢ª»‰+pwÅÑ«pOù-æÃ˜·ú}vØ–ïÌ· "f7@åx׉ˢ²ÂõúÜiˆ³ò€å…¦š‚ÚZa__íU,î Sò“J¢K’ªÀ!P_ØÚ="øiªI?÷Ôð›übyALa\©:#QˆÜ1u£¯´¦ëýž/Ö 2Óó²²3(ÞÉ{ðct•?kÎkæ+íºxÿ6c¯ûtïæ‹øÍU^v¯nºÙ_R×~¡éƒž~aA¡>§„q5Ì%¯¬8´ëÒÝ;.Éñ[+½÷>¼¤ópý‡ÂÒj}~9“tK‚Nƒ,˜nè@' ކJ:¸¸ã£Ø£cÁÄ{l¸nãï`Æá*·0=—I:r{ZD VÎ×àÚ´ö&©)äÀeh*÷hÑz©®ú@ž©í•’u¥Q2u‚"F!D†HŒž…Á±E EL˜¾$»ŸI„'ÊȾ¤âˆ#Ó?GkMÐw¸œ«QqV£uîä/}üLÖŸïÜgÞTŒ~:ƒç|YZSŠLõ‘ù¡Ê˜¹\€¦¡éDMüÍcXö  :¸Q¿ÿ>iøáì6Üûùªer‹µv;$6Àxx—K›}NHê“˧ßëP”„D($ª¬(­B˜¯ÊŒ±”ÿ¾@Ç]އ.ô©8"¨9«ÈJí1ëÉÁÚÊŸåàÃô¶26,B3øðÀç >ª¾Ty |Õœ¤MêŠÐÇé UVTRY©Ð…FÉbÃ…nŠˆDïp8³B7”­Ë,¹T…´L"‘†JÔ™ L ·Ë”¤Øú¦*2܊óå™Ñ84QȃEEÊšüÜôœ a‡¶8£)=uz¤u`@åæô<˜K¡T Ýt[=Œ«e ð«+lz=‹Œ¸øôúÔ¼¬3º³:}^^aV ò³â’’’â… 1I1 ž’—Dè+Kõ•mžuû\]¤žÁO+…cÄk”9WÀln²2zKJb¼U‚­©­Q#J¼Ç–Q1Yšô´Œ 0+/]r¨2Ua¨X& vo ê?ÒÞxµQP¹øí ¸#µ û˜;åç¹z<¿‚ÿÃ_iÃq&oæ ˆ'õuÂòÖ!N¹Ê–ƒÝõ£nψ,òñ~RƼ,=ÊGÙP¾Ž,Sc·F——”ÖW ¸žbàO¹4øuv6•jü ¼ <4 N——Äd*iXd”,"OY%„sfr~nåBzΨÐi6XhYˆ$ô—ËÜ`rÜ`²'7XQFsz꨽µâ|û”¾éÊt×¢pMøèÉŠààbyy^If¶NØY\’Ñ” lCÂíãd  ¦$e¡•ee¹ Åq:AøPb%8Ô’¢MìRèbKòU^\RYQ, Oˆ“ ]#”I¾Ià«Ü®úæÀÖè¾ÔÏ›’Š’:1õ ùÿG|²B‰á8:Æxz)Ì,…ê2˜^jE…KŽF4æýž/ò/ ]>px÷€½ 9áŪZPiÚÕT{ ©F%OJJJHDD©#@¢—W7èôG­»Ö-±²_o£|{«@ŠA(Þ[ì6¯ÜÇ/žu®ôÔ>ß@[/_üÚ™š,AQ¡¦Ra%â©4Àê¤óí÷¸y@V·æœ€7<æñëÁ!ÿ>§&_¦|ü¼<=ËOîø6E•ƒ:ª½¶¦]ðOÃêé­ô߃»±| $™~8\ãω&;å;•z ‹ÄÊ&ñ:dnÒÊ=_hŽ(OhÆÁï‹ï¡p@5 iFTDæ”Qþ»øµÖyÎ`;…(çMk|¥ùu!‚°¾øXÔqp‰ú¬ÿô•ú2upõ(º^ÅÀ¹1üß—‹ÆOAã¾åørá´œsšû3öLŸfôÆÃtø"<óÄD7$ÏÂ#gYÇ.Âþ‹ìPHð‡ì¿øªKÔÙLûA{A{ÍW3L†f}QÛ›ÛLÁ º1¨û‹¯LfÌò¨öÌw¦ÀO½?hÖ&öŽ_Íròަ`_¾W­+7Â:þs›—¾µm˲¥[/¾w÷ü…»L¬® ~¨IŒÀGÆ<Ùðrø:ßv‰#ð>zy]p_LkâûÔp“NÅÖJëEíŽåöÀø„»YÙu×ïöÀEáàä´¬¦xIÈôÞl8îbgõÅ6Ïns]‹ø´Ùm0ØyÔˆ+ìå_ë\‚fy½èy‹Í+ÜîÕ ëK˜ L·Üƒ&ðSß«î<¨¾F7+¡˜Ä:ág_ù£r|Ô Ñ_„Ë9;¸ˆi†&.÷-?“Ü~ø¥2™ŽIé>{þøyc^/Œ~‰ü§f8§Œ»:+jtÀÕ'$OöpȯW‡ŠH4m‡5š¸¬|O¿¿°QR{&™BÇ~« ç[iþ¢ÿb­RØ[[ZRPœÕ‘ŽµÐ–Ñ™¿ýv‡ ׆k‡ùÕF§îÂïïû ×öµ»|`5:5éuº<×ÔuðXÓÞ…ËݶŠ’cA ˆÎI(O¡x•$õlBf“Þ Ýï*‹Í.K$—%—Ë‹Ci°,LìÒxì›;÷!ëhè{“п&(og>~¯ë¯NúdëÉ×6ÛÛ ¼böƒÔè¬Y i¯cbb#úÕ¯y©ÃÇFÃá‘Sáä¹äÊ â“¢ã£QòˆÌÄogT´K<3Œ:’¼J] é’’´ ¬âxÇíšC&pšÍ[£T»âÉ&<¥ŒÖcÁñndŽ@­ænKLÂø:ÙªÕò¼ˆ e¦ÛX„œè•¨T+#Â|b,…ØPÁ-ËÎÖ Þç© \U0—9€Bøp¼ÊAWGÓ˜µGÕGŒxÑðȰ_á%J Ë’åHòMxkò¥!Y¡föÀÛ[¹ªåæÕkËA>(LÔÆ•G›ð¢Ã;µ‰•fG@m]éMÜ‚ßÒ{0¦ÖÑ^ü5–»Ö®>¹ëÆõS§®Þ²<¹j4ós? “‹oþº«¤Aªû­®(Ñý‰³ÇÃZZÐâ#pÆîä»W˜!òåôN>ŽïÕ€ŠNΪB’<ëÓ°q‡“ÈCQ¨*)Òæ¤1A€ %3%dPyåùeåJ± œë'–R¼œÈè˜ððIîu¢ÎºšÂºFA–~T5— 5åå2âƒØ¤¸Ø8ElTR$ ÂúŠªRíåJÆÓ=‡YyôW|xö0Só¿táþýÏwáÒI]0„_/¾º£Óó˜•iFB~d*ûŠ·«¾&e¤€øœòzmIkOmKe( 22âÃäa Ab¼X‡Ÿ4)Ù„É6Ä'RgùŸ-ðŸ¦kf~ oóÚsÈ÷‡8hù£1ýâŸgb†pŸ4—f“ðÍ9ƒ$zs>®|ÒÄN¦r3NÞÂЫžÍ­ Û ¶ß:Õ*ˆ›j§‘èD•>²~pôÈÿ;“÷}Xù‰Æ<ñÕ'Õë/É>žøŸëÿ ¹Áß¹?ã™ÿt‹NUuAŽ~§ÐÅG¾¼EO9¦k àîð•ìÔ‚½çp$e8tæÃ3-–9ÂâË\ IÐĤûzdûa a2zqßY Ç»]\.,¾ÉA‹èµ|d‡f£Y£af£ÙÐ ÿ™ gCkh…fÁ7ÑaŠ+oODæh1ZŠ&"š‹æ!c(€Kà h 'ÃEž4¾Žz‹dÈ_9q$åIGÖ1GxôÍð?˜ùŽQégŽÁõ7­ß‡/ó~vƒÓøÖ0o9#Çn™wù£#$zñáÇ1ƒ›9=ðÛ_’sè ~yz~Ze\QŒiµ²0Pnb±›,:£(T /Œb´n86ÙþõòƒýÞñÛƒÚv— ytO}qyͤ>ÇÖ];<Ä›½•ò†]A+0m*“z‡n”üª? ÖnåBáè÷?Œy_{Ý=ôuÕ]cÿWÞ«~gØsîï {ÞøhØ3ïYô€~ïçViQíGllž¯òOì*wÓ®µë8âv~þÍ)h2ýlœp¨·¤¹Uxä`Ógà p9âjÀ™Ð^y…ÝàÇ&~u³ííê|ò¶f™ºJÆ4©úýLѸíœVòï˜&#Òyój¯ŠÎP¡èPÄeþ:pæ²à±A¢àëåï}ùµã;Ƽú¿`œè¶ÇƉ¦üã8Ñm¿7N”÷Zø£5z FÂ,†»öŽÐÚC{ükÙ3¿ #þ…ÿàýŽŽœ}|7äÁeO‰ÿêùôjÚíi±é)xí<‹ÞvžMûàà<¬gú·q͇z#Þ¡ÿ©ø¶/·°X¾âÌöÛïœ=ýö;g– } Ø[îÚç°ÛjßЉýCÇ„ü­Óãnü¿æqç¢3pן¤ÿA…ßxš·´zsGÞ½¿` Þ„xèðT­ö_eÎƱ=fIƒÁ’ü|ÍŒLûSÔáMw€M4°{ĥˣ©¯{ £x†è~%©¨ß‘TþIRçaÀؤ‚º‰têù‘T.Á懓 ž‡ ™\ð3zmÿcè…+oü–Uøo@q1vŸ&XF±‹!ó@ó5Ìî1æ]ûËÌ›ŽîÓ·þ8Ò˜ìG}Ô=¾øIõwð"¹‘?¯bûGÖ?™óhýd»Ä™„w{øh* çòÂês³;><ûô¥P N%CþC£üAßÙÐ×ÿ`ÁC°ü¬?Ÿ°á „|…F“ 8ˆçÞ¿wêdy'4=cÛ½ÒÝ'J*„ÉÔ²§J•IÙ@uY+–U¾®¶ö6Âæ)Ìz´tÔhõ çþ]&Ì€nÿøègÎØþeœ¹Á˜ûß’ÿíU¨Ð7ŸÊ߇KT½Ë4ÔÃeªªÿ­eª6ýÆ2U £ËTñ&Ì~ðïšä_84ô0ÌÅŸ“³†§þÁ I;–«\wÓGÝ—>ňÿíÄ£¬0ú·÷º%wzˆ7û*åuÝúÂ&`ÚR&ðÝ$y¤•0ÁæaSrsìÃc& àž?ªÓ1ég;öWpÉmƒçÿè1KÙ;à`dëXc«2±aò:÷©+.$«“KR*.Ût¢?Áy ²§]F ˹)缫¡æ¢mü*¦ N9ýêLÿ‹ {ݼó4aùæhp8Ðã¢~¦Ã@ zÞ0æM„Fòy_§äh@¶ä€oúN¾#/1[óí÷—|+çþ±…åÐÖÐD¸\â5ÿ ¡äÓ†ÔF-zhÙêuš¯7ªøÚ~`̤×áØeú€+qw—:j¯ó1!<±`Äœ¡É2µUœ{‚3£œ‹ƒkëµUjj" "‡’s[ëìZ¤ÀÐUÓqšâíÛ‘V.0kå…ÝT6) ‹ŠS*T­ëcÒ·jȆχÏ1óåì!›M×C1«¾­$Ì„ƒ¿õ0²à‰Óç~^`ÆAÏúö_Ö2ôÔ¸ÿaž‘~WWhü 2|%øRÿ1¿gñ»é½ ¹0öéqÏÿmüî<-$ü?³ÈZ=ìþ´$ä!fØ¡w˜¹ý|§ôh ¨¢à¤*=kÍ‘’­d*+->TˆrI UÇ»$QhõKñ0¹ø‡«ñLüU·TõïtKåý^·Ô¦_º¥(´žöÚ뱯ÐÜ?½0jp½N‡Ü{_ÃÆ\ûoZ€éÓ íŸÈo³Ç’‰ ˜ä§þKy%ÞÜ‘UÐê‡æÿ·Äô¡—?i0ülíod6ìðÄü².Ü«7Ê[wêÓ–ÄÍû—ÄÝô󒸺?²$îyâóŽý›Œäú×ÿažyð“gÐIªz(ë<ƒVµLotéScÞB8ƒžôÿwwíAM]i\*¹¹UБÛÈŠ³„eÕºêh­îª»e¥­3¾»¸** EäiE´hx^ŒAyID6ò¨ÄKQÉd«b«ÅǰØÖ÷îèúZëwã vϽÉÔH„@wüÏî9ç÷ïu~ß÷‰äêôêÝ¥ÅW¿ªú]CŸ (Yš½>#8íS2 ì¢`“às">Tºm;DÇ˾ÀÇô´00`OÐHô6ý;D†£?‘>DØÁE"%–þÿ‹¡cS·‘¾ìÿ5ÅhÊÝwa0}…®ÿRõ5Y. òøÄ߃žHϽ.$8ÅGh‘’GgÐ;Ù –ކ<d›Á¯/¬ê/ „8ípÑ ¢‚Þ»%Û‹TÜA¦(ˆ¬šüü/i²#hoš^On†™ áŠ4šfÛ‚Ìœ)Ê$`"|+@!’Ÿ(MLL MÄ?ö綃t!­ÊÊ:&#£„h*ªÃ¹N€ì7Ê”â-YëH´CH{Çn_€ÍQ!ô•Çîam“{²aÊš67aäè&¶qrlã´+ÑP°Õ®=b³´Þ"ØGÔÓ‡%û6å|ž‘áE±0C {@@Œ.%è&´BB kˆàë¢Ãÿ#+á©@ÿÉ’æÎš` l9þ(†œ¡OÚ¤ g¨\‹oЬu˜‚˜U°H· ÿ™¸Øƒð¸ ª«mèÛ}à3,8ÕEÊtM>83½’–à-ž" w9íCûm ôñ ›G/ Ñ[×ÿðSCý±‹ÎÇ®ï‚Kg-FoÃx4vu¨4r‘3Ôê&‹¶ 1Þ~  Œ ¢É%A'¯Áàóÿ¹V^ªËiz'Ë¡>›¤xÂu7ŸàŠæžGc‰ê{Ê…h¨UÌ…Äl¶Óܹ0–ð™xz] @Åy´ï/ŽÆòá?ü +˜Ahó–`–£Ÿ°]¡)p¦Ãi˜ŒêðvÿÎØÎÁûÏg ¡­»Ñ'Œ=šöAÑòûÕùUgzïÅ´˜ù¹[ìíWú³WŸiÄ6HߣݑÒÖþ¢Û´SÄX ׺uzz½²%˜õ±ßW9RË-˜ˆ”Ä;Ìsx>5 -ƒ=fuµé1cu•9l2ÿ€fhîóŒ…%Ȝ՗6F°å¹÷–­_ý6ÿ8 CHÈöØk°ûÓáƒò¿íÜUæ¸>*Œåê&–ÖV:[NÊ;iŒ·€¹¶T¶O°ØN·Û9<¶cÛ°•¢;:ïnaËWšô¶UÚ1F¶Š1um)b{À³!oŒŠ>Äáb÷§’t#u­fS?w3Q8d˜ÊNÖêßk:îá7 yxã%P#Ê €¸óCs—Ÿ‰€ A$A %á‰xÓ#ùM—X¾ëË’ŽÛ.–&”$LávpüØ5GPš’'n!9kÑ_CÈ_U3.ÝQýuóPm>Ëð·e(Ak7ê7Õ½gÔQ[‡b¡À”‹Û_ô TbWÜ(|Vœ,ˆÚÏ~Ïå´±ÂR~*Ç(ot¤ê{r*å‚>IQâ‚^š¦ª ‚•§`säÉË,ygBž(éíV[s™UÍí¹¨“,l ÔlÈïìíBüP͉q_UHÛêÆhÕ¼ØêљӉÑpm9Ð&kTÌï±Dx½‘DŒëD"æéÙ¢R¤D…æY^ý}{tÔῪGì<»7J~îų–`Ð7ž½¢ob˜"ãÌt›Žz"°“ÉÔ ¯7A/Iñ…—¤xVL –â-L õT;wJË) I‡JN˜þÝ<‰íÑ÷³r¨¤ />6OAöÑ`UøF[cü’ö=è‚ VÉFyÖ®œoªv°‹•ö·jnrã±3úÙ¬§ÚÇY;$au'bÔëêvšM£Ui6h|ÈgE^ê’fAšWÎÛp>Í‹¾gŽv]:…} Nìñæ{?4wÁ&XÃo9‰U¿ì?‡†¬úíGcü¨$ðy1ÁL«k…ÊÆÆ¨ñ}h˜m¶-ô­l|tѺoÝ÷Ô;ðn“9Fm¢Ûj I€hŒÂÒtV-ìå)ì3Œ°”,ý±_(·¡oÁf¼…{Ø;Bo™<ÆIF0™üÏò™`×0Û‘}ìun"SpªuÔs—÷Y21‘r¿ýC·j•o«{­ÞSU|w´&,ê¼*K7äëг^1_yW.ÃJå÷ô®ìÂŒæ›è­¨ð뺉ÞANK@ðµy£¹ªÇùë žš‹¹/gÇ®BgÿuÑ =nõoµúp ‚ r ‹³ ŽkN”æ'_J6oîÊÍyÁú¶ÜœàÛ¡aÛÆNë¿Ä×;*‘¤š$Òxi‚”š,KÆv¹©‰iJßÓ5•E§Êœ·eFnÜÊ:ok£œƒ ûIM¥k‰S•Ê“ôWÝ = ˜xö*&ßÁ>ãW­§;L6ÑaÊ´l²Þ} Ž™5lÒ12TàãØ„½ŒM`WØ„5”Miý‹Yžó-½:rcZÂ%‡z¢¤ÆV³’íä°ÝCÀ!Wp3\’Í ÆSK„rÐÍÁÊt;»›{íì øö®‰ endstream endobj 94 0 obj 20198 endobj 16 0 obj <> endobj 15 0 obj <>stream xœÌ}xGúþʲ´›@±²ÁÆ 9„b:Bï½Ó‹mÜ-Ûr“-ɶÜd¹—qï].’‹Ü n`zo!„šJKBBH¿Ì:ãüþÿY8.9rw¹»'²´;;»;ßû~ßûM ‡0ægȉ¯X>u…ÔÇý9ƒ1ç0£Œ˜Ñ\´}ùKø/;x£ «RÞ+Œp(Q9š ošŒ¢Ž¾6Š¿ñÕQ¼Žá„¾,•SÍéæ0œ#žÑ0£‘F"£IF3æ-3Zcde´Íh‘£‘Ä(Ð(ÒeiŒªöí7:jtÊè}£›F·Œ>7úÚ裮w÷uîHî›Ü ÜYÜ¥ÜÕ\+î®×›«äª¸±\ÀÍäpµ\=·…ÛÅ=Â=ŽÀ½Âý€û9÷n¿±±ñcc3c ãñÆSŒç/2^g¼Éx»±£±±Ì8Ä8Ò8Î8˸ÌXoÜj¹sÛ'OY)õ‘I<<oÏŸ?ßÂ%ÄâÑ‹Ub¹ÄÃÏb<þ$ö‘úûŠýÓ,¶‹Å O±…»ÄGl±ró›õÖk-,×Zï´X+öËœ},¶ºøH\-¬$®b?¹x¢…»Tfá3øÃÂUêç&QH¤~òiËåÎr±«_$VºŠýÙS,üÅ2_‰\Ž¿[Hä2g?…ØÍB!µø¹úº±·ÇÇÝ¥~ ™Ÿ÷ÅgpU[¤r…ÜU&ñWXà;nYµfðžÎ ö¾r >m!uÇ%ݤ®ìÛ<9§p–øÉ-b¥‚½‹ØÂM"÷÷qÁ÷ÅUùË$†G”Kü<þz÷)2±‡³ÌÍG,7Ô˶Ê_ßÏâ©·vö÷÷ 1\+5”zr‰B.öqŸf-ñu ”[l“ú:ûYXKç[XYl»I}ÿþÄ_ÍõÏpu LÊ>°8 ÐÙGèëëÌ>­‡Lì¬Ë W‰}ÎþÎ26‹›ÄÝÝOª0÷‘†Šý<°…Ý$®Î>Ë]d¸Rç•«³Lêgëì¨ï”zHýÄÞëݤ gWüö +W)¾ÉàwÛ'G×>ut»áÂí®ø}|œ U®÷uvÅu.ü#tn›¡äúÁ[ìÄVñØþT=« ±|ðìJCÑm†Cֆ﫟ÜÜõѹ¿^jm(·Ãð¹zðž+/}ªÐާ¾»¼×ƧN¬2œØì臡èëã¨ØùôU¸ngÅZÃKn¼“Õ`à þð~ª.±¡.7çdð´øÉK¸*ò1\+<éc(éñT >O×6ø°O‘ q¼ÚyðWààŸPCÅrÃgè“›ú }ªŽ@Ö ~†û=}øéw–® ¼ÂPVfø”>]JñÔå²§¾K¯#"×jyˆŸëžM+B¥n6Ö+ýŶ›W¸oY-óغFî¹m­B²}] ×ŽõAÞ;7û8ïÚ¨ôuÙ½ìIvs&[ì;åMûySÇ8ÌŸö–ã‚écζèíñá‹gNˆX2ËRµtöÄŠ/Oõ6V~uzSÕƒ³šµßŸëkÕýå¡¶jæâ‘öšþwvÔþréXgº}¼K÷Dwýý“= 1•CØ›‰UÄ|bñaGl!V ˆéÄXb+±†XHÌ ÆÛˆµÄÛÄxb;±Ž˜IL vë‰Y„%±“Ø@Ì&&»ˆÄ;Ä$b7aEÌ!&{ˆMÄ b.1…°!¬‰•Ä<âMâ b±ˆA %8Äb”x…0"–fÄ0‚K,%F¯ÆÄ2œNðˆåÄ(â5‚Oì%F&IØBB@P„!"^'^" ‚&^&œˆT"š&|g"ˆ!”„/áB¤±DáG¸DJH 7"“ˆ'ÂBLd D8@¸ÙD"AÈ"‡H"T„œð$r‰d"’Pj"ð"Rˆ("ˆð&ôDQE”·ˆâ,QKôMD>q‡¸Nœ'ŽD=¡#*‰‰‹Ä¢‹h *ˆ»Ä â2q”è&Zˆâ&ñ.qŒ(" -ñq‰8AôÍDññQJ$Z‰BC\#Îû‰}Dq›xŸ8M Úˆ2ââ q†8D´ÅD5ñ)q•¸@ô'‰ÃÄ)âcâ…œËÓ8éœ N&'‹“ÍÉáärò8ùœN!§ˆSÌ)á”rÊ8N9§‚SÉ©âh9:ûk8µœ:ŽžSÏià4rš8ÍœN+§ÓÎéàìãtrº°:èáôröspú89‡8‡9G8G9Ç8Ç9'8'9§8§9g8g9ç8ç989ïr.qÞã\æ¼Ï¹Â¹Ê¹Æ¹Î¹Á¹Éù€ó!ç#ÎÇœO8Ÿrnqnsaéͽ‹8ȱâ1nÔÆqk¸ŸáÀ¯ã™ó”¼¯ù2þû¤))%?¦ÖPu/~)ï¥^n2wHÅÐ7‡f¿bñJå+·‡ÍváÕÕ¯Ö 1Üyxñpøšâµ»&ËLN˜0‚TÁg¯Ëéáô‘7F½Q=ÂoÄYÓjÓKf«Ì$f>fÑfõfGÎé2ò¡9ÏÜÚ<Àüþ(ãQÞ£ÂGµŽ:=Úntáè_„{DKEQŸ…±Åu‹oRoú¾Y;†c9¦bÌ—oÍz«ñ-8v騤q&ã&+÷éxÿ s'xM€–Y÷NÌ™xq’p’~ÒñÉêÉ'§ÜòÃÔ˜©SNóœ>|zÑô;3,g¬{åLzfÒ̪™‡gÞœµuÖ÷³‰Ù£f—Ï>óÎÖ9&sç„ÏùznàÜ„¹gæí™wt3?`~ï÷…¯-<ºð“E‹~^Ü·ø«%+–œZrkiâ²ÕË_[^¶ü‡+g¯ì^e¾J·zúêè5Fk®ù¿µk?Zç¶îÊú„õ]ÞØµñG¬¬j7ÍßÔf½ÂúþæÄÍßoñÞÊÙºõá¶Âí‚í{¶×î°Ýqv§óNÍ.á.ŸÝ£v'ï±°ñ¶5µí±Ûh÷™ÝÏ{ý÷~`ßí°Êá¡c‰#tJuºíœè2Ëe¯K¥Ëy—‡®¾®u®×\ÿâ–.ŽrÙÝËc¨‡Çž+<ÿŸ¤Ý+ËÛÆ[ë3ÚçCßh߯ý²¤nÒý“LÈfˎɧÊT¸+NZÞ ’ý¼;øWå©«ë¡aadØð±á™Ã#N«–ª¾ŽœY¡ž¨VßÚ½&º#fmLt,/¶.N÷Sü¦øû ‹Î%Æ% “ôÉ»“¿nàJÊš”žÔÙ©Mi+ÓŠaÚ°þé@+Ó÷Z“Ûpο ¦ýø^‹ƒ}<½]Ü·‡,”µ² SÄøàZaÁtJ‹¾—‘ï&”†=Ô€’d€=*õŠhJ°EÆ\#‡õ»-\Öå¸]Ãé_­¥øn ¬Ü¾ŒäL¥©”dÝâi‘ávÑf2è¨%·¤+ò€dk˵™Â@~ãâ|‚TQžIñ@•‘DÉà r ªé/aÂw(7ŒIDÎǙۀC¸Œ‚q¦Ñd9¿3)?È:):Z¶í0] 7d›ÂümjqŠiJ““•‰™‰™Ñi {b‰3Šö›†ì µ ðV³è˜ìœš’&JÉHÉéT­\#q÷Û·{o¬Í//–WjÚ›¾„™7MKöåæêÓ¨aÌaPŘ\ô¨29 EPE#ÝГ}¨ír~WlNp¦P/ œc¢¢)9Œ«"Ý3"‹@ 5$HÏÊÍÍ¡7*+ªò+Í›Jü·‹P< ÜUa’\8²ŠtK‹Êû(˜NÞÞutþf{éwá0fKÄEÆL[àM.3rhwç€@ÍÞqŽú¡þì¡â¢u¦(#7€sŠm©¢PûtUmgÖퟅFMxEÂÏ,áðÇôWOˆXËiú‡c›­êŸG£4?'9¤%·'åGã& RíÝ¥ð–yN‚“LUš¤ Êó³›Sñ—” ŒoddsbA”ÞÚ¢.S´øºËU6qØÎiZÒ:38hA…¦þê·­M¿Csò•9ØVf 44Ú3)¨“UÉØÐ÷µ¤$%¼Àî}´6›~¹wáP]ÙÕ,³a¿¬Ú~¾–óù>¦Nçö/`þBd’`{Dä²X|å--¹87*\¦k¼_Tt%?U‰öø ½ŒeÊøWâŠU`75 %ÁfUäâ|JKÎÏT–«ãEÂŒÏyÕüAjÔ3¿ÔÉ´&wál8ÎGB¸l„`R1nA‘Œ¼”Pöˆ`OxäŠJà%ƒ×H¸_ƒ¼ne‡§^äY')Z]D | ÕØÙq}äÓŽ£…Bkt›®ã ¼~èÛ‰Œ&¹Ø,p -é1)ÆÍEmBÏ{õNSÇxIÑ«‰"lePÏLÕp˜yp6-åG{Ç„„y;z©ÊØ <ÝIÆ¢1<_û•®Z$#Õ€¥©Œ˜&zf1‹‘ ðm8 Ó_ ,Ç Qè­¯ÆÂ~ð#†¬Åä-Jñ¡O”í@óдàÝ[·„ãáªÒCgðCŽ8Xɼ| ®­2ÐÎe!¿PÑ=ÚŒ3Yg²M+Iû4UF)ó>ò–“ãsb=…6’N=¾Åö€BFó-Ð8‘ ºnùÓá†â¾^aâ)ÄE…Fª‚Aê@@í’‚HWŸ<Ñ —‹  ÔöÑp`1œÃíßÌ"Ó_Æ¿_ü€2ÂS悸h“) ÓÓâs0‹Ð&ä<ª¢(»C¨MáiÑ]Ù˜¤Sj$p#ºeŠ&`…Z=Ÿµû·ØîÙQ¹ØîЊ„ÛṢʲ¼Æ 3|×M 5“»]ÌÊ®% eoí!ãk@IøþmÔ€ ¶…G`¿'ƒÁZrINH »ñ¤ ›Ù>ÐÁ«anóÁñ‚‚ó¹Þ2òjlYXE¡¬‡Tîï©›d5·œBoÙä-·UúEzÅIÁz`ÕäwÈïpÄûà[ ºžƒFphogˆ¸SØéVéÕ´”ÒB•??ÂS­V‚hž˜»¥Ê.Ï·®šˆ¦!'ä' ñÐõòÉ’–£¢úŠ MwëŸsyP•:«Ž2/Ç~ê6úh9B°ö)?•Ëú©$¸ÄDÛa<¿%‡:RP\NZ§…jÀE ¾Iîß«Su ø#†hÙWˆ»ÅC±ÕG$0Oµ§AVNq~¦¢2¿P‡ª6£h¸tË6/¿ÊÖpÊïÃÍ-p¶žÃŒ‡¯Ñ®¶>!N8*ù•5…ÔÇ4$\¢`?îÓð^ïV¯6{ÍüZ¯ÍµDãÑø'Ãᨿ^„ŠàR: -m?j@YX¶O†2Ušº‡ 'YÎ6õce×? ÆÑ|ÿ© ×½^ùüðÉ€ZÎg^íçñŠÊÉ ä«á.=´LÊOiLiI0ù•gÆÜÀ•”)úM ö?c1£û×ÒHŒ›×¹!Wܼ +þËüé„&ÂÉÈ^”ìEC£sè\Äy2B$"7aã9@Ÿ³‚/ "YÖÄü؈ýÉ'¸ésኂ”¯?§£,xkv2x‰„>p,Ž®ÐYÀ×P˜à FÉÈsqeá˜MØÌ©¤+5ùmïôZÓ(¬ÞU¸ÌS‚ßñvØÛ)6ÊAUÐ-2¼J®… Ž0ãê1cÇã;bÆZÁ¯&Ñ`SLô†HJp@5U¤}Nth§˜/ÂÉÅÛ÷túÚ3ôÆô1ø}G_Ÿ 9½MÅí¢cÆQî²  6ùœÇNüþ½³íÕÞv¢að6Ž|£» žsЏ—™wht›NêHûx»ôUäêÔÈ|pž‚ït͆ÃÈ£EM¥y±‘ ‰±qQÂèð5ˆ¢|tòÆ­¶åä–Ž¹ëvËý…ž±.àj›#–hÂíö)~‹¬Þ‹à1š§4¦u•~¤ï: nPšrûVt/è–‘ïņÕÔ›TÁ{ãAT’šÕw´ä¢\üÊW(Á&¸²$¿á“GDXEŠBy°Wì*@=F l4x,,™Ï°¸Êüçß¡^Ž™â)c>&Û¡OÊ÷Y,õð³wß¶PYñãIÈnùˆ¢tðó~8â»y "…‚ádkAÎ!8÷€™i…Z>ë·«b4&GXƒ]‚~,;·bi—§®á¥vŒÁ[VEZ§G€3ÜJªélÈΉ Ë–ùEëÕ¢«i ftKöÚˆý×í²šÉ¥ƒCïTCŸÃÑzpw M¡¹û#&ÄŒ¡£7HÁWD±£4ÓÕ ™»~ФÀ«R*ª—©zƒù»ŠÁnàRrNA ¾V[E{É\Fn½&&pÁÝCßÜØÔ3N¸¿08«¦®¦¢]ÔÜ ´™3Á{D·®²ãðHÐY'­¡– ì¢WÔGt¡^ö;,gÙWv•gåÕTŠ“‰{L4Ý[&ž6Mé±×.¤ùþ—e-½˜@ehUoÍ_‰Ùï‡^¢½£Ã•`/p(•4*Ë¢ŠBZ>Ò5i:{NŸo¸ ¾¦ ²„‘ vŒ“Ðä6C?÷ÄFa‡}}ðui¹c¾²Rqlû§ÞwÁiЙ}­šBßô·ÓÐøŠyì2ÈcÊr t?_‚|Ñ }‚‹-̇,.Îñ-\„³Úâ .dp@KNOÉG)A~ŸÔâ^ˆA …ŸËø!ˆïé9°li)È=øÅÉPO½°B–ç_hEUa(˜E42ó8©ßBá.¼? á¸@2.<.>Ĩ԰ ¯îÊò‚ÅaAÀLª.iÁ#_’àÞàJ®Áé&]p:؟܇n¬?ÁìŠÎ‰Æ4ø“Ø{56KLé™YZ)Áw«™Ÿi'OOg‡¯®®Æ†®NI“Vp›ŒÔ+5&9˜qpÈÁPÑEUéç³ÎdaU옊]t'½œìKÈNjÆBÑË+H-5w ×Á/Ð9Ù“Í&Š䬾ݟj*î;!Ä @Žzæ/3ÂùØŽcíXÀÚÑAÎ?8X#¤»Â^JUVnFZVf®0·8=äRuþUÞî2™Ç–._:\} FXVŸÝ Nb/ë_M;I°‰ë½º;›;;=Y³‘Ï ¸e¸ a&|‰ËÕêwØüª_KÎÎTç‚ëSEÂWÙ— !T-? Úó¾æ'"{^-¿9Ô‡§cÿa6˜®Ýg+â= MH„!OûAK.ÍP‚CC*/¾š†›ûù~|y8Ž«lÖ¢aÖâœ'ä7y}BXlÈJ´ÁttŒ-KÊ™f (7K›š ²S²S¨§rûÔ”Þ Å.8·?`ªãÃÙŒEYWv¶>ÍÌàÕú©*–\&—­ßKÁÏKÊMNK®JÌ‹*¢V£×Ñë¦ÌJ´YN6&†±Á×¹…‡x%2eoV|&è¥ Ÿ¬¬ú ,‘eE‚3'MÆ%TU¤ħEç£]°ÜôÛŸt¥g1£±ö?ÐÏÑr>†³àµ.n?—9Kƒ“…ÅçØ4Á_FތӃlš€,·¯ACÆ9œ„£„ð Ú3+Š ó±Q÷§â¢ŸcÐÆæ«°·CøÜÄrÛÓŽû=Ï…\WÁ{-Ý­ºëà>ÛŽ“ú´Ø…Q˜®˜#™c4x¿°è‹ïŸdäG‰šìÊ“›”2ÿ‚²ì´Ìœ|a~QZ6(¢Ú%Mnî^±KC›B¨‹hnÇ”´¸z¾Å ÚA#õïfÑ\ÎoIÈ‹ ©r÷Yî)‰êH̺|)¶ä€âÜŒÖ4l"•œlKHI.[Ÿ©4]‹–ÊÏE—Ç–ÅšIßS׃\,»&“ÉI]|z\õzh9ð²i¾Ï~Îò*ùp:3®¸%;[‡35ÖDZÖ<ȺH68m“ó›‹C€»Á`î¡Á’GóJ +ÃB÷¸Eñ0(D£áh¬³ßstTTbbbr<Î!csŠE°ütéa4 ñ–îYæR%ëh¯©j,Œ+ˆ,Fç&bìQå5ÅMBÁý:kÑ  ñ° v—9ùb™ìDY÷:œ;Þ£é;*ÌÛS¡<:¾¸µ³í>NûûGÊåTÝ~bß¾ËE†Œ³ nÌ­ì;HdüËñE±À„%F†:!úØa(»òA‘¨,ÊkMÍ)El·Ë=Ù›£Ýs˜Vó¡’ù´êLaÁ¡,3ƒ_d9x‡MŸsµ´,E¡*B'˜a¦p ÜÕ¬ý:×°OF–$&g$7'Ä€`ããƒ|‘Ÿ)ô"Áå¢â«ƒ »”PúXàì \3èyU¸‡¬Ö (¸LžÍöë¨"â½Ø<ÁöëÜc{#€†™y­¬¢Ã2bÓcó°:Sš~MÊ*5yú ³*´HNæ$g'§Êäì8£B¥ÞqqáÊ𠸬„ÌÄtï}&ù…™ ¯KÈŒ×øÂב©Ÿ»¿WtÄöåÁ¡îIØê‹±ÎHÈE H·¯µ'5-+;+§Ì¯D–]é•«‘,]}Ø’q8ï»ú¸ïè +tç ëãü8./òqÄT*ðX6bªÙˆÉjžÌⲂ\JðQqyIV‰y[‘b³Aõ¸¨U.Á3 ¤ÁÂláŠ\P­Eò-†¢ÎêH1[4ºŠtKUç³ac°Ëo›X±q·Ð÷¬g•°öþâͬ>‹¨gÆaõûÄsÙî>»X}†£»+5ðc>ùÁ±—æ°>`Íîÿ'Bá’ˆkçêæ.Úf\Ò©)nÔý:œª }7ltö×ï û%<\ì×À]Î/¶Ê 2þ‘Ä¢(àTIáñÈ=0E¼UŸPrÌ@UQNWZ*–˜™,"ÏËÈŽ$Mtž¼i²)zFC"¾8)›-Y›ŸsˆíEî•‘ûâr£Kl¡çÀ7¦5|hÍÀ¥< à½Ì7í•å Ø]ÿ2GÙ©^˜­Öm&à 8äójïÁ\æ Æì ÏõŽÀIéíµ{‡÷"°œÚÐas¸sMææ§Y-¾}æßß|h—àÌ}Ú†ÜÑB4Ù£=pš %Wö|-R5Íw·‰\‡“ß•h8WÀmp(ÎŽÀÐ ½ŠÆ¾¹Ér½LU¢ÏLÉJÉ]€¼U|Á„UžtmR‘<É-É!Ô:È%ÐÉWæ (EÃá#¥5 mëubN3±PÀ?Þä‰L õüN(àañ: =ü*¶#®+Âìžôð6°žÚîè¸]áŸ_ç*tª÷-ÀõÈ)*X˜ Â(I™¢¶¶¢²6?1G]. nO(ŠïÎÊ0­ ÏŽÕHëm‹UÕ€ª)¯¨iPîL9¤‡§{”°MlèOÅ2üG.<‚(z!ß%:·SÔoBžÈË?&<Û€T¿¾ U8]JTUÃÿ놀˜ 1…Ëxõ¯¢‘™rSàÒÝÈxÉd …–xÐÿü8 ¾²â&â{&¨|…-pÂ'ÁñuŠBmôÅÊhz9Ò×V’[% mˆºîƒ3™Ç³2²3 Ó nù‹@·ÞÅùá].}4r›…SNñ](ƇÏâƒi8L)5ý3±<”ô|ÙoË›Æt‡Åp4‡ `sÈÙ|G$ãiùeçªÊâ8ëÊG{šy_±5ÄiBà,H½;Bàt­£!u±ï¸M]réÝlãåe#”Û×ywfd‚”L¡À)s1Õ¤çvÚÇ¨ÞææÞcõ‹÷Æ(¼q žˆá9+ª¼±Xçå²ÓÚãð½£yúö“¬Š†K!…‘À…íl—€(˜€ñ:‹KºNÈ=*¨Vi­»8@ꔿ±|ž056]™HÁ#oè¡YÁù¿9oU>W˜›œ„‘p³,®hÛAJ³¥ð¥l}lÇÓk}ö“îH´!á'ÀÅœgc^2¶‹l›Ý÷÷¶¶âc­øaŸèhÿZúm>RÿjËûÌÀ¢¯î»¸Ì2&†o’{k$y‹ ¨ë;“öñq>¡;¼}vá°9³o ¹ŽBéäòB×noH¥š¢äÇ’ª¸3‰”åÑoÈ‹ÚJêõ õ%ÝàØÞPëÙî«™ÔGAoòrX«cí Qý¡CA(Ø ¶øzYERÛ™Eôær¿Ðöëtg‹YŠ@+üؽ˅j¶ÿ˜Zg³¼C­éØ{ª¯¡¡¯Ç·Þ)>$Ç ““@ Ô19ùmû®b¹j`;´„‹1uïœ_÷í38T!$FçVÆä›góóSyÏ,~nv”ÚÍÀúý/Óÿ¿oH Äš~³ŒÂ™ØÎäÂ4ì&7€õŽ.+½wNó(äò%6¢¤`Á`÷N‚“-|wÀ[bGû«ýÂ"€²Qž„–"BÂÉe'öÐlB„X;DôÀ¢åA(imÒÄiL˜éð%¸£a„ «?•¡h„a†£WçÞñaW¦A/:r¬ñSp“zϾ{µP¿‡®«ðqqU9ImD¾;<ýÜåªiîhü¼á€HÛ\Q¬ÔF†¤ÅüxŸè³Ü߸€ LŸ J`Wæ¯È–™# ¡¡èõ…‡·_?uX¢]´ïLñ±”{å ùÉ… ´åì+EßýJ˜å Ö¶ô ètœþåÄåĦ$g&•Gg«@ ° Üà±ËÏÙ_é |ApUj}ZOæCåzmy1Ð…he~ÿgùœŸâBZBÛ|¯êÀº€®¨‡ÉT>¹¨Ø_e¸”ŸÊuS5_jªtàSÃïë:ý‡%¸ÈÌd×Xï IP˜;ØA¡µ$X(Ÿt+¨BV±¡% åæHú9@cßÿñð× $çÍ5(é*F§»‡Ùð ´äÂ÷Ø@—8¼2'-;--µ:W›U(m^à^ÑM‚ùÁ¡–8/e†T‘3RC‹À йÈjÞ0ò:óeš(›iìw9Ðe„@Å\eæÒròdlV<ð®!^[W¢ÉÐËô/m=]à,uuýþñhè2ëIŽùÞík„hÌêV`*5öƒÐøêÝé…‚²õ§š›ëAkAUiqAA±¶£Xgœêª–31•mÿèõ¼âêÎê.ÓÒÚü¬Nœö‘Õ€2£¯!ã ïzg7©L€›_R,Ó9uû‡@K™öh=‡}IïºÔ :¨&Myýέë\‚6¡ØÓûz p—{AIßí·Å˜¹øó]HÝå0Ì[ô@Ê,&…(ãÁ/lSB3fäs`3ÅedЃ–óýVFÆšÌÇ>}Úך.‚ëf?/¹Ž»`O¡›[°DºŒªáëÏ´Ô] AYá‘”-Ű£r‡·ížÅžÎh<šA)˜Ù¬Ãcjá,àܯ!ó[*ÛÚÕútgd°±;-Gn@åeGEŠ=—ãÐýhÁ@›íFƒ¥> C©Hò^J{V}ycyq Û»Œñs¹¢êVùœòÀ*¶¿ÿ>Ö,)÷.wËz;ÿ ¬Ú,£Fàܪ€/ƒ§Ëü1Õ¦¤™ (ç}ІÿL&-ÀÿXçÑǼû‘ ÔÀñË „àÖ FC·žn¨<¨³m®Vë==§øŠBÉOüB›%”à’Þ¯ÔÁnäJ±ýf¹2¯ÞKèÖæ[ŒE±Ø_.ÙyÚã ¸šb=>¾'¼Ó¯ITšïZJ nk+«=9ò¶õÁq–ËlÆî`cvÿVËñ¸ðdÿz“—4ÈÍeÎt{4 ÌÐÎÜ¿´ge§ëÃ-T ¹­Y¦ êö=ñ€£~Wsª¼«JwŠMøKàÊ»ÁwMjfþåÏzŠx§¶ìpìèönØ9Ÿ£¢ÀVe¹];5ðÒ€7z:~;Àïq¼“-²MB­ÙiRÈÕ ÊÊMwNb‰ ú§Ñ^¾¾^î5~M-µ5M;ulë?f/tÀýèc0ÊüC„‡·?8ACG8—N"¸ 9%1-!Í,2/*#PqñqÑÁÕN7‹ ÂóÊÕÑ‘‰ [WyîATlzBvvVZa1;Øqq³†Y®—j°ss„À”YÎÜ¢]q’ñ*Ö ™òðÔ sdfiÞZ]a½ÏITRÕ¶3mç÷B3ž 6¾,?©Ì¼ ´ä6–UiÊ÷…”šJ\¤áN@sý«?†¡¦ù…q¥€j«Öµ¶(««DhºAöDï'¨ï.Ô–†È…‰$ÖñõþMÌMr¶ïm l€ÓG|~‘`wëÏ÷Zäëáçìe¾P["rÚD0üK\wBUÂÏü$ ±H¤`*©)ÈÜwù´:¤VØPì]¸ˆÒAûüx¾ $cÚ®4•9rD"4¹!ã}¯lu¸!¿ AÛ_&°J­lJ9`άÀÅ< ' &$x……Ê£Á:àZî¿_¾/ìsð9ýÏBc8¬¹:*¸PX”V²¸þÒÜ3*__‰g­oSó T.d‡Ž0Ðy‡þ‘¯ËŽ ¡£$pU«<Ö¥ªŠØ9£Èщž€z“~Jo*ª.¨¨Ìk”৺ªÈðääÄäDQ¼:I ")o]`kkµ¶éøÚ&d´b{ˆ‡»ÐÕ5|oÒLj›ãqt›œ¢Ô{ãpõ ¸ú uh3ôÌBôZÝw=pìyØXgêA“oáë#‘ÌëÌK4âó•·‚!—ÍÂ*µ 5ÅáRŒ¬$Ç$±Î¿˜íÓÕt]ÚÚ5ÍÆQ¥ðÙyúmoš,ÏšZ¸á!¿ibzXª{p†*5Pkܽ7ï¬÷9ÖÝXÖÙ äÛ©‰è4oõ%åúr}n[Ö”‚¾Sº øÿL§ââžtØÊ“ “Ë(Èá <0Êdt„mP0–¨^ Mm}…¦±º4F^)ü 󦦕sÀ×ß<äÂùX͵Ú4wÞ™MŸÜ9sêö'Vg抂Œ[ò}&ÌTùº{¨êï}_ßÊRŸiÜ_ÚÏì'.즷ÚÚnßÜkwòäþÞ“'ìl%ÛÑõÕRoÿ/Ÿ]½¾ºFÏöØ©ØX¹Îü÷œ$Þ~ã…Ž=‰MçøãÁßïØÉ÷Hà¡•&Æ$›°™"K,ÍfÌ_”ä^ß•.Ù;Ùz°;X"ööP9$Îx¾Åá= »h$<Ãÿ¾¼á¢®8F•—+ŒS'Å€X–žŸ€)·0RÓo‰ƒ–·ãÀ¦_·ðNð™ý[xìÄÙ­ï±sŠfÔûb¼À±Ø¥ôφ¯ÓnvžJ[@-€¤¨f‘àL|]h“ïië–å`7‡»{P‚œ±¸p½ù˜%»VºUËöµW–7—%䨊Dѹ‰ ‹ÒTµ«Pl.$íìê­póñŽÔêñó'«ffò«6µ¶¾gþ8Zò3JÐ0ð¦7-—…Çâ É=XÛ{Fßp·7a _.m?Ô[ì=MèÅJBä×q£ƒÍîs!5™Î‹ÉKËNÉfµ%Aá¡i9 Q\j˜{³ª:¾˜}Ø×x´ËK·C“œ)ª9Çsæc»‡ÔÀÎu ×—µ›€p¥®î!\­=ó®ÒŽ,½Å\êßEÛñ÷l´õ_<€2KZP®ÌÔ˜éoÁ¡­WZZŠkjDµ7Á%Ÿœ—¤ÑF&–ƒvИßV7`úë[¦ûùï÷O¦3@zRnl^lZrV¢.*3 H( ëñ½B«ºïœtG¢PpêVÿ t„~ó퉈?§oçÖæ¢j¨«§æ xºæÖ½QXæE7j=ím‚Öú9‹^²0?6Å«ì>Xý‰¾GTVSVX¨×è±Ó& Î;}Ûo´5±ut÷ê¸êÖ½A¨¬cOк¿ÖáZÙÓWý1®CSk¨;¸þ3¬2~›IüÌ4i¡¨ïf¼ˆÁ” ßà2»`7݇¸$ « ªJrÓÌtÈ9€<—X¼Adbd¼ A¡¦áµáõáÕ‘Uf»¾SôbP^’y*•Ò¡#dGbeD™|e›ZÚÀáü¼ Þ6dnÍmI°64|;äù©–œ—VÞ¥@ó>d~‘LÏã=¡g§Wp_l`ží9a´ô1>s·^“ *ÍtÊR?eh´2Tx½ýœ3lŒ}3gèQ˜è§}Éö˜Kƒ1Vn3¶ûº€5Ô„×áóÁ©O»üêÝIJqpFd‰R˜¯J‹Q”\æ±ËgÿLJrÎ «z²«@5Ȉ)H.4\ ‡‰´»Aöô´µuïwo1ô6ºØ ÑH:ŽMý¤r«OšTO HMJKH÷Ú|!õtkRvb»RQ˜P (}™¦¾!¸Ü'"2!2@äï§VõÖ¤çƒbª)Hãé¨pO‹ÉVº`×¾Ñ#=2M\&+T¥‡c4(•oM`]InZVÔ¢ÉMÛ—ž8/Næí£Ž !5.-V·¡tRê‚ 4Ö”m¢éu?iaT×qÀgðý{Ü«ŒK7¾j`RÒÚw`¦Vgg§¥¦edвsÓ²@U¨ññ THìš}ÿåò]¸ V˜Ý“ZYƒpŽÚƒ†}ÆÿºâÀ¾ü¼Ø˜¤¤„ÄxaLd|PS2mPM]Uuc¯‹Þz—C “—Pâ¼#t<…†òŸ jÞ3 j2cé¯?äõ‘“ò`Ú&' o¢ræJž yï} ~æH'ö0Ë/qÀ§\8³žNˆKJЉr±Qá|šÚÛ-9Ý·¿¶G+ ,ŒOJNŽI0 ŽR'âfs ¬ì(H/Ë®¥å¦¤¥d„~2† ß+Uæ*Y@P°,8/¢6DÇÌâ=6p#¦ƒRÕé^E~¡™a€ò ö•–Õ¤èDûÊrSÛR“6¨%Îk;Öæ»§Zy¦F¥:iüóÃ2"% ’új‚ëŠJ2 kE5…YE€*å'ïL²Uù'ªA8å]X__U¥/L(ˆ¬*&”&÷¶$$î ÑF&äcÔhÊjõ!¥¾¡ª•Tä¢T%J@ÊÙžúÞŒÌÔt ¸´¤ôø ¿Ö“àDk2¾P©ÌK(báVVW\櫊HPËDNÊÈD÷„”ÞôÒÊCù5é ÒË«¼}½#Ò"ó„{ÒÃRv±þ™V2I•0³Ò\óº Çßr¿Î&„ë˜Yô"G§Eëª%ðMÄ·¯Q䄳½ò]ž^…EéééyYÂÊÂlËu¾:OO©Ô}ÇE‡O¾ºtäÚiÇòCÂ#)ÕY81þªª¬Pß<èckT¾m¬ï\ÓãÙ©ŽÆš5º(uB\ltŒ0$":DPþzßÚF½¾áðºžÅ³7í\jWðñJ¡JA×}þ¬|°ý)‰BîëTpØZ(øn󡨢æ‘õ•UzáßÍgœ™Úž¿y¼g©o–˜:é-d±H»õÔvÑRô:¯—ö§f¥>¦°…?@‹ýOY!oÔF'k@¨¡àºÒCgJC „y[锽)¾@J¡‰Á»¶z—v« i×Ýþô6>2¶DÆßð¶óá0´Š÷&ÂíÛÏuvÃ`| ’§¤ ›+ö1,û˜sú.ÌºË €Cè[<ìhQw³.Вס{0Ñôĉ‰uÍy- × ôD5øw>|hºõØäÉ®Z\{`f<¢\e“˜nÝþpb€›ÚØ›½yž:1×ÀLúò±ÍËVmݼfÕö“W¯;qÙ0!¢Î×0Áy;æ1¾ G„÷σ¯Ñ»ýÃíÁàv"r¨4²§1 —b”Í>'·ë—à«¶{6yî2: pÿ¹%4=ÞQØØ.„Kê"™ Ô¿O¡ ¸œ>B^®lÙ×^â³,M¢R‚Rd” #3zz°‹ývå ¸N*é9ÚWæ>™í˜}  ÿŒÕP[÷8½ Wñ¦óÛ踭bJ· kmÿa-ë9_ö}É…=ý"ºï×›p©–••’ì22’Û’sM[I†![É”\Ж™q Ó,ä¥ä±£À‡I4i59³~Ã)OQ]ˆ.ö`…> Ådrp‰KXk&ƒ+É©Œ?½¬Zrüä´ëJj5ù½ùØïè ne6cI7À±yGþnhæÉÐËáÈ&EU¿ Æä VªoÀÑcàøå{wh`å‹â6沯¼ºµ¯Ümª¥J±-Y(!’Šã‹")V§È·=™F¸îNHÉŒFeEHêÔÅ ¥Àì§O¿€üá]^z‘·^R¼ ê@^E޳²»UWÞºoäÝ9½òÎ ¶}VÖ+ÚáÁ&fœ=BPˬ‚ÇhdE‚åáa+(Ás–ì€<?ÆW²Gâéê¼E9P›Ãò:E0„ƱڀR4|0ç•":* ½ÅN“¬*Ì<òÅ©PÏay@®¼`#¥…ö¿ ä_H(g×çDE+½““âã‘dÀÌTh…x1Ñnq”` º‚Z-šº;3"T›üô‚<Í·p‹iE; ß¼,ÔÉÒéºéwÓD°L‡YŸ^SV¦ ;±SY«2¨cÊ´qóã ¥½òåÄWyD¨ü$¤Èó\KMË ¤òÌ óMÀÃ-äl¾l¾UŒŒ^²Ñjé¢3›>¸yúÌ6Yb è“C—Ší#ùlHåpÿTì¢Îyï³S¾!h]Ìf:..99)9˜Å$¦ç‰à ²Ï¶~ñâ=~ö²âp]¦°<31+&[—‰“4*¿,·B(8Ý\î.r%‘¹§› ØPnuþ]­µùµMÂ,ßBu=¨šœ*-%¸„èF:"Dƒ¡RURÙ¨­ê+2$xgÞçÀOû_£Ñ'+á'üÇ£=Æv¿þ'Æv™ÄJBc츠)Éi‰é‰fùêœø,@eedæh¤]6'D%ê¢ðŠÜ‚Ü‚ôôã—›Ž‚r*+!=&&&A.Ä­€‘CÅ¢y/\KZú‰çÔòâk a/ _½Î;M¢W—òàKÏZ`ˆ5Î[ž5ùÑÚöwk qcj¯³R¾£'ÔÊO¾ çûÞ:õiÊ‘Ÿ¶#KV.ÕzìSGA‡F×Q¢ËÒfdƒö“ÇÐÃ>³Ñ[žjtÿß6ú3úôþÑ%øqþ;ý^ G*AN%d*¿:Ä—?øž¡.s™ ˜C{oðبÅç!ò»Î~p¬Aj]**{Ÿrã2Â2] 2Üq€ÎZˆ†£aŸ,…#êjÒs[D©Y)”eäe§ä_5EKÌÇ=h šö"8½ ·C8 NNÐMÓÑnÑnc8¾ŠÌÑ"´G34MÂÁd\ÃW¡9œ&ú›…Ò.pŽ+¤GÆ>YN‘ó¬ånÿ¦å‚—HfÜ vÓõGGj>¸Éfxo¿ \þ•í5Øøå´û# Óÿ›Ž‡þ‰´¶¥¬@¨6ÜÝUd"Š"?=ðiôÞ:Ò 'Na‘™š ¡¯.&Ý/Í?Z¥JÊ«-è4$n_ºs  ÙF#L'¿´h ÊšFt«[·ÁÎ×ÚCØ?v` v“nö3áåìle¶¾3›|ÿåŽ |Á÷häh4ކ+y¿ê‚u³øp†±áïS“q«/„¢ H«Øél^/8;YÿB³“¯#+æ—î5hKh«ùërÄæ2Ýá¢s)Û–”hP§ÈsÆèLƒDÈâÁXÌÇ|yp×Ũ“A‡D²Óòzë¾/zMmëÞ¶·ÑÙZgšÙËú¢ÛC:}ÌÐK[öûðþ²”>®Ù¦¡yÊÝ[”y*QX]\/øŠ‚ ÊŽœ>5û“F4Ò«Ï=þÏϽü‡æ€^yæP%šÊÌѶ¼åX„¢•hå™Mp%\W¢UgΠUƒß7ÁgV!ü}Ó&Þ??Nƒ3'ñû­õîc’/û¼ÏÝå0³ïr™À,èbÇugóÿ·Vˆ£³Ÿ?·kæñÚñÛ¬öz²~¼ú¯?ùÇÖ ¨åpîß©¼áÿ@åQ«òÑéÛ]möÛÁñeû>&ÔâŸgÔqõ¢Ô âÙœZ@ìbR_° ý?;9­f"Öÿ,gS0eŸƒ´ÿ_Ñ0LØç=+]Ú+ࢊŸYég|øõ-h~™ ]™<º'Ñ…BÙ$pMNvH¤Bà²RÒ!-9´S?µå’ܰRýæâ b@}”ÇÒkýÚ·~lz¸¼ºì§N:¶¬¢|hH7ó;4;·+¼ÝDžüøý¿GÍüf5»þ©…Ô^;ùúWçß,¤Öüƒ…Ô›=[üDÆÏXE=Lj½C éPŠþ®‹æŸ[Òãöïo‹ah‚I2l.ñã}.,UÑ—rè{φ”šþÑm&Æ¡7§Á!j‘û¼ßŽq¸‡E¦åÈž?ÆñŸæäEÌÉç¹é:ˆîÄŒ|f/ˈ—1ŸÝË3–ß ½š±˜†N\¸«Ü…VV Ýxóã³g>úÐêìB‘‡ñÑ^Û­[ìí¶í°?pâDÏc¢'¡«¨!hˆa8|„àÖ;Æ LÑû8ÁúCbô_dÑüÛÏ…ËŸ¼×A!ü=Qô¦Í0L›g#l4—!m’ ig8ÇEÊý?ÄÁO xÀ`UZ¿”Â=ͨ‹†¾¬ïþ4^ ŒÑ Fów Šú Êø7 ê"¸ 7>YB€-!xë.|ëÉä6pžfRî¦+þ;€ n?Çb2n‘>_ ¢–ÍÍöÂY>†Š®‚+2zqÞõ°ÿ¥í#0ìâ»zaÛ£ñùã<ªÙÅÆŸ£HþãÝP’ Q7 #;’²êeuQí Tê[+<ôaûÁ> Éíj£ªÈèøøäX@†”ëØ^U8õÎÝ;p*®‚S¹L#ÓXuÍ"aüˆvõðpunòÜ×ÞÜÒÞîÑì"˜eìâé‰yìkkiÅÇš\DO&u}õ“ºÒ™í¿;½æo¿‚fØü{`ûSðýö‡ÏCÿ¥ÍºÐfXü;Í÷ÏÐp>xÀ…:¸ŸÞ’¢Î=üLM¢yxAdfjFjjJifqz Š³TR mTQ…Á0á?°³L!ãÿ{ÿ‡§&¢ÆÏ~ø¿‡aœ‰4?Q ‚¿ÿð9ºî¿…ßo0~Ÿ×†ÁP&_còÁf¢aô~ÿ68õ™ƒ“÷'zjp2üíˆé˜Ñÿ{@31 ž7¿ì~za4c<;©þ„ÿ%Œþg£qûó-þq¾õïaο&}÷¯æ_ÿ5ºLÃtyv“a²Ä°Ù.Ì6ð%òîA óÞo' ˜ÿq |˜Fdù×Üù þý;Gú4/œ<_„bvÝëcóçSª3ê™ôˆO×!Í&r(’ ö¾Ø†t?¡uÌÇ/Þ·ËÒíQÁS”ûFøÏþ!Êöhäp´ÿ—á?ÈÏGiÜêHÃ,E¯ü›(j‰øÐït‡õyÜù´”%ãéÿTÇ„`ÆÀLø¢øݸ0šÙø¬‰ÏÿŽŒÇü2þYUÿ—wÝÏ {æSý+»œ'>{ö8“(¯…¡}‡û`Šžs“ 7‹Û#é´øÎÛp4¸NÖ:A"½6npØ V€½ŸD ÔüÚ>ÎO.™ ¤Ì”\ Î7ÝÉ/„K:n^ÇDï¨qÔøäJ²vQeP®ä'øE††‚X›¾«.$Ó¼ æm¶›¨t ˆÚA9ó¥6¼ üd¶cð±)‘”˜=6ì—ð~‹*E¥ y&×Âã÷Ùÿw@z¿ÝÃoeÊ|ªò.ú¿Y•üüžÒÒ&@õ 3|à”œl›@)à®JÒ&=9»k’yg%]À‡áA "H¶ùÛ"°ˆ͹9]i” »½L¢ÉhÎÓ÷ñˆ/P*ȺdmH‘…¢H°#&Ê‘½Ø¬’tHÍe7p$ c¦?sS &ÝÅQ&G™~{ŒûÝ;pÝoGÃr>$AMPÙXJÇ‚óyø0bÀÅLáõ“ü#ÐÀ÷šï†(@¡øÐþļßí9[ 7c&ß›š™_5œÌ7˜oø¨±¥ýú %ŒÜ:à€«Šîƒïƒe8àg˜ü÷ÇþôÑšÊÌv@}qôm4Yž˜à)Ú¶Ï£ÐØçP[;éz°žBœ»3!çÜqÝá‰Kmp€£)¸½'¡·ýâü—ÿÿê®Æ)ªëŠC˜ýˆEËìs :‘ÝmSG"µM™1‰6NˆM $“Ä4È4ˆHBÈ(‚«Aà-áËÈÈ®´?!ú°iCÜ6èŒ V͈±:!3ç­šÞûÞ¾ýHÞ[ö»¿àÝ{Îy¿óõ»ç„ÂÀÄCÚ}È?{kzBz⮌dZ½-õÂ0ø ÞþK}NÚ)RY8`ãfPÀ÷dDЦ›H«l¹¶¡9*Ðɵ°_‹Ô ´i-h•I‘Ww0¨€“7Ñ~|9möǨöW%¼Ä.@±ì}Ч•h+ú^{Q-‚|Ð@,DñE/Àè.m›Vß{üÑ*tÿd zX´åáÆ'¾îüA˹kØ«í1õ5\-×u8uïð?Ì®ªƒrªGs=P}Gïù€ê¡Ç< ú3½È€ê{DTSJ?XEžßØÇƒ°$Ž+V0ÁÔÖi¬`ÉhÑQ„M­@«Ø¥ÚñŽúªúRòùçãSwÇÿ©>­µ¤”6–„‹i#­®(7Ü•úê“/ëfÅÛ °fJ÷ ÐÆ¡ë. éu¿Õ’wg†#Yü³³„7k»M•ÍÇu|DÓï¯n)碌Ô`QÍbãï_t?ýñÑÎúøçdЯ‘Gpƒü#¸é“;®ÁG"ó"¬kP¢¹ÂZDxN¹LC¹+å.æ”Û‹¾Dw|®Ü†{~b×4ñ×Ì.á,mÀŒSMÑØíÑíwƒ©{’­ýª´€¾I_ÞÑþ`«Tÿ>Î(”3Ì(Ž®É;whçoBìý#ê;'#Ì«=¥ì2iJ!ö‹Ö#œÛ1ްÊ÷µnmƒÔ´;êV¥ÄÞ¢Ó¦xÊ}¼øhY•FyÙÖýn‚µuÁ·íÁT¿·É5‘¨Úça'œ°kmþDæl^ ·Pš×ûš±ó-˜ì“é|ç¤T!QV \§ìµ‘‚' tNõ äŒ&á9Ùš“x±ãÔÉŽ¶ô†WŽäÑ…GBó óéBZm8TQyúÔÙO;‰q8£¦MÀx(à>´tbƒ<¬ÃÁõWöñwP ³’•_¬‚E%e´±\—ž|ø-z¯›Ð91³¶Ý\ZnzW×óª3=ÇBDÌ1ï¬ÔÎqø7/ÿq&`L^èŠe·qˆ=缡uÛ¡Ä•×im ÄaœR‰àT´ŠºE*ÀiKÝÖÛÎ×põ6ê¿8Y|Rl¡+ßr¹mqm¸0Óo¸üSVÃåŠxÃE‹Øì?p>Qº@ û2Z8å­éŸòÛ)NùΞҜ£9jj4ù僙’2ΦÕÉ»Íu¦ês™®¿¦´èL3a*ŠnxÄá¾Å'ì/êümÌ˶©M+A¶ä¨–Xƒî¹–ªÜ¬¼}t–:NÒ’^ï܇µ'ZKtƒeŠ™Ñ¬Pµô0Î9f•¡8ˆ—v83¹óÄB3{óz:dÏë¹"o^O6HûÔ%<Õ7ñíº"æó»ÁT¤ÏÕ€ý™É5òºð6:ò°­5eÝë]  }%×Cbrm®gÃÊ–ùm±F{Ü‹ò½†!.‹홉ýDk²M/˜ —}¦õ2§DõNþyZõÚ›|É7î ÇpÀ!³æ"9Òì&r‹ÍP¶½]u€Nâ}ëA~««©N]‚8¨†XUwC[cyÅá}U¡¦=Õ†zZ}¶¾¡YGEt¤4ni瞨í¡Á¯¥ 6aŒ[âxÍCq4zfÕAcìvW¹‚Û‡#Ýøs‹™ ÙÙànQ|«*÷PeÖwíXÁKÜ*8373#]÷óz•7å áª8¯w6&` §¤f·¸±"!Øk RÖ`¯ã¢Ý~|çpg¹t»ùÊÄÉB™‘¯€‚´fH}†òtÈ›êE?ŸÜ!/áá4ÁE¶Á W¦ùš\“Û3~ÓÌ&šáE³²qèÖØúÚÀ…~~ÿR; ä endstream endobj 95 0 obj 19707 endobj 13 0 obj <> endobj 12 0 obj <>stream xœÍ}\Çû÷.Çí­ Ë¹¨wgE±&VDÄB *Ø@¤WiR¤‰2Ø@Å "M° RìØ `‰b×XcbñY’ÿ;{‡#Æ´_ÞÏ…soËìÌS¿Ï3ÏLhJ]¢iº¹¹«÷× OgÇ^#ý¼]„S½ù¶4ßNo/Â#ðéó?Œ·§ÆnyÖŒ—5¥ÒÛõnÕŽ-hÙŽѼ8«e+´³‚N¢wÑ?ѯéJ555 5©šL­«Z/µþjCÔ†«™ªU³R³SóT T›¯¶Dm…Z¼Ú&µdµLµ½jùjÅj§Õ.ª]U»©v_í‰Úkµ÷"5+Òq¢¶"]Q?‘¾h¸h¬h’È^ä- …Šæ‹–ˆbED‰¢TÑNÑ~Q±è˜èŒ¨TtSôDôBÄ‹þOQo¦ÞZ]G]¡®§ÞW}¨úu3u+uu7uõ@õ0õ¥êqê‰êiÝ&OšÚ½Gž£üüÃ<Ý=‚ßèëë+œÂÕWÆ®žî¾Š®ä`Ž«·Ÿ¿«oPo…•««"ÈÃUáæéíªe9aúèñfŠnfã'+Ì\}]½‚¼=c=]}]»+ÜüÞª g?_Ï O?ßÀÞŠ GE ¿«³'yÈ5ÔÙÕ_¸ÐSáïàãHŽž ÷Gß WEŸÂÓ×Ù;ØEx=9ïæç¤ðð#×}ÈÒÔ¿À @çOÿ yãcSUƒ<ƒ„÷z’Ë ?7r§‹Ÿs°0šškAŽž¾Š ×Ð á=N® Ï@oÇ0ò^Ò”€§² Áž¾îµoï©puw pñv T¶+P¥v|Š:£vô÷÷S>ë§¼«æýžA®Þn½Ç{ú8*¬Écc‚(Ö;SË¢¿Æ4“à?¡“®³ƒ½ƒ}|…º¸:¹(O»z9ú;V¸xº¹ùú)Ï{û…»úº®ºñá@uW~uv ðóµqtrìçîçë:k´‹_£3qÐXg?òÕ±MÍY³:g­”Z9»ºxz{;:*›íãèLÚ¡ú'°úÚ$å£U¯˜L8ánU§e7F¨®ŽRÞ:Iyj¼òؤæåÎÕ×j¯¼ÏZùm¢zç(Õ£un²®s쬺Uõ®1u.+/Xzûqöñv š\÷‡1iÛ1ÈL9HK՛ƪ§ú1«N[®Ê¶\”ßžªË®5ƒpQ6ä­|ÖUuÑ[y§{¼ë¶¦êl3žª3Žª§U¿‚Uÿ„+T~‡×¼ÔWu¶NÁ|•/ö­{ºî˜”O«^¤¼7@ùíW÷® :Ô9öS=GQÔº±#Â|§îç2}ü(WKãÙnLÜ'šzL2 ò´2ö²=gÖd‹oÇ)cB}œ¦ g;°‡bÆ žì÷ê8S¿w'û!}:;ôí1ô›®s ¿ÕÖ¯Û<£þÝ“8]´{ûó3Å{R~*‘ºK]¥ÎRG¨\j3•NÝ£¾£.R‡¨SÔQê4u‡zD#j#Kü÷Jz½š^CÇÑñôZz½žN 7ÐéMôfz ½•N$~Lo§SèT:N§3èt&Eï$ž7½‡ÞKgÓ9ô>:—Σ÷Óùôº€.¤‹èbú }ˆ>L¡ÒÇèãt }‚>IŸ¢OÓgè³ô9ú<}¾H—Òet9}‰¾L_¡¯ÒßÑ×èët}ƒ¾IߢoÓwè»ô=ú>ý€JàawGÂÐ4ê=„¢³Õº¨YªmP{#ê('ÚIÜÿ,õu꿉lj3Å]f /‘HæIv°ÝÙ–oäÚh[£õ6ÞÝø‡&M›tibÑ$²IISµ¦úM'5½ÝŒn6¨™O³ï4úhx7·o^Üü§ÍZÄ´Øß¢ Åù¿µìÑÒºep+µV𭯵òmu¿H§KgIWK3ZlíÞ:…ëÌ¥k6Öì­9AóC6}ÚÄ´9 ¥£5TëhÑÎÒþ^§½Ž©N¹Î³¶ƒÚZ·ÍiףݤvËÛ=jŸÑþ¥¬‹l†l·ì„|µ¼L¢X®¸ªxÑ¡i‡YÖv¤;öîhßqvÇÝ":ýÒ¹ygEçA³»8w ˩.OººvÍÓU×m¯;[º5ê6 Û¬nIÝÎt×ìþm÷ z ½³z{÷¸Ð3¢gVÏ+½ä½õŠí­Ó»¢Oï>Ö}ûŽï›Þ÷ÿ¾YóÍão¹oÝ¿ÝÖ¯Y?—~7úìÔè;`Õ@z ÏÀŠAúƒâwœ6ø¡þtý³Cô‡¤|c°À rèZC±¡¡‹áo‡å+5Ò2fôÝpëák†?Ñ{ÄÌÿ72w$?jî¨Õ£ˌߙD™\7u2M1baÞÌ|¢y¤ùƒÑÍG÷]8ºÒ¢‡Å‹ÝcF‰sb숱þcóÆþ2.z|ãñù–î–±–7&¬ž(›h3ñ»I³'°jkµÔº½õë-Öxòöɦ´Ÿb7åòÔNS½¦^žÖkZô´ÓgO¿b3Ìæ’íÛ9¶gèÎØn§°gwf¦îÌq3ÛSöí+68¼vŒqé´Ïéçç—F.Ù®2××»nýÜæ¹q×us¿ã1Ìc›ÇÈÒàAKþv@Oá•>ÖûÕ‡_-ñF£Ò %ZÂÖ$è™DóËA—+ƺbèÍàÕ•>b<„Á ¿úˆ¡sÈé¹Ð’Ó˜ç#Öàb¿·•-ÈS2>›ÃêUíq¾½÷fÀ®ê”8F-™æêb³`Qìê0YGɶ脘-hÚ—²nßæ-Û·Ÿ‡€J©–ÐÁ$¾74ñMj…@ö h#-8GZ¬Ê&?+$ÒŠóûËNgz‘áäÌoh2º KFÚø[:ˤƒoHHO‚@ /AL©ñ‰ð„[ZýnⶈÅzuÀc±é³NÐÚ<¹ Ü9ÖaÂLüü'#ÖØáü»Ã늷ì”oÎÌÚœ‹N tÿÍÆ¬Fe”TiB†6ˆg9†J1É`¼·†ÅblÊ@þ ‡W‰Ä0’9¬^#SBÑïTOr“Q’{ó8hSuA z püqÕЫôÁs$¸uUÖâ+Ä8èWrUàaÅDò§- 5ô :ãæÐ¹ôÝM¸ÍÜC%›dÈÎ8‹N¢+.'ô‹Y)¥0cÿYt(à¨Ó^‡ìi› É o0 ‡[r0ˆ)Ïö<ÅÍ×TŽ1¸¥:˜1ÒwWs¼Æwõ)ÇfŒñJ ñx{ꃱV08 —б˜·1N—ÀV(% ‡:d†8Bj8ÆrX¿+¦± 6})ƒß #`L·÷ØP‹Å\Å!Ó]§š 7švéíÛ׮˕ 5‚'䯒²­Ûºk‚‚ÐEc3RÍÉ0¸î¸42yÄÞ©òì©=/¢RT”ºç(‹ó͸ËE¦»Ûš™˜Ø–¿|U|é’¼†m°”PžÛ9ˆàíÅx(ƒåøî×ÄØ€¥UäÜvГ(忚[P(<¯©dŽ^Õbïç «{ ¬ácæA+>Z+5©r?‡[zn^®wžÕwßäašôÖ ·ÆºxžR¬Ky44{kå¸+Õ{”ÞäÖìè.ÿä‡ydÈ7‡Ä‡®ua I°oŒ$$y jh6‚f)~!¿÷0»-‹ýÊ š?‚ ¾|ÝýÜý°ùn d†l}=-Yhì§"Š©©‰mÙë×Åå„(D;ÞCÇgÐü=Íoƒ9\lZâбE‡æå¸¿èJÙ÷>=±:GüÐzA³å¿dɱŒ wp ˜†œÑ¬-!™ó’–¦,?Ì®xÆ­½³'ï,ÑäáI~BÖÌYéÆV›™@hIó׈©*À-ùFLU£ª@19*€–U¬„gù@±Feb´æW«èÈwˆ®SÆuAƒ<Ç™[˜¸uA¤C˜Îî|ÁôœÙ¯ŸÑÏèήseçJ÷ý‚Þ"`ÜÞX\S>dgGÄÆâÖ4¿¡‹¿Å݇tÅMq3ƒ×¤û½n½†fr•6)»$p÷yQ…&ä0 B—Òž:Y–õ’>uï—ËmN™¦buBr]¯ê5Gk+qÉP<÷·ŠÅò8Äw#2xšž)¬f¬õ’öÚÈ÷N+õ<ÊС»N±xî ^)Â"³Ž*¹ýÈ"x@l`ÿgÏßÑ×®_äÓ¸ÁG™Œ„i ›c–'ÈÞIf¯ðˆ Elï™ö}åF½¯W™ƒ‚7¿+QŠ<,&&ïz ë£36p`ɀ΃çÐ º¾…{PZžS'÷*$·²=†pó0PjM­ÙQù‰0(åàà#@ŸoF¸—B|Æ~ò¯œ mÒY« viv±Î•H'ÜÉË»³i]Lt¢ :JÅ.EËÐdåè3’•öýE¢¤âãw*íWqh‹øž¤…ÁÇóvã[÷À-±ú«ƒö¹œÄSGä#%63M¦x$ç-á.L¬ãfß½>ù§Ãï}ôÃUÊù㼆P÷Ò‘‘ºÝ§™mWúâMáå2ùg$®²×[îàé¬WèzïúvLùØ2ý]P'¤ï5ÖlŒ©kg•æt>ODð®×[t •l:¹‡}0äúm1Þ «8£!#ƒæ{-ž…´qÓZ¡›º¸å‚ÉÁör¥cƒ¢ºT ¨z…Põ 9÷¡æZ•Ýü—¼5:‘PÄZ«¼·˜~å¸ ¡Hû¦Xä¾Þ;qŽ<1tKÔ‘p0˜ªµgAÂÌz¹„X¸ûÆ%„Éæ®_²~Ér7³ 7þ~ &ý>±9wgîΔCè(ºäQ`¼ ›ÖrIX’ÙÌIKwÚÄÊj|ðG{<…t¡”¨1éžà‚Ï8—™² x³,!lU$ò`ñ]¥#F¥aÅnYÞi37ÍD¦hºŸË’TF•x®–0©Z$s•Ðös0œ¹1{ü´0fž<&…¡ÈlUp¢ Ò™  Q›ÐÎe0kÙºÞ¹wvæBÐÉ£{½vÛm&‚QÕV%Àߪ“–GKòÑÖe[çn»6y"…~ás#"C–: VÅpHz0û£¹¶åÛq˜%Â,sZ<ÛÝÞzöDBÚfý!=ü¦â9H˜ë»K¾-l}øW:0aćj<ÇÆä.7Ü ÷Á!x6ñÇ`ú‹‹{î”È·ö?fˆîý¿<£ËUþ03„.ĉu1í]Žï3 Ÿf¥®ŒO•½D._³±nQë‹åPDp d²ßV‰<무õ‚"1•>꤉–äˆ(g4%v»)½:Á1è,âæWq¨tî÷\›cCv;ˆGuÕDZø„5tó“¿ yší‡&h·rëÛeRþ¥2âÖâ¾ïÂx¢.@ôÉÄÓ¸mš3ÉŠmÞÛÐQíã÷TQKbW.”auIFôžåIˆý~ïÞ‡òÊó5DRʯ@HÂpâO8þ5žD¿n“˳«^ :&кÚÓ‹À³«”<M0Ã[MÏg‹q7ÓUr܈— Ç0±*[¬¼Iõ4éš-ÜåøNÄ- Úa")9ŽÃ`O‡G0ĸŸ /´æ_«°E–ЭXÁ1FIúÍtìÕkæþ‡2>ŠàŒ( ÒOžxÐþ¨mÅì‡è!ªH;Z|ð@òIt‡å£T榕Bß ­ì•XûúL˜Q*»„õFIÑÖùÎû]KBÊ ‡»ß¯€vr~/QÅDÕàøJMè% ® £_¥1„×c…p4@8êÂ@O2HèÌ<à[Þ®j)®C,A.b)ËÔGÚ` íEü¶-\ÀöÅ›P G% 6¼wÅ]Æá–Q2hËÄ•lßJºt,=Ì=,*bî"yèB„LX-ÔR„MµFzÈnƒkªÖ¬¢ÐbtO;xù­\¸!‚…ž 6nˆ³ñ ßÔÜýÉI'dÅk³ã֬د]‹Ð;hÂJ!RéÁà~U…x _(C ‰ZêÂ;ÁúFs×nÀ"|MLP0¾Æ÷ƒÖbçà«b¸ª’I­D¤r` ÛÙꃄ#0ÆÛ°9NÃPæ) }‚‡ GšÕ‰cäXNè3\õ×Fºçtx¦ôâÞÜÓE;üd¸Jy¦Þo¾•äݘ³˜2³ ´r”Í>=ûõµÆš³,ÂMŽcñÃïZüèRôººñÒN¿«Zg›; õEv˜1<ã|½B¯r^_¸våîùÀ¯ÛçÒ¸‹vš¡¡hbØ$/;ÖËÞÑϱ>¡‰™ ÅgÊoÀ.1ÏÙé2vÚls7y ŸG¨/b§»~sãõ %°†¦¢w‚åy+»ÈÊé\Usfl•\ ­˜M{v&æ#örþ´ƒí§™Œ÷Ì:-Àê¸Åƒ@F¸ÔóçŸ vèòÍ+Üf†Ç|o'ùvè&†BdUN'ØæŠ´ø<μ×I‡ÒJ{Ì7ÿè=Á—0í.vf%˜ÞlJTöžñ¦Òó  Mœtvéo`é¬^é êLuo7 ÑY©¾2ð ×*¾€[\µ=,Íí°Eæ0Ôrq0v4 Š0‡°Æ&£½“òFçrô¶Ã¿@oh7è¬1Ñ%ÜÎ^¾òBk27œÏÍ)A(%lëL¶;¶â.ìŸfhdg=nŒýÑk7»@Hu{a1_Mh°€&">pØ,plA>MÈ9O®Y†šü™D¯œÉ™30ïWoqiµ•>#„©‰—Ãþ ã`7s~ãl:ôÅ=—½‚®• ö¬`Ä «RõÏCWw}-Afþæ³V’¼ÕëÓ·åfmÌF7Xh/xõͰ©Ò‹8ìÆäá³äÕûᬸŠQ'gº*ýÈG:ƒ:!ôV<ƒƒ¥à¥]@ýWO\CçÈç0Ä@Æ,QDwhFþ%–à'¾¯É¥lX·~ÝŽô-ù¨QÛ¸ Öê1«›e8œ÷”IßêÛ{N¤ƒuÞö†îÐíí3йçyLÿ€LúÖ`îl¾«õd{—ñãì÷?–ŸsN.}»ïæÊóíF˜ÙÏ43s(¸tå@a©X€3´¥á0<çp*n ©¤ƒ¾¼$ðd"˜ ˆŠ k2¹˜—árbbR4?=GXÈ'’€ñ†$¤c°~•¡˜ÈHà(ÜQÁG’k ‰ÀæµE9 Ï­ÄôSÐ@OPyÎþ+Ùç’ß“½ ¿3ëèÌë&¹ zé¨×w#üÑ…V{w¯Ûœ,ß°6~íö4·u5j㙾?Zö˜ŸÈ•íŸ2ØÐ~ê˜1·oßÉ=rV^‡Ãà%°¸šEüQþz½¤¡ë,.—¸ã·Œ3v¿c„chòR—É‚^b _~Ã솑⎌')î\ç7éö’ñÁ½ÄzÝ*”¸^Âe’‡Þ*O ©¯‰å$ÒÅM¹ªŸLùŸ•ü@èÇîl®í¿¥Vv¹"ØØI)ÖàTé-´¶šß.»Z"~#¿”àþ–†7q«8ö˜Ùd ææ‰HlŠEåÆÐ֛Ş«uÞyÑ—XÜ&ŠA#3-Kœsü³ç^Âv,{'9¾fÿÆ]ÛŽíÙy P ÷ÉgÁNrxñÇåãYÜÕ˜³ÚŽ Ãi™Ç׳eø&Wžá‰l €÷²Šô†'Ø $‚wi+‚™¼'- $Ë¥í(YÇJ<—Ïš2ËžšÄbZòéØÅ¨m|cõZ^ ðv}5 pðFZ¥g„,f9Lp²í‹p{„[nùv×äýæå®wQ:—uàt§´ˆ­‹xèyܱÌ4{0$±ú^´#d‹ÛFŸxC-†.2XèáèäŒÜ_bøÞÈÌE׈“¸{ÝŽÍù™)¹$VøÐ,$iÞ úrî 0xÙ ½„a/ß _m¤I &r]ëëêÞÕýêÞo‡Üî,ï¦^”ã6c¦‹«Ý ל‚œœ"9ßù=WE0’¸‚áåÄuJÝDãJå£]«ýù㣮5 Sg¼¬ô{I߆F"¸DÔш5m¢¾»KCHèÌv>³¬³*&ÅŬ_¦½}A|r&A‰DÿðÄ+²ë/ÝÏ›Êaª] Nžpm}r*ºÊ’ß¹·dɲ¥ý¥ù4Þ—«ŠÄ£Å¸™„ÄbIªZA¾h«0. ÃDñ‘äFPTNï- 4Òk ¶·D iY~+ÐÄ®iO$ª.¦m¤üv¾·ôu‘O°#1sµÉÈGWØgÆg ý‘½Ü6ºgxÉÖ.X»`ÝüËW-]³ˆ•ÞÇÆ;O饃5Ÿ€Že…[ÏÜ–Z‰aƒ›CïÜ´Û+®k¯–¬—à_'sÐÍpw õFÚ“§ž8½kóŽô­riÅ0禟[RÙŒ”¤Ý{·Íqóñu–iÀ.Á}¢["0'ô4ømÀ-GˆiFœŸÅ÷áªBq>”ÁÍÔ«@K>Œ¯µÐì¾VÈwe¶æ$'ý|š?Þ{ ýH$¸×CÜëèõ– E± d ³¹™]xþlŽƒ±a€7î‹E2ÜTßmìb܆åçšÏ¿VÆymE{Ûò–dÅôÙ¾V Y;Éî;R’v¦oØ…N°@ô©F î¸B<ÌuæÊá“wä@ä!?)± –M`V=e–Åú¡Å± Vi­_´å²à&¹3íä(™Q·lf÷ú9&ò029àÚüá ‚ÐH–üvŽ ÷–¹UËCîBŽ„Ñbh&!̶c‘„o…ÛTµÂJi¨VÌVPAœX#Áy•ƒ\⢵1)KŠæe:¡©ì8û™ãG»ç\]&Ãí˜XÜñÙ·Ð… …?=Ù]÷cûäÒûóÒ .è@ã~×pû!f~Se~ólÑXv>hJbsV&Æmݵ31±%;=';¹–Ï,ª’…Ð\öÉ$x„-–!Ü áÞÅXä7ûŠéNÝ Ð%&h70¿€Ko%Ü¢ùqÇÅøÇ,‹^´(,"*ÍA‘kf'NÚ¯¸ev¼Á~¶KõØLlZ쪕ññ[7¯MAÛЖÅÛÃO8j¥…¥,Ú…n¡¼â5/TùÍ®|4¦Áô2¡ƒˆƒ‡.Æ­?½ÿÙÅôè íºü@¤ÂÜg‚ƒÌË~žmŒ>9µ‚Yv»øìEÄž.˜n1s~è[ùP³ ™+8`]Çe‘€»=°4d«f0Ò¸¼9ÖgpB•©7†lü ±ß|'Á^Àrxã D\M$r…PICÀ"QL%ôBÐÛd˜üfu™_°ÓnÁ…è"ÜÕ30¡<àeÕ&û"Ï‘ðÒq"XÇœq$¸‡gÔÉ™®X˜•ø˜>›ŸÔjèñÝ…D@èáNN¿ð¸:?{¡,çgô=õ{fwîÑK­©ƒûˆ¥§ÌMR{¶í¨L¬6uS&Öº§<>b@O­Ãvb>ŒßÅmrŽ·A3XÜÇ +Ö˜j³5Ó[æXÂ…î_xg¡ïÍ×Т¤(Ô%[&Œ– Òe5TFpX k€š0…ñQ»~" võì'Í/ëMrغŠ1#yým×oŸ‘ 6W ÅÝ"(á͸¢Å©~Ʊ Ã,‚ýîãæ+Øûö$¸Ë\Ã.GxȽ b»x-&«Ý_MY¬ÃÌèg·˜µ_ÉMÞì{=C/wœ>¶‘8£¹„Ôk“±Ä˜¶V&` 4X©.$óGÈÕ[вjÖTFº²ÈÖe˘¶Ø7Çßà`-p?Q–“tö \ê6ŸGx)‘®ÄzG9ßiîÁ“ÛÁø ô„^—_¿?¶'xÚyÒ^¨Ûº–ºÇjÔRú(Ä7D‚4%  ”ùíkвã»V׉¸ŽQaá‚Ï¥¼ðâáBö[zû«òß‚jÙ˜|"AÔ*:¸‚´4”o“îÈ™%›o ßx0:%±GórNd¦G…%ɶ…Ň­±‹] ZÌÒS‹vÍÝá~Ùp_'%[‡;βs󛄬}|pÁPÖÒú# Úì²zN€š8Û}Фã]µ$§Çç 4”²¬x>+]<ÿPò²ô¶QnBÉ.' µœCfEy¡p²rv+uYç²(6¼­/ Y<Öç~iV!:‰’¢7ÌOcAƒ•†M7 ËÀ¹ŒF÷ ç=|Ï8|ÌŽ1¸ïÎuo¡èpÆâ勳~µ ç»ÊÍÔ 3ÇZz;Μé½ÿ왬ý ùï‹ïÓˆ|‰`håznš³óôé¹Î‡æå<ì’;]n«¾}khPPhhp`hâö퉉)$êŸ[ ¢ S”"XZ‹^‰.|öø#KŸ¿ IRrÔTàèm>¿6Y„竦1¤?}#Á „X²••ö\•Á¯âïÞ 2PLðY ˆ±ºr«ˆïU“Þ•3 '7ßÅÞ×¹ ­!Ys·/M¢©ß˜Ø‡V£c‹ÏËv{9à$±|ãÑ”p'/Vºv—ë„-†mqw4lìrÜ‚…6LܱԤsˆ=‘îQ?C…©°iÖ¨;Ûõ˜··Ïî¼zV&56ÛÉýa[h†^”e½g¥»ªŸçô]fŽšá›š——žz4NV—¹:aÕ–uÚÐá·ævöþóèÊvŒ"˜\숆ÑD0Psr‡ÄµëV&!í¬¤È9Aa³üã¶O‘‡N½¼cɤ}·p×é¾é3æÎ_¾t®|Ç9BйÁ ¿†Â7nB‡› Â×%áKý+C8}só!CJÍïÞ.+½yoôÅArõÜ,o×YÂ_Ö¾œY9rxt“«ü+_dxýJ$îSå¢|N¿t4yîâ­úϹº||Žßúªû#áü3̓ó\Õ¹Nü¹j÷ÖÿÔÑS4¸ þm üÌáö XÃ/bÜV˜XÃrˆu{LÎÉ&@—)¸ ùÆD>À:žÂBGUWHÎ}š2¬vÏÊånŘ`]ñ%JA·ö—0ñä‰d½ƒ…Eð”C‹ç[:öío±¸Ý›^ÐíAiæ©|Ù®ŠcïSË™UClÇ™#Öræ¡  ‰§Šå·Ê¶Dßg±â8÷ÑIòG  îÛ tD|Æa3"ã ÂfĈ›Uþ4ÓíG±?Ñ?A7r?ñ\AnÎÄå%\IÙ“‹´7£uÑ;æ%DËaCð*oÔM„;.˜ …ezМ±¬j:op¸ŸÒŽ@k6b‰VVDú’è *Üš™¹{÷¶cîŸâ[iAûÚ¤w‰@¬i<ñò¹ÄÈò+gñPII®âþŸptSp{xÞa=¡æ0¿SÑvâq·G)+ãÒeE’°e¡ËC;%hóîÃ);î ÎBph…õM@OpŽ™$ü¬!Ä–ßVÿ:DîbÉõÀjÂØ¨Òö Qð&ýH¿ºC‡B|QÎûðyÜòƒ‹ÓÂ3¼‹,võ ÍúÒõ^çµ%X¾&jetj+}fu¦¸è´€z¯ dkWÏÔïªÜBLýfj9ûpô!ør`€»Š‘t}ôú‘I°î.;~þJm™á-å\?oÀÁ)¬W%•X‰¿•Ü*ãuüF" "p•1‹ ‡SQH@ߑʜ³È.(ÄÙ¡€ä%X«…ŒÑ‰I×®8qM¦,QSvÿ1Á•?Áã? ïî64@Êàà+7îÂá»7¯ÐèÆË§üÀ"þ ?Š‹Î[”šæY`:š¸ŸV†ßâN¸ão 9¨_=ÿnµ¼³ÔÊÓgbMœŽ?û!¿äòÑ“×Ë{ûãáäã†]a8 Nà FÄîz9FØM3Šƒ¡Ð˱ÛýŽãöБÜeíAŸé\ ¢íjX ôö‚Zé£/ìHunTæ|6𫬠IzvímºÚ ŸyηxÞFúŽ@•YÜfæxÌŽ9ȉõ˜àî²­ ZÖ‡‰í[2õböÇŠ†"^¥#ú,“Â…™Ý°:´‘¶ã+m¸i»ûO]´rÉʘXméO3Ò¢W¸m4Ÿ¡u0pã¢ô{­ýn…9Á™ÞéÚ.›BVÍFÈ~žK ÑL·a«±ØüñI0ô%qÖcaˆ 4Ç=ÞÈìpWqм£îts#£é¥oß*½.¯y¿RoœYÐ^ç3 OÈÖŒŸûy²Ýæõù V~€48ÜZøÜ­…æîÝí>µW?©ÎÀ†ÖC˜£`wæ›×G«·ápÍUˆrù&Ü0Þ{TÀ~É?TØŒ[ÂÕb­Ú2ç;*÷VSìœR·Ø¹ä‹ÅÎnH¤­Á\çÙ?ðŠ­ë{ÅiÊ+¾WÜ Û‚bQ1è Âtò¿¦!ú|Â×¥,þ‘Òšªaà\Oªª "XËÇ¿!€Ð…`–ˆ¯Í·ºýPp6ÐúG0ø4nˆ .rO™ý‰s=åá’˜…hùدˆLbßncæÆ/‹C‰ÑÐzyÜÔ”ƒ)Ûv£Cìõ™F2Ueù#qê@½•ožçä1ÏVL`à?ãT°£~_|6ʤÏofª*å uª”~ÐÀšf¶¾–žòÚúd3¡>ùUu}ò?TVNúûÝ'Ñ(ö?tXÖmk=Á ‚ñbž?X-…Ll¸©¯ß䃼7D$eÌ=‚N CÂz€zË@‡ùt=Á ëÝ@&w˜¸v}MgvØ,ÿÙqÛ§ÉC§žž³{qmÇvî¼åKçýC‚‹õˆàÖ âTb{çSÓÙBÛßG!C€§ òû™¸æ-/=&çh$|‹ ¤r$7ÈÌlðà2Ó;÷ËJïß5+,«^œël;ÝÙeú ç¼¢ƒ¹¹å5†¶Úu_ ÌÑ¿et¥ƒq ØÁ‘ÿ}1#Êð]]»þ?¨®Ç1¼Å'^ðŸ£g‚ýžÕU1]AÏ]à˳º²%}‡Õ?ôþ<¦¬'^Wˆ¯k%}ýg„LÊ‚¹¯qp«¯œz¬%±a¿wpë–¯W:8vQR’ÒÁeí_-8¸ÛÐÜ„Š#c¡â(å-W5‹HÔ,†·VÇÆ`Œ›`còiBŽÈ ä&ãND¦ ò¹øÿß•\")u•JNêÇ  %Ì&û+2Cß-˜Üã ×½nÁ8«U¹<Eð”#ŽTžZ|úxù®·(ôÞëgër›Sæ©X",ºÀç†0¢ z·ˆuGPÆ”‘æše¿i2@CçŽó¶ŸíêaAnnû©Œ]®c=þœ¤i¸ðôgÇ?CömØù½ú 4{.‚›Â}–ÌÆ-kââ׬Y¼9+ùÖñä,tš}0¹XO×jZŸh´8v‘ì)‡V°Éi99ÛgFFt-3œä=„…suDìj- ŒPà©¿&jÒnÄ_ülñp°Ûïàà¿oÄôÑüŒ?ú“k¶ÎüŽ‘§•v¦zWé…†—qIÄýuiñÖEQߺÔÀ\†¾Wügå¯9ßNý«/‘Ç”Ú(](Äø!úý?¢×Jiý`ó…2¨þ‹‚ÚßN70§üQø®ÔÑäûÿš JÛáöD>kÄÅTMU‹©^%Õ]N¥P.§j{ÿtÿ.¤Ä1Oî¼oÚ}Ò™áдÚ)ÂÖß-¬ú-u#È÷ú'ø@‰|§\®6D|s‚|-Vû6ôÙ¯X“˜8¶ÎétÕD^ê’rº Ò" £E^²jeYý)ñº H×gNÄ )ñûûçpHá?+l~'l¿jÔúÛ·dnû«@ÿ6 JógKœMìßX‰{}^«E¶:â U¨^Gz¥ï:4XË÷ûPÄRÈŸú¯2Àݲø¨¿ÊÔý©ú1ïZUÌûïˆ>Á¶g”µ¹l' Ý8ñaŽt0–4”bù–÷‡Ÿ+)ùêm°?X|¶ÿxé»+,ùl·¾vSü ˜74®6ᬬŒ K“>K– —¹@3ñfؤ©Yvæwío¢}hwüÍ4ºK ý:#Kd{xöF3©ebìÃ,_GŸuhcìú›YX̤³«˜”§ÅgQÊ ?7½8­QG7™ Üuìæ†X[†¼ç3E¡ùäµ"R¨T©”ß ¡ýs°x›žiZ9Ú7ªhCh_¥ñœá§iÞ…7büæ ?·— ÂoÀ[1n_5ã ¼aîã7ÂŒÙÂ'4Ÿu›«ŠìËG2•íÕ«„e$¸ég–“TÚöWiRHóU•K¸ªpÆ y¯pZ /ª¦jáUw¯B(ióLʈ޶$áåÚ‚ä;l ½xùÒ˜˜9Ó–, ‰ ^*ìñœ|‚ç“0e#óeÌIíÍ&3Ÿö§*ô¿°¤¡Ò§ºF!^³ÒŽÁ„è|23¶ê5ýÈSý«"ÉçÍÍ‚Ÿó ¸ˆF!ù¦èMå·\üªSikWîEÚEh_XŠçîÛ†£Èoy`”¥éQ¿„)ȹDxzÚÍð3G,¦ï|íl^E¾,»l´AoY˜EÐ÷š9ca˜³ ŽT ä"¿]ìéà?ÔÎ~2b­¼Ž|ìÅoåg;¥’ ©àãRh~„s±øÉª š‰!š`_Fy¨M1{Ît/±ÀÄ87GÆ 7#ìÂM]"‰Ù±N¢a{å\nƒ­«X â³ Xó¬à @øë/qïãý?tápë_wàɼw¹Õë‡BXRµz~0þtÖàxÅŸOê¶æΊ‰² n¨È£ÎÎ %…*4´ÛHŸü»ûƒHµ5Ë¿\€¢4s @=Dè–1ÃÄŠïøt7-é„Wük«—Jb§ûØE±v’Ë+ŸFwØ·’?a)ÛÃýz .<ï0ô¯M÷ë>Ú/`þ° º,lùÄN ز{wÒÞ‚ƒò“gÚ²moÑæC¨œ­Nç6œÞ}B¬OòÊâ Ãlý=-rJö+œ›²(uY:ÚRV¦Ç±ŸL®T¨,«;Ð7¤ÖI ,ê§•JVK'ßÑiõ><îéTýRaFèË“öÅÞÄ´ÖxÇD¡Ùµ€Ôö$èßÛD]Õ|bCcú/v ?¢^P®LYÕtÂàA1é< â`êÚ7t'xGÙiLKÕ[Û’º·ëp×{ÃÀ(Ìñ÷"ÿøäéòЩgæìª7Iº`ù²¹u*]j¬€•^ø¯Piß#üÂ/Z‡j-y|“>óÉ왚N*¬º®o@ÿ…Y±îðÃÇz>åÌ6èªS+9Q– ´w°7ˆÛÊ÷øPJÔ#'°G…z´kQ!×_GX«1}v t wô‘¯ÒgŸËý í;õÖ0üçÝåëÅû8òð‡æIÊ’÷L»Ç srw@SYËÃnw’“W®I“I"¢ç,Ÿ‡X·ÙÛ2ówÈ«ÈÏýX>£V ±‚9ù—¦Õ†à<ðÿÊâ—>*û¦4(JÛF«ŒJ©÷¿oV¤«ñ¸ªó º?•2¨ìþ9ìL\^äa¸S[¢àûXT£+×C?»ihkyÌã‡ô¤qÂÚ„èå¡ÄnÙ{ðÀ¡òL9^%¨“A}uŠÔÉŠùQؼò_ÝÍÏ—·ù´bè?”úa ËÏQùk·>„=¼qC ÞzÐàËe¨Z`T[‡úÏïÙ¹T6 P¤†ðA€@ü6Ò9ÿCòK£{Wù6¨0_Ï[ØÓ@þ[_V¦–ÿuÙøX™RG_â` ØZ¹ñ£úW5ˆ û ˜%[ Íj8ªœòõþ”ïê;Ug†›ª -¾T"ÖÏ‘‘X>mË›ù§¥y$ži‚i´¨odaÚãìì,f€‹‹²Œåóô¤•k” ¹¢• ¹cY”sàrŽ\`®äs¤°û×îš%]ý¤Aêü³;qf4à5þGó"—>Îv}f‘á?S—5ûc}ßgßð¿«²©»‹b~EµøC¨xô‡_ÌÔðøFùŒŠm>Crj÷—¶Ñ.«?ÉU-*›*ˆÐÇ¿‚ X†u0ÿ'ú©ôó«6#$¶K·ê§/¯½úÇò>«´S«7³+«“[QV·‘^ûv„–vƒóp¨¡WOŸ¼•€m…—ÖŸ;y}JXC•0>S¦ò¯Ö¨hÙ×–¨ÔnùWTZXwÃlþ;‰Ç1»T³Òà/psàJ‹Rî‘[ƒ‚vºÔò"VŒÆÚæ’Mxp}¼T.op·ÇËõ*­jÇÿ„¯ÿâÐ[æ;×½˜p臺²!äÝêôQ:á¨ð£Aç^“R<ê5âõ¿É*VÀHÔÍ%1‡’3 ײ…ãåÓ,‘>ÛY¹×éçt¹î¸Vcî hCÈ ö{”J óH|PTyö=ùÛö”}'?y6aëÆÃ¬@~{W%ù½¶„fÎÛ¦$ÿ';%¸¿èWŸÏÐ3cëÊu{åÆ6³ÐLÖ²f58.ãs•¼;§ä]¢ßÆêmÀá00"I"Po°ÿÊÈ»2]@\'©6ú¨uŒôþp{€ßMJX—E Kв…1 Ð\¹j~\øº¥ëQ2+-G; Žå°uöÊ­AaOnÖæ*þ«¼‘¢”w©c¼ në§ê²oßöUšIÞU30jQtd”Ÿr ²Q‡ÖLÒ>*Ê)¸šÍ~Ý&À_=ï6Џ½ú¥:ÿå,âA¾mÝÞ|ÄíÚö—G#í‹{Ay{ÿwÿ—ÄAÔ[|vT•3Rå ‰vvV‘Iˆ›þ§„"f­SÕ°†íµª>âPÝEiƒ„nžüꕜCº~íÆ7ÿ•»•~>$¯Ž)?6®ò:ÊL©û·/¾@ó†D÷ØöW«I|¾´MÊߨܺ|²âQÕ¿W7ké[ñÕ|T×._ç9åëU.|Šjƒ?µÕº´oß¾ABÖŽyíŸó™$àŸYHRþq©Ñg8¥rµÙaj¨âñ'©²¬ZÜ0YªÅø£8Tãëºäéüò´þ…0æ¾,Áuýµr!DÅ_¬/µ½%&h;Ÿ†I¶ÛhÜ:4Æk›6…ëš6£¨ÿ¸´ endstream endobj 96 0 obj 15288 endobj 49 0 obj <> endobj 32 0 obj <> endobj 97 0 obj <> endobj 52 0 obj <> endobj 14 0 obj <> endobj 98 0 obj <> endobj 35 0 obj <> endobj 17 0 obj <> endobj 99 0 obj <> endobj 38 0 obj <> endobj 100 0 obj <> endobj 20 0 obj <> endobj 101 0 obj <> endobj 2 0 obj <>endobj xref 0 102 0000000000 65535 f 0000026274 00000 n 0000258414 00000 n 0000026164 00000 n 0000024783 00000 n 0000000015 00000 n 0000002198 00000 n 0000037275 00000 n 0000037127 00000 n 0000026322 00000 n 0000028007 00000 n 0000026404 00000 n 0000235304 00000 n 0000235085 00000 n 0000253124 00000 n 0000215270 00000 n 0000215055 00000 n 0000254529 00000 n 0000194749 00000 n 0000194533 00000 n 0000257046 00000 n 0000036979 00000 n 0000037011 00000 n 0000037041 00000 n 0000037073 00000 n 0000024994 00000 n 0000002218 00000 n 0000007474 00000 n 0000039025 00000 n 0000037422 00000 n 0000178057 00000 n 0000177829 00000 n 0000251731 00000 n 0000153018 00000 n 0000152816 00000 n 0000254383 00000 n 0000156334 00000 n 0000156115 00000 n 0000255814 00000 n 0000047997 00000 n 0000048029 00000 n 0000048061 00000 n 0000025189 00000 n 0000007495 00000 n 0000010912 00000 n 0000049751 00000 n 0000048148 00000 n 0000155556 00000 n 0000155323 00000 n 0000250700 00000 n 0000149829 00000 n 0000149627 00000 n 0000252978 00000 n 0000058723 00000 n 0000058755 00000 n 0000058787 00000 n 0000025384 00000 n 0000010933 00000 n 0000012839 00000 n 0000060488 00000 n 0000058885 00000 n 0000069460 00000 n 0000117386 00000 n 0000117418 00000 n 0000117461 00000 n 0000025579 00000 n 0000012860 00000 n 0000018226 00000 n 0000119118 00000 n 0000117515 00000 n 0000128090 00000 n 0000128122 00000 n 0000128154 00000 n 0000025774 00000 n 0000018247 00000 n 0000022546 00000 n 0000129822 00000 n 0000128219 00000 n 0000138794 00000 n 0000138826 00000 n 0000138858 00000 n 0000025969 00000 n 0000022567 00000 n 0000024762 00000 n 0000140526 00000 n 0000138923 00000 n 0000149498 00000 n 0000149530 00000 n 0000149562 00000 n 0000152795 00000 n 0000155302 00000 n 0000156095 00000 n 0000177807 00000 n 0000194511 00000 n 0000215033 00000 n 0000235063 00000 n 0000250678 00000 n 0000252918 00000 n 0000254301 00000 n 0000255704 00000 n 0000256985 00000 n 0000258218 00000 n trailer << /Size 102 /Root 1 0 R /Info 2 0 R >> startxref 258629 %%EOF Node-path: powersupply/itest/Bilt/trunk/libMagnet_V110/TestClass.cpp Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 8286 Text-content-md5: b02582e6c4999b0bab91d31c61d5f713 Content-length: 8296 PROPS-END #include #include #include #include "ClassMagnet.h" #include "Exception.h" //g++ -o TestClass TestClass.cpp -L./ -lMagnet using namespace itest; TMagnet *Magnet; void *func1_thread(void *arg); main (int argc, char **argv) { int val=0; struct idata myDataX_Magnet1; struct idata myDataY_Magnet1; struct idata myDataZ_Magnet1; struct mdata mymData_Magnet1; struct fdata myFDataX_Magnet1; try{ std::cout<<"---------------TEST1---------------"<addrIP_magnet()<pole(X).set_current_DC(1); Magnet->pole(Y).set_current_DC(-1); Magnet->pole(Z).set_current_DC(0); Magnet->set_state(1); sleep(2); std::cout<<"STATE :"<get_state()<pole(X).get_idata(&myDataX_Magnet1); Magnet->pole(Y).get_idata(&myDataY_Magnet1); Magnet->get_mdata(&mymData_Magnet1); Magnet->set_state(0); delete Magnet; std::cout<<"---------------IDATA---------------"<pole(X).clear_ferrors(); Magnet->set_state(MAGNET_ON); for(int i=0;i<10;i++) { std::cout<addrIP_magnet()<num_magnet()<pole(X).get_idata(&myDataX_Magnet1); sleep(1); Magnet->pole(X).set_current_DC(1); Magnet->pole(X).get_fdata(&myFDataX_Magnet1); std::cout<<"-----------------"<< "nbr frame:"<set_state(MAGNET_OFF); sleep(2); delete Magnet; } catch(ItestException &e) { for(int i=0;i #include #include namespace Bilt_ns { //+---------------------------------------------------------------------------- // // method : Bilt::Bilt(string &s) // // description : constructor for simulated Bilt // // in : - cl : Pointer to the DeviceClass object // - s : Device name // //----------------------------------------------------------------------------- Bilt::Bilt(Tango::DeviceClass *cl,string &s) :Tango::Device_4Impl(cl,s.c_str()) { init_device(); } Bilt::Bilt(Tango::DeviceClass *cl,const char *s) :Tango::Device_4Impl(cl,s) { init_device(); } Bilt::Bilt(Tango::DeviceClass *cl,const char *s,const char *d) :Tango::Device_4Impl(cl,s,d) { init_device(); } //+---------------------------------------------------------------------------- // // method : Bilt::delete_device() // // description : will be called at device destruction or at init command. // //----------------------------------------------------------------------------- void Bilt::delete_device() { // Delete device allocated objects delete BILT; } //+---------------------------------------------------------------------------- // // method : Bilt::init_device() // // description : will be called at device initialization. // //----------------------------------------------------------------------------- void Bilt::init_device() { INFO_STREAM << "Bilt::Bilt() create device " << device_name << endl; // Initialise variables to default values //-------------------------------------------- get_device_property(); set_state (Tango::UNKNOWN); try { BILT = new itest::TMagnet (iPAddress.c_str(), magnetNumber); POLE = &(BILT->pole(poleNumber)); } catch (itest::ItestException &e) { try { create_tango_exception (e, "Init failure" , "Cannot initialise ITEST libray objects", "Bilt::init_device"); } catch (Tango::DevFailed &e) { set_state (Tango::FAULT); } } } //+---------------------------------------------------------------------------- // // method : Bilt::get_device_property() // // description : Read the device properties from database. // //----------------------------------------------------------------------------- void Bilt::get_device_property() { // Initialize your default values here (if not done with POGO). //------------------------------------------------------------------ idata.magnet = 0; idata.pole = 0; idata.meascurr = 0; idata.measvolt = 0; idata.state = -1; idata.fail = "none"; fdata.nbrframe_sec = 0; fdata.nbrferr_sec = 0; fdata.min_sett_sec = 0; fdata.max_sett_sec = 0; fdata.average_sett_sec = 0; fdata.nbrferr = 0; current_dc = 0; set_current_ac = 0; impedance = 0; local_control = false; // Read device properties from database.(Automatic code generation) //------------------------------------------------------------------ Tango::DbData dev_prop; dev_prop.push_back(Tango::DbDatum("IPAddress")); dev_prop.push_back(Tango::DbDatum("MagnetNumber")); dev_prop.push_back(Tango::DbDatum("PoleNumber")); // Call database and extract values //-------------------------------------------- if (Tango::Util::instance()->_UseDb==true) get_db_device()->get_property(dev_prop); Tango::DbDatum def_prop, cl_prop; BiltClass *ds_class = (static_cast(get_device_class())); int i = -1; // Try to initialize IPAddress from class property cl_prop = ds_class->get_class_property(dev_prop[++i].name); if (cl_prop.is_empty()==false) cl_prop >> iPAddress; else { // Try to initialize IPAddress from default device value def_prop = ds_class->get_default_device_property(dev_prop[i].name); if (def_prop.is_empty()==false) def_prop >> iPAddress; } // And try to extract IPAddress value from database if (dev_prop[i].is_empty()==false) dev_prop[i] >> iPAddress; // Try to initialize MagnetNumber from class property cl_prop = ds_class->get_class_property(dev_prop[++i].name); if (cl_prop.is_empty()==false) cl_prop >> magnetNumber; else { // Try to initialize MagnetNumber from default device value def_prop = ds_class->get_default_device_property(dev_prop[i].name); if (def_prop.is_empty()==false) def_prop >> magnetNumber; } // And try to extract MagnetNumber value from database if (dev_prop[i].is_empty()==false) dev_prop[i] >> magnetNumber; // Try to initialize PoleNumber from class property cl_prop = ds_class->get_class_property(dev_prop[++i].name); if (cl_prop.is_empty()==false) cl_prop >> poleNumber; else { // Try to initialize PoleNumber from default device value def_prop = ds_class->get_default_device_property(dev_prop[i].name); if (def_prop.is_empty()==false) def_prop >> poleNumber; } // And try to extract PoleNumber value from database if (dev_prop[i].is_empty()==false) dev_prop[i] >> poleNumber; // End of Automatic code generation //------------------------------------------------------------------ } //+---------------------------------------------------------------------------- // // method : Bilt::always_executed_hook() // // description : method always executed before any command is executed // //----------------------------------------------------------------------------- void Bilt::always_executed_hook() { } //+---------------------------------------------------------------------------- // // method : Bilt::read_attr_hardware // // description : Hardware acquisition for attributes. // //----------------------------------------------------------------------------- void Bilt::read_attr_hardware(vector &attr_list) { DEBUG_STREAM << "Bilt::read_attr_hardware(vector &attr_list) entering... "<< endl; // Add your own code here } //+---------------------------------------------------------------------------- // // method : Bilt::read_Impedance // // description : Extract real attribute values for Impedance acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_Impedance(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_Impedance(Tango::Attribute &attr) entering... "<< endl; if ( idata.meascurr > 0.005 ) { impedance = idata.measvolt / idata.meascurr; attr.set_value (&impedance); } else attr.set_quality (Tango::ATTR_INVALID); } //+---------------------------------------------------------------------------- // // method : Bilt::read_LocalControl // // description : Extract real attribute values for LocalControl acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_LocalControl(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_LocalControl(Tango::Attribute &attr) entering... "<< endl; try { int switch_state = POLE->get_switch(); if ( switch_state == 1 ) local_control = false; else local_control = true; } catch (itest::ItestException &e) { create_tango_exception (e, "Read failure" , "Cannot read the actual switch state", "Bilt::read_LocalControl"); } attr.set_value (&local_control); } //+---------------------------------------------------------------------------- // // method : Bilt::write_LocalControl // // description : Write LocalControl attribute values to hardware. // //----------------------------------------------------------------------------- void Bilt::write_LocalControl(Tango::WAttribute &attr) { DEBUG_STREAM << "Bilt::write_LocalControl(Tango::WAttribute &attr) entering... "<< endl; attr.get_write_value(local_control); try { int switch_state; if ( local_control == true ) switch_state = 0; else switch_state = 1; POLE->set_switch (switch_state); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot write switch state", "Bilt::write_LocalControl"); } } //+---------------------------------------------------------------------------- // // method : Bilt::read_SetCurrentAC // // description : Extract real attribute values for SetCurrentAC acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_SetCurrentAC(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_SetCurrentAC(Tango::Attribute &attr) entering... "<< endl; if ( local_control == false ) { attr.set_quality (Tango::ATTR_INVALID); } else { attr.set_value (&set_current_ac); } } //+---------------------------------------------------------------------------- // // method : Bilt::write_SetCurrentAC // // description : Write SetCurrentAC attribute values to hardware. // //----------------------------------------------------------------------------- void Bilt::write_SetCurrentAC(Tango::WAttribute &attr) { DEBUG_STREAM << "Bilt::write_SetCurrentAC(Tango::WAttribute &attr) entering... "<< endl; // check whether local control is true if ( local_control == false ) { TangoSys_MemStream tms; tms << "Can set AC current only when local control enabled!" << endl; Tango::Except::throw_exception("WriteError", tms.str(), "Bilt::write_SetCurrentAC"); } attr.get_write_value(set_current_ac); try { POLE->set_current_AC (set_current_ac); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot write AC current value", "Bilt::write_SetCurrentAC"); } } //+---------------------------------------------------------------------------- // // method : Bilt::read_CurrentDC // // description : Extract real attribute values for CurrentDC acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_CurrentDC(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_CurrentDC(Tango::Attribute &attr) entering... "<< endl; try { current_dc = POLE->get_current_DC(); } catch (itest::ItestException &e) { create_tango_exception (e, "Read failure" , "Cannot read DC current value", "Bilt::read_CurrentDC"); } attr.set_value (¤t_dc); } //+---------------------------------------------------------------------------- // // method : Bilt::write_CurrentDC // // description : Write CurrentDC attribute values to hardware. // //----------------------------------------------------------------------------- void Bilt::write_CurrentDC(Tango::WAttribute &attr) { DEBUG_STREAM << "Bilt::write_CurrentDC(Tango::WAttribute &attr) entering... "<< endl; attr.get_write_value(attr_CurrentDC_write); try { POLE->set_current_DC (attr_CurrentDC_write); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot write DC current value", "Bilt::write_CurrentDC"); } } //+---------------------------------------------------------------------------- // // method : Bilt::read_CurrentAC // // description : Extract real attribute values for CurrentAC acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_CurrentAC(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_CurrentAC(Tango::Attribute &attr) entering... "<< endl; read_idata(); if ( errors.length() != 0 ) attr.set_quality(Tango::ATTR_INVALID); else attr.set_value (&idata.meascurr); } //+---------------------------------------------------------------------------- // // method : Bilt::read_Voltage // // description : Extract real attribute values for Voltage acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_Voltage(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_Voltage(Tango::Attribute &attr) entering... "<< endl; read_idata(); if ( errors.length() != 0 ) attr.set_quality(Tango::ATTR_INVALID); else attr.set_value (&idata.measvolt); } //+---------------------------------------------------------------------------- // // method : Bilt::read_SetMin // // description : Extract real attribute values for SetMin acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_SetMin(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_SetMin(Tango::Attribute &attr) entering... "<< endl; read_fdata(); if ( errors.length() != 0 ) attr.set_quality(Tango::ATTR_INVALID); else attr.set_value (&fdata.min_sett_sec); } //+---------------------------------------------------------------------------- // // method : Bilt::read_SetMax // // description : Extract real attribute values for SetMax acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_SetMax(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_SetMax(Tango::Attribute &attr) entering... "<< endl; read_fdata(); if ( errors.length() != 0 ) attr.set_quality(Tango::ATTR_INVALID); else attr.set_value (&fdata.max_sett_sec); } //+---------------------------------------------------------------------------- // // method : Bilt::read_SetAverage // // description : Extract real attribute values for SetAverage acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_SetAverage(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_SetAverage(Tango::Attribute &attr) entering... "<< endl; read_fdata(); if ( errors.length() != 0 ) attr.set_quality(Tango::ATTR_INVALID); else attr.set_value (&fdata.average_sett_sec); } //+---------------------------------------------------------------------------- // // method : Bilt::read_FramesPerSec // // description : Extract real attribute values for FramesPerSec acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_FramesPerSec(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_FramesPerSec(Tango::Attribute &attr) entering... "<< endl; read_fdata(); if ( errors.length() != 0 ) attr.set_quality(Tango::ATTR_INVALID); else attr.set_value ((Tango::DevULong *) &fdata.nbrframe_sec); } //+---------------------------------------------------------------------------- // // method : Bilt::read_ErrorPerSec // // description : Extract real attribute values for ErrorPerSec acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_ErrorPerSec(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_ErrorPerSec(Tango::Attribute &attr) entering... "<< endl; read_fdata(); if ( errors.length() != 0 ) attr.set_quality(Tango::ATTR_INVALID); else attr.set_value ((Tango::DevULong *) &fdata.nbrferr_sec); } //+---------------------------------------------------------------------------- // // method : Bilt::read_ErrorCounter // // description : Extract real attribute values for ErrorCounter acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_ErrorCounter(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_ErrorCounter(Tango::Attribute &attr) entering... "<< endl; read_fdata(); if ( errors.length() != 0 ) attr.set_quality(Tango::ATTR_INVALID); else attr.set_value ((Tango::DevULong *) &fdata.nbrferr); } //+------------------------------------------------------------------ /** * method: Bilt::on * * description: method to execute "On" * Turns on power supply. * * */ //+------------------------------------------------------------------ void Bilt::on() { DEBUG_STREAM << "Bilt::on(): entering... !" << endl; // Add your own code to control device here try { POLE->clear_ferrors(); BILT->set_state(1); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot switch on pole", "Bilt::on"); } } //+------------------------------------------------------------------ /** * method: Bilt::off * * description: method to execute "Off" * Turns of power supply * * */ //+------------------------------------------------------------------ void Bilt::off() { DEBUG_STREAM << "Bilt::off(): entering... !" << endl; // Add your own code to control device here try { BILT->set_state(0); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot switch off pole", "Bilt::off"); } } //+------------------------------------------------------------------ /** * method: Bilt::reset * * description: method to execute "Reset" * Reset faults and alarms * * */ //+------------------------------------------------------------------ void Bilt::reset() { DEBUG_STREAM << "Bilt::reset(): entering... !" << endl; // Add your own code to control device here try { BILT->clear_all_err(); BILT->clear_alarm(); POLE->clear_ferrors(); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot reset pole", "Bilt::reset"); } } //+------------------------------------------------------------------ /** * method: Bilt::create_tango_exception() * * description: convert an itest exception into a tango exception * * * in : - &e : Reference to itest exception * - reason : Reason of the local Tango exception to be added to the stack * - desc : Description for the local Tango exception to be added to the stack * - origin : Origin if the local Tango exception to be added to the stack */ //+------------------------------------------------------------------ void Bilt::create_tango_exception (itest::ItestException &e, string reason, string desc, string origin) { DEBUG_STREAM << "Bilt::create_tango_exception(): entering... !" << endl; errors.length(e.errors.size() + 1); int i; for(i=0; idevice_status data member) and returns it to the caller. * * @return Status description * */ //+------------------------------------------------------------------ Tango::ConstDevString Bilt::dev_status() { Tango::ConstDevString argout = DeviceImpl::dev_status(); DEBUG_STREAM << "Bilt::dev_status(): entering... !" << endl; // Add your own code to control device here stringstream status; Tango::DevState state = dev_state(); switch (state) { case Tango::ON: status << "Pole state : ON" << endl; break; case Tango::OFF: status << "Pole state : OFF" << endl; break; case Tango::ALARM: status << "Pole state : Alarm" << endl; status << "Alarm message : Overvoltage detected! (48V for 100ms)" << endl; break; case Tango::FAULT: status << "Pole state : Fault" << endl; status << "Fault code : " << idata.fail << endl; if ( idata.fail == "OVU" ) { status << "Fault descr. : Overvoltage detected! (48V for 100ms)" << endl; break; } if ( idata.fail == "OVI" ) { status << "Fault descr. : Short circuit detected!" << endl; break; } if ( idata.fail == "PWSK" ) { status << "Fault descr. : Absorbed power > 10W in 10ms!" << endl; break; } if ( idata.fail == "TEMP" ) { status << "Fault descr. : Max. temp on semiconductor reached!" << endl; break; } if ( idata.fail == "PWSO" ) { status << "Fault descr. : Delivered power > 40W in 100ms!" << endl; break; } status << "Fault descr. : Unkown fault code!" << endl; break; default: status << "Pole state : Unknown" << endl; status << "Error stack : " << endl; // print error from ITEST interface for(int i=0; iget_str_alarm() << endl; set_status(status.str()); return get_status().c_str(); } //+------------------------------------------------------------------ /** * method: Bilt::dev_state * * description: method to execute "State" * This command gets the device state (stored in its device_state data member) and returns it to the caller. * * @return State Code * */ //+------------------------------------------------------------------ Tango::DevState Bilt::dev_state() { Tango::DevState argout = DeviceImpl::dev_state(); DEBUG_STREAM << "Bilt::dev_state(): entering... !" << endl; // Add your own code to control device here read_idata(); if ( errors.length() != 0 ) set_state (Tango::UNKNOWN); else { // set the device state switch (idata.state) { case 0: set_state (Tango::OFF); break; case 1: set_state (Tango::ON); break; case 2: set_state (Tango::ALARM); break; case 3: set_state (Tango::FAULT); break; default: set_state (Tango::UNKNOWN); break; } } argout = get_state(); return argout; } } // namespace Node-path: powersupply/itest/Bilt/trunk/Bilt.h Node-kind: file Node-action: change Text-content-length: 9528 Text-content-md5: 6d8eb153c6dfd4504ed750ee64e039df Content-length: 9528 //============================================================================= // // file : Bilt.h // // description : Include for the Bilt class. // // project : BILT multi channel power supply // // $Author: meyer $ // // $Revision: 1.2 $ // $Date: 2009-11-06 12:46:25 $ // // SVN only: // $HeadURL: $ // // CVS only: // $Source: /segfs/tango/cvsroot/cppserver/machine/powersupply/SrSteerers/tango/Bilt/Bilt.h,v $ // $Log: not supported by cvs2svn $ // Revision 1.1.1.1 2009/11/04 16:23:02 meyer // Imported using TkCVS // // // copyleft : European Synchrotron Radiation Facility // BP 220, Grenoble 38043 // FRANCE // //============================================================================= // // This file is generated by POGO // (Program Obviously used to Generate tango Object) // // (c) - Software Engineering Group - ESRF //============================================================================= #ifndef _BILT_H #define _BILT_H #include #include #include //using namespace Tango; /** * @author $Author: meyer $ * @version $Revision: 1.2 $ */ // Add your own constant definitions here. //----------------------------------------------- namespace Bilt_ns { /** * Class Description: * The BILT multi channel power supply will be used with 3 channels for the ESRF fast * feedback systems. * The power supply can be controlled in 2 ways : * By this device server for slow or human control or * by the Libera Beam Position monitors for fast feedback with closed loop control. */ /* * Device States Description: * Tango::ON : Magnet is ON, all three channels are ON. * Tango::OFF : Magnet is OFF, all three channels are OFF. * Tango::FAULT : Error detected by the BILT magnet. * Tango::ALARM : Alarm detected on one or more channels. * Tango::UNKNOWN : Communication fault */ class Bilt: public Tango::Device_4Impl { public : // Add your own data members here //----------------------------------------- // Here is the Start of the automatic code generation part //------------------------------------------------------------- /** * @name attributes * Attribute member data. */ //@{ Tango::DevDouble *attr_CurrentDC_read; Tango::DevDouble attr_CurrentDC_write; Tango::DevDouble *attr_CurrentAC_read; Tango::DevDouble *attr_Voltage_read; Tango::DevDouble *attr_Impedance_read; Tango::DevDouble *attr_SetMin_read; Tango::DevDouble *attr_SetMax_read; Tango::DevDouble *attr_SetAverage_read; Tango::DevULong *attr_FramesPerSec_read; Tango::DevULong *attr_ErrorPerSec_read; Tango::DevULong *attr_ErrorCounter_read; Tango::DevBoolean *attr_LocalControl_read; Tango::DevBoolean attr_LocalControl_write; Tango::DevDouble *attr_SetCurrentAC_read; Tango::DevDouble attr_SetCurrentAC_write; //@} /** * @name Device properties * Device properties member data. */ //@{ /** * IP Address of BILT controller. * Each controller includes several magnets and * each magnet includes 3 power supplies, * for corrections in the X, Y and Z planes. * * */ string iPAddress; /** * Magnet number from 1 to 48 */ Tango::DevShort magnetNumber; /** * The number of the Pole to be used from 0 to 2 */ Tango::DevShort poleNumber; //@} /** * @name Device properties * Device property member data. */ //@{ //@} /**@name Constructors * Miscellaneous constructors */ //@{ /** * Constructs a newly allocated Command object. * * @param cl Class. * @param s Device Name */ Bilt(Tango::DeviceClass *cl,string &s); /** * Constructs a newly allocated Command object. * * @param cl Class. * @param s Device Name */ Bilt(Tango::DeviceClass *cl,const char *s); /** * Constructs a newly allocated Command object. * * @param cl Class. * @param s Device name * @param d Device description. */ Bilt(Tango::DeviceClass *cl,const char *s,const char *d); //@} /**@name Destructor * Only one destructor is defined for this class */ //@{ /** * The object destructor. */ ~Bilt() {delete_device();}; /** * will be called at device destruction or at init command. */ void delete_device(); //@} /**@name Miscellaneous methods */ //@{ /** * Initialize the device */ virtual void init_device(); /** * Always executed method before execution command method. */ virtual void always_executed_hook(); //@} /** * @name Bilt methods prototypes */ //@{ /** * Hardware acquisition for attributes. */ virtual void read_attr_hardware(vector &attr_list); /** * Extract real attribute values for CurrentDC acquisition result. */ virtual void read_CurrentDC(Tango::Attribute &attr); /** * Write CurrentDC attribute values to hardware. */ virtual void write_CurrentDC(Tango::WAttribute &attr); /** * Extract real attribute values for CurrentAC acquisition result. */ virtual void read_CurrentAC(Tango::Attribute &attr); /** * Extract real attribute values for Voltage acquisition result. */ virtual void read_Voltage(Tango::Attribute &attr); /** * Extract real attribute values for Impedance acquisition result. */ virtual void read_Impedance(Tango::Attribute &attr); /** * Extract real attribute values for SetMin acquisition result. */ virtual void read_SetMin(Tango::Attribute &attr); /** * Extract real attribute values for SetMax acquisition result. */ virtual void read_SetMax(Tango::Attribute &attr); /** * Extract real attribute values for SetAverage acquisition result. */ virtual void read_SetAverage(Tango::Attribute &attr); /** * Extract real attribute values for FramesPerSec acquisition result. */ virtual void read_FramesPerSec(Tango::Attribute &attr); /** * Extract real attribute values for ErrorPerSec acquisition result. */ virtual void read_ErrorPerSec(Tango::Attribute &attr); /** * Extract real attribute values for ErrorCounter acquisition result. */ virtual void read_ErrorCounter(Tango::Attribute &attr); /** * Extract real attribute values for LocalControl acquisition result. */ virtual void read_LocalControl(Tango::Attribute &attr); /** * Write LocalControl attribute values to hardware. */ virtual void write_LocalControl(Tango::WAttribute &attr); /** * Extract real attribute values for SetCurrentAC acquisition result. */ virtual void read_SetCurrentAC(Tango::Attribute &attr); /** * Write SetCurrentAC attribute values to hardware. */ virtual void write_SetCurrentAC(Tango::WAttribute &attr); /** * Read/Write allowed for CurrentDC attribute. */ virtual bool is_CurrentDC_allowed(Tango::AttReqType type); /** * Read/Write allowed for CurrentAC attribute. */ virtual bool is_CurrentAC_allowed(Tango::AttReqType type); /** * Read/Write allowed for Voltage attribute. */ virtual bool is_Voltage_allowed(Tango::AttReqType type); /** * Read/Write allowed for Impedance attribute. */ virtual bool is_Impedance_allowed(Tango::AttReqType type); /** * Read/Write allowed for SetMin attribute. */ virtual bool is_SetMin_allowed(Tango::AttReqType type); /** * Read/Write allowed for SetMax attribute. */ virtual bool is_SetMax_allowed(Tango::AttReqType type); /** * Read/Write allowed for SetAverage attribute. */ virtual bool is_SetAverage_allowed(Tango::AttReqType type); /** * Read/Write allowed for FramesPerSec attribute. */ virtual bool is_FramesPerSec_allowed(Tango::AttReqType type); /** * Read/Write allowed for ErrorPerSec attribute. */ virtual bool is_ErrorPerSec_allowed(Tango::AttReqType type); /** * Read/Write allowed for ErrorCounter attribute. */ virtual bool is_ErrorCounter_allowed(Tango::AttReqType type); /** * Read/Write allowed for LocalControl attribute. */ virtual bool is_LocalControl_allowed(Tango::AttReqType type); /** * Read/Write allowed for SetCurrentAC attribute. */ virtual bool is_SetCurrentAC_allowed(Tango::AttReqType type); /** * Execution allowed for On command. */ virtual bool is_On_allowed(const CORBA::Any &any); /** * Execution allowed for Off command. */ virtual bool is_Off_allowed(const CORBA::Any &any); /** * Execution allowed for Reset command. */ virtual bool is_Reset_allowed(const CORBA::Any &any); /** * This command gets the device state (stored in its device_state data member) and returns it to the caller. * @return State Code * @exception DevFailed */ virtual Tango::DevState dev_state(); /** * This command gets the device status (stored in its device_status data member) and returns it to the caller. * @return Status description * @exception DevFailed */ virtual Tango::ConstDevString dev_status(); /** * Turns on power supply. * @exception DevFailed */ void on(); /** * Turns of power supply * @exception DevFailed */ void off(); /** * Reset faults and alarms * @exception DevFailed */ void reset(); /** * Read the device properties from database */ void get_device_property(); //@} // Here is the end of the automatic code generation part //------------------------------------------------------------- protected : // Add your own data members here //----------------------------------------- void create_tango_exception (itest::ItestException &e, string reason, string desc, string origin); void read_idata(); void read_fdata(); itest::TMagnet *BILT; itest::TPole *POLE; struct itest::idata idata; struct itest::fdata fdata; double current_dc; double set_current_ac; double impedance; bool local_control; Tango::DevErrorList errors; }; } // namespace_ns #endif // _BILT_H Node-path: powersupply/itest/Bilt/trunk/BiltClass.cpp Node-kind: file Node-action: change Text-content-length: 22222 Text-content-md5: 807932be47708bda30c003d72c8372da Content-length: 22222 static const char *ClassId = "$Id: BiltClass.cpp,v 1.2 2009-11-06 12:46:25 meyer Exp $"; static const char *TagName = "$Name: not supported by cvs2svn $"; static const char *CvsPath = "$Source: /segfs/tango/cvsroot/cppserver/machine/powersupply/SrSteerers/tango/Bilt/BiltClass.cpp,v $"; static const char *SvnPath = "$HeadURL: $"; static const char *HttpServer = "http://www.esrf.fr/computing/cs/tango/tango_doc/ds_doc/"; //+============================================================================= // // file : BiltClass.cpp // // description : C++ source for the BiltClass. A singleton // class derived from DeviceClass. It implements the // command list and all properties and methods required // by the Bilt once per process. // // project : TANGO Device Server // // $Author: meyer $ // // $Revision: 1.2 $ // // $Log: not supported by cvs2svn $ // Revision 1.1.1.1 2009/11/04 16:23:02 meyer // Imported using TkCVS // // // copyleft : European Synchrotron Radiation Facility // BP 220, Grenoble 38043 // FRANCE // //-============================================================================= // // This file is generated by POGO // (Program Obviously used to Generate tango Object) // // (c) - Software Engineering Group - ESRF //============================================================================= #include #include #include //+---------------------------------------------------------------------------- /** * Create BiltClass singleton and return it in a C function for Python usage */ //+---------------------------------------------------------------------------- extern "C" { #ifdef WIN32 __declspec(dllexport) #endif Tango::DeviceClass *_create_Bilt_class(const char *name) { return Bilt_ns::BiltClass::init(name); } } namespace Bilt_ns { //+---------------------------------------------------------------------------- // // method : OnCmd::execute() // // description : method to trigger the execution of the command. // PLEASE DO NOT MODIFY this method core without pogo // // in : - device : The device on which the command must be executed // - in_any : The command input data // // returns : The command output data (packed in the Any object) // //----------------------------------------------------------------------------- CORBA::Any *OnCmd::execute(Tango::DeviceImpl *device,const CORBA::Any &in_any) { cout2 << "OnCmd::execute(): arrived" << endl; ((static_cast(device))->on()); return new CORBA::Any(); } //+---------------------------------------------------------------------------- // // method : OffCmd::execute() // // description : method to trigger the execution of the command. // PLEASE DO NOT MODIFY this method core without pogo // // in : - device : The device on which the command must be executed // - in_any : The command input data // // returns : The command output data (packed in the Any object) // //----------------------------------------------------------------------------- CORBA::Any *OffCmd::execute(Tango::DeviceImpl *device,const CORBA::Any &in_any) { cout2 << "OffCmd::execute(): arrived" << endl; ((static_cast(device))->off()); return new CORBA::Any(); } //+---------------------------------------------------------------------------- // // method : ResetCmd::execute() // // description : method to trigger the execution of the command. // PLEASE DO NOT MODIFY this method core without pogo // // in : - device : The device on which the command must be executed // - in_any : The command input data // // returns : The command output data (packed in the Any object) // //----------------------------------------------------------------------------- CORBA::Any *ResetCmd::execute(Tango::DeviceImpl *device,const CORBA::Any &in_any) { cout2 << "ResetCmd::execute(): arrived" << endl; ((static_cast(device))->reset()); return new CORBA::Any(); } // //---------------------------------------------------------------- // Initialize pointer for singleton pattern //---------------------------------------------------------------- // BiltClass *BiltClass::_instance = NULL; //+---------------------------------------------------------------------------- // // method : BiltClass::BiltClass(string &s) // // description : constructor for the BiltClass // // in : - s : The class name // //----------------------------------------------------------------------------- BiltClass::BiltClass(string &s):DeviceClass(s) { cout2 << "Entering BiltClass constructor" << endl; set_default_property(); get_class_property(); write_class_property(); cout2 << "Leaving BiltClass constructor" << endl; } //+---------------------------------------------------------------------------- // // method : BiltClass::~BiltClass() // // description : destructor for the BiltClass // //----------------------------------------------------------------------------- BiltClass::~BiltClass() { _instance = NULL; } //+---------------------------------------------------------------------------- // // method : BiltClass::instance // // description : Create the object if not already done. Otherwise, just // return a pointer to the object // // in : - name : The class name // //----------------------------------------------------------------------------- BiltClass *BiltClass::init(const char *name) { if (_instance == NULL) { try { string s(name); _instance = new BiltClass(s); } catch (bad_alloc) { throw; } } return _instance; } BiltClass *BiltClass::instance() { if (_instance == NULL) { cerr << "Class is not initialised !!" << endl; exit(-1); } return _instance; } //+---------------------------------------------------------------------------- // // method : BiltClass::command_factory // // description : Create the command object(s) and store them in the // command list // //----------------------------------------------------------------------------- void BiltClass::command_factory() { command_list.push_back(new OnCmd("On", Tango::DEV_VOID, Tango::DEV_VOID, "", "", Tango::OPERATOR)); command_list.push_back(new OffCmd("Off", Tango::DEV_VOID, Tango::DEV_VOID, "", "", Tango::OPERATOR)); command_list.push_back(new ResetCmd("Reset", Tango::DEV_VOID, Tango::DEV_VOID, "", "", Tango::OPERATOR)); // add polling if any for (unsigned int i=0 ; ilength() ; i++) { cout4 << "Device name : " << (*devlist_ptr)[i].in() << endl; // Create devices and add it into the device list //---------------------------------------------------- device_list.push_back(new Bilt(this, (*devlist_ptr)[i])); // Export device to the outside world // Check before if database used. //--------------------------------------------- if ((Tango::Util::_UseDb == true) && (Tango::Util::_FileDb == false)) export_device(device_list.back()); else export_device(device_list.back(), (*devlist_ptr)[i]); } // End of Automatic code generation //------------------------------------------------------------- } //+---------------------------------------------------------------------------- // Method: BiltClass::attribute_factory(vector &att_list) //----------------------------------------------------------------------------- void BiltClass::attribute_factory(vector &att_list) { // Attribute : CurrentDC CurrentDCAttrib *current_dc = new CurrentDCAttrib(); Tango::UserDefaultAttrProp current_dc_prop; current_dc_prop.set_label("DC Current"); current_dc_prop.set_unit("A"); current_dc_prop.set_format("%6.4f"); current_dc_prop.set_max_value("1.8"); current_dc_prop.set_min_value("0"); current_dc_prop.set_description("The DC current of the channel"); current_dc->set_default_properties(current_dc_prop); current_dc->set_memorized(); current_dc->set_memorized_init(true); att_list.push_back(current_dc); // Attribute : CurrentAC CurrentACAttrib *current_ac = new CurrentACAttrib(); Tango::UserDefaultAttrProp current_ac_prop; current_ac_prop.set_label("Current"); current_ac_prop.set_unit("A"); current_ac_prop.set_format("%6.4f"); current_ac_prop.set_description("The measured AC current of the channel"); current_ac->set_default_properties(current_ac_prop); att_list.push_back(current_ac); // Attribute : Voltage VoltageAttrib *voltage = new VoltageAttrib(); Tango::UserDefaultAttrProp voltage_prop; voltage_prop.set_label("Voltage"); voltage_prop.set_unit("V"); voltage_prop.set_format("%6.4f"); voltage_prop.set_description("The measured voltage of the channel"); voltage->set_default_properties(voltage_prop); att_list.push_back(voltage); // Attribute : Impedance ImpedanceAttrib *impedance = new ImpedanceAttrib(); Tango::UserDefaultAttrProp impedance_prop; impedance_prop.set_label("Impedance"); impedance_prop.set_unit("Ohms"); impedance_prop.set_format("%4.2f"); impedance_prop.set_max_alarm("5.0"); impedance_prop.set_description("Calculated impedance of the channel."); impedance->set_default_properties(impedance_prop); att_list.push_back(impedance); // Attribute : SetMin SetMinAttrib *set_min = new SetMinAttrib(); Tango::UserDefaultAttrProp set_min_prop; set_min_prop.set_label("Min. Setpoint/s"); set_min_prop.set_unit("A"); set_min_prop.set_format("%6.4f"); set_min_prop.set_description("Statistic when driven by the Libera.\nThe minimum setpoint applied during the last second."); set_min->set_default_properties(set_min_prop); att_list.push_back(set_min); // Attribute : SetMax SetMaxAttrib *set_max = new SetMaxAttrib(); Tango::UserDefaultAttrProp set_max_prop; set_max_prop.set_label("Max. Setpoint/s"); set_max_prop.set_unit("A"); set_max_prop.set_format("%6.4f"); set_max_prop.set_description("Statistic when driven by the Libera.\nThe maximum setpoint applied during the last second."); set_max->set_default_properties(set_max_prop); att_list.push_back(set_max); // Attribute : SetAverage SetAverageAttrib *set_average = new SetAverageAttrib(); Tango::UserDefaultAttrProp set_average_prop; set_average_prop.set_label("Average Setpoint/s"); set_average_prop.set_unit("A"); set_average_prop.set_format("%6.4f"); set_average_prop.set_description("Statistic when driven by the Libera.\nThe average setpoint applied during the last second."); set_average->set_default_properties(set_average_prop); att_list.push_back(set_average); // Attribute : FramesPerSec FramesPerSecAttrib *frames_per_sec = new FramesPerSecAttrib(); Tango::UserDefaultAttrProp frames_per_sec_prop; frames_per_sec_prop.set_label("Frames/s"); frames_per_sec_prop.set_unit(" "); frames_per_sec_prop.set_format("%3d"); frames_per_sec_prop.set_description("Statistic when driven by the Libera.\nThe number of setpoints per second."); frames_per_sec->set_default_properties(frames_per_sec_prop); att_list.push_back(frames_per_sec); // Attribute : ErrorPerSec ErrorPerSecAttrib *error_per_sec = new ErrorPerSecAttrib(); Tango::UserDefaultAttrProp error_per_sec_prop; error_per_sec_prop.set_label("Errors/s"); error_per_sec_prop.set_unit(" "); error_per_sec_prop.set_format("%3d"); error_per_sec_prop.set_description("Statistic when driven by the Libera.\nThe number of errors detected per second."); error_per_sec->set_default_properties(error_per_sec_prop); att_list.push_back(error_per_sec); // Attribute : ErrorCounter ErrorCounterAttrib *error_counter = new ErrorCounterAttrib(); Tango::UserDefaultAttrProp error_counter_prop; error_counter_prop.set_label("Error Counter"); error_counter_prop.set_unit(" "); error_counter_prop.set_format("%6d"); error_counter_prop.set_description("Statistic when driven by the Libera.\nThe total number of errors since the last reset."); error_counter->set_default_properties(error_counter_prop); att_list.push_back(error_counter); // Attribute : LocalControl LocalControlAttrib *local_control = new LocalControlAttrib(); Tango::UserDefaultAttrProp local_control_prop; local_control_prop.set_label("Local Control"); local_control_prop.set_unit(" "); local_control_prop.set_description("If true the AC current can be set on the device,\notherwise it is driven by the Libera."); local_control->set_default_properties(local_control_prop); att_list.push_back(local_control); // Attribute : SetCurrentAC SetCurrentACAttrib *set_current_ac = new SetCurrentACAttrib(); Tango::UserDefaultAttrProp set_current_ac_prop; set_current_ac_prop.set_label("AC Current Setpoint"); set_current_ac_prop.set_unit("A"); set_current_ac_prop.set_format("%6.4f"); set_current_ac_prop.set_max_value("0.2"); set_current_ac_prop.set_min_value("-0.2"); set_current_ac_prop.set_description("The AC current setpoint in local mode. If driven by the Libera, the attribute \nattribute value in INVALID."); set_current_ac->set_default_properties(set_current_ac_prop); att_list.push_back(set_current_ac); // End of Automatic code generation //------------------------------------------------------------- } //+---------------------------------------------------------------------------- // // method : BiltClass::get_class_property() // // description : Read the class properties from database. // //----------------------------------------------------------------------------- void BiltClass::get_class_property() { // Initialize your default values here (if not done with POGO). //------------------------------------------------------------------ // Read class properties from database.(Automatic code generation) //------------------------------------------------------------------ // Call database and extract values //-------------------------------------------- if (Tango::Util::instance()->_UseDb==true) get_db_class()->get_property(cl_prop); Tango::DbDatum def_prop; int i = -1; // End of Automatic code generation //------------------------------------------------------------------ } //+---------------------------------------------------------------------------- // // method : BiltClass::set_default_property // // description: Set default property (class and device) for wizard. // For each property, add to wizard property name and description // If default value has been set, add it to wizard property and // store it in a DbDatum. // //----------------------------------------------------------------------------- void BiltClass::set_default_property() { string prop_name; string prop_desc; string prop_def; vector vect_data; // Set Default Class Properties // Set Default Device Properties prop_name = "IPAddress"; prop_desc = "IP Address of BILT controller.\nEach controller includes several magnets and\neach magnet includes 3 power supplies,\nfor corrections in the X, Y and Z planes.\n\n"; prop_def = "0.0.0.0"; vect_data.clear(); vect_data.push_back("0.0.0.0"); if (prop_def.length()>0) { Tango::DbDatum data(prop_name); data << vect_data ; dev_def_prop.push_back(data); add_wiz_dev_prop(prop_name, prop_desc, prop_def); } else add_wiz_dev_prop(prop_name, prop_desc); prop_name = "MagnetNumber"; prop_desc = "Magnet number from 1 to 48"; prop_def = "0"; vect_data.clear(); vect_data.push_back("0"); if (prop_def.length()>0) { Tango::DbDatum data(prop_name); data << vect_data ; dev_def_prop.push_back(data); add_wiz_dev_prop(prop_name, prop_desc, prop_def); } else add_wiz_dev_prop(prop_name, prop_desc); prop_name = "PoleNumber"; prop_desc = "The number of the Pole to be used from 0 to 2"; prop_def = "0"; vect_data.clear(); vect_data.push_back("0"); if (prop_def.length()>0) { Tango::DbDatum data(prop_name); data << vect_data ; dev_def_prop.push_back(data); add_wiz_dev_prop(prop_name, prop_desc, prop_def); } else add_wiz_dev_prop(prop_name, prop_desc); } //+---------------------------------------------------------------------------- // // method : BiltClass::write_class_property // // description : Set class description as property in database // //----------------------------------------------------------------------------- void BiltClass::write_class_property() { // First time, check if database used //-------------------------------------------- if (Tango::Util::_UseDb == false) return; Tango::DbData data; string classname = get_name(); string header; string::size_type start, end; // Put title Tango::DbDatum title("ProjectTitle"); string str_title("BILT multi channel power supply"); title << str_title; data.push_back(title); // Put Description Tango::DbDatum description("Description"); vector str_desc; str_desc.push_back("The BILT multi channel power supply will be used with 3 channels for the ESRF fast"); str_desc.push_back("feedback systems."); str_desc.push_back("The power supply can be controlled in 2 ways :"); str_desc.push_back("By this device server for slow or human control or"); str_desc.push_back("by the Libera Beam Position monitors for fast feedback with closed loop control."); description << str_desc; data.push_back(description); // put cvs or svn location string filename(classname); filename += "Class.cpp"; // Create a string with the class ID to // get the string into the binary string class_id(ClassId); // check for cvs information string src_path(CvsPath); start = src_path.find("/"); if (start!=string::npos) { end = src_path.find(filename); if (end>start) { string strloc = src_path.substr(start, end-start); // Check if specific repository start = strloc.find("/cvsroot/"); if (start!=string::npos && start>0) { string repository = strloc.substr(0, start); if (repository.find("/segfs/")!=string::npos) strloc = "ESRF:" + strloc.substr(start, strloc.length()-start); } Tango::DbDatum cvs_loc("cvs_location"); cvs_loc << strloc; data.push_back(cvs_loc); } } // check for svn information else { string src_path(SvnPath); start = src_path.find("://"); if (start!=string::npos) { end = src_path.find(filename); if (end>start) { header = "$HeadURL: "; start = header.length(); string strloc = src_path.substr(start, (end-start)); Tango::DbDatum svn_loc("svn_location"); svn_loc << strloc; data.push_back(svn_loc); } } } // Get CVS or SVN revision tag // CVS tag string tagname(TagName); header = "$Name: "; start = header.length(); string endstr(" $"); end = tagname.find(endstr); if (end!=string::npos && end>start) { string strtag = tagname.substr(start, end-start); Tango::DbDatum cvs_tag("cvs_tag"); cvs_tag << strtag; data.push_back(cvs_tag); } // SVN tag string svnpath(SvnPath); header = "$HeadURL: "; start = header.length(); end = svnpath.find(endstr); if (end!=string::npos && end>start) { string strloc = svnpath.substr(start, end-start); string tagstr ("/tags/"); start = strloc.find(tagstr); if ( start!=string::npos ) { start = start + tagstr.length(); end = strloc.find(filename); string strtag = strloc.substr(start, end-start-1); Tango::DbDatum svn_tag("svn_tag"); svn_tag << strtag; data.push_back(svn_tag); } } // Get URL location string httpServ(HttpServer); if (httpServ.length()>0) { Tango::DbDatum db_doc_url("doc_url"); db_doc_url << httpServ; data.push_back(db_doc_url); } // Put inheritance Tango::DbDatum inher_datum("InheritedFrom"); vector inheritance; inheritance.push_back("Device_4Impl"); inher_datum << inheritance; data.push_back(inher_datum); // Call database and and values //-------------------------------------------- get_db_class()->put_property(data); } } // namespace Node-path: powersupply/itest/Bilt/trunk/BiltClass.h Node-kind: file Node-action: change Text-content-length: 9799 Text-content-md5: 64fe921ed05e74343dd1eac2d650f0c8 Content-length: 9799 //============================================================================= // // file : BiltClass.h // // description : Include for the BiltClass root class. // This class is the singleton class for // the Bilt device class. // It contains all properties and methods which the // Bilt requires only once e.g. the commands. // // project : TANGO Device Server // // $Author: meyer $ // // $Revision: 1.2 $ // $Date: 2009-11-06 12:46:25 $ // // SVN only: // $HeadURL: $ // // CVS only: // $Source: /segfs/tango/cvsroot/cppserver/machine/powersupply/SrSteerers/tango/Bilt/BiltClass.h,v $ // $Log: not supported by cvs2svn $ // Revision 1.1.1.1 2009/11/04 16:23:02 meyer // Imported using TkCVS // // // copyleft : European Synchrotron Radiation Facility // BP 220, Grenoble 38043 // FRANCE // //============================================================================= // // This file is generated by POGO // (Program Obviously used to Generate tango Object) // // (c) - Software Engineering Group - ESRF //============================================================================= #ifndef _BILTCLASS_H #define _BILTCLASS_H #include #include namespace Bilt_ns {//===================================== // Define classes for attributes //===================================== class SetCurrentACAttrib: public Tango::Attr { public: SetCurrentACAttrib():Attr("SetCurrentAC", Tango::DEV_DOUBLE, Tango::READ_WRITE) {}; ~SetCurrentACAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_SetCurrentAC(att);} virtual void write(Tango::DeviceImpl *dev,Tango::WAttribute &att) {(static_cast(dev))->write_SetCurrentAC(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_SetCurrentAC_allowed(ty);} }; class LocalControlAttrib: public Tango::Attr { public: LocalControlAttrib():Attr("LocalControl", Tango::DEV_BOOLEAN, Tango::READ_WRITE) {}; ~LocalControlAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_LocalControl(att);} virtual void write(Tango::DeviceImpl *dev,Tango::WAttribute &att) {(static_cast(dev))->write_LocalControl(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_LocalControl_allowed(ty);} }; class ErrorCounterAttrib: public Tango::Attr { public: ErrorCounterAttrib():Attr("ErrorCounter", Tango::DEV_ULONG, Tango::READ) {}; ~ErrorCounterAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_ErrorCounter(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_ErrorCounter_allowed(ty);} }; class ErrorPerSecAttrib: public Tango::Attr { public: ErrorPerSecAttrib():Attr("ErrorPerSec", Tango::DEV_ULONG, Tango::READ) {}; ~ErrorPerSecAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_ErrorPerSec(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_ErrorPerSec_allowed(ty);} }; class FramesPerSecAttrib: public Tango::Attr { public: FramesPerSecAttrib():Attr("FramesPerSec", Tango::DEV_ULONG, Tango::READ) {}; ~FramesPerSecAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_FramesPerSec(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_FramesPerSec_allowed(ty);} }; class SetAverageAttrib: public Tango::Attr { public: SetAverageAttrib():Attr("SetAverage", Tango::DEV_DOUBLE, Tango::READ) {}; ~SetAverageAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_SetAverage(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_SetAverage_allowed(ty);} }; class SetMaxAttrib: public Tango::Attr { public: SetMaxAttrib():Attr("SetMax", Tango::DEV_DOUBLE, Tango::READ) {}; ~SetMaxAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_SetMax(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_SetMax_allowed(ty);} }; class SetMinAttrib: public Tango::Attr { public: SetMinAttrib():Attr("SetMin", Tango::DEV_DOUBLE, Tango::READ) {}; ~SetMinAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_SetMin(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_SetMin_allowed(ty);} }; class ImpedanceAttrib: public Tango::Attr { public: ImpedanceAttrib():Attr("Impedance", Tango::DEV_DOUBLE, Tango::READ) {}; ~ImpedanceAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_Impedance(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_Impedance_allowed(ty);} }; class VoltageAttrib: public Tango::Attr { public: VoltageAttrib():Attr("Voltage", Tango::DEV_DOUBLE, Tango::READ) {}; ~VoltageAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_Voltage(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_Voltage_allowed(ty);} }; class CurrentACAttrib: public Tango::Attr { public: CurrentACAttrib():Attr("CurrentAC", Tango::DEV_DOUBLE, Tango::READ) {}; ~CurrentACAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_CurrentAC(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_CurrentAC_allowed(ty);} }; class CurrentDCAttrib: public Tango::Attr { public: CurrentDCAttrib():Attr("CurrentDC", Tango::DEV_DOUBLE, Tango::READ_WRITE) {}; ~CurrentDCAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_CurrentDC(att);} virtual void write(Tango::DeviceImpl *dev,Tango::WAttribute &att) {(static_cast(dev))->write_CurrentDC(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_CurrentDC_allowed(ty);} }; //========================================= // Define classes for commands //========================================= class ResetCmd : public Tango::Command { public: ResetCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out, const char *in_desc, const char *out_desc, Tango::DispLevel level) :Command(name,in,out,in_desc,out_desc, level) {}; ResetCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out) :Command(name,in,out) {}; ~ResetCmd() {}; virtual CORBA::Any *execute (Tango::DeviceImpl *dev, const CORBA::Any &any); virtual bool is_allowed (Tango::DeviceImpl *dev, const CORBA::Any &any) {return (static_cast(dev))->is_Reset_allowed(any);} }; class OffCmd : public Tango::Command { public: OffCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out, const char *in_desc, const char *out_desc, Tango::DispLevel level) :Command(name,in,out,in_desc,out_desc, level) {}; OffCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out) :Command(name,in,out) {}; ~OffCmd() {}; virtual CORBA::Any *execute (Tango::DeviceImpl *dev, const CORBA::Any &any); virtual bool is_allowed (Tango::DeviceImpl *dev, const CORBA::Any &any) {return (static_cast(dev))->is_Off_allowed(any);} }; class OnCmd : public Tango::Command { public: OnCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out, const char *in_desc, const char *out_desc, Tango::DispLevel level) :Command(name,in,out,in_desc,out_desc, level) {}; OnCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out) :Command(name,in,out) {}; ~OnCmd() {}; virtual CORBA::Any *execute (Tango::DeviceImpl *dev, const CORBA::Any &any); virtual bool is_allowed (Tango::DeviceImpl *dev, const CORBA::Any &any) {return (static_cast(dev))->is_On_allowed(any);} }; // // The BiltClass singleton definition // class #ifdef WIN32 __declspec(dllexport) #endif BiltClass : public Tango::DeviceClass { public: // properties member data // add your own data members here //------------------------------------ public: Tango::DbData cl_prop; Tango::DbData cl_def_prop; Tango::DbData dev_def_prop; // Method prototypes static BiltClass *init(const char *); static BiltClass *instance(); ~BiltClass(); Tango::DbDatum get_class_property(string &); Tango::DbDatum get_default_device_property(string &); Tango::DbDatum get_default_class_property(string &); protected: BiltClass(string &); static BiltClass *_instance; void command_factory(); void get_class_property(); void attribute_factory(vector &); void write_class_property(); void set_default_property(); string get_cvstag(); string get_cvsroot(); private: void device_factory(const Tango::DevVarStringArray *); }; } // namespace Bilt_ns #endif // _BILTCLASS_H Node-path: powersupply/itest/Bilt/trunk/BiltStateMachine.cpp Node-kind: file Node-action: change Text-content-length: 8332 Text-content-md5: db15e4f875c2d5e60951af0a5a94a99a Content-length: 8332 static const char *RcsId = "$Id $"; //+============================================================================= // // file : BiltStateMachine.cpp // // description : C++ source for the Bilt and its alowed // methods for commands and attributes // // project : TANGO Device Server // // $Author: meyer $ // // $Revision: 1.2 $ // $Date: 2009-11-06 12:46:25 $ // // SVN only: // $HeadURL: $ // // CVS only: // $Source: /segfs/tango/cvsroot/cppserver/machine/powersupply/SrSteerers/tango/Bilt/BiltStateMachine.cpp,v $ // $Log: not supported by cvs2svn $ // Revision 1.1.1.1 2009/11/04 16:23:02 meyer // Imported using TkCVS // // // copyleft : European Synchrotron Radiation Facility // BP 220, Grenoble 38043 // FRANCE // //-============================================================================= // // This file is generated by POGO // (Program Obviously used to Generate tango Object) // // (c) - Software Engineering Group - ESRF //============================================================================= #include #include #include /*==================================================================== * This file contains the methods to allow commands and attributes * read or write execution. * * If you wand to add your own code, add it between * the "End/Re-Start of Generated Code" comments. * * If you want, you can also add your own methods. *==================================================================== */ namespace Bilt_ns { //================================================= // Attributes Allowed Methods //================================================= //+---------------------------------------------------------------------------- // // method : Bilt::is_CurrentDC_allowed // // description : Read/Write allowed for CurrentDC attribute. // //----------------------------------------------------------------------------- bool Bilt::is_CurrentDC_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_CurrentAC_allowed // // description : Read/Write allowed for CurrentAC attribute. // //----------------------------------------------------------------------------- bool Bilt::is_CurrentAC_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_Voltage_allowed // // description : Read/Write allowed for Voltage attribute. // //----------------------------------------------------------------------------- bool Bilt::is_Voltage_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_SetMin_allowed // // description : Read/Write allowed for SetMin attribute. // //----------------------------------------------------------------------------- bool Bilt::is_SetMin_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_SetMax_allowed // // description : Read/Write allowed for SetMax attribute. // //----------------------------------------------------------------------------- bool Bilt::is_SetMax_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_SetAverage_allowed // // description : Read/Write allowed for SetAverage attribute. // //----------------------------------------------------------------------------- bool Bilt::is_SetAverage_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_FramesPerSec_allowed // // description : Read/Write allowed for FramesPerSec attribute. // //----------------------------------------------------------------------------- bool Bilt::is_FramesPerSec_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_ErrorPerSec_allowed // // description : Read/Write allowed for ErrorPerSec attribute. // //----------------------------------------------------------------------------- bool Bilt::is_ErrorPerSec_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_ErrorCounter_allowed // // description : Read/Write allowed for ErrorCounter attribute. // //----------------------------------------------------------------------------- bool Bilt::is_ErrorCounter_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_LocalControl_allowed // // description : Read/Write allowed for LocalControl attribute. // //----------------------------------------------------------------------------- bool Bilt::is_LocalControl_allowed(Tango::AttReqType type) { if (get_state() == Tango::OFF || get_state() == Tango::FAULT || get_state() == Tango::UNKNOWN) { // End of Generated Code // Re-Start of Generated Code return false; } return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_SetCurrentAC_allowed // // description : Read/Write allowed for SetCurrentAC attribute. // //----------------------------------------------------------------------------- bool Bilt::is_SetCurrentAC_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_Impedance_allowed // // description : Read/Write allowed for Impedance attribute. // //----------------------------------------------------------------------------- bool Bilt::is_Impedance_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //================================================= // Commands Allowed Methods //================================================= //+---------------------------------------------------------------------------- // // method : Bilt::is_On_allowed // // description : Execution allowed for On command. // //----------------------------------------------------------------------------- bool Bilt::is_On_allowed(const CORBA::Any &any) { if (get_state() == Tango::ON || get_state() == Tango::FAULT || get_state() == Tango::UNKNOWN) { // End of Generated Code // Re-Start of Generated Code return false; } return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_Off_allowed // // description : Execution allowed for Off command. // //----------------------------------------------------------------------------- bool Bilt::is_Off_allowed(const CORBA::Any &any) { if (get_state() == Tango::OFF || get_state() == Tango::UNKNOWN) { // End of Generated Code // Re-Start of Generated Code return false; } return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_Reset_allowed // // description : Execution allowed for Reset command. // //----------------------------------------------------------------------------- bool Bilt::is_Reset_allowed(const CORBA::Any &any) { if (get_state() == Tango::UNKNOWN) { // End of Generated Code // Re-Start of Generated Code return false; } return true; } } // namespace Bilt_ns Revision-number: 5 Prop-content-length: 147 Content-length: 147 K 10 svn:author V 5 meyer K 8 svn:date V 27 2009-11-23T16:46:58.000000Z K 7 svn:log V 47 Corrected state, status and exception handling PROPS-END Node-path: powersupply/itest/Bilt/trunk/Bilt.cpp Node-kind: file Node-action: change Text-content-length: 26028 Text-content-md5: d8ac50cf400c8be2df8e26c1c197c34c Content-length: 26028 static const char *RcsId = "$Id: Bilt.cpp,v 1.3 2009-11-23 16:46:58 meyer Exp $"; //+============================================================================= // // file : Bilt.cpp // // description : C++ source for the Bilt and its commands. // The class is derived from Device. It represents the // CORBA servant object which will be accessed from the // network. All commands which can be executed on the // Bilt are implemented in this file. // // project : TANGO Device Server // // $Author: meyer $ // // $Revision: 1.3 $ // // $Revision: 1.3 $ // $Date: 2009-11-23 16:46:58 $ // // SVN only: // $HeadURL: $ // // CVS only: // $Source: /segfs/tango/cvsroot/cppserver/machine/powersupply/SrSteerers/tango/Bilt/Bilt.cpp,v $ // $Log: not supported by cvs2svn $ // Revision 1.2 2009/11/06 12:46:25 meyer // Added impedance attribute and corrected fromatting of attribute values. // // Revision 1.1.1.1 2009/11/04 16:23:02 meyer // Imported using TkCVS // // // copyleft : European Synchrotron Radiation Facility // BP 220, Grenoble 38043 // FRANCE // //-============================================================================= // // This file is generated by POGO // (Program Obviously used to Generate tango Object) // // (c) - Software Engineering Group - ESRF //============================================================================= //=================================================================== // // The following table gives the correspondence // between commands and method name. // // Command name| Method name // ---------------------------------------- // State | dev_state() // Status | dev_status() // On | on() // Off | off() // Reset | reset() // //=================================================================== #include #include #include namespace Bilt_ns { //+---------------------------------------------------------------------------- // // method : Bilt::Bilt(string &s) // // description : constructor for simulated Bilt // // in : - cl : Pointer to the DeviceClass object // - s : Device name // //----------------------------------------------------------------------------- Bilt::Bilt(Tango::DeviceClass *cl,string &s) :Tango::Device_4Impl(cl,s.c_str()) { init_device(); } Bilt::Bilt(Tango::DeviceClass *cl,const char *s) :Tango::Device_4Impl(cl,s) { init_device(); } Bilt::Bilt(Tango::DeviceClass *cl,const char *s,const char *d) :Tango::Device_4Impl(cl,s,d) { init_device(); } //+---------------------------------------------------------------------------- // // method : Bilt::delete_device() // // description : will be called at device destruction or at init command. // //----------------------------------------------------------------------------- void Bilt::delete_device() { // Delete device allocated objects delete BILT; } //+---------------------------------------------------------------------------- // // method : Bilt::init_device() // // description : will be called at device initialization. // //----------------------------------------------------------------------------- void Bilt::init_device() { INFO_STREAM << "Bilt::Bilt() create device " << device_name << endl; // Initialise variables to default values //-------------------------------------------- get_device_property(); set_state (Tango::UNKNOWN); try { BILT = new itest::TMagnet (iPAddress.c_str(), magnetNumber); POLE = &(BILT->pole(poleNumber)); } catch (itest::ItestException &e) { try { create_tango_exception (e, "Init failure" , "Cannot initialise ITEST libray objects", "Bilt::init_device"); } catch (Tango::DevFailed &e) { set_state (Tango::FAULT); } } } //+---------------------------------------------------------------------------- // // method : Bilt::get_device_property() // // description : Read the device properties from database. // //----------------------------------------------------------------------------- void Bilt::get_device_property() { // Initialize your default values here (if not done with POGO). //------------------------------------------------------------------ idata.magnet = 0; idata.pole = 0; idata.meascurr = 0; idata.measvolt = 0; idata.state = -1; idata.fail = "none"; fdata.nbrframe_sec = 0; fdata.nbrferr_sec = 0; fdata.min_sett_sec = 0; fdata.max_sett_sec = 0; fdata.average_sett_sec = 0; fdata.nbrferr = 0; current_dc = 0; set_current_ac = 0; impedance = 0; local_control = false; // Read device properties from database.(Automatic code generation) //------------------------------------------------------------------ Tango::DbData dev_prop; dev_prop.push_back(Tango::DbDatum("IPAddress")); dev_prop.push_back(Tango::DbDatum("MagnetNumber")); dev_prop.push_back(Tango::DbDatum("PoleNumber")); // Call database and extract values //-------------------------------------------- if (Tango::Util::instance()->_UseDb==true) get_db_device()->get_property(dev_prop); Tango::DbDatum def_prop, cl_prop; BiltClass *ds_class = (static_cast(get_device_class())); int i = -1; // Try to initialize IPAddress from class property cl_prop = ds_class->get_class_property(dev_prop[++i].name); if (cl_prop.is_empty()==false) cl_prop >> iPAddress; else { // Try to initialize IPAddress from default device value def_prop = ds_class->get_default_device_property(dev_prop[i].name); if (def_prop.is_empty()==false) def_prop >> iPAddress; } // And try to extract IPAddress value from database if (dev_prop[i].is_empty()==false) dev_prop[i] >> iPAddress; // Try to initialize MagnetNumber from class property cl_prop = ds_class->get_class_property(dev_prop[++i].name); if (cl_prop.is_empty()==false) cl_prop >> magnetNumber; else { // Try to initialize MagnetNumber from default device value def_prop = ds_class->get_default_device_property(dev_prop[i].name); if (def_prop.is_empty()==false) def_prop >> magnetNumber; } // And try to extract MagnetNumber value from database if (dev_prop[i].is_empty()==false) dev_prop[i] >> magnetNumber; // Try to initialize PoleNumber from class property cl_prop = ds_class->get_class_property(dev_prop[++i].name); if (cl_prop.is_empty()==false) cl_prop >> poleNumber; else { // Try to initialize PoleNumber from default device value def_prop = ds_class->get_default_device_property(dev_prop[i].name); if (def_prop.is_empty()==false) def_prop >> poleNumber; } // And try to extract PoleNumber value from database if (dev_prop[i].is_empty()==false) dev_prop[i] >> poleNumber; // End of Automatic code generation //------------------------------------------------------------------ } //+---------------------------------------------------------------------------- // // method : Bilt::always_executed_hook() // // description : method always executed before any command is executed // //----------------------------------------------------------------------------- void Bilt::always_executed_hook() { } //+---------------------------------------------------------------------------- // // method : Bilt::read_attr_hardware // // description : Hardware acquisition for attributes. // //----------------------------------------------------------------------------- void Bilt::read_attr_hardware(vector &attr_list) { DEBUG_STREAM << "Bilt::read_attr_hardware(vector &attr_list) entering... "<< endl; // Add your own code here } //+---------------------------------------------------------------------------- // // method : Bilt::read_Impedance // // description : Extract real attribute values for Impedance acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_Impedance(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_Impedance(Tango::Attribute &attr) entering... "<< endl; if ( idata.meascurr > 0.005 ) { impedance = idata.measvolt / idata.meascurr; attr.set_value (&impedance); } else attr.set_quality (Tango::ATTR_INVALID); } //+---------------------------------------------------------------------------- // // method : Bilt::read_LocalControl // // description : Extract real attribute values for LocalControl acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_LocalControl(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_LocalControl(Tango::Attribute &attr) entering... "<< endl; try { int switch_state = POLE->get_switch(); if ( switch_state == 1 ) local_control = false; else local_control = true; } catch (itest::ItestException &e) { create_tango_exception (e, "Read failure" , "Cannot read the actual switch state", "Bilt::read_LocalControl"); } attr.set_value (&local_control); } //+---------------------------------------------------------------------------- // // method : Bilt::write_LocalControl // // description : Write LocalControl attribute values to hardware. // //----------------------------------------------------------------------------- void Bilt::write_LocalControl(Tango::WAttribute &attr) { DEBUG_STREAM << "Bilt::write_LocalControl(Tango::WAttribute &attr) entering... "<< endl; attr.get_write_value(local_control); try { int switch_state; if ( local_control == true ) switch_state = 0; else switch_state = 1; POLE->set_switch (switch_state); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot write switch state", "Bilt::write_LocalControl"); } } //+---------------------------------------------------------------------------- // // method : Bilt::read_SetCurrentAC // // description : Extract real attribute values for SetCurrentAC acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_SetCurrentAC(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_SetCurrentAC(Tango::Attribute &attr) entering... "<< endl; if ( local_control == false ) { attr.set_quality (Tango::ATTR_INVALID); } else { attr.set_value (&set_current_ac); } } //+---------------------------------------------------------------------------- // // method : Bilt::write_SetCurrentAC // // description : Write SetCurrentAC attribute values to hardware. // //----------------------------------------------------------------------------- void Bilt::write_SetCurrentAC(Tango::WAttribute &attr) { DEBUG_STREAM << "Bilt::write_SetCurrentAC(Tango::WAttribute &attr) entering... "<< endl; // check whether local control is true if ( local_control == false ) { TangoSys_MemStream tms; tms << "Can set AC current only when local control enabled!" << endl; Tango::Except::throw_exception("WriteError", tms.str(), "Bilt::write_SetCurrentAC"); } attr.get_write_value(set_current_ac); try { POLE->set_current_AC (set_current_ac); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot write AC current value", "Bilt::write_SetCurrentAC"); } } //+---------------------------------------------------------------------------- // // method : Bilt::read_CurrentDC // // description : Extract real attribute values for CurrentDC acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_CurrentDC(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_CurrentDC(Tango::Attribute &attr) entering... "<< endl; try { current_dc = POLE->get_current_DC(); } catch (itest::ItestException &e) { create_tango_exception (e, "Read failure" , "Cannot read DC current value", "Bilt::read_CurrentDC"); } attr.set_value (¤t_dc); } //+---------------------------------------------------------------------------- // // method : Bilt::write_CurrentDC // // description : Write CurrentDC attribute values to hardware. // //----------------------------------------------------------------------------- void Bilt::write_CurrentDC(Tango::WAttribute &attr) { DEBUG_STREAM << "Bilt::write_CurrentDC(Tango::WAttribute &attr) entering... "<< endl; attr.get_write_value(attr_CurrentDC_write); try { POLE->set_current_DC (attr_CurrentDC_write); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot write DC current value", "Bilt::write_CurrentDC"); } } //+---------------------------------------------------------------------------- // // method : Bilt::read_CurrentAC // // description : Extract real attribute values for CurrentAC acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_CurrentAC(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_CurrentAC(Tango::Attribute &attr) entering... "<< endl; read_idata(); if ( errors.length() != 0 ) attr.set_quality(Tango::ATTR_INVALID); else attr.set_value (&idata.meascurr); } //+---------------------------------------------------------------------------- // // method : Bilt::read_Voltage // // description : Extract real attribute values for Voltage acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_Voltage(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_Voltage(Tango::Attribute &attr) entering... "<< endl; read_idata(); if ( errors.length() != 0 ) attr.set_quality(Tango::ATTR_INVALID); else attr.set_value (&idata.measvolt); } //+---------------------------------------------------------------------------- // // method : Bilt::read_SetMin // // description : Extract real attribute values for SetMin acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_SetMin(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_SetMin(Tango::Attribute &attr) entering... "<< endl; read_fdata(); if ( errors.length() != 0 ) attr.set_quality(Tango::ATTR_INVALID); else attr.set_value (&fdata.min_sett_sec); } //+---------------------------------------------------------------------------- // // method : Bilt::read_SetMax // // description : Extract real attribute values for SetMax acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_SetMax(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_SetMax(Tango::Attribute &attr) entering... "<< endl; read_fdata(); if ( errors.length() != 0 ) attr.set_quality(Tango::ATTR_INVALID); else attr.set_value (&fdata.max_sett_sec); } //+---------------------------------------------------------------------------- // // method : Bilt::read_SetAverage // // description : Extract real attribute values for SetAverage acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_SetAverage(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_SetAverage(Tango::Attribute &attr) entering... "<< endl; read_fdata(); if ( errors.length() != 0 ) attr.set_quality(Tango::ATTR_INVALID); else attr.set_value (&fdata.average_sett_sec); } //+---------------------------------------------------------------------------- // // method : Bilt::read_FramesPerSec // // description : Extract real attribute values for FramesPerSec acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_FramesPerSec(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_FramesPerSec(Tango::Attribute &attr) entering... "<< endl; read_fdata(); if ( errors.length() != 0 ) attr.set_quality(Tango::ATTR_INVALID); else attr.set_value ((Tango::DevULong *) &fdata.nbrframe_sec); } //+---------------------------------------------------------------------------- // // method : Bilt::read_ErrorPerSec // // description : Extract real attribute values for ErrorPerSec acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_ErrorPerSec(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_ErrorPerSec(Tango::Attribute &attr) entering... "<< endl; read_fdata(); if ( errors.length() != 0 ) attr.set_quality(Tango::ATTR_INVALID); else attr.set_value ((Tango::DevULong *) &fdata.nbrferr_sec); } //+---------------------------------------------------------------------------- // // method : Bilt::read_ErrorCounter // // description : Extract real attribute values for ErrorCounter acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_ErrorCounter(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_ErrorCounter(Tango::Attribute &attr) entering... "<< endl; read_fdata(); if ( errors.length() != 0 ) attr.set_quality(Tango::ATTR_INVALID); else attr.set_value ((Tango::DevULong *) &fdata.nbrferr); } //+------------------------------------------------------------------ /** * method: Bilt::on * * description: method to execute "On" * Turns on power supply. * * */ //+------------------------------------------------------------------ void Bilt::on() { DEBUG_STREAM << "Bilt::on(): entering... !" << endl; // Add your own code to control device here try { POLE->clear_ferrors(); BILT->set_state(1); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot switch on pole", "Bilt::on"); } } //+------------------------------------------------------------------ /** * method: Bilt::off * * description: method to execute "Off" * Turns of power supply * * */ //+------------------------------------------------------------------ void Bilt::off() { DEBUG_STREAM << "Bilt::off(): entering... !" << endl; // Add your own code to control device here try { BILT->set_state(0); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot switch off pole", "Bilt::off"); } } //+------------------------------------------------------------------ /** * method: Bilt::reset * * description: method to execute "Reset" * Reset faults and alarms * * */ //+------------------------------------------------------------------ void Bilt::reset() { DEBUG_STREAM << "Bilt::reset(): entering... !" << endl; // Add your own code to control device here try { BILT->clear_all_err(); BILT->clear_alarm(); POLE->clear_ferrors(); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot reset pole", "Bilt::reset"); } } //+------------------------------------------------------------------ /** * method: Bilt::create_tango_exception() * * description: convert an itest exception into a tango exception * * * in : - &e : Reference to itest exception * - reason : Reason of the local Tango exception to be added to the stack * - desc : Description for the local Tango exception to be added to the stack * - origin : Origin if the local Tango exception to be added to the stack */ //+------------------------------------------------------------------ void Bilt::create_tango_exception (itest::ItestException &e, string reason, string desc, string origin) { DEBUG_STREAM << "Bilt::create_tango_exception(): entering... !" << endl; errors.length(e.errors.size() + 1); int i; for(i=0; idevice_status data member) and returns it to the caller. * * @return Status description * */ //+------------------------------------------------------------------ Tango::ConstDevString Bilt::dev_status() { //Tango::ConstDevString argout = DeviceImpl::dev_status(); DEBUG_STREAM << "Bilt::dev_status(): entering... !" << endl; // Add your own code to control device here stringstream status; Tango::DevState state = dev_state(); switch (state) { case Tango::ON: status << "Pole state : ON" << endl; break; case Tango::OFF: status << "Pole state : OFF" << endl; break; case Tango::ALARM: status << "Pole state : Alarm" << endl; if ( idata.fail == "OVU" ) { status << "Alarm message : Overvoltage detected! (48V for 100ms)" << endl; } break; case Tango::FAULT: status << "Pole state : Fault" << endl; status << "Fault code : " << idata.fail << endl; if ( idata.fail == "OVU" ) { status << "Fault descr. : Overvoltage detected! (48V for 100ms)" << endl; break; } if ( idata.fail == "OVI" ) { status << "Fault descr. : Short circuit detected!" << endl; break; } if ( idata.fail == "PWSK" ) { status << "Fault descr. : Absorbed power > 10W in 10ms!" << endl; break; } if ( idata.fail == "TEMP" ) { status << "Fault descr. : Max. temp on semiconductor reached!" << endl; break; } if ( idata.fail == "PWSO" ) { status << "Fault descr. : Delivered power > 40W in 100ms!" << endl; break; } status << "Fault descr. : Unkown fault code!" << endl; break; default: status << "Pole state : Unknown" << endl; status << "Error stack : " << endl; // print error from ITEST interface for(int i=0; iget_str_alarm() << endl; } catch (itest::ItestException &e) { // do nothing! // Just avoid exceptions when executing state or status! } set_status(status.str()); return DeviceImpl::dev_status(); } //+------------------------------------------------------------------ /** * method: Bilt::dev_state * * description: method to execute "State" * This command gets the device state (stored in its device_state data member) and returns it to the caller. * * @return State Code * */ //+------------------------------------------------------------------ Tango::DevState Bilt::dev_state() { Tango::DevState argout; DEBUG_STREAM << "Bilt::dev_state(): entering... !" << endl; // Add your own code to control device here try { read_idata(); } catch (Tango::DevFailed &e) { // do nothing! // Just avoid exceptions when executing state or status! } if ( errors.length() != 0 ) set_state (Tango::UNKNOWN); else { // set the device state switch (idata.state) { case 0: set_state (Tango::OFF); break; case 1: set_state (Tango::ON); break; case 2: set_state (Tango::ALARM); break; case 3: set_state (Tango::FAULT); break; default: set_state (Tango::UNKNOWN); break; } } argout = DeviceImpl::dev_state(); return argout; } } // namespace Node-path: powersupply/itest/Bilt/trunk/BiltClass.cpp Node-kind: file Node-action: change Text-content-length: 22347 Text-content-md5: 0d06f1a8544731de173fc87f535a5e8e Content-length: 22347 static const char *ClassId = "$Id: BiltClass.cpp,v 1.3 2009-11-23 16:46:58 meyer Exp $"; static const char *TagName = "$Name: not supported by cvs2svn $"; static const char *CvsPath = "$Source: /segfs/tango/cvsroot/cppserver/machine/powersupply/SrSteerers/tango/Bilt/BiltClass.cpp,v $"; static const char *SvnPath = "$HeadURL: $"; static const char *HttpServer = "http://www.esrf.fr/computing/cs/tango/tango_doc/ds_doc/"; //+============================================================================= // // file : BiltClass.cpp // // description : C++ source for the BiltClass. A singleton // class derived from DeviceClass. It implements the // command list and all properties and methods required // by the Bilt once per process. // // project : TANGO Device Server // // $Author: meyer $ // // $Revision: 1.3 $ // // $Log: not supported by cvs2svn $ // Revision 1.2 2009/11/06 12:46:25 meyer // Added impedance attribute and corrected fromatting of attribute values. // // Revision 1.1.1.1 2009/11/04 16:23:02 meyer // Imported using TkCVS // // // copyleft : European Synchrotron Radiation Facility // BP 220, Grenoble 38043 // FRANCE // //-============================================================================= // // This file is generated by POGO // (Program Obviously used to Generate tango Object) // // (c) - Software Engineering Group - ESRF //============================================================================= #include #include #include //+---------------------------------------------------------------------------- /** * Create BiltClass singleton and return it in a C function for Python usage */ //+---------------------------------------------------------------------------- extern "C" { #ifdef WIN32 __declspec(dllexport) #endif Tango::DeviceClass *_create_Bilt_class(const char *name) { return Bilt_ns::BiltClass::init(name); } } namespace Bilt_ns { //+---------------------------------------------------------------------------- // // method : OnCmd::execute() // // description : method to trigger the execution of the command. // PLEASE DO NOT MODIFY this method core without pogo // // in : - device : The device on which the command must be executed // - in_any : The command input data // // returns : The command output data (packed in the Any object) // //----------------------------------------------------------------------------- CORBA::Any *OnCmd::execute(Tango::DeviceImpl *device,const CORBA::Any &in_any) { cout2 << "OnCmd::execute(): arrived" << endl; ((static_cast(device))->on()); return new CORBA::Any(); } //+---------------------------------------------------------------------------- // // method : OffCmd::execute() // // description : method to trigger the execution of the command. // PLEASE DO NOT MODIFY this method core without pogo // // in : - device : The device on which the command must be executed // - in_any : The command input data // // returns : The command output data (packed in the Any object) // //----------------------------------------------------------------------------- CORBA::Any *OffCmd::execute(Tango::DeviceImpl *device,const CORBA::Any &in_any) { cout2 << "OffCmd::execute(): arrived" << endl; ((static_cast(device))->off()); return new CORBA::Any(); } //+---------------------------------------------------------------------------- // // method : ResetCmd::execute() // // description : method to trigger the execution of the command. // PLEASE DO NOT MODIFY this method core without pogo // // in : - device : The device on which the command must be executed // - in_any : The command input data // // returns : The command output data (packed in the Any object) // //----------------------------------------------------------------------------- CORBA::Any *ResetCmd::execute(Tango::DeviceImpl *device,const CORBA::Any &in_any) { cout2 << "ResetCmd::execute(): arrived" << endl; ((static_cast(device))->reset()); return new CORBA::Any(); } // //---------------------------------------------------------------- // Initialize pointer for singleton pattern //---------------------------------------------------------------- // BiltClass *BiltClass::_instance = NULL; //+---------------------------------------------------------------------------- // // method : BiltClass::BiltClass(string &s) // // description : constructor for the BiltClass // // in : - s : The class name // //----------------------------------------------------------------------------- BiltClass::BiltClass(string &s):DeviceClass(s) { cout2 << "Entering BiltClass constructor" << endl; set_default_property(); get_class_property(); write_class_property(); cout2 << "Leaving BiltClass constructor" << endl; } //+---------------------------------------------------------------------------- // // method : BiltClass::~BiltClass() // // description : destructor for the BiltClass // //----------------------------------------------------------------------------- BiltClass::~BiltClass() { _instance = NULL; } //+---------------------------------------------------------------------------- // // method : BiltClass::instance // // description : Create the object if not already done. Otherwise, just // return a pointer to the object // // in : - name : The class name // //----------------------------------------------------------------------------- BiltClass *BiltClass::init(const char *name) { if (_instance == NULL) { try { string s(name); _instance = new BiltClass(s); } catch (bad_alloc) { throw; } } return _instance; } BiltClass *BiltClass::instance() { if (_instance == NULL) { cerr << "Class is not initialised !!" << endl; exit(-1); } return _instance; } //+---------------------------------------------------------------------------- // // method : BiltClass::command_factory // // description : Create the command object(s) and store them in the // command list // //----------------------------------------------------------------------------- void BiltClass::command_factory() { command_list.push_back(new OnCmd("On", Tango::DEV_VOID, Tango::DEV_VOID, "", "", Tango::OPERATOR)); command_list.push_back(new OffCmd("Off", Tango::DEV_VOID, Tango::DEV_VOID, "", "", Tango::OPERATOR)); command_list.push_back(new ResetCmd("Reset", Tango::DEV_VOID, Tango::DEV_VOID, "", "", Tango::OPERATOR)); // add polling if any for (unsigned int i=0 ; ilength() ; i++) { cout4 << "Device name : " << (*devlist_ptr)[i].in() << endl; // Create devices and add it into the device list //---------------------------------------------------- device_list.push_back(new Bilt(this, (*devlist_ptr)[i])); // Export device to the outside world // Check before if database used. //--------------------------------------------- if ((Tango::Util::_UseDb == true) && (Tango::Util::_FileDb == false)) export_device(device_list.back()); else export_device(device_list.back(), (*devlist_ptr)[i]); } // End of Automatic code generation //------------------------------------------------------------- } //+---------------------------------------------------------------------------- // Method: BiltClass::attribute_factory(vector &att_list) //----------------------------------------------------------------------------- void BiltClass::attribute_factory(vector &att_list) { // Attribute : CurrentDC CurrentDCAttrib *current_dc = new CurrentDCAttrib(); Tango::UserDefaultAttrProp current_dc_prop; current_dc_prop.set_label("DC Current"); current_dc_prop.set_unit("A"); current_dc_prop.set_format("%6.4f"); current_dc_prop.set_max_value("1.8"); current_dc_prop.set_min_value("-1.8"); current_dc_prop.set_description("The DC current of the channel"); current_dc->set_default_properties(current_dc_prop); current_dc->set_memorized(); current_dc->set_memorized_init(true); att_list.push_back(current_dc); // Attribute : CurrentAC CurrentACAttrib *current_ac = new CurrentACAttrib(); Tango::UserDefaultAttrProp current_ac_prop; current_ac_prop.set_label("Current"); current_ac_prop.set_unit("A"); current_ac_prop.set_format("%6.4f"); current_ac_prop.set_description("The measured AC current of the channel"); current_ac->set_default_properties(current_ac_prop); att_list.push_back(current_ac); // Attribute : Voltage VoltageAttrib *voltage = new VoltageAttrib(); Tango::UserDefaultAttrProp voltage_prop; voltage_prop.set_label("Voltage"); voltage_prop.set_unit("V"); voltage_prop.set_format("%6.4f"); voltage_prop.set_description("The measured voltage of the channel"); voltage->set_default_properties(voltage_prop); att_list.push_back(voltage); // Attribute : Impedance ImpedanceAttrib *impedance = new ImpedanceAttrib(); Tango::UserDefaultAttrProp impedance_prop; impedance_prop.set_label("Impedance"); impedance_prop.set_unit("Ohms"); impedance_prop.set_format("%4.2f"); impedance_prop.set_max_alarm("5.0"); impedance_prop.set_description("Calculated impedance of the channel."); impedance->set_default_properties(impedance_prop); att_list.push_back(impedance); // Attribute : SetMin SetMinAttrib *set_min = new SetMinAttrib(); Tango::UserDefaultAttrProp set_min_prop; set_min_prop.set_label("Min. Setpoint/s"); set_min_prop.set_unit("A"); set_min_prop.set_format("%6.4f"); set_min_prop.set_description("Statistic when driven by the Libera.\nThe minimum setpoint applied during the last second."); set_min->set_default_properties(set_min_prop); att_list.push_back(set_min); // Attribute : SetMax SetMaxAttrib *set_max = new SetMaxAttrib(); Tango::UserDefaultAttrProp set_max_prop; set_max_prop.set_label("Max. Setpoint/s"); set_max_prop.set_unit("A"); set_max_prop.set_format("%6.4f"); set_max_prop.set_description("Statistic when driven by the Libera.\nThe maximum setpoint applied during the last second."); set_max->set_default_properties(set_max_prop); att_list.push_back(set_max); // Attribute : SetAverage SetAverageAttrib *set_average = new SetAverageAttrib(); Tango::UserDefaultAttrProp set_average_prop; set_average_prop.set_label("Average Setpoint/s"); set_average_prop.set_unit("A"); set_average_prop.set_format("%6.4f"); set_average_prop.set_description("Statistic when driven by the Libera.\nThe average setpoint applied during the last second."); set_average->set_default_properties(set_average_prop); att_list.push_back(set_average); // Attribute : FramesPerSec FramesPerSecAttrib *frames_per_sec = new FramesPerSecAttrib(); Tango::UserDefaultAttrProp frames_per_sec_prop; frames_per_sec_prop.set_label("Frames/s"); frames_per_sec_prop.set_unit(" "); frames_per_sec_prop.set_format("%3d"); frames_per_sec_prop.set_description("Statistic when driven by the Libera.\nThe number of setpoints per second."); frames_per_sec->set_default_properties(frames_per_sec_prop); att_list.push_back(frames_per_sec); // Attribute : ErrorPerSec ErrorPerSecAttrib *error_per_sec = new ErrorPerSecAttrib(); Tango::UserDefaultAttrProp error_per_sec_prop; error_per_sec_prop.set_label("Errors/s"); error_per_sec_prop.set_unit(" "); error_per_sec_prop.set_format("%3d"); error_per_sec_prop.set_description("Statistic when driven by the Libera.\nThe number of errors detected per second."); error_per_sec->set_default_properties(error_per_sec_prop); att_list.push_back(error_per_sec); // Attribute : ErrorCounter ErrorCounterAttrib *error_counter = new ErrorCounterAttrib(); Tango::UserDefaultAttrProp error_counter_prop; error_counter_prop.set_label("Error Counter"); error_counter_prop.set_unit(" "); error_counter_prop.set_format("%6d"); error_counter_prop.set_description("Statistic when driven by the Libera.\nThe total number of errors since the last reset."); error_counter->set_default_properties(error_counter_prop); att_list.push_back(error_counter); // Attribute : LocalControl LocalControlAttrib *local_control = new LocalControlAttrib(); Tango::UserDefaultAttrProp local_control_prop; local_control_prop.set_label("Local Control"); local_control_prop.set_unit(" "); local_control_prop.set_description("If true the AC current can be set on the device,\notherwise it is driven by the Libera."); local_control->set_default_properties(local_control_prop); att_list.push_back(local_control); // Attribute : SetCurrentAC SetCurrentACAttrib *set_current_ac = new SetCurrentACAttrib(); Tango::UserDefaultAttrProp set_current_ac_prop; set_current_ac_prop.set_label("AC Current Setpoint"); set_current_ac_prop.set_unit("A"); set_current_ac_prop.set_format("%6.4f"); set_current_ac_prop.set_max_value("0.2"); set_current_ac_prop.set_min_value("-0.2"); set_current_ac_prop.set_description("The AC current setpoint in local mode. If driven by the Libera, the attribute \nattribute value in INVALID."); set_current_ac->set_default_properties(set_current_ac_prop); att_list.push_back(set_current_ac); // End of Automatic code generation //------------------------------------------------------------- } //+---------------------------------------------------------------------------- // // method : BiltClass::get_class_property() // // description : Read the class properties from database. // //----------------------------------------------------------------------------- void BiltClass::get_class_property() { // Initialize your default values here (if not done with POGO). //------------------------------------------------------------------ // Read class properties from database.(Automatic code generation) //------------------------------------------------------------------ // Call database and extract values //-------------------------------------------- if (Tango::Util::instance()->_UseDb==true) get_db_class()->get_property(cl_prop); Tango::DbDatum def_prop; int i = -1; // End of Automatic code generation //------------------------------------------------------------------ } //+---------------------------------------------------------------------------- // // method : BiltClass::set_default_property // // description: Set default property (class and device) for wizard. // For each property, add to wizard property name and description // If default value has been set, add it to wizard property and // store it in a DbDatum. // //----------------------------------------------------------------------------- void BiltClass::set_default_property() { string prop_name; string prop_desc; string prop_def; vector vect_data; // Set Default Class Properties // Set Default Device Properties prop_name = "IPAddress"; prop_desc = "IP Address of BILT controller.\nEach controller includes several magnets and\neach magnet includes 3 power supplies,\nfor corrections in the X, Y and Z planes.\n\n"; prop_def = "0.0.0.0"; vect_data.clear(); vect_data.push_back("0.0.0.0"); if (prop_def.length()>0) { Tango::DbDatum data(prop_name); data << vect_data ; dev_def_prop.push_back(data); add_wiz_dev_prop(prop_name, prop_desc, prop_def); } else add_wiz_dev_prop(prop_name, prop_desc); prop_name = "MagnetNumber"; prop_desc = "Magnet number from 1 to 48"; prop_def = "0"; vect_data.clear(); vect_data.push_back("0"); if (prop_def.length()>0) { Tango::DbDatum data(prop_name); data << vect_data ; dev_def_prop.push_back(data); add_wiz_dev_prop(prop_name, prop_desc, prop_def); } else add_wiz_dev_prop(prop_name, prop_desc); prop_name = "PoleNumber"; prop_desc = "The number of the Pole to be used from 0 to 2"; prop_def = "0"; vect_data.clear(); vect_data.push_back("0"); if (prop_def.length()>0) { Tango::DbDatum data(prop_name); data << vect_data ; dev_def_prop.push_back(data); add_wiz_dev_prop(prop_name, prop_desc, prop_def); } else add_wiz_dev_prop(prop_name, prop_desc); } //+---------------------------------------------------------------------------- // // method : BiltClass::write_class_property // // description : Set class description as property in database // //----------------------------------------------------------------------------- void BiltClass::write_class_property() { // First time, check if database used //-------------------------------------------- if (Tango::Util::_UseDb == false) return; Tango::DbData data; string classname = get_name(); string header; string::size_type start, end; // Put title Tango::DbDatum title("ProjectTitle"); string str_title("BILT multi channel power supply"); title << str_title; data.push_back(title); // Put Description Tango::DbDatum description("Description"); vector str_desc; str_desc.push_back("The BILT multi channel power supply will be used with 3 channels for the ESRF fast"); str_desc.push_back("feedback systems."); str_desc.push_back("The power supply can be controlled in 2 ways :"); str_desc.push_back("By this device server for slow or human control or"); str_desc.push_back("by the Libera Beam Position monitors for fast feedback with closed loop control."); description << str_desc; data.push_back(description); // put cvs or svn location string filename(classname); filename += "Class.cpp"; // Create a string with the class ID to // get the string into the binary string class_id(ClassId); // check for cvs information string src_path(CvsPath); start = src_path.find("/"); if (start!=string::npos) { end = src_path.find(filename); if (end>start) { string strloc = src_path.substr(start, end-start); // Check if specific repository start = strloc.find("/cvsroot/"); if (start!=string::npos && start>0) { string repository = strloc.substr(0, start); if (repository.find("/segfs/")!=string::npos) strloc = "ESRF:" + strloc.substr(start, strloc.length()-start); } Tango::DbDatum cvs_loc("cvs_location"); cvs_loc << strloc; data.push_back(cvs_loc); } } // check for svn information else { string src_path(SvnPath); start = src_path.find("://"); if (start!=string::npos) { end = src_path.find(filename); if (end>start) { header = "$HeadURL: "; start = header.length(); string strloc = src_path.substr(start, (end-start)); Tango::DbDatum svn_loc("svn_location"); svn_loc << strloc; data.push_back(svn_loc); } } } // Get CVS or SVN revision tag // CVS tag string tagname(TagName); header = "$Name: "; start = header.length(); string endstr(" $"); end = tagname.find(endstr); if (end!=string::npos && end>start) { string strtag = tagname.substr(start, end-start); Tango::DbDatum cvs_tag("cvs_tag"); cvs_tag << strtag; data.push_back(cvs_tag); } // SVN tag string svnpath(SvnPath); header = "$HeadURL: "; start = header.length(); end = svnpath.find(endstr); if (end!=string::npos && end>start) { string strloc = svnpath.substr(start, end-start); string tagstr ("/tags/"); start = strloc.find(tagstr); if ( start!=string::npos ) { start = start + tagstr.length(); end = strloc.find(filename); string strtag = strloc.substr(start, end-start-1); Tango::DbDatum svn_tag("svn_tag"); svn_tag << strtag; data.push_back(svn_tag); } } // Get URL location string httpServ(HttpServer); if (httpServ.length()>0) { Tango::DbDatum db_doc_url("doc_url"); db_doc_url << httpServ; data.push_back(db_doc_url); } // Put inheritance Tango::DbDatum inher_datum("InheritedFrom"); vector inheritance; inheritance.push_back("Device_4Impl"); inher_datum << inheritance; data.push_back(inher_datum); // Call database and and values //-------------------------------------------- get_db_class()->put_property(data); } } // namespace Revision-number: 6 Prop-content-length: 128 Content-length: 128 K 10 svn:author V 5 meyer K 8 svn:date V 27 2009-11-24T09:21:46.000000Z K 7 svn:log V 28 Absolut value for impedance PROPS-END Node-path: powersupply/itest/Bilt/trunk/Bilt.cpp Node-kind: file Node-action: change Text-content-length: 26207 Text-content-md5: 8cbabae2be7bd3a6d701ca071f2e247f Content-length: 26207 static const char *RcsId = "$Id: Bilt.cpp,v 1.4 2009-11-24 09:21:46 meyer Exp $"; //+============================================================================= // // file : Bilt.cpp // // description : C++ source for the Bilt and its commands. // The class is derived from Device. It represents the // CORBA servant object which will be accessed from the // network. All commands which can be executed on the // Bilt are implemented in this file. // // project : TANGO Device Server // // $Author: meyer $ // // $Revision: 1.4 $ // // $Revision: 1.4 $ // $Date: 2009-11-24 09:21:46 $ // // SVN only: // $HeadURL: $ // // CVS only: // $Source: /segfs/tango/cvsroot/cppserver/machine/powersupply/SrSteerers/tango/Bilt/Bilt.cpp,v $ // $Log: not supported by cvs2svn $ // Revision 1.3 2009/11/23 16:46:58 meyer // Corrected state, status and exception handling // // Revision 1.2 2009/11/06 12:46:25 meyer // Added impedance attribute and corrected fromatting of attribute values. // // Revision 1.1.1.1 2009/11/04 16:23:02 meyer // Imported using TkCVS // // // copyleft : European Synchrotron Radiation Facility // BP 220, Grenoble 38043 // FRANCE // //-============================================================================= // // This file is generated by POGO // (Program Obviously used to Generate tango Object) // // (c) - Software Engineering Group - ESRF //============================================================================= //=================================================================== // // The following table gives the correspondence // between commands and method name. // // Command name| Method name // ---------------------------------------- // State | dev_state() // Status | dev_status() // On | on() // Off | off() // Reset | reset() // //=================================================================== #include #include #include #include namespace Bilt_ns { //+---------------------------------------------------------------------------- // // method : Bilt::Bilt(string &s) // // description : constructor for simulated Bilt // // in : - cl : Pointer to the DeviceClass object // - s : Device name // //----------------------------------------------------------------------------- Bilt::Bilt(Tango::DeviceClass *cl,string &s) :Tango::Device_4Impl(cl,s.c_str()) { init_device(); } Bilt::Bilt(Tango::DeviceClass *cl,const char *s) :Tango::Device_4Impl(cl,s) { init_device(); } Bilt::Bilt(Tango::DeviceClass *cl,const char *s,const char *d) :Tango::Device_4Impl(cl,s,d) { init_device(); } //+---------------------------------------------------------------------------- // // method : Bilt::delete_device() // // description : will be called at device destruction or at init command. // //----------------------------------------------------------------------------- void Bilt::delete_device() { // Delete device allocated objects delete BILT; } //+---------------------------------------------------------------------------- // // method : Bilt::init_device() // // description : will be called at device initialization. // //----------------------------------------------------------------------------- void Bilt::init_device() { INFO_STREAM << "Bilt::Bilt() create device " << device_name << endl; // Initialise variables to default values //-------------------------------------------- get_device_property(); set_state (Tango::UNKNOWN); try { BILT = new itest::TMagnet (iPAddress.c_str(), magnetNumber); POLE = &(BILT->pole(poleNumber)); } catch (itest::ItestException &e) { try { create_tango_exception (e, "Init failure" , "Cannot initialise ITEST libray objects", "Bilt::init_device"); } catch (Tango::DevFailed &e) { set_state (Tango::FAULT); } } } //+---------------------------------------------------------------------------- // // method : Bilt::get_device_property() // // description : Read the device properties from database. // //----------------------------------------------------------------------------- void Bilt::get_device_property() { // Initialize your default values here (if not done with POGO). //------------------------------------------------------------------ idata.magnet = 0; idata.pole = 0; idata.meascurr = 0; idata.measvolt = 0; idata.state = -1; idata.fail = "none"; fdata.nbrframe_sec = 0; fdata.nbrferr_sec = 0; fdata.min_sett_sec = 0; fdata.max_sett_sec = 0; fdata.average_sett_sec = 0; fdata.nbrferr = 0; current_dc = 0; set_current_ac = 0; impedance = 0; local_control = false; // Read device properties from database.(Automatic code generation) //------------------------------------------------------------------ Tango::DbData dev_prop; dev_prop.push_back(Tango::DbDatum("IPAddress")); dev_prop.push_back(Tango::DbDatum("MagnetNumber")); dev_prop.push_back(Tango::DbDatum("PoleNumber")); // Call database and extract values //-------------------------------------------- if (Tango::Util::instance()->_UseDb==true) get_db_device()->get_property(dev_prop); Tango::DbDatum def_prop, cl_prop; BiltClass *ds_class = (static_cast(get_device_class())); int i = -1; // Try to initialize IPAddress from class property cl_prop = ds_class->get_class_property(dev_prop[++i].name); if (cl_prop.is_empty()==false) cl_prop >> iPAddress; else { // Try to initialize IPAddress from default device value def_prop = ds_class->get_default_device_property(dev_prop[i].name); if (def_prop.is_empty()==false) def_prop >> iPAddress; } // And try to extract IPAddress value from database if (dev_prop[i].is_empty()==false) dev_prop[i] >> iPAddress; // Try to initialize MagnetNumber from class property cl_prop = ds_class->get_class_property(dev_prop[++i].name); if (cl_prop.is_empty()==false) cl_prop >> magnetNumber; else { // Try to initialize MagnetNumber from default device value def_prop = ds_class->get_default_device_property(dev_prop[i].name); if (def_prop.is_empty()==false) def_prop >> magnetNumber; } // And try to extract MagnetNumber value from database if (dev_prop[i].is_empty()==false) dev_prop[i] >> magnetNumber; // Try to initialize PoleNumber from class property cl_prop = ds_class->get_class_property(dev_prop[++i].name); if (cl_prop.is_empty()==false) cl_prop >> poleNumber; else { // Try to initialize PoleNumber from default device value def_prop = ds_class->get_default_device_property(dev_prop[i].name); if (def_prop.is_empty()==false) def_prop >> poleNumber; } // And try to extract PoleNumber value from database if (dev_prop[i].is_empty()==false) dev_prop[i] >> poleNumber; // End of Automatic code generation //------------------------------------------------------------------ } //+---------------------------------------------------------------------------- // // method : Bilt::always_executed_hook() // // description : method always executed before any command is executed // //----------------------------------------------------------------------------- void Bilt::always_executed_hook() { } //+---------------------------------------------------------------------------- // // method : Bilt::read_attr_hardware // // description : Hardware acquisition for attributes. // //----------------------------------------------------------------------------- void Bilt::read_attr_hardware(vector &attr_list) { DEBUG_STREAM << "Bilt::read_attr_hardware(vector &attr_list) entering... "<< endl; // Add your own code here } //+---------------------------------------------------------------------------- // // method : Bilt::read_Impedance // // description : Extract real attribute values for Impedance acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_Impedance(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_Impedance(Tango::Attribute &attr) entering... "<< endl; if ( idata.meascurr > 0.005 ) { impedance = fabs (idata.measvolt / idata.meascurr); attr.set_value (&impedance); } else attr.set_quality (Tango::ATTR_INVALID); } //+---------------------------------------------------------------------------- // // method : Bilt::read_LocalControl // // description : Extract real attribute values for LocalControl acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_LocalControl(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_LocalControl(Tango::Attribute &attr) entering... "<< endl; try { int switch_state = POLE->get_switch(); if ( switch_state == 1 ) local_control = false; else local_control = true; } catch (itest::ItestException &e) { create_tango_exception (e, "Read failure" , "Cannot read the actual switch state", "Bilt::read_LocalControl"); } attr.set_value (&local_control); } //+---------------------------------------------------------------------------- // // method : Bilt::write_LocalControl // // description : Write LocalControl attribute values to hardware. // //----------------------------------------------------------------------------- void Bilt::write_LocalControl(Tango::WAttribute &attr) { DEBUG_STREAM << "Bilt::write_LocalControl(Tango::WAttribute &attr) entering... "<< endl; attr.get_write_value(local_control); try { int switch_state; if ( local_control == true ) switch_state = 0; else switch_state = 1; POLE->set_switch (switch_state); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot write switch state", "Bilt::write_LocalControl"); } } //+---------------------------------------------------------------------------- // // method : Bilt::read_SetCurrentAC // // description : Extract real attribute values for SetCurrentAC acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_SetCurrentAC(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_SetCurrentAC(Tango::Attribute &attr) entering... "<< endl; if ( local_control == false ) { attr.set_quality (Tango::ATTR_INVALID); } else { attr.set_value (&set_current_ac); } } //+---------------------------------------------------------------------------- // // method : Bilt::write_SetCurrentAC // // description : Write SetCurrentAC attribute values to hardware. // //----------------------------------------------------------------------------- void Bilt::write_SetCurrentAC(Tango::WAttribute &attr) { DEBUG_STREAM << "Bilt::write_SetCurrentAC(Tango::WAttribute &attr) entering... "<< endl; // check whether local control is true if ( local_control == false ) { TangoSys_MemStream tms; tms << "Can set AC current only when local control enabled!" << endl; Tango::Except::throw_exception("WriteError", tms.str(), "Bilt::write_SetCurrentAC"); } attr.get_write_value(set_current_ac); try { POLE->set_current_AC (set_current_ac); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot write AC current value", "Bilt::write_SetCurrentAC"); } } //+---------------------------------------------------------------------------- // // method : Bilt::read_CurrentDC // // description : Extract real attribute values for CurrentDC acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_CurrentDC(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_CurrentDC(Tango::Attribute &attr) entering... "<< endl; try { current_dc = POLE->get_current_DC(); } catch (itest::ItestException &e) { create_tango_exception (e, "Read failure" , "Cannot read DC current value", "Bilt::read_CurrentDC"); } attr.set_value (¤t_dc); } //+---------------------------------------------------------------------------- // // method : Bilt::write_CurrentDC // // description : Write CurrentDC attribute values to hardware. // //----------------------------------------------------------------------------- void Bilt::write_CurrentDC(Tango::WAttribute &attr) { DEBUG_STREAM << "Bilt::write_CurrentDC(Tango::WAttribute &attr) entering... "<< endl; attr.get_write_value(attr_CurrentDC_write); try { POLE->set_current_DC (attr_CurrentDC_write); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot write DC current value", "Bilt::write_CurrentDC"); } } //+---------------------------------------------------------------------------- // // method : Bilt::read_CurrentAC // // description : Extract real attribute values for CurrentAC acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_CurrentAC(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_CurrentAC(Tango::Attribute &attr) entering... "<< endl; read_idata(); if ( errors.length() != 0 ) attr.set_quality(Tango::ATTR_INVALID); else attr.set_value (&idata.meascurr); } //+---------------------------------------------------------------------------- // // method : Bilt::read_Voltage // // description : Extract real attribute values for Voltage acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_Voltage(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_Voltage(Tango::Attribute &attr) entering... "<< endl; read_idata(); if ( errors.length() != 0 ) attr.set_quality(Tango::ATTR_INVALID); else attr.set_value (&idata.measvolt); } //+---------------------------------------------------------------------------- // // method : Bilt::read_SetMin // // description : Extract real attribute values for SetMin acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_SetMin(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_SetMin(Tango::Attribute &attr) entering... "<< endl; read_fdata(); if ( errors.length() != 0 ) attr.set_quality(Tango::ATTR_INVALID); else attr.set_value (&fdata.min_sett_sec); } //+---------------------------------------------------------------------------- // // method : Bilt::read_SetMax // // description : Extract real attribute values for SetMax acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_SetMax(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_SetMax(Tango::Attribute &attr) entering... "<< endl; read_fdata(); if ( errors.length() != 0 ) attr.set_quality(Tango::ATTR_INVALID); else attr.set_value (&fdata.max_sett_sec); } //+---------------------------------------------------------------------------- // // method : Bilt::read_SetAverage // // description : Extract real attribute values for SetAverage acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_SetAverage(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_SetAverage(Tango::Attribute &attr) entering... "<< endl; read_fdata(); if ( errors.length() != 0 ) attr.set_quality(Tango::ATTR_INVALID); else attr.set_value (&fdata.average_sett_sec); } //+---------------------------------------------------------------------------- // // method : Bilt::read_FramesPerSec // // description : Extract real attribute values for FramesPerSec acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_FramesPerSec(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_FramesPerSec(Tango::Attribute &attr) entering... "<< endl; read_fdata(); if ( errors.length() != 0 ) attr.set_quality(Tango::ATTR_INVALID); else attr.set_value ((Tango::DevULong *) &fdata.nbrframe_sec); } //+---------------------------------------------------------------------------- // // method : Bilt::read_ErrorPerSec // // description : Extract real attribute values for ErrorPerSec acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_ErrorPerSec(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_ErrorPerSec(Tango::Attribute &attr) entering... "<< endl; read_fdata(); if ( errors.length() != 0 ) attr.set_quality(Tango::ATTR_INVALID); else attr.set_value ((Tango::DevULong *) &fdata.nbrferr_sec); } //+---------------------------------------------------------------------------- // // method : Bilt::read_ErrorCounter // // description : Extract real attribute values for ErrorCounter acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_ErrorCounter(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_ErrorCounter(Tango::Attribute &attr) entering... "<< endl; read_fdata(); if ( errors.length() != 0 ) attr.set_quality(Tango::ATTR_INVALID); else attr.set_value ((Tango::DevULong *) &fdata.nbrferr); } //+------------------------------------------------------------------ /** * method: Bilt::on * * description: method to execute "On" * Turns on power supply. * * */ //+------------------------------------------------------------------ void Bilt::on() { DEBUG_STREAM << "Bilt::on(): entering... !" << endl; // Add your own code to control device here try { //POLE->clear_ferrors(); // reset all pending errors first! reset(); BILT->set_state(1); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot switch on pole", "Bilt::on"); } } //+------------------------------------------------------------------ /** * method: Bilt::off * * description: method to execute "Off" * Turns of power supply * * */ //+------------------------------------------------------------------ void Bilt::off() { DEBUG_STREAM << "Bilt::off(): entering... !" << endl; // Add your own code to control device here try { BILT->set_state(0); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot switch off pole", "Bilt::off"); } } //+------------------------------------------------------------------ /** * method: Bilt::reset * * description: method to execute "Reset" * Reset faults and alarms * * */ //+------------------------------------------------------------------ void Bilt::reset() { DEBUG_STREAM << "Bilt::reset(): entering... !" << endl; // Add your own code to control device here try { BILT->clear_all_err(); BILT->clear_alarm(); POLE->clear_ferrors(); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot reset pole", "Bilt::reset"); } } //+------------------------------------------------------------------ /** * method: Bilt::create_tango_exception() * * description: convert an itest exception into a tango exception * * * in : - &e : Reference to itest exception * - reason : Reason of the local Tango exception to be added to the stack * - desc : Description for the local Tango exception to be added to the stack * - origin : Origin if the local Tango exception to be added to the stack */ //+------------------------------------------------------------------ void Bilt::create_tango_exception (itest::ItestException &e, string reason, string desc, string origin) { DEBUG_STREAM << "Bilt::create_tango_exception(): entering... !" << endl; errors.length(e.errors.size() + 1); int i; for(i=0; idevice_status data member) and returns it to the caller. * * @return Status description * */ //+------------------------------------------------------------------ Tango::ConstDevString Bilt::dev_status() { //Tango::ConstDevString argout = DeviceImpl::dev_status(); DEBUG_STREAM << "Bilt::dev_status(): entering... !" << endl; // Add your own code to control device here stringstream status; Tango::DevState state = dev_state(); switch (state) { case Tango::ON: status << "Pole state : ON" << endl; break; case Tango::OFF: status << "Pole state : OFF" << endl; break; case Tango::ALARM: status << "Pole state : Alarm" << endl; if ( idata.fail == "OVU" ) { status << "Alarm message : Overvoltage detected! (48V for 100ms)" << endl; } break; case Tango::FAULT: status << "Pole state : Fault" << endl; status << "Fault code : " << idata.fail << endl; if ( idata.fail == "OVU" ) { status << "Fault descr. : Overvoltage detected! (48V for 100ms)" << endl; break; } if ( idata.fail == "OVI" ) { status << "Fault descr. : Short circuit detected!" << endl; break; } if ( idata.fail == "PWSK" ) { status << "Fault descr. : Absorbed power > 10W in 10ms!" << endl; break; } if ( idata.fail == "TEMP" ) { status << "Fault descr. : Max. temp on semiconductor reached!" << endl; break; } if ( idata.fail == "PWSO" ) { status << "Fault descr. : Delivered power > 40W in 100ms!" << endl; break; } status << "Fault descr. : Unkown fault code!" << endl; break; default: status << "Pole state : Unknown" << endl; status << "Error stack : " << endl; // print error from ITEST interface for(int i=0; iget_str_alarm() << endl; } catch (itest::ItestException &e) { // do nothing! // Just avoid exceptions when executing state or status! } set_status(status.str()); return DeviceImpl::dev_status(); } //+------------------------------------------------------------------ /** * method: Bilt::dev_state * * description: method to execute "State" * This command gets the device state (stored in its device_state data member) and returns it to the caller. * * @return State Code * */ //+------------------------------------------------------------------ Tango::DevState Bilt::dev_state() { Tango::DevState argout; DEBUG_STREAM << "Bilt::dev_state(): entering... !" << endl; // Add your own code to control device here try { read_idata(); } catch (Tango::DevFailed &e) { // do nothing! // Just avoid exceptions when executing state or status! } if ( errors.length() != 0 ) set_state (Tango::UNKNOWN); else { // set the device state switch (idata.state) { case 0: set_state (Tango::OFF); break; case 1: set_state (Tango::ON); break; case 2: set_state (Tango::ALARM); break; case 3: set_state (Tango::FAULT); break; default: set_state (Tango::UNKNOWN); break; } } argout = DeviceImpl::dev_state(); return argout; } } // namespace Revision-number: 7 Prop-content-length: 127 Content-length: 127 K 10 svn:author V 5 meyer K 8 svn:date V 27 2009-11-26T10:46:58.000000Z K 7 svn:log V 27 Updated for libMagnet_V120 PROPS-END Node-path: powersupply/itest/Bilt/trunk/Bilt.cpp Node-kind: file Node-action: change Text-content-length: 25720 Text-content-md5: 192051e41977cbaf1eed24cb6a6c91ca Content-length: 25720 static const char *RcsId = "$Id: Bilt.cpp,v 1.5 2009-11-26 10:46:58 meyer Exp $"; //+============================================================================= // // file : Bilt.cpp // // description : C++ source for the Bilt and its commands. // The class is derived from Device. It represents the // CORBA servant object which will be accessed from the // network. All commands which can be executed on the // Bilt are implemented in this file. // // project : TANGO Device Server // // $Author: meyer $ // // $Revision: 1.5 $ // // $Revision: 1.5 $ // $Date: 2009-11-26 10:46:58 $ // // SVN only: // $HeadURL: $ // // CVS only: // $Source: /segfs/tango/cvsroot/cppserver/machine/powersupply/SrSteerers/tango/Bilt/Bilt.cpp,v $ // $Log: not supported by cvs2svn $ // Revision 1.4 2009/11/24 09:21:46 meyer // Absolut value for impedance // // Revision 1.3 2009/11/23 16:46:58 meyer // Corrected state, status and exception handling // // Revision 1.2 2009/11/06 12:46:25 meyer // Added impedance attribute and corrected fromatting of attribute values. // // Revision 1.1.1.1 2009/11/04 16:23:02 meyer // Imported using TkCVS // // // copyleft : European Synchrotron Radiation Facility // BP 220, Grenoble 38043 // FRANCE // //-============================================================================= // // This file is generated by POGO // (Program Obviously used to Generate tango Object) // // (c) - Software Engineering Group - ESRF //============================================================================= //=================================================================== // // The following table gives the correspondence // between commands and method name. // // Command name| Method name // ---------------------------------------- // State | dev_state() // Status | dev_status() // On | on() // Off | off() // Reset | reset() // //=================================================================== #include #include #include #include namespace Bilt_ns { //+---------------------------------------------------------------------------- // // method : Bilt::Bilt(string &s) // // description : constructor for simulated Bilt // // in : - cl : Pointer to the DeviceClass object // - s : Device name // //----------------------------------------------------------------------------- Bilt::Bilt(Tango::DeviceClass *cl,string &s) :Tango::Device_4Impl(cl,s.c_str()) { init_device(); } Bilt::Bilt(Tango::DeviceClass *cl,const char *s) :Tango::Device_4Impl(cl,s) { init_device(); } Bilt::Bilt(Tango::DeviceClass *cl,const char *s,const char *d) :Tango::Device_4Impl(cl,s,d) { init_device(); } //+---------------------------------------------------------------------------- // // method : Bilt::delete_device() // // description : will be called at device destruction or at init command. // //----------------------------------------------------------------------------- void Bilt::delete_device() { // Delete device allocated objects delete BILT; } //+---------------------------------------------------------------------------- // // method : Bilt::init_device() // // description : will be called at device initialization. // //----------------------------------------------------------------------------- void Bilt::init_device() { INFO_STREAM << "Bilt::Bilt() create device " << device_name << endl; // Initialise variables to default values //-------------------------------------------- get_device_property(); set_state (Tango::UNKNOWN); try { BILT = new itest::TMagnet (iPAddress.c_str(), magnetNumber); POLE = &(BILT->pole(poleNumber)); } catch (itest::ItestException &e) { try { create_tango_exception (e, "Init failure" , "Cannot initialise ITEST libray objects", "Bilt::init_device"); } catch (Tango::DevFailed &e) { set_state (Tango::FAULT); } } } //+---------------------------------------------------------------------------- // // method : Bilt::get_device_property() // // description : Read the device properties from database. // //----------------------------------------------------------------------------- void Bilt::get_device_property() { // Initialize your default values here (if not done with POGO). //------------------------------------------------------------------ idata.magnet = 0; idata.pole = 0; idata.meascurr = 0; idata.measvolt = 0; idata.state = -1; idata.fail = "none"; fdata.nbrframe_sec = 0; fdata.nbrferr_sec = 0; fdata.rms_ac_sett_sec = 0; fdata.average_sett_sec = 0; fdata.nbrferr = 0; current_dc = 0; set_current_ac = 0; impedance = 0; local_control = false; // Read device properties from database.(Automatic code generation) //------------------------------------------------------------------ Tango::DbData dev_prop; dev_prop.push_back(Tango::DbDatum("IPAddress")); dev_prop.push_back(Tango::DbDatum("MagnetNumber")); dev_prop.push_back(Tango::DbDatum("PoleNumber")); // Call database and extract values //-------------------------------------------- if (Tango::Util::instance()->_UseDb==true) get_db_device()->get_property(dev_prop); Tango::DbDatum def_prop, cl_prop; BiltClass *ds_class = (static_cast(get_device_class())); int i = -1; // Try to initialize IPAddress from class property cl_prop = ds_class->get_class_property(dev_prop[++i].name); if (cl_prop.is_empty()==false) cl_prop >> iPAddress; else { // Try to initialize IPAddress from default device value def_prop = ds_class->get_default_device_property(dev_prop[i].name); if (def_prop.is_empty()==false) def_prop >> iPAddress; } // And try to extract IPAddress value from database if (dev_prop[i].is_empty()==false) dev_prop[i] >> iPAddress; // Try to initialize MagnetNumber from class property cl_prop = ds_class->get_class_property(dev_prop[++i].name); if (cl_prop.is_empty()==false) cl_prop >> magnetNumber; else { // Try to initialize MagnetNumber from default device value def_prop = ds_class->get_default_device_property(dev_prop[i].name); if (def_prop.is_empty()==false) def_prop >> magnetNumber; } // And try to extract MagnetNumber value from database if (dev_prop[i].is_empty()==false) dev_prop[i] >> magnetNumber; // Try to initialize PoleNumber from class property cl_prop = ds_class->get_class_property(dev_prop[++i].name); if (cl_prop.is_empty()==false) cl_prop >> poleNumber; else { // Try to initialize PoleNumber from default device value def_prop = ds_class->get_default_device_property(dev_prop[i].name); if (def_prop.is_empty()==false) def_prop >> poleNumber; } // And try to extract PoleNumber value from database if (dev_prop[i].is_empty()==false) dev_prop[i] >> poleNumber; // End of Automatic code generation //------------------------------------------------------------------ } //+---------------------------------------------------------------------------- // // method : Bilt::always_executed_hook() // // description : method always executed before any command is executed // //----------------------------------------------------------------------------- void Bilt::always_executed_hook() { } //+---------------------------------------------------------------------------- // // method : Bilt::read_attr_hardware // // description : Hardware acquisition for attributes. // //----------------------------------------------------------------------------- void Bilt::read_attr_hardware(vector &attr_list) { DEBUG_STREAM << "Bilt::read_attr_hardware(vector &attr_list) entering... "<< endl; // Add your own code here } //+---------------------------------------------------------------------------- // // method : Bilt::read_SetRMS // // description : Extract real attribute values for SetRMS acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_SetRMS(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_SetRMS(Tango::Attribute &attr) entering... "<< endl; read_fdata(); if ( errors.length() != 0 ) attr.set_quality(Tango::ATTR_INVALID); else attr.set_value (&fdata.rms_ac_sett_sec); } //+---------------------------------------------------------------------------- // // method : Bilt::read_Impedance // // description : Extract real attribute values for Impedance acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_Impedance(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_Impedance(Tango::Attribute &attr) entering... "<< endl; if ( idata.meascurr > 0.005 ) { impedance = fabs (idata.measvolt / idata.meascurr); attr.set_value (&impedance); } else attr.set_quality (Tango::ATTR_INVALID); } //+---------------------------------------------------------------------------- // // method : Bilt::read_LocalControl // // description : Extract real attribute values for LocalControl acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_LocalControl(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_LocalControl(Tango::Attribute &attr) entering... "<< endl; try { int switch_state = POLE->get_switch(); if ( switch_state == 1 ) local_control = false; else local_control = true; } catch (itest::ItestException &e) { create_tango_exception (e, "Read failure" , "Cannot read the actual switch state", "Bilt::read_LocalControl"); } attr.set_value (&local_control); } //+---------------------------------------------------------------------------- // // method : Bilt::write_LocalControl // // description : Write LocalControl attribute values to hardware. // //----------------------------------------------------------------------------- void Bilt::write_LocalControl(Tango::WAttribute &attr) { DEBUG_STREAM << "Bilt::write_LocalControl(Tango::WAttribute &attr) entering... "<< endl; attr.get_write_value(local_control); try { int switch_state; if ( local_control == true ) switch_state = 0; else switch_state = 1; POLE->set_switch (switch_state); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot write switch state", "Bilt::write_LocalControl"); } } //+---------------------------------------------------------------------------- // // method : Bilt::read_SetCurrentAC // // description : Extract real attribute values for SetCurrentAC acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_SetCurrentAC(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_SetCurrentAC(Tango::Attribute &attr) entering... "<< endl; if ( local_control == false ) { attr.set_quality (Tango::ATTR_INVALID); } else { attr.set_value (&set_current_ac); } } //+---------------------------------------------------------------------------- // // method : Bilt::write_SetCurrentAC // // description : Write SetCurrentAC attribute values to hardware. // //----------------------------------------------------------------------------- void Bilt::write_SetCurrentAC(Tango::WAttribute &attr) { DEBUG_STREAM << "Bilt::write_SetCurrentAC(Tango::WAttribute &attr) entering... "<< endl; // check whether local control is true if ( local_control == false ) { TangoSys_MemStream tms; tms << "Can set AC current only when local control enabled!" << endl; Tango::Except::throw_exception("WriteError", tms.str(), "Bilt::write_SetCurrentAC"); } attr.get_write_value(set_current_ac); try { POLE->set_current_AC (set_current_ac); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot write AC current value", "Bilt::write_SetCurrentAC"); } } //+---------------------------------------------------------------------------- // // method : Bilt::read_CurrentDC // // description : Extract real attribute values for CurrentDC acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_CurrentDC(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_CurrentDC(Tango::Attribute &attr) entering... "<< endl; try { current_dc = POLE->get_current_DC(); } catch (itest::ItestException &e) { create_tango_exception (e, "Read failure" , "Cannot read DC current value", "Bilt::read_CurrentDC"); } attr.set_value (¤t_dc); } //+---------------------------------------------------------------------------- // // method : Bilt::write_CurrentDC // // description : Write CurrentDC attribute values to hardware. // //----------------------------------------------------------------------------- void Bilt::write_CurrentDC(Tango::WAttribute &attr) { DEBUG_STREAM << "Bilt::write_CurrentDC(Tango::WAttribute &attr) entering... "<< endl; attr.get_write_value(attr_CurrentDC_write); try { POLE->set_current_DC (attr_CurrentDC_write); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot write DC current value", "Bilt::write_CurrentDC"); } } //+---------------------------------------------------------------------------- // // method : Bilt::read_CurrentAC // // description : Extract real attribute values for CurrentAC acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_CurrentAC(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_CurrentAC(Tango::Attribute &attr) entering... "<< endl; read_idata(); if ( errors.length() != 0 ) attr.set_quality(Tango::ATTR_INVALID); else attr.set_value (&idata.meascurr); } //+---------------------------------------------------------------------------- // // method : Bilt::read_Voltage // // description : Extract real attribute values for Voltage acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_Voltage(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_Voltage(Tango::Attribute &attr) entering... "<< endl; read_idata(); if ( errors.length() != 0 ) attr.set_quality(Tango::ATTR_INVALID); else attr.set_value (&idata.measvolt); } //+---------------------------------------------------------------------------- // // method : Bilt::read_SetAverage // // description : Extract real attribute values for SetAverage acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_SetAverage(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_SetAverage(Tango::Attribute &attr) entering... "<< endl; read_fdata(); if ( errors.length() != 0 ) attr.set_quality(Tango::ATTR_INVALID); else attr.set_value (&fdata.average_sett_sec); } //+---------------------------------------------------------------------------- // // method : Bilt::read_FramesPerSec // // description : Extract real attribute values for FramesPerSec acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_FramesPerSec(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_FramesPerSec(Tango::Attribute &attr) entering... "<< endl; read_fdata(); if ( errors.length() != 0 ) attr.set_quality(Tango::ATTR_INVALID); else attr.set_value ((Tango::DevULong *) &fdata.nbrframe_sec); } //+---------------------------------------------------------------------------- // // method : Bilt::read_ErrorPerSec // // description : Extract real attribute values for ErrorPerSec acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_ErrorPerSec(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_ErrorPerSec(Tango::Attribute &attr) entering... "<< endl; read_fdata(); if ( errors.length() != 0 ) attr.set_quality(Tango::ATTR_INVALID); else attr.set_value ((Tango::DevULong *) &fdata.nbrferr_sec); } //+---------------------------------------------------------------------------- // // method : Bilt::read_ErrorCounter // // description : Extract real attribute values for ErrorCounter acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_ErrorCounter(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_ErrorCounter(Tango::Attribute &attr) entering... "<< endl; read_fdata(); if ( errors.length() != 0 ) attr.set_quality(Tango::ATTR_INVALID); else attr.set_value ((Tango::DevULong *) &fdata.nbrferr); } //+------------------------------------------------------------------ /** * method: Bilt::on * * description: method to execute "On" * Turns on power supply. * * */ //+------------------------------------------------------------------ void Bilt::on() { DEBUG_STREAM << "Bilt::on(): entering... !" << endl; // Add your own code to control device here try { //POLE->clear_ferrors(); // reset all pending errors first! reset(); BILT->set_state(1); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot switch on pole", "Bilt::on"); } } //+------------------------------------------------------------------ /** * method: Bilt::off * * description: method to execute "Off" * Turns of power supply * * */ //+------------------------------------------------------------------ void Bilt::off() { DEBUG_STREAM << "Bilt::off(): entering... !" << endl; // Add your own code to control device here try { BILT->set_state(0); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot switch off pole", "Bilt::off"); } } //+------------------------------------------------------------------ /** * method: Bilt::reset * * description: method to execute "Reset" * Reset faults and alarms * * */ //+------------------------------------------------------------------ void Bilt::reset() { DEBUG_STREAM << "Bilt::reset(): entering... !" << endl; // Add your own code to control device here try { BILT->clear_all_err(); BILT->clear_alarm(); POLE->clear_ferrors(); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot reset pole", "Bilt::reset"); } } //+------------------------------------------------------------------ /** * method: Bilt::create_tango_exception() * * description: convert an itest exception into a tango exception * * * in : - &e : Reference to itest exception * - reason : Reason of the local Tango exception to be added to the stack * - desc : Description for the local Tango exception to be added to the stack * - origin : Origin if the local Tango exception to be added to the stack */ //+------------------------------------------------------------------ void Bilt::create_tango_exception (itest::ItestException &e, string reason, string desc, string origin) { DEBUG_STREAM << "Bilt::create_tango_exception(): entering... !" << endl; errors.length(e.errors.size() + 1); int i; for(i=0; idevice_status data member) and returns it to the caller. * * @return Status description * */ //+------------------------------------------------------------------ Tango::ConstDevString Bilt::dev_status() { //Tango::ConstDevString argout = DeviceImpl::dev_status(); DEBUG_STREAM << "Bilt::dev_status(): entering... !" << endl; // Add your own code to control device here stringstream status; Tango::DevState state = dev_state(); switch (state) { case Tango::ON: status << "Pole state : ON" << endl; break; case Tango::OFF: status << "Pole state : OFF" << endl; break; case Tango::ALARM: status << "Pole state : Alarm" << endl; if ( idata.fail == "OVU" ) { status << "Alarm message : Overvoltage detected! (48V for 100ms)" << endl; } break; case Tango::FAULT: status << "Pole state : Fault" << endl; status << "Fault code : " << idata.fail << endl; if ( idata.fail == "OVU" ) { status << "Fault descr. : Overvoltage detected! (48V for 100ms)" << endl; break; } if ( idata.fail == "OVI" ) { status << "Fault descr. : Short circuit detected!" << endl; break; } if ( idata.fail == "PWSK" ) { status << "Fault descr. : Absorbed power > 10W in 10ms!" << endl; break; } if ( idata.fail == "TEMP" ) { status << "Fault descr. : Max. temp on semiconductor reached!" << endl; break; } if ( idata.fail == "PWSO" ) { status << "Fault descr. : Delivered power > 40W in 100ms!" << endl; break; } status << "Fault descr. : Unkown fault code!" << endl; break; default: status << "Pole state : Unknown" << endl; status << "Error stack : " << endl; // print error from ITEST interface for(int i=0; iget_str_alarm() << endl; } catch (itest::ItestException &e) { // do nothing! // Just avoid exceptions when executing state or status! } set_status(status.str()); return DeviceImpl::dev_status(); } //+------------------------------------------------------------------ /** * method: Bilt::dev_state * * description: method to execute "State" * This command gets the device state (stored in its device_state data member) and returns it to the caller. * * @return State Code * */ //+------------------------------------------------------------------ Tango::DevState Bilt::dev_state() { Tango::DevState argout; DEBUG_STREAM << "Bilt::dev_state(): entering... !" << endl; // Add your own code to control device here try { read_idata(); } catch (Tango::DevFailed &e) { // do nothing! // Just avoid exceptions when executing state or status! } if ( errors.length() != 0 ) set_state (Tango::UNKNOWN); else { // set the device state switch (idata.state) { case 0: set_state (Tango::OFF); break; case 1: set_state (Tango::ON); break; case 2: set_state (Tango::ALARM); break; case 3: set_state (Tango::FAULT); break; default: set_state (Tango::UNKNOWN); break; } } argout = DeviceImpl::dev_state(); return argout; } } // namespace Node-path: powersupply/itest/Bilt/trunk/Bilt.h Node-kind: file Node-action: change Text-content-length: 9380 Text-content-md5: c12ff4862f8f0119d2817fd1da330f7d Content-length: 9380 //============================================================================= // // file : Bilt.h // // description : Include for the Bilt class. // // project : BILT multi channel power supply // // $Author: meyer $ // // $Revision: 1.3 $ // $Date: 2009-11-26 10:46:58 $ // // SVN only: // $HeadURL: $ // // CVS only: // $Source: /segfs/tango/cvsroot/cppserver/machine/powersupply/SrSteerers/tango/Bilt/Bilt.h,v $ // $Log: not supported by cvs2svn $ // Revision 1.2 2009/11/06 12:46:25 meyer // Added impedance attribute and corrected fromatting of attribute values. // // Revision 1.1.1.1 2009/11/04 16:23:02 meyer // Imported using TkCVS // // // copyleft : European Synchrotron Radiation Facility // BP 220, Grenoble 38043 // FRANCE // //============================================================================= // // This file is generated by POGO // (Program Obviously used to Generate tango Object) // // (c) - Software Engineering Group - ESRF //============================================================================= #ifndef _BILT_H #define _BILT_H #include #include #include //using namespace Tango; /** * @author $Author: meyer $ * @version $Revision: 1.3 $ */ // Add your own constant definitions here. //----------------------------------------------- namespace Bilt_ns { /** * Class Description: * The BILT multi channel power supply will be used with 3 channels for the ESRF fast * feedback systems. * The power supply can be controlled in 2 ways : * By this device server for slow or human control or * by the Libera Beam Position monitors for fast feedback with closed loop control. */ /* * Device States Description: * Tango::ON : Magnet is ON, all three channels are ON. * Tango::OFF : Magnet is OFF, all three channels are OFF. * Tango::FAULT : Error detected by the BILT magnet. * Tango::ALARM : Alarm detected on one or more channels. * Tango::UNKNOWN : Communication fault */ class Bilt: public Tango::Device_4Impl { public : // Add your own data members here //----------------------------------------- // Here is the Start of the automatic code generation part //------------------------------------------------------------- /** * @name attributes * Attribute member data. */ //@{ Tango::DevDouble *attr_CurrentDC_read; Tango::DevDouble attr_CurrentDC_write; Tango::DevDouble *attr_CurrentAC_read; Tango::DevDouble *attr_Voltage_read; Tango::DevDouble *attr_Impedance_read; Tango::DevDouble *attr_SetRMS_read; Tango::DevDouble *attr_SetAverage_read; Tango::DevULong *attr_FramesPerSec_read; Tango::DevULong *attr_ErrorPerSec_read; Tango::DevULong *attr_ErrorCounter_read; Tango::DevBoolean *attr_LocalControl_read; Tango::DevBoolean attr_LocalControl_write; Tango::DevDouble *attr_SetCurrentAC_read; Tango::DevDouble attr_SetCurrentAC_write; //@} /** * @name Device properties * Device properties member data. */ //@{ /** * IP Address of BILT controller. * Each controller includes several magnets and * each magnet includes 3 power supplies, * for corrections in the X, Y and Z planes. * * */ string iPAddress; /** * Magnet number from 1 to 48 */ Tango::DevShort magnetNumber; /** * The number of the Pole to be used from 0 to 2 */ Tango::DevShort poleNumber; //@} /** * @name Device properties * Device property member data. */ //@{ //@} /**@name Constructors * Miscellaneous constructors */ //@{ /** * Constructs a newly allocated Command object. * * @param cl Class. * @param s Device Name */ Bilt(Tango::DeviceClass *cl,string &s); /** * Constructs a newly allocated Command object. * * @param cl Class. * @param s Device Name */ Bilt(Tango::DeviceClass *cl,const char *s); /** * Constructs a newly allocated Command object. * * @param cl Class. * @param s Device name * @param d Device description. */ Bilt(Tango::DeviceClass *cl,const char *s,const char *d); //@} /**@name Destructor * Only one destructor is defined for this class */ //@{ /** * The object destructor. */ ~Bilt() {delete_device();}; /** * will be called at device destruction or at init command. */ void delete_device(); //@} /**@name Miscellaneous methods */ //@{ /** * Initialize the device */ virtual void init_device(); /** * Always executed method before execution command method. */ virtual void always_executed_hook(); //@} /** * @name Bilt methods prototypes */ //@{ /** * Hardware acquisition for attributes. */ virtual void read_attr_hardware(vector &attr_list); /** * Extract real attribute values for CurrentDC acquisition result. */ virtual void read_CurrentDC(Tango::Attribute &attr); /** * Write CurrentDC attribute values to hardware. */ virtual void write_CurrentDC(Tango::WAttribute &attr); /** * Extract real attribute values for CurrentAC acquisition result. */ virtual void read_CurrentAC(Tango::Attribute &attr); /** * Extract real attribute values for Voltage acquisition result. */ virtual void read_Voltage(Tango::Attribute &attr); /** * Extract real attribute values for Impedance acquisition result. */ virtual void read_Impedance(Tango::Attribute &attr); /** * Extract real attribute values for SetRMS acquisition result. */ virtual void read_SetRMS(Tango::Attribute &attr); /** * Extract real attribute values for SetAverage acquisition result. */ virtual void read_SetAverage(Tango::Attribute &attr); /** * Extract real attribute values for FramesPerSec acquisition result. */ virtual void read_FramesPerSec(Tango::Attribute &attr); /** * Extract real attribute values for ErrorPerSec acquisition result. */ virtual void read_ErrorPerSec(Tango::Attribute &attr); /** * Extract real attribute values for ErrorCounter acquisition result. */ virtual void read_ErrorCounter(Tango::Attribute &attr); /** * Extract real attribute values for LocalControl acquisition result. */ virtual void read_LocalControl(Tango::Attribute &attr); /** * Write LocalControl attribute values to hardware. */ virtual void write_LocalControl(Tango::WAttribute &attr); /** * Extract real attribute values for SetCurrentAC acquisition result. */ virtual void read_SetCurrentAC(Tango::Attribute &attr); /** * Write SetCurrentAC attribute values to hardware. */ virtual void write_SetCurrentAC(Tango::WAttribute &attr); /** * Read/Write allowed for CurrentDC attribute. */ virtual bool is_CurrentDC_allowed(Tango::AttReqType type); /** * Read/Write allowed for CurrentAC attribute. */ virtual bool is_CurrentAC_allowed(Tango::AttReqType type); /** * Read/Write allowed for Voltage attribute. */ virtual bool is_Voltage_allowed(Tango::AttReqType type); /** * Read/Write allowed for Impedance attribute. */ virtual bool is_Impedance_allowed(Tango::AttReqType type); /** * Read/Write allowed for SetRMS attribute. */ virtual bool is_SetRMS_allowed(Tango::AttReqType type); /** * Read/Write allowed for SetAverage attribute. */ virtual bool is_SetAverage_allowed(Tango::AttReqType type); /** * Read/Write allowed for FramesPerSec attribute. */ virtual bool is_FramesPerSec_allowed(Tango::AttReqType type); /** * Read/Write allowed for ErrorPerSec attribute. */ virtual bool is_ErrorPerSec_allowed(Tango::AttReqType type); /** * Read/Write allowed for ErrorCounter attribute. */ virtual bool is_ErrorCounter_allowed(Tango::AttReqType type); /** * Read/Write allowed for LocalControl attribute. */ virtual bool is_LocalControl_allowed(Tango::AttReqType type); /** * Read/Write allowed for SetCurrentAC attribute. */ virtual bool is_SetCurrentAC_allowed(Tango::AttReqType type); /** * Execution allowed for On command. */ virtual bool is_On_allowed(const CORBA::Any &any); /** * Execution allowed for Off command. */ virtual bool is_Off_allowed(const CORBA::Any &any); /** * Execution allowed for Reset command. */ virtual bool is_Reset_allowed(const CORBA::Any &any); /** * This command gets the device state (stored in its device_state data member) and returns it to the caller. * @return State Code * @exception DevFailed */ virtual Tango::DevState dev_state(); /** * This command gets the device status (stored in its device_status data member) and returns it to the caller. * @return Status description * @exception DevFailed */ virtual Tango::ConstDevString dev_status(); /** * Turns on power supply. * @exception DevFailed */ void on(); /** * Turns of power supply * @exception DevFailed */ void off(); /** * Reset faults and alarms * @exception DevFailed */ void reset(); /** * Read the device properties from database */ void get_device_property(); //@} // Here is the end of the automatic code generation part //------------------------------------------------------------- protected : // Add your own data members here //----------------------------------------- void create_tango_exception (itest::ItestException &e, string reason, string desc, string origin); void read_idata(); void read_fdata(); itest::TMagnet *BILT; itest::TPole *POLE; struct itest::idata idata; struct itest::fdata fdata; double current_dc; double set_current_ac; double impedance; bool local_control; Tango::DevErrorList errors; }; } // namespace_ns #endif // _BILT_H Node-path: powersupply/itest/Bilt/trunk/BiltClass.cpp Node-kind: file Node-action: change Text-content-length: 22143 Text-content-md5: 032499bc04fa659028f992e70db73910 Content-length: 22143 static const char *ClassId = "$Id: BiltClass.cpp,v 1.4 2009-11-26 10:46:58 meyer Exp $"; static const char *TagName = "$Name: not supported by cvs2svn $"; static const char *CvsPath = "$Source: /segfs/tango/cvsroot/cppserver/machine/powersupply/SrSteerers/tango/Bilt/BiltClass.cpp,v $"; static const char *SvnPath = "$HeadURL: $"; static const char *HttpServer = "http://www.esrf.fr/computing/cs/tango/tango_doc/ds_doc/"; //+============================================================================= // // file : BiltClass.cpp // // description : C++ source for the BiltClass. A singleton // class derived from DeviceClass. It implements the // command list and all properties and methods required // by the Bilt once per process. // // project : TANGO Device Server // // $Author: meyer $ // // $Revision: 1.4 $ // // $Log: not supported by cvs2svn $ // Revision 1.3 2009/11/23 16:46:58 meyer // Corrected state, status and exception handling // // Revision 1.2 2009/11/06 12:46:25 meyer // Added impedance attribute and corrected fromatting of attribute values. // // Revision 1.1.1.1 2009/11/04 16:23:02 meyer // Imported using TkCVS // // // copyleft : European Synchrotron Radiation Facility // BP 220, Grenoble 38043 // FRANCE // //-============================================================================= // // This file is generated by POGO // (Program Obviously used to Generate tango Object) // // (c) - Software Engineering Group - ESRF //============================================================================= #include #include #include //+---------------------------------------------------------------------------- /** * Create BiltClass singleton and return it in a C function for Python usage */ //+---------------------------------------------------------------------------- extern "C" { #ifdef WIN32 __declspec(dllexport) #endif Tango::DeviceClass *_create_Bilt_class(const char *name) { return Bilt_ns::BiltClass::init(name); } } namespace Bilt_ns { //+---------------------------------------------------------------------------- // // method : OnCmd::execute() // // description : method to trigger the execution of the command. // PLEASE DO NOT MODIFY this method core without pogo // // in : - device : The device on which the command must be executed // - in_any : The command input data // // returns : The command output data (packed in the Any object) // //----------------------------------------------------------------------------- CORBA::Any *OnCmd::execute(Tango::DeviceImpl *device,const CORBA::Any &in_any) { cout2 << "OnCmd::execute(): arrived" << endl; ((static_cast(device))->on()); return new CORBA::Any(); } //+---------------------------------------------------------------------------- // // method : OffCmd::execute() // // description : method to trigger the execution of the command. // PLEASE DO NOT MODIFY this method core without pogo // // in : - device : The device on which the command must be executed // - in_any : The command input data // // returns : The command output data (packed in the Any object) // //----------------------------------------------------------------------------- CORBA::Any *OffCmd::execute(Tango::DeviceImpl *device,const CORBA::Any &in_any) { cout2 << "OffCmd::execute(): arrived" << endl; ((static_cast(device))->off()); return new CORBA::Any(); } //+---------------------------------------------------------------------------- // // method : ResetCmd::execute() // // description : method to trigger the execution of the command. // PLEASE DO NOT MODIFY this method core without pogo // // in : - device : The device on which the command must be executed // - in_any : The command input data // // returns : The command output data (packed in the Any object) // //----------------------------------------------------------------------------- CORBA::Any *ResetCmd::execute(Tango::DeviceImpl *device,const CORBA::Any &in_any) { cout2 << "ResetCmd::execute(): arrived" << endl; ((static_cast(device))->reset()); return new CORBA::Any(); } // //---------------------------------------------------------------- // Initialize pointer for singleton pattern //---------------------------------------------------------------- // BiltClass *BiltClass::_instance = NULL; //+---------------------------------------------------------------------------- // // method : BiltClass::BiltClass(string &s) // // description : constructor for the BiltClass // // in : - s : The class name // //----------------------------------------------------------------------------- BiltClass::BiltClass(string &s):DeviceClass(s) { cout2 << "Entering BiltClass constructor" << endl; set_default_property(); get_class_property(); write_class_property(); cout2 << "Leaving BiltClass constructor" << endl; } //+---------------------------------------------------------------------------- // // method : BiltClass::~BiltClass() // // description : destructor for the BiltClass // //----------------------------------------------------------------------------- BiltClass::~BiltClass() { _instance = NULL; } //+---------------------------------------------------------------------------- // // method : BiltClass::instance // // description : Create the object if not already done. Otherwise, just // return a pointer to the object // // in : - name : The class name // //----------------------------------------------------------------------------- BiltClass *BiltClass::init(const char *name) { if (_instance == NULL) { try { string s(name); _instance = new BiltClass(s); } catch (bad_alloc) { throw; } } return _instance; } BiltClass *BiltClass::instance() { if (_instance == NULL) { cerr << "Class is not initialised !!" << endl; exit(-1); } return _instance; } //+---------------------------------------------------------------------------- // // method : BiltClass::command_factory // // description : Create the command object(s) and store them in the // command list // //----------------------------------------------------------------------------- void BiltClass::command_factory() { command_list.push_back(new OnCmd("On", Tango::DEV_VOID, Tango::DEV_VOID, "", "", Tango::OPERATOR)); command_list.push_back(new OffCmd("Off", Tango::DEV_VOID, Tango::DEV_VOID, "", "", Tango::OPERATOR)); command_list.push_back(new ResetCmd("Reset", Tango::DEV_VOID, Tango::DEV_VOID, "", "", Tango::OPERATOR)); // add polling if any for (unsigned int i=0 ; ilength() ; i++) { cout4 << "Device name : " << (*devlist_ptr)[i].in() << endl; // Create devices and add it into the device list //---------------------------------------------------- device_list.push_back(new Bilt(this, (*devlist_ptr)[i])); // Export device to the outside world // Check before if database used. //--------------------------------------------- if ((Tango::Util::_UseDb == true) && (Tango::Util::_FileDb == false)) export_device(device_list.back()); else export_device(device_list.back(), (*devlist_ptr)[i]); } // End of Automatic code generation //------------------------------------------------------------- } //+---------------------------------------------------------------------------- // Method: BiltClass::attribute_factory(vector &att_list) //----------------------------------------------------------------------------- void BiltClass::attribute_factory(vector &att_list) { // Attribute : CurrentDC CurrentDCAttrib *current_dc = new CurrentDCAttrib(); Tango::UserDefaultAttrProp current_dc_prop; current_dc_prop.set_label("DC Current"); current_dc_prop.set_unit("A"); current_dc_prop.set_format("%6.4f"); current_dc_prop.set_max_value("1.8"); current_dc_prop.set_min_value("-1.8"); current_dc_prop.set_description("The DC current of the channel"); current_dc->set_default_properties(current_dc_prop); current_dc->set_memorized(); current_dc->set_memorized_init(true); att_list.push_back(current_dc); // Attribute : CurrentAC CurrentACAttrib *current_ac = new CurrentACAttrib(); Tango::UserDefaultAttrProp current_ac_prop; current_ac_prop.set_label("Current"); current_ac_prop.set_unit("A"); current_ac_prop.set_format("%6.4f"); current_ac_prop.set_description("The measured AC current of the channel"); current_ac->set_default_properties(current_ac_prop); att_list.push_back(current_ac); // Attribute : Voltage VoltageAttrib *voltage = new VoltageAttrib(); Tango::UserDefaultAttrProp voltage_prop; voltage_prop.set_label("Voltage"); voltage_prop.set_unit("V"); voltage_prop.set_format("%6.4f"); voltage_prop.set_description("The measured voltage of the channel"); voltage->set_default_properties(voltage_prop); att_list.push_back(voltage); // Attribute : Impedance ImpedanceAttrib *impedance = new ImpedanceAttrib(); Tango::UserDefaultAttrProp impedance_prop; impedance_prop.set_label("Impedance"); impedance_prop.set_unit("Ohms"); impedance_prop.set_format("%4.2f"); impedance_prop.set_max_alarm("5.0"); impedance_prop.set_description("Calculated impedance of the channel."); impedance->set_default_properties(impedance_prop); att_list.push_back(impedance); // Attribute : SetRMS SetRMSAttrib *set_rms = new SetRMSAttrib(); Tango::UserDefaultAttrProp set_rms_prop; set_rms_prop.set_label("RMS Setpoint/s"); set_rms_prop.set_unit("A"); set_rms_prop.set_format("%6.4f"); set_rms_prop.set_description("Statistic when driven by the Libera.\nRMS value of the AC setpoint applied on the DAC during the last second.\nX=sqr( (sum(setAC)*sum(setAC)) / n - ((sum(setAC)/n) *(sum(setAC)/n)) )"); set_rms->set_default_properties(set_rms_prop); att_list.push_back(set_rms); // Attribute : SetAverage SetAverageAttrib *set_average = new SetAverageAttrib(); Tango::UserDefaultAttrProp set_average_prop; set_average_prop.set_label("Average Setpoint/s"); set_average_prop.set_unit("A"); set_average_prop.set_format("%6.4f"); set_average_prop.set_description("Statistic when driven by the Libera.\nThe average AC setpoint applied to the DAC during the last second.\nX=SUM(setAC)/n"); set_average->set_default_properties(set_average_prop); att_list.push_back(set_average); // Attribute : FramesPerSec FramesPerSecAttrib *frames_per_sec = new FramesPerSecAttrib(); Tango::UserDefaultAttrProp frames_per_sec_prop; frames_per_sec_prop.set_label("Frames/s"); frames_per_sec_prop.set_unit(" "); frames_per_sec_prop.set_format("%3d"); frames_per_sec_prop.set_description("Statistic when driven by the Libera.\nThe number of setpoints per second."); frames_per_sec->set_default_properties(frames_per_sec_prop); att_list.push_back(frames_per_sec); // Attribute : ErrorPerSec ErrorPerSecAttrib *error_per_sec = new ErrorPerSecAttrib(); Tango::UserDefaultAttrProp error_per_sec_prop; error_per_sec_prop.set_label("Errors/s"); error_per_sec_prop.set_unit(" "); error_per_sec_prop.set_format("%3d"); error_per_sec_prop.set_description("Statistic when driven by the Libera.\nThe number of errors detected per second."); error_per_sec->set_default_properties(error_per_sec_prop); att_list.push_back(error_per_sec); // Attribute : ErrorCounter ErrorCounterAttrib *error_counter = new ErrorCounterAttrib(); Tango::UserDefaultAttrProp error_counter_prop; error_counter_prop.set_label("Error Counter"); error_counter_prop.set_unit(" "); error_counter_prop.set_format("%6d"); error_counter_prop.set_description("Statistic when driven by the Libera.\nThe total number of errors since the last reset."); error_counter->set_default_properties(error_counter_prop); att_list.push_back(error_counter); // Attribute : LocalControl LocalControlAttrib *local_control = new LocalControlAttrib(); Tango::UserDefaultAttrProp local_control_prop; local_control_prop.set_label("Local Control"); local_control_prop.set_unit(" "); local_control_prop.set_description("If true the AC current can be set on the device,\notherwise it is driven by the Libera."); local_control->set_default_properties(local_control_prop); att_list.push_back(local_control); // Attribute : SetCurrentAC SetCurrentACAttrib *set_current_ac = new SetCurrentACAttrib(); Tango::UserDefaultAttrProp set_current_ac_prop; set_current_ac_prop.set_label("AC Current Setpoint"); set_current_ac_prop.set_unit("A"); set_current_ac_prop.set_format("%6.4f"); set_current_ac_prop.set_max_value("0.2"); set_current_ac_prop.set_min_value("-0.2"); set_current_ac_prop.set_description("The AC current setpoint in local mode. If driven by the Libera, the attribute \nattribute value in INVALID."); set_current_ac->set_default_properties(set_current_ac_prop); att_list.push_back(set_current_ac); // End of Automatic code generation //------------------------------------------------------------- } //+---------------------------------------------------------------------------- // // method : BiltClass::get_class_property() // // description : Read the class properties from database. // //----------------------------------------------------------------------------- void BiltClass::get_class_property() { // Initialize your default values here (if not done with POGO). //------------------------------------------------------------------ // Read class properties from database.(Automatic code generation) //------------------------------------------------------------------ // Call database and extract values //-------------------------------------------- if (Tango::Util::instance()->_UseDb==true) get_db_class()->get_property(cl_prop); Tango::DbDatum def_prop; int i = -1; // End of Automatic code generation //------------------------------------------------------------------ } //+---------------------------------------------------------------------------- // // method : BiltClass::set_default_property // // description: Set default property (class and device) for wizard. // For each property, add to wizard property name and description // If default value has been set, add it to wizard property and // store it in a DbDatum. // //----------------------------------------------------------------------------- void BiltClass::set_default_property() { string prop_name; string prop_desc; string prop_def; vector vect_data; // Set Default Class Properties // Set Default Device Properties prop_name = "IPAddress"; prop_desc = "IP Address of BILT controller.\nEach controller includes several magnets and\neach magnet includes 3 power supplies,\nfor corrections in the X, Y and Z planes.\n\n"; prop_def = "0.0.0.0"; vect_data.clear(); vect_data.push_back("0.0.0.0"); if (prop_def.length()>0) { Tango::DbDatum data(prop_name); data << vect_data ; dev_def_prop.push_back(data); add_wiz_dev_prop(prop_name, prop_desc, prop_def); } else add_wiz_dev_prop(prop_name, prop_desc); prop_name = "MagnetNumber"; prop_desc = "Magnet number from 1 to 48"; prop_def = "0"; vect_data.clear(); vect_data.push_back("0"); if (prop_def.length()>0) { Tango::DbDatum data(prop_name); data << vect_data ; dev_def_prop.push_back(data); add_wiz_dev_prop(prop_name, prop_desc, prop_def); } else add_wiz_dev_prop(prop_name, prop_desc); prop_name = "PoleNumber"; prop_desc = "The number of the Pole to be used from 0 to 2"; prop_def = "0"; vect_data.clear(); vect_data.push_back("0"); if (prop_def.length()>0) { Tango::DbDatum data(prop_name); data << vect_data ; dev_def_prop.push_back(data); add_wiz_dev_prop(prop_name, prop_desc, prop_def); } else add_wiz_dev_prop(prop_name, prop_desc); } //+---------------------------------------------------------------------------- // // method : BiltClass::write_class_property // // description : Set class description as property in database // //----------------------------------------------------------------------------- void BiltClass::write_class_property() { // First time, check if database used //-------------------------------------------- if (Tango::Util::_UseDb == false) return; Tango::DbData data; string classname = get_name(); string header; string::size_type start, end; // Put title Tango::DbDatum title("ProjectTitle"); string str_title("BILT multi channel power supply"); title << str_title; data.push_back(title); // Put Description Tango::DbDatum description("Description"); vector str_desc; str_desc.push_back("The BILT multi channel power supply will be used with 3 channels for the ESRF fast"); str_desc.push_back("feedback systems."); str_desc.push_back("The power supply can be controlled in 2 ways :"); str_desc.push_back("By this device server for slow or human control or"); str_desc.push_back("by the Libera Beam Position monitors for fast feedback with closed loop control."); description << str_desc; data.push_back(description); // put cvs or svn location string filename(classname); filename += "Class.cpp"; // Create a string with the class ID to // get the string into the binary string class_id(ClassId); // check for cvs information string src_path(CvsPath); start = src_path.find("/"); if (start!=string::npos) { end = src_path.find(filename); if (end>start) { string strloc = src_path.substr(start, end-start); // Check if specific repository start = strloc.find("/cvsroot/"); if (start!=string::npos && start>0) { string repository = strloc.substr(0, start); if (repository.find("/segfs/")!=string::npos) strloc = "ESRF:" + strloc.substr(start, strloc.length()-start); } Tango::DbDatum cvs_loc("cvs_location"); cvs_loc << strloc; data.push_back(cvs_loc); } } // check for svn information else { string src_path(SvnPath); start = src_path.find("://"); if (start!=string::npos) { end = src_path.find(filename); if (end>start) { header = "$HeadURL: "; start = header.length(); string strloc = src_path.substr(start, (end-start)); Tango::DbDatum svn_loc("svn_location"); svn_loc << strloc; data.push_back(svn_loc); } } } // Get CVS or SVN revision tag // CVS tag string tagname(TagName); header = "$Name: "; start = header.length(); string endstr(" $"); end = tagname.find(endstr); if (end!=string::npos && end>start) { string strtag = tagname.substr(start, end-start); Tango::DbDatum cvs_tag("cvs_tag"); cvs_tag << strtag; data.push_back(cvs_tag); } // SVN tag string svnpath(SvnPath); header = "$HeadURL: "; start = header.length(); end = svnpath.find(endstr); if (end!=string::npos && end>start) { string strloc = svnpath.substr(start, end-start); string tagstr ("/tags/"); start = strloc.find(tagstr); if ( start!=string::npos ) { start = start + tagstr.length(); end = strloc.find(filename); string strtag = strloc.substr(start, end-start-1); Tango::DbDatum svn_tag("svn_tag"); svn_tag << strtag; data.push_back(svn_tag); } } // Get URL location string httpServ(HttpServer); if (httpServ.length()>0) { Tango::DbDatum db_doc_url("doc_url"); db_doc_url << httpServ; data.push_back(db_doc_url); } // Put inheritance Tango::DbDatum inher_datum("InheritedFrom"); vector inheritance; inheritance.push_back("Device_4Impl"); inher_datum << inheritance; data.push_back(inher_datum); // Call database and and values //-------------------------------------------- get_db_class()->put_property(data); } } // namespace Node-path: powersupply/itest/Bilt/trunk/BiltClass.h Node-kind: file Node-action: change Text-content-length: 9533 Text-content-md5: 5f9ff4341cefc59ef84d0de795ae969f Content-length: 9533 //============================================================================= // // file : BiltClass.h // // description : Include for the BiltClass root class. // This class is the singleton class for // the Bilt device class. // It contains all properties and methods which the // Bilt requires only once e.g. the commands. // // project : TANGO Device Server // // $Author: meyer $ // // $Revision: 1.3 $ // $Date: 2009-11-26 10:46:58 $ // // SVN only: // $HeadURL: $ // // CVS only: // $Source: /segfs/tango/cvsroot/cppserver/machine/powersupply/SrSteerers/tango/Bilt/BiltClass.h,v $ // $Log: not supported by cvs2svn $ // Revision 1.2 2009/11/06 12:46:25 meyer // Added impedance attribute and corrected fromatting of attribute values. // // Revision 1.1.1.1 2009/11/04 16:23:02 meyer // Imported using TkCVS // // // copyleft : European Synchrotron Radiation Facility // BP 220, Grenoble 38043 // FRANCE // //============================================================================= // // This file is generated by POGO // (Program Obviously used to Generate tango Object) // // (c) - Software Engineering Group - ESRF //============================================================================= #ifndef _BILTCLASS_H #define _BILTCLASS_H #include #include namespace Bilt_ns {//===================================== // Define classes for attributes //===================================== class SetCurrentACAttrib: public Tango::Attr { public: SetCurrentACAttrib():Attr("SetCurrentAC", Tango::DEV_DOUBLE, Tango::READ_WRITE) {}; ~SetCurrentACAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_SetCurrentAC(att);} virtual void write(Tango::DeviceImpl *dev,Tango::WAttribute &att) {(static_cast(dev))->write_SetCurrentAC(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_SetCurrentAC_allowed(ty);} }; class LocalControlAttrib: public Tango::Attr { public: LocalControlAttrib():Attr("LocalControl", Tango::DEV_BOOLEAN, Tango::READ_WRITE) {}; ~LocalControlAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_LocalControl(att);} virtual void write(Tango::DeviceImpl *dev,Tango::WAttribute &att) {(static_cast(dev))->write_LocalControl(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_LocalControl_allowed(ty);} }; class ErrorCounterAttrib: public Tango::Attr { public: ErrorCounterAttrib():Attr("ErrorCounter", Tango::DEV_ULONG, Tango::READ) {}; ~ErrorCounterAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_ErrorCounter(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_ErrorCounter_allowed(ty);} }; class ErrorPerSecAttrib: public Tango::Attr { public: ErrorPerSecAttrib():Attr("ErrorPerSec", Tango::DEV_ULONG, Tango::READ) {}; ~ErrorPerSecAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_ErrorPerSec(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_ErrorPerSec_allowed(ty);} }; class FramesPerSecAttrib: public Tango::Attr { public: FramesPerSecAttrib():Attr("FramesPerSec", Tango::DEV_ULONG, Tango::READ) {}; ~FramesPerSecAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_FramesPerSec(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_FramesPerSec_allowed(ty);} }; class SetAverageAttrib: public Tango::Attr { public: SetAverageAttrib():Attr("SetAverage", Tango::DEV_DOUBLE, Tango::READ) {}; ~SetAverageAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_SetAverage(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_SetAverage_allowed(ty);} }; class SetRMSAttrib: public Tango::Attr { public: SetRMSAttrib():Attr("SetRMS", Tango::DEV_DOUBLE, Tango::READ) {}; ~SetRMSAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_SetRMS(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_SetRMS_allowed(ty);} }; class ImpedanceAttrib: public Tango::Attr { public: ImpedanceAttrib():Attr("Impedance", Tango::DEV_DOUBLE, Tango::READ) {}; ~ImpedanceAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_Impedance(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_Impedance_allowed(ty);} }; class VoltageAttrib: public Tango::Attr { public: VoltageAttrib():Attr("Voltage", Tango::DEV_DOUBLE, Tango::READ) {}; ~VoltageAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_Voltage(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_Voltage_allowed(ty);} }; class CurrentACAttrib: public Tango::Attr { public: CurrentACAttrib():Attr("CurrentAC", Tango::DEV_DOUBLE, Tango::READ) {}; ~CurrentACAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_CurrentAC(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_CurrentAC_allowed(ty);} }; class CurrentDCAttrib: public Tango::Attr { public: CurrentDCAttrib():Attr("CurrentDC", Tango::DEV_DOUBLE, Tango::READ_WRITE) {}; ~CurrentDCAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_CurrentDC(att);} virtual void write(Tango::DeviceImpl *dev,Tango::WAttribute &att) {(static_cast(dev))->write_CurrentDC(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_CurrentDC_allowed(ty);} }; //========================================= // Define classes for commands //========================================= class ResetCmd : public Tango::Command { public: ResetCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out, const char *in_desc, const char *out_desc, Tango::DispLevel level) :Command(name,in,out,in_desc,out_desc, level) {}; ResetCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out) :Command(name,in,out) {}; ~ResetCmd() {}; virtual CORBA::Any *execute (Tango::DeviceImpl *dev, const CORBA::Any &any); virtual bool is_allowed (Tango::DeviceImpl *dev, const CORBA::Any &any) {return (static_cast(dev))->is_Reset_allowed(any);} }; class OffCmd : public Tango::Command { public: OffCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out, const char *in_desc, const char *out_desc, Tango::DispLevel level) :Command(name,in,out,in_desc,out_desc, level) {}; OffCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out) :Command(name,in,out) {}; ~OffCmd() {}; virtual CORBA::Any *execute (Tango::DeviceImpl *dev, const CORBA::Any &any); virtual bool is_allowed (Tango::DeviceImpl *dev, const CORBA::Any &any) {return (static_cast(dev))->is_Off_allowed(any);} }; class OnCmd : public Tango::Command { public: OnCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out, const char *in_desc, const char *out_desc, Tango::DispLevel level) :Command(name,in,out,in_desc,out_desc, level) {}; OnCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out) :Command(name,in,out) {}; ~OnCmd() {}; virtual CORBA::Any *execute (Tango::DeviceImpl *dev, const CORBA::Any &any); virtual bool is_allowed (Tango::DeviceImpl *dev, const CORBA::Any &any) {return (static_cast(dev))->is_On_allowed(any);} }; // // The BiltClass singleton definition // class #ifdef WIN32 __declspec(dllexport) #endif BiltClass : public Tango::DeviceClass { public: // properties member data // add your own data members here //------------------------------------ public: Tango::DbData cl_prop; Tango::DbData cl_def_prop; Tango::DbData dev_def_prop; // Method prototypes static BiltClass *init(const char *); static BiltClass *instance(); ~BiltClass(); Tango::DbDatum get_class_property(string &); Tango::DbDatum get_default_device_property(string &); Tango::DbDatum get_default_class_property(string &); protected: BiltClass(string &); static BiltClass *_instance; void command_factory(); void get_class_property(); void attribute_factory(vector &); void write_class_property(); void set_default_property(); string get_cvstag(); string get_cvsroot(); private: void device_factory(const Tango::DevVarStringArray *); }; } // namespace Bilt_ns #endif // _BILTCLASS_H Node-path: powersupply/itest/Bilt/trunk/BiltStateMachine.cpp Node-kind: file Node-action: change Text-content-length: 8056 Text-content-md5: 4e6557744867eab0e991b04989cbe0ca Content-length: 8056 static const char *RcsId = "$Id $"; //+============================================================================= // // file : BiltStateMachine.cpp // // description : C++ source for the Bilt and its alowed // methods for commands and attributes // // project : TANGO Device Server // // $Author: meyer $ // // $Revision: 1.3 $ // $Date: 2009-11-26 10:46:58 $ // // SVN only: // $HeadURL: $ // // CVS only: // $Source: /segfs/tango/cvsroot/cppserver/machine/powersupply/SrSteerers/tango/Bilt/BiltStateMachine.cpp,v $ // $Log: not supported by cvs2svn $ // Revision 1.2 2009/11/06 12:46:25 meyer // Added impedance attribute and corrected fromatting of attribute values. // // Revision 1.1.1.1 2009/11/04 16:23:02 meyer // Imported using TkCVS // // // copyleft : European Synchrotron Radiation Facility // BP 220, Grenoble 38043 // FRANCE // //-============================================================================= // // This file is generated by POGO // (Program Obviously used to Generate tango Object) // // (c) - Software Engineering Group - ESRF //============================================================================= #include #include #include /*==================================================================== * This file contains the methods to allow commands and attributes * read or write execution. * * If you wand to add your own code, add it between * the "End/Re-Start of Generated Code" comments. * * If you want, you can also add your own methods. *==================================================================== */ namespace Bilt_ns { //================================================= // Attributes Allowed Methods //================================================= //+---------------------------------------------------------------------------- // // method : Bilt::is_CurrentDC_allowed // // description : Read/Write allowed for CurrentDC attribute. // //----------------------------------------------------------------------------- bool Bilt::is_CurrentDC_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_CurrentAC_allowed // // description : Read/Write allowed for CurrentAC attribute. // //----------------------------------------------------------------------------- bool Bilt::is_CurrentAC_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_Voltage_allowed // // description : Read/Write allowed for Voltage attribute. // //----------------------------------------------------------------------------- bool Bilt::is_Voltage_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_SetAverage_allowed // // description : Read/Write allowed for SetAverage attribute. // //----------------------------------------------------------------------------- bool Bilt::is_SetAverage_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_FramesPerSec_allowed // // description : Read/Write allowed for FramesPerSec attribute. // //----------------------------------------------------------------------------- bool Bilt::is_FramesPerSec_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_ErrorPerSec_allowed // // description : Read/Write allowed for ErrorPerSec attribute. // //----------------------------------------------------------------------------- bool Bilt::is_ErrorPerSec_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_ErrorCounter_allowed // // description : Read/Write allowed for ErrorCounter attribute. // //----------------------------------------------------------------------------- bool Bilt::is_ErrorCounter_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_LocalControl_allowed // // description : Read/Write allowed for LocalControl attribute. // //----------------------------------------------------------------------------- bool Bilt::is_LocalControl_allowed(Tango::AttReqType type) { if (get_state() == Tango::OFF || get_state() == Tango::FAULT || get_state() == Tango::UNKNOWN) { // End of Generated Code // Re-Start of Generated Code return false; } return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_SetCurrentAC_allowed // // description : Read/Write allowed for SetCurrentAC attribute. // //----------------------------------------------------------------------------- bool Bilt::is_SetCurrentAC_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_Impedance_allowed // // description : Read/Write allowed for Impedance attribute. // //----------------------------------------------------------------------------- bool Bilt::is_Impedance_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_SetRMS_allowed // // description : Read/Write allowed for SetRMS attribute. // //----------------------------------------------------------------------------- bool Bilt::is_SetRMS_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //================================================= // Commands Allowed Methods //================================================= //+---------------------------------------------------------------------------- // // method : Bilt::is_On_allowed // // description : Execution allowed for On command. // //----------------------------------------------------------------------------- bool Bilt::is_On_allowed(const CORBA::Any &any) { if (get_state() == Tango::ON || get_state() == Tango::FAULT || get_state() == Tango::UNKNOWN) { // End of Generated Code // Re-Start of Generated Code return false; } return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_Off_allowed // // description : Execution allowed for Off command. // //----------------------------------------------------------------------------- bool Bilt::is_Off_allowed(const CORBA::Any &any) { if (get_state() == Tango::OFF || get_state() == Tango::UNKNOWN) { // End of Generated Code // Re-Start of Generated Code return false; } return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_Reset_allowed // // description : Execution allowed for Reset command. // //----------------------------------------------------------------------------- bool Bilt::is_Reset_allowed(const CORBA::Any &any) { if (get_state() == Tango::UNKNOWN) { // End of Generated Code // Re-Start of Generated Code return false; } return true; } } // namespace Bilt_ns Node-path: powersupply/itest/Bilt/trunk/Makefile Node-kind: file Node-action: change Text-content-length: 5045 Text-content-md5: 1b7eb5a694c887ceafdbf11faf341cff Content-length: 5045 #============================================================================= # # file : Makefile # # description : Include for the Bilt class. # # project : Makefile to generate a Tango server # # $Author: meyer $ # # $Revision: 1.2 $ # # $Log: not supported by cvs2svn $ # Revision 1.1.1.1 2009/11/04 16:23:02 meyer # Imported using TkCVS # # # copyleft : European Synchrotron Radiation Facility # BP 220, Grenoble 38043 # FRANCE # #============================================================================= # This file is generated by POGO # (Program Obviously used to Generate tango Object) # # (c) - Software Engineering Group - ESRF #============================================================================= # CLASS = Bilt MAJOR_VERS = 1 MINOR_VERS = 0 RELEASE = Release_$(MAJOR_VERS)_$(MINOR_VERS) OS = $(shell /csadmin/common/scripts/get_os) PROCESSOR = $(shell uname -p) #----------------------------------------- # Set default home directories #----------------------------------------- TANGO_HOME = /segfs/tango/release CPP_SERVERS = $(TANGO_HOME)/cppserver ifdef no_debug DEBUG = -O else DEBUG = -g endif ifdef _solaris CC = CC BIN_DIR=$(OS)_CC AR_SL = $(CC) -mt -G VERS_OPT = -h SL_EXT = so endif ifdef linux CC = c++ CC_SHLIB = $(CC) -fPIC $(PROCESSOR)=1 ifdef x86_64 NBITS=_64 endif BIN_DIR=$(OS)$(NBITS) AR_SL = $(CC) -fPIC -shared SL_EXT = so VERS_OPT = -Wl,-soname, endif INCLUDE_DIRS = -I$(TANGO_HOME)/$(BIN_DIR)/include -I. \ -I$(CPP_SERVERS)/include \ -I libMagnet_V120 OBJS_DIR = obj/$(BIN_DIR) LIB_DIRS = -L $(TANGO_HOME)/$(BIN_DIR)/lib \ -L libMagnet_V120 TARGET_LIB = $(CPP_SERVERS)/lib/$(BIN_DIR)/libtgclasses.a #----------------------------------------- # Set CXXFLAGS and LFLAGS #----------------------------------------- ifdef _solaris CXXFLAGS = $(DEBUG) -mt -D_PTHREADS $(INCLUDE_DIRS) LFLAGS = $(DEBUG) $(LIB_DIRS) \ -ltango \ -llog4tango \ -lomniORB4 \ -lomniDynamic4 \ -lomnithread \ -lCOS4 \ -lpthread \ -lposix4 -lsocket -lnsl endif ifdef linux CXXFLAGS = $(DEBUG) -D_REENTRANT $(INCLUDE_DIRS) LFLAGS = $(DEBUG) $(LIB_DIRS) \ -ltango \ -llog4tango \ -lomniORB4 \ -lomniDynamic4 \ -lomnithread \ -lCOS4 \ -ldl -lpthread \ -lMagnet endif #----------------------------------------- # Set dependences #----------------------------------------- SVC_OBJS = $(OBJS_DIR)/$(CLASS).o \ $(OBJS_DIR)/$(CLASS)StateMachine.o \ $(OBJS_DIR)/$(CLASS)Class.o \ $(OBJS_DIR)/ClassFactory.o \ $(OBJS_DIR)/main.o SHLIB_OBJS = $(OBJS_DIR)/$(CLASS)Class.so.o \ $(OBJS_DIR)/$(CLASS)StateMachine.so.o \ $(OBJS_DIR)/$(CLASS).so.o SVC_INC = $(CLASS)Class.h \ $(CLASS).h $(OBJS_DIR)/%.o: %.cpp $(SVC_INC) $(CC) $(CXXFLAGS) -c $< -o $(OBJS_DIR)/$*.o $(OBJS_DIR)/%.so.o: %.cpp $(SVC_INC) $(CC_SHLIB) $(CXXFLAGS) -c $< -o $(OBJS_DIR)/$*.so.o #----------------------------------------- # Make Entry #----------------------------------------- all: $(CLASS) $(CLASS): make_obj_dir make_bin_dir $(SVC_OBJS) $(CC) $(SVC_OBJS) -o $(CLASS) $(LFLAGS) @mv $(CLASS) bin/$(BIN_DIR)/$(CLASS) shlib: make_obj_dir make_shlib_dir $(SHLIB_OBJS) $(AR_SL) -o \ shlib/$(BIN_DIR)/$(CLASS).$(SL_EXT).$(MAJOR_VERS).$(MINOR_VERS) \ $(VERS_OPT)$(CLASS).$(SL_EXT).$(MAJOR_VERS) \ $(SHLIB_OBJS) $(LFLAGS) @rm -f shlib/$(BIN_DIR)/$(CLASS).$(SL_EXT) @cd shlib/$(BIN_DIR); \ ln -s $(CLASS).$(SL_EXT).$(MAJOR_VERS).$(MINOR_VERS) $(CLASS).$(SL_EXT) clean: rm -f $(OBJS_DIR)/*.o \ $(OBJS_DIR)/*.so.o \ bin/$(BIN_DIR)/$(CLASS) \ core make_obj_dir: @mkdir -p obj @mkdir -p obj/$(BIN_DIR) make_bin_dir: @mkdir -p bin @mkdir -p bin/$(BIN_DIR) make_shlib_dir: @mkdir -p shlib @mkdir -p shlib/$(BIN_DIR) #----------------------------------------- # Install binary file #----------------------------------------- install: cp bin/$(BIN_DIR)/$(CLASS) $(TANGO_HOME)/$(BIN_DIR)/bin #----------------------------------------- # Update class library and header files # recompile without debug mode. #----------------------------------------- lib: clean @make no_debug=1 cp *.h $(CPP_SERVERS)/include ar ruv $(TARGET_LIB) $(CLASS).o ar ruv $(TARGET_LIB) $(CLASS)Class.o ar ruv $(TARGET_LIB) $(CLASS)StateMachine.o ident $(TARGET_LIB) | grep $(CLASS) #------------------------------------------------------ # Tag the CVS/SVN module corresponding to this class # copy cvs_tag or svn_tag to tag: entry #------------------------------------------------------ #svn_tag: # svn copy ../trunk ../tags/$(RELEASE) # svn commit ../tags/$(RELEASE) \ # -m "Tagging the $(RELEASE) of the $(CLASS) project." # #cvs_tag: # @cvstag "$(CLASS)-$(RELEASE)" # @make $(CLASS) # @make show_tag #show_cvs_tag: # @cvstag -d # # Only these make options work with the current Pogo version 5.3.x! tag: @cvstag "$(CLASS)-$(RELEASE)" @make $(CLASS) @make show_tag show_tag: @cvstag -d Revision-number: 8 Prop-content-length: 115 Content-length: 115 K 10 svn:author V 5 meyer K 8 svn:date V 27 2009-11-26T10:49:00.000000Z K 7 svn:log V 15 libMagnet_V120 PROPS-END Node-path: powersupply/itest/Bilt/trunk/libMagnet_V120 Node-kind: dir Node-action: add Node-path: powersupply/itest/Bilt/trunk/libMagnet_V120/Manuel_esrf_bibliothequeC++_itest_ed3.pdf Node-kind: file Node-action: add Prop-content-length: 36 Text-content-length: 320547 Text-content-md5: 9edf8d6ca82cdd7d0aefd7ba3fdca85f Content-length: 320583 K 14 svn:executable V 1 * PROPS-END %PDF-1.3 %Çì¢ 5 0 obj <> stream xœí]]oݸ}÷¯ÐÛ& ,“EIÍ6]ݯQô!@aÇvâÝ$ŽíxÑý·‹¾4yï¨>ï¥îJ#ùÚVìÙAp–äÎ ‡‡Ã]D*Ö&RÕŸîo>ì\ììíÑÛ«‹È*SÔ°uYœFÖäåßNgE첪èÞ¾VÑ_Îw^í¨ØyÔû;úD-ÛÍã¤ú¯nÚÿ÷›ÑóƒªUi+œ–mEáT#žŽŒÕ±qQ–ë8Í£ƒ;Oþþôà—²›$U¡ƒã'‡”Æ©1ò±B\ÙKcm ]7re“-tÒÔs¶,ÖBï+ÈÄ™Ó]¡ˆ Çmã¹±®ß’'­Ö6­Ã‚ÓjG´+gœBàçºzJ«¬…ÎiÅÏ”ĉÒI×ü;Úã/Dô Z¨Ó¹2IÖ9íó÷’ÅF™¼kêYS/ÏMb7 c’°ú¨®@ÿ:óåëÞ\Q¨«ètýUè9õ¼kZê²i½P:Mû­û&¤þù]ƒX¥Š®Þ‹¦õr¹¤…~n Ì×™~Ÿ*ù¯ÔÇt5Óz$ûÃÑ•!ÁúÃ1sIºáÕ•]ºÎµã±4zš÷UàC'´bÛßÂjÝ•ú-*^Q¨Ö°U®]6J·¹¶áÖ¨¤gT,P *žÓŠŸ‰XïXÚº˜«ævÀ¥.Q½ÑÕ¸¨ C@]gðJi£ƒýáY¬­—ZmÍ$ë·!Úæ¦4i eάF}¶ÅºÞqÐ:¾TÝH͵v}Èo}R©[®H Úbs*nSú]ãJnRÆÄ]m*ŽRýCÍ›Phz¦&׊}QÔz®é.(tgF1ú~Ò/õS3 gºB‡T7o›B‰3éEôPÓR{T`ÆÚK^D¯vtTý©øh÷/Í¢RˆõŒçÚ¯b¿™‹\–Åέg<]j w…¯¢´U²špë¯fµ=ÚCNš¨[ä‰éÍï¶„ŒêYÝÆ©*™•”Æšõ@ëè.q.\ñˆüàYÛ”ÑE,~ïŒBçT{Ÿ[ÊT6Õ‰ðŽ´þ…öù‚«õ½,¹N6ô÷;ÚüKv:ÙØìòy9hT¼nJvc‹¶Ù@ÌÂ̓n×K¨¢\ã$Y/e<*X{tûÄN¯Ö¶­&ÊB6,Ö{Ú:€@ÅEEè1CK›Iz¤Ð#wÌ­3HCK ƒìº ¨Ú9íÐ[Vô Ô -5@!iE¡ $@ th 2ÜßZmë<3¡¥@[?VP'+$ì@5À­Oû€úd0°ÓŠuf†àô›nïTç{:.מÿuÎd]©=*ÂË êsrPˆÐaÈuÑ9þ5•P~ÐÖs*=‹XºÕ‚q¦ÈÃn$@ $У‡$Ø’´ÌÅZ§Ã$—æ»ýÙ÷<¤¥ZÚ‘Y½ºEKSBd’ŽÆÛ´­»K¹Þì2¼~Ò`þ.qGîòDuPs•I•}\‘N È*¹€r@NôõÓV0¥(º@ $@÷LkE2ôÈÍQ§éxy?@)[óN(‚ŒH6Û>€ÿð²T ½èU˜húBL"šþÍ¡0Ñô·vžH H [‡n±õ¥QÏ»`£3Ó €e‚SÐØþÔ´åo9‡î›À[ì>ñ©¾ Ó}!@.–—fÙ_µ*D÷æ=Òì/èϾM7ßÅᙌŠ0{'|öƒ—¦Þf†xiqO èp­[†¶Áµlõ8›Éwq–ï^7“?ÑþBá[>Ë™¿O Žî*Ç“Bv€H ´´ŒŽ@²Y}”ÕRâ43ñøéMo!°ÑcÚ¯"àÍíwK´R«Ï€ì#èïå HÄñ*†»=’Dä%Ô BÊýõÉûl¹Žióàoa…2â9`Á“ th›¾z7§|y=ÒÖì|ðl Ÿà½d50¶éû¸^Ž·± Lç‘BÜBiÃN8›—€Oç¥{±ÉaÀíUb@Ìñ$üvßÖ¢V@ $@ ´0hiŒE a±›PVA¼[Mxïðp稜ðY4¿"àºá%ðôW_&dƒF3^ÉOTÞfû5tàn4³^3Ê)ðFä*ý-ò)ò ¢@ $@ – Ãý‘ؼ‚xüÑÑé|™ùÍÙ{{`G pÞ­ *(EO@NÚìÙÊû†7Þ¤´v„O:CŠ,;hkᘠô­BKK°$Ðô`Ýìf×_ ç혮Æü-?>ó R©Û=^%oÛ$@=^hiö‘Š „¢Nº±:"ê,­¶' œ2™î+Çû*)ÝwÝÆzŸ#à|²ÙÅ™1Ùæ‘C$¹+DQ/«´*;iõ¤>åÌ>ŠÁR=h 88zö·ÁÏÔR©x‡N ¿…m±y®’û5`ß™yf¿”Nõô7ðb¼g|^И°ÝÒwˆwÁ^û§u€ðÔÅsÁð[¼À8ò})žÍ†+†§` [Ú.ðár^4#z.'LÛ$ñ²I“N,ΪÞ÷ªø•sâ—7fBÂö |Z hh¶áxAôqàÓZô‰3_… C@_¼Ép€†°Âùæš:œaôwXy¦åÍ't^º¹¦]¼éô˜k—…›Ÿ³kÞçí¦NçYøaÁ@½:=F+þ³‚úçÂÊñmÖM(ž×ÿ'!}·¤ O#¬íyë»ÞÊá%iýǦ‡ªŠ¡ r@«ñ¢Æïó=ðÞôâ:˜¶\á‹TUÅIlx èO;3¹$6Ú›˜€hÀ1Aà`ãðWbF|ü%­øSãÉPdäm|ð¾ŒÄ‹ÅßÓÁÈs€ Zê:`µQm…•?Á´q@oÍÄ^8{Ó x˜êyK;^ä>¤ÿ%8#€ Ç<óG——ïyÞ›­ªçDU!ðÀ Lg³s'ÓH4€käàA¡‚†×O©—ñ&×Ú-•[ë»ÔìôóUZø»ÎHµƒ‰¤ðg}‹zþ¬3˜€ó|öŸù펷&ê$öMž#6#¤/ØŸ¨V÷ñ‘ßñܳvâ*YÞ‡ eò‡Ásv™”Ÿó*˜vÁJ ˜OaââÉò³³ÏìŠ`"| ðH UP ,žÁàžœ©ÜäëŸÄ×µJ’ñ÷¦Ov“ž“@AÔÓÄ)U4€À×Ã.©î'PžÑ<îp7Æ‹·)õž„{ SVî$$T¹8·qžŒ¬ÎÁV ˆÀy¤šw¨š5ò€í€…ÐM¯<ðÊpI¦wtÕ3{ã—xq›·Q^]øyÑÀÂq˜ù³’‹·> stream xœí[“%¹qßïó)ú”è9 d&n~3%Z±2±äŒ#d‡"˽Ó3{_™ú¶ ?qßõ ê‚ü'ÎéêÞî¥H‘$÷ (~¸d¢è¯îÜÅÓkÿlÿòÁÛ_½øêN•å·Ät wB¹þoô©\bj:ïü†òÝßñâ×/ÜEJ¾Sÿ{÷ß§©ÿ§–›/Üþ³=þûoï~þº–êåλ‹£»××2J)Ñõzù;¡x—²¿„|÷ú틟þêo^ÿîE-E˜›Òë_üôý–.hKù¼¥Äúz$²&}ד\¬E®Iõ|QªÚšô¦%Ñ%E¿)Ý™”×Â3IÔ% 5°ÙÖ¢3y½â6Ûoí«|vFiò¸-Ÿó.­I_،߶$¾°ó¼ÿ©}ã?šªe•¶6wÄåz›Ûwþ»–’.ä(oEý¬çË™X ‰ˆ¯7Ÿm«Éûmøòñ6ߨ¤-cô|½ê_ÚýÂö¼ï¬Ö×½ôâ|ºô¡íŸ?é)â\Ùòý¢—^GQä5éUOJDqCÿÛÈÿ­%mã1ìÃ1,#yޱN 2Ç9@¯n\¶—[Çc…²n‚1é#›q}ß"ÞoZÿÛjM2~c“––‹Ë>nI÷F—ìåz鿵5ýÌVk¢5©ü$ã6ã·¦ZŸžj­¯ÛÌë€ ‘]½‹ÆëI“æú¬WÞ9Oþêûœ#¶æ â…D¢%ÓVQîJ)Ò>ê/×Yù>¼Jg¬Õ6R³÷Q'¥?Hë™3𤅨c2>eí_R¬FI_zjÆIÅË6éÛë¼Eî¯dÔUqÇZ³U¸Ø¤ ù?-­õ^%Ò¦ô¾m›OºG `"MZp| Y­wl&—Œ¿x}÷ëþ®ýÓìÑíßÎÚ uÎâ·Ù ¡®›uÍsù» z×’à|–±F¹¾ GµzËEÄç à?´¤Ú³ƒ„-éûž1gÞ×êe±,—,âHkŽ6±£FZë­Äg6éÛÞž,´ƒ˜<ñ›nTcËÓÐLk+¥ú3ßÅTQŽVêæR[i1L’š„çZ‘m©µþk¯`ªI¤Ròek¸lYŸöµŽ‰ÇÑ…»š ä÷·ÿÈ–4)|’ñ;|Þ¤š“Â'¯üvé>®æÜ­Æ÷OUá{Ûî“JLÚaR¯7«V5ŸƒNª½G-ÉÕ]tkWy飯ý"Öy½\’Œ6GÉLiD³ø »ñþÑ57â+«õMúÈf¦Ôím~n+ñÙÕ4=D'MŠÿÀVâ [ÕÏ»V‘©t½°•Ã…ªƒî-jÈ7©h´µ:×Z“f¶,±IÅ&­s‹žnT‚OUõ}Û6“ž;éòoûìK©\ÇÏm%&=bÒy'Z“Jœë$ߨ1²üýõ6&£t²¢œsnÞµ'Ã$ãÜZ‰}NвÙÇSë¤'Åyj¢› ïí ™ ‡IÆI¿¸îïŒ'#wBh’4霿µÅ_·ûŸË~xô"3€“Œ»áq|±œ´ê9z2Oêu݈¹Ç~˜L2ŸÚŒÿïz¸iN¬€sN÷_Üb>é_ô'ŽÞôµÉüÞµu²Ò=z¼œ#4yízHš´Äíyïúìõ Sd°}n˜Qƒísm¶ð_JH—ö%ç%ûKŽc[=|ßž®Øÿàûö“A÷þIO HåÆ¾à¤æ?t×Þd|é…ª“Þú„£ÕItŸàS ôKlÉgI¶Ik˜výüÞ„IkýþT3_}Vfw£Ö¯1Ûdƒî½®3nмcKz×&M2NªðÍ•ÕI÷¿µ¿gç –5t£ŸÛÚOêe¿î3Ññ…ˆœ¯C‹Ç/D“Ï ïÚq:/zL˜Ìþœ7ö£‡×ý£ê'žèd7ýœ}6Ù{žlüŸ+k²i=yíG¯[3½}û¤7l¾g»Ú;f=›PÝò Ó˵M ½Z^_Ǥk›@÷}r;Wú$iòåäÑ@þpŠ·Å»SI“²~µÚ<×çßÚŒ“wÎ;÷íÿÉ:·ø]·7ïùÒüž[®¿òý׉ֹzµ×"Kîݘ˜Tâ_¯¶Ä=“Õdóõš•£ÇݣîOÛ÷|Œº ë5 'Àq{swQ3Y·É&M2^ ¨Ð­óƒßèÄʪ˚ Éè›Ì–çöŽ&b2Åc;éM“Æ™´ÄdxÜ^pîÛb~)ÕYyü²±õ-îI¨ÝÄ.ŸXá=VE§-3ðië.ÒΕö*-ÊÖß}ö‚$”;q¹¦§»·/Ruå¶_oú¯Â¡ÿ__ 7/>þÛt÷ë#þ±þ÷wÏö˜W/ŠkG_ÎíŦlv}]ÚòÏû€W/| Š>Š79l™"Þü<ÔÇâ–xÞÔˆA·f€ârtæç¡¬ ë/ð¬xõ‚\̺|È¢ lßÁT{m G'ÕöÑðì©/"y|‚Íb …§ ÃxËø"ÏþW/¸pRʼniÐè?ONPØòÏû€W:ÊÐöÔ–°À;ï/¥„nÕŒDßõµZTsf‰ \öתSOá8CðQO~wRO uArÛ*à'iy’Öm wa<•q=j» ö3ï­™c8Žsþ‰^_’^Ê¥r|÷’.‰Â"9û:aRM™¤-ʵ|]íN/ýe}ίºnNƒŠç€ç|²¦‰;NZ|>Ñûh¢÷mO£à¼ÞK†´†™Þ—½›¤½éi>§ã± ~³güÓÒ^á’jg¯íEÕ #'5r“4ºBæèlÕ~Ã݇aÖä_O:ï÷'Κ蛵¼| ñÁÉ.1ËûÝ$ïדvéijÈ-F×™£üïÊöë Ø+0u-?]UÐ:Û?OÑuŠôuÞ8J^­CÃÚ)Óìš0d‹ì¦Ã³?äásý$¼yɵ-SÛŸ_æzÝjgñC…ÞNjhÞADf C]ho»åAOÓ~¡}ÅÛ®·_¬_ËÔѼE ~–0dÑ…ööûQô4í——CCûñõöK!è×2u4o‘•Ó¶üÔu½ížý!OÒnäÒE5›\Ÿ£}bõFÕ~/ªFk‚µ¤1aÈ¢ í3öò §i¾:lu·‹×Û³Ó¯eêhÞB²àÏA]ØÛîÙò4íV‡«j¶t½ÙB×o¬TÞ8f=aÈ0×›ìYð$ÍÅm”ªÕ!_o¯TÒø:¦~æ pGgM²ŒEö6{ö‡[áOÓrí®7º§é®»í#ÆøvPax@‚?屨ÞtÏVø“48¹È}½nñ"nìйPnƒíÿ²E÷×=­çÙÓúŸÛž–´ iÚfã_·ÿ`ù_–R â»—|qå^.c™â2{çÊ*ÄèβŸýÉ„Ëç½Y:ËŠž‰U]ÝS¾Q¿«ÛÂóå¢<ft˜¤a O¬ýó5aÈ0×—Œg}ÀÓ,T.|Ϫq}駱[cß^uˆŽoMÝÆ€Ÿ£ ¡yÏþWmùŽã×3=á(r?GS)ê—xÞ<Í:i×jJ¡¶ùxßòÿ×ùìO3Ÿí&k míN+<µMp••?ÍêǶž‹Õ£í„eæäk³ÝynQìË P3 oö„œhýàDYÌÏC]Øæ€s#ÿÊM×âS}Ç»êÔ]r_ þa_ öÛ“×K‚ÛM*X,\ˆÈ©ë³8¶µVZšp¹Äp§N6i»ki|â{¦øYÆë_¹E¦øèâbÙÝÞì ‰ÖiqpøóP‹ësý³>à‰–}is¼/mû£Á^ÏL%òA'›ÞGÐnžÜ†Ç·; }PQ—õ-k‰ùεO0CîäB¹Ús¼\b²FË‹»RöxVl¬ëP«Þ¤sÞ]ï`®öU_Ê:Ò)”÷šðfK Š^ }“pdQE®{aÏý§ÙÑi_ë´Üvc÷ëÞ¼ãõ ë DÊûuªïY¥w,Ðw-•÷îö’aT® oì0…aØêcqð®<é°Ïþâÿ†ýäÇÇûòƒ‡ýŒ#ð_ÞØÀûÏC},nè`Ïõ€§é`>/,n·ÿýyw°k»ÏOÕç¼ís“òowCj×ë,fàâYúÃþóÍú3'¿yÊ®˜Ÿ»²*ê[”äãnQÒŸÆ¢ôµ(goÄ«ù,ËHL{,ô²Ã°%¼Ù¤lM–¿qcö,Pè ñc<èi>·=|}˜'5 ½x2 6 e}gËÚ¦‚Œ«aTšLG“>ä$“ã“מ¶ñ!çõ¥fC¶B}k±o Ñv“pt ]¨êpÏû 'ípíO5ýt¸s×LŸìp“Â×ᢇ~°SÞv“=ôƒ=aèpÏû 'ípÕ‡.î†ÍíwËŠ™v8 ËÇr»Cë–ݯR6b›C뫉¹º¼Ž{Âîò.ÁÏäBÔ>ðše=·äóå0‰j1Þûž·p¼hæ-ØFeY£2-ÏÚVb­¾…ÊfMs;ÅEžÒf­ÇRÕ9oûù¾×5ÑîêÛ×£¸ïÿµ”¥W—è·"¤, Û¾‘ʰfu•²…f9i#…¶ZR «Ï¿~ZÉyx J\Jy–[‡ÚVKŠ-Çþ ­¼F¦ª#ûöȰP™µ‘J;w¬áºÑAõ:¿Ú<÷Ô2HÚkÙ¶ÔüÞORXª%0ƒ¬¶z®潦®/c|­5“ëÍïÃ^×rª¦R™®5¥ ,¸½‹ÇÚžpiíêkÏÛNs›ÏjµÓÑ3׈׮%±O©aû¼ÔnŠõ­óè‹ÇP)Ûî‘_bBç°uqî•+[å ËZÛåøâ|­mëÄ…k»Ã« ^Ñbñ½z~{²Îr­¾nì5µ¶-Æ—›u ʪu]º.a]…h¯kmȰñç*hù8ìD7êÙnÄëÚ<ãe‹Â²õœîGRÃkSÏšpL“™öjö­B“°gQEû‘Ïú§ÜäÚU˜þ´û‘ËÛ­oÿÖ¶ÏšÀ®DÕ>&ahÁ±ÈÊs>ä‰"s¥™R\ç‚,ã_¬Ͱ:üeóÒ'WMŒ«IÒÄHšØ:¶?³Ýàg‡ #q±2i·,$ÐÐO4÷=÷Agù+·Z§OgƒN[´G n{l‡œ³y[%yˆ QòÅöÒ¾è:ðŸ thùz4èÔ–2:ɃN[ò”†$%g,¡òåÞkyúF¹ÏëàpñÑpñ¸x6\<ï‹wŠK5fµ¼}í常 ¸81\ç —Ô|èÔB.¾d:±€FHJ.X³’“¹¹Ô ¹øœ5—ÅtEè@G‹ÏA‡4<)¹Ó\|Ê#ŸRy%È¥Z¼šK5ž‹O¸$g¸Ä\b.1*.1` ¢¸D.Ñ+.íó” p Ùp ¸„`¸.K Å%xàÒþ†÷ — \$).««4¸.BÀE¼á"¸p.œ—öw µ<(.Õh9).ì vÀ…ŠáB¸P4\ª×:\ˆ"àÒ6Ýy3j”¼ýaÊQž —ÚÉt*K£ÃÀ¥ÖËèxàâ pqYqq JpQqq¸8V\.ÎçK)KIH¥D ¥ͤˆ~ÑšIñ#’â4‘\F 9#5ŽF #3²¨V˜ÖpšD;ÑuH“šüyA¤¨9$1$F ‰4„ä‘AršAÌÈ &Í FÍ †qXTÿSKi$½&ÝH ýìý÷î¤o)›¸þnwb{¥Áµ÷)ÍÝ>48kàP#®Þ÷ö; Ôƒ·°†íwÉ ![dÛöûp‹·ª²¹ç‡F(Zãh¿-%³Ö(4‚KªÁ¨GÛjT¨‚ÖˆÈ%dÍ%äR+¶Û¤¹ì‡FÐ\j‡„z´.«42rINsI¹$Ò\#—:ø´FD.uðjŒ\RÑ\êôõhˆÒ`äÒ&!¥KNšKÎÈ¥N…J£N• Q¼æR¹Ñ\J@.%j.%!—=t«ÿ¦¶h(jÚ+.Õö.T×&­pY¾Ñ(\Ú§~¥AäPƒ—ê[¢µF̨‘5—fdi vš {äRm9­!È¥ZƒZ#î\¢KíwÙÖ‘²ÿZ¤ý;É!_v{•ƲK9h,Û°J#­Q'åãs'Ÿ“òò9e̯ü|ÎàèsOŸ³qõ9ƒ¯ÏÙ8ûÜ¿­Œ:ÆÝç¬ü}.àïsQþ>ð÷¹(Ÿ øû\Àßçbü}.àï‹3þ¾8ð÷Å_œò÷Å¿/NùûâæWþ¾8ð÷Ń¿/ÞøûâÁßoü}ñàï‹7þ¾xåï‹_HùûBàï )ùã,Zþ¾ñ÷…Àß2þ¾0øûÂÆßVþ¾°2'Þ aßÝ“dÝ4ÝXŒèÁö[•¬Þ¬yÔI:‘ŒNp Ã ëC[ÌÛžàÙè8¯u|.¨ãSc§vOÚ6s÷„c¿wO"hxìïIÛÆò–àŽ½ç=iÛžÞ¢áåðrbx9^Ž /ç4¯Å+Ö:‹ç¬uòZ¶}˜ù}ïÀ›Ìõ“¤?ž²´&Ýì†y|{Á™€Ÿô¡s¶é©~|ΗØÖ^¾9ÖÞm5NM9“÷~B;ú¡?_»ç¾Yì\ÝÏ­f“µÒú’×;IÛ°‘´w’I÷¬Ï7¬ªÛ&ÔdÆ9Õ„“úÿë#'ùÉ,qÎÜXŒÄíΟ%ÎF¶CØë?[BßÕêÕƒNºV:Ëi‘z£F»óg·;´¼…†ò:®ä"JÞ£•FPtzû¨Óïütú?Z'yÐi”J£…ÜrÆZÈþ o!ý£|9vÈû?Z£t¢áÒïüuØpYϳ :¸´;y»óGÉÛ?£<—ålÞ Ã¥ßù3êxÃ¥ßùsè¬wþŒ:ë?£N, ’’ –À¬ääAîF.ë?J£ßù3ê$ä²Þù3êrYïüuH@Ó’;Íe¹óg·;´<Š’ä²Þù3êrYïüuœá²¿=tÚ?Z#*.íÎ-Å¥Ýù£å^qéwþ(~çÏ ÓïüÑ: ¸ô;´Ž—vçÖ Å¥Ýù£äíΟAÞîüÑò¤¸ô;´†—~çÖ!àÒïüÑ:¸´;”F»óg”G(¡Ýù3ʸ,!™ƒÜ.k`硳Ž:k€è  —5ÐtÐ಄ªr.K¨ë!_BaGù*;È“á²Ü:b¸¬»ƒ.kð¡ã pYBˆy‚–äA€ËÂ<ÈÉpY¡‡\Öxê]e ¹5Àx(A3)¢_t ûå~D²Ò%¦|—æŒ<Ö¸ôC# 5ºýÐ`d±ÆÈN“XbìwiR“ÿ"O#ˆ%„”ʈ!1RXO ¬g võ8 ±žX84¢f°œx8¤¢ ,ç%©×¢ ¬7=ìòí7íoiK[,DðÎ I—y„yo)Ùk à‹àñÎŽ°Ý½ýµF ¨‘ôí"¡àÑ‘ªG<ÚoKÙ.CÞ~o—hAß.#ÞÙûF‡Æñw•¶”’•FòÈ%‘æ’¹$Ñ\R@.)i.)#—T4—ìKöšKfä’Esɹ䨹äŒ\rÑ\ŠC.Åk.…KÍ¥äR¢æRr)Yqaç€ ;OZƒ€ ;V\ê¢ZP#z­‘5rи°wŠ {ò¨Á¬5$ FHZ#öYqa_€ “S\˜üÎ¥ƒ0mã©ÅŠl¿úl–Fi]•t±€ù­¢4–€–Ac‰yQKXÌ¡Ñ#gFZ3È9j©äQ–&¥Y´´_u¼Ë{äШу‹%þHi,!JƒFˆ¨Ë(Ï^KËØþ-†j”¶«AJºý»50ȶô4¶;4|)Uši£4(‚œ³’òHJžä9B ‚ð=ünÐé!zZ‡ta4“Si$òÌJ^  Fä-XQËY3ñ=äQë„:±ø^9êÃ¥i-ˆSËIqiA Z—Dªå ¸ôPT¥ÓÃUÒªu¸ôÐX­#ŠK ®Õò¤¸´à\-/ŠK îUòþ;j°áÒÈG`¸ôpäQ'.-¨yÐhAÏJÞ‚¢G9—T=ÊpéaÙ£F2\zx÷ ÓCÀ•NuÈpI¬¸´`t-ŠK f×ò¬¸´`x%ϸôz­ÃÀ¥‡æk\zˆ¿ÖÉŠK;$ äíÁ o‡ ´œ—vHAËpéG´N.ýÈĨCýXÅ¡Cýè…Ö¡¢4ă<°’GÌŸ’’gÍ…¼Ó\¨AÑ:@‡‘ õã.£ND.mkViäò2r¡v(GÉÛ¡QÎrÑ\¨ Ò:ÉN6\ú1¤A§UR:ìfࢸpÀüQqá\¸q†‹xà"d¸ †‹DÅEp‘¬¸\‚W\—0ØrK±¡"P ÉP ¨„b¨D§¨D*‘•(˜?(*1•˜J,†Jr@%yC%PIb¨¤ ¨¤TRRTR*Ù)*Ù•L0Z2.9—þ·çµN.9.¹(.Å—BŠKaÈ_Dq)¸”\J6\JÑ\ª?‰\Ú_8F.Õ¥"ÈcVòì@^F.ÕwÔ\Ø{Í¥z“È¥ºtr©V¢€NB.Õ¥¹TÿQs©$+9Aþ:o)¹GÍ…)!—j¼*† ;àÂd¸0+.,À…ƒâ ¸pV\¸qÀE¼á" \D  ÀE¢á"Iq‘\‚òæ9€;_ ~Å%€C_W#àŒKÏ|úÚ~†K¯ž£që9*¿ž#8öÕQ\"¸öu¡T\"8÷Á»¯` —þ='ãàsŸ“qñ«£¤¸$pòë*®¸dpó9{Å%ƒ£Ï<}ÎÆÕç ¾>gãìWÿ ¸ãíWCq)àísQÞ>ðö¹(oŸ xû\ÀÛçb¼}qàí‹3Þ~µ{tŒ·/NyûâÀÛ§¼}qàí‹WÞ¾xðöŃ·/ÞxûÕ  c¼}ñàí‹7Þ¾òö…ÀÛRÞ~õ¹È•·/Þ~µ5!ãí×i ¸°ñö…ÁÛ_ü:GÞÐŽzª»ÚaO¸o ÷äN( cîaÏúîöÄXŸöaQé¸RP§]—®uÌý"íØ§® ëÓþ¨Ö¡ht¼€Ž¹_„ö¿¸'¤ õ¡öQë1:B cîiG@õ1Å!¯v Të´¨ è˜ûE( Ü…“yµ€/ÐqÈ‹RѼ(™ûEÚqP]Ÿ‘W; :Œ¼Ú±PÐ1÷‹Pû"©êÓ>IB}Ú7I­ ¯ö§!´Ž¹_¤ Õõ‰ÞðŠxµ[ã@§Ý,§uÌý"Ç_~ÜÄðj7Ýioxµ?ß¡tÄÜ/ÒŽ‰êúH2¼$/ÃKx ³¤Nlã§ë:õéïÆur?] ýíºN°EÉ#~½®S´þ|]'qü~-Ät<~Árúv]Nô7ìj¢’’'ò•\"ÈY”œ0–@¼ÓÁâ FˆËtƈ‹t¤€+.ް¯¸8§¹TƒdäÂ%!.Qsább:¹@L'ÓÉb:«ù¥¹pV1Õ^s W1Õ Œ W1œML'gˆéälb:9AL''ÓÉ b:9ALg5œ“’3– b:9ALg5à—hb:9BL'GÓÉb:9š˜Îög²Ab:9ª˜Îêß— b:«Û\‚Šéä`b:9@L'ÓÉb:YLL' Ätö?3®4TLguE±ÓÉ1ËŸ‚älb:«Ë \ØÄt¶¿® :&¦³ºîÀ…!¦“YÅtÖI¸Šéd‚˜N&ÓÉdb:™ ¦³š­† ALgµc 1ì!¦“½Šéd°ÓYíWàâUL'{ÓY­WàâLL';ˆé¬¦ªáâ ¦³®|ÀÅ©˜Îj·B tQ1T ¦“ŠŠé¤bb:«y 1ÐÅÄtR˜Îº$›Øô1µÇ@lzV1ÕV…²Šé¬v*ĦgÓIÙÄtV+bÓ“‰é¬V*Ħ'ÓI b:« ±éIÅtVû¸$ÓIb:)ª˜Îj—.b:ë3\"ÄtV»Ôp‰ÓYÍPàTLgµI¡„ b:«= \‚Šé¬î±á

¤69™3)krxf’tî¼ó¹ó“ªNêuê,Óä<ÕäDï£?äÔ]]¬›­ú°‹Dì‘ÒÉ‘¤g,oÞò€Úë×~e˚ܞóž©Ãä¤ùc-_mææTÔõèÆqô?›CÀ“j],ŒI þ¼ád¨?z> stream xœÕ]Ýn·¾×S R MÚì˜Ãá4@Äq·‰“8ºH‹-ɲÉòoê èõ¦÷}™\ÚoQÎr¸"÷|œ93Úu¬6´ yxxþÏááúY%j©*ÑÿÄ_ŽÎž<«ŒPÝú³±mÝTF9ÿ·•mWÛ¶Ÿsã®iªÏ/¾9µé\•ý]ýŽþèáºZ÷ÿ­A§¿WŸz¨ÒTRÔBU‡<Œ®ë¬xÉJY+[µNÖ«Ï>üò£ÃNJѺŸtx|ðá½~¨©¥âÈ“~Äúã)c†¡WaHXr: ë¬ñÓ†¡³~HÕ­•qREFŽàN›CJ0 ËÐNIYFœ.»Oòˆ3 l× )Úaè‚.|ÙéZ ©#ø‡ôÄoêÏè¤Hs¡tW¦9=óÍ~¤­•P.‚úSXçœÒfkH)]&¥8_dŸ»<Í :Z©Ë¨?¥½ ’÷ŠÎz wB6M=e!•Ï?„#D×Ý Ð½Y= }†Z¥ldý]Jä¿öCQ›:6kMNÕÑz“`Rul­n¶¤ºçK<Ü žéËIÐ…Ãy;#eœõ¾ Ck ›Z8iãЃ@tã¤)C¿O1}Dѳò`á]ø’ õE­gKÉ<(\cµÈ´+ˆ¨-r= È !•,ž‡Ç±a]c¤Q³¸?˜hãTDT‡I­U­¯Ë¼¸\w\äNŠUÔT'¥Í‡Rè³fíy!ZslÉÂ]b¿RÖ%Þ&®¤êƒ“þ(Ê^M‡nP©“”å²°0GE\úšˆpG‡ÞS”üm™’Ïú:(DgUœtÒæ4LÒV5[! `º¡¦³nP×Rrë°úæ@VýOÆß¸1¨÷Ñ.qz1m¼ßô>O¸Ú†´ ޤÒeÛ;m3ïmjc¤‹ ü¢ê¼73{µðˆÎ:£³¬aG!ôÆï¿³œÓ›èàd˜eu[Æ@Dg÷CÒÔÊ5®¼ðIØÐ#²èª©õL-#ñý‡aš6j#3‡Ø:*‘Þã˜M0uû”.ˆP¾¤H|ÿQˆ”—•Q&CÖ¹Z®Eè‹àpõæ¬C'…p4zÞ¸Û$Í"Š|è¬<˽™h/Ó²ÛŠÜúsuåOè,€jŒg­´?ƒI‹CÇt!žÑìÁ£0Kù¨º-Ó ÀôŠC—“xÈŸ‘RF·]yÃ'”6€ÙOé,À pÄU/èyö™£ `¼À :ë~ر3—YÏã"^)ƒbü¨¤)ot^xnS&êiá<9Z€6IÚØLJWº#   OϪ<ÁàöàŒ1iRrc¼/(@.º€ôz•¥7•ÞŽß?Ð ÝÄ…ÓYÿ ³¬²¨NúŸÁü+«º8«¦³ÀÂÃm¿¨Åó@ºxL,¯Êa¥ê²†µ2Fù¤Rùp^×®dúÞ²¼ÎC–¤ðüÉpÐÖÈnD—‹va¼3BíÑSÅâٓž–¢@£2@°ψ£þ~ÂHÏ `ÎkžPr-¶÷#Ðä)ËÜŽØCÖ$z<«±ÒmeDiSJ¡•˜0À¿²m†9œôtóBØDp@^ ¯¼rµ sRCyŽ`Ô{$UŸ[ÆJ¸1bBGRÈPÿ,9àüÔ<‹S*Pæ ëÁ'»Ú»“j¥„ª»à•Ùy÷”·]\·ùÕâÌØrž¸yÚeÈÍ£Ä,¹¼.~yIJãž_=Œg’yœ]\¾ PÌÉûÇù_ªñäÇ~C#¤Y©Óı÷›¾ó*H¿ÎîƒñÄžÒùç2(‚hb?ßPûY®)*;!»‘ƒíã"‹^>MÄBà6……`R²á<æó oè©g(¬w¾i’„¯È+?Ebç”`a©>tã®çZ¸^]ÛÎKåJvÃi>í§¸Ú½¹™b‹ÎiÕ–‡nÑ¡;,X·)ý¾ £­Þ40X ¥“B^XÂKïŸ"_kU›%V ”ƒ© Ƹ‘bº#_¶éÂrDžê6ÕÚÁ¢uÖˆ‘óËQ¾£šˆTmvÉlÀF``@Ü0èp«Tk˨ÖAï´Šz§´®eçCx-½«(±Ô€”Pm֘ϒuë&UŸçÏaÄ zÔtÇWAÓu^IÀ¢{t7@ôÐÃ#<ù-s¾ì÷2paÓ³’ÊÔ”‰õ»IÍÓÊåÂXêLȇSºŒÜŒëàX!¯+¤ÔÀ0I ªÿc¡Ê+§,.x.n:)„ó°vž¢õc‘‚ó[@€uåUvip¿¦ú t/†0Vª¢Þ¦œx…o©¯£=¯N:’º÷4ì¹ ÉÃkVÓ¿è6ÏìñZ“€C<J$æ]ãòòSVi>Ý1¹eªìy21ä6MëÍ‚Kr›Ï¨NÞ¦†4‹’j$ONvYÚ¤à•pGÒ¹ñyEcÀ[@‰òåéaʼIùN2Ý×90p5íI,Ï)€ Àâ5/¾¸(Wâ'ªÝÀ¯.Žä€eú‰e1Hðºæ^ «\€º/Ìbÿë,É™]kšUÈœPm@hpÆ=W-÷\Áš—u°ú¡ÓY<›3<EùßlãË»Wൂ"\ñ‚Û›ãÍ÷bf—rš¾îÒ%>zFÓ’Ktž÷ø€•þðò­x· ä Þƒw÷ʳ'¥.´™Ì»ÒÙ†›ç‰@@ ¸È»pXÜd ž; µå´i}èv%â4îˆ1gRðà‡ ´vZD$~ ÇŽi¦Ò*îøÅ ”›ïÐY·(ª´ßœ u7¬“âòk#t@ÁÏ)¦áZ.÷’n)–ÊhÛ&WA^ ”eÀå"¯ ظð.G ¼°¸jb>¡Àk& r#Y ¿ó •±M-Z9Þöɹil¼4æÀ ¼›¾Fæ)ß‹ˆ‹UÌKŠg²šg(xýàb XPÒì}T²•µíe\‰ø–ŸT2vYºâ5ÍðÞ¸pŽ—‘][ü8vqç/7ã½ã{/’§UÉptiU§TÏ7…w¹xm&W,&¡ÏÌs ãa3X¸ËÇ«³$'ÍbÈZψٞõ.%}™ã·';|áÁz øîUŸGÒY²…ýìUã’š¯LÓO´IüP÷z¶ôf{òbd—wK€h€á‹_ñ:ÛÁ¼M^g.îÓ9K^g›€y¥¡Ù…þÅ‘ï>Äwv"²¸)›wý ²þò;™‰"(Õ€!^& ´£Üg“žqVŸÍÄöx¹ 2ò‘~ÿÙ}è‹‹˜¼—'¼—zW5$`Á± ÅœÜZ®³»õWm©ê_²ú›ÿóØÿytà‹ªŒ®ÿÂØóƒÆKmüt¶þÔhÕ„OƨnûãåÜ ÐÙÁ·Œ/ðR¢jׯuâW/¹® ß½d»Ú¸þ{l}T¾þò¥ß…sößß•o”åD'Sšå³Ž1Z'7_kvF¾¢³Ž‡!%›,óÍgUÖtÖÍA.|ÔÙl!áD—†ùŽ/ ^Ô•[l÷žæHœRð€^àŒ/éŽ5=öC kM‰•óâÙ˜þzfý¥Ç×™·(3_³P=¡H<¥ µQY¹  ½æ°©mkÕȾÓÅeT—F€Àˆ^ÅZTâ<ØÅÖ©<›DÐhÉÑRI”¬ä¡ ~ÒIуâÖ×`¦HÜ H¼Ä9¦³^<™¢e"i9°€áP‚j‰C+ïó|â«6:ðTäÙ:p€˜!Î àm{Nž²äâc Ȱ’À@ñðú#…†û' +_«Îj—ú¼_ â¾~z£ IóñœBù9@Ib©£õÆ+I)µ¾½Šn ¾³ƒZõ¡pv×ýNC€×»GB‰Fáº%XÙÑ!UŽ!X–9V<`5tH,ÅK³Pôö ÿ£’§Ö~Þ†“À‹çXG$g|Çy’3›#WPƒ¨¼@€ôv‡´•^mŒG‰Åa'¯Rd‚çÙxOîA¼Ê ïFB²<èRX/\éVÕý´ýT—xÈÄžãgçYePÎÿ$œÝ«’nÒkªµ… ÿH V²RB6¡SÉŠvóé,|²ý—u¬{‘„6äãfnˆ×©dºR§RÛxÂUÊGf´Q)¤Ro Hîò…¯è¬ã‚JMr8Še í¦`ÉK29ôe0 i `²¬88öKzlPwÎ%â¬:Q Ý2º™®-ÇoQX%¿=‰DÉoƒÎŒ‰]68yÙººmT÷j¡åñ-àI©ë v¸¤j¨ P-5ö,af©§&§P9ª@0‚WpÒ«œ·È+o·ûÑÃ÷ÁŒ ŒqFü9IRÙ3_Xj É‡f4ÐL^|J‰LHܦDøcJ žp–ª„“°î n0©†[Ôt—’Y¼ YHýÏÿE\¬endstream endobj 44 0 obj 3933 endobj 54 0 obj <> stream xœí]ݒݸ®½í§8W»“ì¶,RE¥*›I¶*Ùlv~º²?•ª©ñ¿³¶ÛŽÇ“T^)°/3—ñM®æB‰¤ %J眞¶Ýqeʇ† @ÁׇºòPÂ_¼¸x}ñú jÙ¿•îªö ¤±ÿÕ¢ë+Ý 0÷¾hõáçן_Ô•êÍ!ùïáßáèÿY¼¦j†ÿ¨éß¼8üìÊbê ꪖ‡«ÇGß÷ºvt‰ƒT¢’úÐQµæpõââ“ÿøÑÕï/,Õ4ÐÕËO¾†Úª•2Œ¼F´žTʽuCµ¶(ýÐ#÷œVÌ=†dÕi€lä¡Gn¤Ò)&BÌ£6Rˆ<áü±û|*ÏJ€ÀëÂsµ¨;?tÍüfjª¦M@ÿ”Ïø¯Œô×(ð¼–MŸç9Ÿó§ÃHWÉZš€êŸÝsÆÈF͆¤lòìã¼ó ËgâlÞð¡ð MžôWœ¡×\òÞr¨?8ì}-Ú6ÅN—Ëç?¹U×}xî»Õ"Ýø¡/ÝP'¥Kÿgò¿ CAÛIÛQ“©:jkUÇN7íLª‡u “óúh½5) èÐ#þ Ÿo¯„P_q(ðà>4rXUµ: =vLWF¨<öûœÒgœ,ˆ^ó¿ad=-âÖë½lö ×ê¦N´Ë‰¨Îv=sÄ×µ";Ÿ²óϵJ(¹iõ½‰VFBÔi9i}•_‹øÜÃìêPª‚¦!t:D±o‚:óƒlh\±=ž’úK©­Sbm⥃s2üƒäËÛð¡{\ê_r‘y0%¥Ž{M ¸çC7¶(Rü°‹’B}æ¢×2}ÍyóÄ5Z¶3 p¾Pq¨{œ°Œ£”üâêðù…8 4ü­Äµ.„dÇó^gšCg¥Ñ»Ÿ‡èúêq»íÓ‚¡´ìšt‰)Ô¯!ndCÙ–>öfÚË»™° >Mp®ç˜^ÍÞqÔ~‹ÔFôÉnžB}ã7R)txÛ3>FÀËù@ÙDІò¬[“¹?§ý9‡YX*#;“Ÿ! á­ŸiêùÚHÑçåçí*ÓÁC/†!ëñi3y£éD¦Ÿp’òGü±QX¬~µ‡>ª—i‚~)kŸº·úíüÉpಆêØË8Ö—Ö†‡‘Mo¸P㚨Ç«LÎMp‰œ_s¨Wùò« òÎ=(­ßQfA(4!& t>9¥ž76Ì— Œ’=WÁ”ðà> %ŸX²G“—‡?ZÓþ+û+µ‡gª³ÖùÐvµuºÃ‹ ÑCž_|9¥LŸü»²Š×¶í˜èˆü@D0AXsˆÏ/^[4â`ÝBÐôCž“í^ìáý¯§ÿuxÉf·3?O%ºtž~ a‡5yí@l/á§k/$ñb¢ÂñrFÃê$âR¸ß#ÅŒ‘­F0î÷óðû86Ƶ lÕt)׿ßÕ" £?0ušÂ°ôdîç±kì–5P‰‚¤âLWA™Ž.ƒrâ×AÍåy| |%R-ŠtÌÖbŸG7l!™¬¢}_+Ú.|í¼:ž%zéÌT­dìd(7¨tÝúœ²N£è“=9EõÂm[ÚHZÔrÚ^”Œ;î×½²klìŽþ%ÇõÈ=ØÑ©t>4½ô»O¢ñȾåÈ®ý$­Áä?ãÈr¨ßýhëÛJOÿoÜ$iªŒaï8+þ·›$ù–âò«ÖNqÕC¾f8r°Ø™lœ¨:Uë>]²¶]Ÿ2‹<ççש¦6ù¥Î å¥l] Æ†ÍÖŒãŸNž˜ž¯™&@øÆñæ! 0>àòõ”¿ð"¬‘8†üÇYL”;`òù÷ý’}æ¤iê¯8z •y¥ ¬8np‚~ZçiŠ¿åj„äþsœ~*» ´²å 8 TÌÊ+_‰üšñ¯)%šNE2¯éìãÍ •8 ·‘gŠQ¢mŽãÓdÑÉÂü…s='8Lχ$ª ¦TÌ4Yá0¦ôm-ª³˜è‚\M†P¸{P\ÿŸS¤µ°×ºä½){#øéÂÞÑ„õ•TÍ$þ âq©ÿ"AãKç£Ðí¤–á:CDK¡6E´ÖS6]:Ô)Ñ'ú»ÒÖF§©ˆéáÂ0òïCH«z¥’X1 L"„÷½)ĈÂÐ@gðÅPˆ…vaED¡cœáPLQXÕJQøˆb‚(ĈB˜ÙDü@D1AbDQ7³‰øˆb‚(DlÓ›Z 0𜠴>XwðþWYhkáS± ³è4Ò1¦"ágÒ¼Œ‘‘ŠQ4ç4¬ÆçQ²ÇßV.›¸’Hê1ˆH ¢dºßº53QðÜo«3ˆ(Wî÷ é[¢Ø¸ßucèL‡%TµªŒaÜïË8nÁ‰ÔE(ÊD#2‰uÂ陈ú. ÊlÒçýOxƒ Êf¸OÄggµ@>sÜÿÕ¬D“n(9±9.À|°ŽeI-ž_Ó~Ë™Ì>X°Ò¢5yŠ$侘"ï–ðà[¾®@ÂóTÑ ‚,ëÞ {žÝ Èrñ¯ û6™ögNÔµ–Ó6þK¾ ¿æ qåÍ¢©ja>z³ ŽvŠé(÷2¸õǺo66®[usv |#JBPipýѱƒ:ô€TîBÝ| Ü$à†ÝÏðk•…ÙC[QNÀZ©pÞ¸Õ•l§|?øÚþ´ÈÐqõ[²8yaEÓÁ¾Vl"@eA-JòF~Åq:¥IPüRVFÔ'_»³›úE /©ä( ÜÁÞ–3 «ñX P‡Ôޏ–;7–~×zK’eåû>ûÚíĨ¾Rmo·1ä$‡¨9ŒÖŸ:ÂÀ1ËÙ R{'MæêzÀ É‹öÊŽuÉ%‹³)ÐÞ"«ŸcU¸—{†Õ¬&·6,Uø‚K~ÈÆÔ¨â1܃Š| YM eoI` ²º Z ݳu›‘‚ï8¢’Šç\6´ÛÁ †¨gpý@½ßŠ+ [=¦PgwôzQ©x:8ì8Ä^ˆ@Î x–…¬e)9ÆPËõ˜íÓUBŸ,Ön ¦›ß›©¬ƒÕÛínÊë-ºé>b5uÝ-ÔU3¼êoïȹ݉¤ŸÑïøO¯ió^é§>0T¾S†—˜öcfÀ¼Æï¡—²i«f̸Æ&¡ë?;Sw ÌZøèJ,ø„ Ò°9‚‡ZCÙ‡R¢ÿ`>@ðŠŒøô 6Jàq–™XÉU¹Ì€Ô]Ö~‚-}k¨Æyµ{ÊeÕÄü… }ý8ysAÕÓ)Ï#†tM™ç0b%BýAÝ2}®;â}^ÕŽÃ7çó–¥ÅòÌEÕ&$Õ ˆ›)W„>¸”-'–@že¡peÁ1>ýœWLÌ9åNvÚ¾êuÚñôåJñƒd à_YRêŒß:3_ÔÓ­ PYâŸÌŸ. ŠaCrQ‰´–ͶìÓ=°’¹{PîÞë×¦Ö {ä©O ‚Ód÷¾°º8UB³eó‚Mg~IYr}å»\vˆJí>jV–Ù~ãøD+FS4¤êgj‹S¹}Ò:úJГ™§‹°O¹%.lPBa…éé‹®ÄÐ3Êê?¨}¥è3÷‘v}]çNSÅtôúåÓ¶9erm õxâ:_7|ëá€ÝP¯eló4ŠŠIšŽ™ªWMú±i|½ ïÅÎ:8µª“,õêƒ8Ôsp½qo¬ëF'¶ÏTÆ4:Ù=-”nº< ¯QªLÿž²qpb’GЬ¬OÛ]s®æ¨H™ÎafVºuoú>{°ò ­o(8È»á”r¼š“î;µÑöZà„&8Yö>Ð0éŸ iº†À‘Sð éÙä‰gB}CTQ×FçŽv‚!–vLò–¶{ü õß1¾ëø–ÓŒ.;|[&&@œ®²&Zà2à*XÚo8©¾û–E5oÊKhxɇŠ:mI¿å¨‚K¬…^g ƒà 50J¯‹$b·fBÃQ¦³€…a¬K·€H_~oƒ„iÒúÝT×DáòÍk-¤Î“õ©ÛœjÕ,œÙØóJ<<¸ðÂ…=iù <0¹~l—J«JÕ)MeVŒ‚fÓ$ëè¦ ¬˜%˜h0% r`v Z&÷€Ô+´ÙBßš¾}«M½ó"µœ"‡±³¸u;•v¥L)}RdÇTL±âtRwºˆÀâÜL£ÎÕØä%ÒÅp~êíù–Bk®œÐSF3ñœ@ØCó.ÁŠWd)/^Ûk–m˜÷‹–ÐUæ{Ýç~Âï³|&‹QdÅb+q”ͣʮ´Ùi”Ý›KÚìð»6;[Äô}m³#ˆýRz2à;PôbìeBÿ}è #udŒü@D0AøbDÑ6"¥ÁDD@A FéS*ü@D1AbD!Ú:Eá"Š "  #ŠºîÒ‰øˆb‚(Ä€BÝ&T„ E„ð((Ĉ¢“2¡" DD@A F­Iy"Š "  #ŠáHwB…ˆ(&ˆ€‚@Œ(DŸ.jˆ(&ˆ€‚@ (úáJÝGa`B!< 1 0Â.E&£  ݵ)a`B!< 16hndJE˜PDˆÐv…@Lí—z1¡±m§çÓ€Åî|7ÿ«°ýR?ãw k:òÚÐ~i¢"´_šˆràÅdŒ¬ˆT¸öK3Ö&A,žû­»Yû%bÒÜïÁ%‘ˆÅr¿3k¿D ’û-Ô¬ý±7î÷`+Ò·Ds2þ¶¦@¥8ˆµp¿MOpcà~·ÝŒ¢ëî÷ §)ލÊî·]†ލ©ãï¾í‰ŠH¢wbP"‘@=‹â jäiY3h5ÁŒ­´ýoÒŽê ZÚQ%J¸"¹£èM&/‘¼Ù^÷E7ʰé™ôùdŸLdn¶ÅÅíJÀý+ìE*µéÉö•HÛlçñ»H—¾?ÝxI›íÁþ§óK·ŒDÊfÖ~²Ü‰N}"a3;=Ù\`Ý¢ˆ F•HØøóXë–n$,¸Ô¡3sû–ºh©Ã•¶ÈâNµq©“E\&5oÇÅÝ*jçR7‰:=j†‡;FÔÖ¥Žq[º9=ܵ¡ö.uU¨ã1Ÿ;sN›—:‰ë Ræ^$v/u’Í?±|cwúhú|÷úhû¦veÓFìÚ••Z¿Ôç íÊéáïåþ,{ ÚrG?VN¬'M.i¹¥zRiwgÏbAˆ-:ŠJÓÊ*ÏQ^¬ µyíTËtgß+˜­]]9‡UÖۣ캕 GÁVÈüÖ[Á¦Ruÿ~žË)SG – „@¡ÛSŠêž6æÏål-­Ý4éÍŽìuà.gß:]¨IË>8û–?šSPû_x4gùÌ]Ù™ÒÓŸÎYj»¶åtÎÊÉ×3˜ý] ðÀŠîn°×¤¬Â§l€¯rwÊæªø”Mz‰û¥²¾ìzïÍ)›ÐgœºËSÞgováÞ¦ Ãö6ÿõ`é­ÜÖQvzï'bÓ9ø"mÜhÙ¶õu\ ÎòmOwµâz~bµUÞ†¶{'i׿)c±b•sVrõ¢½|?Åm°r-ö.eÝWÃY¢yºÒæf]-å‚‚1BúБexl#ºeGèÈ>t+Ý¢™)é“mEw¶þ6ôí èLI':ºc'ºË¦îÆÍäÍãY(ÓòMŸ —³ìšüœï  ½æ¶ëöúÚ¾ÔLïüü‰’T[Ù–q3›â knÓ¶¸÷ÃDd|N5.©«öîl?ãüyÎöKõ1Y„÷$ÂÈåN`ãNpOÀ]òäF“'—jªÖRpûlÖêÖ³pmi”¿`…jDY·|`ÀgØm¬ì¬Á0v°7Íz `‰=JËîÉràÎçi§|È÷hZn&|ìÅ/Ö-)À†½·å/b ¾)ˆ¼ %›Å¦–á+[fI$·i¿Ú%oV+y­-›Õbxߪ˜à¯·ùÍjÈ.æ'sÄ^¥\áÙ«ŽÍ ÒDhYOϲ¼gÙå\=h’x‚M—ÉnÙVá…wteCæ›Q_|°_½O—jÈK=…úçÃÎÌúq_Vjâʲe7ÿ•CÛqreéË:¨«Š¼õ¦–±—×·\º¼×-¡ÊTö¸%e*®Å:ÖWÙy©³‰G™Êæµ'v÷Ž ´w·’"Þ¿[Iº’[IØ ¯e—’ déŽÙÝ÷x—%° @&ËÎGdKµv«â±Bøž¯•¯l æÖÜűç*Ž›ûRYp‡èLe:Qx‡‰M1nâ¨eÓÓ—¤·g{ÕüìM‹õîáXÖÃüE'è+ùÚ—_Çܱz{NÞß[œðQ—p¬2꼟xöZ‰…8ÀÄwä=ÍŸé·24]âCÁíD¹—oßhÌ Þ¾qJßn¡‚Ø•M,T€*»¬Bû € ¼áú”ßrm,ò/ÊúÃNmÕˆÀ™Ï8Tî†àt2 ¤ ,òŽéÂzKÙòM×"ï*@\5Ä<›»ö¦;ÊJ-nã-¿;>!–)á†CS%G[Q½ß—wÞÝÛ>G´to{#¦|ïGhÙ@([6e°eßÏpÝûÖ4ñ¦ËÞWJIòFŸª!AvW¿_—½—U£î¼ìýR mIÓw•èŒýw•èÌO8®}U¤²·¢Ÿè³ˆ+޽½LOw1zcßH}+¨ìnËpd>eù3y.HÅVpowŸeÿ© ù¿%H->DA ¶©‹žÇ±A*‹Q­põ]€ú]¹» u»wrŠ µL O¤¦jhz]¤Ëe.ÚN[›?É|‚“¥?åê=ú}—¦n¸±ø}o ÂPTfE­¬¬” %ÛÊ—÷éêí ¢±ÊÈ'°ÇœØÇœ=ù*:ñ’Ýèd×éÞHE0kèå.ÔÈÑôC4¸”¦©DÓÜ”··íLær HÚ {ðl¼üt}‡–·±ü¤ÁàÛ»-eïÿÖ½•ˆîÃ8˵»†/wrs5?"À† ÔÄ‚é =°7*Ðê³6Œî9ˆ×Ë;®Òù®)Œôà:Örºð–zñ ~/!þÖœ‚P)¢8±°~ǃèDÕÞ\åÆý[°y\Hµ,Ç÷ÀÏKv3=D]´N0±|ÍçОl„ÈêÆw†ôÏì8yίlû2GÁºKÑÉüBìµî€çù niñ–tP«ÿˆÏ /+v)ë„P¬¦¼³{ãJ®ù¶lý4´:jë_õ Ç:ßñÖ±áÏß~?’¿endstream endobj 55 0 obj 6083 endobj 62 0 obj <> stream xœí]Ý’7.n÷)Î]¨~F#åŽPv¶*@Qk¯í,¬½Þµ×À#ò\ƹΠI3­éOg4gwc&Ebé´Zý/©Õ_íÚFÈ];ü“þðäÅÑÕÑÕN·Òmmú¦Ûiiý¿è]cúæÁ#£wŸ_=& 9lN†$W¯â]¸Õ ®rQ˜“ÒÎkM"Øñ®M)R¼_¥äPáŒL@§\6Ï2²[l‘€é„‡zÀij­ä‹“ÝÃ#±þö£éOµ{P¿F[²è¥=hç×M¿æÉ¶1a º I× ›¦×atZ™lõÖÖÂ&~5t9¿Æë6 ^ùÀ'¡ËZ5-ßoÃJK‘v×X­Û…®£Ô[Ùõ½óV¤¦uÐuÆqºÛ×GÁn­ï8.ÀÐiÊS%ËÄJ‹ã(íe¦©ä_W ðÅÐ%´ç§s+¸rJËZ”ZNA Å2]€ÇÞ*çÊ3‚¯øÀ¸ñõ×Üe‘.оl©+ÖY*°Ás.œ¤m²'_rA'»4«öœKpDu¬•?ø­ø±ðçrM…Få¦-ë„rtòŠã¾ ¶ìËÔãÏ‹†AgzðHúP,It΂³1bøÏœÇÛ7J*JK˜ØQîÃÚª¨NgBõ޲š$GÀÄDÜ™û3î´)¾ä]g¼ëé¤2kðkQYÍI|[5Ó9'1NnŒìUYÏ‹$Jí©Â!*uÅ-¹Ó‹ &¢•½ šÉgLè¥0]êOs*^G‹6Âî¡õšëô†KçIAó9a@†‰ïV¨®,üS.0@*àÌøs O ´'w]r‘´ª§"H #ÌÂkT«¬,^8)»ÈŠëº€ëÞð_qÕ\×\À%y­šÌŸD¬—œÔhðÆ 'ËèW ÓŒ\³ÄÞI–¥/ÓµáCŸXöõÜÆÕI¾NÌuñþ³`7E™îñßrÄ ¸N 8§ë4lº!Úô~›à÷6%P°pÜ¢R>, Ñ,z-Ü;¿àŒÔ5X^€Q?ãq°]Õ€Káe‚˾¼"BàuDÜ¥ìÿ]å5œ®˜¨mkMYª@i  ˆï`kf,ï{jBJ>ð¸'©÷ !åÞU§Ú&,ÿÄÍ[h2 b×ëqÝZ/Ðqý³Ån!ßr;¹?pË]^NˆZAÀß³œì ÂÕªNù¥îêJ–ÌjÌ]ÉÝßÄî7þÿþ€¹;?Ò½.bë‡+ØG²sóâèë¡CgZ[—Ah¿íÔ¶ë1#ˆMŠ`‚ðl“ÃŒ(z!) ±IQL Qt}K©ˆMŠb‚H(̈BËL±IQL QH›É"6)Š "¡ 0®<±ÓBë M?5/¦¦ Í[ß}³{É´FåHkLÔ¾ 0±};Uζ4«VÔH’zv²3½%s^êŠ¢à“¯ÍòdîGIüköÍ­sªošLª©ã¶JÝXo’lòj3íÒJó(˜Ç4‘ð¸G-5cyTZàa‘ki­ÚöÔ\µks{³ÁŽê-6v3 ÉvÁ2l& E>k:¹ë¬gÜO|9/‘)Cñ2,¤­öÚ¦ )*Õéd––÷X¥ßÊÓµvÌ9öiÁÎqÇéD+§OÃ@eEŸ†Àk]Úü>ÌH‹*n8úHW¯U›¾ã诧ñtvÉqE¦µiÝb#B¡õLZ…Úáél+Ë/Ö4Ð2•$x«ZSXRê±4Âïå†[`ï$cÿ™Ä«@†ó²lW#â¢(º±Òå¿\×7‘E޳kb 0?𮂎¥î|ȱ÷¡Ÿ×ñ°GÊ Ò(R¶©ó{-W†Š:í0vý+œX½[F0Õ Êϸü€9¾âP{LrÉß±”Ö‡SA”ñuÍj×òÑÀr>e\òž= š®çÓQ¹hñ%ÅLÎÏ8îrPZÖ_ Õ6ªOR9Ôj E…y nj2ßqÒïÎËI‚ØS'P`ËE§¨[ŒVxÞ²Ñ@ðÎ4˜0\!å\¿å#AæÊÖÎTQeW¯Dù¸S®Ôrè™iz‡µ¼ÆªM N€®ËBÐÌ»ÀÀpÉuìioZ'Iðûœ¯Ê¥Irñ*|`º`Í0`€Ñ·œ¬h”tw V‡°;®±&‹u­UÚ¤9 `ôeál5ž ÷£À‚x&ž „l CÉ…ìÆ=ÙOؼž#=5¯¤l²P^ÿ”Ì DBùëÈÁ¸´©X©jÑÚ4êCQËÙ{+jÉFi:£[W&âà⎴#¡÷\à^𠇺]QKŽ«dECîÆj±Â7¼œ¤èﵨeõþ¬®HxÍO ¨%ï*µä3oP›ŠZ(®§¨…:úž[H2㞪–;»†¼÷²‚qY á‘”µ¬ûÐ úèCª>Ë7¬ÞÆ—ËZz?Öï>”µpüPÖò¡¬å¥¬”²¶Á\W ,§¦øE9Ù¸êÚ—úÿ±ôåÎcûžÒåÚ¤"5É…ô 1–*Pˆ¡ÜCµ†¤&E0AÄûN 3 NТ“Ô$(fˆˆ‚¤BÙ÷óx?5/¦¦žË æV]™‡§E-©™ÝÉÏó%"óü©©É}|=I£+ -†vÛ-ª=ˆš˃ˆE9¾Ï%˜¨—„‰¼g-'¡ç•k2™¤5 ”KfÔ¶˜.'Fc9ÅÌi긭>©ÑëMÜ&7¢Ži—:Í]-w±¨y j %D¯±cVì8 ^³¹¿Ît,¸½§šå IèEïï"¼ê:¤dêR–#Ô±ìÆsnÐë’·”Ì[^î¿$Fº©pÅûEçúÍwñ ¿<èIYg{¤ ¾ú|¥JcèÜè 7ý—êTÕ¨Ðëà›í¡í¼Ô 7dº¿å•ìÊ úmïË·z}ÙÎhÔwB`§.R7„ªœLຠ?Ôüïîr¼âÊh¯ª>¡<ÛáeHÌø·êxwÝEj¹Ú‚r‚ëaFÕ–EâÀêÆµLD+ü1½>1ƒ·aFNüñ7•å—„hÓEÆJ~ý‚a/gÌèsÐs6äÎ =`Ø·=·â©cJºÊÛ“¿Ü…T—Ò¬»Žây' Ad·´€¬x¦XyÒZÀ¸ÀUÝ÷÷|`ùBoøÇ£Ô3 }Ç]ãà\80躴*¸¤~çaEgŸ…0嬒iÂ/9¥,±z²ì7ÂcîpÊÿh§Ã1Þº1 Ûs[¦·=‚´*ó?»Î°‡u9”ÖV Ô”‰"™Q´FƒŸ3Ç-ûP;©º˜}ŠäÇö0zD>ý“ŸÇá²u÷±= Ÿ~ÃÉÏãðÖôÙì±= Ÿ~ÃÉÏÃpè2Ù§v>ÿ>§?Ã{›ñžÚÓðé÷0œüœlK-ŠÁ–Rûbj+;ÛÖܪ³-ŸI7µsÛšii&!6Óœ º–†QA r÷ŠéÔÙ¶C[iGÜkjmu¯ØVØòèØoh˜=$&Ú­1y’™XaPË`Gbh¡=|šx!'ß§¨œR;Éé–¦2Ûêl:bi*Y(Ì!ÑL„­ÖÔ„’/mÐRc¦!P‰ÁPÏ"H¦™<DÀ}&½ R˜µ2¶nç<4¾pßѶÍc·Ê½'vÌî3¨÷=|;ŸAló iÀÅÒ‡HW6 õ¢©«Ïðd~Dº(æIƒˆ+!_г3ê½iš6çyéO~O²/¦þ½×ús£´^Dá{’¥ÜM~Ô?åÇWðEêq&ýÔjÚØ‚’eV­« ¾®9¿š6×`K9¥õù8Ì KÒ<–Æ“i;’d=æÒ?:¼ŒR"±óËé|l]‘†Mg{š4«Hh‚D‰å•4¨Wið¶¨ü܈å@¶¾&tƒÔ3xÎŒñ@> gcät¼×*_Å“ ù{ÊÛÅ+Ï)¡7CÀG? }ʈ—aàUL‚²B³m ®HêRy€*6P30†òëŒåßmp7'®8*pGX“n/e/y0p‡o߀Œ7ÜhÅ%Wszt%\ÓZzË5~1[µM×M·\ï=ÚÖe“7$«ÞF¯Ø ˆ¿U×ÍõwjÇB ydC´#>h§N;€;Ž<µwh@vï¢zlÓ¶Ôy$WÏ7C—k:­>‹Vüý $¨ç\„üé÷†÷Å4(=ãt‚Еb%yƒW^h¨A”Þ“rk.“cà5¶Í﬙Iºw$«2¨Ì)½bÄþ´¹~£~OÈ4}Uå®|: c`}u«7ðüÒhNiùË ”gà(5;°¾Zs# v @V@0À¹Y}_6¢ƒÊtö×C‹tÊ®µÿƒ3e×Ú_‡RU PïXÇJ¹Fõô¸ªªÖcÎwž(>屨Ty£9±üµˆ•ÓÚa¥k`Y%‚÷olûkÄê£o;ο¸íÞÂx.àš@€°·!çd‚ÀH¨9Cß6„ÒHXzóþ£‡Ð»¨tÜDW¾+pûô-†¥ <ò{áò[ya»F‡tjüËÌèóÁo"Á{åǼ«î!À®ûË  š`{H‰ˆ¼l+€¿_—è€ ßrâ  f›è÷äÔ}^¹ôz–{¬¼'µ0uÈÁߦQ§ìòü»DÕJ!Ó3.Å ÙøŒ.–[<<ú¼wÓ©endstream endobj 63 0 obj 4117 endobj 70 0 obj <> stream xœíÛ’µ±òº_qÞIv¬Ûh4©Jª“*BØ^à U®õ®/KÖ¬w½Kà·òE‡²óp“¥ ¨Yy‰ÛoŽ_d ÓÿŒ)¸P¡È"QjC·9vŽh‚õF)£L(²@®ìßvȲñYtQ0'L;üqþ DéËCë‘Éñ÷Àdà!ÀïÀá# Zv™6ùr$!þHŽ„áH¿"„#@Œ$´Le\ðåHBü= ‘~$DG€I]nS¾Iˆ¿€#!B8Àï„áH# BæºàË‘„ø{ 8"„#üHˆŽ1’ÀY® ¾Iˆ¿€#!B8Àï„áHÁ}ª¾ÓÐ}†òy*KG¶‡ö¥:÷iá3m åÜ}&¼·LD¤ ßolQIÇÀÊD…gå” ï£¿LT„¢ï3W1Š+Q1ŠkJÃ裿L„¢ï0WöïÕ!Q0ªÃ”‚<šª.w¾ÜéDÓXZM}yð•\äîÕ•µÔɦDîý\yð=<ƒHÎÉ•eÇ'8’ïpåÁrsÉ´]™38É™ 0Þ¾M0$ukÖ m&/±ÆœgF@v¶Z–>#áѰWÈ1´>æEÞå10†#èaøÊd—GŽèÄa[èô‘Ì<¢ÔFE™ ¥Û9¡Ìß—Ç úÒ»±×‡ã²½iŒŽ'o°‹{]0öá0Nv²h]£Çê‡8vl¾ÝBw]ÒDd[„Éö^gE˜eÏQÝÎ3å®¶¬(°GÂÞ÷yg•kZó¯n&²Êd棯7ɤ™‰9eKØ s¿­cZàÃqLT$<½­c‚ê¼9VùŽ æw ¨}ÚÁ>¯ÖIˆPUÂ#ÔEíÆ¡çb²mÓîÀÅŠ’SÊ}Þê»ÇO•´¦-v‡\6f!À!bI1“`áërfBl϶ª1/¨[úÐr¦âÆÆ'˜x$È£iÅŸËfl §Ý¬…¯9íÀ7ÎûÖœ Ü_J³¸“ZÇ÷ò4‹ÈB×5¾—9}ý%9Wî9 Áx*aØ •A(eú bxÆNô‹fDŠA‚°L“ÃŒ(Œè ¡QDˆ€ÀŒ(T‡ŠE„(̈B´-Dá‹E„(LxöK@†v±x‹ñ95Ju~ð€×¾ß„±ô¯TÏAÿ¡("9r‘‚Q ºä4hBö²PWÞÿË^gºàʪ—ˆ$jW-zçÎÖiø:[(‡×Ùn)¨¤)IpU¯÷$£“QÒjÂ)dWÉJÌÔö i© ·e$=WX¯"ÃlQg ·Õ-h€j×¼=f®ÊLõ+w>Еðž‘ÉU,ú 9…AþdªeÊtPÍTÏr=óIÑÆõš–û DÇ„kÛÞ3âsáãPmß´bgƒÌð¿!F?ô 3ø¤¿¦ÕÛùÞä 0üÒþJÐ3ÜÎ'hœ‰éõ.¥x—­Çå ý=ª6Þî">Ä”ž—aÙû2ùç<&¥Ù”*Øð1&á*ÍÔS\u³8™wÕHûNø÷r´‘L—ùðs‹`üŒ~Ls oDóϰ\/ð°=]’ñjb™pŒõ£OqõHÖ×HµY¤wƒâ”§ÌeØÝ«”ÚÍè1@Â.鼦,SØÛ ®º(X^Ubú¡•ñðÑ©Ý!ï>Ö¿3þÆOРÀç͈†ªXZR¼TÛ…½Mf ›^8ÉçK4¿æý'a³7e Þ\Eªô«Ø5òÕ¹ß vm'ƒ3fHp=Øõ¸J ìš°)BKnp·1þ|^YI/éï,ä\t{„) <=ቆu!Ü@›±;VM]ԗ؆ñxªø~ƒÉ"l IgüŽaþiCÿQB#d 8äÄw'¡3øæ#Œ‘@¨hMj€¹BhAåæhZür1a¦ÆnEïv3}Yc¦gX¯/1*Bƒ^cVŽÜvŽ5»‹õ'¨”ñ ¯RZ‹éc ù&A!ššÈQT½…hYö„Gè èK š“^αg¥U§ £ ;µèÚá–›6žÆ7 lž¤•‚-™·á×x‹»'˜ïS•N1+ZŒ0D˜&XVå·‰ð¸¯L…0b^DxŸªÈt)·š`„ra`LbŠIo­Œ1e\¡¾Eö†.ÇÏåêñ›# ÷Z†Šc?BÃYTó*pš¦ô]ìnܘ²%á0ÿ¥àîÜïtB“+Ôïp?î8Áô¥MeÒBþ ÞäßOþÃÅç3J~X¡M„)áE;[Pú¹1w2Êæ°Üâ),HØß-SXÈW¿~/¤-‚w“cF ‹BÏŠ<ƒP«2OH*v«…´vóÔÔôiãÃ%¿~Z[ÖqÈã ãÀ×Å©:ßß2Ø[œën1þ²Áñ¼ËvOS¶ ¾F_“ævË\äruº·zm3û´å~“]H×%F?“îÚÌ¿Kw«Ìçÿ"ݽnziÞ­œßnÛlÊ׺ÅááS3y«À¯1W‰Dƒ€"œ(6 Úä$¬zÕzû‚,ê°r$YŸý¼Äâ¹Á,%Ô9¡y[´‚mkØuK”_CÁf¿ÑMÖÉoë ¡†Ä^ jv‚ùT¶ÒG©Ü¬°ãqGÿê{ÿtÊP¤endstream endobj 71 0 obj 4882 endobj 81 0 obj <> stream xœí]Ýrž?O±Eªˆ8«ùÛÙY;¡*“ Ø*Š(JX²­ Å–-Å;ñy‹\†\ç2û3çÌžþvÕ»Ú£h¥ƒ Êjzz{º{¾îéY%"•*åŸð—ǧ‹³ÅYb„*ªŸÍÓ,1ÊùÿZ™©ÍKž½‡N'ï=_|¼©)\Òúoò{HýÚËu©.ÿ©DÇ|šüfßK•&‘"*ÙâeEaE­—L”‘©²Iîdš¹dÿtqçûû]x)Fë’iÿpqç $ei¦T ü­¤X?=eLCz]“„õ"ÒQ=ÎÏÖNJ’Js+SB(‡p§ŒmKŠ4 ÃÑNIÙ­8öÊ1‡ <.ŒRä é9x^’tª…ÔAü3:ãÕÏ(S°¹Pºè¶9ó»%%O•P.ˆz«çœÒfƒ¤”î6µ˜_pŸ[Ïæ%…VênÕ_Pƒ>§‘÷šr½¬¥BfY[zìBŸ?¯)Fˆ"Œ{PK÷«Èê†ô¨&åJÙàú‡ÔÈï—¤°³Õr̪•/Gë!ÁÄË1·:ÛˆêÒ/arÍzôNÏ\Û1éˆlæ[)×—” |EI•…M*œ´ô¤6ºqÒtKÿŠjzLÕ\@y0ð9xNÔzƲÖÙX37 .³Z´VW¢¶›Ìu\+/„T²s><5ã2#äý¢SAQ]3åV­V}Úí‹õ¸ÃNïÄZ…•ꤴmR,}×–Rå±1§Ô~©¬/J<&.¥*‹“ò(ê^MI{4ê$u¹ìØVE¬sMP¸ ¤+sŠ’ÿ_§´¹>ªDaU`: ¶yZ3i«² X0~`N¹ö¨ÀU”<ØO>^ȤüSÖ£áoœÔ—RE¯Ix¹ÿÑ%¹2¡üLÖE@ÐÙ¬ÒmÞ‚–6—l¸¬ÊuÛÅ1׃ˆ §UÈÓßÒG”tZ’|Ö¶nUQ¼¨eixNèóŽêŒ¯D3û¥©Êü6`© pÏ?›BÁªb3A© 7A |±’w2E1t:^Wc¡|iŠ_5®Ò à:§¤c:¿F-í•(6¬ zR%šö»¤v¹ÞÄ7%šbUiPY`Ž•S OÒNuOØëœZ¨ú/*«gB‘¬î ŲBEkåª %˜’6Ìñ?t Oû£Îˆ»`à«Z ëdq‘U3Në â{B®?0½@ÑA¯5åÞ Uòwƒø=<$Ç #~+í ùÌ'Ú<9]dÙú§“ê§Ì WîøOFWBXóoˆ;Y¿[Fá©ÚÅ9ïûŽpß{èëþPÎ_/©”ïj)Ѧ ­Qõà¥ôè^öWÖ o ^ ®Ñe(¨@¨òXÛÕ@,ñÀ´A¦ûŽFÜ{5WÙ¾È/«„¤âï×ñì«K#f>ûÔBW_1½®^ à_”SÞ # JR””RY–’\·¬È†@VFIb¬^š¥*°HÈøw©ñëBO{¾•'y…ØdHüi,fÞ„LY‚Ý^ÕL•þ‰Âª õ×\^%FS`ଠ쵤ßéØï!°¯u ÀLÀ@<¯·å0á¥\Pi‚ªõënn.«¥ÎÊ^v6Ïdz-’H` <ºnÀM('~J‹„Þ ­€˜ê 6×—¬Èã-8ÞäÐ ¡ !»öx·?wòHÝÖz>^'ñ2,èü‹4‘Ò)ÛF·2ygðD°eâe~^¿p4V€9òbš×ˆàåN°°«"úÓP8 àá»ñ°ß„@/‡[ŽÕž:/â‹×”ëòÐRç"µ™Úeë9eë?ï²õV²5ØHƒ.è €M¹Ùeë]¶Þeë«ÈÖof¶ò \ûnv |N ü/ xG§ûx ‡7ñž) ^) Kàƒ{‹Ãxl°a <²!¯…>h»{ÕòÍl½K໾Kà C8¼5¯U|W©Ëõ.O™À§L“¼ó¼×Œ@ ”ÇþD3à)©3OæYêÖ…y L À>ïˆ*(|yØpËr©´HµÜ½³št ‚#e£{MÀ¿ tÓæ­T´ߤA<ìÈÒ`ņ¡…—oİ%ÎKÙ¼Se¼½Ã–ëÒ- P•Ó¼#w  åulyzñÎá>¡OÕ+píhŒçUvÀ¼Èáí/ œ&šR/^iß#~ŠýØ¥OŸFâÁ¾çrgh–ÚªTÛ"Y*y}î”ÇzAèߣ²îÑ'òöÑ“à s€ ôø5Í~¿-Iíí¨fA?m–zñ&ÄÃä«Ïð཯o1g»JlF•سòŽÕ‚~SKyF9›û:·±À+‘OvX4?,â½Ìæ}Ôwˆì¾nÑ{_‰Å®›®[u;\»M¸6å ЛZ¯Ík‡Ùæú¡ž‚ðD§çx¼Læõ;x×è7´£OËn¹Ä<±öî€ÔyœÕ¯˜òWYM²Õ©¹õ-Êö¼Áɇª*°N×>[_¬¼øâ9h`\îÛ­mÒŒ¾é œb£ l^¹ºTY1ÉuØï©=¶òR=zäèϱYà­7¸åÈ{ë 21FЖæá( ñÌ ÂŸ×ñùV@ŽdÞÃÏršÀú¨,¬Þñ~p p4ˆ€°¶¤ïç|{À­ÿ‰ÃÀm°%x'Ÿd@U Øoÿ4¡íy›œÑ–}¡”÷ÉGÞµ0·ÉáÅ=¸‰:4Aät]Ê©®–l³Ü˜Ü¸ƒ°Às`ÀÛoL™M§|E=ú×ñ>[ Pft³ „ï‹ÿ£OE܆}Í ìLFŸ/>¸F÷1¯k¥> stream xœí]ëŽÝ¶FÿîSôG›´=ZÞ$Q iR mŠ&öÍÁÚëË&ë½Ù›ØÏ”Gè5~‹R")Îh†:Ô9»ŽÝœ ¢ñp8œçH™«•¨¤Z‰þïøž\\­ŒPÝðlš¶ªWFY÷ïF¶]Õ´=ÏáýN®>»8øú@T¦³+ôïÕ?XêN®­tÿ× þ÷£ç«OœTiVRTB­Žž8]×5Âë%WÊÈJ5«Öʪ¶«£çüóãuÏttrðÁqOª«Z©H9ï)[ž2&n³»;SL%÷ÊK¦üƒÙq’¾)%››1Ï Î”šÈ‚“¬ ‚íƒk4aŸÀ‚þq×XD‰»À‚±Ái§Ñˆ«®aóLëŠH\·pÂrh¥šF¥±- KÓ —sP™¸º%=&–ÝòÅr›7Ⱥ »j´vqúšÚUÆê½0n{•m쎆þÞºþPão”ès|Ø…‘X”.ïÆnï3¿yÃÀéÀaûߦQ.fFúõý’(Ê|V§ÃB· Œ‘tž¬hßµ3[Õµî·dۿ䌿£ñ§ð ¯fçÚM EaéÌ’_z­àçøð#Ù3˜¥Œ>ÝâùŽ=©é5óuj•eNøŸ¨¤kj<ÆÇY—Z#ëe†!ZfÍb1Jbâ%7&méˆü09¡ë»GbRÊ„3¾9¥š3K~JµúÃPÜ/5‰à.²ÕÔy7ÓLbtßÒñ't{L,d@,ÒUAÑtyQ¯¼RR(¡óa &HÁKºš—DÆ7Ñ0î÷zï°vÕØÕû*4L¦l½QäJEÝmYAJ-L'ܲ€À¼G¹UÄ´¬€€ Í)øÖmýṵ̈$ §{ÿm–'˜ùòmêScEÓæmµ¨>AÒ%U•©9ø&Ó­µëßë¶þ (ÆeQÉ$ Á|ÀÁÈÉÖ±Y³äœ¸}ƒ:[ÒA¯/*cÀ¡Œ˜%gû —cº ü­c3ŽOj=¥1T֞囜-{£4lIgCèµÔ#šY¹Ês{%Ù5FN¾ê@Ýù‚zŸqõv2c‰³} ä* ¦Ê½HBTãoñ~>ˆS¤Õ›E»(Ñ PIL`:Æ0Ùˆ™BÒ Ñª|d½¢!²`3ÄŠ2Wù+“nÛ«ï"$Ë"‹©ßeóuÃÆkÃ]ïWÙ©W¶×ç[ú 30…Æ™q´=nh”œâIßjfú¿ ^el¼¨ ´:ão? Éì†e*_}ŠJ7x­yCU§ž`ÌþÜ7­ÑbÆËÌFlÜãg 'ã&™@„ê¼±ˆe> ™ Þâ0ÕéKÏ QÒ·ö´ÃûÚÎà?k­ÜRÒ7çaî}uöG•f¾øÒ/Å J$lyð£3ÃÞÃoÿ ΆAc,À¥l3ìïä÷ÞÇ h̪¶RÌÀeìÉdfd–}LIeÚ3Ö7TÕkªjYà”©z]89@ÆFðÒÎhÈ‚Xºc4äF\pÀÔŒ(™µ²]U»šµî¿I¦Jñ%9”ð&_ |Wd/5„3.‚d>Ÿ;³Y† B >E–éPdø¢q3[pØ^éæ5eÄ3Î_†ž~Ý =»Q¯{¡%˜Ã¬õHŒpš7€ÖF¨"ZìhÁÄ“?ÐŒé_7 cçü¡(žø©/,Òj1ÈÔÒ—“š…qm÷耙¹¾›é{r“oÏ´!Œ™BŠk¡­Ê“Ê€¼1™æ;ÇpÞÚ‹?ƒL¦g>à@&£%þBI¹3F¸†äAÁËÛ£_ëÑâ-å×;érGÚ3z••W¦ådº£²ý©'YWGõø‹˜‘µu"Ì· îë"%CÆqM› |W9ÒaŽßû9l#Çã L…dætŽèîQÒ#š"¹ax%1ƒøfÌȨŘU¯i=ùØt?f0ËlÃõ+º 2Î@³.æH ve§&Ê ]v¤„‰ê2äü²£†óÉÌÈzB½]Ö‰—í¶L)Š;‘J½K¦Î*1ÓR—m‡eoe¶>sËä1Ñä§à¢6 tuLØ”iÀÔm&h™;³:sÚA·µBýHÑȉc@¥Ã?ïþº‚ÎGB0rÈ+äDÙb!‰9¢À1ˆÊbDŒQàèE¨N×h!‘0ŠHAäD´FZDB1rD€#‚ãU|Ò;)ÎÁt ŸžÊàñNœÀ+ „ Â<é1oHZ„Ç8ëÈ^ª†7ŨÅWD‡ ‹aéŸû Bç@Üùg#|–„•–ªp¤¨ñ¦ë=ŽfAáŸÛN!\yï ¶3ð´C|ާvtgŠ©äÞòÓÎé@vœ¤oLŧ7Ê^dÃIâ¥$’lVÅ Q\,Ž&Ž7$ úÇ]c%î’X µÖH;F\õ` KñˆË,Rí”gZÈPLâÂË ŽÊþðK¸Äe ¤À”G&®nIIlÞÕi£ípÍÎþ´ÃíŸv`¾&Ráô›ê–p>FËð)¶±Z4˜¿Î28uæ³5X!Z=Im•Ì /±ƒ®©«¬ˆÖ܃î3ÙðVA÷JO€< ™èeNÇ…[4áµy€Ç-Úbwäs ¸=4xc𼹄áÕäÊ sx ®æ†Jbð+Ïèš 0]?…=¢Q¶ƒ‚° ˜¸-ª)dº²sC¯©5·†ÐÂk‚þ}L\ ÿRK*ú#ÂĆ`\Ì rP±µûM]u¦‡óI·†¤ ö=£\\fº{mMçøØƒ×3æal/i°1kÿŠŠg›¶1\Ì^Ë@˘øb¸¶Ó1{Í0†‰ÈΪø’ ÖR"é u3Æ„còüY½ °Ú!†úϧÚmµ)p÷Gp曕÷ùΆŽ9LÁØá笑KNÆñ½¹Ò½èÇÎÈ7âŽþ広 6RÏèþšZ”Á‚³‰þŸ"‹æv†µÃ+v¸ûü\àí|­Þè ‰©§Ì.ŸÏ3Zô¦7ácáÿ¥åŒ©Í¼¡±Y°×Z÷/[\¦6¾äö]|ÉqnK»Û/é…ó3-ç–GAüY€Ö­%Rö§£Þ¡ÓQÖµXýÿ¶$…þþøÐÜFþnb6EµÍ‘ÔðÚ8N±?©óÖ*Â;yRg4SuºrC)4°ïÖ]“¢‰:|Ò“ð·kGp>î|Sh&Á] $1”a ™;ng€:àó: ÉAŒ7!­·ÆN2ˆs 3(Ã#2øfÂ2( sf`ëÛ;óClÕ"tÊ‚5Ù áo²¬¹õMà ÜDÒ®XM¸æ÷iÊu7¬æÆó.eð®2íУ}¾gh¦"0ÀÀCÊÅø‘YcîjüµÑn[¾;Fç7tg‰gLaJFH5¨ÛŒÂþ#¹3lAÐÏ#hw†­R„­Ùôæ…Áf.pVµ ¹Vt½/³ÄïhÚ0Yù66R“+u#!aY¸‰²C>àÃääBÝHHääšJÈÑ‹p‚/Ô„QDâ" Ç ¢\v ID«ð¥›cQkl‰HH"FŽ(¢ÖÈRwØ‘DŒQ„¦Ð*©z©wR$œ%W¥§2p•7±·š «<à(é1€ã’áq‚O*WÛbÔbˆ+¢Ã&„˜ÂwöA…QlßÙ+;9¹;„•nÕäî`5þ¹Ö“»ƒAPøçÞ¡ð£ìÑý2aåâsÄÊíèÎS-Ž"¬œ3dB¡ dÇIú†T” ‹³Ùp’x1‰ðÍÁ8ïˆýbp&ÀqÉ‚þq×XD‰»À‚±¢©Ém½(qÕ5 Ä#.k¸Ha9´Á˜Ä… —•=ô „¥‡Æ¸ …°r "W·¤ÇIJw…•Su?Û*÷v.^€B`_ƒ‘/Å‹ïÊìØ/ãð 'óš•yõǼ dôd,ZtÑÜC:®äÞ¢{7\è’ÿÅ{\Ÿ+?íøÙkëˤî×·ÇõýàúÙ&X€™)=eG©ê v-^,:äa|³(ñºùsw†17U108ÿ>Çåxkmœq|š¯æï3ð)Ý=ü.<> 0Ì.P´ãoù ˜©ÀÊù›" ´ 9™±Ìˆ\ë*Mãܺ¿uw+ÙãJ²éºWb목] ºôŠö=äÒøƒ 8ú¿ÿÈUüendstream endobj 90 0 obj 4497 endobj 97 0 obj <> stream xœí]é®·‘FþÞ§8p€‰=ñisëÍ™ 0^8“âXY€ÉÀuµÙÚ®,)öy§y$c~Yov“ì.v}ì®>÷êZ2lÁ†›§XU¬Evëâ *mjø“þçÖ󋳋ƒS¦Ÿ]ÓVõÁ™Îÿ·Ñm_5íóÞúþðÑã³OÏTåúîý÷ðŸpô+·«ìðψšþÿ­‡‡nx¬Ú´ª”9ܸãqô}ߨÀ—>§+ÓÚNWuw¸ñðìíÿzçÆ—g‹³vºq~ööÍa¨®jcÒÈ£a¤ñË3ÎÅ¡çaH5eºæ5΃šéÚF' 9È;ãšá€O‹¨;£u™q>í ¾”û @.ÍSZµqè1Ÿøl²•UÚ&ô÷øŠ¿g¬_p $sel_–9_ó‡ÃH[eº„ê—a^×ëCÆØ²ø¸¬Àú’úºy5_ó¡4±Ñ¶Ìú.ÐÇÜòžs¨§{¯t]çØ© ¹}þ"Œ8¥ú4ïã€Ý{QcãÐga¨5¦Iªÿòo†¡äõäŽõèÉÔuǶ±õª½¤ÅEôJ¯»\tè6Ÿ×Û;­Ôç Lüšv•êt“†î¡»N»2ö/8§÷9[ 0&>æŸ1¶î‰¤uqª˜£ÃÕU™wmÊC@\÷óJi£‹ë‘i,Ϋvf—öcˆvIŒÚÔ6fòúª¬‹yÞyQ;”«ä©ÖM>D±ï‚zÅÙШ±S&^%÷GÓø¢ÄÇÄ£6Cq2ü`¸z-z[æ*×…‰9+jÎ5‰áž]›RŒþa•’Cý>8Dߘt“Ëæn²©% %äüç¨q´’o>=Ó‡áÏP¦ÿ“Ô ¶>ôsÂëlLx­óösh•«ºï~R¤ñ?’ #xoàŸ†ôØ8;eõ¹(Z–Öê¤s±‘dsÁ'>{7×—¯åóZÆUÍŒ—-óðûÃa¨¯Œ³mšø„s Ö(FN[§ûºÌê9G« ­T·"ÔoøÄ[Êø"«-¯,ˆ”‘‰Õû|ùÄG\ª_OÆkófû[ÿï—þßûg®5¾«;å×Öžu~Nzzpö™¶Ù瑩[20€ C¹^g¿»Öê¦7y‘@|"¦ßLž€Z@Œ$†M弆øDHL¿'$˜  1’0Þ]çUÄ'Bbú=‘ Ä‘Hˆ‘„²5!Ÿ‰é÷D‚€D"A nÀ4 *=Í$æß# 2’˜!" 1’hTz"$¦ß HL‰I˜†XTz"$¦ß HL‰I¨–XTz"$¦ß HL‰HØÖÇKO3‰ù÷H‚‚Œ$fˆH‚BŒ$¼þ ‰øDHL¿'$˜  ñéÙ…'£VÏúh¦§é)®:BƧ{g>%Ú¯‘gÚžß>L‰äçH3 9ˆ"š8H"Z0á‡kBv”%\¤ÇHu²Ô0q1†XÆÃ†I„ÏCüœìdi„kšÙLCãó½rs€ ÏCðÉ!æø4>ûØar*$¼„çÁõ3$:„çÁssˆÙ¹Ã³jk!¾ÌÌ9q­ð\«‰ÓÉìë™`b˜ŠÏ—3ýÙó’+´”ƒ-Ãõ:×É)íBçËÄ;eÉ&¤4¯Ú…Ηi䨂d5»Ðù2é ‘G[’SìBçË?ÅçÅZhD· /î3ᣞ9©3Çç˯iðÙÖy*Äôœ÷2/ê¨TóL2ZAsÁ’ÍÏjœL׋ò#• &ßW™ž‰NÒÙïY^Ït¼H¹)=êì÷<£2ý¦Ð\.z¢áðxÙHž¥Ü=‘ }zzf˜ø:P¤GI€û§|ˆkô “zêå=uèJ犹>š;gÉòÖÇUŽÚ;e‰õÇ"]|å×é¾+KæYàÁv3}_)Û»²è¾ hj¥Û¾ õŒËà{NÿaÔ_cºì@4Kï×Q·iñ4>å:xÊ­ ¬ÿ9·2€‹yQY*TÞ+R™ ª,”ÆXesÖëFwºÄ`<<£Ûì&@Îç nPÀƾå¢zÉ-á6ŠŒúd9Q|ÂÑßä±9©Ÿ/S\@«`"0‡G…eçÂab.yQ¾£2'‘iQfð`9e™ÖFõ‰‰¿¾ÍÁVäLHü¸áóúë;ÃØÑÕªrÞtŽÆ^c«¿4òVÒN7‰à‡¼â<<çÁ¥“s'ºäÁ„!ºÅ½ 0ÈçÂR0õ7ô ¥Sî÷x•ÅP÷;-$û\.÷DF°ßäP¼MÏzÑ´.aÿ„£Jù¡³ª)/è¸R¢Å.(ƾYv¹þ¤ú9çZú)¥\ʨ¤Þ}@f ŒuŸs¦Ø´b¬j̾’ ‘8ý;^DÅm½¯VVHÝt}@ Àø»Y5Ïé™~‚Q"–ª…¬ßÆÛúº³ÇoÛ„>¦¡ávVr°r¢Þt-iˆ$órõÃjSPOPóÌ ï„s6#&Z†‚„ rwAhøaòÐ)Øwä¡®ªílÊC¹°ˆq…•Í}»¥³+$ñ`*ò¦m—wyTPb®ð¶o¹CÝ4˜ÓrÇå²%½ž¼#[æy¹Ë­˜>SÌѨñÒÕᨵǰ̑‹‹~Œ„iêñ*ááèTe®B–ªêÔtd¿ßæh+QÖ4!„®ò¾^Tʹn¾ä´#C­“@’*Á¶ ºÃ…YLíDÅ+!©î08B­ªò§ 9Úñ¥´Ró/·v°˜Qz£ëUzáåÄ-LÎB´èÖYµ2$ >åÔ¸±BP•ÈzPåpGÑß-æ ß.»ûjG5µÁ6šqàpäýmwá ýG4÷f6w† ”‡+Ý©e«Û§Sùˆ:f†®¤•èH*¡Ï9Ù[ÜpÊMwÔ±]ïþå'ù¤œó›œÍ =uÈ—ú“¡¸pú˺ÄLï¢û77’²v<Ô>)«v%\ñHËËaˆ€=@$ʈˆsPêùlvA,Û—«›bàîï.a:î+’°M¸RÞ§€ä òrÅ]ç*_-:ì?’âN¶ï>ùxfVëñ7“Äw »nÞž1€*œô‰¬Y‹@¸ËÕ"Í@ƒßs)+o¼A¢ß"Yn\Ð!Éíï0 &—;Vt1  `¹b¤'Ï€b¹bYgµ¹63òSú8õþ¤{µ"ˆR–^±Y?q¯¸˧ñå/º³ž²$-M‚¨&¶S>ÑØ0§²r7Zl€û•°ÔE'-à2ʼn­¸•J‡ßêÙØAî©äHž/Wr?¾}æ®õ,| ˆOÐ)¹îÑèºÞ !Û$ 0pD <•w¸ÙÈ,7l¦é|•Ò^YÁÖvUÓë´P°DT7€!>i°÷¿d "*"7ö,§öŽõ*3Ã[EÊVË›ÀÖZ9tìl¢¿¹_céWNo¢3Û›¾1ÅÙÑöªr5=æ¾ä.σµvѧ÷¨> œ¬ßYæ>UÜáSý—;Ì{ÏUvÜɇ@\—´GD¥MØïdIÓ¯å.ì}ö4q6®P^™«ÆÞVëTS¾‚&;–ãË% Èå.ÅFÕ”DÕi]TƒìPHr´Q¾r´Ñ™/5<6»Òå‹ûo¯Ë¡¦¬u×TJ;º‘eì®É'| +›íä¢,~¶$»}Íé œ±€]ÀF“w×yÚ¼À\ê%û­þL2åÖjÙsÝ‹rwøœ¯0µC깈wvlæ»áÅ’îÚªÓ5Ý!‰Î Dú(7´)r†$¦$»wsZZÙsdBíAÖÄ~mÎL®°s²ûXXv ÆÊ–Ø«lŸ!2Ù}/Éé¸zô’§/y1[Óô„;~ÒƒðxSÖéÊøWwP¤*«§ï¥¾ƒ™¾tõÇàôúÇ®v4,蹈Š@ã%×Te¯÷Y©z×_ ]†Þ“œ^ž“½É²²û\ÀWw4 j •Š•S®9^}°ñmñŽ8ÁØxÙ ‰vt»nÊl-35  ÂB‰A™žO|AãO ZŒ’9ú VéÔQÞ:8ÚØ]vóÊ_@¤+/×c’+ð"âjê’%t¾füC>ë²9wØ€‚Ò(ùÄ+ÝåSj€²"ê´Îoù„ áÿO bàì@¥;+Ú[mç®îÄ[‰éV^Ǹ®¾e„6AàÅðõ°ÄéR;ÑØz¥còØ‘Œx9ž~çüä-N(b|•©&õ€ËB²nSzd½SÎÊánõ©¬hâæº¨¢…ÊûÐ-Üx7„)̨ٕÛzj¾:¹ÛJ×,{\rp&3ä»"嬯٠Ñu襁miCT×à‚/È @ [‚WŠw~¯´ä^ý´0P?¥õ»3èà|£¼ã:Ý[&`¿ºŒö_¿1cМ‡1¬fÅï¸î/wOoõvQ•;ÛžZT°’è7öˆ¥·¾ž¬T£ÁéÈÞ³[Ù>l:w]å¢Ãp\²ª«“?( ;»,–·¹…Í7øl3|=Eëô»ºµÓÓƒñÉô]ü^›³Ýð1@60ÃgȆ¼mÈͨCë×M>Ÿ¾ߎYÄšñoY¾ãöóIºÝ¢à7Fõ QR¨[A m§ëEG'>çPçqÈ,>"‘C8®ãLDMÑï°ƒ¡g|è)LÜ䬎‰ºñPf²Æ_¾Ù .Y/wŽKÍù›.ÚÄj§úÌÇ6°OÚ„Õ›œÕ$mcÚ&—v]×to¦´ßâP†Àä÷RS…û€+Ø£ÌÆ}eë—mU_–ö]ŽÈ ¬¨¼â˾Çq’8v¾Ä­]ÿ£QæÇ\™ßˆXNñ„OÒ–9+×5µmej=ø\—IqÝk€`zÑDYˆ‚¬Y/¹uª¥IUÊXÇJZ«áo Yü5B”‰÷8¯…pÎ9àKfÀôA"¸@ŒYÑaµ¤¡£qýxµ>ù àHQëÀÒF 9à:2°N€xÈíwEvñ.GìDI d|ý+džN^ö Ž+6Ê{?j;šóþ^0÷ñ»Ì©œß O9–o²)Ó´)  {Óµš0´$øÃA‘¡¹×íÒôúKÀýõ3¡Å ð' fö|È”k¢€«áC¨¸j>¤NåËŠXòñ ÿR¦¶•sSA–©Á.Ä¡—ÜP@»Ê*ò*ó9(×ãÑE­Tc ZOš ’89‚‰ÿ'òH ¯#ŸøkQÊ…9HD žc’èeí”Wl&À&EPª‚²ã«²—nu´õÐ"­ßÌdúZ$-Àh´M€šPNü /"PôiØTÉ4r¨ÏE–'s8™Ê‚àë#.ŽÒ§€Hɺ©j¦äõ©$…6~inJ ² z3@$ \SùR¼Nn6Éz‚€"ØÉR»¬£sr0k”­l«(KŽÀs@ÀÛW&¬ç%ÀPÚ¾€·.BÀˆw¯ØVW 9‚Ø—¬m"Ó ýëîaÊø¯ß=dUáw¯¶ˆ­Y#(,;]&ìUՎͳӪ(2ô–(«ÀnЬ©ÔŸÊòYþW9#ü„]®ó˜½A'@ÅÿÂí•t±±ÖUÖ(wFów.;|¥`Y ¡¼êÎ,Àõïè’üJ„ cE»l— †dbæ˜Eéÿe:¤Èb…ºyôK¾J0ð7¦ê›:y€¬Ü™çä ÌbŸKï®*_²‚q%¸­SÜÜvKbeAë›J«€/P…½¼BÙƒþ¬Ã&“Äɵ­¬ßlB–ue›™Ýƒ¢øä  ,ÜuŸZ°­©tvaé êQÉ"°Î÷9Å÷9zÙvˆ0RçJ6%A£ @½âlúߢÔù?¢4|ò¥;YÏD™ìÁ`˜²ój€ë'Ø×íL€É>Õ®ïƒßå¬(€kŸj_·JyEµ„¯Õ®oî=h%ÈöE?ùökå۲î—Iu_ @(‚„ÊY %7Ø Ž©£ÓÃ_«üªnÝÈ*Ä•#ÞõX$ëÞ”zGë÷36[û(“ñŠáÏ?%w!endstream endobj 98 0 obj 4932 endobj 105 0 obj <> stream xœí]ÝnÝÆ¾?OAô¢qКûÃåE 4¶ ¤uÇÑEZ0déØV#Y–%¥ оS+êu K.yÎ’ó-9¤ŽdÉ=1H›Ýáìü}³3Kú,ÉR!“¬úÓþpp²8[œ%:“eý»6Eš'ZZ÷_#Š25E5çás‘ÉãÓÅ7‹,Õ¥M:ÿMþGp„mªªjÚáÏ'É{Yˆ,Íd²÷ÊÑ(ËÒdž1‘H-Ri’Š4·ÉÞÉâÁWŸîýcá¨h¥ªI{‡‹ûÕPžæR¶#o«ãö'µn†.ýPfÉfhå×í¦5CÇÕL #ÚI 9lˆ[©M—RÀ]Ö¶Rˆ8ãtÙKº•#Î$ð¸v]VéÑÒ…ÕJU&TKþ Ýñ/„õ3:©•y&U—9Ýó£j¤He&mKêw~µRéÞ”*.>*+°¿V}v³›s:Ô.4BÅYGzJ-ï’Îzï©—™Èó.õP…Ô>?ñ#:ËÊvÝOÝy‘QÍз~¨Ò´ªN…ü§j¨õÇ|íŽyíÉ¡;t莅QyϪ+½´›küÑ)=·]„C+º°Ùo©…hg½ ³ÀÂs:TKX§™¦zå…®­Ðqê/)§G”-0 0žÒ…„­7,iÍsãp¹QYÇ»¼‰šøבg>Ë„Ñýð4֬˵Ðr’ö›­­lU~RaäÚëÓ¸.6ë£Ú ¹j=Õ aºC!õI³nx!ª56gá6¹_Jã²—BVÙIõ?$U¯¢C©Õ ªrYØe%Û`MËpI‡nM)R|X¥tg=óQÙNÚ§²yí')#ó^Š$>(hã!e (»6œ'{É7 ‘Tªµý‰›–:ض¶iiî ÔÁ`fSã³ÒÄcKž Ûòm<2–Z™ ëTka[&k¬vhk³u&ð]¸òCÖª5¢ŸÔ u*í:0Õ¹GéRuð³ûD@ëÜ/ÌŒ*ºœ†û9ô“ «Ê6™ûÄÛ¨Õ"o^úYV묓7å.c—]ì²8³Î©löæ3µNmxO<¥¬¾m$ht6.‰pá*ªìpa³GeÝ¡ªÇ=}Èé¥ĵOgq¡•Oû\-d`ì­îW›˜Â¹‚ÞØºÏƒ[éïï.ã,:èÚ%šYF*ÜlwÖ#Ï Ñj7™›±¢l~EiíÓ¡‹&å“b½Ù#úÄSŸý(©B3pVe}FÝ©!Í \¶ò ¸$»0ñeÇ”&‡¯}ßÌ¥uÒDc×Ñ,|ÛgôÂ+\fÂÚ:Çvó—…v–*ËÝÖÉ^­RÌY¦ËPY…3%‹®²B™_y”nƒEÈfîŽ-ô|ìlù”òõ–è©Buug­(`á1e¢Q˜È2kâŠ)¬tCÊöŽKU°*㺠VX´~Œn;TÇ]ÈŸ{ÕZ”×VÇ>ehÓŠ²Úð•a‹8«`!àëKúÄg4º…€¦Žîyq›êxÇðÄ8ò„ ùÖ•šV ‡Ãæãñ6ðÚ¸ùŽ >Ø#ˆL` FþL‡@¼O(ÆÓP‹®R Pþ ;I/b‚üг&#¢š´!@ë€Ê$t1TXj%Òê ¼ª? LžYÇøíºP&+Èl€xƹiu Ä£€ÿ…4yr``) ƒ¬‚ìD¸6ª¾Ú€—ò¬ë µæVgÛ3†8ù#³~bù2Xìl(V-˜“›¿c©ÈkŽhˆ—?ò¯)÷À$®¨óÑ&¶¾ÿ”úv}¨ŠWKç„©v„—.&»\7ØÎôŠ•lf W¬þX u1 ŠóÊ7+úD\¾éê0VûêʪaAo’‚¦ô&ÃÍã@2 Š_áBPźì³>@¼Ÿqt•qkůܦÚIÒwÕ|ª'ñN¯Ïèãx‡æ×qP Ô’¥Iè3RŠ˜ÛŒÔ×Î+xƒHC3 °E zÜñ˜»æ¡o×±ƒ4r̰x5à „-@ ÌâYH”@ìäÙRSŠÊ«Æc”¢$Ë™Ÿöx(H-À6/)T‚|»‡¬¤,a8)¯ ?;ÓŸ`Áݘ Èóú ÀÀA*6¦ðJrÃÜÇ»>aIdTquL¯4Ï6&÷€¯<¨ä][åÅQ°í›À¾`ÈG~‰€ç18œ ×iŠ-Á¾'u–FJ~ (³@™wnÐãp•WbšíÛàhÐàþ]*~q#Á¡è ª»#›:¯‡Å‚Í=lR˜Ô …ÁK€&°xMÏÐRbçê.€U€NÓò‡ác{J¹jÛ(åðp è€ Í®ðrÈÙÑÄòx]~$Æ€=FûQ°¥vÂÛË·›C?hÐIàô¹gËj¹¾sbÄg,#<‹àÜhט*pí¸ÎF’XR‚ XïÀÑirCš×ä_Q‹ØÇã~ű’Iy:)¿v·Èó @ Z`…qV?P)w©•NK§´M»ˆ—`ƒgðnÑ(â%@>]¨nÀZ¥‚tA³Ò^­ ñ®±L»Ñ5ù8Ã;»LºÑ5ìLhâmõõξæò1”í¦·ÐAF«äŽÖz€y•\^_dÂGYåÕT@Ž@[l[XU ÔÆx§ÿ¶d×Ý é‚MVsVœzêg$Éම¾¼Ï‡™Ñ4à¸0;#Ž]qén(vÅ6]IEíÀÂd„gôšú]Tj†rÛ{±q4ñîϾ{˜àI5~³'´°°yQTõ! ü-Êï\÷je^õ·Ó«UÔc­çTÓàU‚:DZ™ïú€NÜóoö-…þ‰¼¥2pΡo‡<‘ìU'xs¢á©°²è…°Áw0.ãB –ÝýJ—År£°u,hT¯M~o¢ñ©ð½ ©šÝ¡I×¢8¨Ñ*8²ò4@p]ò1u[^¡¿=õ›Þ÷¶ÔOäUðyåZJl3‹çµ{Aloé²ÂpKâîE§¸øI2Ì^èUà³ûø < Ÿò¿¶ã=Àü@Áuø®oüF°&YAÈÑ&èì[ï±Â6»Þ6·×4ý]¤aÇ88ðšÆàô %±²üR+™šÎ=èÙŽäÈC¢ta´µõû £/ÜÄý…mbLà51Œ­¿Ü#Œ³x7…nXÀ˜~¥|ÅoeTÛš’Œ›²>ôU *í}ejݬ“j;Ø0¥;*y=a—gïòì]ž}ßb 0r^³;¤æ¤/±kõ·bdòÏ…Hþìþu±$9Z8â"Í•gyêbØÉ"Ï7¿׿ie´ÿÍýT:±?°™ß#w¼ø–ñ%«¶ù6‡-ÿqS¦Ú&¹0.‹ß|œCº£FVö>$mVö¾[÷ag}åcsž©¬c£*-¬X7èu3$EÞ©(ù/«t´Ü]xAµ,è”òõŽÎ:¥CÇt+ÊjûÎpÈÅw»m#qûbK8-¥8§³À3ÁÆ_Pþ¨Ä.)­÷”Ò:âñõ˜JçQ“g¸ãsÞ‘kU´žÁVu P¹Î2Z*Ý%H/¿¯tN,×RzHè!}غ ¥YÖwIJ>à‡‡tÐðV`ïû¬'ÐY`C@ÀÚÁ¶gǰGžƒ…À™Àyþb Ï™_€`(mZ !à „À¶Õº°åœ6ËŒì ' ìëij¶&&hh©³ª¯RUDê/ªÞìÝ!ôBÿm‡Ð7Ð¥üh¹CèBïúÖ„ÀBïú® ôß›H”ž‡:àl¡‡7>€Ð³—”Ö4„Öѵ:Ø5:h>¡eª²µ”v½CèBO4`Ö!¥Å3rÀ×Bäè¡­,ú(Åw¡«Ï¿ß„^ ëlªÐ÷…ßû‘Q¼¦´fŸ¬=‚˜¶ ÈCF Ëoé#AÞú3 Ëç3ƒâÍÀï£ÉD{E7Š´rû*àÕŒx´À,àqŸÓ !E‡¼µ,óú¡ Lã_,$ÁBàÖdxó¼žÈ¥xç sz€p¶ÍËyºaG=} ;H`A¨Uü»ŽÕßWˆrÿ¯ÀŠ)pl³·3MuÃÆÂ,™}Mñ¯tèšñÀ_¡òwœr)ÌæÊTû›¿2•çªþke×7¤èÀz~Üv®L™Ü¦âîߘºßgÉ=j_·ŸKÜÕ„ùèoè#ÁÊ’IV´ ²¬ä ÐÊYèÀã œG«@^ ‡Œ„ sB¹y‹Ò û 2÷+j(> stream xœí]K“ܶ¾Ï¯à)¶+ŠI¬œâXI9¶«"ySå$N©V»«—÷)iùߦr’|ö8$g€é@ÃY­äµÊ*©€F¿»½ÊŠ\ȬèM8:[\-®²ªÝêï•jò:«d«W¢érÕôcî=¢Î¾¼X7Í+DÑŒ  :ñu*ó²å´ü3ºã·õ+:h¢y!ËÎMsºç?õ&—…l§¥~?Ìk[YV[ )K7ù(­Àþ¦ãk7»yEAÓD%J7ê—” ”ó®é¨—Ãê]!êÚ^Ýÿ¢Dù7U˜9¥€[›Ë[„5ÛÒ~ö—xL œÈO,s´u"¶Ê_zÊÒ#À=¢ø™ŒøF¿¤šøÅ'0 ,6x ]QÓ¨>¥,öÃgt“€`ÃT›ï®)[Ÿoœ‡2xÎ&_RêÐ/MDHàê¼—U£òZŸÛR”y»‚1Xí®-åô¯¨Šù†Ž:èAm^T¥gë@ÁtɪM³#J Ê<ý U0¯é!­&¯pÐ4ïXÖïõ†=ç˜nÈãX؃ã_ä1ç$©ª*:sù f晾K‡õIñM¦Q›Óp{QÒ¿cÉ2ÀðÒ Ä ƒ´†¡w=Þ/|ìæ*s”Ç]‹æ„+‡a¶QŒæÖáæñ©Z dïñ‡ úŸ;;çÑÑГ#q /u”^Ñ–M³+ò@Šƒ!„–%^Ve­Í[g˜·K‡ó`K êŸ(Œr±XÐ×:§ŒÈ;]Àúà‹`nM¬©ØLxÓµ<§ä?ËMîz-¸Gâñ¿|‹{to^pÄÛ£+>±A@#ƒsL–^N° /Ð2ð¢¶ldhܱ‰y²­ÿ²vÍÓ†À^%ó%@¢dÑØ€ýå^`‰æ´É^ö€{ö(žP˜î°!`¡Öæáeœcé^þù`#«:zØÆF|yÀ€\Q¬eÒ]Y@h"yQêÊ\Lj;ûR~Køéfœ©@Ò4Â.5Ñoµ7ßje§gó­‚·›oŒv©+òq¸VÆÉº}+s"/ïëö­ØÎ¾U4_$$ÝcdDvV$«£H•W¥EÞraž…‡êžrVrcoA0?`ë·÷!X𺾠ÐK²•˜Ž†>…¹(µŒYeëQÉ©¤uÅзÀê;Œ$ïl¨àiĨ#ž`ÀÅLáJ$‰•È6±ÿ•‚’Ã.f%,"( ºI{JÜ´sö‡Fÿ¦DNʦð•üá¥Á̺µ{@é] ôc´vŸÖºåÚx˪‘yÙU†Ê|Öãé)Yyv5§4¯8ʨÿÛ_ú{ÿ¯m®ªrݤ?2·ëÁÁ³õ(P_ ^ü øÍÓ)bh’¨0ôÑÍ\Ðë%u" fv`ïª+Û>¯<ì!ŽÄK•€è7A;ØHá¹iX>B•Øæ)Íú›“@ivÎjý%õ+•W·f8îÆ;^m¤cå­ö·èÚõ%#@Už²£Ü "LJ¨ò$ `Bn—{ÌÅ«eGG¨]ßß½1^`ë<‘ ˆÃå‹kºðDxJpâhâÖíí˪ËUhƒ] }è&Åâ{Úk§]0G=¤vt}9¤Ûì¬ -×`Ñ]& Ð.Ï3…Ìvy_“;¯…Ÿ³Òˆ‘T²kÝ8»è´Íd6+N-ü­l¶bÙÚåŽ?tHƒ¹ø§&E8(œÐ-®» kMúVm¬Å%åÞ¡¹üSªæ¥Ùj!]µ_Èþòój jh%‘BjØÚaïyšý…@uóÊ%¬"¯x\Pä“+Ÿî\G@kƒ]ƒ`ÂÄDs¼r/:r¹Áa2ª¼”jçI±Ç¬OŸÕå »ÃPf%K)´lµ/Åhã]‰î $Íèï#ËK¡ƒj^T±ÞìTû™~ñ =§/Ã_·äº8/ÛP©­wfºFqá%XýL΃ÎÙæÁëòæJ7Ú£xÉq@hçÉ£Âÿø #¼–$°¸G•.ÏÙ»í˜y;æÏƒº ›äE2í]ù»”`|ÐðšIòR‹ÇFÓ–lpºÉ]I@$ç¼K˜|ÿ/¹šVù½Âq…ùd>¡X£ÃËÿ[ëö€|®ùxî¾Ñø'P(L¾÷±Ñ9*C@Á¾K iÁñn%÷xð´pDÇ~̰²¢”h)¨NUÑ€„<ÿˆw‰œ#å1Dró‘¿§: žÃïŠß‚ÅQ°Å¯(¹NÚÔ¹²î3zœÑÈPMʽð£üwyÞÐW£"Ú´òì*¯ñûþ vf=Õͨ†ž |q(ªßÜPrZL|CˆçYƒnç=$Œ“û˜ã+ K⎛! Oþ¡¤TurgQB†Ý~c9ú©3À&¼ž8G/+¥ò®O¯ÃØ/þÆVÞx •üœÂcŠü)ñ€‡ŸœˆsG£ñ×3xá"/6LÎH{ž•3˜6¼hÔŒITnç5ûî)eÄz5É¥+^mÄs€„Ÿ³ìán‚l*KÙ7YÒ™xî«qæÁFeâ7èx g†¦„ôpÎMx,ÉqöXæ¸í±Äõ„Dx,@YiCªµNÇzÞίëºÔ{‰¼ïÇ‚iÌŸë²Ç“PÇñŠÄûu~@dâîŽ TÊÜErI)±dÀΊÏ!Än/ÝÄ 8Hàån½>€+uØYäR™qçG׫U½éŠ4¶ñoL&»£¼²$P}À à)Hq‚Ì”¤ä‡A]Õ¾Õ *ë¡w`‘?öpû~-0‰¼›J<7iµB&[ïéFÞ˼vˆ]Ëa=ìNŽ|nwu2>1çÛXsv'¸; ï`Ý„ëä¯ä7qxuÂÑ3ÁÚö{ ¡œª;ñh’ã©p> stream xœÕZÛr5-^÷+æðD-itá È¥€@‘d ^RE9¶ƒMloÇâø¡ä/FÒŒ4ݳ«];âJÊÛéîiõé«f/Öo˜ÿI¿œ-.dÜöŸ¥Òm×HnÜ¿ ´m•ö{, aÁ3t&dB+¹ÚÑx"¢áóõ¡­ØTÍÇ€p*N8‰Ç[Åù",ã}ðd'ì?^Å2ä·A1Æž”fŠc™fyÒ”HºÇæPJËJ,!Ó lf™«ƒSó™«´ë+l„Âê .BÄ%ÁáÛo›OÚÛ˜#˜0iò9ÀO<Aëf‘ì’U~„z?VŒ³‡~ç¢ÇYS5Î>Äó&1Ä‚g½dËMWì¥à <6Fõƈá²ë9ž‰Ñø“Ž‚§8£«gðsu?Ü}=œV–£ñÁ¶ ¿Æ‰ü¨¶åR Có>|ã„P/°¬‚áô'3I_’¢.7‘—wÏ¥©‡ËÊÉås©ë2xRf͵ÒRwœÉU[~è+LzWåæèSn8¤Xù«Ê§Uê“OˆnEB8#áS‚‹x"!¸Âhcõo±õUpÔEý†c…u¹ñ²Ê_;‡ø¶‹ðW]vÕ9‡ÐE¦<3`7åìF…#‘L-÷ ÑC žcÒð˜ìuÇÁVá²AÄàóèä‚sC‚lµÛmHónÈ‘žw醨!žH¤ç›HR\®ÑEdY–žÅ¨^—ì­ŠžWO Dûæ"<Ñ îIÍZn…›EkæÎNPçÚgUoM‘žn.7[¤sÝd‘&R’°‹è¬s [IÚÙÔ6 f.eì8—3-ý`&•rí³ÏûÌgù„ý&²¯«z1b|JÍ0·«®턈ÂT¢®é™`|ï Œ™5sa]3¬‹^!¢¾ÔMÑóÝ}C—Y3u¬S‰loñ #â; |;%†(ðuÎ!pœ¯œ‹(&ÛÍr¸È½ï>qÌæš6ËçI[×&ˆtÜÇ%‡(_‰0‚h¾ÈmÀ쟪¤­ï dûoÄsëðZK“7¤Û+DÁ$’¶.zÿ­i«R·°E[Ù¯ÛV7ô*¢‡Ö­Q„uu¼®·ŸWU{F"µ‰€«Äv+&±ýp´“mhBkn²ó`×le³ÙʾÀO$ÒeU“\;×'ÂÈþž(KkšýÚÉŽ0‹È)"”vÎþºI…H ­ßù’æÆoüÊ\¿î2™‰¿Kƒ1Ô½ó•!H\DçüX‚FÜR×\ßXõæ¯j.éÉr¢²ç^]cDv›C\Ê<½…mÝnùZßöæ<½q™Ø9(þGïdv¾°Îîà¦_MÇ—ù+K"G—ÅD&Îïó$¸…²û¼ï1ä?{Rù}…øÍö|]zRþ^î,†ÞÝ!ñÝ¢ø-úüÍóÓÛ˜­Ÿ9ú¯šùŸÿöªÔ endstream endobj 122 0 obj 2061 endobj 4 0 obj <> /Contents 5 0 R >> endobj 25 0 obj <> /Contents 26 0 R >> endobj 42 0 obj <> /Contents 43 0 R >> endobj 53 0 obj <> /Contents 54 0 R >> endobj 61 0 obj <> /Contents 62 0 R >> endobj 69 0 obj <> /Contents 70 0 R >> endobj 80 0 obj <> /Contents 81 0 R >> endobj 88 0 obj <> /Contents 89 0 R >> endobj 96 0 obj <> /Contents 97 0 R >> endobj 104 0 obj <> /Contents 105 0 R >> endobj 112 0 obj <> /Contents 113 0 R >> endobj 120 0 obj <> /Contents 121 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 4 0 R 25 0 R 42 0 R 53 0 R 61 0 R 69 0 R 80 0 R 88 0 R 96 0 R 104 0 R 112 0 R 120 0 R ] /Count 12 /Rotate 0>> endobj 1 0 obj <> endobj 9 0 obj <> endobj 11 0 obj [/Indexed /DeviceRGB 255 <000000FF00006B6BD2FFFFFF666666FF66667B7B7B6666C24A4AB96B6B6B4242 B1F30000FF9090B1B1DA888888737373B1A1A1FFB1B1CC6B6B181818FF33337B 7BCC6666B9E33333B9B9B99090D2DADADA8888CCB98888FFC2C2424242E37B7B FFE3E3DA9999FF1818FF7B7BEB2121B1B1EBFF4A4A8080D2C2C2E3A9A9A93333 33F33333D252529090E3DADAF3CCCCEBEB1818FFA1A1999999A1A1DAB99090FF D2D2525252EBA9A98080E3A1A1E3EBEBF3080808FF08087B7BD2FF73737373C2 5A5AB9B1B1B1292929FF4242E34242C2C2C2E3E3E3DADAEBF38888FFF3F3EB90 90FF2929FF8888C2C2EBB1B1F3FF5A5AD2D2D2EB4242E34A4A9999F3CCCCF3A1 A1F3C2C2F37373D2FF6B6B8080806B6BC26666CC5252B94A4AB1FF9999B9B9E3 B1B1E3909090B1A9A9FFB9B9D26B6BCC7373212121FF39398080CCE339399999 D29090DAC28080FFCCCC4A4A4AE38080FFEBEBFF2121FF8080F32121B9B9EBFF 52528888D28080DA393939DA4A4A9999E39090EBE3E3F3DADAFFD2D2EBF31010 FFA9A9A1A1A1A9A9DAB99999FFDADA5A5A5A8888E3A9A9E3A1A1EBF3F3F3EBEB FF101010FF10107B7BDA7373CC5A5AC2CCCCCCEBEBEBB9B9F3B1B1FFD2D2F3CC CCFFA9A9F3C2C2FF6B6BCC5252C2D273739999DAC28888F329298888DA9999EB E3E3FF8888EBA9A9EBF3F3FFD2D2FFF7B796FC949005E770C2F0F4F7B82899EB 94F741F7FC9490F7B84E6D892D05E770C2F118F7B77BF741F7FC949003EE8803 D600F713EE00016FF7A2E3007DF1C2F164000FF8DF0008402004F7A3A0C40000 1F200C000FF8000000C4000CC40000DF0008000000F713E22A001EC4000CDEFD 30C2F18CF7A10E03EE8803D60000000305E00FC2F1A800E44A05E0F8000032F7 B9C59A3DEC000030001DE803B600C2F1E000CD7C00000900CD5C000000FF92D0 05E10005E17003B600C2F20400CD7CC2F21000F56A033238FFFFFFC2F2780010 260000300021F9000028FF92D0601232FF94D0FF92A005E100F432F805E100C2 F22C66E8880000006021D3FF92D0F432F805E100C2F26C66E94B00000060D91D>]endobj 10 0 obj <>stream xœí} Oi–¶s1Ónó!H ‚Âf0IX&|&\‡5Ù| .FÁËe@_˜ F€Âm#I‡ÉÆÍF ¼?tÏ9ï¥Þ*@fâäö‚ Æ—AçbSHôïÝœiñ×­ôÆ |E ã‹`c±ªw ~~^±Iäo*ô%1Œ/+óŒÕû'6+6Áö³ò3ßBÁxo¨xÌïŸh‘¿B_ƒÁøhÙXœ{2PÜ]ï÷û»Aø¹«ÁøFp3¸Ÿ u‡zçªxƒñm`3Ä¡ýÅÐB¡¹3…¾ ƒñ…н±ØTõ$„xRÅÓúŒoþ`0^UÕ47×gî3ßî÷nãKñÅ•_ }) ãËâ—¿ßߢ©½×Â`0 ˆë}…¾ƒQT³ø3ß(n3ûŒoÑB_ƒÁ( b· } £0ˆ²ñg0¾MDÙø3ß&˜ü Æ7ŠëìûŒooXúŒoi&?ƒñ­àæó ¿_/äã®ü­µ_ð‚~ëë…¾ã7Ÿ·øWz—:7®|×ùžÔëFþÉ|_ôÒÎÇZÏwTè‹`0þA1S/‰òW6®t^¹Ò Mþëyä_?ðùþ—?× —Âäg0.‰ûÀxã †zõn,Zm;{­Ñ÷ïÿ[È¿ñù²L~ãÒ~'(Ÿ¯P °”?=4NÍ=óù’¨¶]¸Nî–ŠkI2ùŒKÂOt¯j©ðw^¿¡üѨ1©¿•ˆbë»V€ë´aý\^ +?ƒqiÜDÅ‚G3”ñ9¿Yï›üA2ß—ÌØö?˜Ïd“Ù$\+?ƒñˆåïÓÑXçw6å¯Öä§:!YhåÏmõ3@~V~ãó0°Ñ¹!Ž&déO+4:(^S…6‹;Tþ7…¸VDi&›Aîù³>îçg0. g°Sµl!@“äÔÂ/Ò}‚ü€ú@ÿd6+²V~㲘Yê\zNGcADgç†$ÿmÝÑ×*óý¬(ùÔögüÙ üŒÏÅÍÅ`pf—‚ ý@AþÃh4-ϱ+a ~D~¬øù²lûŒÏBïÒâRh³Â_ BÀ Èo ?)¿¦~mf¹ŸM²íg0>þÅx|1¾ø!þ!aø$òGÑ}¨üY‹ý…·ýÄþ$Û~ã³P¬ÿP¯Š ,Å—üףј>¥Õ&üÙB“?+J~äüïòZŒlܯB4‰†ô_ôÓL~cX¿™óg}ÉÆ|ãÚèëöð~*mwwyxïã×p:üëÙY8ŽÐgÚÏú_{jFTüPù“IV~ã3ðóœDÕñ c|Ï|¾?(É—ìÅæøº½©ðþ~d?Lã^ ¯6œÏeÀéò*œFàùRûíkÎó¦J!ßÇFôïÉRw]l\øc0.ŒÇOû逹/GõËQ}IÓö'³è¼3™Tþ—­½ìÚOõS¤û€×ÀíÝÿ>ïçOV‡VOV"«4æá“?^:,ÃÔ¸`þ¸èë“I¿;ãâ(Ö?é}ÒÛ;ÛÜ\SÕDLíóŠQ}¶j?xnâþxžòçºà>)ŒJt&ú¯6ä\|xHpÿ%Š?6éýáKöSvFùýã2é—}D8bò3—¿7ê õÂz‚ìŸû'£Øgé½:H’éGÔ8¾ho>±OÔßGþ*âõONVON]~ûס“!|t?ŒÊOQƒØIì›ç"ùÉ÷Ó ¿lR;òñãRh …B+ÐBž„zç~3 ýF²o R(¿Ãö¯ãß—ôO¡‚£éôzƒ¾çgþ£C#'CC@þW-å—ÒI$Ì€AäÏ’ñÏR¹ß¢>+?ƒqÜX‘Qèý-–Óoúœ@Ê÷3™yÛ×ìu%ÒôƒòHÈW¥ò¯"ÅÚ:424´{‚äÔ틤63¾ùµðgù…+ö2Œ‹âþ€ÄÊÊñÿ/­7¶™õ¾,ÖÝl9n^Ⱦþyð°HãWQ×ÑÞíæì¿ündhw„„ÿääDÿ0±¬? ?|á²uvƒ~Ó÷[®„•ŸÁ¸8~(¦FüýÿÆ›NÛïÓõ>‡ò¿ÝGîKáO…SaUëá‚ ŒüjûáW#€¡]Š (þ»ïÎPýQù÷¥ö'ö­Ó…ògÇůÓ0ëêXùŒ‹ãfw1Bñ`eÓxÓÅô'E_ßxÖ$s‚È¿¿Of=œŠDVwÏ^*ú½GvGFliÿè±DP_†½³U•õ§(–XÒß  ~Ö0V~ãsð˜È?V,B¿ÅxÓ-çÝüY[Á¯Qr;ùQ¶w‰æ¹_¥ðCÊOLkþð[úÓ‰ ÿOê¯Ã`üçUo_"ѧËj–Ä_¬èa]+?ƒqq<öuwûíÊŸWíOf{¨ânöóß½Šäߗ‰h½>¢Z?æûCÄSú‡FýÉõ[oìb¹ÈIääe¿êÓ0®ËýjjU‹`åg0.·€äÿ@…ñ^žîõ³Rû Û?Ü¿ M°×zg;ù‡PÞIù²ÞÙCê¿Bã?tbô…_î6ŒöŸ:û¦ˆúBû1Ð"ž¬ü ÆgÀß]è®Gþ#û7'´›å>_6LÿÞÕ« I}ª÷åŒ÷ND±ì=ÁzãT ?ÕûOÞ}âÅjî ågÅg0.çâ›þz’ÿâ çZ åÙÏ¿Qgâ*¥ü²à×`¾Òä¦b?°ý­¥ð¹·Èþ·ôŽóý„é´˜‡œØ×ƒ¦Ÿ'ô0Ÿ¿±¼¿ ù³¦ïÏŸÏ?ÂÒ/¹i6ß;¥þ!)ü#µÞQÊ/»úWëg££Ín£€ Èr¿˜Ù“dåg0>é3Ù_ßíF~£“?ébûß_¥”_VüÃ~¥ò á7ëýôRÒÿDŒðÇ©½‘ðnÿiUc|Øö3Ÿ‹XßðþŸ-úÍ8O±­á—Í_Ìc„_Ò?’Ûß=#é—"ÿÖHúÿ›Ê}¤üb€¿œÜüO¥vïæ\/7#†øeiF?Oèa0.ëÑ´wÂoÙŸ¯üz4 ÖûòÉß|ÕÈù#‘HûIûnûî¶³wgTî“Å~hVfŸÃ”_)ÿÍ ¾4-(Ùop+ŒÓ¼½€/“ŸÁ¸q±®–– „fÿŒó,Û~.ä§^þ„®ö›Ëøà„>Tþ!9Êgä­Áè¿êœ_ð%åËñ½)ç„~‚ZɇÆösÎÏ`\bîîf ÂbÿŒó´‘¿áêUQï¾GçÍÓ}ò“!1ÆG)¿9ÌÇÈù‡TÒ/föÐJ@ûûgy—lüàjšóN`0‡\¤s`ÐßüY‹û.ýüS ´ýªÚŸ@ÛNÚ/çõœ¨‚ñß\ÐkïJùMåˆ~`üö^C„îê˰ò3—…Z¤³bsSð_°¿þ†óDSùÝ ~ V¹’~þ”X¿/,øIåG¡·­æ·÷VŒÔ·ôÐËy8Ù­”?Ë9?ƒqY(î?ž©ûÏU~Ëõ»ÙþI³Ú/&öÐ^±Ž‡˜²«¤ß¾”gî?‡dÊ¿z"‚)D(?.äçø­ŒZÊGäülûŒ ã0z]ùgff*Èúûgœ§ZÕ~*÷çð›Õ~k”ϼ´ý‘°š×£êýNò{½§ÿI¿Ö}±–Ìùû Ǩ}]ìϰò3—BßmuWŽŸgfn û+Ðø»“ß>³'o„_s¾ò‹¥|(é²ÿ<ò{ñž# ü/UüHøi^ŸsÔÀ¸X»;ÃÕ~ã’°îÁûóù'>Jþlþ:E??P_Tûç§§kÐöâpÎõœ¿;‘®^ÌçO!õ÷‰œíùÊß®gõ‘úæÊ{©ˆUïK$–moÊÛu‰A>¬ü ÆE¡ïŸ®æÆïåüëæb^Ùd&ï뎤í—+ùØjt¹ß£»wz:<üÓÙÙªÉâZ¾“ï†ï´/ù›‘KyHåŸü¤ÿ\ƒ!q]õñ#€ø7ˆûçVû¬•2if ꃜu ñ“S{‘ý~ãûXÆ;ûixô•}a®W¿þôŽº÷iBϪ¹’O¿Èùé ¯:rþ.P~ZFL(¿ìyàî~ãÓPm¸þDz§]ÿ„ë¿ucJ/®Ü]:utw»+c¸ûVáûåœÞýˆõVƒ^»ŸîÌ1¢~{ÿðoâ^]«ÏDÂäÏÙ®¥±Tß±'‰~¤±}ª6yð·øWa0¾ÜÖwáõz®æ›ÂŸ?¯Ù6+í=Xt›²ÎÈIòÓHŸÈ~*%Ù¿&‡í…Qßi!ÏœúÈ«= Ÿ`Ý‘{]?Ú~rýÖÚÝ„F½x¯yûàäßè†ÁøÊÑ­¶Rþ_**Ôð^Êøëýÿ7ï>›ôc;ÊïkãŒvs˜ÎÇ 7Œö¾”ÔÇÁ{â†\Æ*^'CrmO9£'<šÃ?ï5¤tOÖûS{ÚEO_FŒñÑø[þó0_/Ž>ïÍŠMIý‰s¦ôz3ö™=”rÛoו벆øÒŒ~q“nû}ºWmkôâÊž«òîÜrdßnûnX ðÙÜ/áè7œ”Â/”_oÓã«EµYïÚcÓsúüÝ3y¨±I?òÍ·mÎÍ‘îí£Ûõí«™}4Ä_êÿÉIÎøDîäÄä¾ÝgõóEð wíWâmÜÇ‘ý>¾cƒqA˜äÿ¹¥E®å1¡–ñšÉûÀ¤©üú>½öþþvYò»º/²~âp8bQ(n/Üë„_Ýw>¢—ñÀé¼h$rÎk—Âï3oÒËýý Æ'!jÿ—‰–‰½ŠW½¿¾Û…ü9Û=»ô}zí'Í'(ë$ôr>á”pþ’ú«Î¹w«Öd¾°^ÄCÌé‘ý|ùƒZ³êf]jØnÜßÏ`| ¢FOß ÿ6Å}¼oOÞžŽå<|IºQ¯“ü¹°ãK¦ù}b–®S÷»V¾§¤ÂÒò§h= ü®¿æ}Ä»7žµ:ú4Ú?÷ß„Áø&`*ÿ¦céÞn—›vÞ›Ê/´?›qŽá?KÐðþ«2éW{åb~n#ýÞ™sø#j6_Šfó%ö#®“&3bÙn›i½ü¿ƒñ á¶EþÇzÝîz¡ûn·ëäžÔ÷ɂ޸º£ÒËôòNÝ)¹œW$üSÎõRŽ„á§•»ÂF­…?õNy±Ž‡-áQ> ƧÀPþ›@yâ=4y«¾üu"r]û‘üI`¿Ë Úá”è—Py?!Ü;÷bFOÔŠ½ÒóGhh_äìü¹“ìp°i?“ŸÁøD«£êf-HzÁüzy—î7åÕd²–öÌ¿vP:ÚŽºäO…çwï~däýéðÙ‰òü4¶/uÒ_°aªÖ”ýÄñòƒß?ŸÁ`bzxïc}{nIý±âWå>>::ZoþØŒýWk¯ÖÄj>Ÿ|Qê§á½Â\^Î'žÎ`0ƒQq·¯÷—n…1BqñÀÀÊïŸÁ`üCã ø~q´9f˜Ügò3_/¢Ñè!î×kæ÷WZ }y ãï…ê¨XÊç9¾˜hOªÜ…˜ü ÆW‹¾¨ä7t/–¢~Áäg0¾^û¯{½cHxE|IýÞ¹‰B_ƒÁø»!Åš_Eh%´‚¬³/˜êí›cåg0¾b ‚ôGBÈþf>P¸ÏÊÏ`|ÕÀ¬ÿ@wÚˆø`ø‘úMMþB_ƒÁø{¥ÿ7ú^¤}¯Ð|ä~0(ˆÇk  Ø`D‡öí×­ØÚ·Û[U;/$`4 ‡ý1íÙ÷hýÿÄÿm1¸ º¿|'€þz«îá`90>FB=»S‚ìóîÌvô:hØp%FŠ’ÙXÚOe-#¯C;à-¸³0ˆ~¿£Ž–¯ë0Ïi[hÃìÂû¢Òƒ!¡­r– ±J¢}Y]ú‚­…E”Q<ž‹åü–æ›Òo ì™MÐ<½G> }®öŸ>85èoñœ8ß¼ö Ù­h¿$‡‡ØÐ¬K7 Žá@÷©MXE÷#hÃJûG%ñiwËlŠñ¸5yKcRøIý~;é—÷‘ößOM‚ðO~?e6EðÈ{`?6ê#í[‘îÛí†%  6¤=vÏZ%ÿéÙ >0_qý˜žk„-˜·”ŸœB#n©šFxn´¸ßˆÜo´´ß&þëkmD×Ú ŽDÄGšÙáàGhHtr?RC¼/ŦP|—dÇnÄthÁ}â|¾ê)U„—ÜïÁ嬀ö¸¨º‚,nÂøp‡/ðöZ´è…XçÒ"ÿÅÅ¥xü7,ûýWÓ"ÙýÅÅà´ ù©Âm«{8‹‘òw$?p\áNݬ`{Ñ2à¡é‚ž:.£W]ûï -ðUvà7¥á é“uóœ’_Í=ôõÓ 1V½;++ñ¯áÃø±jØÅ.B}—(3viÒ~öôþÁyÚo×} þÞšMøÅ4gü›=pŠ?i¿Hš…ðÛÄŸ( •²¥ûÃnÀÝ~up«ßˆyªßO´¿µ,èkR‡bÿÔÔ䔡ü¦P1`Usaý¿ßކ͖´£êߤð‹½]÷Qõå^„€VKôÿÏ5ØTN`—}|Týy¢;<”ú7ZÍzì'í·YýÒ5°é>„‚kZ÷1àëT@(ÿÔý§OÇŸ"åi/--5%ßd$  ‚~´ÿúÔ”ð‹-ké?ŸêÿúǽKAäz$þŽþöaì>¼ ;ƒ6ò— ¦nÕŸ1⸠‘gyžö*ëLò×S…š;•m·­c«Þh¥çE>ùÓm•Èö¨`;üNG”XN¢m–ªJ ñ³fÁàSèoùý\^[ÚEûÅÞ]û ö›ªoj¿®4ÛËk¦ò?²ë¾Ò~Cù×µÝ?’H?,µ_‰¿Cûï’ðdXÖz/›¤~¿aü%ó—…ç—Ú?)ÔßÔ} (÷ úÀý)Ãú;tÉßÞJÛ¶!üZ÷Û¡µ¶Ãó±6Rú•ë—–_ÿXk¿|¨ÂÀ<ÑÞR~“þ û5]`ìÊoñ^»WíWºÄ¿&ŒÿS²ü:ï?Ê/Ô_˜~|HÖKá—q€èýC)Ñ^k¿f¿”~8øAZ±vµd~’¨/´ö —Ÿ•¼'êÓß²šüõÀsäz0ø¯ÿGûýñ½Øè„f#êô½Ù鯄ò{ªù%ëbH¢K ò÷É¿Ùu\uü-²ÇŠ®ÏzòÈß7}{‡¾IüŠ·dzº#`½”D¼úð½@삾ߌ.Å?þ¼"à=öÎ×þ½SS÷Úß,ÙeßEù­ò_3é¾~<Àl)¿®Ú]­ûÃ:ëwhÿ­~Cùïjí_6ó}ñ÷kí—•ïʯ´_Å€×È{tû–÷ÝŸ²åû¢¡÷Ý*”¿µÝ,á[[-ÁoÕOZûI÷üHÿg†æ«ä=¥ü˜üká×A e…€®FWt5v]k¼ÖUÛu­ËUûµî“í¿&…_Š>=¿Mè?E’~ÓúK`©öãš÷ãvíÏëïùAi&©š¢¿ÔþŒÖ~"¾Èõ³Û X ±òG4ÿÑ¿,mtv¯t^±‘ŸJóŽ-¨¬M“Á®ö´íx0 zh7íÑl‘ßëé»;1›'­óp£Eõ‹Ù<òÇ*ËËMò{^D©œ¯È§:–Æ«óP ©óô]LùÍBŸ“úJûEÕ/m¯ùS;GûAùO䷴ߪó­iöËðHª¿¡ÿGÍ–ö7«¼_è¾,õ©@0_i¿æ¿%ýH}þ»†õy¿~Ò}§òkö[¼'íŸt~Ù€1€lD€©ísŠ}ÛDúvÊûÛ-í?&ío•vÍ¿`¾!ýó¸ÕKÅ—ûg¦öÏ+áGç¯6Óù§„ô7Ú­€Úk°á£K‰¿Mû­Œ™MýI÷§ïÔíéSÅþ[ѯÔHdª?Žâ/ÆõÇ•ç_ú„Û·©D⟥[júä--Í‚ßãP'ð|ã xüà*þŸ¢èþ£þËÿÿ°ñ ºïknm"}O“òƒ°W")Óƒ“-$#ïê<1'ùït”‹à±Yzñf]™†(ìÚòÈuJÛeRoYâ xÚðc垎 uõÙ‚€KÏŸ—”ß)þB÷õ]´ß©ûμÿ•tkpdïÌKüåi¿Ðÿõ#;ý…0µßVï7´_øÿ~³âÒ¯u_)¿ ·–ÏÑþ)ËX1à{¡ý´ÕñÚöŸ„[$þöÎ@$;Ðÿeë±ØTõï™,ø¡òߟKñŸ¯12~É|!ùêXûS5–æKÆ+÷/F¨íïß…´wA+hç/»~|o6Jd’þ÷¥FÞ/CÀ¸¦©©û¢Ê/{þ¤ ûb‹¼3¬Tÿ¬ ½Èû…óÏêq×¹•.@ü?ß²qeãÊ•ÎNÜÑ3Ä‚¥ùcuTàv´Z÷»‰ìÚã½#l¬ˆXX$U˜̦¤Ü´ý^ÙùîU¹|ò£“Ç‚ßV>ùÛ:›–Ah:0h¼„ÏâW÷Űᢠûí!À .Í=çGíß;gðO>ý8JþÍkhûÖ_Ëÿš~›ö«´ÝMùlõþa©ûŽa?*Õ¿%^P@‰ÿ¤j’úùÚ?µl)ÿ¤*øOé^?5ö=?Ù}cô=(Û/ˆ/°-+ôLº/©ÿRåüÊjŽçIúíŸÊ/çµù¯‘Ù¾­æ§´^°¿F¿@î×BÂÔ'þ»û±èÿãÁ5£äoÚcèÏ{½·[YúÏH¿/[©æ½Ùß/¸}~=¢¨€LþÅÞÒ~!öº»ÏVðc˜’ïJû´-íÇç´QíÏÙ´_qÝÅø“'x`y¿ÃøËœ_ê>>ÖuÙïÐ…ß>pØÔKû‡UÍßÈûupKÕþßAøûoYù¾Nío˜4h?)Šþ“†ðË1>$ýTó±À>þOdþdÿ[·[e ÀìÓ. ~/)÷©„_Sÿeÿ ÿŠþRþíÊߨò~Êú)é@•üæÍ í>\#×ßEY?…gÚoØ~=ÔGþM²_û\¤ýOu¹ÏðýôœQIáû5ý3Õá×#R~â;²_åüTû3 R¤ü¢»O0ßÇ÷±wEîñ7µÏÒþ:ówjÿš«ö»´WfÞoô£@Ð,¿ììü_äû‚þ„ñu‡ö÷ëš¿‘÷[)¿½Ãó}cدCÿyÿ”îó³úù•ù—%ÿ)ìé{=eËù ío•UÿV™ðËÑ>ªòGy»RûgÇVŸŽç­¿Çbä¯ÕõW£³ÿFÕÝ'Jïßj÷Iþ‰÷Ž´ëý.ôWÂ/ºûóéo9Ô~‹ýV©Ÿ^«:¿òšû2ûÏHÐ#¶¬ä~ÖªøgDÕ¯ÇR~à'ºûðQhž1 ƒÁ`0 ƒÁ`0 ƒÁø\üƒÔ endstream endobj 21 0 obj <> endobj 22 0 obj <> endobj 23 0 obj <> endobj 24 0 obj <> endobj 8 0 obj <>stream xœkhÙDÀ€ endstream endobj 7 0 obj <>stream xœc`Ù endstream endobj 29 0 obj [/Indexed /DeviceRGB 255 <000000FF00006B6BD2FFFFFF666666FF66667B7B7B6666C24A4AB96B6B6B4242 B1F30000FF9090B1B1DA888888737373B1A1A1FFB1B1CC6B6B181818FF33337B 7BCC6666B9E33333B9B9B99090D2DADADA8888CCB98888FFC2C2424242E37B7B FFE3E3DA9999FF1818FF7B7BEB2121B1B1EBFF4A4A8080D2C2C2E3A9A9A93333 33F33333D252529090E3DADAF3CCCCEBEB1818FFA1A1999999A1A1DAB99090FF D2D2525252EBA9A98080E3A1A1E3EBEBF3080808FF08087B7BD2FF73737373C2 5A5AB9B1B1B1292929FF4242E34242C2C2C2E3E3E3DADAEBF38888FFF3F3EB90 90FF2929FF8888C2C2EBB1B1F3FF5A5AD2D2D2EB4242E34A4A9999F3CCCCF3A1 A1F3C2C2F37373D2FF6B6B8080806B6BC26666CC5252B94A4AB1FF9999B9B9E3 B1B1E3909090B1A9A9FFB9B9D26B6BCC7373212121FF39398080CCE339399999 D29090DAC28080FFCCCC4A4A4AE38080FFEBEBFF2121FF8080F32121B9B9EBFF 52528888D28080DA393939DA4A4A9999E39090EBE3E3F3DADAFFD2D2EBF31010 FFA9A9A1A1A1A9A9DAB99999FFDADA5A5A5A8888E3A9A9E3A1A1EBF3F3F3EBEB FF101010FF10107B7BDA7373CC5A5AC2CCCCCCEBEBEBB9B9F3B1B1FFD2D2F3CC CCFFA9A9F3C2C2FF6B6BCC5252C2D273739999DAC28888F329298888DA9999EB E3E3FF8888EBA9A9EBF3F3FFD2D2FFF7B796FC949005E770C2F0F4F7B82899EB 94F741F7FC9490F7B84E6D892D05E770C2F118F7B77BF741F7FC949003EE8803 D600F713EE00016FF7A2E3007DF1C2F164000FF8DF0008402004F7A3A0C40000 1F200C000FF8000000C4000CC40000DF0008000000F713E22A001EC4000CDEFD 30C2F18CF7A10E03EE8803D60000000305E00FC2F1A800E44A05E0F8000032F7 B9C59A3DEC000030001DE803B600C2F1E000CD7C00000900CD5C000000FF92D0 05E10005E17003B600C2F20400CD7CC2F21000F56A033238FFFFFFC2F2780010 260000300021F9000028FF92D0601232FF94D0FF92A005E100F432F805E100C2 F22C66E8880000006021D3FF92D0F432F805E100C2F26C66E94B00000060D91D>]endobj 28 0 obj <>stream xœí} Oi–¶s1Ónó!H ‚Âf0IX&|&\‡5Ù| .FÁËe@_˜ F€Âm#I‡ÉÆÍF ¼?tÏ9ï¥Þ*@fâäö‚ Æ—AçbSHôïÝœiñ×­ôÆ |E ã‹`c±ªw ~~^±Iäo*ô%1Œ/+óŒÕû'6+6Áö³ò3ßBÁxo¨xÌïŸh‘¿B_ƒÁøhÙXœ{2PÜ]ï÷û»Aø¹«ÁøFp3¸Ÿ u‡zçªxƒñm`3Ä¡ýÅÐB¡¹3…¾ ƒñ…н±ØTõ$„xRÅÓúŒoþ`0^UÕ47×gî3ßî÷nãKñÅ•_ }) ãËâ—¿ßߢ©½×Â`0 ˆë}…¾ƒQT³ø3ß(n3ûŒoÑB_ƒÁ( b· } £0ˆ²ñg0¾MDÙø3ß&˜ü Æ7ŠëìûŒooXúŒoi&?ƒñ­àæó ¿_/äã®ü­µ_ð‚~ëë…¾ã7Ÿ·øWz—:7®|×ùžÔëFþÉ|_ôÒÎÇZÏwTè‹`0þA1S/‰òW6®t^¹Ò Mþëyä_?ðùþ—?× —Âäg0.‰ûÀxã †zõn,Zm;{­Ñ÷ïÿ[È¿ñù²L~ãÒ~'(Ÿ¯P °”?=4NÍ=óù’¨¶]¸Nî–ŠkI2ùŒKÂOt¯j©ðw^¿¡üѨ1©¿•ˆbë»V€ë´aý\^ +?ƒqiÜDÅ‚G3”ñ9¿Yï›üA2ß—ÌØö?˜Ïd“Ù$\+?ƒñˆåïÓÑXçw6å¯Öä§:!YhåÏmõ3@~V~ãó0°Ñ¹!Ž&déO+4:(^S…6‹;Tþ7…¸VDi&›Aîù³>îçg0. g°Sµl!@“äÔÂ/Ò}‚ü€ú@ÿd6+²V~㲘Yê\zNGcADgç†$ÿmÝÑ×*óý¬(ùÔögüÙ üŒÏÅÍÅ`pf—‚ ý@AþÃh4-ϱ+a ~D~¬øù²lûŒÏBïÒâRh³Â_ BÀ Èo ?)¿¦~mf¹ŸM²íg0>þÅx|1¾ø!þ!aø$òGÑ}¨üY‹ý…·ýÄþ$Û~ã³P¬ÿP¯Š ,Å—üףј>¥Õ&üÙB“?+J~äüïòZŒlܯB4‰†ô_ôÓL~cX¿™óg}ÉÆ|ãÚèëöð~*mwwyxïã×p:üëÙY8ŽÐgÚÏú_{jFTüPù“IV~ã3ðóœDÕñ c|Ï|¾?(É—ìÅæøº½©ðþ~d?Lã^ ¯6œÏeÀéò*œFàùRûíkÎó¦J!ßÇFôïÉRw]l\øc0.ŒÇOû逹/GõËQ}IÓö'³è¼3™Tþ—­½ìÚOõS¤û€×ÀíÝÿ>ïçOV‡VOV"«4æá“?^:,ÃÔ¸`þ¸èë“I¿;ãâ(Ö?é}ÒÛ;ÛÜ\SÕDLíóŠQ}¶j?xnâþxžòçºà>)ŒJt&ú¯6ä\|xHpÿ%Š?6éýáKöSvFùýã2é—}D8bò3—¿7ê õÂz‚ìŸû'£Øgé½:H’éGÔ8¾ho>±OÔßGþ*âõONVON]~ûס“!|t?ŒÊOQƒØIì›ç"ùÉ÷Ó ¿lR;òñãRh …B+ÐBž„zç~3 ýF²o R(¿Ãö¯ãß—ôO¡‚£éôzƒ¾çgþ£C#'CC@þW-å—ÒI$Ì€AäÏ’ñÏR¹ß¢>+?ƒqÜX‘Qèý-–Óoúœ@Ê÷3™yÛ×ìu%ÒôƒòHÈW¥ò¯"ÅÚ:424´{‚äÔ틤63¾ùµðgù…+ö2Œ‹âþ€ÄÊÊñÿ/­7¶™õ¾,ÖÝl9n^Ⱦþyð°HãWQ×ÑÞíæì¿ündhw„„ÿääDÿ0±¬? ?|á²uvƒ~Ó÷[®„•ŸÁ¸8~(¦FüýÿÆ›NÛïÓõ>‡ò¿ÝGîKáO…SaUëá‚ ŒüjûáW#€¡]Š (þ»ïÎPýQù÷¥ö'ö­Ó…ògÇůÓ0ëêXùŒ‹ãfw1Bñ`eÓxÓÅô'E_ßxÖ$s‚È¿¿Of=œŠDVwÏ^*ú½GvGFliÿè±DP_†½³U•õ§(–XÒß  ~Ö0V~ãsð˜È?V,B¿ÅxÓ-çÝüY[Á¯Qr;ùQ¶w‰æ¹_¥ðCÊOLkþð[úÓ‰ ÿOê¯Ã`üçUo_"ѧËj–Ä_¬èa]+?ƒqq<öuwûíÊŸWíOf{¨ânöóß½Šäߗ‰h½>¢Z?æûCÄSú‡FýÉõ[oìb¹ÈIääe¿êÓ0®ËýjjU‹`åg0.·€äÿ@…ñ^žîõ³Rû Û?Ü¿ M°×zg;ù‡PÞIù²ÞÙCê¿Bã?tbô…_î6ŒöŸ:û¦ˆúBû1Ð"ž¬ü ÆgÀß]è®Gþ#û7'´›å>_6LÿÞÕ« I}ª÷åŒ÷ND±ì=ÁzãT ?ÕûOÞ}âÅjî ågÅg0.çâ›þz’ÿâ çZ åÙÏ¿Qgâ*¥ü²à×`¾Òä¦b?°ý­¥ð¹·Èþ·ôŽóý„é´˜‡œØ×ƒ¦Ÿ'ô0Ÿ¿±¼¿ ù³¦ïÏŸÏ?ÂÒ/¹i6ß;¥þ!)ü#µÞQÊ/»úWëg££Ín£€ Èr¿˜Ù“dåg0>é3Ù_ßíF~£“?ébûß_¥”_VüÃ~¥ò á7ëýôRÒÿDŒðÇ©½‘ðnÿiUc|Øö3Ÿ‹XßðþŸ-úÍ8O±­á—Í_Ìc„_Ò?’Ûß=#é—"ÿÖHúÿ›Ê}¤üb€¿œÜüO¥vïæ\/7#†øeiF?Oèa0.ëÑ´wÂoÙŸ¯üz4 ÖûòÉß|ÕÈù#‘HûIûnûî¶³wgTî“Å~hVfŸÃ”_)ÿÍ ¾4-(Ùop+ŒÓ¼½€/“ŸÁ¸q±®–– „fÿŒó,Û~.ä§^þ„®ö›Ëøà„>Tþ!9Êgä­Áè¿êœ_ð%åËñ½)ç„~‚ZɇÆösÎÏ`\bîîf ÂbÿŒó´‘¿áêUQï¾GçÍÓ}ò“!1ÆG)¿9ÌÇÈù‡TÒ/föÐJ@ûûgy—lüàjšóN`0‡\¤s`ÐßüY‹û.ýüS ´ýªÚŸ@ÛNÚ/çõœ¨‚ñß\ÐkïJùMåˆ~`üö^C„îê˰ò3—…Z¤³bsSð_°¿þ†óDSùÝ ~ V¹’~þ”X¿/,øIåG¡·­æ·÷VŒÔ·ôÐËy8Ù­”?Ë9?ƒqY(î?ž©ûÏU~Ëõ»ÙþI³Ú/&öÐ^±Ž‡˜²«¤ß¾”gî?‡dÊ¿z"‚)D(?.äçø­ŒZÊGäülûŒ ã0z]ùgff*Èúûgœ§ZÕ~*÷çð›Õ~k”ϼ´ý‘°š×£êýNò{½§ÿI¿Ö}±–Ìùû Ǩ}]ìϰò3—BßmuWŽŸgfn û+Ðø»“ß>³'o„_s¾ò‹¥|(é²ÿ<ò{ñž# ü/UüHøi^ŸsÔÀ¸X»;ÃÕ~ã’°îÁûóù'>Jþlþ:E??P_Tûç§§kÐöâpÎõœ¿;‘®^ÌçO!õ÷‰œíùÊß®gõ‘úæÊ{©ˆUïK$–moÊÛu‰A>¬ü ÆE¡ïŸ®æÆïåüëæb^Ùd&ï뎤í—+ùØjt¹ß£»wz:<üÓÙÙªÉâZ¾“ï†ï´/ù›‘KyHåŸü¤ÿ\ƒ!q]õñ#€ø7ˆûçVû¬•2if ꃜu ñ“S{‘ý~ãûXÆ;ûixô•}a®W¿þôŽº÷iBϪ¹’O¿Èùé ¯:rþ.P~ZFL(¿ìyàî~ãÓPm¸þDz§]ÿ„ë¿ucJ/®Ü]:utw»+c¸ûVáûåœÞýˆõVƒ^»ŸîÌ1¢~{ÿðoâ^]«ÏDÂäÏÙ®¥±Tß±'‰~¤±}ª6yð·øWa0¾ÜÖwáõz®æ›ÂŸ?¯Ù6+í=Xt›²ÎÈIòÓHŸÈ~*%Ù¿&‡í…Qßi!ÏœúÈ«= Ÿ`Ý‘{]?Ú~rýÖÚÝ„F½x¯yûàäßè†ÁøÊÑ­¶Rþ_**Ôð^Êøëýÿ7ï>›ôc;ÊïkãŒvs˜ÎÇ 7Œö¾”ÔÇÁ{â†\Æ*^'CrmO9£'<šÃ?ï5¤tOÖûS{ÚEO_FŒñÑø[þó0_/Ž>ïÍŠMIý‰s¦ôz3ö™=”rÛoו벆øÒŒ~q“nû}ºWmkôâÊž«òîÜrdßnûnX ðÙÜ/áè7œ”Â/”_oÓã«EµYïÚcÓsúüÝ3y¨±I?òÍ·mÎÍ‘îí£Ûõí«™}4Ä_êÿÉIÎøDîäÄä¾ÝgõóEð wíWâmÜÇ‘ý>¾cƒqA˜äÿ¹¥E®å1¡–ñšÉûÀ¤©üú>½öþþvYò»º/²~âp8bQ(n/Üë„_Ýw>¢—ñÀé¼h$rÎk—Âï3oÒËýý Æ'!jÿ—‰–‰½ŠW½¿¾Û…ü9Û=»ô}zí'Í'(ë$ôr>á”pþ’ú«Î¹w«Öd¾°^ÄCÌé‘ý|ùƒZ³êf]jØnÜßÏ`| ¢FOß ÿ6Å}¼oOÞžŽå<|IºQ¯“ü¹°ãK¦ù}b–®S÷»V¾§¤ÂÒò§h= ü®¿æ}Ä»7žµ:ú4Ú?÷ß„Áø&`*ÿ¦céÞn—›vÞ›Ê/´?›qŽá?KÐðþ«2éW{åb~n#ýÞ™sø#j6_Šfó%ö#®“&3bÙn›i½ü¿ƒñ á¶EþÇzÝîz¡ûn·ëäžÔ÷ɂ޸º£ÒËôòNÝ)¹œW$üSÎõRŽ„á§•»ÂF­…?õNy±Ž‡-áQ> ƧÀPþ›@yâ=4y«¾üu"r]û‘üI`¿Ë Úá”è—Py?!Ü;÷bFOÔŠ½ÒóGhh_äìü¹“ìp°i?“ŸÁøD«£êf-HzÁüzy—î7åÕd²–öÌ¿vP:ÚŽºäO…çwï~däýéðÙ‰òü4¶/uÒ_°aªÖ”ýÄñòƒß?ŸÁ`bzxïc}{nIý±âWå>>::ZoþØŒýWk¯ÖÄj>Ÿ|Qê§á½Â\^Î'žÎ`0ƒQq·¯÷—n…1BqñÀÀÊïŸÁ`üCã ø~q´9f˜Ügò3_/¢Ñè!î×kæ÷WZ }y ãï…ê¨XÊç9¾˜hOªÜ…˜ü ÆW‹¾¨ä7t/–¢~Áäg0¾^û¯{½cHxE|IýÞ¹‰B_ƒÁø»!Åš_Eh%´‚¬³/˜êí›cåg0¾b ‚ôGBÈþf>P¸ÏÊÏ`|ÕÀ¬ÿ@wÚˆø`ø‘úMMþB_ƒÁø{¥ÿ7ú^¤}¯Ð|ä~0(ˆÇk  Ø`D‡öí×­ØÚ·Û[U;/$`4 ‡ý1íÙ÷hýÿÄÿm1¸ º¿|'€þz«îá`90>FB=»S‚ìóîÌvô:hØp%FŠ’ÙXÚOe-#¯C;à-¸³0ˆ~¿£Ž–¯ë0Ïi[hÃìÂû¢Òƒ!¡­r– ±J¢}Y]ú‚­…E”Q<ž‹åü–æ›Òo ì™MÐ<½G> }®öŸ>85èoñœ8ß¼ö Ù­h¿$‡‡ØÐ¬K7 Žá@÷©MXE÷#hÃJûG%ñiwËlŠñ¸5yKcRøIý~;é—÷‘ößOM‚ðO~?e6EðÈ{`?6ê#í[‘îÛí†%  6¤=vÏZ%ÿéÙ >0_qý˜žk„-˜·”ŸœB#n©šFxn´¸ßˆÜo´´ß&þëkmD×Ú ŽDÄGšÙáàGhHtr?RC¼/ŦP|—dÇnÄthÁ}â|¾ê)U„—ÜïÁ嬀ö¸¨º‚,nÂøp‡/ðöZ´è…XçÒ"ÿÅÅ¥xü7,ûýWÓ"ÙýÅÅà´ ù©Âm«{8‹‘òw$?p\áNݬ`{Ñ2à¡é‚ž:.£W]ûï -ðUvà7¥á é“uóœ’_Í=ôõÓ 1V½;++ñ¯áÃø±jØÅ.B}—(3viÒ~öôþÁyÚo×} þÞšMøÅ4gü›=pŠ?i¿Hš…ðÛÄŸ( •²¥ûÃnÀÝ~up«ßˆyªßO´¿µ,èkR‡bÿÔÔ䔡ü¦P1`Usaý¿ßކ͖´£êߤð‹½]÷Qõå^„€VKôÿÏ5ØTN`—}|Týy¢;<”ú7ZÍzì'í·YýÒ5°é>„‚kZ÷1àëT@(ÿÔý§OÇŸ"åi/--5%ßd$  ‚~´ÿúÔ”ð‹-ké?ŸêÿúǽKAäz$þŽþöaì>¼ ;ƒ6ò— ¦nÕŸ1⸠‘gyžö*ëLò×S…š;•m·­c«Þh¥çE>ùÓm•Èö¨`;üNG”XN¢m–ªJ ñ³fÁàSèoùý\^[ÚEûÅÞ]û ö›ªoj¿®4ÛËk¦ò?²ë¾Ò~Cù×µÝ?’H?,µ_‰¿Cûï’ðdXÖz/›¤~¿aü%ó—…ç—Ú?)ÔßÔ} (÷ úÀý)Ãú;tÉßÞJÛ¶!üZ÷Û¡µ¶Ãó±6Rú•ë—–_ÿXk¿|¨ÂÀ<ÑÞR~“þ û5]`ìÊoñ^»WíWºÄ¿&ŒÿS²ü:ï?Ê/Ô_˜~|HÖKá—q€èýC)Ñ^k¿f¿”~8øAZ±vµd~’¨/´ö —Ÿ•¼'êÓß²šüõÀsäz0ø¯ÿGûýñ½Øè„f#êô½Ù鯄ò{ªù%ëbH¢K ò÷É¿Ùu\uü-²ÇŠ®ÏzòÈß7}{‡¾IüŠ·dzº#`½”D¼úð½@삾ߌ.Å?þ¼"à=öÎ×þ½SS÷Úß,ÙeßEù­ò_3é¾~<Àl)¿®Ú]­ûÃ:ëwhÿ­~Cùïjí_6ó}ñ÷kí—•ïʯ´_Å€×È{tû–÷ÝŸ²åû¢¡÷Ý*”¿µÝ,á[[-ÁoÕOZûI÷üHÿg†æ«ä=¥ü˜üká×A e…€®FWt5v]k¼ÖUÛu­ËUûµî“í¿&…_Š>=¿Mè?E’~ÓúK`©öãš÷ãvíÏëïùAi&©š¢¿ÔþŒÖ~"¾Èõ³Û X ±òG4ÿÑ¿,mtv¯t^±‘ŸJóŽ-¨¬M“Á®ö´íx0 zh7íÑl‘ßëé»;1›'­óp£Eõ‹Ù<òÇ*ËËMò{^D©œ¯È§:–Æ«óP ©óô]LùÍBŸ“úJûEÕ/m¯ùS;GûAùO䷴ߪó­iöËðHª¿¡ÿGÍ–ö7«¼_è¾,õ©@0_i¿æ¿%ýH}þ»†õy¿~Ò}§òkö[¼'íŸt~Ù€1€lD€©ísŠ}ÛDúvÊûÛ-í?&ío•vÍ¿`¾!ýó¸ÕKÅ—ûg¦öÏ+áGç¯6Óù§„ô7Ú­€Úk°á£K‰¿Mû­Œ™MýI÷§ïÔíéSÅþ[ѯÔHdª?Žâ/ÆõÇ•ç_ú„Û·©D⟥[júä--Í‚ßãP'ð|ã xüà*þŸ¢èþ£þËÿÿ°ñ ºïknm"}O“òƒ°W")Óƒ“-$#ïê<1'ùït”‹à±Yzñf]™†(ìÚòÈuJÛeRoYâ xÚðc垎 uõÙ‚€KÏŸ—”ß)þB÷õ]´ß©ûμÿ•tkpdïÌKüåi¿Ðÿõ#;ý…0µßVï7´_øÿ~³âÒ¯u_)¿ ·–ÏÑþ)ËX1à{¡ý´ÕñÚöŸ„[$þöÎ@$;Ðÿeë±ØTõï™,ø¡òߟKñŸ¯12~É|!ùêXûS5–æKÆ+÷/F¨íïß…´wA+hç/»~|o6Jd’þ÷¥FÞ/CÀ¸¦©©û¢Ê/{þ¤ ûb‹¼3¬Tÿ¬ ½Èû…óÏêq×¹•.@ü?ß²qeãÊ•ÎNÜÑ3Ä‚¥ùcuTàv´Z÷»‰ìÚã½#l¬ˆXX$U˜̦¤Ü´ý^ÙùîU¹|ò£“Ç‚ßV>ùÛ:›–Ah:0h¼„ÏâW÷Űᢠûí!À .Í=çGíß;gðO>ý8JþÍkhûÖ_Ëÿš~›ö«´ÝMùlõþa©ûŽa?*Õ¿%^P@‰ÿ¤j’úùÚ?µl)ÿ¤*øOé^?5ö=?Ù}cô=(Û/ˆ/°-+ôLº/©ÿRåüÊjŽçIúíŸÊ/çµù¯‘Ù¾­æ§´^°¿F¿@î×BÂÔ'þ»û±èÿãÁ5£äoÚcèÏ{½·[YúÏH¿/[©æ½Ùß/¸}~=¢¨€LþÅÞÒ~!öº»ÏVðc˜’ïJû´-íÇç´QíÏÙ´_qÝÅø“'x`y¿ÃøËœ_ê>>ÖuÙïÐ…ß>pØÔKû‡UÍßÈûupKÕþßAøûoYù¾Nío˜4h?)Šþ“†ðË1>$ýTó±À>þOdþdÿ[·[e ÀìÓ. ~/)÷©„_Sÿeÿ ÿŠþRþíÊߨò~Êú)é@•üæÍ í>\#×ßEY?…gÚoØ~=ÔGþM²_û\¤ýOu¹ÏðýôœQIáû5ý3Õá×#R~â;²_åüTû3 R¤ü¢»O0ßÇ÷±wEîñ7µÏÒþ:ówjÿš«ö»´WfÞoô£@Ð,¿ììü_äû‚þ„ñu‡ö÷ëš¿‘÷[)¿½Ãó}cدCÿyÿ”îó³úù•ù—%ÿ)ìé{=eËù ío•UÿV™ðËÑ>ªòGy»RûgÇVŸŽç­¿Çbä¯ÕõW£³ÿFÕÝ'Jïßj÷Iþ‰÷Ž´ëý.ôWÂ/ºûóéo9Ô~‹ýV©Ÿ^«:¿òšû2ûÏHÐ#¶¬ä~ÖªøgDÕ¯ÇR~à'ºûðQhž1 ƒÁ`0 ƒÁ`0 ƒÁø\üƒÔ endstream endobj 39 0 obj <> endobj 40 0 obj <> endobj 41 0 obj <> endobj 46 0 obj [/Indexed /DeviceRGB 255 <000000FF00006B6BD2FFFFFF666666FF66667B7B7B6666C24A4AB96B6B6B4242 B1F30000FF9090B1B1DA888888737373B1A1A1FFB1B1CC6B6B181818FF33337B 7BCC6666B9E33333B9B9B99090D2DADADA8888CCB98888FFC2C2424242E37B7B FFE3E3DA9999FF1818FF7B7BEB2121B1B1EBFF4A4A8080D2C2C2E3A9A9A93333 33F33333D252529090E3DADAF3CCCCEBEB1818FFA1A1999999A1A1DAB99090FF D2D2525252EBA9A98080E3A1A1E3EBEBF3080808FF08087B7BD2FF73737373C2 5A5AB9B1B1B1292929FF4242E34242C2C2C2E3E3E3DADAEBF38888FFF3F3EB90 90FF2929FF8888C2C2EBB1B1F3FF5A5AD2D2D2EB4242E34A4A9999F3CCCCF3A1 A1F3C2C2F37373D2FF6B6B8080806B6BC26666CC5252B94A4AB1FF9999B9B9E3 B1B1E3909090B1A9A9FFB9B9D26B6BCC7373212121FF39398080CCE339399999 D29090DAC28080FFCCCC4A4A4AE38080FFEBEBFF2121FF8080F32121B9B9EBFF 52528888D28080DA393939DA4A4A9999E39090EBE3E3F3DADAFFD2D2EBF31010 FFA9A9A1A1A1A9A9DAB99999FFDADA5A5A5A8888E3A9A9E3A1A1EBF3F3F3EBEB FF101010FF10107B7BDA7373CC5A5AC2CCCCCCEBEBEBB9B9F3B1B1FFD2D2F3CC CCFFA9A9F3C2C2FF6B6BCC5252C2D273739999DAC28888F329298888DA9999EB E3E3FF8888EBA9A9EBF3F3FFD2D2FFF7B796FC949005E770C2F0F4F7B82899EB 94F741F7FC9490F7B84E6D892D05E770C2F118F7B77BF741F7FC949003EE8803 D600F713EE00016FF7A2E3007DF1C2F164000FF8DF0008402004F7A3A0C40000 1F200C000FF8000000C4000CC40000DF0008000000F713E22A001EC4000CDEFD 30C2F18CF7A10E03EE8803D60000000305E00FC2F1A800E44A05E0F8000032F7 B9C59A3DEC000030001DE803B600C2F1E000CD7C00000900CD5C000000FF92D0 05E10005E17003B600C2F20400CD7CC2F21000F56A033238FFFFFFC2F2780010 260000300021F9000028FF92D0601232FF94D0FF92A005E100F432F805E100C2 F22C66E8880000006021D3FF92D0F432F805E100C2F26C66E94B00000060D91D>]endobj 45 0 obj <>stream xœí} Oi–¶s1Ónó!H ‚Âf0IX&|&\‡5Ù| .FÁËe@_˜ F€Âm#I‡ÉÆÍF ¼?tÏ9ï¥Þ*@fâäö‚ Æ—AçbSHôïÝœiñ×­ôÆ |E ã‹`c±ªw ~~^±Iäo*ô%1Œ/+óŒÕû'6+6Áö³ò3ßBÁxo¨xÌïŸh‘¿B_ƒÁøhÙXœ{2PÜ]ï÷û»Aø¹«ÁøFp3¸Ÿ u‡zçªxƒñm`3Ä¡ýÅÐB¡¹3…¾ ƒñ…н±ØTõ$„xRÅÓúŒoþ`0^UÕ47×gî3ßî÷nãKñÅ•_ }) ãËâ—¿ßߢ©½×Â`0 ˆë}…¾ƒQT³ø3ß(n3ûŒoÑB_ƒÁ( b· } £0ˆ²ñg0¾MDÙø3ß&˜ü Æ7ŠëìûŒooXúŒoi&?ƒñ­àæó ¿_/äã®ü­µ_ð‚~ëë…¾ã7Ÿ·øWz—:7®|×ùžÔëFþÉ|_ôÒÎÇZÏwTè‹`0þA1S/‰òW6®t^¹Ò Mþëyä_?ðùþ—?× —Âäg0.‰ûÀxã †zõn,Zm;{­Ñ÷ïÿ[È¿ñù²L~ãÒ~'(Ÿ¯P °”?=4NÍ=óù’¨¶]¸Nî–ŠkI2ùŒKÂOt¯j©ðw^¿¡üѨ1©¿•ˆbë»V€ë´aý\^ +?ƒqiÜDÅ‚G3”ñ9¿Yï›üA2ß—ÌØö?˜Ïd“Ù$\+?ƒñˆåïÓÑXçw6å¯Öä§:!YhåÏmõ3@~V~ãó0°Ñ¹!Ž&déO+4:(^S…6‹;Tþ7…¸VDi&›Aîù³>îçg0. g°Sµl!@“äÔÂ/Ò}‚ü€ú@ÿd6+²V~㲘Yê\zNGcADgç†$ÿmÝÑ×*óý¬(ùÔögüÙ üŒÏÅÍÅ`pf—‚ ý@AþÃh4-ϱ+a ~D~¬øù²lûŒÏBïÒâRh³Â_ BÀ Èo ?)¿¦~mf¹ŸM²íg0>þÅx|1¾ø!þ!aø$òGÑ}¨üY‹ý…·ýÄþ$Û~ã³P¬ÿP¯Š ,Å—üףј>¥Õ&üÙB“?+J~äüïòZŒlܯB4‰†ô_ôÓL~cX¿™óg}ÉÆ|ãÚèëöð~*mwwyxïã×p:üëÙY8ŽÐgÚÏú_{jFTüPù“IV~ã3ðóœDÕñ c|Ï|¾?(É—ìÅæøº½©ðþ~d?Lã^ ¯6œÏeÀéò*œFàùRûíkÎó¦J!ßÇFôïÉRw]l\øc0.ŒÇOû逹/GõËQ}IÓö'³è¼3™Tþ—­½ìÚOõS¤û€×ÀíÝÿ>ïçOV‡VOV"«4æá“?^:,ÃÔ¸`þ¸èë“I¿;ãâ(Ö?é}ÒÛ;ÛÜ\SÕDLíóŠQ}¶j?xnâþxžòçºà>)ŒJt&ú¯6ä\|xHpÿ%Š?6éýáKöSvFùýã2é—}D8bò3—¿7ê õÂz‚ìŸû'£Øgé½:H’éGÔ8¾ho>±OÔßGþ*âõONVON]~ûס“!|t?ŒÊOQƒØIì›ç"ùÉ÷Ó ¿lR;òñãRh …B+ÐBž„zç~3 ýF²o R(¿Ãö¯ãß—ôO¡‚£éôzƒ¾çgþ£C#'CC@þW-å—ÒI$Ì€AäÏ’ñÏR¹ß¢>+?ƒqÜX‘Qèý-–Óoúœ@Ê÷3™yÛ×ìu%ÒôƒòHÈW¥ò¯"ÅÚ:424´{‚äÔ틤63¾ùµðgù…+ö2Œ‹âþ€ÄÊÊñÿ/­7¶™õ¾,ÖÝl9n^Ⱦþyð°HãWQ×ÑÞíæì¿ündhw„„ÿääDÿ0±¬? ?|á²uvƒ~Ó÷[®„•ŸÁ¸8~(¦FüýÿÆ›NÛïÓõ>‡ò¿ÝGîKáO…SaUëá‚ ŒüjûáW#€¡]Š (þ»ïÎPýQù÷¥ö'ö­Ó…ògÇůÓ0ëêXùŒ‹ãfw1Bñ`eÓxÓÅô'E_ßxÖ$s‚È¿¿Of=œŠDVwÏ^*ú½GvGFliÿè±DP_†½³U•õ§(–XÒß  ~Ö0V~ãsð˜È?V,B¿ÅxÓ-çÝüY[Á¯Qr;ùQ¶w‰æ¹_¥ðCÊOLkþð[úÓ‰ ÿOê¯Ã`üçUo_"ѧËj–Ä_¬èa]+?ƒqq<öuwûíÊŸWíOf{¨ânöóß½Šäߗ‰h½>¢Z?æûCÄSú‡FýÉõ[oìb¹ÈIääe¿êÓ0®ËýjjU‹`åg0.·€äÿ@…ñ^žîõ³Rû Û?Ü¿ M°×zg;ù‡PÞIù²ÞÙCê¿Bã?tbô…_î6ŒöŸ:û¦ˆúBû1Ð"ž¬ü ÆgÀß]è®Gþ#û7'´›å>_6LÿÞÕ« I}ª÷åŒ÷ND±ì=ÁzãT ?ÕûOÞ}âÅjî ågÅg0.çâ›þz’ÿâ çZ åÙÏ¿Qgâ*¥ü²à×`¾Òä¦b?°ý­¥ð¹·Èþ·ôŽóý„é´˜‡œØ×ƒ¦Ÿ'ô0Ÿ¿±¼¿ ù³¦ïÏŸÏ?ÂÒ/¹i6ß;¥þ!)ü#µÞQÊ/»úWëg££Ín£€ Èr¿˜Ù“dåg0>é3Ù_ßíF~£“?ébûß_¥”_VüÃ~¥ò á7ëýôRÒÿDŒðÇ©½‘ðnÿiUc|Øö3Ÿ‹XßðþŸ-úÍ8O±­á—Í_Ìc„_Ò?’Ûß=#é—"ÿÖHúÿ›Ê}¤üb€¿œÜüO¥vïæ\/7#†øeiF?Oèa0.ëÑ´wÂoÙŸ¯üz4 ÖûòÉß|ÕÈù#‘HûIûnûî¶³wgTî“Å~hVfŸÃ”_)ÿÍ ¾4-(Ùop+ŒÓ¼½€/“ŸÁ¸q±®–– „fÿŒó,Û~.ä§^þ„®ö›Ëøà„>Tþ!9Êgä­Áè¿êœ_ð%åËñ½)ç„~‚ZɇÆösÎÏ`\bîîf ÂbÿŒó´‘¿áêUQï¾GçÍÓ}ò“!1ÆG)¿9ÌÇÈù‡TÒ/föÐJ@ûûgy—lüàjšóN`0‡\¤s`ÐßüY‹û.ýüS ´ýªÚŸ@ÛNÚ/çõœ¨‚ñß\ÐkïJùMåˆ~`üö^C„îê˰ò3—…Z¤³bsSð_°¿þ†óDSùÝ ~ V¹’~þ”X¿/,øIåG¡·­æ·÷VŒÔ·ôÐËy8Ù­”?Ë9?ƒqY(î?ž©ûÏU~Ëõ»ÙþI³Ú/&öÐ^±Ž‡˜²«¤ß¾”gî?‡dÊ¿z"‚)D(?.äçø­ŒZÊGäülûŒ ã0z]ùgff*Èúûgœ§ZÕ~*÷çð›Õ~k”ϼ´ý‘°š×£êýNò{½§ÿI¿Ö}±–Ìùû Ǩ}]ìϰò3—BßmuWŽŸgfn û+Ðø»“ß>³'o„_s¾ò‹¥|(é²ÿ<ò{ñž# ü/UüHøi^ŸsÔÀ¸X»;ÃÕ~ã’°îÁûóù'>Jþlþ:E??P_Tûç§§kÐöâpÎõœ¿;‘®^ÌçO!õ÷‰œíùÊß®gõ‘úæÊ{©ˆUïK$–moÊÛu‰A>¬ü ÆE¡ïŸ®æÆïåüëæb^Ùd&ï뎤í—+ùØjt¹ß£»wz:<üÓÙÙªÉâZ¾“ï†ï´/ù›‘KyHåŸü¤ÿ\ƒ!q]õñ#€ø7ˆûçVû¬•2if ꃜu ñ“S{‘ý~ãûXÆ;ûixô•}a®W¿þôŽº÷iBϪ¹’O¿Èùé ¯:rþ.P~ZFL(¿ìyàî~ãÓPm¸þDz§]ÿ„ë¿ucJ/®Ü]:utw»+c¸ûVáûåœÞýˆõVƒ^»ŸîÌ1¢~{ÿðoâ^]«ÏDÂäÏÙ®¥±Tß±'‰~¤±}ª6yð·øWa0¾ÜÖwáõz®æ›ÂŸ?¯Ù6+í=Xt›²ÎÈIòÓHŸÈ~*%Ù¿&‡í…Qßi!ÏœúÈ«= Ÿ`Ý‘{]?Ú~rýÖÚÝ„F½x¯yûàäßè†ÁøÊÑ­¶Rþ_**Ôð^Êøëýÿ7ï>›ôc;ÊïkãŒvs˜ÎÇ 7Œö¾”ÔÇÁ{â†\Æ*^'CrmO9£'<šÃ?ï5¤tOÖûS{ÚEO_FŒñÑø[þó0_/Ž>ïÍŠMIý‰s¦ôz3ö™=”rÛoו벆øÒŒ~q“nû}ºWmkôâÊž«òîÜrdßnûnX ðÙÜ/áè7œ”Â/”_oÓã«EµYïÚcÓsúüÝ3y¨±I?òÍ·mÎÍ‘îí£Ûõí«™}4Ä_êÿÉIÎøDîäÄä¾ÝgõóEð wíWâmÜÇ‘ý>¾cƒqA˜äÿ¹¥E®å1¡–ñšÉûÀ¤©üú>½öþþvYò»º/²~âp8bQ(n/Üë„_Ýw>¢—ñÀé¼h$rÎk—Âï3oÒËýý Æ'!jÿ—‰–‰½ŠW½¿¾Û…ü9Û=»ô}zí'Í'(ë$ôr>á”pþ’ú«Î¹w«Öd¾°^ÄCÌé‘ý|ùƒZ³êf]jØnÜßÏ`| ¢FOß ÿ6Å}¼oOÞžŽå<|IºQ¯“ü¹°ãK¦ù}b–®S÷»V¾§¤ÂÒò§h= ü®¿æ}Ä»7žµ:ú4Ú?÷ß„Áø&`*ÿ¦céÞn—›vÞ›Ê/´?›qŽá?KÐðþ«2éW{åb~n#ýÞ™sø#j6_Šfó%ö#®“&3bÙn›i½ü¿ƒñ á¶EþÇzÝîz¡ûn·ëäžÔ÷ɂ޸º£ÒËôòNÝ)¹œW$üSÎõRŽ„á§•»ÂF­…?õNy±Ž‡-áQ> ƧÀPþ›@yâ=4y«¾üu"r]û‘üI`¿Ë Úá”è—Py?!Ü;÷bFOÔŠ½ÒóGhh_äìü¹“ìp°i?“ŸÁøD«£êf-HzÁüzy—î7åÕd²–öÌ¿vP:ÚŽºäO…çwï~däýéðÙ‰òü4¶/uÒ_°aªÖ”ýÄñòƒß?ŸÁ`bzxïc}{nIý±âWå>>::ZoþØŒýWk¯ÖÄj>Ÿ|Qê§á½Â\^Î'žÎ`0ƒQq·¯÷—n…1BqñÀÀÊïŸÁ`üCã ø~q´9f˜Ügò3_/¢Ñè!î×kæ÷WZ }y ãï…ê¨XÊç9¾˜hOªÜ…˜ü ÆW‹¾¨ä7t/–¢~Áäg0¾^û¯{½cHxE|IýÞ¹‰B_ƒÁø»!Åš_Eh%´‚¬³/˜êí›cåg0¾b ‚ôGBÈþf>P¸ÏÊÏ`|ÕÀ¬ÿ@wÚˆø`ø‘úMMþB_ƒÁø{¥ÿ7ú^¤}¯Ð|ä~0(ˆÇk  Ø`D‡öí×­ØÚ·Û[U;/$`4 ‡ý1íÙ÷hýÿÄÿm1¸ º¿|'€þz«îá`90>FB=»S‚ìóîÌvô:hØp%FŠ’ÙXÚOe-#¯C;à-¸³0ˆ~¿£Ž–¯ë0Ïi[hÃìÂû¢Òƒ!¡­r– ±J¢}Y]ú‚­…E”Q<ž‹åü–æ›Òo ì™MÐ<½G> }®öŸ>85èoñœ8ß¼ö Ù­h¿$‡‡ØÐ¬K7 Žá@÷©MXE÷#hÃJûG%ñiwËlŠñ¸5yKcRøIý~;é—÷‘ößOM‚ðO~?e6EðÈ{`?6ê#í[‘îÛí†%  6¤=vÏZ%ÿéÙ >0_qý˜žk„-˜·”ŸœB#n©šFxn´¸ßˆÜo´´ß&þëkmD×Ú ŽDÄGšÙáàGhHtr?RC¼/ŦP|—dÇnÄthÁ}â|¾ê)U„—ÜïÁ嬀ö¸¨º‚,nÂøp‡/ðöZ´è…XçÒ"ÿÅÅ¥xü7,ûýWÓ"ÙýÅÅà´ ù©Âm«{8‹‘òw$?p\áNݬ`{Ñ2à¡é‚ž:.£W]ûï -ðUvà7¥á é“uóœ’_Í=ôõÓ 1V½;++ñ¯áÃø±jØÅ.B}—(3viÒ~öôþÁyÚo×} þÞšMøÅ4gü›=pŠ?i¿Hš…ðÛÄŸ( •²¥ûÃnÀÝ~up«ßˆyªßO´¿µ,èkR‡bÿÔÔ䔡ü¦P1`Usaý¿ßކ͖´£êߤð‹½]÷Qõå^„€VKôÿÏ5ØTN`—}|Týy¢;<”ú7ZÍzì'í·YýÒ5°é>„‚kZ÷1àëT@(ÿÔý§OÇŸ"åi/--5%ßd$  ‚~´ÿúÔ”ð‹-ké?ŸêÿúǽKAäz$þŽþöaì>¼ ;ƒ6ò— ¦nÕŸ1⸠‘gyžö*ëLò×S…š;•m·­c«Þh¥çE>ùÓm•Èö¨`;üNG”XN¢m–ªJ ñ³fÁàSèoùý\^[ÚEûÅÞ]û ö›ªoj¿®4ÛËk¦ò?²ë¾Ò~Cù×µÝ?’H?,µ_‰¿Cûï’ðdXÖz/›¤~¿aü%ó—…ç—Ú?)ÔßÔ} (÷ úÀý)Ãú;tÉßÞJÛ¶!üZ÷Û¡µ¶Ãó±6Rú•ë—–_ÿXk¿|¨ÂÀ<ÑÞR~“þ û5]`ìÊoñ^»WíWºÄ¿&ŒÿS²ü:ï?Ê/Ô_˜~|HÖKá—q€èýC)Ñ^k¿f¿”~8øAZ±vµd~’¨/´ö —Ÿ•¼'êÓß²šüõÀsäz0ø¯ÿGûýñ½Øè„f#êô½Ù鯄ò{ªù%ëbH¢K ò÷É¿Ùu\uü-²ÇŠ®ÏzòÈß7}{‡¾IüŠ·dzº#`½”D¼úð½@삾ߌ.Å?þ¼"à=öÎ×þ½SS÷Úß,ÙeßEù­ò_3é¾~<Àl)¿®Ú]­ûÃ:ëwhÿ­~Cùïjí_6ó}ñ÷kí—•ïʯ´_Å€×È{tû–÷ÝŸ²åû¢¡÷Ý*”¿µÝ,á[[-ÁoÕOZûI÷üHÿg†æ«ä=¥ü˜üká×A e…€®FWt5v]k¼ÖUÛu­ËUûµî“í¿&…_Š>=¿Mè?E’~ÓúK`©öãš÷ãvíÏëïùAi&©š¢¿ÔþŒÖ~"¾Èõ³Û X ±òG4ÿÑ¿,mtv¯t^±‘ŸJóŽ-¨¬M“Á®ö´íx0 zh7íÑl‘ßëé»;1›'­óp£Eõ‹Ù<òÇ*ËËMò{^D©œ¯È§:–Æ«óP ©óô]LùÍBŸ“úJûEÕ/m¯ùS;GûAùO䷴ߪó­iöËðHª¿¡ÿGÍ–ö7«¼_è¾,õ©@0_i¿æ¿%ýH}þ»†õy¿~Ò}§òkö[¼'íŸt~Ù€1€lD€©ísŠ}ÛDúvÊûÛ-í?&ío•vÍ¿`¾!ýó¸ÕKÅ—ûg¦öÏ+áGç¯6Óù§„ô7Ú­€Úk°á£K‰¿Mû­Œ™MýI÷§ïÔíéSÅþ[ѯÔHdª?Žâ/ÆõÇ•ç_ú„Û·©D⟥[júä--Í‚ßãP'ð|ã xüà*þŸ¢èþ£þËÿÿ°ñ ºïknm"}O“òƒ°W")Óƒ“-$#ïê<1'ùït”‹à±Yzñf]™†(ìÚòÈuJÛeRoYâ xÚðc垎 uõÙ‚€KÏŸ—”ß)þB÷õ]´ß©ûμÿ•tkpdïÌKüåi¿Ðÿõ#;ý…0µßVï7´_øÿ~³âÒ¯u_)¿ ·–ÏÑþ)ËX1à{¡ý´ÕñÚöŸ„[$þöÎ@$;Ðÿeë±ØTõï™,ø¡òߟKñŸ¯12~É|!ùêXûS5–æKÆ+÷/F¨íïß…´wA+hç/»~|o6Jd’þ÷¥FÞ/CÀ¸¦©©û¢Ê/{þ¤ ûb‹¼3¬Tÿ¬ ½Èû…óÏêq×¹•.@ü?ß²qeãÊ•ÎNÜÑ3Ä‚¥ùcuTàv´Z÷»‰ìÚã½#l¬ˆXX$U˜̦¤Ü´ý^ÙùîU¹|ò£“Ç‚ßV>ùÛ:›–Ah:0h¼„ÏâW÷Űᢠûí!À .Í=çGíß;gðO>ý8JþÍkhûÖ_Ëÿš~›ö«´ÝMùlõþa©ûŽa?*Õ¿%^P@‰ÿ¤j’úùÚ?µl)ÿ¤*øOé^?5ö=?Ù}cô=(Û/ˆ/°-+ôLº/©ÿRåüÊjŽçIúíŸÊ/çµù¯‘Ù¾­æ§´^°¿F¿@î×BÂÔ'þ»û±èÿãÁ5£äoÚcèÏ{½·[YúÏH¿/[©æ½Ùß/¸}~=¢¨€LþÅÞÒ~!öº»ÏVðc˜’ïJû´-íÇç´QíÏÙ´_qÝÅø“'x`y¿ÃøËœ_ê>>ÖuÙïÐ…ß>pØÔKû‡UÍßÈûupKÕþßAøûoYù¾Nío˜4h?)Šþ“†ðË1>$ýTó±À>þOdþdÿ[·[e ÀìÓ. ~/)÷©„_Sÿeÿ ÿŠþRþíÊߨò~Êú)é@•üæÍ í>\#×ßEY?…gÚoØ~=ÔGþM²_û\¤ýOu¹ÏðýôœQIáû5ý3Õá×#R~â;²_åüTû3 R¤ü¢»O0ßÇ÷±wEîñ7µÏÒþ:ówjÿš«ö»´WfÞoô£@Ð,¿ììü_äû‚þ„ñu‡ö÷ëš¿‘÷[)¿½Ãó}cدCÿyÿ”îó³úù•ù—%ÿ)ìé{=eËù ío•UÿV™ðËÑ>ªòGy»RûgÇVŸŽç­¿Çbä¯ÕõW£³ÿFÕÝ'Jïßj÷Iþ‰÷Ž´ëý.ôWÂ/ºûóéo9Ô~‹ýV©Ÿ^«:¿òšû2ûÏHÐ#¶¬ä~ÖªøgDÕ¯ÇR~à'ºûðQhž1 ƒÁ`0 ƒÁ`0 ƒÁø\üƒÔ endstream endobj 50 0 obj <> endobj 51 0 obj <> endobj 52 0 obj <> endobj 57 0 obj [/Indexed /DeviceRGB 255 <000000FF00006B6BD2FFFFFF666666FF66667B7B7B6666C24A4AB96B6B6B4242 B1F30000FF9090B1B1DA888888737373B1A1A1FFB1B1CC6B6B181818FF33337B 7BCC6666B9E33333B9B9B99090D2DADADA8888CCB98888FFC2C2424242E37B7B FFE3E3DA9999FF1818FF7B7BEB2121B1B1EBFF4A4A8080D2C2C2E3A9A9A93333 33F33333D252529090E3DADAF3CCCCEBEB1818FFA1A1999999A1A1DAB99090FF D2D2525252EBA9A98080E3A1A1E3EBEBF3080808FF08087B7BD2FF73737373C2 5A5AB9B1B1B1292929FF4242E34242C2C2C2E3E3E3DADAEBF38888FFF3F3EB90 90FF2929FF8888C2C2EBB1B1F3FF5A5AD2D2D2EB4242E34A4A9999F3CCCCF3A1 A1F3C2C2F37373D2FF6B6B8080806B6BC26666CC5252B94A4AB1FF9999B9B9E3 B1B1E3909090B1A9A9FFB9B9D26B6BCC7373212121FF39398080CCE339399999 D29090DAC28080FFCCCC4A4A4AE38080FFEBEBFF2121FF8080F32121B9B9EBFF 52528888D28080DA393939DA4A4A9999E39090EBE3E3F3DADAFFD2D2EBF31010 FFA9A9A1A1A1A9A9DAB99999FFDADA5A5A5A8888E3A9A9E3A1A1EBF3F3F3EBEB FF101010FF10107B7BDA7373CC5A5AC2CCCCCCEBEBEBB9B9F3B1B1FFD2D2F3CC CCFFA9A9F3C2C2FF6B6BCC5252C2D273739999DAC28888F329298888DA9999EB E3E3FF8888EBA9A9EBF3F3FFD2D2FFF7B796FC949005E770C2F0F4F7B82899EB 94F741F7FC9490F7B84E6D892D05E770C2F118F7B77BF741F7FC949003EE8803 D600F713EE00016FF7A2E3007DF1C2F164000FF8DF0008402004F7A3A0C40000 1F200C000FF8000000C4000CC40000DF0008000000F713E22A001EC4000CDEFD 30C2F18CF7A10E03EE8803D60000000305E00FC2F1A800E44A05E0F8000032F7 B9C59A3DEC000030001DE803B600C2F1E000CD7C00000900CD5C000000FF92D0 05E10005E17003B600C2F20400CD7CC2F21000F56A033238FFFFFFC2F2780010 260000300021F9000028FF92D0601232FF94D0FF92A005E100F432F805E100C2 F22C66E8880000006021D3FF92D0F432F805E100C2F26C66E94B00000060D91D>]endobj 56 0 obj <>stream xœí} Oi–¶s1Ónó!H ‚Âf0IX&|&\‡5Ù| .FÁËe@_˜ F€Âm#I‡ÉÆÍF ¼?tÏ9ï¥Þ*@fâäö‚ Æ—AçbSHôïÝœiñ×­ôÆ |E ã‹`c±ªw ~~^±Iäo*ô%1Œ/+óŒÕû'6+6Áö³ò3ßBÁxo¨xÌïŸh‘¿B_ƒÁøhÙXœ{2PÜ]ï÷û»Aø¹«ÁøFp3¸Ÿ u‡zçªxƒñm`3Ä¡ýÅÐB¡¹3…¾ ƒñ…н±ØTõ$„xRÅÓúŒoþ`0^UÕ47×gî3ßî÷nãKñÅ•_ }) ãËâ—¿ßߢ©½×Â`0 ˆë}…¾ƒQT³ø3ß(n3ûŒoÑB_ƒÁ( b· } £0ˆ²ñg0¾MDÙø3ß&˜ü Æ7ŠëìûŒooXúŒoi&?ƒñ­àæó ¿_/äã®ü­µ_ð‚~ëë…¾ã7Ÿ·øWz—:7®|×ùžÔëFþÉ|_ôÒÎÇZÏwTè‹`0þA1S/‰òW6®t^¹Ò Mþëyä_?ðùþ—?× —Âäg0.‰ûÀxã †zõn,Zm;{­Ñ÷ïÿ[È¿ñù²L~ãÒ~'(Ÿ¯P °”?=4NÍ=óù’¨¶]¸Nî–ŠkI2ùŒKÂOt¯j©ðw^¿¡üѨ1©¿•ˆbë»V€ë´aý\^ +?ƒqiÜDÅ‚G3”ñ9¿Yï›üA2ß—ÌØö?˜Ïd“Ù$\+?ƒñˆåïÓÑXçw6å¯Öä§:!YhåÏmõ3@~V~ãó0°Ñ¹!Ž&déO+4:(^S…6‹;Tþ7…¸VDi&›Aîù³>îçg0. g°Sµl!@“äÔÂ/Ò}‚ü€ú@ÿd6+²V~㲘Yê\zNGcADgç†$ÿmÝÑ×*óý¬(ùÔögüÙ üŒÏÅÍÅ`pf—‚ ý@AþÃh4-ϱ+a ~D~¬øù²lûŒÏBïÒâRh³Â_ BÀ Èo ?)¿¦~mf¹ŸM²íg0>þÅx|1¾ø!þ!aø$òGÑ}¨üY‹ý…·ýÄþ$Û~ã³P¬ÿP¯Š ,Å—üףј>¥Õ&üÙB“?+J~äüïòZŒlܯB4‰†ô_ôÓL~cX¿™óg}ÉÆ|ãÚèëöð~*mwwyxïã×p:üëÙY8ŽÐgÚÏú_{jFTüPù“IV~ã3ðóœDÕñ c|Ï|¾?(É—ìÅæøº½©ðþ~d?Lã^ ¯6œÏeÀéò*œFàùRûíkÎó¦J!ßÇFôïÉRw]l\øc0.ŒÇOû逹/GõËQ}IÓö'³è¼3™Tþ—­½ìÚOõS¤û€×ÀíÝÿ>ïçOV‡VOV"«4æá“?^:,ÃÔ¸`þ¸èë“I¿;ãâ(Ö?é}ÒÛ;ÛÜ\SÕDLíóŠQ}¶j?xnâþxžòçºà>)ŒJt&ú¯6ä\|xHpÿ%Š?6éýáKöSvFùýã2é—}D8bò3—¿7ê õÂz‚ìŸû'£Øgé½:H’éGÔ8¾ho>±OÔßGþ*âõONVON]~ûס“!|t?ŒÊOQƒØIì›ç"ùÉ÷Ó ¿lR;òñãRh …B+ÐBž„zç~3 ýF²o R(¿Ãö¯ãß—ôO¡‚£éôzƒ¾çgþ£C#'CC@þW-å—ÒI$Ì€AäÏ’ñÏR¹ß¢>+?ƒqÜX‘Qèý-–Óoúœ@Ê÷3™yÛ×ìu%ÒôƒòHÈW¥ò¯"ÅÚ:424´{‚äÔ틤63¾ùµðgù…+ö2Œ‹âþ€ÄÊÊñÿ/­7¶™õ¾,ÖÝl9n^Ⱦþyð°HãWQ×ÑÞíæì¿ündhw„„ÿääDÿ0±¬? ?|á²uvƒ~Ó÷[®„•ŸÁ¸8~(¦FüýÿÆ›NÛïÓõ>‡ò¿ÝGîKáO…SaUëá‚ ŒüjûáW#€¡]Š (þ»ïÎPýQù÷¥ö'ö­Ó…ògÇůÓ0ëêXùŒ‹ãfw1Bñ`eÓxÓÅô'E_ßxÖ$s‚È¿¿Of=œŠDVwÏ^*ú½GvGFliÿè±DP_†½³U•õ§(–XÒß  ~Ö0V~ãsð˜È?V,B¿ÅxÓ-çÝüY[Á¯Qr;ùQ¶w‰æ¹_¥ðCÊOLkþð[úÓ‰ ÿOê¯Ã`üçUo_"ѧËj–Ä_¬èa]+?ƒqq<öuwûíÊŸWíOf{¨ânöóß½Šäߗ‰h½>¢Z?æûCÄSú‡FýÉõ[oìb¹ÈIääe¿êÓ0®ËýjjU‹`åg0.·€äÿ@…ñ^žîõ³Rû Û?Ü¿ M°×zg;ù‡PÞIù²ÞÙCê¿Bã?tbô…_î6ŒöŸ:û¦ˆúBû1Ð"ž¬ü ÆgÀß]è®Gþ#û7'´›å>_6LÿÞÕ« I}ª÷åŒ÷ND±ì=ÁzãT ?ÕûOÞ}âÅjî ågÅg0.çâ›þz’ÿâ çZ åÙÏ¿Qgâ*¥ü²à×`¾Òä¦b?°ý­¥ð¹·Èþ·ôŽóý„é´˜‡œØ×ƒ¦Ÿ'ô0Ÿ¿±¼¿ ù³¦ïÏŸÏ?ÂÒ/¹i6ß;¥þ!)ü#µÞQÊ/»úWëg££Ín£€ Èr¿˜Ù“dåg0>é3Ù_ßíF~£“?ébûß_¥”_VüÃ~¥ò á7ëýôRÒÿDŒðÇ©½‘ðnÿiUc|Øö3Ÿ‹XßðþŸ-úÍ8O±­á—Í_Ìc„_Ò?’Ûß=#é—"ÿÖHúÿ›Ê}¤üb€¿œÜüO¥vïæ\/7#†øeiF?Oèa0.ëÑ´wÂoÙŸ¯üz4 ÖûòÉß|ÕÈù#‘HûIûnûî¶³wgTî“Å~hVfŸÃ”_)ÿÍ ¾4-(Ùop+ŒÓ¼½€/“ŸÁ¸q±®–– „fÿŒó,Û~.ä§^þ„®ö›Ëøà„>Tþ!9Êgä­Áè¿êœ_ð%åËñ½)ç„~‚ZɇÆösÎÏ`\bîîf ÂbÿŒó´‘¿áêUQï¾GçÍÓ}ò“!1ÆG)¿9ÌÇÈù‡TÒ/föÐJ@ûûgy—lüàjšóN`0‡\¤s`ÐßüY‹û.ýüS ´ýªÚŸ@ÛNÚ/çõœ¨‚ñß\ÐkïJùMåˆ~`üö^C„îê˰ò3—…Z¤³bsSð_°¿þ†óDSùÝ ~ V¹’~þ”X¿/,øIåG¡·­æ·÷VŒÔ·ôÐËy8Ù­”?Ë9?ƒqY(î?ž©ûÏU~Ëõ»ÙþI³Ú/&öÐ^±Ž‡˜²«¤ß¾”gî?‡dÊ¿z"‚)D(?.äçø­ŒZÊGäülûŒ ã0z]ùgff*Èúûgœ§ZÕ~*÷çð›Õ~k”ϼ´ý‘°š×£êýNò{½§ÿI¿Ö}±–Ìùû Ǩ}]ìϰò3—BßmuWŽŸgfn û+Ðø»“ß>³'o„_s¾ò‹¥|(é²ÿ<ò{ñž# ü/UüHøi^ŸsÔÀ¸X»;ÃÕ~ã’°îÁûóù'>Jþlþ:E??P_Tûç§§kÐöâpÎõœ¿;‘®^ÌçO!õ÷‰œíùÊß®gõ‘úæÊ{©ˆUïK$–moÊÛu‰A>¬ü ÆE¡ïŸ®æÆïåüëæb^Ùd&ï뎤í—+ùØjt¹ß£»wz:<üÓÙÙªÉâZ¾“ï†ï´/ù›‘KyHåŸü¤ÿ\ƒ!q]õñ#€ø7ˆûçVû¬•2if ꃜu ñ“S{‘ý~ãûXÆ;ûixô•}a®W¿þôŽº÷iBϪ¹’O¿Èùé ¯:rþ.P~ZFL(¿ìyàî~ãÓPm¸þDz§]ÿ„ë¿ucJ/®Ü]:utw»+c¸ûVáûåœÞýˆõVƒ^»ŸîÌ1¢~{ÿðoâ^]«ÏDÂäÏÙ®¥±Tß±'‰~¤±}ª6yð·øWa0¾ÜÖwáõz®æ›ÂŸ?¯Ù6+í=Xt›²ÎÈIòÓHŸÈ~*%Ù¿&‡í…Qßi!ÏœúÈ«= Ÿ`Ý‘{]?Ú~rýÖÚÝ„F½x¯yûàäßè†ÁøÊÑ­¶Rþ_**Ôð^Êøëýÿ7ï>›ôc;ÊïkãŒvs˜ÎÇ 7Œö¾”ÔÇÁ{â†\Æ*^'CrmO9£'<šÃ?ï5¤tOÖûS{ÚEO_FŒñÑø[þó0_/Ž>ïÍŠMIý‰s¦ôz3ö™=”rÛoו벆øÒŒ~q“nû}ºWmkôâÊž«òîÜrdßnûnX ðÙÜ/áè7œ”Â/”_oÓã«EµYïÚcÓsúüÝ3y¨±I?òÍ·mÎÍ‘îí£Ûõí«™}4Ä_êÿÉIÎøDîäÄä¾ÝgõóEð wíWâmÜÇ‘ý>¾cƒqA˜äÿ¹¥E®å1¡–ñšÉûÀ¤©üú>½öþþvYò»º/²~âp8bQ(n/Üë„_Ýw>¢—ñÀé¼h$rÎk—Âï3oÒËýý Æ'!jÿ—‰–‰½ŠW½¿¾Û…ü9Û=»ô}zí'Í'(ë$ôr>á”pþ’ú«Î¹w«Öd¾°^ÄCÌé‘ý|ùƒZ³êf]jØnÜßÏ`| ¢FOß ÿ6Å}¼oOÞžŽå<|IºQ¯“ü¹°ãK¦ù}b–®S÷»V¾§¤ÂÒò§h= ü®¿æ}Ä»7žµ:ú4Ú?÷ß„Áø&`*ÿ¦céÞn—›vÞ›Ê/´?›qŽá?KÐðþ«2éW{åb~n#ýÞ™sø#j6_Šfó%ö#®“&3bÙn›i½ü¿ƒñ á¶EþÇzÝîz¡ûn·ëäžÔ÷ɂ޸º£ÒËôòNÝ)¹œW$üSÎõRŽ„á§•»ÂF­…?õNy±Ž‡-áQ> ƧÀPþ›@yâ=4y«¾üu"r]û‘üI`¿Ë Úá”è—Py?!Ü;÷bFOÔŠ½ÒóGhh_äìü¹“ìp°i?“ŸÁøD«£êf-HzÁüzy—î7åÕd²–öÌ¿vP:ÚŽºäO…çwï~däýéðÙ‰òü4¶/uÒ_°aªÖ”ýÄñòƒß?ŸÁ`bzxïc}{nIý±âWå>>::ZoþØŒýWk¯ÖÄj>Ÿ|Qê§á½Â\^Î'žÎ`0ƒQq·¯÷—n…1BqñÀÀÊïŸÁ`üCã ø~q´9f˜Ügò3_/¢Ñè!î×kæ÷WZ }y ãï…ê¨XÊç9¾˜hOªÜ…˜ü ÆW‹¾¨ä7t/–¢~Áäg0¾^û¯{½cHxE|IýÞ¹‰B_ƒÁø»!Åš_Eh%´‚¬³/˜êí›cåg0¾b ‚ôGBÈþf>P¸ÏÊÏ`|ÕÀ¬ÿ@wÚˆø`ø‘úMMþB_ƒÁø{¥ÿ7ú^¤}¯Ð|ä~0(ˆÇk  Ø`D‡öí×­ØÚ·Û[U;/$`4 ‡ý1íÙ÷hýÿÄÿm1¸ º¿|'€þz«îá`90>FB=»S‚ìóîÌvô:hØp%FŠ’ÙXÚOe-#¯C;à-¸³0ˆ~¿£Ž–¯ë0Ïi[hÃìÂû¢Òƒ!¡­r– ±J¢}Y]ú‚­…E”Q<ž‹åü–æ›Òo ì™MÐ<½G> }®öŸ>85èoñœ8ß¼ö Ù­h¿$‡‡ØÐ¬K7 Žá@÷©MXE÷#hÃJûG%ñiwËlŠñ¸5yKcRøIý~;é—÷‘ößOM‚ðO~?e6EðÈ{`?6ê#í[‘îÛí†%  6¤=vÏZ%ÿéÙ >0_qý˜žk„-˜·”ŸœB#n©šFxn´¸ßˆÜo´´ß&þëkmD×Ú ŽDÄGšÙáàGhHtr?RC¼/ŦP|—dÇnÄthÁ}â|¾ê)U„—ÜïÁ嬀ö¸¨º‚,nÂøp‡/ðöZ´è…XçÒ"ÿÅÅ¥xü7,ûýWÓ"ÙýÅÅà´ ù©Âm«{8‹‘òw$?p\áNݬ`{Ñ2à¡é‚ž:.£W]ûï -ðUvà7¥á é“uóœ’_Í=ôõÓ 1V½;++ñ¯áÃø±jØÅ.B}—(3viÒ~öôþÁyÚo×} þÞšMøÅ4gü›=pŠ?i¿Hš…ðÛÄŸ( •²¥ûÃnÀÝ~up«ßˆyªßO´¿µ,èkR‡bÿÔÔ䔡ü¦P1`Usaý¿ßކ͖´£êߤð‹½]÷Qõå^„€VKôÿÏ5ØTN`—}|Týy¢;<”ú7ZÍzì'í·YýÒ5°é>„‚kZ÷1àëT@(ÿÔý§OÇŸ"åi/--5%ßd$  ‚~´ÿúÔ”ð‹-ké?ŸêÿúǽKAäz$þŽþöaì>¼ ;ƒ6ò— ¦nÕŸ1⸠‘gyžö*ëLò×S…š;•m·­c«Þh¥çE>ùÓm•Èö¨`;üNG”XN¢m–ªJ ñ³fÁàSèoùý\^[ÚEûÅÞ]û ö›ªoj¿®4ÛËk¦ò?²ë¾Ò~Cù×µÝ?’H?,µ_‰¿Cûï’ðdXÖz/›¤~¿aü%ó—…ç—Ú?)ÔßÔ} (÷ úÀý)Ãú;tÉßÞJÛ¶!üZ÷Û¡µ¶Ãó±6Rú•ë—–_ÿXk¿|¨ÂÀ<ÑÞR~“þ û5]`ìÊoñ^»WíWºÄ¿&ŒÿS²ü:ï?Ê/Ô_˜~|HÖKá—q€èýC)Ñ^k¿f¿”~8øAZ±vµd~’¨/´ö —Ÿ•¼'êÓß²šüõÀsäz0ø¯ÿGûýñ½Øè„f#êô½Ù鯄ò{ªù%ëbH¢K ò÷É¿Ùu\uü-²ÇŠ®ÏzòÈß7}{‡¾IüŠ·dzº#`½”D¼úð½@삾ߌ.Å?þ¼"à=öÎ×þ½SS÷Úß,ÙeßEù­ò_3é¾~<Àl)¿®Ú]­ûÃ:ëwhÿ­~Cùïjí_6ó}ñ÷kí—•ïʯ´_Å€×È{tû–÷ÝŸ²åû¢¡÷Ý*”¿µÝ,á[[-ÁoÕOZûI÷üHÿg†æ«ä=¥ü˜üká×A e…€®FWt5v]k¼ÖUÛu­ËUûµî“í¿&…_Š>=¿Mè?E’~ÓúK`©öãš÷ãvíÏëïùAi&©š¢¿ÔþŒÖ~"¾Èõ³Û X ±òG4ÿÑ¿,mtv¯t^±‘ŸJóŽ-¨¬M“Á®ö´íx0 zh7íÑl‘ßëé»;1›'­óp£Eõ‹Ù<òÇ*ËËMò{^D©œ¯È§:–Æ«óP ©óô]LùÍBŸ“úJûEÕ/m¯ùS;GûAùO䷴ߪó­iöËðHª¿¡ÿGÍ–ö7«¼_è¾,õ©@0_i¿æ¿%ýH}þ»†õy¿~Ò}§òkö[¼'íŸt~Ù€1€lD€©ísŠ}ÛDúvÊûÛ-í?&ío•vÍ¿`¾!ýó¸ÕKÅ—ûg¦öÏ+áGç¯6Óù§„ô7Ú­€Úk°á£K‰¿Mû­Œ™MýI÷§ïÔíéSÅþ[ѯÔHdª?Žâ/ÆõÇ•ç_ú„Û·©D⟥[júä--Í‚ßãP'ð|ã xüà*þŸ¢èþ£þËÿÿ°ñ ºïknm"}O“òƒ°W")Óƒ“-$#ïê<1'ùït”‹à±Yzñf]™†(ìÚòÈuJÛeRoYâ xÚðc垎 uõÙ‚€KÏŸ—”ß)þB÷õ]´ß©ûμÿ•tkpdïÌKüåi¿Ðÿõ#;ý…0µßVï7´_øÿ~³âÒ¯u_)¿ ·–ÏÑþ)ËX1à{¡ý´ÕñÚöŸ„[$þöÎ@$;Ðÿeë±ØTõï™,ø¡òߟKñŸ¯12~É|!ùêXûS5–æKÆ+÷/F¨íïß…´wA+hç/»~|o6Jd’þ÷¥FÞ/CÀ¸¦©©û¢Ê/{þ¤ ûb‹¼3¬Tÿ¬ ½Èû…óÏêq×¹•.@ü?ß²qeãÊ•ÎNÜÑ3Ä‚¥ùcuTàv´Z÷»‰ìÚã½#l¬ˆXX$U˜̦¤Ü´ý^ÙùîU¹|ò£“Ç‚ßV>ùÛ:›–Ah:0h¼„ÏâW÷Űᢠûí!À .Í=çGíß;gðO>ý8JþÍkhûÖ_Ëÿš~›ö«´ÝMùlõþa©ûŽa?*Õ¿%^P@‰ÿ¤j’úùÚ?µl)ÿ¤*øOé^?5ö=?Ù}cô=(Û/ˆ/°-+ôLº/©ÿRåüÊjŽçIúíŸÊ/çµù¯‘Ù¾­æ§´^°¿F¿@î×BÂÔ'þ»û±èÿãÁ5£äoÚcèÏ{½·[YúÏH¿/[©æ½Ùß/¸}~=¢¨€LþÅÞÒ~!öº»ÏVðc˜’ïJû´-íÇç´QíÏÙ´_qÝÅø“'x`y¿ÃøËœ_ê>>ÖuÙïÐ…ß>pØÔKû‡UÍßÈûupKÕþßAøûoYù¾Nío˜4h?)Šþ“†ðË1>$ýTó±À>þOdþdÿ[·[e ÀìÓ. ~/)÷©„_Sÿeÿ ÿŠþRþíÊߨò~Êú)é@•üæÍ í>\#×ßEY?…gÚoØ~=ÔGþM²_û\¤ýOu¹ÏðýôœQIáû5ý3Õá×#R~â;²_åüTû3 R¤ü¢»O0ßÇ÷±wEîñ7µÏÒþ:ówjÿš«ö»´WfÞoô£@Ð,¿ììü_äû‚þ„ñu‡ö÷ëš¿‘÷[)¿½Ãó}cدCÿyÿ”îó³úù•ù—%ÿ)ìé{=eËù ío•UÿV™ðËÑ>ªòGy»RûgÇVŸŽç­¿Çbä¯ÕõW£³ÿFÕÝ'Jïßj÷Iþ‰÷Ž´ëý.ôWÂ/ºûóéo9Ô~‹ýV©Ÿ^«:¿òšû2ûÏHÐ#¶¬ä~ÖªøgDÕ¯ÇR~à'ºûðQhž1 ƒÁ`0 ƒÁ`0 ƒÁø\üƒÔ endstream endobj 58 0 obj <> endobj 59 0 obj <> endobj 60 0 obj <> endobj 65 0 obj [/Indexed /DeviceRGB 255 <000000FF00006B6BD2FFFFFF666666FF66667B7B7B6666C24A4AB96B6B6B4242 B1F30000FF9090B1B1DA888888737373B1A1A1FFB1B1CC6B6B181818FF33337B 7BCC6666B9E33333B9B9B99090D2DADADA8888CCB98888FFC2C2424242E37B7B FFE3E3DA9999FF1818FF7B7BEB2121B1B1EBFF4A4A8080D2C2C2E3A9A9A93333 33F33333D252529090E3DADAF3CCCCEBEB1818FFA1A1999999A1A1DAB99090FF D2D2525252EBA9A98080E3A1A1E3EBEBF3080808FF08087B7BD2FF73737373C2 5A5AB9B1B1B1292929FF4242E34242C2C2C2E3E3E3DADAEBF38888FFF3F3EB90 90FF2929FF8888C2C2EBB1B1F3FF5A5AD2D2D2EB4242E34A4A9999F3CCCCF3A1 A1F3C2C2F37373D2FF6B6B8080806B6BC26666CC5252B94A4AB1FF9999B9B9E3 B1B1E3909090B1A9A9FFB9B9D26B6BCC7373212121FF39398080CCE339399999 D29090DAC28080FFCCCC4A4A4AE38080FFEBEBFF2121FF8080F32121B9B9EBFF 52528888D28080DA393939DA4A4A9999E39090EBE3E3F3DADAFFD2D2EBF31010 FFA9A9A1A1A1A9A9DAB99999FFDADA5A5A5A8888E3A9A9E3A1A1EBF3F3F3EBEB FF101010FF10107B7BDA7373CC5A5AC2CCCCCCEBEBEBB9B9F3B1B1FFD2D2F3CC CCFFA9A9F3C2C2FF6B6BCC5252C2D273739999DAC28888F329298888DA9999EB E3E3FF8888EBA9A9EBF3F3FFD2D2FFF7B796FC949005E770C2F0F4F7B82899EB 94F741F7FC9490F7B84E6D892D05E770C2F118F7B77BF741F7FC949003EE8803 D600F713EE00016FF7A2E3007DF1C2F164000FF8DF0008402004F7A3A0C40000 1F200C000FF8000000C4000CC40000DF0008000000F713E22A001EC4000CDEFD 30C2F18CF7A10E03EE8803D60000000305E00FC2F1A800E44A05E0F8000032F7 B9C59A3DEC000030001DE803B600C2F1E000CD7C00000900CD5C000000FF92D0 05E10005E17003B600C2F20400CD7CC2F21000F56A033238FFFFFFC2F2780010 260000300021F9000028FF92D0601232FF94D0FF92A005E100F432F805E100C2 F22C66E8880000006021D3FF92D0F432F805E100C2F26C66E94B00000060D91D>]endobj 64 0 obj <>stream xœí} Oi–¶s1Ónó!H ‚Âf0IX&|&\‡5Ù| .FÁËe@_˜ F€Âm#I‡ÉÆÍF ¼?tÏ9ï¥Þ*@fâäö‚ Æ—AçbSHôïÝœiñ×­ôÆ |E ã‹`c±ªw ~~^±Iäo*ô%1Œ/+óŒÕû'6+6Áö³ò3ßBÁxo¨xÌïŸh‘¿B_ƒÁøhÙXœ{2PÜ]ï÷û»Aø¹«ÁøFp3¸Ÿ u‡zçªxƒñm`3Ä¡ýÅÐB¡¹3…¾ ƒñ…н±ØTõ$„xRÅÓúŒoþ`0^UÕ47×gî3ßî÷nãKñÅ•_ }) ãËâ—¿ßߢ©½×Â`0 ˆë}…¾ƒQT³ø3ß(n3ûŒoÑB_ƒÁ( b· } £0ˆ²ñg0¾MDÙø3ß&˜ü Æ7ŠëìûŒooXúŒoi&?ƒñ­àæó ¿_/äã®ü­µ_ð‚~ëë…¾ã7Ÿ·øWz—:7®|×ùžÔëFþÉ|_ôÒÎÇZÏwTè‹`0þA1S/‰òW6®t^¹Ò Mþëyä_?ðùþ—?× —Âäg0.‰ûÀxã †zõn,Zm;{­Ñ÷ïÿ[È¿ñù²L~ãÒ~'(Ÿ¯P °”?=4NÍ=óù’¨¶]¸Nî–ŠkI2ùŒKÂOt¯j©ðw^¿¡üѨ1©¿•ˆbë»V€ë´aý\^ +?ƒqiÜDÅ‚G3”ñ9¿Yï›üA2ß—ÌØö?˜Ïd“Ù$\+?ƒñˆåïÓÑXçw6å¯Öä§:!YhåÏmõ3@~V~ãó0°Ñ¹!Ž&déO+4:(^S…6‹;Tþ7…¸VDi&›Aîù³>îçg0. g°Sµl!@“äÔÂ/Ò}‚ü€ú@ÿd6+²V~㲘Yê\zNGcADgç†$ÿmÝÑ×*óý¬(ùÔögüÙ üŒÏÅÍÅ`pf—‚ ý@AþÃh4-ϱ+a ~D~¬øù²lûŒÏBïÒâRh³Â_ BÀ Èo ?)¿¦~mf¹ŸM²íg0>þÅx|1¾ø!þ!aø$òGÑ}¨üY‹ý…·ýÄþ$Û~ã³P¬ÿP¯Š ,Å—üףј>¥Õ&üÙB“?+J~äüïòZŒlܯB4‰†ô_ôÓL~cX¿™óg}ÉÆ|ãÚèëöð~*mwwyxïã×p:üëÙY8ŽÐgÚÏú_{jFTüPù“IV~ã3ðóœDÕñ c|Ï|¾?(É—ìÅæøº½©ðþ~d?Lã^ ¯6œÏeÀéò*œFàùRûíkÎó¦J!ßÇFôïÉRw]l\øc0.ŒÇOû逹/GõËQ}IÓö'³è¼3™Tþ—­½ìÚOõS¤û€×ÀíÝÿ>ïçOV‡VOV"«4æá“?^:,ÃÔ¸`þ¸èë“I¿;ãâ(Ö?é}ÒÛ;ÛÜ\SÕDLíóŠQ}¶j?xnâþxžòçºà>)ŒJt&ú¯6ä\|xHpÿ%Š?6éýáKöSvFùýã2é—}D8bò3—¿7ê õÂz‚ìŸû'£Øgé½:H’éGÔ8¾ho>±OÔßGþ*âõONVON]~ûס“!|t?ŒÊOQƒØIì›ç"ùÉ÷Ó ¿lR;òñãRh …B+ÐBž„zç~3 ýF²o R(¿Ãö¯ãß—ôO¡‚£éôzƒ¾çgþ£C#'CC@þW-å—ÒI$Ì€AäÏ’ñÏR¹ß¢>+?ƒqÜX‘Qèý-–Óoúœ@Ê÷3™yÛ×ìu%ÒôƒòHÈW¥ò¯"ÅÚ:424´{‚äÔ틤63¾ùµðgù…+ö2Œ‹âþ€ÄÊÊñÿ/­7¶™õ¾,ÖÝl9n^Ⱦþyð°HãWQ×ÑÞíæì¿ündhw„„ÿääDÿ0±¬? ?|á²uvƒ~Ó÷[®„•ŸÁ¸8~(¦FüýÿÆ›NÛïÓõ>‡ò¿ÝGîKáO…SaUëá‚ ŒüjûáW#€¡]Š (þ»ïÎPýQù÷¥ö'ö­Ó…ògÇůÓ0ëêXùŒ‹ãfw1Bñ`eÓxÓÅô'E_ßxÖ$s‚È¿¿Of=œŠDVwÏ^*ú½GvGFliÿè±DP_†½³U•õ§(–XÒß  ~Ö0V~ãsð˜È?V,B¿ÅxÓ-çÝüY[Á¯Qr;ùQ¶w‰æ¹_¥ðCÊOLkþð[úÓ‰ ÿOê¯Ã`üçUo_"ѧËj–Ä_¬èa]+?ƒqq<öuwûíÊŸWíOf{¨ânöóß½Šäߗ‰h½>¢Z?æûCÄSú‡FýÉõ[oìb¹ÈIääe¿êÓ0®ËýjjU‹`åg0.·€äÿ@…ñ^žîõ³Rû Û?Ü¿ M°×zg;ù‡PÞIù²ÞÙCê¿Bã?tbô…_î6ŒöŸ:û¦ˆúBû1Ð"ž¬ü ÆgÀß]è®Gþ#û7'´›å>_6LÿÞÕ« I}ª÷åŒ÷ND±ì=ÁzãT ?ÕûOÞ}âÅjî ågÅg0.çâ›þz’ÿâ çZ åÙÏ¿Qgâ*¥ü²à×`¾Òä¦b?°ý­¥ð¹·Èþ·ôŽóý„é´˜‡œØ×ƒ¦Ÿ'ô0Ÿ¿±¼¿ ù³¦ïÏŸÏ?ÂÒ/¹i6ß;¥þ!)ü#µÞQÊ/»úWëg££Ín£€ Èr¿˜Ù“dåg0>é3Ù_ßíF~£“?ébûß_¥”_VüÃ~¥ò á7ëýôRÒÿDŒðÇ©½‘ðnÿiUc|Øö3Ÿ‹XßðþŸ-úÍ8O±­á—Í_Ìc„_Ò?’Ûß=#é—"ÿÖHúÿ›Ê}¤üb€¿œÜüO¥vïæ\/7#†øeiF?Oèa0.ëÑ´wÂoÙŸ¯üz4 ÖûòÉß|ÕÈù#‘HûIûnûî¶³wgTî“Å~hVfŸÃ”_)ÿÍ ¾4-(Ùop+ŒÓ¼½€/“ŸÁ¸q±®–– „fÿŒó,Û~.ä§^þ„®ö›Ëøà„>Tþ!9Êgä­Áè¿êœ_ð%åËñ½)ç„~‚ZɇÆösÎÏ`\bîîf ÂbÿŒó´‘¿áêUQï¾GçÍÓ}ò“!1ÆG)¿9ÌÇÈù‡TÒ/föÐJ@ûûgy—lüàjšóN`0‡\¤s`ÐßüY‹û.ýüS ´ýªÚŸ@ÛNÚ/çõœ¨‚ñß\ÐkïJùMåˆ~`üö^C„îê˰ò3—…Z¤³bsSð_°¿þ†óDSùÝ ~ V¹’~þ”X¿/,øIåG¡·­æ·÷VŒÔ·ôÐËy8Ù­”?Ë9?ƒqY(î?ž©ûÏU~Ëõ»ÙþI³Ú/&öÐ^±Ž‡˜²«¤ß¾”gî?‡dÊ¿z"‚)D(?.äçø­ŒZÊGäülûŒ ã0z]ùgff*Èúûgœ§ZÕ~*÷çð›Õ~k”ϼ´ý‘°š×£êýNò{½§ÿI¿Ö}±–Ìùû Ǩ}]ìϰò3—BßmuWŽŸgfn û+Ðø»“ß>³'o„_s¾ò‹¥|(é²ÿ<ò{ñž# ü/UüHøi^ŸsÔÀ¸X»;ÃÕ~ã’°îÁûóù'>Jþlþ:E??P_Tûç§§kÐöâpÎõœ¿;‘®^ÌçO!õ÷‰œíùÊß®gõ‘úæÊ{©ˆUïK$–moÊÛu‰A>¬ü ÆE¡ïŸ®æÆïåüëæb^Ùd&ï뎤í—+ùØjt¹ß£»wz:<üÓÙÙªÉâZ¾“ï†ï´/ù›‘KyHåŸü¤ÿ\ƒ!q]õñ#€ø7ˆûçVû¬•2if ꃜu ñ“S{‘ý~ãûXÆ;ûixô•}a®W¿þôŽº÷iBϪ¹’O¿Èùé ¯:rþ.P~ZFL(¿ìyàî~ãÓPm¸þDz§]ÿ„ë¿ucJ/®Ü]:utw»+c¸ûVáûåœÞýˆõVƒ^»ŸîÌ1¢~{ÿðoâ^]«ÏDÂäÏÙ®¥±Tß±'‰~¤±}ª6yð·øWa0¾ÜÖwáõz®æ›ÂŸ?¯Ù6+í=Xt›²ÎÈIòÓHŸÈ~*%Ù¿&‡í…Qßi!ÏœúÈ«= Ÿ`Ý‘{]?Ú~rýÖÚÝ„F½x¯yûàäßè†ÁøÊÑ­¶Rþ_**Ôð^Êøëýÿ7ï>›ôc;ÊïkãŒvs˜ÎÇ 7Œö¾”ÔÇÁ{â†\Æ*^'CrmO9£'<šÃ?ï5¤tOÖûS{ÚEO_FŒñÑø[þó0_/Ž>ïÍŠMIý‰s¦ôz3ö™=”rÛoו벆øÒŒ~q“nû}ºWmkôâÊž«òîÜrdßnûnX ðÙÜ/áè7œ”Â/”_oÓã«EµYïÚcÓsúüÝ3y¨±I?òÍ·mÎÍ‘îí£Ûõí«™}4Ä_êÿÉIÎøDîäÄä¾ÝgõóEð wíWâmÜÇ‘ý>¾cƒqA˜äÿ¹¥E®å1¡–ñšÉûÀ¤©üú>½öþþvYò»º/²~âp8bQ(n/Üë„_Ýw>¢—ñÀé¼h$rÎk—Âï3oÒËýý Æ'!jÿ—‰–‰½ŠW½¿¾Û…ü9Û=»ô}zí'Í'(ë$ôr>á”pþ’ú«Î¹w«Öd¾°^ÄCÌé‘ý|ùƒZ³êf]jØnÜßÏ`| ¢FOß ÿ6Å}¼oOÞžŽå<|IºQ¯“ü¹°ãK¦ù}b–®S÷»V¾§¤ÂÒò§h= ü®¿æ}Ä»7žµ:ú4Ú?÷ß„Áø&`*ÿ¦céÞn—›vÞ›Ê/´?›qŽá?KÐðþ«2éW{åb~n#ýÞ™sø#j6_Šfó%ö#®“&3bÙn›i½ü¿ƒñ á¶EþÇzÝîz¡ûn·ëäžÔ÷ɂ޸º£ÒËôòNÝ)¹œW$üSÎõRŽ„á§•»ÂF­…?õNy±Ž‡-áQ> ƧÀPþ›@yâ=4y«¾üu"r]û‘üI`¿Ë Úá”è—Py?!Ü;÷bFOÔŠ½ÒóGhh_äìü¹“ìp°i?“ŸÁøD«£êf-HzÁüzy—î7åÕd²–öÌ¿vP:ÚŽºäO…çwï~däýéðÙ‰òü4¶/uÒ_°aªÖ”ýÄñòƒß?ŸÁ`bzxïc}{nIý±âWå>>::ZoþØŒýWk¯ÖÄj>Ÿ|Qê§á½Â\^Î'žÎ`0ƒQq·¯÷—n…1BqñÀÀÊïŸÁ`üCã ø~q´9f˜Ügò3_/¢Ñè!î×kæ÷WZ }y ãï…ê¨XÊç9¾˜hOªÜ…˜ü ÆW‹¾¨ä7t/–¢~Áäg0¾^û¯{½cHxE|IýÞ¹‰B_ƒÁø»!Åš_Eh%´‚¬³/˜êí›cåg0¾b ‚ôGBÈþf>P¸ÏÊÏ`|ÕÀ¬ÿ@wÚˆø`ø‘úMMþB_ƒÁø{¥ÿ7ú^¤}¯Ð|ä~0(ˆÇk  Ø`D‡öí×­ØÚ·Û[U;/$`4 ‡ý1íÙ÷hýÿÄÿm1¸ º¿|'€þz«îá`90>FB=»S‚ìóîÌvô:hØp%FŠ’ÙXÚOe-#¯C;à-¸³0ˆ~¿£Ž–¯ë0Ïi[hÃìÂû¢Òƒ!¡­r– ±J¢}Y]ú‚­…E”Q<ž‹åü–æ›Òo ì™MÐ<½G> }®öŸ>85èoñœ8ß¼ö Ù­h¿$‡‡ØÐ¬K7 Žá@÷©MXE÷#hÃJûG%ñiwËlŠñ¸5yKcRøIý~;é—÷‘ößOM‚ðO~?e6EðÈ{`?6ê#í[‘îÛí†%  6¤=vÏZ%ÿéÙ >0_qý˜žk„-˜·”ŸœB#n©šFxn´¸ßˆÜo´´ß&þëkmD×Ú ŽDÄGšÙáàGhHtr?RC¼/ŦP|—dÇnÄthÁ}â|¾ê)U„—ÜïÁ嬀ö¸¨º‚,nÂøp‡/ðöZ´è…XçÒ"ÿÅÅ¥xü7,ûýWÓ"ÙýÅÅà´ ù©Âm«{8‹‘òw$?p\áNݬ`{Ñ2à¡é‚ž:.£W]ûï -ðUvà7¥á é“uóœ’_Í=ôõÓ 1V½;++ñ¯áÃø±jØÅ.B}—(3viÒ~öôþÁyÚo×} þÞšMøÅ4gü›=pŠ?i¿Hš…ðÛÄŸ( •²¥ûÃnÀÝ~up«ßˆyªßO´¿µ,èkR‡bÿÔÔ䔡ü¦P1`Usaý¿ßކ͖´£êߤð‹½]÷Qõå^„€VKôÿÏ5ØTN`—}|Týy¢;<”ú7ZÍzì'í·YýÒ5°é>„‚kZ÷1àëT@(ÿÔý§OÇŸ"åi/--5%ßd$  ‚~´ÿúÔ”ð‹-ké?ŸêÿúǽKAäz$þŽþöaì>¼ ;ƒ6ò— ¦nÕŸ1⸠‘gyžö*ëLò×S…š;•m·­c«Þh¥çE>ùÓm•Èö¨`;üNG”XN¢m–ªJ ñ³fÁàSèoùý\^[ÚEûÅÞ]û ö›ªoj¿®4ÛËk¦ò?²ë¾Ò~Cù×µÝ?’H?,µ_‰¿Cûï’ðdXÖz/›¤~¿aü%ó—…ç—Ú?)ÔßÔ} (÷ úÀý)Ãú;tÉßÞJÛ¶!üZ÷Û¡µ¶Ãó±6Rú•ë—–_ÿXk¿|¨ÂÀ<ÑÞR~“þ û5]`ìÊoñ^»WíWºÄ¿&ŒÿS²ü:ï?Ê/Ô_˜~|HÖKá—q€èýC)Ñ^k¿f¿”~8øAZ±vµd~’¨/´ö —Ÿ•¼'êÓß²šüõÀsäz0ø¯ÿGûýñ½Øè„f#êô½Ù鯄ò{ªù%ëbH¢K ò÷É¿Ùu\uü-²ÇŠ®ÏzòÈß7}{‡¾IüŠ·dzº#`½”D¼úð½@삾ߌ.Å?þ¼"à=öÎ×þ½SS÷Úß,ÙeßEù­ò_3é¾~<Àl)¿®Ú]­ûÃ:ëwhÿ­~Cùïjí_6ó}ñ÷kí—•ïʯ´_Å€×È{tû–÷ÝŸ²åû¢¡÷Ý*”¿µÝ,á[[-ÁoÕOZûI÷üHÿg†æ«ä=¥ü˜üká×A e…€®FWt5v]k¼ÖUÛu­ËUûµî“í¿&…_Š>=¿Mè?E’~ÓúK`©öãš÷ãvíÏëïùAi&©š¢¿ÔþŒÖ~"¾Èõ³Û X ±òG4ÿÑ¿,mtv¯t^±‘ŸJóŽ-¨¬M“Á®ö´íx0 zh7íÑl‘ßëé»;1›'­óp£Eõ‹Ù<òÇ*ËËMò{^D©œ¯È§:–Æ«óP ©óô]LùÍBŸ“úJûEÕ/m¯ùS;GûAùO䷴ߪó­iöËðHª¿¡ÿGÍ–ö7«¼_è¾,õ©@0_i¿æ¿%ýH}þ»†õy¿~Ò}§òkö[¼'íŸt~Ù€1€lD€©ísŠ}ÛDúvÊûÛ-í?&ío•vÍ¿`¾!ýó¸ÕKÅ—ûg¦öÏ+áGç¯6Óù§„ô7Ú­€Úk°á£K‰¿Mû­Œ™MýI÷§ïÔíéSÅþ[ѯÔHdª?Žâ/ÆõÇ•ç_ú„Û·©D⟥[júä--Í‚ßãP'ð|ã xüà*þŸ¢èþ£þËÿÿ°ñ ºïknm"}O“òƒ°W")Óƒ“-$#ïê<1'ùït”‹à±Yzñf]™†(ìÚòÈuJÛeRoYâ xÚðc垎 uõÙ‚€KÏŸ—”ß)þB÷õ]´ß©ûμÿ•tkpdïÌKüåi¿Ðÿõ#;ý…0µßVï7´_øÿ~³âÒ¯u_)¿ ·–ÏÑþ)ËX1à{¡ý´ÕñÚöŸ„[$þöÎ@$;Ðÿeë±ØTõï™,ø¡òߟKñŸ¯12~É|!ùêXûS5–æKÆ+÷/F¨íïß…´wA+hç/»~|o6Jd’þ÷¥FÞ/CÀ¸¦©©û¢Ê/{þ¤ ûb‹¼3¬Tÿ¬ ½Èû…óÏêq×¹•.@ü?ß²qeãÊ•ÎNÜÑ3Ä‚¥ùcuTàv´Z÷»‰ìÚã½#l¬ˆXX$U˜̦¤Ü´ý^ÙùîU¹|ò£“Ç‚ßV>ùÛ:›–Ah:0h¼„ÏâW÷Űᢠûí!À .Í=çGíß;gðO>ý8JþÍkhûÖ_Ëÿš~›ö«´ÝMùlõþa©ûŽa?*Õ¿%^P@‰ÿ¤j’úùÚ?µl)ÿ¤*øOé^?5ö=?Ù}cô=(Û/ˆ/°-+ôLº/©ÿRåüÊjŽçIúíŸÊ/çµù¯‘Ù¾­æ§´^°¿F¿@î×BÂÔ'þ»û±èÿãÁ5£äoÚcèÏ{½·[YúÏH¿/[©æ½Ùß/¸}~=¢¨€LþÅÞÒ~!öº»ÏVðc˜’ïJû´-íÇç´QíÏÙ´_qÝÅø“'x`y¿ÃøËœ_ê>>ÖuÙïÐ…ß>pØÔKû‡UÍßÈûupKÕþßAøûoYù¾Nío˜4h?)Šþ“†ðË1>$ýTó±À>þOdþdÿ[·[e ÀìÓ. ~/)÷©„_Sÿeÿ ÿŠþRþíÊߨò~Êú)é@•üæÍ í>\#×ßEY?…gÚoØ~=ÔGþM²_û\¤ýOu¹ÏðýôœQIáû5ý3Õá×#R~â;²_åüTû3 R¤ü¢»O0ßÇ÷±wEîñ7µÏÒþ:ówjÿš«ö»´WfÞoô£@Ð,¿ììü_äû‚þ„ñu‡ö÷ëš¿‘÷[)¿½Ãó}cدCÿyÿ”îó³úù•ù—%ÿ)ìé{=eËù ío•UÿV™ðËÑ>ªòGy»RûgÇVŸŽç­¿Çbä¯ÕõW£³ÿFÕÝ'Jïßj÷Iþ‰÷Ž´ëý.ôWÂ/ºûóéo9Ô~‹ýV©Ÿ^«:¿òšû2ûÏHÐ#¶¬ä~ÖªøgDÕ¯ÇR~à'ºûðQhž1 ƒÁ`0 ƒÁ`0 ƒÁø\üƒÔ endstream endobj 66 0 obj <> endobj 67 0 obj <> endobj 68 0 obj <> endobj 73 0 obj [/Indexed /DeviceRGB 255 <000000FF00006B6BD2FFFFFF666666FF66667B7B7B6666C24A4AB96B6B6B4242 B1F30000FF9090B1B1DA888888737373B1A1A1FFB1B1CC6B6B181818FF33337B 7BCC6666B9E33333B9B9B99090D2DADADA8888CCB98888FFC2C2424242E37B7B FFE3E3DA9999FF1818FF7B7BEB2121B1B1EBFF4A4A8080D2C2C2E3A9A9A93333 33F33333D252529090E3DADAF3CCCCEBEB1818FFA1A1999999A1A1DAB99090FF D2D2525252EBA9A98080E3A1A1E3EBEBF3080808FF08087B7BD2FF73737373C2 5A5AB9B1B1B1292929FF4242E34242C2C2C2E3E3E3DADAEBF38888FFF3F3EB90 90FF2929FF8888C2C2EBB1B1F3FF5A5AD2D2D2EB4242E34A4A9999F3CCCCF3A1 A1F3C2C2F37373D2FF6B6B8080806B6BC26666CC5252B94A4AB1FF9999B9B9E3 B1B1E3909090B1A9A9FFB9B9D26B6BCC7373212121FF39398080CCE339399999 D29090DAC28080FFCCCC4A4A4AE38080FFEBEBFF2121FF8080F32121B9B9EBFF 52528888D28080DA393939DA4A4A9999E39090EBE3E3F3DADAFFD2D2EBF31010 FFA9A9A1A1A1A9A9DAB99999FFDADA5A5A5A8888E3A9A9E3A1A1EBF3F3F3EBEB FF101010FF10107B7BDA7373CC5A5AC2CCCCCCEBEBEBB9B9F3B1B1FFD2D2F3CC CCFFA9A9F3C2C2FF6B6BCC5252C2D273739999DAC28888F329298888DA9999EB E3E3FF8888EBA9A9EBF3F3FFD2D2FFF7B796FC949005E770C2F0F4F7B82899EB 94F741F7FC9490F7B84E6D892D05E770C2F118F7B77BF741F7FC949003EE8803 D600F713EE00016FF7A2E3007DF1C2F164000FF8DF0008402004F7A3A0C40000 1F200C000FF8000000C4000CC40000DF0008000000F713E22A001EC4000CDEFD 30C2F18CF7A10E03EE8803D60000000305E00FC2F1A800E44A05E0F8000032F7 B9C59A3DEC000030001DE803B600C2F1E000CD7C00000900CD5C000000FF92D0 05E10005E17003B600C2F20400CD7CC2F21000F56A033238FFFFFFC2F2780010 260000300021F9000028FF92D0601232FF94D0FF92A005E100F432F805E100C2 F22C66E8880000006021D3FF92D0F432F805E100C2F26C66E94B00000060D91D>]endobj 72 0 obj <>stream xœí} Oi–¶s1Ónó!H ‚Âf0IX&|&\‡5Ù| .FÁËe@_˜ F€Âm#I‡ÉÆÍF ¼?tÏ9ï¥Þ*@fâäö‚ Æ—AçbSHôïÝœiñ×­ôÆ |E ã‹`c±ªw ~~^±Iäo*ô%1Œ/+óŒÕû'6+6Áö³ò3ßBÁxo¨xÌïŸh‘¿B_ƒÁøhÙXœ{2PÜ]ï÷û»Aø¹«ÁøFp3¸Ÿ u‡zçªxƒñm`3Ä¡ýÅÐB¡¹3…¾ ƒñ…н±ØTõ$„xRÅÓúŒoþ`0^UÕ47×gî3ßî÷nãKñÅ•_ }) ãËâ—¿ßߢ©½×Â`0 ˆë}…¾ƒQT³ø3ß(n3ûŒoÑB_ƒÁ( b· } £0ˆ²ñg0¾MDÙø3ß&˜ü Æ7ŠëìûŒooXúŒoi&?ƒñ­àæó ¿_/äã®ü­µ_ð‚~ëë…¾ã7Ÿ·øWz—:7®|×ùžÔëFþÉ|_ôÒÎÇZÏwTè‹`0þA1S/‰òW6®t^¹Ò Mþëyä_?ðùþ—?× —Âäg0.‰ûÀxã †zõn,Zm;{­Ñ÷ïÿ[È¿ñù²L~ãÒ~'(Ÿ¯P °”?=4NÍ=óù’¨¶]¸Nî–ŠkI2ùŒKÂOt¯j©ðw^¿¡üѨ1©¿•ˆbë»V€ë´aý\^ +?ƒqiÜDÅ‚G3”ñ9¿Yï›üA2ß—ÌØö?˜Ïd“Ù$\+?ƒñˆåïÓÑXçw6å¯Öä§:!YhåÏmõ3@~V~ãó0°Ñ¹!Ž&déO+4:(^S…6‹;Tþ7…¸VDi&›Aîù³>îçg0. g°Sµl!@“äÔÂ/Ò}‚ü€ú@ÿd6+²V~㲘Yê\zNGcADgç†$ÿmÝÑ×*óý¬(ùÔögüÙ üŒÏÅÍÅ`pf—‚ ý@AþÃh4-ϱ+a ~D~¬øù²lûŒÏBïÒâRh³Â_ BÀ Èo ?)¿¦~mf¹ŸM²íg0>þÅx|1¾ø!þ!aø$òGÑ}¨üY‹ý…·ýÄþ$Û~ã³P¬ÿP¯Š ,Å—üףј>¥Õ&üÙB“?+J~äüïòZŒlܯB4‰†ô_ôÓL~cX¿™óg}ÉÆ|ãÚèëöð~*mwwyxïã×p:üëÙY8ŽÐgÚÏú_{jFTüPù“IV~ã3ðóœDÕñ c|Ï|¾?(É—ìÅæøº½©ðþ~d?Lã^ ¯6œÏeÀéò*œFàùRûíkÎó¦J!ßÇFôïÉRw]l\øc0.ŒÇOû逹/GõËQ}IÓö'³è¼3™Tþ—­½ìÚOõS¤û€×ÀíÝÿ>ïçOV‡VOV"«4æá“?^:,ÃÔ¸`þ¸èë“I¿;ãâ(Ö?é}ÒÛ;ÛÜ\SÕDLíóŠQ}¶j?xnâþxžòçºà>)ŒJt&ú¯6ä\|xHpÿ%Š?6éýáKöSvFùýã2é—}D8bò3—¿7ê õÂz‚ìŸû'£Øgé½:H’éGÔ8¾ho>±OÔßGþ*âõONVON]~ûס“!|t?ŒÊOQƒØIì›ç"ùÉ÷Ó ¿lR;òñãRh …B+ÐBž„zç~3 ýF²o R(¿Ãö¯ãß—ôO¡‚£éôzƒ¾çgþ£C#'CC@þW-å—ÒI$Ì€AäÏ’ñÏR¹ß¢>+?ƒqÜX‘Qèý-–Óoúœ@Ê÷3™yÛ×ìu%ÒôƒòHÈW¥ò¯"ÅÚ:424´{‚äÔ틤63¾ùµðgù…+ö2Œ‹âþ€ÄÊÊñÿ/­7¶™õ¾,ÖÝl9n^Ⱦþyð°HãWQ×ÑÞíæì¿ündhw„„ÿääDÿ0±¬? ?|á²uvƒ~Ó÷[®„•ŸÁ¸8~(¦FüýÿÆ›NÛïÓõ>‡ò¿ÝGîKáO…SaUëá‚ ŒüjûáW#€¡]Š (þ»ïÎPýQù÷¥ö'ö­Ó…ògÇůÓ0ëêXùŒ‹ãfw1Bñ`eÓxÓÅô'E_ßxÖ$s‚È¿¿Of=œŠDVwÏ^*ú½GvGFliÿè±DP_†½³U•õ§(–XÒß  ~Ö0V~ãsð˜È?V,B¿ÅxÓ-çÝüY[Á¯Qr;ùQ¶w‰æ¹_¥ðCÊOLkþð[úÓ‰ ÿOê¯Ã`üçUo_"ѧËj–Ä_¬èa]+?ƒqq<öuwûíÊŸWíOf{¨ânöóß½Šäߗ‰h½>¢Z?æûCÄSú‡FýÉõ[oìb¹ÈIääe¿êÓ0®ËýjjU‹`åg0.·€äÿ@…ñ^žîõ³Rû Û?Ü¿ M°×zg;ù‡PÞIù²ÞÙCê¿Bã?tbô…_î6ŒöŸ:û¦ˆúBû1Ð"ž¬ü ÆgÀß]è®Gþ#û7'´›å>_6LÿÞÕ« I}ª÷åŒ÷ND±ì=ÁzãT ?ÕûOÞ}âÅjî ågÅg0.çâ›þz’ÿâ çZ åÙÏ¿Qgâ*¥ü²à×`¾Òä¦b?°ý­¥ð¹·Èþ·ôŽóý„é´˜‡œØ×ƒ¦Ÿ'ô0Ÿ¿±¼¿ ù³¦ïÏŸÏ?ÂÒ/¹i6ß;¥þ!)ü#µÞQÊ/»úWëg££Ín£€ Èr¿˜Ù“dåg0>é3Ù_ßíF~£“?ébûß_¥”_VüÃ~¥ò á7ëýôRÒÿDŒðÇ©½‘ðnÿiUc|Øö3Ÿ‹XßðþŸ-úÍ8O±­á—Í_Ìc„_Ò?’Ûß=#é—"ÿÖHúÿ›Ê}¤üb€¿œÜüO¥vïæ\/7#†øeiF?Oèa0.ëÑ´wÂoÙŸ¯üz4 ÖûòÉß|ÕÈù#‘HûIûnûî¶³wgTî“Å~hVfŸÃ”_)ÿÍ ¾4-(Ùop+ŒÓ¼½€/“ŸÁ¸q±®–– „fÿŒó,Û~.ä§^þ„®ö›Ëøà„>Tþ!9Êgä­Áè¿êœ_ð%åËñ½)ç„~‚ZɇÆösÎÏ`\bîîf ÂbÿŒó´‘¿áêUQï¾GçÍÓ}ò“!1ÆG)¿9ÌÇÈù‡TÒ/föÐJ@ûûgy—lüàjšóN`0‡\¤s`ÐßüY‹û.ýüS ´ýªÚŸ@ÛNÚ/çõœ¨‚ñß\ÐkïJùMåˆ~`üö^C„îê˰ò3—…Z¤³bsSð_°¿þ†óDSùÝ ~ V¹’~þ”X¿/,øIåG¡·­æ·÷VŒÔ·ôÐËy8Ù­”?Ë9?ƒqY(î?ž©ûÏU~Ëõ»ÙþI³Ú/&öÐ^±Ž‡˜²«¤ß¾”gî?‡dÊ¿z"‚)D(?.äçø­ŒZÊGäülûŒ ã0z]ùgff*Èúûgœ§ZÕ~*÷çð›Õ~k”ϼ´ý‘°š×£êýNò{½§ÿI¿Ö}±–Ìùû Ǩ}]ìϰò3—BßmuWŽŸgfn û+Ðø»“ß>³'o„_s¾ò‹¥|(é²ÿ<ò{ñž# ü/UüHøi^ŸsÔÀ¸X»;ÃÕ~ã’°îÁûóù'>Jþlþ:E??P_Tûç§§kÐöâpÎõœ¿;‘®^ÌçO!õ÷‰œíùÊß®gõ‘úæÊ{©ˆUïK$–moÊÛu‰A>¬ü ÆE¡ïŸ®æÆïåüëæb^Ùd&ï뎤í—+ùØjt¹ß£»wz:<üÓÙÙªÉâZ¾“ï†ï´/ù›‘KyHåŸü¤ÿ\ƒ!q]õñ#€ø7ˆûçVû¬•2if ꃜu ñ“S{‘ý~ãûXÆ;ûixô•}a®W¿þôŽº÷iBϪ¹’O¿Èùé ¯:rþ.P~ZFL(¿ìyàî~ãÓPm¸þDz§]ÿ„ë¿ucJ/®Ü]:utw»+c¸ûVáûåœÞýˆõVƒ^»ŸîÌ1¢~{ÿðoâ^]«ÏDÂäÏÙ®¥±Tß±'‰~¤±}ª6yð·øWa0¾ÜÖwáõz®æ›ÂŸ?¯Ù6+í=Xt›²ÎÈIòÓHŸÈ~*%Ù¿&‡í…Qßi!ÏœúÈ«= Ÿ`Ý‘{]?Ú~rýÖÚÝ„F½x¯yûàäßè†ÁøÊÑ­¶Rþ_**Ôð^Êøëýÿ7ï>›ôc;ÊïkãŒvs˜ÎÇ 7Œö¾”ÔÇÁ{â†\Æ*^'CrmO9£'<šÃ?ï5¤tOÖûS{ÚEO_FŒñÑø[þó0_/Ž>ïÍŠMIý‰s¦ôz3ö™=”rÛoו벆øÒŒ~q“nû}ºWmkôâÊž«òîÜrdßnûnX ðÙÜ/áè7œ”Â/”_oÓã«EµYïÚcÓsúüÝ3y¨±I?òÍ·mÎÍ‘îí£Ûõí«™}4Ä_êÿÉIÎøDîäÄä¾ÝgõóEð wíWâmÜÇ‘ý>¾cƒqA˜äÿ¹¥E®å1¡–ñšÉûÀ¤©üú>½öþþvYò»º/²~âp8bQ(n/Üë„_Ýw>¢—ñÀé¼h$rÎk—Âï3oÒËýý Æ'!jÿ—‰–‰½ŠW½¿¾Û…ü9Û=»ô}zí'Í'(ë$ôr>á”pþ’ú«Î¹w«Öd¾°^ÄCÌé‘ý|ùƒZ³êf]jØnÜßÏ`| ¢FOß ÿ6Å}¼oOÞžŽå<|IºQ¯“ü¹°ãK¦ù}b–®S÷»V¾§¤ÂÒò§h= ü®¿æ}Ä»7žµ:ú4Ú?÷ß„Áø&`*ÿ¦céÞn—›vÞ›Ê/´?›qŽá?KÐðþ«2éW{åb~n#ýÞ™sø#j6_Šfó%ö#®“&3bÙn›i½ü¿ƒñ á¶EþÇzÝîz¡ûn·ëäžÔ÷ɂ޸º£ÒËôòNÝ)¹œW$üSÎõRŽ„á§•»ÂF­…?õNy±Ž‡-áQ> ƧÀPþ›@yâ=4y«¾üu"r]û‘üI`¿Ë Úá”è—Py?!Ü;÷bFOÔŠ½ÒóGhh_äìü¹“ìp°i?“ŸÁøD«£êf-HzÁüzy—î7åÕd²–öÌ¿vP:ÚŽºäO…çwï~däýéðÙ‰òü4¶/uÒ_°aªÖ”ýÄñòƒß?ŸÁ`bzxïc}{nIý±âWå>>::ZoþØŒýWk¯ÖÄj>Ÿ|Qê§á½Â\^Î'žÎ`0ƒQq·¯÷—n…1BqñÀÀÊïŸÁ`üCã ø~q´9f˜Ügò3_/¢Ñè!î×kæ÷WZ }y ãï…ê¨XÊç9¾˜hOªÜ…˜ü ÆW‹¾¨ä7t/–¢~Áäg0¾^û¯{½cHxE|IýÞ¹‰B_ƒÁø»!Åš_Eh%´‚¬³/˜êí›cåg0¾b ‚ôGBÈþf>P¸ÏÊÏ`|ÕÀ¬ÿ@wÚˆø`ø‘úMMþB_ƒÁø{¥ÿ7ú^¤}¯Ð|ä~0(ˆÇk  Ø`D‡öí×­ØÚ·Û[U;/$`4 ‡ý1íÙ÷hýÿÄÿm1¸ º¿|'€þz«îá`90>FB=»S‚ìóîÌvô:hØp%FŠ’ÙXÚOe-#¯C;à-¸³0ˆ~¿£Ž–¯ë0Ïi[hÃìÂû¢Òƒ!¡­r– ±J¢}Y]ú‚­…E”Q<ž‹åü–æ›Òo ì™MÐ<½G> }®öŸ>85èoñœ8ß¼ö Ù­h¿$‡‡ØÐ¬K7 Žá@÷©MXE÷#hÃJûG%ñiwËlŠñ¸5yKcRøIý~;é—÷‘ößOM‚ðO~?e6EðÈ{`?6ê#í[‘îÛí†%  6¤=vÏZ%ÿéÙ >0_qý˜žk„-˜·”ŸœB#n©šFxn´¸ßˆÜo´´ß&þëkmD×Ú ŽDÄGšÙáàGhHtr?RC¼/ŦP|—dÇnÄthÁ}â|¾ê)U„—ÜïÁ嬀ö¸¨º‚,nÂøp‡/ðöZ´è…XçÒ"ÿÅÅ¥xü7,ûýWÓ"ÙýÅÅà´ ù©Âm«{8‹‘òw$?p\áNݬ`{Ñ2à¡é‚ž:.£W]ûï -ðUvà7¥á é“uóœ’_Í=ôõÓ 1V½;++ñ¯áÃø±jØÅ.B}—(3viÒ~öôþÁyÚo×} þÞšMøÅ4gü›=pŠ?i¿Hš…ðÛÄŸ( •²¥ûÃnÀÝ~up«ßˆyªßO´¿µ,èkR‡bÿÔÔ䔡ü¦P1`Usaý¿ßކ͖´£êߤð‹½]÷Qõå^„€VKôÿÏ5ØTN`—}|Týy¢;<”ú7ZÍzì'í·YýÒ5°é>„‚kZ÷1àëT@(ÿÔý§OÇŸ"åi/--5%ßd$  ‚~´ÿúÔ”ð‹-ké?ŸêÿúǽKAäz$þŽþöaì>¼ ;ƒ6ò— ¦nÕŸ1⸠‘gyžö*ëLò×S…š;•m·­c«Þh¥çE>ùÓm•Èö¨`;üNG”XN¢m–ªJ ñ³fÁàSèoùý\^[ÚEûÅÞ]û ö›ªoj¿®4ÛËk¦ò?²ë¾Ò~Cù×µÝ?’H?,µ_‰¿Cûï’ðdXÖz/›¤~¿aü%ó—…ç—Ú?)ÔßÔ} (÷ úÀý)Ãú;tÉßÞJÛ¶!üZ÷Û¡µ¶Ãó±6Rú•ë—–_ÿXk¿|¨ÂÀ<ÑÞR~“þ û5]`ìÊoñ^»WíWºÄ¿&ŒÿS²ü:ï?Ê/Ô_˜~|HÖKá—q€èýC)Ñ^k¿f¿”~8øAZ±vµd~’¨/´ö —Ÿ•¼'êÓß²šüõÀsäz0ø¯ÿGûýñ½Øè„f#êô½Ù鯄ò{ªù%ëbH¢K ò÷É¿Ùu\uü-²ÇŠ®ÏzòÈß7}{‡¾IüŠ·dzº#`½”D¼úð½@삾ߌ.Å?þ¼"à=öÎ×þ½SS÷Úß,ÙeßEù­ò_3é¾~<Àl)¿®Ú]­ûÃ:ëwhÿ­~Cùïjí_6ó}ñ÷kí—•ïʯ´_Å€×È{tû–÷ÝŸ²åû¢¡÷Ý*”¿µÝ,á[[-ÁoÕOZûI÷üHÿg†æ«ä=¥ü˜üká×A e…€®FWt5v]k¼ÖUÛu­ËUûµî“í¿&…_Š>=¿Mè?E’~ÓúK`©öãš÷ãvíÏëïùAi&©š¢¿ÔþŒÖ~"¾Èõ³Û X ±òG4ÿÑ¿,mtv¯t^±‘ŸJóŽ-¨¬M“Á®ö´íx0 zh7íÑl‘ßëé»;1›'­óp£Eõ‹Ù<òÇ*ËËMò{^D©œ¯È§:–Æ«óP ©óô]LùÍBŸ“úJûEÕ/m¯ùS;GûAùO䷴ߪó­iöËðHª¿¡ÿGÍ–ö7«¼_è¾,õ©@0_i¿æ¿%ýH}þ»†õy¿~Ò}§òkö[¼'íŸt~Ù€1€lD€©ísŠ}ÛDúvÊûÛ-í?&ío•vÍ¿`¾!ýó¸ÕKÅ—ûg¦öÏ+áGç¯6Óù§„ô7Ú­€Úk°á£K‰¿Mû­Œ™MýI÷§ïÔíéSÅþ[ѯÔHdª?Žâ/ÆõÇ•ç_ú„Û·©D⟥[júä--Í‚ßãP'ð|ã xüà*þŸ¢èþ£þËÿÿ°ñ ºïknm"}O“òƒ°W")Óƒ“-$#ïê<1'ùït”‹à±Yzñf]™†(ìÚòÈuJÛeRoYâ xÚðc垎 uõÙ‚€KÏŸ—”ß)þB÷õ]´ß©ûμÿ•tkpdïÌKüåi¿Ðÿõ#;ý…0µßVï7´_øÿ~³âÒ¯u_)¿ ·–ÏÑþ)ËX1à{¡ý´ÕñÚöŸ„[$þöÎ@$;Ðÿeë±ØTõï™,ø¡òߟKñŸ¯12~É|!ùêXûS5–æKÆ+÷/F¨íïß…´wA+hç/»~|o6Jd’þ÷¥FÞ/CÀ¸¦©©û¢Ê/{þ¤ ûb‹¼3¬Tÿ¬ ½Èû…óÏêq×¹•.@ü?ß²qeãÊ•ÎNÜÑ3Ä‚¥ùcuTàv´Z÷»‰ìÚã½#l¬ˆXX$U˜̦¤Ü´ý^ÙùîU¹|ò£“Ç‚ßV>ùÛ:›–Ah:0h¼„ÏâW÷Űᢠûí!À .Í=çGíß;gðO>ý8JþÍkhûÖ_Ëÿš~›ö«´ÝMùlõþa©ûŽa?*Õ¿%^P@‰ÿ¤j’úùÚ?µl)ÿ¤*øOé^?5ö=?Ù}cô=(Û/ˆ/°-+ôLº/©ÿRåüÊjŽçIúíŸÊ/çµù¯‘Ù¾­æ§´^°¿F¿@î×BÂÔ'þ»û±èÿãÁ5£äoÚcèÏ{½·[YúÏH¿/[©æ½Ùß/¸}~=¢¨€LþÅÞÒ~!öº»ÏVðc˜’ïJû´-íÇç´QíÏÙ´_qÝÅø“'x`y¿ÃøËœ_ê>>ÖuÙïÐ…ß>pØÔKû‡UÍßÈûupKÕþßAøûoYù¾Nío˜4h?)Šþ“†ðË1>$ýTó±À>þOdþdÿ[·[e ÀìÓ. ~/)÷©„_Sÿeÿ ÿŠþRþíÊߨò~Êú)é@•üæÍ í>\#×ßEY?…gÚoØ~=ÔGþM²_û\¤ýOu¹ÏðýôœQIáû5ý3Õá×#R~â;²_åüTû3 R¤ü¢»O0ßÇ÷±wEîñ7µÏÒþ:ówjÿš«ö»´WfÞoô£@Ð,¿ììü_äû‚þ„ñu‡ö÷ëš¿‘÷[)¿½Ãó}cدCÿyÿ”îó³úù•ù—%ÿ)ìé{=eËù ío•UÿV™ðËÑ>ªòGy»RûgÇVŸŽç­¿Çbä¯ÕõW£³ÿFÕÝ'Jïßj÷Iþ‰÷Ž´ëý.ôWÂ/ºûóéo9Ô~‹ýV©Ÿ^«:¿òšû2ûÏHÐ#¶¬ä~ÖªøgDÕ¯ÇR~à'ºûðQhž1 ƒÁ`0 ƒÁ`0 ƒÁø\üƒÔ endstream endobj 77 0 obj <> endobj 78 0 obj <> endobj 79 0 obj <> endobj 84 0 obj [/Indexed /DeviceRGB 255 <000000FF00006B6BD2FFFFFF666666FF66667B7B7B6666C24A4AB96B6B6B4242 B1F30000FF9090B1B1DA888888737373B1A1A1FFB1B1CC6B6B181818FF33337B 7BCC6666B9E33333B9B9B99090D2DADADA8888CCB98888FFC2C2424242E37B7B FFE3E3DA9999FF1818FF7B7BEB2121B1B1EBFF4A4A8080D2C2C2E3A9A9A93333 33F33333D252529090E3DADAF3CCCCEBEB1818FFA1A1999999A1A1DAB99090FF D2D2525252EBA9A98080E3A1A1E3EBEBF3080808FF08087B7BD2FF73737373C2 5A5AB9B1B1B1292929FF4242E34242C2C2C2E3E3E3DADAEBF38888FFF3F3EB90 90FF2929FF8888C2C2EBB1B1F3FF5A5AD2D2D2EB4242E34A4A9999F3CCCCF3A1 A1F3C2C2F37373D2FF6B6B8080806B6BC26666CC5252B94A4AB1FF9999B9B9E3 B1B1E3909090B1A9A9FFB9B9D26B6BCC7373212121FF39398080CCE339399999 D29090DAC28080FFCCCC4A4A4AE38080FFEBEBFF2121FF8080F32121B9B9EBFF 52528888D28080DA393939DA4A4A9999E39090EBE3E3F3DADAFFD2D2EBF31010 FFA9A9A1A1A1A9A9DAB99999FFDADA5A5A5A8888E3A9A9E3A1A1EBF3F3F3EBEB FF101010FF10107B7BDA7373CC5A5AC2CCCCCCEBEBEBB9B9F3B1B1FFD2D2F3CC CCFFA9A9F3C2C2FF6B6BCC5252C2D273739999DAC28888F329298888DA9999EB E3E3FF8888EBA9A9EBF3F3FFD2D2FFF7B796FC949005E770C2F0F4F7B82899EB 94F741F7FC9490F7B84E6D892D05E770C2F118F7B77BF741F7FC949003EE8803 D600F713EE00016FF7A2E3007DF1C2F164000FF8DF0008402004F7A3A0C40000 1F200C000FF8000000C4000CC40000DF0008000000F713E22A001EC4000CDEFD 30C2F18CF7A10E03EE8803D60000000305E00FC2F1A800E44A05E0F8000032F7 B9C59A3DEC000030001DE803B600C2F1E000CD7C00000900CD5C000000FF92D0 05E10005E17003B600C2F20400CD7CC2F21000F56A033238FFFFFFC2F2780010 260000300021F9000028FF92D0601232FF94D0FF92A005E100F432F805E100C2 F22C66E8880000006021D3FF92D0F432F805E100C2F26C66E94B00000060D91D>]endobj 83 0 obj <>stream xœí} Oi–¶s1Ónó!H ‚Âf0IX&|&\‡5Ù| .FÁËe@_˜ F€Âm#I‡ÉÆÍF ¼?tÏ9ï¥Þ*@fâäö‚ Æ—AçbSHôïÝœiñ×­ôÆ |E ã‹`c±ªw ~~^±Iäo*ô%1Œ/+óŒÕû'6+6Áö³ò3ßBÁxo¨xÌïŸh‘¿B_ƒÁøhÙXœ{2PÜ]ï÷û»Aø¹«ÁøFp3¸Ÿ u‡zçªxƒñm`3Ä¡ýÅÐB¡¹3…¾ ƒñ…н±ØTõ$„xRÅÓúŒoþ`0^UÕ47×gî3ßî÷nãKñÅ•_ }) ãËâ—¿ßߢ©½×Â`0 ˆë}…¾ƒQT³ø3ß(n3ûŒoÑB_ƒÁ( b· } £0ˆ²ñg0¾MDÙø3ß&˜ü Æ7ŠëìûŒooXúŒoi&?ƒñ­àæó ¿_/äã®ü­µ_ð‚~ëë…¾ã7Ÿ·øWz—:7®|×ùžÔëFþÉ|_ôÒÎÇZÏwTè‹`0þA1S/‰òW6®t^¹Ò Mþëyä_?ðùþ—?× —Âäg0.‰ûÀxã †zõn,Zm;{­Ñ÷ïÿ[È¿ñù²L~ãÒ~'(Ÿ¯P °”?=4NÍ=óù’¨¶]¸Nî–ŠkI2ùŒKÂOt¯j©ðw^¿¡üѨ1©¿•ˆbë»V€ë´aý\^ +?ƒqiÜDÅ‚G3”ñ9¿Yï›üA2ß—ÌØö?˜Ïd“Ù$\+?ƒñˆåïÓÑXçw6å¯Öä§:!YhåÏmõ3@~V~ãó0°Ñ¹!Ž&déO+4:(^S…6‹;Tþ7…¸VDi&›Aîù³>îçg0. g°Sµl!@“äÔÂ/Ò}‚ü€ú@ÿd6+²V~㲘Yê\zNGcADgç†$ÿmÝÑ×*óý¬(ùÔögüÙ üŒÏÅÍÅ`pf—‚ ý@AþÃh4-ϱ+a ~D~¬øù²lûŒÏBïÒâRh³Â_ BÀ Èo ?)¿¦~mf¹ŸM²íg0>þÅx|1¾ø!þ!aø$òGÑ}¨üY‹ý…·ýÄþ$Û~ã³P¬ÿP¯Š ,Å—üףј>¥Õ&üÙB“?+J~äüïòZŒlܯB4‰†ô_ôÓL~cX¿™óg}ÉÆ|ãÚèëöð~*mwwyxïã×p:üëÙY8ŽÐgÚÏú_{jFTüPù“IV~ã3ðóœDÕñ c|Ï|¾?(É—ìÅæøº½©ðþ~d?Lã^ ¯6œÏeÀéò*œFàùRûíkÎó¦J!ßÇFôïÉRw]l\øc0.ŒÇOû逹/GõËQ}IÓö'³è¼3™Tþ—­½ìÚOõS¤û€×ÀíÝÿ>ïçOV‡VOV"«4æá“?^:,ÃÔ¸`þ¸èë“I¿;ãâ(Ö?é}ÒÛ;ÛÜ\SÕDLíóŠQ}¶j?xnâþxžòçºà>)ŒJt&ú¯6ä\|xHpÿ%Š?6éýáKöSvFùýã2é—}D8bò3—¿7ê õÂz‚ìŸû'£Øgé½:H’éGÔ8¾ho>±OÔßGþ*âõONVON]~ûס“!|t?ŒÊOQƒØIì›ç"ùÉ÷Ó ¿lR;òñãRh …B+ÐBž„zç~3 ýF²o R(¿Ãö¯ãß—ôO¡‚£éôzƒ¾çgþ£C#'CC@þW-å—ÒI$Ì€AäÏ’ñÏR¹ß¢>+?ƒqÜX‘Qèý-–Óoúœ@Ê÷3™yÛ×ìu%ÒôƒòHÈW¥ò¯"ÅÚ:424´{‚äÔ틤63¾ùµðgù…+ö2Œ‹âþ€ÄÊÊñÿ/­7¶™õ¾,ÖÝl9n^Ⱦþyð°HãWQ×ÑÞíæì¿ündhw„„ÿääDÿ0±¬? ?|á²uvƒ~Ó÷[®„•ŸÁ¸8~(¦FüýÿÆ›NÛïÓõ>‡ò¿ÝGîKáO…SaUëá‚ ŒüjûáW#€¡]Š (þ»ïÎPýQù÷¥ö'ö­Ó…ògÇůÓ0ëêXùŒ‹ãfw1Bñ`eÓxÓÅô'E_ßxÖ$s‚È¿¿Of=œŠDVwÏ^*ú½GvGFliÿè±DP_†½³U•õ§(–XÒß  ~Ö0V~ãsð˜È?V,B¿ÅxÓ-çÝüY[Á¯Qr;ùQ¶w‰æ¹_¥ðCÊOLkþð[úÓ‰ ÿOê¯Ã`üçUo_"ѧËj–Ä_¬èa]+?ƒqq<öuwûíÊŸWíOf{¨ânöóß½Šäߗ‰h½>¢Z?æûCÄSú‡FýÉõ[oìb¹ÈIääe¿êÓ0®ËýjjU‹`åg0.·€äÿ@…ñ^žîõ³Rû Û?Ü¿ M°×zg;ù‡PÞIù²ÞÙCê¿Bã?tbô…_î6ŒöŸ:û¦ˆúBû1Ð"ž¬ü ÆgÀß]è®Gþ#û7'´›å>_6LÿÞÕ« I}ª÷åŒ÷ND±ì=ÁzãT ?ÕûOÞ}âÅjî ågÅg0.çâ›þz’ÿâ çZ åÙÏ¿Qgâ*¥ü²à×`¾Òä¦b?°ý­¥ð¹·Èþ·ôŽóý„é´˜‡œØ×ƒ¦Ÿ'ô0Ÿ¿±¼¿ ù³¦ïÏŸÏ?ÂÒ/¹i6ß;¥þ!)ü#µÞQÊ/»úWëg££Ín£€ Èr¿˜Ù“dåg0>é3Ù_ßíF~£“?ébûß_¥”_VüÃ~¥ò á7ëýôRÒÿDŒðÇ©½‘ðnÿiUc|Øö3Ÿ‹XßðþŸ-úÍ8O±­á—Í_Ìc„_Ò?’Ûß=#é—"ÿÖHúÿ›Ê}¤üb€¿œÜüO¥vïæ\/7#†øeiF?Oèa0.ëÑ´wÂoÙŸ¯üz4 ÖûòÉß|ÕÈù#‘HûIûnûî¶³wgTî“Å~hVfŸÃ”_)ÿÍ ¾4-(Ùop+ŒÓ¼½€/“ŸÁ¸q±®–– „fÿŒó,Û~.ä§^þ„®ö›Ëøà„>Tþ!9Êgä­Áè¿êœ_ð%åËñ½)ç„~‚ZɇÆösÎÏ`\bîîf ÂbÿŒó´‘¿áêUQï¾GçÍÓ}ò“!1ÆG)¿9ÌÇÈù‡TÒ/föÐJ@ûûgy—lüàjšóN`0‡\¤s`ÐßüY‹û.ýüS ´ýªÚŸ@ÛNÚ/çõœ¨‚ñß\ÐkïJùMåˆ~`üö^C„îê˰ò3—…Z¤³bsSð_°¿þ†óDSùÝ ~ V¹’~þ”X¿/,øIåG¡·­æ·÷VŒÔ·ôÐËy8Ù­”?Ë9?ƒqY(î?ž©ûÏU~Ëõ»ÙþI³Ú/&öÐ^±Ž‡˜²«¤ß¾”gî?‡dÊ¿z"‚)D(?.äçø­ŒZÊGäülûŒ ã0z]ùgff*Èúûgœ§ZÕ~*÷çð›Õ~k”ϼ´ý‘°š×£êýNò{½§ÿI¿Ö}±–Ìùû Ǩ}]ìϰò3—BßmuWŽŸgfn û+Ðø»“ß>³'o„_s¾ò‹¥|(é²ÿ<ò{ñž# ü/UüHøi^ŸsÔÀ¸X»;ÃÕ~ã’°îÁûóù'>Jþlþ:E??P_Tûç§§kÐöâpÎõœ¿;‘®^ÌçO!õ÷‰œíùÊß®gõ‘úæÊ{©ˆUïK$–moÊÛu‰A>¬ü ÆE¡ïŸ®æÆïåüëæb^Ùd&ï뎤í—+ùØjt¹ß£»wz:<üÓÙÙªÉâZ¾“ï†ï´/ù›‘KyHåŸü¤ÿ\ƒ!q]õñ#€ø7ˆûçVû¬•2if ꃜu ñ“S{‘ý~ãûXÆ;ûixô•}a®W¿þôŽº÷iBϪ¹’O¿Èùé ¯:rþ.P~ZFL(¿ìyàî~ãÓPm¸þDz§]ÿ„ë¿ucJ/®Ü]:utw»+c¸ûVáûåœÞýˆõVƒ^»ŸîÌ1¢~{ÿðoâ^]«ÏDÂäÏÙ®¥±Tß±'‰~¤±}ª6yð·øWa0¾ÜÖwáõz®æ›ÂŸ?¯Ù6+í=Xt›²ÎÈIòÓHŸÈ~*%Ù¿&‡í…Qßi!ÏœúÈ«= Ÿ`Ý‘{]?Ú~rýÖÚÝ„F½x¯yûàäßè†ÁøÊÑ­¶Rþ_**Ôð^Êøëýÿ7ï>›ôc;ÊïkãŒvs˜ÎÇ 7Œö¾”ÔÇÁ{â†\Æ*^'CrmO9£'<šÃ?ï5¤tOÖûS{ÚEO_FŒñÑø[þó0_/Ž>ïÍŠMIý‰s¦ôz3ö™=”rÛoו벆øÒŒ~q“nû}ºWmkôâÊž«òîÜrdßnûnX ðÙÜ/áè7œ”Â/”_oÓã«EµYïÚcÓsúüÝ3y¨±I?òÍ·mÎÍ‘îí£Ûõí«™}4Ä_êÿÉIÎøDîäÄä¾ÝgõóEð wíWâmÜÇ‘ý>¾cƒqA˜äÿ¹¥E®å1¡–ñšÉûÀ¤©üú>½öþþvYò»º/²~âp8bQ(n/Üë„_Ýw>¢—ñÀé¼h$rÎk—Âï3oÒËýý Æ'!jÿ—‰–‰½ŠW½¿¾Û…ü9Û=»ô}zí'Í'(ë$ôr>á”pþ’ú«Î¹w«Öd¾°^ÄCÌé‘ý|ùƒZ³êf]jØnÜßÏ`| ¢FOß ÿ6Å}¼oOÞžŽå<|IºQ¯“ü¹°ãK¦ù}b–®S÷»V¾§¤ÂÒò§h= ü®¿æ}Ä»7žµ:ú4Ú?÷ß„Áø&`*ÿ¦céÞn—›vÞ›Ê/´?›qŽá?KÐðþ«2éW{åb~n#ýÞ™sø#j6_Šfó%ö#®“&3bÙn›i½ü¿ƒñ á¶EþÇzÝîz¡ûn·ëäžÔ÷ɂ޸º£ÒËôòNÝ)¹œW$üSÎõRŽ„á§•»ÂF­…?õNy±Ž‡-áQ> ƧÀPþ›@yâ=4y«¾üu"r]û‘üI`¿Ë Úá”è—Py?!Ü;÷bFOÔŠ½ÒóGhh_äìü¹“ìp°i?“ŸÁøD«£êf-HzÁüzy—î7åÕd²–öÌ¿vP:ÚŽºäO…çwï~däýéðÙ‰òü4¶/uÒ_°aªÖ”ýÄñòƒß?ŸÁ`bzxïc}{nIý±âWå>>::ZoþØŒýWk¯ÖÄj>Ÿ|Qê§á½Â\^Î'žÎ`0ƒQq·¯÷—n…1BqñÀÀÊïŸÁ`üCã ø~q´9f˜Ügò3_/¢Ñè!î×kæ÷WZ }y ãï…ê¨XÊç9¾˜hOªÜ…˜ü ÆW‹¾¨ä7t/–¢~Áäg0¾^û¯{½cHxE|IýÞ¹‰B_ƒÁø»!Åš_Eh%´‚¬³/˜êí›cåg0¾b ‚ôGBÈþf>P¸ÏÊÏ`|ÕÀ¬ÿ@wÚˆø`ø‘úMMþB_ƒÁø{¥ÿ7ú^¤}¯Ð|ä~0(ˆÇk  Ø`D‡öí×­ØÚ·Û[U;/$`4 ‡ý1íÙ÷hýÿÄÿm1¸ º¿|'€þz«îá`90>FB=»S‚ìóîÌvô:hØp%FŠ’ÙXÚOe-#¯C;à-¸³0ˆ~¿£Ž–¯ë0Ïi[hÃìÂû¢Òƒ!¡­r– ±J¢}Y]ú‚­…E”Q<ž‹åü–æ›Òo ì™MÐ<½G> }®öŸ>85èoñœ8ß¼ö Ù­h¿$‡‡ØÐ¬K7 Žá@÷©MXE÷#hÃJûG%ñiwËlŠñ¸5yKcRøIý~;é—÷‘ößOM‚ðO~?e6EðÈ{`?6ê#í[‘îÛí†%  6¤=vÏZ%ÿéÙ >0_qý˜žk„-˜·”ŸœB#n©šFxn´¸ßˆÜo´´ß&þëkmD×Ú ŽDÄGšÙáàGhHtr?RC¼/ŦP|—dÇnÄthÁ}â|¾ê)U„—ÜïÁ嬀ö¸¨º‚,nÂøp‡/ðöZ´è…XçÒ"ÿÅÅ¥xü7,ûýWÓ"ÙýÅÅà´ ù©Âm«{8‹‘òw$?p\áNݬ`{Ñ2à¡é‚ž:.£W]ûï -ðUvà7¥á é“uóœ’_Í=ôõÓ 1V½;++ñ¯áÃø±jØÅ.B}—(3viÒ~öôþÁyÚo×} þÞšMøÅ4gü›=pŠ?i¿Hš…ðÛÄŸ( •²¥ûÃnÀÝ~up«ßˆyªßO´¿µ,èkR‡bÿÔÔ䔡ü¦P1`Usaý¿ßކ͖´£êߤð‹½]÷Qõå^„€VKôÿÏ5ØTN`—}|Týy¢;<”ú7ZÍzì'í·YýÒ5°é>„‚kZ÷1àëT@(ÿÔý§OÇŸ"åi/--5%ßd$  ‚~´ÿúÔ”ð‹-ké?ŸêÿúǽKAäz$þŽþöaì>¼ ;ƒ6ò— ¦nÕŸ1⸠‘gyžö*ëLò×S…š;•m·­c«Þh¥çE>ùÓm•Èö¨`;üNG”XN¢m–ªJ ñ³fÁàSèoùý\^[ÚEûÅÞ]û ö›ªoj¿®4ÛËk¦ò?²ë¾Ò~Cù×µÝ?’H?,µ_‰¿Cûï’ðdXÖz/›¤~¿aü%ó—…ç—Ú?)ÔßÔ} (÷ úÀý)Ãú;tÉßÞJÛ¶!üZ÷Û¡µ¶Ãó±6Rú•ë—–_ÿXk¿|¨ÂÀ<ÑÞR~“þ û5]`ìÊoñ^»WíWºÄ¿&ŒÿS²ü:ï?Ê/Ô_˜~|HÖKá—q€èýC)Ñ^k¿f¿”~8øAZ±vµd~’¨/´ö —Ÿ•¼'êÓß²šüõÀsäz0ø¯ÿGûýñ½Øè„f#êô½Ù鯄ò{ªù%ëbH¢K ò÷É¿Ùu\uü-²ÇŠ®ÏzòÈß7}{‡¾IüŠ·dzº#`½”D¼úð½@삾ߌ.Å?þ¼"à=öÎ×þ½SS÷Úß,ÙeßEù­ò_3é¾~<Àl)¿®Ú]­ûÃ:ëwhÿ­~Cùïjí_6ó}ñ÷kí—•ïʯ´_Å€×È{tû–÷ÝŸ²åû¢¡÷Ý*”¿µÝ,á[[-ÁoÕOZûI÷üHÿg†æ«ä=¥ü˜üká×A e…€®FWt5v]k¼ÖUÛu­ËUûµî“í¿&…_Š>=¿Mè?E’~ÓúK`©öãš÷ãvíÏëïùAi&©š¢¿ÔþŒÖ~"¾Èõ³Û X ±òG4ÿÑ¿,mtv¯t^±‘ŸJóŽ-¨¬M“Á®ö´íx0 zh7íÑl‘ßëé»;1›'­óp£Eõ‹Ù<òÇ*ËËMò{^D©œ¯È§:–Æ«óP ©óô]LùÍBŸ“úJûEÕ/m¯ùS;GûAùO䷴ߪó­iöËðHª¿¡ÿGÍ–ö7«¼_è¾,õ©@0_i¿æ¿%ýH}þ»†õy¿~Ò}§òkö[¼'íŸt~Ù€1€lD€©ísŠ}ÛDúvÊûÛ-í?&ío•vÍ¿`¾!ýó¸ÕKÅ—ûg¦öÏ+áGç¯6Óù§„ô7Ú­€Úk°á£K‰¿Mû­Œ™MýI÷§ïÔíéSÅþ[ѯÔHdª?Žâ/ÆõÇ•ç_ú„Û·©D⟥[júä--Í‚ßãP'ð|ã xüà*þŸ¢èþ£þËÿÿ°ñ ºïknm"}O“òƒ°W")Óƒ“-$#ïê<1'ùït”‹à±Yzñf]™†(ìÚòÈuJÛeRoYâ xÚðc垎 uõÙ‚€KÏŸ—”ß)þB÷õ]´ß©ûμÿ•tkpdïÌKüåi¿Ðÿõ#;ý…0µßVï7´_øÿ~³âÒ¯u_)¿ ·–ÏÑþ)ËX1à{¡ý´ÕñÚöŸ„[$þöÎ@$;Ðÿeë±ØTõï™,ø¡òߟKñŸ¯12~É|!ùêXûS5–æKÆ+÷/F¨íïß…´wA+hç/»~|o6Jd’þ÷¥FÞ/CÀ¸¦©©û¢Ê/{þ¤ ûb‹¼3¬Tÿ¬ ½Èû…óÏêq×¹•.@ü?ß²qeãÊ•ÎNÜÑ3Ä‚¥ùcuTàv´Z÷»‰ìÚã½#l¬ˆXX$U˜̦¤Ü´ý^ÙùîU¹|ò£“Ç‚ßV>ùÛ:›–Ah:0h¼„ÏâW÷Űᢠûí!À .Í=çGíß;gðO>ý8JþÍkhûÖ_Ëÿš~›ö«´ÝMùlõþa©ûŽa?*Õ¿%^P@‰ÿ¤j’úùÚ?µl)ÿ¤*øOé^?5ö=?Ù}cô=(Û/ˆ/°-+ôLº/©ÿRåüÊjŽçIúíŸÊ/çµù¯‘Ù¾­æ§´^°¿F¿@î×BÂÔ'þ»û±èÿãÁ5£äoÚcèÏ{½·[YúÏH¿/[©æ½Ùß/¸}~=¢¨€LþÅÞÒ~!öº»ÏVðc˜’ïJû´-íÇç´QíÏÙ´_qÝÅø“'x`y¿ÃøËœ_ê>>ÖuÙïÐ…ß>pØÔKû‡UÍßÈûupKÕþßAøûoYù¾Nío˜4h?)Šþ“†ðË1>$ýTó±À>þOdþdÿ[·[e ÀìÓ. ~/)÷©„_Sÿeÿ ÿŠþRþíÊߨò~Êú)é@•üæÍ í>\#×ßEY?…gÚoØ~=ÔGþM²_û\¤ýOu¹ÏðýôœQIáû5ý3Õá×#R~â;²_åüTû3 R¤ü¢»O0ßÇ÷±wEîñ7µÏÒþ:ówjÿš«ö»´WfÞoô£@Ð,¿ììü_äû‚þ„ñu‡ö÷ëš¿‘÷[)¿½Ãó}cدCÿyÿ”îó³úù•ù—%ÿ)ìé{=eËù ío•UÿV™ðËÑ>ªòGy»RûgÇVŸŽç­¿Çbä¯ÕõW£³ÿFÕÝ'Jïßj÷Iþ‰÷Ž´ëý.ôWÂ/ºûóéo9Ô~‹ýV©Ÿ^«:¿òšû2ûÏHÐ#¶¬ä~ÖªøgDÕ¯ÇR~à'ºûðQhž1 ƒÁ`0 ƒÁ`0 ƒÁø\üƒÔ endstream endobj 85 0 obj <> endobj 86 0 obj <> endobj 87 0 obj <> endobj 92 0 obj [/Indexed /DeviceRGB 255 <000000FF00006B6BD2FFFFFF666666FF66667B7B7B6666C24A4AB96B6B6B4242 B1F30000FF9090B1B1DA888888737373B1A1A1FFB1B1CC6B6B181818FF33337B 7BCC6666B9E33333B9B9B99090D2DADADA8888CCB98888FFC2C2424242E37B7B FFE3E3DA9999FF1818FF7B7BEB2121B1B1EBFF4A4A8080D2C2C2E3A9A9A93333 33F33333D252529090E3DADAF3CCCCEBEB1818FFA1A1999999A1A1DAB99090FF D2D2525252EBA9A98080E3A1A1E3EBEBF3080808FF08087B7BD2FF73737373C2 5A5AB9B1B1B1292929FF4242E34242C2C2C2E3E3E3DADAEBF38888FFF3F3EB90 90FF2929FF8888C2C2EBB1B1F3FF5A5AD2D2D2EB4242E34A4A9999F3CCCCF3A1 A1F3C2C2F37373D2FF6B6B8080806B6BC26666CC5252B94A4AB1FF9999B9B9E3 B1B1E3909090B1A9A9FFB9B9D26B6BCC7373212121FF39398080CCE339399999 D29090DAC28080FFCCCC4A4A4AE38080FFEBEBFF2121FF8080F32121B9B9EBFF 52528888D28080DA393939DA4A4A9999E39090EBE3E3F3DADAFFD2D2EBF31010 FFA9A9A1A1A1A9A9DAB99999FFDADA5A5A5A8888E3A9A9E3A1A1EBF3F3F3EBEB FF101010FF10107B7BDA7373CC5A5AC2CCCCCCEBEBEBB9B9F3B1B1FFD2D2F3CC CCFFA9A9F3C2C2FF6B6BCC5252C2D273739999DAC28888F329298888DA9999EB E3E3FF8888EBA9A9EBF3F3FFD2D2FFF7B796FC949005E770C2F0F4F7B82899EB 94F741F7FC9490F7B84E6D892D05E770C2F118F7B77BF741F7FC949003EE8803 D600F713EE00016FF7A2E3007DF1C2F164000FF8DF0008402004F7A3A0C40000 1F200C000FF8000000C4000CC40000DF0008000000F713E22A001EC4000CDEFD 30C2F18CF7A10E03EE8803D60000000305E00FC2F1A800E44A05E0F8000032F7 B9C59A3DEC000030001DE803B600C2F1E000CD7C00000900CD5C000000FF92D0 05E10005E17003B600C2F20400CD7CC2F21000F56A033238FFFFFFC2F2780010 260000300021F9000028FF92D0601232FF94D0FF92A005E100F432F805E100C2 F22C66E8880000006021D3FF92D0F432F805E100C2F26C66E94B00000060D91D>]endobj 91 0 obj <>stream xœí} Oi–¶s1Ónó!H ‚Âf0IX&|&\‡5Ù| .FÁËe@_˜ F€Âm#I‡ÉÆÍF ¼?tÏ9ï¥Þ*@fâäö‚ Æ—AçbSHôïÝœiñ×­ôÆ |E ã‹`c±ªw ~~^±Iäo*ô%1Œ/+óŒÕû'6+6Áö³ò3ßBÁxo¨xÌïŸh‘¿B_ƒÁøhÙXœ{2PÜ]ï÷û»Aø¹«ÁøFp3¸Ÿ u‡zçªxƒñm`3Ä¡ýÅÐB¡¹3…¾ ƒñ…н±ØTõ$„xRÅÓúŒoþ`0^UÕ47×gî3ßî÷nãKñÅ•_ }) ãËâ—¿ßߢ©½×Â`0 ˆë}…¾ƒQT³ø3ß(n3ûŒoÑB_ƒÁ( b· } £0ˆ²ñg0¾MDÙø3ß&˜ü Æ7ŠëìûŒooXúŒoi&?ƒñ­àæó ¿_/äã®ü­µ_ð‚~ëë…¾ã7Ÿ·øWz—:7®|×ùžÔëFþÉ|_ôÒÎÇZÏwTè‹`0þA1S/‰òW6®t^¹Ò Mþëyä_?ðùþ—?× —Âäg0.‰ûÀxã †zõn,Zm;{­Ñ÷ïÿ[È¿ñù²L~ãÒ~'(Ÿ¯P °”?=4NÍ=óù’¨¶]¸Nî–ŠkI2ùŒKÂOt¯j©ðw^¿¡üѨ1©¿•ˆbë»V€ë´aý\^ +?ƒqiÜDÅ‚G3”ñ9¿Yï›üA2ß—ÌØö?˜Ïd“Ù$\+?ƒñˆåïÓÑXçw6å¯Öä§:!YhåÏmõ3@~V~ãó0°Ñ¹!Ž&déO+4:(^S…6‹;Tþ7…¸VDi&›Aîù³>îçg0. g°Sµl!@“äÔÂ/Ò}‚ü€ú@ÿd6+²V~㲘Yê\zNGcADgç†$ÿmÝÑ×*óý¬(ùÔögüÙ üŒÏÅÍÅ`pf—‚ ý@AþÃh4-ϱ+a ~D~¬øù²lûŒÏBïÒâRh³Â_ BÀ Èo ?)¿¦~mf¹ŸM²íg0>þÅx|1¾ø!þ!aø$òGÑ}¨üY‹ý…·ýÄþ$Û~ã³P¬ÿP¯Š ,Å—üףј>¥Õ&üÙB“?+J~äüïòZŒlܯB4‰†ô_ôÓL~cX¿™óg}ÉÆ|ãÚèëöð~*mwwyxïã×p:üëÙY8ŽÐgÚÏú_{jFTüPù“IV~ã3ðóœDÕñ c|Ï|¾?(É—ìÅæøº½©ðþ~d?Lã^ ¯6œÏeÀéò*œFàùRûíkÎó¦J!ßÇFôïÉRw]l\øc0.ŒÇOû逹/GõËQ}IÓö'³è¼3™Tþ—­½ìÚOõS¤û€×ÀíÝÿ>ïçOV‡VOV"«4æá“?^:,ÃÔ¸`þ¸èë“I¿;ãâ(Ö?é}ÒÛ;ÛÜ\SÕDLíóŠQ}¶j?xnâþxžòçºà>)ŒJt&ú¯6ä\|xHpÿ%Š?6éýáKöSvFùýã2é—}D8bò3—¿7ê õÂz‚ìŸû'£Øgé½:H’éGÔ8¾ho>±OÔßGþ*âõONVON]~ûס“!|t?ŒÊOQƒØIì›ç"ùÉ÷Ó ¿lR;òñãRh …B+ÐBž„zç~3 ýF²o R(¿Ãö¯ãß—ôO¡‚£éôzƒ¾çgþ£C#'CC@þW-å—ÒI$Ì€AäÏ’ñÏR¹ß¢>+?ƒqÜX‘Qèý-–Óoúœ@Ê÷3™yÛ×ìu%ÒôƒòHÈW¥ò¯"ÅÚ:424´{‚äÔ틤63¾ùµðgù…+ö2Œ‹âþ€ÄÊÊñÿ/­7¶™õ¾,ÖÝl9n^Ⱦþyð°HãWQ×ÑÞíæì¿ündhw„„ÿääDÿ0±¬? ?|á²uvƒ~Ó÷[®„•ŸÁ¸8~(¦FüýÿÆ›NÛïÓõ>‡ò¿ÝGîKáO…SaUëá‚ ŒüjûáW#€¡]Š (þ»ïÎPýQù÷¥ö'ö­Ó…ògÇůÓ0ëêXùŒ‹ãfw1Bñ`eÓxÓÅô'E_ßxÖ$s‚È¿¿Of=œŠDVwÏ^*ú½GvGFliÿè±DP_†½³U•õ§(–XÒß  ~Ö0V~ãsð˜È?V,B¿ÅxÓ-çÝüY[Á¯Qr;ùQ¶w‰æ¹_¥ðCÊOLkþð[úÓ‰ ÿOê¯Ã`üçUo_"ѧËj–Ä_¬èa]+?ƒqq<öuwûíÊŸWíOf{¨ânöóß½Šäߗ‰h½>¢Z?æûCÄSú‡FýÉõ[oìb¹ÈIääe¿êÓ0®ËýjjU‹`åg0.·€äÿ@…ñ^žîõ³Rû Û?Ü¿ M°×zg;ù‡PÞIù²ÞÙCê¿Bã?tbô…_î6ŒöŸ:û¦ˆúBû1Ð"ž¬ü ÆgÀß]è®Gþ#û7'´›å>_6LÿÞÕ« I}ª÷åŒ÷ND±ì=ÁzãT ?ÕûOÞ}âÅjî ågÅg0.çâ›þz’ÿâ çZ åÙÏ¿Qgâ*¥ü²à×`¾Òä¦b?°ý­¥ð¹·Èþ·ôŽóý„é´˜‡œØ×ƒ¦Ÿ'ô0Ÿ¿±¼¿ ù³¦ïÏŸÏ?ÂÒ/¹i6ß;¥þ!)ü#µÞQÊ/»úWëg££Ín£€ Èr¿˜Ù“dåg0>é3Ù_ßíF~£“?ébûß_¥”_VüÃ~¥ò á7ëýôRÒÿDŒðÇ©½‘ðnÿiUc|Øö3Ÿ‹XßðþŸ-úÍ8O±­á—Í_Ìc„_Ò?’Ûß=#é—"ÿÖHúÿ›Ê}¤üb€¿œÜüO¥vïæ\/7#†øeiF?Oèa0.ëÑ´wÂoÙŸ¯üz4 ÖûòÉß|ÕÈù#‘HûIûnûî¶³wgTî“Å~hVfŸÃ”_)ÿÍ ¾4-(Ùop+ŒÓ¼½€/“ŸÁ¸q±®–– „fÿŒó,Û~.ä§^þ„®ö›Ëøà„>Tþ!9Êgä­Áè¿êœ_ð%åËñ½)ç„~‚ZɇÆösÎÏ`\bîîf ÂbÿŒó´‘¿áêUQï¾GçÍÓ}ò“!1ÆG)¿9ÌÇÈù‡TÒ/föÐJ@ûûgy—lüàjšóN`0‡\¤s`ÐßüY‹û.ýüS ´ýªÚŸ@ÛNÚ/çõœ¨‚ñß\ÐkïJùMåˆ~`üö^C„îê˰ò3—…Z¤³bsSð_°¿þ†óDSùÝ ~ V¹’~þ”X¿/,øIåG¡·­æ·÷VŒÔ·ôÐËy8Ù­”?Ë9?ƒqY(î?ž©ûÏU~Ëõ»ÙþI³Ú/&öÐ^±Ž‡˜²«¤ß¾”gî?‡dÊ¿z"‚)D(?.äçø­ŒZÊGäülûŒ ã0z]ùgff*Èúûgœ§ZÕ~*÷çð›Õ~k”ϼ´ý‘°š×£êýNò{½§ÿI¿Ö}±–Ìùû Ǩ}]ìϰò3—BßmuWŽŸgfn û+Ðø»“ß>³'o„_s¾ò‹¥|(é²ÿ<ò{ñž# ü/UüHøi^ŸsÔÀ¸X»;ÃÕ~ã’°îÁûóù'>Jþlþ:E??P_Tûç§§kÐöâpÎõœ¿;‘®^ÌçO!õ÷‰œíùÊß®gõ‘úæÊ{©ˆUïK$–moÊÛu‰A>¬ü ÆE¡ïŸ®æÆïåüëæb^Ùd&ï뎤í—+ùØjt¹ß£»wz:<üÓÙÙªÉâZ¾“ï†ï´/ù›‘KyHåŸü¤ÿ\ƒ!q]õñ#€ø7ˆûçVû¬•2if ꃜu ñ“S{‘ý~ãûXÆ;ûixô•}a®W¿þôŽº÷iBϪ¹’O¿Èùé ¯:rþ.P~ZFL(¿ìyàî~ãÓPm¸þDz§]ÿ„ë¿ucJ/®Ü]:utw»+c¸ûVáûåœÞýˆõVƒ^»ŸîÌ1¢~{ÿðoâ^]«ÏDÂäÏÙ®¥±Tß±'‰~¤±}ª6yð·øWa0¾ÜÖwáõz®æ›ÂŸ?¯Ù6+í=Xt›²ÎÈIòÓHŸÈ~*%Ù¿&‡í…Qßi!ÏœúÈ«= Ÿ`Ý‘{]?Ú~rýÖÚÝ„F½x¯yûàäßè†ÁøÊÑ­¶Rþ_**Ôð^Êøëýÿ7ï>›ôc;ÊïkãŒvs˜ÎÇ 7Œö¾”ÔÇÁ{â†\Æ*^'CrmO9£'<šÃ?ï5¤tOÖûS{ÚEO_FŒñÑø[þó0_/Ž>ïÍŠMIý‰s¦ôz3ö™=”rÛoו벆øÒŒ~q“nû}ºWmkôâÊž«òîÜrdßnûnX ðÙÜ/áè7œ”Â/”_oÓã«EµYïÚcÓsúüÝ3y¨±I?òÍ·mÎÍ‘îí£Ûõí«™}4Ä_êÿÉIÎøDîäÄä¾ÝgõóEð wíWâmÜÇ‘ý>¾cƒqA˜äÿ¹¥E®å1¡–ñšÉûÀ¤©üú>½öþþvYò»º/²~âp8bQ(n/Üë„_Ýw>¢—ñÀé¼h$rÎk—Âï3oÒËýý Æ'!jÿ—‰–‰½ŠW½¿¾Û…ü9Û=»ô}zí'Í'(ë$ôr>á”pþ’ú«Î¹w«Öd¾°^ÄCÌé‘ý|ùƒZ³êf]jØnÜßÏ`| ¢FOß ÿ6Å}¼oOÞžŽå<|IºQ¯“ü¹°ãK¦ù}b–®S÷»V¾§¤ÂÒò§h= ü®¿æ}Ä»7žµ:ú4Ú?÷ß„Áø&`*ÿ¦céÞn—›vÞ›Ê/´?›qŽá?KÐðþ«2éW{åb~n#ýÞ™sø#j6_Šfó%ö#®“&3bÙn›i½ü¿ƒñ á¶EþÇzÝîz¡ûn·ëäžÔ÷ɂ޸º£ÒËôòNÝ)¹œW$üSÎõRŽ„á§•»ÂF­…?õNy±Ž‡-áQ> ƧÀPþ›@yâ=4y«¾üu"r]û‘üI`¿Ë Úá”è—Py?!Ü;÷bFOÔŠ½ÒóGhh_äìü¹“ìp°i?“ŸÁøD«£êf-HzÁüzy—î7åÕd²–öÌ¿vP:ÚŽºäO…çwï~däýéðÙ‰òü4¶/uÒ_°aªÖ”ýÄñòƒß?ŸÁ`bzxïc}{nIý±âWå>>::ZoþØŒýWk¯ÖÄj>Ÿ|Qê§á½Â\^Î'žÎ`0ƒQq·¯÷—n…1BqñÀÀÊïŸÁ`üCã ø~q´9f˜Ügò3_/¢Ñè!î×kæ÷WZ }y ãï…ê¨XÊç9¾˜hOªÜ…˜ü ÆW‹¾¨ä7t/–¢~Áäg0¾^û¯{½cHxE|IýÞ¹‰B_ƒÁø»!Åš_Eh%´‚¬³/˜êí›cåg0¾b ‚ôGBÈþf>P¸ÏÊÏ`|ÕÀ¬ÿ@wÚˆø`ø‘úMMþB_ƒÁø{¥ÿ7ú^¤}¯Ð|ä~0(ˆÇk  Ø`D‡öí×­ØÚ·Û[U;/$`4 ‡ý1íÙ÷hýÿÄÿm1¸ º¿|'€þz«îá`90>FB=»S‚ìóîÌvô:hØp%FŠ’ÙXÚOe-#¯C;à-¸³0ˆ~¿£Ž–¯ë0Ïi[hÃìÂû¢Òƒ!¡­r– ±J¢}Y]ú‚­…E”Q<ž‹åü–æ›Òo ì™MÐ<½G> }®öŸ>85èoñœ8ß¼ö Ù­h¿$‡‡ØÐ¬K7 Žá@÷©MXE÷#hÃJûG%ñiwËlŠñ¸5yKcRøIý~;é—÷‘ößOM‚ðO~?e6EðÈ{`?6ê#í[‘îÛí†%  6¤=vÏZ%ÿéÙ >0_qý˜žk„-˜·”ŸœB#n©šFxn´¸ßˆÜo´´ß&þëkmD×Ú ŽDÄGšÙáàGhHtr?RC¼/ŦP|—dÇnÄthÁ}â|¾ê)U„—ÜïÁ嬀ö¸¨º‚,nÂøp‡/ðöZ´è…XçÒ"ÿÅÅ¥xü7,ûýWÓ"ÙýÅÅà´ ù©Âm«{8‹‘òw$?p\áNݬ`{Ñ2à¡é‚ž:.£W]ûï -ðUvà7¥á é“uóœ’_Í=ôõÓ 1V½;++ñ¯áÃø±jØÅ.B}—(3viÒ~öôþÁyÚo×} þÞšMøÅ4gü›=pŠ?i¿Hš…ðÛÄŸ( •²¥ûÃnÀÝ~up«ßˆyªßO´¿µ,èkR‡bÿÔÔ䔡ü¦P1`Usaý¿ßކ͖´£êߤð‹½]÷Qõå^„€VKôÿÏ5ØTN`—}|Týy¢;<”ú7ZÍzì'í·YýÒ5°é>„‚kZ÷1àëT@(ÿÔý§OÇŸ"åi/--5%ßd$  ‚~´ÿúÔ”ð‹-ké?ŸêÿúǽKAäz$þŽþöaì>¼ ;ƒ6ò— ¦nÕŸ1⸠‘gyžö*ëLò×S…š;•m·­c«Þh¥çE>ùÓm•Èö¨`;üNG”XN¢m–ªJ ñ³fÁàSèoùý\^[ÚEûÅÞ]û ö›ªoj¿®4ÛËk¦ò?²ë¾Ò~Cù×µÝ?’H?,µ_‰¿Cûï’ðdXÖz/›¤~¿aü%ó—…ç—Ú?)ÔßÔ} (÷ úÀý)Ãú;tÉßÞJÛ¶!üZ÷Û¡µ¶Ãó±6Rú•ë—–_ÿXk¿|¨ÂÀ<ÑÞR~“þ û5]`ìÊoñ^»WíWºÄ¿&ŒÿS²ü:ï?Ê/Ô_˜~|HÖKá—q€èýC)Ñ^k¿f¿”~8øAZ±vµd~’¨/´ö —Ÿ•¼'êÓß²šüõÀsäz0ø¯ÿGûýñ½Øè„f#êô½Ù鯄ò{ªù%ëbH¢K ò÷É¿Ùu\uü-²ÇŠ®ÏzòÈß7}{‡¾IüŠ·dzº#`½”D¼úð½@삾ߌ.Å?þ¼"à=öÎ×þ½SS÷Úß,ÙeßEù­ò_3é¾~<Àl)¿®Ú]­ûÃ:ëwhÿ­~Cùïjí_6ó}ñ÷kí—•ïʯ´_Å€×È{tû–÷ÝŸ²åû¢¡÷Ý*”¿µÝ,á[[-ÁoÕOZûI÷üHÿg†æ«ä=¥ü˜üká×A e…€®FWt5v]k¼ÖUÛu­ËUûµî“í¿&…_Š>=¿Mè?E’~ÓúK`©öãš÷ãvíÏëïùAi&©š¢¿ÔþŒÖ~"¾Èõ³Û X ±òG4ÿÑ¿,mtv¯t^±‘ŸJóŽ-¨¬M“Á®ö´íx0 zh7íÑl‘ßëé»;1›'­óp£Eõ‹Ù<òÇ*ËËMò{^D©œ¯È§:–Æ«óP ©óô]LùÍBŸ“úJûEÕ/m¯ùS;GûAùO䷴ߪó­iöËðHª¿¡ÿGÍ–ö7«¼_è¾,õ©@0_i¿æ¿%ýH}þ»†õy¿~Ò}§òkö[¼'íŸt~Ù€1€lD€©ísŠ}ÛDúvÊûÛ-í?&ío•vÍ¿`¾!ýó¸ÕKÅ—ûg¦öÏ+áGç¯6Óù§„ô7Ú­€Úk°á£K‰¿Mû­Œ™MýI÷§ïÔíéSÅþ[ѯÔHdª?Žâ/ÆõÇ•ç_ú„Û·©D⟥[júä--Í‚ßãP'ð|ã xüà*þŸ¢èþ£þËÿÿ°ñ ºïknm"}O“òƒ°W")Óƒ“-$#ïê<1'ùït”‹à±Yzñf]™†(ìÚòÈuJÛeRoYâ xÚðc垎 uõÙ‚€KÏŸ—”ß)þB÷õ]´ß©ûμÿ•tkpdïÌKüåi¿Ðÿõ#;ý…0µßVï7´_øÿ~³âÒ¯u_)¿ ·–ÏÑþ)ËX1à{¡ý´ÕñÚöŸ„[$þöÎ@$;Ðÿeë±ØTõï™,ø¡òߟKñŸ¯12~É|!ùêXûS5–æKÆ+÷/F¨íïß…´wA+hç/»~|o6Jd’þ÷¥FÞ/CÀ¸¦©©û¢Ê/{þ¤ ûb‹¼3¬Tÿ¬ ½Èû…óÏêq×¹•.@ü?ß²qeãÊ•ÎNÜÑ3Ä‚¥ùcuTàv´Z÷»‰ìÚã½#l¬ˆXX$U˜̦¤Ü´ý^ÙùîU¹|ò£“Ç‚ßV>ùÛ:›–Ah:0h¼„ÏâW÷Űᢠûí!À .Í=çGíß;gðO>ý8JþÍkhûÖ_Ëÿš~›ö«´ÝMùlõþa©ûŽa?*Õ¿%^P@‰ÿ¤j’úùÚ?µl)ÿ¤*øOé^?5ö=?Ù}cô=(Û/ˆ/°-+ôLº/©ÿRåüÊjŽçIúíŸÊ/çµù¯‘Ù¾­æ§´^°¿F¿@î×BÂÔ'þ»û±èÿãÁ5£äoÚcèÏ{½·[YúÏH¿/[©æ½Ùß/¸}~=¢¨€LþÅÞÒ~!öº»ÏVðc˜’ïJû´-íÇç´QíÏÙ´_qÝÅø“'x`y¿ÃøËœ_ê>>ÖuÙïÐ…ß>pØÔKû‡UÍßÈûupKÕþßAøûoYù¾Nío˜4h?)Šþ“†ðË1>$ýTó±À>þOdþdÿ[·[e ÀìÓ. ~/)÷©„_Sÿeÿ ÿŠþRþíÊߨò~Êú)é@•üæÍ í>\#×ßEY?…gÚoØ~=ÔGþM²_û\¤ýOu¹ÏðýôœQIáû5ý3Õá×#R~â;²_åüTû3 R¤ü¢»O0ßÇ÷±wEîñ7µÏÒþ:ówjÿš«ö»´WfÞoô£@Ð,¿ììü_äû‚þ„ñu‡ö÷ëš¿‘÷[)¿½Ãó}cدCÿyÿ”îó³úù•ù—%ÿ)ìé{=eËù ío•UÿV™ðËÑ>ªòGy»RûgÇVŸŽç­¿Çbä¯ÕõW£³ÿFÕÝ'Jïßj÷Iþ‰÷Ž´ëý.ôWÂ/ºûóéo9Ô~‹ýV©Ÿ^«:¿òšû2ûÏHÐ#¶¬ä~ÖªøgDÕ¯ÇR~à'ºûðQhž1 ƒÁ`0 ƒÁ`0 ƒÁø\üƒÔ endstream endobj 93 0 obj <> endobj 94 0 obj <> endobj 95 0 obj <> endobj 100 0 obj [/Indexed /DeviceRGB 255 <000000FF00006B6BD2FFFFFF666666FF66667B7B7B6666C24A4AB96B6B6B4242 B1F30000FF9090B1B1DA888888737373B1A1A1FFB1B1CC6B6B181818FF33337B 7BCC6666B9E33333B9B9B99090D2DADADA8888CCB98888FFC2C2424242E37B7B FFE3E3DA9999FF1818FF7B7BEB2121B1B1EBFF4A4A8080D2C2C2E3A9A9A93333 33F33333D252529090E3DADAF3CCCCEBEB1818FFA1A1999999A1A1DAB99090FF D2D2525252EBA9A98080E3A1A1E3EBEBF3080808FF08087B7BD2FF73737373C2 5A5AB9B1B1B1292929FF4242E34242C2C2C2E3E3E3DADAEBF38888FFF3F3EB90 90FF2929FF8888C2C2EBB1B1F3FF5A5AD2D2D2EB4242E34A4A9999F3CCCCF3A1 A1F3C2C2F37373D2FF6B6B8080806B6BC26666CC5252B94A4AB1FF9999B9B9E3 B1B1E3909090B1A9A9FFB9B9D26B6BCC7373212121FF39398080CCE339399999 D29090DAC28080FFCCCC4A4A4AE38080FFEBEBFF2121FF8080F32121B9B9EBFF 52528888D28080DA393939DA4A4A9999E39090EBE3E3F3DADAFFD2D2EBF31010 FFA9A9A1A1A1A9A9DAB99999FFDADA5A5A5A8888E3A9A9E3A1A1EBF3F3F3EBEB FF101010FF10107B7BDA7373CC5A5AC2CCCCCCEBEBEBB9B9F3B1B1FFD2D2F3CC CCFFA9A9F3C2C2FF6B6BCC5252C2D273739999DAC28888F329298888DA9999EB E3E3FF8888EBA9A9EBF3F3FFD2D2FFF7B796FC949005E770C2F0F4F7B82899EB 94F741F7FC9490F7B84E6D892D05E770C2F118F7B77BF741F7FC949003EE8803 D600F713EE00016FF7A2E3007DF1C2F164000FF8DF0008402004F7A3A0C40000 1F200C000FF8000000C4000CC40000DF0008000000F713E22A001EC4000CDEFD 30C2F18CF7A10E03EE8803D60000000305E00FC2F1A800E44A05E0F8000032F7 B9C59A3DEC000030001DE803B600C2F1E000CD7C00000900CD5C000000FF92D0 05E10005E17003B600C2F20400CD7CC2F21000F56A033238FFFFFFC2F2780010 260000300021F9000028FF92D0601232FF94D0FF92A005E100F432F805E100C2 F22C66E8880000006021D3FF92D0F432F805E100C2F26C66E94B00000060D91D>]endobj 99 0 obj <>stream xœí} Oi–¶s1Ónó!H ‚Âf0IX&|&\‡5Ù| .FÁËe@_˜ F€Âm#I‡ÉÆÍF ¼?tÏ9ï¥Þ*@fâäö‚ Æ—AçbSHôïÝœiñ×­ôÆ |E ã‹`c±ªw ~~^±Iäo*ô%1Œ/+óŒÕû'6+6Áö³ò3ßBÁxo¨xÌïŸh‘¿B_ƒÁøhÙXœ{2PÜ]ï÷û»Aø¹«ÁøFp3¸Ÿ u‡zçªxƒñm`3Ä¡ýÅÐB¡¹3…¾ ƒñ…н±ØTõ$„xRÅÓúŒoþ`0^UÕ47×gî3ßî÷nãKñÅ•_ }) ãËâ—¿ßߢ©½×Â`0 ˆë}…¾ƒQT³ø3ß(n3ûŒoÑB_ƒÁ( b· } £0ˆ²ñg0¾MDÙø3ß&˜ü Æ7ŠëìûŒooXúŒoi&?ƒñ­àæó ¿_/äã®ü­µ_ð‚~ëë…¾ã7Ÿ·øWz—:7®|×ùžÔëFþÉ|_ôÒÎÇZÏwTè‹`0þA1S/‰òW6®t^¹Ò Mþëyä_?ðùþ—?× —Âäg0.‰ûÀxã †zõn,Zm;{­Ñ÷ïÿ[È¿ñù²L~ãÒ~'(Ÿ¯P °”?=4NÍ=óù’¨¶]¸Nî–ŠkI2ùŒKÂOt¯j©ðw^¿¡üѨ1©¿•ˆbë»V€ë´aý\^ +?ƒqiÜDÅ‚G3”ñ9¿Yï›üA2ß—ÌØö?˜Ïd“Ù$\+?ƒñˆåïÓÑXçw6å¯Öä§:!YhåÏmõ3@~V~ãó0°Ñ¹!Ž&déO+4:(^S…6‹;Tþ7…¸VDi&›Aîù³>îçg0. g°Sµl!@“äÔÂ/Ò}‚ü€ú@ÿd6+²V~㲘Yê\zNGcADgç†$ÿmÝÑ×*óý¬(ùÔögüÙ üŒÏÅÍÅ`pf—‚ ý@AþÃh4-ϱ+a ~D~¬øù²lûŒÏBïÒâRh³Â_ BÀ Èo ?)¿¦~mf¹ŸM²íg0>þÅx|1¾ø!þ!aø$òGÑ}¨üY‹ý…·ýÄþ$Û~ã³P¬ÿP¯Š ,Å—üףј>¥Õ&üÙB“?+J~äüïòZŒlܯB4‰†ô_ôÓL~cX¿™óg}ÉÆ|ãÚèëöð~*mwwyxïã×p:üëÙY8ŽÐgÚÏú_{jFTüPù“IV~ã3ðóœDÕñ c|Ï|¾?(É—ìÅæøº½©ðþ~d?Lã^ ¯6œÏeÀéò*œFàùRûíkÎó¦J!ßÇFôïÉRw]l\øc0.ŒÇOû逹/GõËQ}IÓö'³è¼3™Tþ—­½ìÚOõS¤û€×ÀíÝÿ>ïçOV‡VOV"«4æá“?^:,ÃÔ¸`þ¸èë“I¿;ãâ(Ö?é}ÒÛ;ÛÜ\SÕDLíóŠQ}¶j?xnâþxžòçºà>)ŒJt&ú¯6ä\|xHpÿ%Š?6éýáKöSvFùýã2é—}D8bò3—¿7ê õÂz‚ìŸû'£Øgé½:H’éGÔ8¾ho>±OÔßGþ*âõONVON]~ûס“!|t?ŒÊOQƒØIì›ç"ùÉ÷Ó ¿lR;òñãRh …B+ÐBž„zç~3 ýF²o R(¿Ãö¯ãß—ôO¡‚£éôzƒ¾çgþ£C#'CC@þW-å—ÒI$Ì€AäÏ’ñÏR¹ß¢>+?ƒqÜX‘Qèý-–Óoúœ@Ê÷3™yÛ×ìu%ÒôƒòHÈW¥ò¯"ÅÚ:424´{‚äÔ틤63¾ùµðgù…+ö2Œ‹âþ€ÄÊÊñÿ/­7¶™õ¾,ÖÝl9n^Ⱦþyð°HãWQ×ÑÞíæì¿ündhw„„ÿääDÿ0±¬? ?|á²uvƒ~Ó÷[®„•ŸÁ¸8~(¦FüýÿÆ›NÛïÓõ>‡ò¿ÝGîKáO…SaUëá‚ ŒüjûáW#€¡]Š (þ»ïÎPýQù÷¥ö'ö­Ó…ògÇůÓ0ëêXùŒ‹ãfw1Bñ`eÓxÓÅô'E_ßxÖ$s‚È¿¿Of=œŠDVwÏ^*ú½GvGFliÿè±DP_†½³U•õ§(–XÒß  ~Ö0V~ãsð˜È?V,B¿ÅxÓ-çÝüY[Á¯Qr;ùQ¶w‰æ¹_¥ðCÊOLkþð[úÓ‰ ÿOê¯Ã`üçUo_"ѧËj–Ä_¬èa]+?ƒqq<öuwûíÊŸWíOf{¨ânöóß½Šäߗ‰h½>¢Z?æûCÄSú‡FýÉõ[oìb¹ÈIääe¿êÓ0®ËýjjU‹`åg0.·€äÿ@…ñ^žîõ³Rû Û?Ü¿ M°×zg;ù‡PÞIù²ÞÙCê¿Bã?tbô…_î6ŒöŸ:û¦ˆúBû1Ð"ž¬ü ÆgÀß]è®Gþ#û7'´›å>_6LÿÞÕ« I}ª÷åŒ÷ND±ì=ÁzãT ?ÕûOÞ}âÅjî ågÅg0.çâ›þz’ÿâ çZ åÙÏ¿Qgâ*¥ü²à×`¾Òä¦b?°ý­¥ð¹·Èþ·ôŽóý„é´˜‡œØ×ƒ¦Ÿ'ô0Ÿ¿±¼¿ ù³¦ïÏŸÏ?ÂÒ/¹i6ß;¥þ!)ü#µÞQÊ/»úWëg££Ín£€ Èr¿˜Ù“dåg0>é3Ù_ßíF~£“?ébûß_¥”_VüÃ~¥ò á7ëýôRÒÿDŒðÇ©½‘ðnÿiUc|Øö3Ÿ‹XßðþŸ-úÍ8O±­á—Í_Ìc„_Ò?’Ûß=#é—"ÿÖHúÿ›Ê}¤üb€¿œÜüO¥vïæ\/7#†øeiF?Oèa0.ëÑ´wÂoÙŸ¯üz4 ÖûòÉß|ÕÈù#‘HûIûnûî¶³wgTî“Å~hVfŸÃ”_)ÿÍ ¾4-(Ùop+ŒÓ¼½€/“ŸÁ¸q±®–– „fÿŒó,Û~.ä§^þ„®ö›Ëøà„>Tþ!9Êgä­Áè¿êœ_ð%åËñ½)ç„~‚ZɇÆösÎÏ`\bîîf ÂbÿŒó´‘¿áêUQï¾GçÍÓ}ò“!1ÆG)¿9ÌÇÈù‡TÒ/föÐJ@ûûgy—lüàjšóN`0‡\¤s`ÐßüY‹û.ýüS ´ýªÚŸ@ÛNÚ/çõœ¨‚ñß\ÐkïJùMåˆ~`üö^C„îê˰ò3—…Z¤³bsSð_°¿þ†óDSùÝ ~ V¹’~þ”X¿/,øIåG¡·­æ·÷VŒÔ·ôÐËy8Ù­”?Ë9?ƒqY(î?ž©ûÏU~Ëõ»ÙþI³Ú/&öÐ^±Ž‡˜²«¤ß¾”gî?‡dÊ¿z"‚)D(?.äçø­ŒZÊGäülûŒ ã0z]ùgff*Èúûgœ§ZÕ~*÷çð›Õ~k”ϼ´ý‘°š×£êýNò{½§ÿI¿Ö}±–Ìùû Ǩ}]ìϰò3—BßmuWŽŸgfn û+Ðø»“ß>³'o„_s¾ò‹¥|(é²ÿ<ò{ñž# ü/UüHøi^ŸsÔÀ¸X»;ÃÕ~ã’°îÁûóù'>Jþlþ:E??P_Tûç§§kÐöâpÎõœ¿;‘®^ÌçO!õ÷‰œíùÊß®gõ‘úæÊ{©ˆUïK$–moÊÛu‰A>¬ü ÆE¡ïŸ®æÆïåüëæb^Ùd&ï뎤í—+ùØjt¹ß£»wz:<üÓÙÙªÉâZ¾“ï†ï´/ù›‘KyHåŸü¤ÿ\ƒ!q]õñ#€ø7ˆûçVû¬•2if ꃜu ñ“S{‘ý~ãûXÆ;ûixô•}a®W¿þôŽº÷iBϪ¹’O¿Èùé ¯:rþ.P~ZFL(¿ìyàî~ãÓPm¸þDz§]ÿ„ë¿ucJ/®Ü]:utw»+c¸ûVáûåœÞýˆõVƒ^»ŸîÌ1¢~{ÿðoâ^]«ÏDÂäÏÙ®¥±Tß±'‰~¤±}ª6yð·øWa0¾ÜÖwáõz®æ›ÂŸ?¯Ù6+í=Xt›²ÎÈIòÓHŸÈ~*%Ù¿&‡í…Qßi!ÏœúÈ«= Ÿ`Ý‘{]?Ú~rýÖÚÝ„F½x¯yûàäßè†ÁøÊÑ­¶Rþ_**Ôð^Êøëýÿ7ï>›ôc;ÊïkãŒvs˜ÎÇ 7Œö¾”ÔÇÁ{â†\Æ*^'CrmO9£'<šÃ?ï5¤tOÖûS{ÚEO_FŒñÑø[þó0_/Ž>ïÍŠMIý‰s¦ôz3ö™=”rÛoו벆øÒŒ~q“nû}ºWmkôâÊž«òîÜrdßnûnX ðÙÜ/áè7œ”Â/”_oÓã«EµYïÚcÓsúüÝ3y¨±I?òÍ·mÎÍ‘îí£Ûõí«™}4Ä_êÿÉIÎøDîäÄä¾ÝgõóEð wíWâmÜÇ‘ý>¾cƒqA˜äÿ¹¥E®å1¡–ñšÉûÀ¤©üú>½öþþvYò»º/²~âp8bQ(n/Üë„_Ýw>¢—ñÀé¼h$rÎk—Âï3oÒËýý Æ'!jÿ—‰–‰½ŠW½¿¾Û…ü9Û=»ô}zí'Í'(ë$ôr>á”pþ’ú«Î¹w«Öd¾°^ÄCÌé‘ý|ùƒZ³êf]jØnÜßÏ`| ¢FOß ÿ6Å}¼oOÞžŽå<|IºQ¯“ü¹°ãK¦ù}b–®S÷»V¾§¤ÂÒò§h= ü®¿æ}Ä»7žµ:ú4Ú?÷ß„Áø&`*ÿ¦céÞn—›vÞ›Ê/´?›qŽá?KÐðþ«2éW{åb~n#ýÞ™sø#j6_Šfó%ö#®“&3bÙn›i½ü¿ƒñ á¶EþÇzÝîz¡ûn·ëäžÔ÷ɂ޸º£ÒËôòNÝ)¹œW$üSÎõRŽ„á§•»ÂF­…?õNy±Ž‡-áQ> ƧÀPþ›@yâ=4y«¾üu"r]û‘üI`¿Ë Úá”è—Py?!Ü;÷bFOÔŠ½ÒóGhh_äìü¹“ìp°i?“ŸÁøD«£êf-HzÁüzy—î7åÕd²–öÌ¿vP:ÚŽºäO…çwï~däýéðÙ‰òü4¶/uÒ_°aªÖ”ýÄñòƒß?ŸÁ`bzxïc}{nIý±âWå>>::ZoþØŒýWk¯ÖÄj>Ÿ|Qê§á½Â\^Î'žÎ`0ƒQq·¯÷—n…1BqñÀÀÊïŸÁ`üCã ø~q´9f˜Ügò3_/¢Ñè!î×kæ÷WZ }y ãï…ê¨XÊç9¾˜hOªÜ…˜ü ÆW‹¾¨ä7t/–¢~Áäg0¾^û¯{½cHxE|IýÞ¹‰B_ƒÁø»!Åš_Eh%´‚¬³/˜êí›cåg0¾b ‚ôGBÈþf>P¸ÏÊÏ`|ÕÀ¬ÿ@wÚˆø`ø‘úMMþB_ƒÁø{¥ÿ7ú^¤}¯Ð|ä~0(ˆÇk  Ø`D‡öí×­ØÚ·Û[U;/$`4 ‡ý1íÙ÷hýÿÄÿm1¸ º¿|'€þz«îá`90>FB=»S‚ìóîÌvô:hØp%FŠ’ÙXÚOe-#¯C;à-¸³0ˆ~¿£Ž–¯ë0Ïi[hÃìÂû¢Òƒ!¡­r– ±J¢}Y]ú‚­…E”Q<ž‹åü–æ›Òo ì™MÐ<½G> }®öŸ>85èoñœ8ß¼ö Ù­h¿$‡‡ØÐ¬K7 Žá@÷©MXE÷#hÃJûG%ñiwËlŠñ¸5yKcRøIý~;é—÷‘ößOM‚ðO~?e6EðÈ{`?6ê#í[‘îÛí†%  6¤=vÏZ%ÿéÙ >0_qý˜žk„-˜·”ŸœB#n©šFxn´¸ßˆÜo´´ß&þëkmD×Ú ŽDÄGšÙáàGhHtr?RC¼/ŦP|—dÇnÄthÁ}â|¾ê)U„—ÜïÁ嬀ö¸¨º‚,nÂøp‡/ðöZ´è…XçÒ"ÿÅÅ¥xü7,ûýWÓ"ÙýÅÅà´ ù©Âm«{8‹‘òw$?p\áNݬ`{Ñ2à¡é‚ž:.£W]ûï -ðUvà7¥á é“uóœ’_Í=ôõÓ 1V½;++ñ¯áÃø±jØÅ.B}—(3viÒ~öôþÁyÚo×} þÞšMøÅ4gü›=pŠ?i¿Hš…ðÛÄŸ( •²¥ûÃnÀÝ~up«ßˆyªßO´¿µ,èkR‡bÿÔÔ䔡ü¦P1`Usaý¿ßކ͖´£êߤð‹½]÷Qõå^„€VKôÿÏ5ØTN`—}|Týy¢;<”ú7ZÍzì'í·YýÒ5°é>„‚kZ÷1àëT@(ÿÔý§OÇŸ"åi/--5%ßd$  ‚~´ÿúÔ”ð‹-ké?ŸêÿúǽKAäz$þŽþöaì>¼ ;ƒ6ò— ¦nÕŸ1⸠‘gyžö*ëLò×S…š;•m·­c«Þh¥çE>ùÓm•Èö¨`;üNG”XN¢m–ªJ ñ³fÁàSèoùý\^[ÚEûÅÞ]û ö›ªoj¿®4ÛËk¦ò?²ë¾Ò~Cù×µÝ?’H?,µ_‰¿Cûï’ðdXÖz/›¤~¿aü%ó—…ç—Ú?)ÔßÔ} (÷ úÀý)Ãú;tÉßÞJÛ¶!üZ÷Û¡µ¶Ãó±6Rú•ë—–_ÿXk¿|¨ÂÀ<ÑÞR~“þ û5]`ìÊoñ^»WíWºÄ¿&ŒÿS²ü:ï?Ê/Ô_˜~|HÖKá—q€èýC)Ñ^k¿f¿”~8øAZ±vµd~’¨/´ö —Ÿ•¼'êÓß²šüõÀsäz0ø¯ÿGûýñ½Øè„f#êô½Ù鯄ò{ªù%ëbH¢K ò÷É¿Ùu\uü-²ÇŠ®ÏzòÈß7}{‡¾IüŠ·dzº#`½”D¼úð½@삾ߌ.Å?þ¼"à=öÎ×þ½SS÷Úß,ÙeßEù­ò_3é¾~<Àl)¿®Ú]­ûÃ:ëwhÿ­~Cùïjí_6ó}ñ÷kí—•ïʯ´_Å€×È{tû–÷ÝŸ²åû¢¡÷Ý*”¿µÝ,á[[-ÁoÕOZûI÷üHÿg†æ«ä=¥ü˜üká×A e…€®FWt5v]k¼ÖUÛu­ËUûµî“í¿&…_Š>=¿Mè?E’~ÓúK`©öãš÷ãvíÏëïùAi&©š¢¿ÔþŒÖ~"¾Èõ³Û X ±òG4ÿÑ¿,mtv¯t^±‘ŸJóŽ-¨¬M“Á®ö´íx0 zh7íÑl‘ßëé»;1›'­óp£Eõ‹Ù<òÇ*ËËMò{^D©œ¯È§:–Æ«óP ©óô]LùÍBŸ“úJûEÕ/m¯ùS;GûAùO䷴ߪó­iöËðHª¿¡ÿGÍ–ö7«¼_è¾,õ©@0_i¿æ¿%ýH}þ»†õy¿~Ò}§òkö[¼'íŸt~Ù€1€lD€©ísŠ}ÛDúvÊûÛ-í?&ío•vÍ¿`¾!ýó¸ÕKÅ—ûg¦öÏ+áGç¯6Óù§„ô7Ú­€Úk°á£K‰¿Mû­Œ™MýI÷§ïÔíéSÅþ[ѯÔHdª?Žâ/ÆõÇ•ç_ú„Û·©D⟥[júä--Í‚ßãP'ð|ã xüà*þŸ¢èþ£þËÿÿ°ñ ºïknm"}O“òƒ°W")Óƒ“-$#ïê<1'ùït”‹à±Yzñf]™†(ìÚòÈuJÛeRoYâ xÚðc垎 uõÙ‚€KÏŸ—”ß)þB÷õ]´ß©ûμÿ•tkpdïÌKüåi¿Ðÿõ#;ý…0µßVï7´_øÿ~³âÒ¯u_)¿ ·–ÏÑþ)ËX1à{¡ý´ÕñÚöŸ„[$þöÎ@$;Ðÿeë±ØTõï™,ø¡òߟKñŸ¯12~É|!ùêXûS5–æKÆ+÷/F¨íïß…´wA+hç/»~|o6Jd’þ÷¥FÞ/CÀ¸¦©©û¢Ê/{þ¤ ûb‹¼3¬Tÿ¬ ½Èû…óÏêq×¹•.@ü?ß²qeãÊ•ÎNÜÑ3Ä‚¥ùcuTàv´Z÷»‰ìÚã½#l¬ˆXX$U˜̦¤Ü´ý^ÙùîU¹|ò£“Ç‚ßV>ùÛ:›–Ah:0h¼„ÏâW÷Űᢠûí!À .Í=çGíß;gðO>ý8JþÍkhûÖ_Ëÿš~›ö«´ÝMùlõþa©ûŽa?*Õ¿%^P@‰ÿ¤j’úùÚ?µl)ÿ¤*øOé^?5ö=?Ù}cô=(Û/ˆ/°-+ôLº/©ÿRåüÊjŽçIúíŸÊ/çµù¯‘Ù¾­æ§´^°¿F¿@î×BÂÔ'þ»û±èÿãÁ5£äoÚcèÏ{½·[YúÏH¿/[©æ½Ùß/¸}~=¢¨€LþÅÞÒ~!öº»ÏVðc˜’ïJû´-íÇç´QíÏÙ´_qÝÅø“'x`y¿ÃøËœ_ê>>ÖuÙïÐ…ß>pØÔKû‡UÍßÈûupKÕþßAøûoYù¾Nío˜4h?)Šþ“†ðË1>$ýTó±À>þOdþdÿ[·[e ÀìÓ. ~/)÷©„_Sÿeÿ ÿŠþRþíÊߨò~Êú)é@•üæÍ í>\#×ßEY?…gÚoØ~=ÔGþM²_û\¤ýOu¹ÏðýôœQIáû5ý3Õá×#R~â;²_åüTû3 R¤ü¢»O0ßÇ÷±wEîñ7µÏÒþ:ówjÿš«ö»´WfÞoô£@Ð,¿ììü_äû‚þ„ñu‡ö÷ëš¿‘÷[)¿½Ãó}cدCÿyÿ”îó³úù•ù—%ÿ)ìé{=eËù ío•UÿV™ðËÑ>ªòGy»RûgÇVŸŽç­¿Çbä¯ÕõW£³ÿFÕÝ'Jïßj÷Iþ‰÷Ž´ëý.ôWÂ/ºûóéo9Ô~‹ýV©Ÿ^«:¿òšû2ûÏHÐ#¶¬ä~ÖªøgDÕ¯ÇR~à'ºûðQhž1 ƒÁ`0 ƒÁ`0 ƒÁø\üƒÔ endstream endobj 101 0 obj <> endobj 102 0 obj <> endobj 103 0 obj <> endobj 108 0 obj [/Indexed /DeviceRGB 255 <000000FF00006B6BD2FFFFFF666666FF66667B7B7B6666C24A4AB96B6B6B4242 B1F30000FF9090B1B1DA888888737373B1A1A1FFB1B1CC6B6B181818FF33337B 7BCC6666B9E33333B9B9B99090D2DADADA8888CCB98888FFC2C2424242E37B7B FFE3E3DA9999FF1818FF7B7BEB2121B1B1EBFF4A4A8080D2C2C2E3A9A9A93333 33F33333D252529090E3DADAF3CCCCEBEB1818FFA1A1999999A1A1DAB99090FF D2D2525252EBA9A98080E3A1A1E3EBEBF3080808FF08087B7BD2FF73737373C2 5A5AB9B1B1B1292929FF4242E34242C2C2C2E3E3E3DADAEBF38888FFF3F3EB90 90FF2929FF8888C2C2EBB1B1F3FF5A5AD2D2D2EB4242E34A4A9999F3CCCCF3A1 A1F3C2C2F37373D2FF6B6B8080806B6BC26666CC5252B94A4AB1FF9999B9B9E3 B1B1E3909090B1A9A9FFB9B9D26B6BCC7373212121FF39398080CCE339399999 D29090DAC28080FFCCCC4A4A4AE38080FFEBEBFF2121FF8080F32121B9B9EBFF 52528888D28080DA393939DA4A4A9999E39090EBE3E3F3DADAFFD2D2EBF31010 FFA9A9A1A1A1A9A9DAB99999FFDADA5A5A5A8888E3A9A9E3A1A1EBF3F3F3EBEB FF101010FF10107B7BDA7373CC5A5AC2CCCCCCEBEBEBB9B9F3B1B1FFD2D2F3CC CCFFA9A9F3C2C2FF6B6BCC5252C2D273739999DAC28888F329298888DA9999EB E3E3FF8888EBA9A9EBF3F3FFD2D2FFF7B796FC949005E770C2F0F4F7B82899EB 94F741F7FC9490F7B84E6D892D05E770C2F118F7B77BF741F7FC949003EE8803 D600F713EE00016FF7A2E3007DF1C2F164000FF8DF0008402004F7A3A0C40000 1F200C000FF8000000C4000CC40000DF0008000000F713E22A001EC4000CDEFD 30C2F18CF7A10E03EE8803D60000000305E00FC2F1A800E44A05E0F8000032F7 B9C59A3DEC000030001DE803B600C2F1E000CD7C00000900CD5C000000FF92D0 05E10005E17003B600C2F20400CD7CC2F21000F56A033238FFFFFFC2F2780010 260000300021F9000028FF92D0601232FF94D0FF92A005E100F432F805E100C2 F22C66E8880000006021D3FF92D0F432F805E100C2F26C66E94B00000060D91D>]endobj 107 0 obj <>stream xœí} Oi–¶s1Ónó!H ‚Âf0IX&|&\‡5Ù| .FÁËe@_˜ F€Âm#I‡ÉÆÍF ¼?tÏ9ï¥Þ*@fâäö‚ Æ—AçbSHôïÝœiñ×­ôÆ |E ã‹`c±ªw ~~^±Iäo*ô%1Œ/+óŒÕû'6+6Áö³ò3ßBÁxo¨xÌïŸh‘¿B_ƒÁøhÙXœ{2PÜ]ï÷û»Aø¹«ÁøFp3¸Ÿ u‡zçªxƒñm`3Ä¡ýÅÐB¡¹3…¾ ƒñ…н±ØTõ$„xRÅÓúŒoþ`0^UÕ47×gî3ßî÷nãKñÅ•_ }) ãËâ—¿ßߢ©½×Â`0 ˆë}…¾ƒQT³ø3ß(n3ûŒoÑB_ƒÁ( b· } £0ˆ²ñg0¾MDÙø3ß&˜ü Æ7ŠëìûŒooXúŒoi&?ƒñ­àæó ¿_/äã®ü­µ_ð‚~ëë…¾ã7Ÿ·øWz—:7®|×ùžÔëFþÉ|_ôÒÎÇZÏwTè‹`0þA1S/‰òW6®t^¹Ò Mþëyä_?ðùþ—?× —Âäg0.‰ûÀxã †zõn,Zm;{­Ñ÷ïÿ[È¿ñù²L~ãÒ~'(Ÿ¯P °”?=4NÍ=óù’¨¶]¸Nî–ŠkI2ùŒKÂOt¯j©ðw^¿¡üѨ1©¿•ˆbë»V€ë´aý\^ +?ƒqiÜDÅ‚G3”ñ9¿Yï›üA2ß—ÌØö?˜Ïd“Ù$\+?ƒñˆåïÓÑXçw6å¯Öä§:!YhåÏmõ3@~V~ãó0°Ñ¹!Ž&déO+4:(^S…6‹;Tþ7…¸VDi&›Aîù³>îçg0. g°Sµl!@“äÔÂ/Ò}‚ü€ú@ÿd6+²V~㲘Yê\zNGcADgç†$ÿmÝÑ×*óý¬(ùÔögüÙ üŒÏÅÍÅ`pf—‚ ý@AþÃh4-ϱ+a ~D~¬øù²lûŒÏBïÒâRh³Â_ BÀ Èo ?)¿¦~mf¹ŸM²íg0>þÅx|1¾ø!þ!aø$òGÑ}¨üY‹ý…·ýÄþ$Û~ã³P¬ÿP¯Š ,Å—üףј>¥Õ&üÙB“?+J~äüïòZŒlܯB4‰†ô_ôÓL~cX¿™óg}ÉÆ|ãÚèëöð~*mwwyxïã×p:üëÙY8ŽÐgÚÏú_{jFTüPù“IV~ã3ðóœDÕñ c|Ï|¾?(É—ìÅæøº½©ðþ~d?Lã^ ¯6œÏeÀéò*œFàùRûíkÎó¦J!ßÇFôïÉRw]l\øc0.ŒÇOû逹/GõËQ}IÓö'³è¼3™Tþ—­½ìÚOõS¤û€×ÀíÝÿ>ïçOV‡VOV"«4æá“?^:,ÃÔ¸`þ¸èë“I¿;ãâ(Ö?é}ÒÛ;ÛÜ\SÕDLíóŠQ}¶j?xnâþxžòçºà>)ŒJt&ú¯6ä\|xHpÿ%Š?6éýáKöSvFùýã2é—}D8bò3—¿7ê õÂz‚ìŸû'£Øgé½:H’éGÔ8¾ho>±OÔßGþ*âõONVON]~ûס“!|t?ŒÊOQƒØIì›ç"ùÉ÷Ó ¿lR;òñãRh …B+ÐBž„zç~3 ýF²o R(¿Ãö¯ãß—ôO¡‚£éôzƒ¾çgþ£C#'CC@þW-å—ÒI$Ì€AäÏ’ñÏR¹ß¢>+?ƒqÜX‘Qèý-–Óoúœ@Ê÷3™yÛ×ìu%ÒôƒòHÈW¥ò¯"ÅÚ:424´{‚äÔ틤63¾ùµðgù…+ö2Œ‹âþ€ÄÊÊñÿ/­7¶™õ¾,ÖÝl9n^Ⱦþyð°HãWQ×ÑÞíæì¿ündhw„„ÿääDÿ0±¬? ?|á²uvƒ~Ó÷[®„•ŸÁ¸8~(¦FüýÿÆ›NÛïÓõ>‡ò¿ÝGîKáO…SaUëá‚ ŒüjûáW#€¡]Š (þ»ïÎPýQù÷¥ö'ö­Ó…ògÇůÓ0ëêXùŒ‹ãfw1Bñ`eÓxÓÅô'E_ßxÖ$s‚È¿¿Of=œŠDVwÏ^*ú½GvGFliÿè±DP_†½³U•õ§(–XÒß  ~Ö0V~ãsð˜È?V,B¿ÅxÓ-çÝüY[Á¯Qr;ùQ¶w‰æ¹_¥ðCÊOLkþð[úÓ‰ ÿOê¯Ã`üçUo_"ѧËj–Ä_¬èa]+?ƒqq<öuwûíÊŸWíOf{¨ânöóß½Šäߗ‰h½>¢Z?æûCÄSú‡FýÉõ[oìb¹ÈIääe¿êÓ0®ËýjjU‹`åg0.·€äÿ@…ñ^žîõ³Rû Û?Ü¿ M°×zg;ù‡PÞIù²ÞÙCê¿Bã?tbô…_î6ŒöŸ:û¦ˆúBû1Ð"ž¬ü ÆgÀß]è®Gþ#û7'´›å>_6LÿÞÕ« I}ª÷åŒ÷ND±ì=ÁzãT ?ÕûOÞ}âÅjî ågÅg0.çâ›þz’ÿâ çZ åÙÏ¿Qgâ*¥ü²à×`¾Òä¦b?°ý­¥ð¹·Èþ·ôŽóý„é´˜‡œØ×ƒ¦Ÿ'ô0Ÿ¿±¼¿ ù³¦ïÏŸÏ?ÂÒ/¹i6ß;¥þ!)ü#µÞQÊ/»úWëg££Ín£€ Èr¿˜Ù“dåg0>é3Ù_ßíF~£“?ébûß_¥”_VüÃ~¥ò á7ëýôRÒÿDŒðÇ©½‘ðnÿiUc|Øö3Ÿ‹XßðþŸ-úÍ8O±­á—Í_Ìc„_Ò?’Ûß=#é—"ÿÖHúÿ›Ê}¤üb€¿œÜüO¥vïæ\/7#†øeiF?Oèa0.ëÑ´wÂoÙŸ¯üz4 ÖûòÉß|ÕÈù#‘HûIûnûî¶³wgTî“Å~hVfŸÃ”_)ÿÍ ¾4-(Ùop+ŒÓ¼½€/“ŸÁ¸q±®–– „fÿŒó,Û~.ä§^þ„®ö›Ëøà„>Tþ!9Êgä­Áè¿êœ_ð%åËñ½)ç„~‚ZɇÆösÎÏ`\bîîf ÂbÿŒó´‘¿áêUQï¾GçÍÓ}ò“!1ÆG)¿9ÌÇÈù‡TÒ/föÐJ@ûûgy—lüàjšóN`0‡\¤s`ÐßüY‹û.ýüS ´ýªÚŸ@ÛNÚ/çõœ¨‚ñß\ÐkïJùMåˆ~`üö^C„îê˰ò3—…Z¤³bsSð_°¿þ†óDSùÝ ~ V¹’~þ”X¿/,øIåG¡·­æ·÷VŒÔ·ôÐËy8Ù­”?Ë9?ƒqY(î?ž©ûÏU~Ëõ»ÙþI³Ú/&öÐ^±Ž‡˜²«¤ß¾”gî?‡dÊ¿z"‚)D(?.äçø­ŒZÊGäülûŒ ã0z]ùgff*Èúûgœ§ZÕ~*÷çð›Õ~k”ϼ´ý‘°š×£êýNò{½§ÿI¿Ö}±–Ìùû Ǩ}]ìϰò3—BßmuWŽŸgfn û+Ðø»“ß>³'o„_s¾ò‹¥|(é²ÿ<ò{ñž# ü/UüHøi^ŸsÔÀ¸X»;ÃÕ~ã’°îÁûóù'>Jþlþ:E??P_Tûç§§kÐöâpÎõœ¿;‘®^ÌçO!õ÷‰œíùÊß®gõ‘úæÊ{©ˆUïK$–moÊÛu‰A>¬ü ÆE¡ïŸ®æÆïåüëæb^Ùd&ï뎤í—+ùØjt¹ß£»wz:<üÓÙÙªÉâZ¾“ï†ï´/ù›‘KyHåŸü¤ÿ\ƒ!q]õñ#€ø7ˆûçVû¬•2if ꃜu ñ“S{‘ý~ãûXÆ;ûixô•}a®W¿þôŽº÷iBϪ¹’O¿Èùé ¯:rþ.P~ZFL(¿ìyàî~ãÓPm¸þDz§]ÿ„ë¿ucJ/®Ü]:utw»+c¸ûVáûåœÞýˆõVƒ^»ŸîÌ1¢~{ÿðoâ^]«ÏDÂäÏÙ®¥±Tß±'‰~¤±}ª6yð·øWa0¾ÜÖwáõz®æ›ÂŸ?¯Ù6+í=Xt›²ÎÈIòÓHŸÈ~*%Ù¿&‡í…Qßi!ÏœúÈ«= Ÿ`Ý‘{]?Ú~rýÖÚÝ„F½x¯yûàäßè†ÁøÊÑ­¶Rþ_**Ôð^Êøëýÿ7ï>›ôc;ÊïkãŒvs˜ÎÇ 7Œö¾”ÔÇÁ{â†\Æ*^'CrmO9£'<šÃ?ï5¤tOÖûS{ÚEO_FŒñÑø[þó0_/Ž>ïÍŠMIý‰s¦ôz3ö™=”rÛoו벆øÒŒ~q“nû}ºWmkôâÊž«òîÜrdßnûnX ðÙÜ/áè7œ”Â/”_oÓã«EµYïÚcÓsúüÝ3y¨±I?òÍ·mÎÍ‘îí£Ûõí«™}4Ä_êÿÉIÎøDîäÄä¾ÝgõóEð wíWâmÜÇ‘ý>¾cƒqA˜äÿ¹¥E®å1¡–ñšÉûÀ¤©üú>½öþþvYò»º/²~âp8bQ(n/Üë„_Ýw>¢—ñÀé¼h$rÎk—Âï3oÒËýý Æ'!jÿ—‰–‰½ŠW½¿¾Û…ü9Û=»ô}zí'Í'(ë$ôr>á”pþ’ú«Î¹w«Öd¾°^ÄCÌé‘ý|ùƒZ³êf]jØnÜßÏ`| ¢FOß ÿ6Å}¼oOÞžŽå<|IºQ¯“ü¹°ãK¦ù}b–®S÷»V¾§¤ÂÒò§h= ü®¿æ}Ä»7žµ:ú4Ú?÷ß„Áø&`*ÿ¦céÞn—›vÞ›Ê/´?›qŽá?KÐðþ«2éW{åb~n#ýÞ™sø#j6_Šfó%ö#®“&3bÙn›i½ü¿ƒñ á¶EþÇzÝîz¡ûn·ëäžÔ÷ɂ޸º£ÒËôòNÝ)¹œW$üSÎõRŽ„á§•»ÂF­…?õNy±Ž‡-áQ> ƧÀPþ›@yâ=4y«¾üu"r]û‘üI`¿Ë Úá”è—Py?!Ü;÷bFOÔŠ½ÒóGhh_äìü¹“ìp°i?“ŸÁøD«£êf-HzÁüzy—î7åÕd²–öÌ¿vP:ÚŽºäO…çwï~däýéðÙ‰òü4¶/uÒ_°aªÖ”ýÄñòƒß?ŸÁ`bzxïc}{nIý±âWå>>::ZoþØŒýWk¯ÖÄj>Ÿ|Qê§á½Â\^Î'žÎ`0ƒQq·¯÷—n…1BqñÀÀÊïŸÁ`üCã ø~q´9f˜Ügò3_/¢Ñè!î×kæ÷WZ }y ãï…ê¨XÊç9¾˜hOªÜ…˜ü ÆW‹¾¨ä7t/–¢~Áäg0¾^û¯{½cHxE|IýÞ¹‰B_ƒÁø»!Åš_Eh%´‚¬³/˜êí›cåg0¾b ‚ôGBÈþf>P¸ÏÊÏ`|ÕÀ¬ÿ@wÚˆø`ø‘úMMþB_ƒÁø{¥ÿ7ú^¤}¯Ð|ä~0(ˆÇk  Ø`D‡öí×­ØÚ·Û[U;/$`4 ‡ý1íÙ÷hýÿÄÿm1¸ º¿|'€þz«îá`90>FB=»S‚ìóîÌvô:hØp%FŠ’ÙXÚOe-#¯C;à-¸³0ˆ~¿£Ž–¯ë0Ïi[hÃìÂû¢Òƒ!¡­r– ±J¢}Y]ú‚­…E”Q<ž‹åü–æ›Òo ì™MÐ<½G> }®öŸ>85èoñœ8ß¼ö Ù­h¿$‡‡ØÐ¬K7 Žá@÷©MXE÷#hÃJûG%ñiwËlŠñ¸5yKcRøIý~;é—÷‘ößOM‚ðO~?e6EðÈ{`?6ê#í[‘îÛí†%  6¤=vÏZ%ÿéÙ >0_qý˜žk„-˜·”ŸœB#n©šFxn´¸ßˆÜo´´ß&þëkmD×Ú ŽDÄGšÙáàGhHtr?RC¼/ŦP|—dÇnÄthÁ}â|¾ê)U„—ÜïÁ嬀ö¸¨º‚,nÂøp‡/ðöZ´è…XçÒ"ÿÅÅ¥xü7,ûýWÓ"ÙýÅÅà´ ù©Âm«{8‹‘òw$?p\áNݬ`{Ñ2à¡é‚ž:.£W]ûï -ðUvà7¥á é“uóœ’_Í=ôõÓ 1V½;++ñ¯áÃø±jØÅ.B}—(3viÒ~öôþÁyÚo×} þÞšMøÅ4gü›=pŠ?i¿Hš…ðÛÄŸ( •²¥ûÃnÀÝ~up«ßˆyªßO´¿µ,èkR‡bÿÔÔ䔡ü¦P1`Usaý¿ßކ͖´£êߤð‹½]÷Qõå^„€VKôÿÏ5ØTN`—}|Týy¢;<”ú7ZÍzì'í·YýÒ5°é>„‚kZ÷1àëT@(ÿÔý§OÇŸ"åi/--5%ßd$  ‚~´ÿúÔ”ð‹-ké?ŸêÿúǽKAäz$þŽþöaì>¼ ;ƒ6ò— ¦nÕŸ1⸠‘gyžö*ëLò×S…š;•m·­c«Þh¥çE>ùÓm•Èö¨`;üNG”XN¢m–ªJ ñ³fÁàSèoùý\^[ÚEûÅÞ]û ö›ªoj¿®4ÛËk¦ò?²ë¾Ò~Cù×µÝ?’H?,µ_‰¿Cûï’ðdXÖz/›¤~¿aü%ó—…ç—Ú?)ÔßÔ} (÷ úÀý)Ãú;tÉßÞJÛ¶!üZ÷Û¡µ¶Ãó±6Rú•ë—–_ÿXk¿|¨ÂÀ<ÑÞR~“þ û5]`ìÊoñ^»WíWºÄ¿&ŒÿS²ü:ï?Ê/Ô_˜~|HÖKá—q€èýC)Ñ^k¿f¿”~8øAZ±vµd~’¨/´ö —Ÿ•¼'êÓß²šüõÀsäz0ø¯ÿGûýñ½Øè„f#êô½Ù鯄ò{ªù%ëbH¢K ò÷É¿Ùu\uü-²ÇŠ®ÏzòÈß7}{‡¾IüŠ·dzº#`½”D¼úð½@삾ߌ.Å?þ¼"à=öÎ×þ½SS÷Úß,ÙeßEù­ò_3é¾~<Àl)¿®Ú]­ûÃ:ëwhÿ­~Cùïjí_6ó}ñ÷kí—•ïʯ´_Å€×È{tû–÷ÝŸ²åû¢¡÷Ý*”¿µÝ,á[[-ÁoÕOZûI÷üHÿg†æ«ä=¥ü˜üká×A e…€®FWt5v]k¼ÖUÛu­ËUûµî“í¿&…_Š>=¿Mè?E’~ÓúK`©öãš÷ãvíÏëïùAi&©š¢¿ÔþŒÖ~"¾Èõ³Û X ±òG4ÿÑ¿,mtv¯t^±‘ŸJóŽ-¨¬M“Á®ö´íx0 zh7íÑl‘ßëé»;1›'­óp£Eõ‹Ù<òÇ*ËËMò{^D©œ¯È§:–Æ«óP ©óô]LùÍBŸ“úJûEÕ/m¯ùS;GûAùO䷴ߪó­iöËðHª¿¡ÿGÍ–ö7«¼_è¾,õ©@0_i¿æ¿%ýH}þ»†õy¿~Ò}§òkö[¼'íŸt~Ù€1€lD€©ísŠ}ÛDúvÊûÛ-í?&ío•vÍ¿`¾!ýó¸ÕKÅ—ûg¦öÏ+áGç¯6Óù§„ô7Ú­€Úk°á£K‰¿Mû­Œ™MýI÷§ïÔíéSÅþ[ѯÔHdª?Žâ/ÆõÇ•ç_ú„Û·©D⟥[júä--Í‚ßãP'ð|ã xüà*þŸ¢èþ£þËÿÿ°ñ ºïknm"}O“òƒ°W")Óƒ“-$#ïê<1'ùït”‹à±Yzñf]™†(ìÚòÈuJÛeRoYâ xÚðc垎 uõÙ‚€KÏŸ—”ß)þB÷õ]´ß©ûμÿ•tkpdïÌKüåi¿Ðÿõ#;ý…0µßVï7´_øÿ~³âÒ¯u_)¿ ·–ÏÑþ)ËX1à{¡ý´ÕñÚöŸ„[$þöÎ@$;Ðÿeë±ØTõï™,ø¡òߟKñŸ¯12~É|!ùêXûS5–æKÆ+÷/F¨íïß…´wA+hç/»~|o6Jd’þ÷¥FÞ/CÀ¸¦©©û¢Ê/{þ¤ ûb‹¼3¬Tÿ¬ ½Èû…óÏêq×¹•.@ü?ß²qeãÊ•ÎNÜÑ3Ä‚¥ùcuTàv´Z÷»‰ìÚã½#l¬ˆXX$U˜̦¤Ü´ý^ÙùîU¹|ò£“Ç‚ßV>ùÛ:›–Ah:0h¼„ÏâW÷Űᢠûí!À .Í=çGíß;gðO>ý8JþÍkhûÖ_Ëÿš~›ö«´ÝMùlõþa©ûŽa?*Õ¿%^P@‰ÿ¤j’úùÚ?µl)ÿ¤*øOé^?5ö=?Ù}cô=(Û/ˆ/°-+ôLº/©ÿRåüÊjŽçIúíŸÊ/çµù¯‘Ù¾­æ§´^°¿F¿@î×BÂÔ'þ»û±èÿãÁ5£äoÚcèÏ{½·[YúÏH¿/[©æ½Ùß/¸}~=¢¨€LþÅÞÒ~!öº»ÏVðc˜’ïJû´-íÇç´QíÏÙ´_qÝÅø“'x`y¿ÃøËœ_ê>>ÖuÙïÐ…ß>pØÔKû‡UÍßÈûupKÕþßAøûoYù¾Nío˜4h?)Šþ“†ðË1>$ýTó±À>þOdþdÿ[·[e ÀìÓ. ~/)÷©„_Sÿeÿ ÿŠþRþíÊߨò~Êú)é@•üæÍ í>\#×ßEY?…gÚoØ~=ÔGþM²_û\¤ýOu¹ÏðýôœQIáû5ý3Õá×#R~â;²_åüTû3 R¤ü¢»O0ßÇ÷±wEîñ7µÏÒþ:ówjÿš«ö»´WfÞoô£@Ð,¿ììü_äû‚þ„ñu‡ö÷ëš¿‘÷[)¿½Ãó}cدCÿyÿ”îó³úù•ù—%ÿ)ìé{=eËù ío•UÿV™ðËÑ>ªòGy»RûgÇVŸŽç­¿Çbä¯ÕõW£³ÿFÕÝ'Jïßj÷Iþ‰÷Ž´ëý.ôWÂ/ºûóéo9Ô~‹ýV©Ÿ^«:¿òšû2ûÏHÐ#¶¬ä~ÖªøgDÕ¯ÇR~à'ºûðQhž1 ƒÁ`0 ƒÁ`0 ƒÁø\üƒÔ endstream endobj 109 0 obj <> endobj 110 0 obj <> endobj 111 0 obj <> endobj 116 0 obj [/Indexed /DeviceRGB 255 <000000FF00006B6BD2FFFFFF666666FF66667B7B7B6666C24A4AB96B6B6B4242 B1F30000FF9090B1B1DA888888737373B1A1A1FFB1B1CC6B6B181818FF33337B 7BCC6666B9E33333B9B9B99090D2DADADA8888CCB98888FFC2C2424242E37B7B FFE3E3DA9999FF1818FF7B7BEB2121B1B1EBFF4A4A8080D2C2C2E3A9A9A93333 33F33333D252529090E3DADAF3CCCCEBEB1818FFA1A1999999A1A1DAB99090FF D2D2525252EBA9A98080E3A1A1E3EBEBF3080808FF08087B7BD2FF73737373C2 5A5AB9B1B1B1292929FF4242E34242C2C2C2E3E3E3DADAEBF38888FFF3F3EB90 90FF2929FF8888C2C2EBB1B1F3FF5A5AD2D2D2EB4242E34A4A9999F3CCCCF3A1 A1F3C2C2F37373D2FF6B6B8080806B6BC26666CC5252B94A4AB1FF9999B9B9E3 B1B1E3909090B1A9A9FFB9B9D26B6BCC7373212121FF39398080CCE339399999 D29090DAC28080FFCCCC4A4A4AE38080FFEBEBFF2121FF8080F32121B9B9EBFF 52528888D28080DA393939DA4A4A9999E39090EBE3E3F3DADAFFD2D2EBF31010 FFA9A9A1A1A1A9A9DAB99999FFDADA5A5A5A8888E3A9A9E3A1A1EBF3F3F3EBEB FF101010FF10107B7BDA7373CC5A5AC2CCCCCCEBEBEBB9B9F3B1B1FFD2D2F3CC CCFFA9A9F3C2C2FF6B6BCC5252C2D273739999DAC28888F329298888DA9999EB E3E3FF8888EBA9A9EBF3F3FFD2D2FFF7B796FC949005E770C2F0F4F7B82899EB 94F741F7FC9490F7B84E6D892D05E770C2F118F7B77BF741F7FC949003EE8803 D600F713EE00016FF7A2E3007DF1C2F164000FF8DF0008402004F7A3A0C40000 1F200C000FF8000000C4000CC40000DF0008000000F713E22A001EC4000CDEFD 30C2F18CF7A10E03EE8803D60000000305E00FC2F1A800E44A05E0F8000032F7 B9C59A3DEC000030001DE803B600C2F1E000CD7C00000900CD5C000000FF92D0 05E10005E17003B600C2F20400CD7CC2F21000F56A033238FFFFFFC2F2780010 260000300021F9000028FF92D0601232FF94D0FF92A005E100F432F805E100C2 F22C66E8880000006021D3FF92D0F432F805E100C2F26C66E94B00000060D91D>]endobj 115 0 obj <>stream xœí} Oi–¶s1Ónó!H ‚Âf0IX&|&\‡5Ù| .FÁËe@_˜ F€Âm#I‡ÉÆÍF ¼?tÏ9ï¥Þ*@fâäö‚ Æ—AçbSHôïÝœiñ×­ôÆ |E ã‹`c±ªw ~~^±Iäo*ô%1Œ/+óŒÕû'6+6Áö³ò3ßBÁxo¨xÌïŸh‘¿B_ƒÁøhÙXœ{2PÜ]ï÷û»Aø¹«ÁøFp3¸Ÿ u‡zçªxƒñm`3Ä¡ýÅÐB¡¹3…¾ ƒñ…н±ØTõ$„xRÅÓúŒoþ`0^UÕ47×gî3ßî÷nãKñÅ•_ }) ãËâ—¿ßߢ©½×Â`0 ˆë}…¾ƒQT³ø3ß(n3ûŒoÑB_ƒÁ( b· } £0ˆ²ñg0¾MDÙø3ß&˜ü Æ7ŠëìûŒooXúŒoi&?ƒñ­àæó ¿_/äã®ü­µ_ð‚~ëë…¾ã7Ÿ·øWz—:7®|×ùžÔëFþÉ|_ôÒÎÇZÏwTè‹`0þA1S/‰òW6®t^¹Ò Mþëyä_?ðùþ—?× —Âäg0.‰ûÀxã †zõn,Zm;{­Ñ÷ïÿ[È¿ñù²L~ãÒ~'(Ÿ¯P °”?=4NÍ=óù’¨¶]¸Nî–ŠkI2ùŒKÂOt¯j©ðw^¿¡üѨ1©¿•ˆbë»V€ë´aý\^ +?ƒqiÜDÅ‚G3”ñ9¿Yï›üA2ß—ÌØö?˜Ïd“Ù$\+?ƒñˆåïÓÑXçw6å¯Öä§:!YhåÏmõ3@~V~ãó0°Ñ¹!Ž&déO+4:(^S…6‹;Tþ7…¸VDi&›Aîù³>îçg0. g°Sµl!@“äÔÂ/Ò}‚ü€ú@ÿd6+²V~㲘Yê\zNGcADgç†$ÿmÝÑ×*óý¬(ùÔögüÙ üŒÏÅÍÅ`pf—‚ ý@AþÃh4-ϱ+a ~D~¬øù²lûŒÏBïÒâRh³Â_ BÀ Èo ?)¿¦~mf¹ŸM²íg0>þÅx|1¾ø!þ!aø$òGÑ}¨üY‹ý…·ýÄþ$Û~ã³P¬ÿP¯Š ,Å—üףј>¥Õ&üÙB“?+J~äüïòZŒlܯB4‰†ô_ôÓL~cX¿™óg}ÉÆ|ãÚèëöð~*mwwyxïã×p:üëÙY8ŽÐgÚÏú_{jFTüPù“IV~ã3ðóœDÕñ c|Ï|¾?(É—ìÅæøº½©ðþ~d?Lã^ ¯6œÏeÀéò*œFàùRûíkÎó¦J!ßÇFôïÉRw]l\øc0.ŒÇOû逹/GõËQ}IÓö'³è¼3™Tþ—­½ìÚOõS¤û€×ÀíÝÿ>ïçOV‡VOV"«4æá“?^:,ÃÔ¸`þ¸èë“I¿;ãâ(Ö?é}ÒÛ;ÛÜ\SÕDLíóŠQ}¶j?xnâþxžòçºà>)ŒJt&ú¯6ä\|xHpÿ%Š?6éýáKöSvFùýã2é—}D8bò3—¿7ê õÂz‚ìŸû'£Øgé½:H’éGÔ8¾ho>±OÔßGþ*âõONVON]~ûס“!|t?ŒÊOQƒØIì›ç"ùÉ÷Ó ¿lR;òñãRh …B+ÐBž„zç~3 ýF²o R(¿Ãö¯ãß—ôO¡‚£éôzƒ¾çgþ£C#'CC@þW-å—ÒI$Ì€AäÏ’ñÏR¹ß¢>+?ƒqÜX‘Qèý-–Óoúœ@Ê÷3™yÛ×ìu%ÒôƒòHÈW¥ò¯"ÅÚ:424´{‚äÔ틤63¾ùµðgù…+ö2Œ‹âþ€ÄÊÊñÿ/­7¶™õ¾,ÖÝl9n^Ⱦþyð°HãWQ×ÑÞíæì¿ündhw„„ÿääDÿ0±¬? ?|á²uvƒ~Ó÷[®„•ŸÁ¸8~(¦FüýÿÆ›NÛïÓõ>‡ò¿ÝGîKáO…SaUëá‚ ŒüjûáW#€¡]Š (þ»ïÎPýQù÷¥ö'ö­Ó…ògÇůÓ0ëêXùŒ‹ãfw1Bñ`eÓxÓÅô'E_ßxÖ$s‚È¿¿Of=œŠDVwÏ^*ú½GvGFliÿè±DP_†½³U•õ§(–XÒß  ~Ö0V~ãsð˜È?V,B¿ÅxÓ-çÝüY[Á¯Qr;ùQ¶w‰æ¹_¥ðCÊOLkþð[úÓ‰ ÿOê¯Ã`üçUo_"ѧËj–Ä_¬èa]+?ƒqq<öuwûíÊŸWíOf{¨ânöóß½Šäߗ‰h½>¢Z?æûCÄSú‡FýÉõ[oìb¹ÈIääe¿êÓ0®ËýjjU‹`åg0.·€äÿ@…ñ^žîõ³Rû Û?Ü¿ M°×zg;ù‡PÞIù²ÞÙCê¿Bã?tbô…_î6ŒöŸ:û¦ˆúBû1Ð"ž¬ü ÆgÀß]è®Gþ#û7'´›å>_6LÿÞÕ« I}ª÷åŒ÷ND±ì=ÁzãT ?ÕûOÞ}âÅjî ågÅg0.çâ›þz’ÿâ çZ åÙÏ¿Qgâ*¥ü²à×`¾Òä¦b?°ý­¥ð¹·Èþ·ôŽóý„é´˜‡œØ×ƒ¦Ÿ'ô0Ÿ¿±¼¿ ù³¦ïÏŸÏ?ÂÒ/¹i6ß;¥þ!)ü#µÞQÊ/»úWëg££Ín£€ Èr¿˜Ù“dåg0>é3Ù_ßíF~£“?ébûß_¥”_VüÃ~¥ò á7ëýôRÒÿDŒðÇ©½‘ðnÿiUc|Øö3Ÿ‹XßðþŸ-úÍ8O±­á—Í_Ìc„_Ò?’Ûß=#é—"ÿÖHúÿ›Ê}¤üb€¿œÜüO¥vïæ\/7#†øeiF?Oèa0.ëÑ´wÂoÙŸ¯üz4 ÖûòÉß|ÕÈù#‘HûIûnûî¶³wgTî“Å~hVfŸÃ”_)ÿÍ ¾4-(Ùop+ŒÓ¼½€/“ŸÁ¸q±®–– „fÿŒó,Û~.ä§^þ„®ö›Ëøà„>Tþ!9Êgä­Áè¿êœ_ð%åËñ½)ç„~‚ZɇÆösÎÏ`\bîîf ÂbÿŒó´‘¿áêUQï¾GçÍÓ}ò“!1ÆG)¿9ÌÇÈù‡TÒ/föÐJ@ûûgy—lüàjšóN`0‡\¤s`ÐßüY‹û.ýüS ´ýªÚŸ@ÛNÚ/çõœ¨‚ñß\ÐkïJùMåˆ~`üö^C„îê˰ò3—…Z¤³bsSð_°¿þ†óDSùÝ ~ V¹’~þ”X¿/,øIåG¡·­æ·÷VŒÔ·ôÐËy8Ù­”?Ë9?ƒqY(î?ž©ûÏU~Ëõ»ÙþI³Ú/&öÐ^±Ž‡˜²«¤ß¾”gî?‡dÊ¿z"‚)D(?.äçø­ŒZÊGäülûŒ ã0z]ùgff*Èúûgœ§ZÕ~*÷çð›Õ~k”ϼ´ý‘°š×£êýNò{½§ÿI¿Ö}±–Ìùû Ǩ}]ìϰò3—BßmuWŽŸgfn û+Ðø»“ß>³'o„_s¾ò‹¥|(é²ÿ<ò{ñž# ü/UüHøi^ŸsÔÀ¸X»;ÃÕ~ã’°îÁûóù'>Jþlþ:E??P_Tûç§§kÐöâpÎõœ¿;‘®^ÌçO!õ÷‰œíùÊß®gõ‘úæÊ{©ˆUïK$–moÊÛu‰A>¬ü ÆE¡ïŸ®æÆïåüëæb^Ùd&ï뎤í—+ùØjt¹ß£»wz:<üÓÙÙªÉâZ¾“ï†ï´/ù›‘KyHåŸü¤ÿ\ƒ!q]õñ#€ø7ˆûçVû¬•2if ꃜu ñ“S{‘ý~ãûXÆ;ûixô•}a®W¿þôŽº÷iBϪ¹’O¿Èùé ¯:rþ.P~ZFL(¿ìyàî~ãÓPm¸þDz§]ÿ„ë¿ucJ/®Ü]:utw»+c¸ûVáûåœÞýˆõVƒ^»ŸîÌ1¢~{ÿðoâ^]«ÏDÂäÏÙ®¥±Tß±'‰~¤±}ª6yð·øWa0¾ÜÖwáõz®æ›ÂŸ?¯Ù6+í=Xt›²ÎÈIòÓHŸÈ~*%Ù¿&‡í…Qßi!ÏœúÈ«= Ÿ`Ý‘{]?Ú~rýÖÚÝ„F½x¯yûàäßè†ÁøÊÑ­¶Rþ_**Ôð^Êøëýÿ7ï>›ôc;ÊïkãŒvs˜ÎÇ 7Œö¾”ÔÇÁ{â†\Æ*^'CrmO9£'<šÃ?ï5¤tOÖûS{ÚEO_FŒñÑø[þó0_/Ž>ïÍŠMIý‰s¦ôz3ö™=”rÛoו벆øÒŒ~q“nû}ºWmkôâÊž«òîÜrdßnûnX ðÙÜ/áè7œ”Â/”_oÓã«EµYïÚcÓsúüÝ3y¨±I?òÍ·mÎÍ‘îí£Ûõí«™}4Ä_êÿÉIÎøDîäÄä¾ÝgõóEð wíWâmÜÇ‘ý>¾cƒqA˜äÿ¹¥E®å1¡–ñšÉûÀ¤©üú>½öþþvYò»º/²~âp8bQ(n/Üë„_Ýw>¢—ñÀé¼h$rÎk—Âï3oÒËýý Æ'!jÿ—‰–‰½ŠW½¿¾Û…ü9Û=»ô}zí'Í'(ë$ôr>á”pþ’ú«Î¹w«Öd¾°^ÄCÌé‘ý|ùƒZ³êf]jØnÜßÏ`| ¢FOß ÿ6Å}¼oOÞžŽå<|IºQ¯“ü¹°ãK¦ù}b–®S÷»V¾§¤ÂÒò§h= ü®¿æ}Ä»7žµ:ú4Ú?÷ß„Áø&`*ÿ¦céÞn—›vÞ›Ê/´?›qŽá?KÐðþ«2éW{åb~n#ýÞ™sø#j6_Šfó%ö#®“&3bÙn›i½ü¿ƒñ á¶EþÇzÝîz¡ûn·ëäžÔ÷ɂ޸º£ÒËôòNÝ)¹œW$üSÎõRŽ„á§•»ÂF­…?õNy±Ž‡-áQ> ƧÀPþ›@yâ=4y«¾üu"r]û‘üI`¿Ë Úá”è—Py?!Ü;÷bFOÔŠ½ÒóGhh_äìü¹“ìp°i?“ŸÁøD«£êf-HzÁüzy—î7åÕd²–öÌ¿vP:ÚŽºäO…çwï~däýéðÙ‰òü4¶/uÒ_°aªÖ”ýÄñòƒß?ŸÁ`bzxïc}{nIý±âWå>>::ZoþØŒýWk¯ÖÄj>Ÿ|Qê§á½Â\^Î'žÎ`0ƒQq·¯÷—n…1BqñÀÀÊïŸÁ`üCã ø~q´9f˜Ügò3_/¢Ñè!î×kæ÷WZ }y ãï…ê¨XÊç9¾˜hOªÜ…˜ü ÆW‹¾¨ä7t/–¢~Áäg0¾^û¯{½cHxE|IýÞ¹‰B_ƒÁø»!Åš_Eh%´‚¬³/˜êí›cåg0¾b ‚ôGBÈþf>P¸ÏÊÏ`|ÕÀ¬ÿ@wÚˆø`ø‘úMMþB_ƒÁø{¥ÿ7ú^¤}¯Ð|ä~0(ˆÇk  Ø`D‡öí×­ØÚ·Û[U;/$`4 ‡ý1íÙ÷hýÿÄÿm1¸ º¿|'€þz«îá`90>FB=»S‚ìóîÌvô:hØp%FŠ’ÙXÚOe-#¯C;à-¸³0ˆ~¿£Ž–¯ë0Ïi[hÃìÂû¢Òƒ!¡­r– ±J¢}Y]ú‚­…E”Q<ž‹åü–æ›Òo ì™MÐ<½G> }®öŸ>85èoñœ8ß¼ö Ù­h¿$‡‡ØÐ¬K7 Žá@÷©MXE÷#hÃJûG%ñiwËlŠñ¸5yKcRøIý~;é—÷‘ößOM‚ðO~?e6EðÈ{`?6ê#í[‘îÛí†%  6¤=vÏZ%ÿéÙ >0_qý˜žk„-˜·”ŸœB#n©šFxn´¸ßˆÜo´´ß&þëkmD×Ú ŽDÄGšÙáàGhHtr?RC¼/ŦP|—dÇnÄthÁ}â|¾ê)U„—ÜïÁ嬀ö¸¨º‚,nÂøp‡/ðöZ´è…XçÒ"ÿÅÅ¥xü7,ûýWÓ"ÙýÅÅà´ ù©Âm«{8‹‘òw$?p\áNݬ`{Ñ2à¡é‚ž:.£W]ûï -ðUvà7¥á é“uóœ’_Í=ôõÓ 1V½;++ñ¯áÃø±jØÅ.B}—(3viÒ~öôþÁyÚo×} þÞšMøÅ4gü›=pŠ?i¿Hš…ðÛÄŸ( •²¥ûÃnÀÝ~up«ßˆyªßO´¿µ,èkR‡bÿÔÔ䔡ü¦P1`Usaý¿ßކ͖´£êߤð‹½]÷Qõå^„€VKôÿÏ5ØTN`—}|Týy¢;<”ú7ZÍzì'í·YýÒ5°é>„‚kZ÷1àëT@(ÿÔý§OÇŸ"åi/--5%ßd$  ‚~´ÿúÔ”ð‹-ké?ŸêÿúǽKAäz$þŽþöaì>¼ ;ƒ6ò— ¦nÕŸ1⸠‘gyžö*ëLò×S…š;•m·­c«Þh¥çE>ùÓm•Èö¨`;üNG”XN¢m–ªJ ñ³fÁàSèoùý\^[ÚEûÅÞ]û ö›ªoj¿®4ÛËk¦ò?²ë¾Ò~Cù×µÝ?’H?,µ_‰¿Cûï’ðdXÖz/›¤~¿aü%ó—…ç—Ú?)ÔßÔ} (÷ úÀý)Ãú;tÉßÞJÛ¶!üZ÷Û¡µ¶Ãó±6Rú•ë—–_ÿXk¿|¨ÂÀ<ÑÞR~“þ û5]`ìÊoñ^»WíWºÄ¿&ŒÿS²ü:ï?Ê/Ô_˜~|HÖKá—q€èýC)Ñ^k¿f¿”~8øAZ±vµd~’¨/´ö —Ÿ•¼'êÓß²šüõÀsäz0ø¯ÿGûýñ½Øè„f#êô½Ù鯄ò{ªù%ëbH¢K ò÷É¿Ùu\uü-²ÇŠ®ÏzòÈß7}{‡¾IüŠ·dzº#`½”D¼úð½@삾ߌ.Å?þ¼"à=öÎ×þ½SS÷Úß,ÙeßEù­ò_3é¾~<Àl)¿®Ú]­ûÃ:ëwhÿ­~Cùïjí_6ó}ñ÷kí—•ïʯ´_Å€×È{tû–÷ÝŸ²åû¢¡÷Ý*”¿µÝ,á[[-ÁoÕOZûI÷üHÿg†æ«ä=¥ü˜üká×A e…€®FWt5v]k¼ÖUÛu­ËUûµî“í¿&…_Š>=¿Mè?E’~ÓúK`©öãš÷ãvíÏëïùAi&©š¢¿ÔþŒÖ~"¾Èõ³Û X ±òG4ÿÑ¿,mtv¯t^±‘ŸJóŽ-¨¬M“Á®ö´íx0 zh7íÑl‘ßëé»;1›'­óp£Eõ‹Ù<òÇ*ËËMò{^D©œ¯È§:–Æ«óP ©óô]LùÍBŸ“úJûEÕ/m¯ùS;GûAùO䷴ߪó­iöËðHª¿¡ÿGÍ–ö7«¼_è¾,õ©@0_i¿æ¿%ýH}þ»†õy¿~Ò}§òkö[¼'íŸt~Ù€1€lD€©ísŠ}ÛDúvÊûÛ-í?&ío•vÍ¿`¾!ýó¸ÕKÅ—ûg¦öÏ+áGç¯6Óù§„ô7Ú­€Úk°á£K‰¿Mû­Œ™MýI÷§ïÔíéSÅþ[ѯÔHdª?Žâ/ÆõÇ•ç_ú„Û·©D⟥[júä--Í‚ßãP'ð|ã xüà*þŸ¢èþ£þËÿÿ°ñ ºïknm"}O“òƒ°W")Óƒ“-$#ïê<1'ùït”‹à±Yzñf]™†(ìÚòÈuJÛeRoYâ xÚðc垎 uõÙ‚€KÏŸ—”ß)þB÷õ]´ß©ûμÿ•tkpdïÌKüåi¿Ðÿõ#;ý…0µßVï7´_øÿ~³âÒ¯u_)¿ ·–ÏÑþ)ËX1à{¡ý´ÕñÚöŸ„[$þöÎ@$;Ðÿeë±ØTõï™,ø¡òߟKñŸ¯12~É|!ùêXûS5–æKÆ+÷/F¨íïß…´wA+hç/»~|o6Jd’þ÷¥FÞ/CÀ¸¦©©û¢Ê/{þ¤ ûb‹¼3¬Tÿ¬ ½Èû…óÏêq×¹•.@ü?ß²qeãÊ•ÎNÜÑ3Ä‚¥ùcuTàv´Z÷»‰ìÚã½#l¬ˆXX$U˜̦¤Ü´ý^ÙùîU¹|ò£“Ç‚ßV>ùÛ:›–Ah:0h¼„ÏâW÷Űᢠûí!À .Í=çGíß;gðO>ý8JþÍkhûÖ_Ëÿš~›ö«´ÝMùlõþa©ûŽa?*Õ¿%^P@‰ÿ¤j’úùÚ?µl)ÿ¤*øOé^?5ö=?Ù}cô=(Û/ˆ/°-+ôLº/©ÿRåüÊjŽçIúíŸÊ/çµù¯‘Ù¾­æ§´^°¿F¿@î×BÂÔ'þ»û±èÿãÁ5£äoÚcèÏ{½·[YúÏH¿/[©æ½Ùß/¸}~=¢¨€LþÅÞÒ~!öº»ÏVðc˜’ïJû´-íÇç´QíÏÙ´_qÝÅø“'x`y¿ÃøËœ_ê>>ÖuÙïÐ…ß>pØÔKû‡UÍßÈûupKÕþßAøûoYù¾Nío˜4h?)Šþ“†ðË1>$ýTó±À>þOdþdÿ[·[e ÀìÓ. ~/)÷©„_Sÿeÿ ÿŠþRþíÊߨò~Êú)é@•üæÍ í>\#×ßEY?…gÚoØ~=ÔGþM²_û\¤ýOu¹ÏðýôœQIáû5ý3Õá×#R~â;²_åüTû3 R¤ü¢»O0ßÇ÷±wEîñ7µÏÒþ:ówjÿš«ö»´WfÞoô£@Ð,¿ììü_äû‚þ„ñu‡ö÷ëš¿‘÷[)¿½Ãó}cدCÿyÿ”îó³úù•ù—%ÿ)ìé{=eËù ío•UÿV™ðËÑ>ªòGy»RûgÇVŸŽç­¿Çbä¯ÕõW£³ÿFÕÝ'Jïßj÷Iþ‰÷Ž´ëý.ôWÂ/ºûóéo9Ô~‹ýV©Ÿ^«:¿òšû2ûÏHÐ#¶¬ä~ÖªøgDÕ¯ÇR~à'ºûðQhž1 ƒÁ`0 ƒÁ`0 ƒÁø\üƒÔ endstream endobj 117 0 obj <> endobj 118 0 obj <> endobj 119 0 obj <> endobj 124 0 obj [/Indexed /DeviceRGB 255 <000000FF00006B6BD2FFFFFF666666FF66667B7B7B6666C24A4AB96B6B6B4242 B1F30000FF9090B1B1DA888888737373B1A1A1FFB1B1CC6B6B181818FF33337B 7BCC6666B9E33333B9B9B99090D2DADADA8888CCB98888FFC2C2424242E37B7B FFE3E3DA9999FF1818FF7B7BEB2121B1B1EBFF4A4A8080D2C2C2E3A9A9A93333 33F33333D252529090E3DADAF3CCCCEBEB1818FFA1A1999999A1A1DAB99090FF D2D2525252EBA9A98080E3A1A1E3EBEBF3080808FF08087B7BD2FF73737373C2 5A5AB9B1B1B1292929FF4242E34242C2C2C2E3E3E3DADAEBF38888FFF3F3EB90 90FF2929FF8888C2C2EBB1B1F3FF5A5AD2D2D2EB4242E34A4A9999F3CCCCF3A1 A1F3C2C2F37373D2FF6B6B8080806B6BC26666CC5252B94A4AB1FF9999B9B9E3 B1B1E3909090B1A9A9FFB9B9D26B6BCC7373212121FF39398080CCE339399999 D29090DAC28080FFCCCC4A4A4AE38080FFEBEBFF2121FF8080F32121B9B9EBFF 52528888D28080DA393939DA4A4A9999E39090EBE3E3F3DADAFFD2D2EBF31010 FFA9A9A1A1A1A9A9DAB99999FFDADA5A5A5A8888E3A9A9E3A1A1EBF3F3F3EBEB FF101010FF10107B7BDA7373CC5A5AC2CCCCCCEBEBEBB9B9F3B1B1FFD2D2F3CC CCFFA9A9F3C2C2FF6B6BCC5252C2D273739999DAC28888F329298888DA9999EB E3E3FF8888EBA9A9EBF3F3FFD2D2FFF7B796FC949005E770C2F0F4F7B82899EB 94F741F7FC9490F7B84E6D892D05E770C2F118F7B77BF741F7FC949003EE8803 D600F713EE00016FF7A2E3007DF1C2F164000FF8DF0008402004F7A3A0C40000 1F200C000FF8000000C4000CC40000DF0008000000F713E22A001EC4000CDEFD 30C2F18CF7A10E03EE8803D60000000305E00FC2F1A800E44A05E0F8000032F7 B9C59A3DEC000030001DE803B600C2F1E000CD7C00000900CD5C000000FF92D0 05E10005E17003B600C2F20400CD7CC2F21000F56A033238FFFFFFC2F2780010 260000300021F9000028FF92D0601232FF94D0FF92A005E100F432F805E100C2 F22C66E8880000006021D3FF92D0F432F805E100C2F26C66E94B00000060D91D>]endobj 123 0 obj <>stream xœí} Oi–¶s1Ónó!H ‚Âf0IX&|&\‡5Ù| .FÁËe@_˜ F€Âm#I‡ÉÆÍF ¼?tÏ9ï¥Þ*@fâäö‚ Æ—AçbSHôïÝœiñ×­ôÆ |E ã‹`c±ªw ~~^±Iäo*ô%1Œ/+óŒÕû'6+6Áö³ò3ßBÁxo¨xÌïŸh‘¿B_ƒÁøhÙXœ{2PÜ]ï÷û»Aø¹«ÁøFp3¸Ÿ u‡zçªxƒñm`3Ä¡ýÅÐB¡¹3…¾ ƒñ…н±ØTõ$„xRÅÓúŒoþ`0^UÕ47×gî3ßî÷nãKñÅ•_ }) ãËâ—¿ßߢ©½×Â`0 ˆë}…¾ƒQT³ø3ß(n3ûŒoÑB_ƒÁ( b· } £0ˆ²ñg0¾MDÙø3ß&˜ü Æ7ŠëìûŒooXúŒoi&?ƒñ­àæó ¿_/äã®ü­µ_ð‚~ëë…¾ã7Ÿ·øWz—:7®|×ùžÔëFþÉ|_ôÒÎÇZÏwTè‹`0þA1S/‰òW6®t^¹Ò Mþëyä_?ðùþ—?× —Âäg0.‰ûÀxã †zõn,Zm;{­Ñ÷ïÿ[È¿ñù²L~ãÒ~'(Ÿ¯P °”?=4NÍ=óù’¨¶]¸Nî–ŠkI2ùŒKÂOt¯j©ðw^¿¡üѨ1©¿•ˆbë»V€ë´aý\^ +?ƒqiÜDÅ‚G3”ñ9¿Yï›üA2ß—ÌØö?˜Ïd“Ù$\+?ƒñˆåïÓÑXçw6å¯Öä§:!YhåÏmõ3@~V~ãó0°Ñ¹!Ž&déO+4:(^S…6‹;Tþ7…¸VDi&›Aîù³>îçg0. g°Sµl!@“äÔÂ/Ò}‚ü€ú@ÿd6+²V~㲘Yê\zNGcADgç†$ÿmÝÑ×*óý¬(ùÔögüÙ üŒÏÅÍÅ`pf—‚ ý@AþÃh4-ϱ+a ~D~¬øù²lûŒÏBïÒâRh³Â_ BÀ Èo ?)¿¦~mf¹ŸM²íg0>þÅx|1¾ø!þ!aø$òGÑ}¨üY‹ý…·ýÄþ$Û~ã³P¬ÿP¯Š ,Å—üףј>¥Õ&üÙB“?+J~äüïòZŒlܯB4‰†ô_ôÓL~cX¿™óg}ÉÆ|ãÚèëöð~*mwwyxïã×p:üëÙY8ŽÐgÚÏú_{jFTüPù“IV~ã3ðóœDÕñ c|Ï|¾?(É—ìÅæøº½©ðþ~d?Lã^ ¯6œÏeÀéò*œFàùRûíkÎó¦J!ßÇFôïÉRw]l\øc0.ŒÇOû逹/GõËQ}IÓö'³è¼3™Tþ—­½ìÚOõS¤û€×ÀíÝÿ>ïçOV‡VOV"«4æá“?^:,ÃÔ¸`þ¸èë“I¿;ãâ(Ö?é}ÒÛ;ÛÜ\SÕDLíóŠQ}¶j?xnâþxžòçºà>)ŒJt&ú¯6ä\|xHpÿ%Š?6éýáKöSvFùýã2é—}D8bò3—¿7ê õÂz‚ìŸû'£Øgé½:H’éGÔ8¾ho>±OÔßGþ*âõONVON]~ûס“!|t?ŒÊOQƒØIì›ç"ùÉ÷Ó ¿lR;òñãRh …B+ÐBž„zç~3 ýF²o R(¿Ãö¯ãß—ôO¡‚£éôzƒ¾çgþ£C#'CC@þW-å—ÒI$Ì€AäÏ’ñÏR¹ß¢>+?ƒqÜX‘Qèý-–Óoúœ@Ê÷3™yÛ×ìu%ÒôƒòHÈW¥ò¯"ÅÚ:424´{‚äÔ틤63¾ùµðgù…+ö2Œ‹âþ€ÄÊÊñÿ/­7¶™õ¾,ÖÝl9n^Ⱦþyð°HãWQ×ÑÞíæì¿ündhw„„ÿääDÿ0±¬? ?|á²uvƒ~Ó÷[®„•ŸÁ¸8~(¦FüýÿÆ›NÛïÓõ>‡ò¿ÝGîKáO…SaUëá‚ ŒüjûáW#€¡]Š (þ»ïÎPýQù÷¥ö'ö­Ó…ògÇůÓ0ëêXùŒ‹ãfw1Bñ`eÓxÓÅô'E_ßxÖ$s‚È¿¿Of=œŠDVwÏ^*ú½GvGFliÿè±DP_†½³U•õ§(–XÒß  ~Ö0V~ãsð˜È?V,B¿ÅxÓ-çÝüY[Á¯Qr;ùQ¶w‰æ¹_¥ðCÊOLkþð[úÓ‰ ÿOê¯Ã`üçUo_"ѧËj–Ä_¬èa]+?ƒqq<öuwûíÊŸWíOf{¨ânöóß½Šäߗ‰h½>¢Z?æûCÄSú‡FýÉõ[oìb¹ÈIääe¿êÓ0®ËýjjU‹`åg0.·€äÿ@…ñ^žîõ³Rû Û?Ü¿ M°×zg;ù‡PÞIù²ÞÙCê¿Bã?tbô…_î6ŒöŸ:û¦ˆúBû1Ð"ž¬ü ÆgÀß]è®Gþ#û7'´›å>_6LÿÞÕ« I}ª÷åŒ÷ND±ì=ÁzãT ?ÕûOÞ}âÅjî ågÅg0.çâ›þz’ÿâ çZ åÙÏ¿Qgâ*¥ü²à×`¾Òä¦b?°ý­¥ð¹·Èþ·ôŽóý„é´˜‡œØ×ƒ¦Ÿ'ô0Ÿ¿±¼¿ ù³¦ïÏŸÏ?ÂÒ/¹i6ß;¥þ!)ü#µÞQÊ/»úWëg££Ín£€ Èr¿˜Ù“dåg0>é3Ù_ßíF~£“?ébûß_¥”_VüÃ~¥ò á7ëýôRÒÿDŒðÇ©½‘ðnÿiUc|Øö3Ÿ‹XßðþŸ-úÍ8O±­á—Í_Ìc„_Ò?’Ûß=#é—"ÿÖHúÿ›Ê}¤üb€¿œÜüO¥vïæ\/7#†øeiF?Oèa0.ëÑ´wÂoÙŸ¯üz4 ÖûòÉß|ÕÈù#‘HûIûnûî¶³wgTî“Å~hVfŸÃ”_)ÿÍ ¾4-(Ùop+ŒÓ¼½€/“ŸÁ¸q±®–– „fÿŒó,Û~.ä§^þ„®ö›Ëøà„>Tþ!9Êgä­Áè¿êœ_ð%åËñ½)ç„~‚ZɇÆösÎÏ`\bîîf ÂbÿŒó´‘¿áêUQï¾GçÍÓ}ò“!1ÆG)¿9ÌÇÈù‡TÒ/föÐJ@ûûgy—lüàjšóN`0‡\¤s`ÐßüY‹û.ýüS ´ýªÚŸ@ÛNÚ/çõœ¨‚ñß\ÐkïJùMåˆ~`üö^C„îê˰ò3—…Z¤³bsSð_°¿þ†óDSùÝ ~ V¹’~þ”X¿/,øIåG¡·­æ·÷VŒÔ·ôÐËy8Ù­”?Ë9?ƒqY(î?ž©ûÏU~Ëõ»ÙþI³Ú/&öÐ^±Ž‡˜²«¤ß¾”gî?‡dÊ¿z"‚)D(?.äçø­ŒZÊGäülûŒ ã0z]ùgff*Èúûgœ§ZÕ~*÷çð›Õ~k”ϼ´ý‘°š×£êýNò{½§ÿI¿Ö}±–Ìùû Ǩ}]ìϰò3—BßmuWŽŸgfn û+Ðø»“ß>³'o„_s¾ò‹¥|(é²ÿ<ò{ñž# ü/UüHøi^ŸsÔÀ¸X»;ÃÕ~ã’°îÁûóù'>Jþlþ:E??P_Tûç§§kÐöâpÎõœ¿;‘®^ÌçO!õ÷‰œíùÊß®gõ‘úæÊ{©ˆUïK$–moÊÛu‰A>¬ü ÆE¡ïŸ®æÆïåüëæb^Ùd&ï뎤í—+ùØjt¹ß£»wz:<üÓÙÙªÉâZ¾“ï†ï´/ù›‘KyHåŸü¤ÿ\ƒ!q]õñ#€ø7ˆûçVû¬•2if ꃜu ñ“S{‘ý~ãûXÆ;ûixô•}a®W¿þôŽº÷iBϪ¹’O¿Èùé ¯:rþ.P~ZFL(¿ìyàî~ãÓPm¸þDz§]ÿ„ë¿ucJ/®Ü]:utw»+c¸ûVáûåœÞýˆõVƒ^»ŸîÌ1¢~{ÿðoâ^]«ÏDÂäÏÙ®¥±Tß±'‰~¤±}ª6yð·øWa0¾ÜÖwáõz®æ›ÂŸ?¯Ù6+í=Xt›²ÎÈIòÓHŸÈ~*%Ù¿&‡í…Qßi!ÏœúÈ«= Ÿ`Ý‘{]?Ú~rýÖÚÝ„F½x¯yûàäßè†ÁøÊÑ­¶Rþ_**Ôð^Êøëýÿ7ï>›ôc;ÊïkãŒvs˜ÎÇ 7Œö¾”ÔÇÁ{â†\Æ*^'CrmO9£'<šÃ?ï5¤tOÖûS{ÚEO_FŒñÑø[þó0_/Ž>ïÍŠMIý‰s¦ôz3ö™=”rÛoו벆øÒŒ~q“nû}ºWmkôâÊž«òîÜrdßnûnX ðÙÜ/áè7œ”Â/”_oÓã«EµYïÚcÓsúüÝ3y¨±I?òÍ·mÎÍ‘îí£Ûõí«™}4Ä_êÿÉIÎøDîäÄä¾ÝgõóEð wíWâmÜÇ‘ý>¾cƒqA˜äÿ¹¥E®å1¡–ñšÉûÀ¤©üú>½öþþvYò»º/²~âp8bQ(n/Üë„_Ýw>¢—ñÀé¼h$rÎk—Âï3oÒËýý Æ'!jÿ—‰–‰½ŠW½¿¾Û…ü9Û=»ô}zí'Í'(ë$ôr>á”pþ’ú«Î¹w«Öd¾°^ÄCÌé‘ý|ùƒZ³êf]jØnÜßÏ`| ¢FOß ÿ6Å}¼oOÞžŽå<|IºQ¯“ü¹°ãK¦ù}b–®S÷»V¾§¤ÂÒò§h= ü®¿æ}Ä»7žµ:ú4Ú?÷ß„Áø&`*ÿ¦céÞn—›vÞ›Ê/´?›qŽá?KÐðþ«2éW{åb~n#ýÞ™sø#j6_Šfó%ö#®“&3bÙn›i½ü¿ƒñ á¶EþÇzÝîz¡ûn·ëäžÔ÷ɂ޸º£ÒËôòNÝ)¹œW$üSÎõRŽ„á§•»ÂF­…?õNy±Ž‡-áQ> ƧÀPþ›@yâ=4y«¾üu"r]û‘üI`¿Ë Úá”è—Py?!Ü;÷bFOÔŠ½ÒóGhh_äìü¹“ìp°i?“ŸÁøD«£êf-HzÁüzy—î7åÕd²–öÌ¿vP:ÚŽºäO…çwï~däýéðÙ‰òü4¶/uÒ_°aªÖ”ýÄñòƒß?ŸÁ`bzxïc}{nIý±âWå>>::ZoþØŒýWk¯ÖÄj>Ÿ|Qê§á½Â\^Î'žÎ`0ƒQq·¯÷—n…1BqñÀÀÊïŸÁ`üCã ø~q´9f˜Ügò3_/¢Ñè!î×kæ÷WZ }y ãï…ê¨XÊç9¾˜hOªÜ…˜ü ÆW‹¾¨ä7t/–¢~Áäg0¾^û¯{½cHxE|IýÞ¹‰B_ƒÁø»!Åš_Eh%´‚¬³/˜êí›cåg0¾b ‚ôGBÈþf>P¸ÏÊÏ`|ÕÀ¬ÿ@wÚˆø`ø‘úMMþB_ƒÁø{¥ÿ7ú^¤}¯Ð|ä~0(ˆÇk  Ø`D‡öí×­ØÚ·Û[U;/$`4 ‡ý1íÙ÷hýÿÄÿm1¸ º¿|'€þz«îá`90>FB=»S‚ìóîÌvô:hØp%FŠ’ÙXÚOe-#¯C;à-¸³0ˆ~¿£Ž–¯ë0Ïi[hÃìÂû¢Òƒ!¡­r– ±J¢}Y]ú‚­…E”Q<ž‹åü–æ›Òo ì™MÐ<½G> }®öŸ>85èoñœ8ß¼ö Ù­h¿$‡‡ØÐ¬K7 Žá@÷©MXE÷#hÃJûG%ñiwËlŠñ¸5yKcRøIý~;é—÷‘ößOM‚ðO~?e6EðÈ{`?6ê#í[‘îÛí†%  6¤=vÏZ%ÿéÙ >0_qý˜žk„-˜·”ŸœB#n©šFxn´¸ßˆÜo´´ß&þëkmD×Ú ŽDÄGšÙáàGhHtr?RC¼/ŦP|—dÇnÄthÁ}â|¾ê)U„—ÜïÁ嬀ö¸¨º‚,nÂøp‡/ðöZ´è…XçÒ"ÿÅÅ¥xü7,ûýWÓ"ÙýÅÅà´ ù©Âm«{8‹‘òw$?p\áNݬ`{Ñ2à¡é‚ž:.£W]ûï -ðUvà7¥á é“uóœ’_Í=ôõÓ 1V½;++ñ¯áÃø±jØÅ.B}—(3viÒ~öôþÁyÚo×} þÞšMøÅ4gü›=pŠ?i¿Hš…ðÛÄŸ( •²¥ûÃnÀÝ~up«ßˆyªßO´¿µ,èkR‡bÿÔÔ䔡ü¦P1`Usaý¿ßކ͖´£êߤð‹½]÷Qõå^„€VKôÿÏ5ØTN`—}|Týy¢;<”ú7ZÍzì'í·YýÒ5°é>„‚kZ÷1àëT@(ÿÔý§OÇŸ"åi/--5%ßd$  ‚~´ÿúÔ”ð‹-ké?ŸêÿúǽKAäz$þŽþöaì>¼ ;ƒ6ò— ¦nÕŸ1⸠‘gyžö*ëLò×S…š;•m·­c«Þh¥çE>ùÓm•Èö¨`;üNG”XN¢m–ªJ ñ³fÁàSèoùý\^[ÚEûÅÞ]û ö›ªoj¿®4ÛËk¦ò?²ë¾Ò~Cù×µÝ?’H?,µ_‰¿Cûï’ðdXÖz/›¤~¿aü%ó—…ç—Ú?)ÔßÔ} (÷ úÀý)Ãú;tÉßÞJÛ¶!üZ÷Û¡µ¶Ãó±6Rú•ë—–_ÿXk¿|¨ÂÀ<ÑÞR~“þ û5]`ìÊoñ^»WíWºÄ¿&ŒÿS²ü:ï?Ê/Ô_˜~|HÖKá—q€èýC)Ñ^k¿f¿”~8øAZ±vµd~’¨/´ö —Ÿ•¼'êÓß²šüõÀsäz0ø¯ÿGûýñ½Øè„f#êô½Ù鯄ò{ªù%ëbH¢K ò÷É¿Ùu\uü-²ÇŠ®ÏzòÈß7}{‡¾IüŠ·dzº#`½”D¼úð½@삾ߌ.Å?þ¼"à=öÎ×þ½SS÷Úß,ÙeßEù­ò_3é¾~<Àl)¿®Ú]­ûÃ:ëwhÿ­~Cùïjí_6ó}ñ÷kí—•ïʯ´_Å€×È{tû–÷ÝŸ²åû¢¡÷Ý*”¿µÝ,á[[-ÁoÕOZûI÷üHÿg†æ«ä=¥ü˜üká×A e…€®FWt5v]k¼ÖUÛu­ËUûµî“í¿&…_Š>=¿Mè?E’~ÓúK`©öãš÷ãvíÏëïùAi&©š¢¿ÔþŒÖ~"¾Èõ³Û X ±òG4ÿÑ¿,mtv¯t^±‘ŸJóŽ-¨¬M“Á®ö´íx0 zh7íÑl‘ßëé»;1›'­óp£Eõ‹Ù<òÇ*ËËMò{^D©œ¯È§:–Æ«óP ©óô]LùÍBŸ“úJûEÕ/m¯ùS;GûAùO䷴ߪó­iöËðHª¿¡ÿGÍ–ö7«¼_è¾,õ©@0_i¿æ¿%ýH}þ»†õy¿~Ò}§òkö[¼'íŸt~Ù€1€lD€©ísŠ}ÛDúvÊûÛ-í?&ío•vÍ¿`¾!ýó¸ÕKÅ—ûg¦öÏ+áGç¯6Óù§„ô7Ú­€Úk°á£K‰¿Mû­Œ™MýI÷§ïÔíéSÅþ[ѯÔHdª?Žâ/ÆõÇ•ç_ú„Û·©D⟥[júä--Í‚ßãP'ð|ã xüà*þŸ¢èþ£þËÿÿ°ñ ºïknm"}O“òƒ°W")Óƒ“-$#ïê<1'ùït”‹à±Yzñf]™†(ìÚòÈuJÛeRoYâ xÚðc垎 uõÙ‚€KÏŸ—”ß)þB÷õ]´ß©ûμÿ•tkpdïÌKüåi¿Ðÿõ#;ý…0µßVï7´_øÿ~³âÒ¯u_)¿ ·–ÏÑþ)ËX1à{¡ý´ÕñÚöŸ„[$þöÎ@$;Ðÿeë±ØTõï™,ø¡òߟKñŸ¯12~É|!ùêXûS5–æKÆ+÷/F¨íïß…´wA+hç/»~|o6Jd’þ÷¥FÞ/CÀ¸¦©©û¢Ê/{þ¤ ûb‹¼3¬Tÿ¬ ½Èû…óÏêq×¹•.@ü?ß²qeãÊ•ÎNÜÑ3Ä‚¥ùcuTàv´Z÷»‰ìÚã½#l¬ˆXX$U˜̦¤Ü´ý^ÙùîU¹|ò£“Ç‚ßV>ùÛ:›–Ah:0h¼„ÏâW÷Űᢠûí!À .Í=çGíß;gðO>ý8JþÍkhûÖ_Ëÿš~›ö«´ÝMùlõþa©ûŽa?*Õ¿%^P@‰ÿ¤j’úùÚ?µl)ÿ¤*øOé^?5ö=?Ù}cô=(Û/ˆ/°-+ôLº/©ÿRåüÊjŽçIúíŸÊ/çµù¯‘Ù¾­æ§´^°¿F¿@î×BÂÔ'þ»û±èÿãÁ5£äoÚcèÏ{½·[YúÏH¿/[©æ½Ùß/¸}~=¢¨€LþÅÞÒ~!öº»ÏVðc˜’ïJû´-íÇç´QíÏÙ´_qÝÅø“'x`y¿ÃøËœ_ê>>ÖuÙïÐ…ß>pØÔKû‡UÍßÈûupKÕþßAøûoYù¾Nío˜4h?)Šþ“†ðË1>$ýTó±À>þOdþdÿ[·[e ÀìÓ. ~/)÷©„_Sÿeÿ ÿŠþRþíÊߨò~Êú)é@•üæÍ í>\#×ßEY?…gÚoØ~=ÔGþM²_û\¤ýOu¹ÏðýôœQIáû5ý3Õá×#R~â;²_åüTû3 R¤ü¢»O0ßÇ÷±wEîñ7µÏÒþ:ówjÿš«ö»´WfÞoô£@Ð,¿ììü_äû‚þ„ñu‡ö÷ëš¿‘÷[)¿½Ãó}cدCÿyÿ”îó³úù•ù—%ÿ)ìé{=eËù ío•UÿV™ðËÑ>ªòGy»RûgÇVŸŽç­¿Çbä¯ÕõW£³ÿFÕÝ'Jïßj÷Iþ‰÷Ž´ëý.ôWÂ/ºûóéo9Ô~‹ýV©Ÿ^«:¿òšû2ûÏHÐ#¶¬ä~ÖªøgDÕ¯ÇR~à'ºûðQhž1 ƒÁ`0 ƒÁ`0 ƒÁø\üƒÔ endstream endobj 125 0 obj <> endobj 126 0 obj <> endobj 127 0 obj <> endobj 75 0 obj <> endobj 74 0 obj <>stream xœí| |TEºïWUçtw4!@H€î¤ÓÐ A–@$¥C ([€Ñ$„}1Á48 ‚\@®étz%:£^t¼ .ãŽ:.3*£àrÞ¿ª»CˆøÐy¾ß½ïý8‡}õ-UõUÕWËVbDd¥å$hü¸Ii¤žQ÷#™R¹¨¢:À #bY•Kk_§¼s ï™_œ]=gÑïwôF –GˆLç,¼avÀ~X ’çΪ˜yøªÞ¿!*Œ?d.Q_F}CñøÄ¹‹jÕ˜Ûýeðgˆb“VUVÊg:àT÷E¿ª¶2ÛDɉ:®­X4+è_-’¾ÕU5µAþ”ÔW_7«úÃaáKr>QdWýv"},Ù^b#ÅŽ1Îè ÈÙ:ß8!º¢ô® ˆ\´‰¶R"déyj¡1´ƒrhEZD«}°êDyôíg Ù$JC¾§07Z^o´PJ2o{€>b‰F#"÷WêBý¨Žî (šO/gäÒ z”-cŸR<•Óí2­ÞX@#heEÈ]A7èo…í¡…(õ0ëÁZŒãÆÇô¬Æhjú ­†Ç~jáDž¾Ô—.§+©Ú_ÓÛ¬+(6 êO%ðp+=‡6N±tØ ‘ jµ>Z­žqöôp&ÝOGè5øñÆý4ý“õÇû>¿™×SÆGðÅBvFhUÑRºž¬>O °ïy,k/è7ê';1¶})¾ƒõ$Ô½³ä§f¼ÇÐË.Ì^ cW²‰l[Ï6±fö6{››x<_Ì?>ñŠxW¢ëÆpÔÔú ]'M¥¹˜›1Úw¢¿;é:Ⱥ±¾,=:†òßð<ïÃü0O¬ëµ3ú­­'ZÿÖú½QOfDÙ(ŒÃz £ð%ë’Ù|VÃ>€çø“"BØ„S 9¢X”ŠÕb£øñªvÖ ½£Ö+ôsEëµ­¯EÆo1ŒLð«¥Ðe4ñ3Ñ´þU㽎–Ñ-TO·#^î¤mÔ€~ ƒt”þLÇ ‹‡ÏóÐú"DÝJv;Þ{Ùãì9ö;ÈÞgßÈ—'àMâCx6Ïã|_‰w#?ÂñOD/Q)êÄr¼[Ä^ñ¶Fš¦zÞB}þ¨és’¹Ð<ÃòÇ3ŸŸí¶ôì{­ÔÛzUë¦ÖçZ?6¦7À¥Òxº ^Þ‹ÜŽ÷1Dâ^z‘þHo*_¿bœéˆøæD4¤`Ö²Ù(6ïlÞÉx§²ix+Ø 6o[Î~ÃV°ß²uìnõnFß¶³c{ñ>Åöã=ÊŽ³¿²ÏØWAÌ¢ÙÅûñ4ž‰žæñQ|Ÿˆw¯Â[ͯãK1Cò&¾]…K¤Š ±XÜ+žÏ‹7Ä·×R´4-K›¢ÍÑVh‡µ×´·´ïu»îÕçê[ôçMq¦ËL“MóM›M»MŸ˜Î˜Mæñææeæ7̆ŅÝê%ô{µÒL‡Y­ýŠǺˆÕú*6#fâÅb¡¸]ü§>›ö«óÄãaQÀÿ)ªØ~€%»>\̦µd°þ>?Å?Öº±bþ)KÒî`Oñ*‘ÇM²ýu­›¶Bÿ„ˆ¿IÃùM¬…¿ VˆÆ¿Óp} ;®oᯑC;Á»Òq¬êUüz•Ïãk¨D»LÿžæaÜÿMÿÆ{$_Íú‹7´-ô‘pò¯ÙI¶ »Æ!6FKä×ðLÖ€÷,ëCŸ³ÅTÍî&{šý™5c;Å£l,ïŒÙòq+ŠCèˆgoˆNT*}d}y76žŸä“Å3¦#b0cØ%þ“nd‚¥#vBO+]‹°‘÷ÞæÅnò:Ë ºûý©Ög䎭¿¥¯Aœ=(Rh"¥ÓÕü޵ñÞº•2h?bp5¥óÍ´ÌXÎfbß¿û'§f6ŸÒX8vËð­çEwž€½° ­þûÿËØõ‹Øt=s`eµP’&5k5/v¦rì¿kðΤ«ÁÝOwšöè¯Ó8ÖƒHs´nA”¿K×àÌùíÇRü›Fj)ðÚy1JÜßZH¼·Ò+ŒÓMðy$Öùx­;ï&c>z8gÔXœ‰ižqåaî&+Œ5TfCÛÍ:öžåÔGߎØ%OîäbOöÈ˳F Ï6tÈàËe LOšâԯ¯+Ñ™ï°÷éÝ+.¶gLîÑ]£ºØ"#¬Ã;…YÌ&]œQŠ×YPîðõ-÷i}……©’wV@PÑNPîs@Tp¾ÏQ®Ìç[z`9»ƒ¥'`éi³d6Ge¥¦8¼N‡ïP¾ÓÑ̦M(A~]¾³Ôáû\å¯Pù *oE>>Þ˜¹ù+wx}KçÖ{ËóQ]cx§–Wéœá#g®/Ò­L(O5ã3åù̪Ç<ÙZãhLi©_Ûl£åîÎ33+¦—øDE©l£‹íæûzÜøaÌ9•G啬j¯õÞ˜yÉÖׯrø¶M(i¯—ii)êðqWAy}^‹!,šä@[|ei‰­DƒÙÙ§@ïf9½RR>ßá sæ:çÖÏ/ÇÄÄÖûhâ ñþØXÏ>ãÅzõÅ%Îx_vœ³´"¿Wc4ÕO¼¡©§ÇÑó|MjJ£­K`X#"ƒ™ÎÖö™Ym:•Sæ2W4±m\™ôÈ9áàsT:àI‰}&“Yè¾rÌð”2”òÍÄ|Ìó…å•×Û†Cn“å}ºËætÔŸ&Ì¿óó¿Ÿ/©JL.Ûi’Y%m}(ïs»}ýûË1çaFáãHÅNMYÚÌ}Îj›ÃGã1¶¥ÃÓ0øññrz×4{hßò %ÞA3âüäIs—úx¹Ô´„4Ý&KÍò¦­x¹qü$Éï‹n>Kß¶?‘¶î]½s‡ûX÷ÿzV@_4ÉY4aZ‰Ã[_Û¢âó¸€~X›.˜cܧ¹0R£½‰ÓJ¤tWÓ;¯¼K >úºæ•ˆ8^Èñ8¡ªBüNo«Y2%e]šË¤âf³Ù‚Væ(ðÙÊ ii§øøŸX¨Ù8)K)r®X°O¾áîóùçñç¹×¹^Àa­//*žV_ßé<]6«úú§£ ¾¼¾¢ÙX>Ãé°9ë÷‰QR_í-M³±Mœ¯`m):1— GhsÊmt²Õ=lõ¤i%ûløÄZ]\âçŒç•ç–6&BW²_j%åR*…’qHçV…Ÿ[”}Ü>Ñr¥Õ”@ñ•ÍŒ”Ì’1ªlæ™-$ãi™GÉä#wмâ’ö1 Viªºà 5¾ÕKSmô}mk_›’´Lõ¦LÖKæx¸a‹|Z©áXhzŒ M™èÅbš]10ò;´ä‚ýµà'ÞÁ3I@>8 ¤“0(ÆË€ °õ·Ë:BëhºùªÐ_"›>…€1È;µ¨¿VCñÈJí ½©?ò Ð%›{Ãö%ã#©‡]‚²›‚r5´ú‘àÃ(ó:ŠºB‹zvJŸA‹Äs²¯Æ—È/…£‘ÿ´¾æƒŽ…|ò—V”Éâ™F%ò]¿cÓù΀徕e`o…3¡Ï¥-Úµ‚ÆI[Ô™,Þdqì>ܩޤF­˜¢¡P@¿eŸC}’þKŸ~Ò¿öø§ }åç|ûx̃Ô\ÝìëýüU‹mÆWÈ;MÑä•0¿I}п¿™ÚLêiîm|GëOÒ`ð FAÖy?Ý*N‘:·iâf&ä¡l|ÇM½M.…þb¼©|/•±‡XH„Ý$U~&õÑ>¢Xä=¢¿¶Æs_š‡qÿÂBÆç¨#OõìžCùh?MŽœw6¥µ¶ŸBw=Pƒé ô€~Ša”‘åÑNŽl#0dS1ÈØ2BÎOá!¨ñL¡;Ð Èv7OW¥ êíû>ðãf326e|ÈØPñxR1+ç±c#c,°f¶óÙ´ˆRðQrkýa«Ö‹œGé³\ ²n[2fBú¾¸g_Ê~ʘjGzŠj[­A[íh²Œ}I…Gõ!™·Ð³±QåƒW®G¹&B4ä\Ÿj€ŠÔUŽœ÷ EÝF.èÆêoÓ(m M/ þ§#?t(Æg‹Zƒ_jwÓ‡|%qs ¥`.åÚ½·Ý,a>Êæ£¾Œe_íÝ«èQž eºÞ`|ª7ð›åÛÓŽ`-¤íu?Wþ¯€Óh6òŸéG C;Jw¢¯dþK! ¹Xô·¸ÙfËÖlžL6ÄÍ) JóàûÕCCµÊÖº©uç‚|2êNÓДøR»ML¦‡L t™8ŠyD[ü­õƒV·ÅQǘûa,)Š× P¹¬!ªÖT¦ñžZW™Æqµ&3Ö¥Ly6ÈýY¤öæ.¡xm‹Ë¨¯8Ý.>;Äi»ør¶ŽqÙŽFH<[¬¡uŠ2ÝåY#û¯öÇ)j=©}:Ⱦ#m+ÿ5óÇŒ?©}øM ­k` à‚þ÷Á}û0æ[ž™ëŒé¦ëébŒ1ýÜkZú•ÑÄûmgª‹2‚{Ylè,•㤢^m程Æ÷3—¦d ¡9¡+§T±õT!®¾Cþ ÃP÷ƒ?SÙ6äÁû‰¼'pµ^^C¹ƒ”*טôA7ÒŸûo‡É.ÏDóCÃNr 2†ñî<£ÀsÐõí°!(ë ,ž¿MS”®˜Nðgùnþ¬±@ÞÅ;T&Áüí¦x1 ç÷ 8Gà ƒ±:B%âUä ß,Åݯ–"µHš)þ» èªQîêxz‰[Qæ]Ð'èrñ2Í-¸üEÞ(^[z5OyìqZÀ¿¥¦!8“G¨ú%j«¹ù—`Ù ”¯!\Èçp·»€¿Ê×ö~J/àŸ¬CÖ«ÊÁFÓ(’Èxph뾎€müØ^A7°Æ~v?°€ûƒØE…Š6°Æ³eÀm0=Ü‚| è³ÀîO÷V¢îç@›Lê/Éñ\Ä3(d[€ÍÀ+!]{ȶ.$o=ÎØ¿g ÀN¡§Îש6o¡!hoˆv¹±_B|Š30ÕQ´y)E‹~÷A¹¼‡}n%^ÌŸ‹¦t5†x~J*äÚ•çó/UßOæ·¸ZùðöcCÁŽï‚NaÇpn/Á^ €Oß54ž¡y‚ü.%ï0ˆdüWGyG¾ã¼^ŒçMTÖ¡8h‹‡;i¤„– { #o9H#%L/@÷ÂyíÑ‹`î(÷IŸƒý~È›ÆQ? ž_ce¬9 ?Œ}¶ª¼ç% Ö.ÀŸÄY ´écÏÚë9®â¾€>4?¡yé8?ðÏ£½ LÃ}öUJš¢mñÜ/΋ù xoãå^òQ›skâÜÚÀZù±:ÿÖÎËÀKÀ‹ÿ·Ûb„Xl€º£ŽÀ7ø`Ü=§È¿ª9ûG¢3Ñ ]q.`å9üÈÏÜÈ?ÙfÐÕ ØjδBnà [´XÜ߉V¨£µ:Pöì7Àõ:Î>Môý[AÔÊŸY @‡›Ù™'À@>Ê„ê¹übÐ߃¨ë ògßVEÀ=z¦ú0´ñ¦¼\à;ô¥?öýñSið;#+Dð ñs舟DÏûæÍÿÅhè[âTCÐS;~ìç<Šø kÜ¥òN)ïÑò.+ïÏòþØFåw[¡¢]ƒõ„h¤<åÝYÞ_õAêïå7»Ý÷ 7tn´ß[Ù)ÚØ€¸ ]›oñ­ó*ΦHì©§Ñ¿G$ÔÙ&Ï5þVúcÆiz|oÐÓ¡3-´·þ`½È™öKó?÷ŒüÎÔŒ Ê:àÇä! b´Ddzøçâbg÷¿|–ÿÈÝþœþ?åCç|»—þàpþbõý\¾ã½ãgóî%!¾#~ ï{¡ûL,¾Cè°î~.ä·…¶çÜÝ?äCÇuܶÞBßu8SÛû@άdà!ìé@o ¸²›-g(ò‹2ÀïöBö9èL©ÝÊÖasûÆ8 þ7àmÚ!e[ÄÌ‹ÅsǸ•÷su?Ę©}pƒôŸÒ€@Ð, ͵üöDÛógˆäw®6Í8­½ t¸^”¦ÅÀ.ð‘à#q!S=}EY´”Ì8l”&wTýeÃÀ¥Ÿï§b£E¼ßäõfxšAÝõ'%gì“ l¯ŒïóÇ©Ù!8îï§4ïùssƒ™!Ù¦þ©Çs:‰÷èK€‹÷ÄqLŠ*Õ”4 ãdŽ&nÆNÎÈNÛÄŸÉpòˆwšûfl= þýËâ ÍTÅú­]2PáKâ)Š"»Ø+ö5{š"ºdPN ŽF-H'€“€FUâQªÖ»|#µiÀ8) ¢~nGùH¤i@°ШX<ù™Šb>% ìZ±‘º®w)úh,èC÷}¼¤[ƒüï@¥þ¾ ü^ðÝA7é=ÇnR?ï´‹»ƒüR„½,W¤ÛD¿Ý–Ózä6"·C·!eb…X¨ZjÍ] ®›üñN5G75õè™± Cz†þ&ŒÜM¹›HƒjYÈfYÀ&U,ƒÍ2Ø,ƒÍ2ŒJº¨A{5ò2Ô8q¯Á¸K¹i pDÉ‹t°MrâzŒc2¼ºMÌ÷'Ùdsš2=ÙO‹Ùj˜ÝÔ³wÆús\X'ˆ A)mg)í¬¦°ÎR:«)¶w€ÂjAN„¨¤_[g%%—ù€&*ý‰iöýâJZd!O„½Ž×‰:­N×ÒóYÔ‘AãqÓ¶S”H¥,$Û˲ØÐò°ê°åaÂæKó„Ó«DX/„]¤‰l1N” ½Ùhñ›‡ñŒ2 ´!|[¸/¼%üH¸î3µ˜Ž˜N˜Nšt‡)Ýä17•›ªMËMLÛLaL̼<¼:|y¸°…;ÂÓÃ=áãÃu»™mËY)fÈe‹ÔT c\¹C\”a6Ê0×È¿‘@JàlÀäO€êà"a »HH#!„”JÍx ¨jMmšPiRjùºF`lO =)sÀpVpVpVXágà¡ ©%; j†téA}9`Rú“Ê&¤óȲüŒ§¢_K2ó%³mÉlC2ódeçdxDEE•9Ë\eIeÛµ*g•«*©j»6Î9Î5.iÜv-Û™íÊNÊÞ®¥9Ó\iIiÛ5»Óî²'Ù·këÇî{`ìá±ZÙØª±ucÅPL]“ßž¡h‚KÒ=þž±C#sFðÝèNÒ­Àq@i TßÔÎwAº Ò]4(t”Ø%·¤ö NÊ·*ÌI=?O/ÐñÇýÃ˃-· Ø Ôý8ô+ë@n·’ûžPòqAûmJnG*#°ÁMSÛÜ4,¿i” ”Õ€N‡ÅT: f¤v Ø hbÞ©b*ß…÷qþ¸HñXv³S÷îDÕÅb˱ñΈ+_™nVém*ÍVi¢'bŒõ›1ÖgÇXocí‡ O¢(6ª4Þžc}2Ç:.ÇšœcEm=(ž¬¼›JM2eSé•*MñDÇ[¿·~oýG¼õxëâxëåñ²\/¬]+Vi¸LÙ&•ŽQi_O¸Ýú¢Ý:Õnj·æXÙ†Ö)W¥}T'SöÕ“‘ù‘ö4ûŠòQóg%Û›9) VH«?kÈYÖïüYwÙŸaß2u¤±oü‰Úsº±Sl´&ù¯ƒôl45€žºƒ²˜ ôÖ-Òþa”¿üC”`‘öÒxUn+­äËÝïO™VçO¹­ÞG)ªÕ{ü)Bz—?å6;ý) AÖû]ÒÁùþ¬þöœ.l%ri[I..=l±5/(ìõ§ÈRù²f–çwé'½|†9i¼jÎîwªNö&§ª¢9•ÓqäR4‚E*ç­” ¨Åï¼µ˜žt}hÿ¯¬§eÇé4‹ôo±ð ú7ì_Øhƒýµ}r¸üöÃ)Í̵×þªóiû ‰ÍlŠßÞ’Òlâ@J3g{ìdl9Ûkß2Ǿ˩´ÛÐbª·f¥Úçœf¿×Þo¿%åé-B§@]š2Ò>6«Á^àjfP{²Ð˜§“}¸ó:{&ÄÚÙè¦ûÀÄféJ:êhØkïû:•+“‡îçƒÉÌ–xR̵ææ)æ ææAæT³ÃÜÛÜËm‰²Ø,–ΖN‹ÅdÑ,ÜB–èfã„Ç-ÇmR?ç1i2ÕTÞÆeÊ?üá̱v|]E/š”Ë|QETTœëê.j6}ÃÜE>Ëø«J»½œ¯nfT\‚•¢•qòÇ‹ûˆ±´•ëâ$]¶r]i)+òµTRÑ ‡ï›IèG§ Ó|º37†º/ÍŽÉŽÙ%³ ÿIy0uŸ{bÜퟘ޾ME“J|õ.õeȌѻ´È7Jþìq_Ì«¼ùûxµ$¥%ûØ|±w¢”³óKÛÌ(WÃŒ²$‘fM” Í(5)³±Ê ašàÍoLH=ÏFK#„ÏóÊhN ®D4ºÆK3Þ‡U]‰¼4C<*‹l_Ygb‘ª²ÈΤ*ë%].˜¤¸¤IãP ]C•ºáœÚé ¸SJ.ÕŽ‹•ªv;g“°Am¸6î_ò™•û3ŒYSÅ»3+åOËÞY@¹oÍÒ¹1¾å3ŽÆ™ï•Ú·|Få\I+fùÞuÎÊ÷Ítæ;+*/ ®”ê g~#Uz‹K+=³òýž ¯³"¿´iG]^ÑymÝÖÖV^Ý*«“•åɶv]@]$Õ;d[E²­"ÙÖÏÕVÑÄ\V4¾¤ÑB¹¥yÓ´‰‡wÂz(‹/Íín«©Ljø˜›ãök„c+Ü]êëìÌõY©JÍIÍ‘*¬N©Š?/ªbn‡ïé Êqg.¹)Æ;/¿íOMMM­Ä’%n¤µKb”¬‹6~R‘¯@þ2Ë—åõyÊóK™œŽ%Á'¯Äc;u8‹WeÕe­ÏÚšµ;K_²¤â¨ ‡xYBUB]Âú„­ »LR1½d¯'kk— b ¢‰Õâñæ«6—€âdk—ÔȇÐ@ hνÄW’“@•¸í2ÜÌS©+à“~ôuààk@£HD¤ŠTo̼|Ùb©[n:1"£)}pưfЊÙ:iZ€z¯ ЬœŒPö N9‘¸x3Úôeàà3à;@"CU¾$µ¥5TãfpŸÀÔʤÆ]ËÜÈ09ܵ5n7IÈÇ ÀÔÍÎ{b5KC ‘’ÖÈbK$=gŸ¦~mŽù |1ßãñ$qf2›pÍñ-LºîÔD´¦ 2›œAjâLh&³ÎÌš.¸IàÃ:×i[ë15³dO„á/×·éBïi)>ã¾ÒvêêØžW|söóžQ™i“–•šÕ#“u‰Êì’™¹Ê2À­ßdûêˆ1î™±3ÓÙÕlcæ~.¦õÓú­¶X*»Û|Å?g‰³Wyî9s.=¿èSyé½ô^z/½—ÞKï¥÷Ò{é½ô^zÿ|åÃ)ð_ÔEË<Ã_, ÿÿÛÿÛ¾/þg<%¨T“ãs’F(%õÓW5>Œ¢äÿB‚ä`£‰Æ–ŒõN(p{fÌ/ÈL¯MOWVÄ6Èpúמ“tÒ8Oú/ ÅE ²€M£o÷þ²È¬Ó–ž%~èƒÞÏKºï螤ïkÏ®µ‘%lX¨ÞÿCƒP endstream endobj 128 0 obj 7994 endobj 34 0 obj <> endobj 33 0 obj <>stream xœíX l×=3óæÍ@ƒ¨ÅŽehJ°ˆ…‚!&e_.%†¸_àl×ulLÀ¬F¦%1,–T¬6DX_¿®K²…"7MºP·¢5ikPJ¢4±(F,þ=÷ùIh›ªUÅŒÎÜ·¿;÷Ý{îü Àcø>¤~kþˆQ0WŸ¿ñ‘µ´$wyG½÷kÂÒÕeI¬ä§õÝâuý=†ñ1®ðùÜü«~Æë@ß%¬-dCü.ÿ¯,Ÿ&ž(,)[û¢–÷Y~ˆR\º476Ÿã½!%¹k—;·­|Ö}6&-Ë-y>¦Ìº¼teYG½ï$é7ºP/ëîF [¨½º}‹_'-÷^N¥*íc€]G¥ñ)ì4Ú­ÈQ+ Ù¯Ç³í$ÂD¹3U+m ”s§PVÛÒ?õÄ6ö½¨³Ñ&ÒžŒ=Äl'ÙiwŠ‘Æ=6ןg'¢åfw$V™þBl2óçP—¨r¶!$ußôY3¾’zä»-Ñߪ‹À1ÉF÷õx†: æš;cX±W­ˆÞÃYï"“È!2œtŒ&ÛyÕ̯²ßÁlïj¼•;†5ÄJ7 ³ÝZtWA©þѽ0”ß=Ú¤¦#M'FÛÝä9mÈà¸áÎUŒp7¾ý¹ÊF†žŽA¹¶‘EýáÞ@õxWoà{Äã ^uº)zRïÆoô³ht/!BYGÙà'a®s «Ô%ìQM¨Ô…˜K”êõ¨ÒyXãc£?•\¯²[–nY¨ ¤¾DOE¦;«<íz;÷>Ž*¢šxÍÙ„Ñ^ ¼aÔ-‹ˆÙ×9ÄqoY9w Çej… Η¾«Àù52Ô!kn0>† êe+ÚºÅóÜ>D›7„åÐ}cnê_Ò»Ñun'üë¸ õ‚u?C¶umw×ò]_E¦—ν ÷M ¢žPÖÛ´Ï)}¿Ð›ðvà2‚,"Ý~}é»!êöˆÙÄÓD<‘JtGXߢÑ—à8ÙÛøÿûÖËvÒÝÛˆ°=âÞ¶ê¼!öÓ^)æ Ü™¨°|ZÀrƒ@¿Ô‡{ß N%Òu¶õ+¿Ù²Ÿ@§`Œw{õi,48‡£® [Á,wÒվ诞¶Ÿ¯ºKLÿJÓßÄNw"’Öè* ƒ¯Ã‰dbªÂ`w çUÑç÷¡'¥M —Πn§‚6ĹËá«…ˆãí²ê½›ç«³ðõ>ÌòÆa—[)Œ­ˆ*âZëá[2GìÇ5ʃ¶õºöùUrx‡øDç˜þVïV96öDLÄû€záêçµRÇ0Fê8,q{wèJ•y7Âɇ öò7a¯¿“¼võŒ•zoNxØïýÞrlÚ›ˆj»%Ü'Áà"lÊ<§”7%N+c­•<ÙJLÄJo4޳fýe]L¾L[gPFˆ×½¹»1ËIÄ"1á#úûùµHyPœ1®Ë…+…çt2%ÖU"¹k2žqpÇð'AÛdS^&V è'yN6úÙØItrƒ=¾½Æ¾ËœÀXpÖ“[ / g²ý$y3Y'Ñ'çcù°Ÿ»3ôŸ1Ú­¦_]G¡{„œ6“œvyª…ú!E] nÆvç JÕ]TªMØÂ|²°_-Ëj ŠÔ„T#sÔLrd1Ö¹-lÛÌ8Ïú,¤¾+Ý7°Fý…Œƒ:!ç×Ó{!_­F óZ‘sEöB¬Ñˆs¦¢“†^’Ý“ÖbÉ£’…7;í-~þyÐØ(Æ9ÂS÷æC93#ɵr.AÌJüJt2Rôb^ëržr†™Îœè­.g}Óps‹ä$É?&}6eƒ _Hîœ%ùÂø yUruà'’‡‚œ$9Óø7!sÌKn ]„„³$ œðÑ—ÍI.¢ßû"^N’8—¸w‡F?ˆ›LÌ“s…£‚³d?ºÆX×ïñ%9WY+8Û/›ëä»A|D 6~ïyG1Ëÿ)vû°È:dÒ!»@ïÄa½•<öm”éEÌ7ßaÜ.b¬†¬ˆáz!ÎÊùxŸDæÕE¯rî<ï9lu' ÜͳrüfrV®0W®ö'0§ÅÎ;àCé3ýäEAg®"ÜT¼i|â4»çñ†Û€=î~lÕËÈsOáŠ/y÷ uêËËˈ¯ã¨ç“#¯‡£fL&Ï샔Ç/ÅÖaÞ²û E¾ífkÒ}çBÔ‘ ÃÞ0«'uü!çŸÑ[c©Ãq®Þ›m=aôÉ1û]óR­=^y—¿ˆþr–æÝâÍ{vè0 q÷B—á•ÏÅjúƃ¯7×èsü6l ̺fmyÇa´ßQO"*vo~ÚÿhŽ!Ìo–f"¬?&hkæš°Ó‚|§/òȵ§t zÙܯóbþ"à÷ÿ,áó=CŽxâþºýœ@§X?t­ _­odöæüÝK‹¿û1.ºÆ¥ø„ø€Ä‰ú‚óëwª—ÜIÌA_‹þÉi²_Sö÷Öuo¢e ßt ý-Ì|Í?Ï/æ\»Ü»±;PÍç.S‚üjtvX¹H6?mÓ"¿$'E£¦Å²ÍFUƒÇÁIOí™6vpRŸÞ==í¤´_?TSsÈêa=~äðá#µ5vbMmmíÝ÷jkñèú½>ºÝîG÷£ûߺå²cÿÚ&Àaõ'ø‹—ÿkìþ¿q) 1O%ö¹fÉ·HÇ“uù}Ù”zÑ~òÅ¢i?L›>wƳ3†/X0}ÔÈ´©SÆŽ+KM5£`í€û¯*r ×¢÷5ÿ²;_0QÆY‡ý¤þÇ‹{L¸Ç|ÓÜœõQV Û«ïnôë<©ûæ=xýÍ<_ endstream endobj 129 0 obj 2199 endobj 48 0 obj <> endobj 47 0 obj <>stream xœÍ\ \M[Ûß»ÓÙç˜éÜ­Â='2Kf2&š$¤”T$Í4Ï!BÆe¾¢kŠ¢ÈP %Q*3 ÆBâÞ ÷rqßgëx¿oí}*q¹¯;}ßû‹}ö´Ö^ëyþë™Ö³MijP4M7µôô‹ð óuw㯠¹ö4×AƒûV„Çà#ïbÞMKYoÿ¡'oN%uüF«ƒôx›Œq«â}­)g¾Š5tN¿¤ßÐ* ±F¶5zhôÕ¢1Rc¬Æ8I35ü4"4k¬ÐX¯±Yc‡Æƒ™'4Nk\Ò(Ó¸­Q¥Q£ñTã†R$5µéˆä¢ž¢Á¢¢±¢I"{Ñ,Q (\4O´X´B´N´M´[”*:,Ê‹.‹ÊEU¢§¢W"¬©¡ÙD³µ¦¶æ·šúš½5hkšjZi:hºkújiFhÎ×\©¯¹[s_w{Û©=zõ2âëí¦×oèСz³¢õêžè™z†úzèu%'ž~Aþža†zvžžza>žz^¾~žzc'ÙL7ÑB¯»ÅD{= ÏÏ7?=›ðY~¾îz־ž=ô¼CôüÔzî¾a¾¡†z&¡znz¡Ažî¾¤g”»gÿÀ@/È3Äß74”œëù†êy‡¸„yzè…êù¸û…{ðŸ'÷½Âô‚BÉsò„Teêâ¦G¾hcj®nc˜[ÿÝP_òX/Ћ¼éèÎ÷¦áY˜›o@¨^˜gTÿYžz¾¡A~nÑ令ª _¡ ᡾Þ¾n âéíâáç*ÔËSåCÿôõÚ-(È/Z((¼Õð}ß°PO?/ɾþ³ÂCõìÜH1k=[Oïp?·n~àÒŸã›YxH ßNÏàp7¿Ðp7¾‘Þ!žnaž!ÂMSO¿0· ·0 _/¯€À0á¾_à\ÏoÂX2BüLf…J½…£µ»[H`€“›{x˜§} w`€çœqanî¤ÓaÖîä#ês§†»îÚ íÜ==|ýüÜÜ„*Çù»¹“:MÔ?¡uÏl…7Ç©?aO˜ámר3¡&ê§c…Wm…[…s³†»×=ûPt¢ðÞáh¦þæXuÑF/Mitî®~Uý­ñ˜ &ù„D„ûû¹…‡Ù7¾0%u»…Yœ¤þ’µšpê‹9êòêò޾êÇž ð*òÊzªú oz7ªÁ¯qmêÆ6ºã«¾ã¦.í¦¾ WÿÌ*Žs> ¾Û¨Žpž ‡ßnÜç¡T¸ú3a»!Â1°ñ[aЇ4:T—£(*ÞÚ$:ÀÝq˜¹Ó&Ž òtšdìecâ=Ù<ÔÇÖ"Ì×Î2|ö”qsì­"ýÜÆGùÏš:zPOçÁ½ô\†tœnÔ»ÓŒ¡†ú®Ãútž9¼o—y#úu?²·˜Qº/0Øc÷Ó󹇒ž]8y8ùù¥¼ô=¿\>udï¯Wó3S¸’3Y©ÊÒ£ûÞ•ßg§ÕœÍ9P{îÄAŠêMu¢œ¨I”)5”2¤ô)gʆ2£†Q}¨ÎÔdÊœNõ¥ºP¶”ÕêJÙQ–Tª5…G  ºSö”5êA9Pã©ATOj*eM ¦zQŽÔj 5„2 ¦Q©±”Õ‘jK5£FPÚTsЦFR:T JƒEéR-)eLµ£ZQšÔhª=ÕšS&Tª ÅP.Ô·”%¡¦SrJFI©”‚ú†jB¹RzK5¥fRk¨ÅT$åG¹Qk©%TåOÍ¢ÖQqT4@¹Së©¥Ô\*ò 6P˨yTåIm¤–Só©`Ê‹úŽZAÅP!”7µ‰ZI- B)*žZE-¤Â(_ Q±T85›ZM-¢"¨9Tu”J¦vQ¨Têµ:A¦¶P¨ÛÔª˜:N öRIÔ]ª„:CeS©ÝT UA]£ ©*ƒÚNUR¥Tµ•:Dí¡îQeÔY*—J§öSw¨rjuš:B%P‰Ô-ê2u’:Fm¦Rש T•Ií¤ª©ÔE*ŸÊ¢¶Q)Ô}ê&u•:E£ ¨óTõ˜FÔ÷ôj¢Â×Òëèõôz#ý½‰Ž§7Ó[èú{z+½ÞNï wÒ‰ô.z7QõÉôz/B§Òûèýt}€>H¢ ƒ>BgÒYôQú}œÎ¦sèt.}’ΣOѧé|º€>CÒEt1}–>GŸ§/ÐéKôeú }•.¡Ké2ºœ¾F_§oÐ7é[ômº‚®¤ïÐwé{t]Mß§ÐéÄâ ì– m£îÒÝh7z³Fgbe¬Õx(j-N,ƒk:i.Ô¼#Öû‰SÄÏ3™¹#+ñ–\“jI£¥OšÈ›˜4)nòkÓ¾M½šÆ5ÝÚôTÓŸ›6›Ólg³£ÍÍ›û6ßÙüF‹þ-âZœj¹¶åÓVº­†´JmuµUY«ZkµîÛÚ¥utkhÓ¢Íð6Nm.¶¹£e¬5YËOk™¬‹lœ,Rvå›oR¿¹ðÍS6–ÝÄf´•µÜvuÛÃÚݵ]µÓuZêëDèìÖm¯k¨;[w¹î“v~íV¶Ëoߦ}~‡–Ì:øu8Ñ¡ìÛß>’o”ï‘?WЊΊ%ŠT=VÏX/Jo­^aÇ%éÔ²S—N#;×7ÓŸª¦¿_¿¨ó Îó:Ÿí\Ý¥C—¬.g»üÐU»«E׈®]/uóë–Þݦ{@÷3=Œ{<ïٮ稞‹{níÉõŠ105øÎ Çà}ïÔÞØÐÞ°¦Ï€>3úìïó¨¯Yß]ý´úùôKèÿMÿ±ý÷ Ð2 p l ÏÀ7ƒü¥ î0xùà—C&9gÔÄ(dè7C}†®š=ÌuØÅáÔðo‡û ß4bĈƒ#><1ÊǸ‰±…ñyãÊÑ}F»š 19hòvÌš1ÆN»ÁTÏÔËt£é¿ÌôÌLÌÎ›ÓæÌíÌ[X¤Xܵt°œoyÜò§qÑVÍ­®Ž_;>güÿX˜Ðq‚Ë„ò‰á³&µ›´Þ¦¹…M¬Í£É¾“Ó&WÙ¶µÝh[e×În±]õ”S–MyoïdŸæ0Ö!Ý¡bj©s§¾vtw\ãønÚ´i ¦=s’;]pç•Îûߺlž>czÙŒæ3ÖÌ(vÕuÝ;³íÌ ™%n½ÜbÜÎÍúvVȬ;îÝW»?‚´–\ªRJiT+¥?køÞŸ›V…ULKe”Ε\ßDš €@ö¿að&¥¿7gpÂ{ñÏLŠá»JÏg 9<·äVà€*å7¤Œ·‹Å]T¸g îÏ€™*iŽÑ¯¨¤»Ŭ‰^'-Ù¾xûòÝ(íÛ´{ÛÞ[wo;1Ê–:|³9Û>‰Z¨bÔ}X[­-;XN*TíºÇ$²+ÿ**xõ˜»µÿO5§'ydUÔU.ë;MóŸ>FZ#!Í«à *hôHÄÍWìòÓ±#÷yçY¸c¬IÜ‘Oô ´¹s ¾‰W ab†Ìt3EÒ>SnAkÐ>SùCyö¬1ñ J3Ò£ö\SVˆ±ˆÁ68O‚L13° Þ¬j*rîÅàŒ‹Å !$¼©.‰j¸5"Χ-¸q VAÒ³ìó¾öS¶cö½  ¸«@Ì® ÖUÁü*-T wj'ÖjËÞÞi UL:½3óXú‘Ä|TŒjÜ Ó¥2îjÚá37Û¡‚È\ÏCž‡§m3#ýËcjq óÁR’öÅí‰Úù½?rG1~Á‘!QqSÉK–ø! ë R’ƒöÇî•ÊÞîÛ2Ç»òY8'<,<Ô?v’B¢\Ë47‰§~û1Ã૪æâÑܨ¸R—¹„éõÔ†‚G"ØÃ¥³¸[ÿNØ›Öt‚ÐíÉ[ ã¾Á½«G±O‹FᶸÕä‘} m+@ZÅ•µ ¾’J®g%ŒJäëɯqKp2ãS`—Êw«CLãáØì¦¡ãõS)Wræ7%x.çÆ>)ŽÛà“‡è3ñ´„–îýðsp¨VÄiC& )Ü${„c³yNJ8¤"÷2k%-•^ ì’׈”íÈç¨jU®VÜ•gQ õPÕˆßÎz…Uq/ªøa£ìÉ!6ö©ÄQ4ÂÏ~Ò¸±Þú7E¸yFç2Ó¢É׃ž!0G/Ÿï{i/fÉ´E¾óü'MðIzÕ¥HÁ &Õ€:ž+ŒܯH Ùê·Ùž¿$ÂXž,êqpú‘¶ìÅÀÞ‡½L¶}^h)’BûÇ@Ãp0X¡½2E¶s<&HïHd/F10ךýñü0Bœf‡õ0ù.´‚VgïÖô®ËRXAsñ°€Ew—žœŸéûpx~Òª®½ÉGÿкAóêR`v‘!fîâm‰ÐŒäÀìÈýqûWåK×”²_œ»tI«.Y Z‰V®ZIêTÅ]¬¢¹JBCÕ!£²R]åò«TVÎ’;O€¾³ž†ÜVÂ]e4‹=q'lˆ£p_𪹓rêœâNI.ˆ4“ÂB¬€Þx¶|¨&ôÿ7ÇÖØ´ù1Ä}ô‰ø±Ë7äÇPÁsRø>©ºC­èq[8Ä€5ˆA‘5AŽ'(ð!¦ö}{–»£%ÐùvO<[÷ÀÉÞEBså\3‰G¡Í~sBy?,&"dÔÃN ¿qjoq¦§IpWåpö1¢nÞŪ~T´„4"еÛß Ë«E°™Œ¦UÌáÄG6®E«vÊË$QëbWÏEÒQÓ]G+ú›Y”«\ª9—Gµ>V›øîÀã"Ò“‹,D3Å(g{æá쬹¨D ß«ÀåøÌ{ÿZ†k¯ ›ÀAò¸Àyøpçþ µPY[1da<<`¹ŽUªŽÃõ­R­!B?±J5†i I3£—©å®¶ìBYÐÝ#A·væeíÛ»sφ³«¥$²¾kbâVǶ·G³æ8”ÊlžI•C›zYW!âú’òÆ·‹Žû, Õtûa)5(Éìø4E¦kQp!ºŠN¤æ^•Iéâ™á~3£‘'òÛµuÉ÷ËÒ¤ƒ™MÝ+l ªD%{Ë:¹õ*‚VRÎJ‚£&°O Œ±6nco< ïA–U>V|-eð*¶wEÙíCOHt :!ö"aíúùm‡ÏÉßc7ØÎN·»9afäì%®H÷éü\} Ï‚8‹Þ!cì' @O„+Ñ^UáW„®zUªž º(á,&êÈŠkÉ®zmq· i9ºçÐcÐÚ_Qu6&)yê:9Í3Ã3aw„|ÁÖ¥[—eH0ëp‹ÒÉð-ì:÷¯¼ªt=®¿G1|§Å¶€Ý(C÷äñ´Ò’ô€)käõjS¡ÕDkŠÊÉø{ï_Mt&¯1SRÏO”'ÏA^Rµæ¬±.ìb2#l¼“ö«% äòê‡'&ÁÚD Š$Ž©Îpï§Xe…f|çšà¯ â$Æ'9nïÊ« yTúˆCUYO£j)h(ÃúrüX¡ž&Q/áDí_’¹'"a6r•rõè.Ø+ª EøÌ‚*‘rDz¸x(„D2¸m¯ÞX×Ä2%w¦Ü9?àz"‹_ )‚è®mïDù3&ºcÍx8êÆ†Ùº 1sÆb„µ¥8 ¾Å}aÚÏw2î\“'õŸ#ˆN »Áõ,¥¯‘Q·‘€qt6ÂM-®©ô‡tÿ+‰‰kÖ§ÊË%±+¬š‡¤Þ‹â3€JZB¡å«·Zè¾±>Ê ')l¤ÚUÍÈ(ý5‡tºÏ›Hf¯*éݵM$X-·…]ú=ªñÂÚ݇bþ¹vÏC0ÎùÇÐc^ÈVyD¸û…DNµA#ýNŸcA^Cx¼Ú2ÁuŸû)‹ûÞ BеÄÜô¼Ì´+èzbwµ{ Ÿ§3 yN**’Þ¼’÷H¯8¬–«9Fx’ŒØZç\SÞZàNâµJC\ªj¥DÃî)<`x±ƒs"oWúêÑ·´e¯¸ˆ¶Ü.#|J¢gg6pœ[Ö%9'1Ru— ¼b÷‹\v¡å¥ä•IÇðÁ7”ñoé,^.¼L;×qB«çÊM%ñ+ׯJ@Ò§yG®)”-$à¦iÔ©š†ˆRREC ÿR¶gaI•ªl(Ľo_ËrQйOEà@ÀÚ›4“2‚¢áH[˜Îí÷fpwÕH¬Ç$§`­Ú%^ ¾vä æ3™{wÁ gˆ_3D½?'juœXÁ!8D,¨l¥œ·t ‘D\¯™6Iz˜NÂMì]öøÈ½Sçf B)·ÉÜÇÝí&` O¡«œÛ$˜”•ÊN¤ü3&=yÈ—— ÉKgÏ ‰ôë…¤f¹¹ã%¸iåhh²;w@KÎe«ß!ît[0:¤¯2èL ã.L7•9éÀé×Sæ×çWU±€?¡ƒ÷E`@>6ä½ÿý:öõÄkÑKòØÅ+—£eH0oë^\ÔZœÂ¬±u¸‡<4h‘ÿÊ©ÒûÌÆËGöU"é­cÓáä1ÜÜt~ôò9 &†ø¹ ©ÁÕI¿^-H:sN¾Áaoè´%¬IÙH̰`Qà’¹!a¾~³æ9!©•gZAaFêãEÍ–ëR¤Ìãmaqº3x†ê=žÍ½wc`+q^áEähøŽ…fä/ž7˜5\À™Â)8%8ÿ£‹91j­är ™SØÀ£@ Ûb-°00Çã 8QüŒ]˜Úxºø…Úänä8ñÿ´e‡ë}‡*‰¬ävá…Ò‹‡=-åø=ƒ¿¼î1Ž¿ä¾•<µÏïaæaã$÷+rK¶@RY_34=x†µô¦ä#µò‰ÎòõV‰$kbAÀ "ŸåOˆ™1F z‹åcƒl<°O]ñ.¶Vm…MøØ {gª&r~[˜@¨§ÏàvªÇx÷˜P&§ß’S}&BþÂÀî9ŒP=·|‡p§ hYnu\†NZètyÂm$âeon%>.¤Ømÿ¢¿ÚáVXwÑ/Q[p|÷© Ù}ÇMG‚/µ¿‰.ì;}¾ðrÚ=T)Wl#q n†µœ†÷è? ·¤jÌÀæ°áæÝ­)×å%CÃlÛ“j}ðbÚ?ÌÀ›œ ÂzÄ>ob„ŃƒÂ“7­Ûñ]’â 㘙l:ê¶Â~å´ !!^RÙY^¡^í§¸æ_ÍŠ_î«íxT }ßñ‰ˆ RNcUŒƒª­øs4ïÐöB$}vÞªS› ½F¹dÞP `¶LŽÜœeÝï.¡½þË7Ðô ŸãÓÜøÏR¤‚“N’A£Ëm&ÁÒ@¯õX³ã‘( üÍûŸò¾T{ÑðtºÙc öGëè¹4ÉÐKÃ>וG® Âe-)‚'þÛ&^ï¬<òšQ7ôB%ØVò²àiê2‚®¹ 5.ÉÌ<ݬ]Í#"Ì"Ül‡ñ1ë#¶ý*yKýÅKP€N¿Z,3›4ÕS±LŠž¿BÑqï-¤ƒØ6ý'Y :¡ô‡šóÂÜ[”“Êip/qiÈbwp7ÃîØÝ È¡È%/HÉ¿ÈDå´D:—´x ‹Þ/2j›àgBÔí󄯫EI؇…‰ïLðı¯ßé\GÁ7!”¸5O¬žÀ*r Ž q°›°7²“Óy{V4°’Œö6FbѸdïë3ä²×Ã<ÜmF¶Ãmêz ÷Ó`︟š)—½ÀRØÌÞ:éj>ÎÉÕÄÄ)»¤4/û¦BöŸÒ¬9og4d’]¿A“Š««Ï‘!!ް‹ ®°xñXXL ¨¶¤V”Oˆ„E’ÜŽt)Ú‰A$)iûé–œ/Lãßì­j-.c @K\@Nq®µXÝAÛJ¸Hõ8ò\TƒÙíXzÛ(bÇ^;rôRNYâ#,qk¢o»]ò(žÆ;ƒí{và ¬óľ)ÉK.<¡X…MìzuEÐÌ̘R)|ÃÍf«.Zô8q Áçž=9åžBÍ6ôFv„uúoxG&‚])Œ)¥¹håvミ “ŽbcÆ›¿haã‡Çˆ1cñŠñÄÞâÛ ÞbhÝø¢Ii'& ƈ-5dú[°Âûm˜äo훞¢¹[X‹XÓ¸‚2eê¦ÌV7…Û¥)´¨›Í'54a‘r_Mâ=žƒvU"X®ÜÌÚKð7óÌÍfu²S®ïÞ¨”ØáR¼G2cƒgbXÚü¤åÛ—^‘Ž`â°â¶t\,í|îµä̺ŒÍϦ*ãétjòÁà­ Ö÷I•ÂIÉŠ\ÇÕc¤w̘›¸Å&鉊fGìòÊDÐÕcÇoÆKÏáÇì/þüÑ8ä1ß'(84,dñÌedH„pÁoÍÕŸ fß8KVoM=´^zD2iÙl4BÚUÒÐïÕ¤ßsˆ,à{Ü —}a *¼²’GFƤC“¼œ¦O3î’»XгŠ841 ÿÑå²Üë”M*q¡Fj>ËíE”àôé½{ºüàûìÑ#-"£Êazù®r˜Q®…ÊÀµ ºóGmY~,8+MXÃQ£z÷®õ´¶¢âÇ£o÷R˜iç̰2}Æ»é' ‹Nä*8ç¬JATÍU†Su” ÒæË*dÞ±|Ù++~|NÊÊÕeí…²9E…|Ù–ðû\Qæ_¡++D°ðy:cîîl¤ÀÃ%È0j¶ÍB©¹äܾ¨”Ü2Êr.“Ÿ¸2ŸqŠÙšOLd ªγÛ{!y×Qô£”\ç¿5O¾•€ùÞâD:œX.»‹ïHTr0âä0ˆ?åïކ~5"ØÂ­aUkj”Ó&Kü09w˜+µæ]h¢¶ïªÜ'N‡ÉmY·±«½:Gú`]¢óæÜ¡ãèºôG‹+Ææ\vz^)'Ò¬õXÏi}ÛáæU# U^nBRº|WÂŽ­G2.ŽÔšÁ-¡WFñ®«è¼®¬}ÁN,_¼–æ:”*ÃÛiFHÀH'R èâ\ÖÎffØT$ks¶¼(-뇳„^ üˆ@çE/ ­þmrþ Ç=•ÿRNAÿ+«Š2㢘.šê_¾Ÿ¸c4§MtÎÚG¬ª ³éìŒG§_žÑùùÌéÄk8ZèvÄíÈÔ–¨²œã1)Ä3ÖuåXi ³öä†}[’’ŽŸØ[€¤wÏÛÛÍv¶öVô™Š»™i¹÷ÕåüÈ0 VŠ´_&MÒ?)Y=9&ÈgAïùõO »ÒW’\¾[!ÚG${.Sžu²Z„É?É\:Ñnªpprl¤’ãAü)Gm{ݬЂÿybþ„W?ÁPÉnf2V‹_œrÜŠCŸ^.'_/%VÁ:Ûx¯ísÒ-Ê}^¥Ûõé#h÷ÄçÔà} Ùƒ«{žºÖZ»Ûc}ã‘¸× y ³úøºäÍ»3³“‰Q™;}ô´hyŠÐE~Ë'¬""à¡À§{"ˆ%T醵­±Âýî [½$¶úN0Á@ò`d t’ò¬ÜUz¸„朹>ìj‡ùá^(Í[¹7)Ó™µ!Y!OÇe½¥Ìš¤5ñëâãwoOØâQÒ’ø¥?Yëì·Ñ$½|ôT…b/7ˆú-ª¤aÈ“ÇDnTƒ3›+AÙ›·—^ºUº']•B£[¸-îÛR`ÌËp“ï¤ÝúIpûRá!„ŽÕúÐ~¡´Ç±n¸U±šK‡0 GxÎ'u[Ã%8_G|¸´Eε‡Û¤-ßͬšP+«`q•?¥ÀéBæþ wY¸W…ïÁbx\¥21fdkϻ٤m?™89YXúè#ÜáÖ©}ÎYäOº9纇Š÷¸"•y™pæUø©D¶Öð%ë>l’Ç¢5R|N{Ÿ™½B¿l½’~æðé‚”tóÈ&p{Mz–´Ò•Õïü†Á¯…_BXÿ%ò€óã/Ñm…R}ùÖì†Vy5Ø<݃õ_XëÒºxñ®ëBa?%n¯€àBH­ÔJ­Mx -[ÀipÍY Téy4È‘xDÅX,ç¸hNÌ„`¿éÈB*[ÑûêÄ_*/¨¼%߸p]Üú%R™åÔÃWý*ÚCSt¿t0RYŽÊi%‹¢¢‚üÃf‡x.pGÒ žò ÓSž$('l_—ºEz7»~åÁ9+žxöѪh0¹%‚¡mÝúl‰Û²aãš-Hwßö˜°à°(¿à¹’¦+¯‹p¿”—‰toç¦Hž¶$­\ H*"™~ƇîüqñÜÎÁ¸s{ùÃþ -òú+ýØ¡–CJ,ªï•–Þ{0®dˆb’æé,wG§Y³œ¦Í:z*ïèÑ<…¬ô<*ç­ÃUjëp•x´ÊõwŠNsª/ ªó_õ/ˆkÆ%n™êÒXîRVêsºâ4 5"n î^ Lf°¾…'À-r nĸ—#Œ…G“#[caÔi<ªF©ÃŒ|0‰¦™Ð QíâÔ‡JDú‚2Ší…{ŠÏ3ÐzŠ/´mtÑ’ì_Ɉ?yÂëÄæp‘ ‹æ™Y¶qE–Rܤz4hCç[wÁP>˜AÓ—. òrp (žz¢ôÄîÌ‚\Ź„v$íJݘ„Ò¥…’~ÏØ'oúñÝ㌪h°']‹çV±ØÜÏÞ~(Ø«žÖpOÁûTrIåàx—漉ŽÀbfKùÖªÙ¹Hw+Ú²|OÌþ;:þ a‚‘;š=Çß? Ò#Ö.\_·113RÕoþ(oG¤‰bÖÏÝ,w}ªã–:?í“æI?-—=>wÄ}‚b®d±OÁ'Y‡Ì‰( eíLÉ?ƒ0­#+ÌóMöšÕ¹{¹„ÔsC;„™sn/÷;'u²ÕŒœ©‰æÄ„éÎO¢ÜjsÐI1Îä@à…²¬YE%Hº×¼ÓÛ1Eþ§ÍÙ-~<‘«kÙŽ4tóÙv @–ÉÆŒË@¹Rav=;+jö^ÞªQzÂ{q5ìsîñ̈^Þ‹­™çðõ\±FCwõèÎÇ ÚÐZ‹À›3fqkÜZ :{@xVлï€ï ¶¬ý™iñÐ!]t`Qú¼=……:¶gm‚wøÄ{!]o4gqÀÜ)…:vg¦D.ôDÞºÈ{‹Gb³“N‘íéÓ{ç^|éf¢Cñ)‰:¸7\dÏçºØØ9¹ØÚ8çŸ=™{–˜6Ì[£G"e‘🙖þ á… íaÈÔc–¥{¹ez¢¢{ êJD‡åÃ.Ыæò¡²cЬqe^4CÕ‚¼V Y ,n3y”¥ð ¡cE­ãËéwóy‘õ.†ˆ¬/ûnSOe©2Z+—™;Ïïõ_bz òä²÷eÜ/W]q;ùXÈZkõè„Û›ì7ÏŸ©8pxaá ©Êò²²ºê}59“‘f‡žŠN~ˆLe}ˆCAd÷°’ŸÍYòÈŽ¨¼ „[¿°gÑšU{—/8äD4T› ƒäÌ’‘Ìöñ«¶—èÛG?B·Ú™E=*d¯n¦>A\"á7qÓ‰¶‘>³äÞsæÍBÖRÕájî°¤ìdö²¼ã­l§—/fx}_:Uéœ'7½VÄùÀlÏæ"ªTº°ÞVá·ÃIªÞkHp>Ñί™0[ »«X¼˜9¼¿ŒieIÀU-Y,|¯tc—„Ä.ŒF QÐÆÐÍRÙèínqk"Ú»"?¯Øqҳ̆¤-ßoE›Ñ÷Ë“Ke±g¶,ßÙ>í?_F Ë×0–›ÍšÛÙ™›Ù•••\›Rd&Ø3BàæJ­:~)tëÚ~>¤Ã1¼q•ëRg^A÷bÞº¼Á«ŸýްŸI€®ìò•+V­@ÒùK¾Ûª É¥YiÆÎð2])?Çl<¾-!I'Ï T, ðØ%ž+ÜVÌZ27Îk^dr“Ê l²¼.gü~ßA¹ÌÚoö…ÛoAW'¬'ú&ëãæçä±}ÿÄ­ùåyß%¬ù~ƒàŠ6+§¡P9™Å)f"Èë7ôêZÑ•7¼K²fòü oÞ÷¸Ðà{p?A$ ¸…¸ZÒ±ú×jòƒ 0±¬ÝúîvCJØ]>%ŒëÉÂmCUÉp;ñ(ÉÝb1>ÈùU©Z’€1±Âoóz€{Zv"‘Þª bW{lˆú>2Å+'²Õ¢üKm˜ån³Cí‘-òß½,›ïªs£rßüQ/ê‡Ï÷¤¥2<üâËðìbÍE•‚VgV*âŽrãØÐ_òø!ßt„ÖÃøDRîAÅÎÔøÔ-祦̂a^3íÐä½#"5lß‚ltZú6¯ävAjиír}8ËbolLþ¼±1+Æ€ø‘ž„Ùà…ÜWLÐ$¶iGÜ%RExæx$î]a ˜BGè &0ª^ó3µÄâ­õ/%bÈÚ‚ŽòÆÇ^’R™ø²šÀÃ-ˆ¾ät‰ëtQ[öÚsAìa´ m]yxiR qê}ýí&¦\\!ŸÀô+œúüé…‚{§Ã:o“ËÞelOÜ—Ùî¦Ã‰A†NνWÊ/1(uMÂÆ„-»S"iî¾`7—ИA n+X}d^oRýÊv»ø²¤ÀöL—à™x§ØF6,f`a”øãx–ªËy®‹d’*£î¬~⹆t¿Úˆt¿T˜}¾öû³ÏgfŸexðoýF^{Þ‚‰‰õ©gœ’Íwݼè°|ÌÚ(b¹/ô 3wõ1B¸ ññy‘½þ–?F”:VÊ=‹½ŽŒ-|rTÇ=£ç Ëã 6ú%躺MX²7Rw°{º‡zuü(a­´>$¬ñS±7H‡ $ºWÍwçÿF–Pª çò ¥îqV¼ò’º89ù%WÝN‘3òÇŸÂÝ %n˜•ÿ™ˆ{uVh-3âqc{íOå‡ÎKÙ|÷àl9Í™—‹²¸f¬gŽËᘤ!‹µd)•T¦‡ÝÁï#“¦!¹ô1¯‚L“%˜}6Á´sC‚©¬5ÌûOô–ôwõVëõVz²ˆË­…²]ådƒ1iÄÙÿ à ·äëÜÿ¿˜U/ƒWc@Ôo_càà5æßŸBÞ!‚¼*!*Ž\‚v—ž :£[9̼íJE°‡øxÐŽÉÙé¬XåŽ7nŠÐ½³‡‰NX¾eÕÙU×â¶{%ÝŸ„NHL?j dzT“ËX­ 퀕ìŽt™1U1‡·þÕÁå7JG¬†ÓD|hõo3@Ç MÜÁrr€£·¾3’@4Þð;ÉŸÄï€q‰Z‚äÔ–Uü¹´]™^ ¤}4¤Wðq èÌõ’T†ÞÁö0Z¡êÊÐF*¤YÏlH³ÖiH³¾Ï|.G»Sú +Ó)‘I‹/ñ3ÕùM $$rC’+™u9h÷Òºȱ€=Ó–,E+cþ:<7x~ì ©ñùª1>{¼ýKÿO¡Ô.ÎixÍÉŠar1ø£Š”cØ!FF¥æUJKT[”)l5ó¹Mups³Ÿ6óxþéãÇó r”Wº‚Åñe©þì>§ƒÿ$í!HúXN×{z|í²wš²¬56æ¬>Òi.wÁû3ì«Í-ž jÃï<²·Ãß)>1ôS-øH¾?²Ö?AÖ_RK÷bË!«>Ù„øÙdœõaJRÍ}«¿Î}8ð9èÿó |¤Ô h°Óaz-oØýQ03ì"Lø„³^Ä ˆ/¥Ut™:5~dñpXÖ Ù(=ÝZãÛæ–¤h[0.!Úb)˜0 »'ž€'÷Äú lÒ)Uõ#ü€¥ƒ?ù¸ð2ÎBI +.‰à6…½ïºÿB}@VžÚB­ÉþcØ’¯‚Н3! æ’>ø´üÌþqh|­C[à Z ^û“@4€ ¿U„jhÝø0ÿnxuÀø~ŸÈ‚,ɯyÉ+.xð’_!2™_!Íî?„– 3ø.V(ˆ Ú\Ð8¬^òè´óðáŽÎ?].ñw®Äñ‡ƒëWÁ8ìÁý$,f‰¿%âZãнüi7ØÕ/òÿhiÔxõÒ¨Ng/zÆüfÅU'âá#Ü©7ÿÁê¸ÿþØÛ±~æ:›c0FmHš!Lš]ÚwäÓI3~F!(ÌøHEÝ îh»ˆ8dËy‡ìûgY­°ª‹V¼Ÿ_ ¡’=Ñû–¤£RT”šY¸Æ6%¸í ×Þ¼NEo^”¿xCƒí>ƒ3¹.±ÛöTçÈùÕçÈ “TÄ饮Yý‚óO'JϱÎâJ¨æÓ™þ œF=¬àÂ?bö?†ª}UŸ8„_³º ¾Uþô‘³ùæç‹"ÈU°8ï"7r¦dîø˜Ø±qóWéLoWñˆ†¥¿¬*þ¬ÒÃF3­o÷5æí¼O¦[þ[™;ˆðö#’ÿċ>ïM}‹ÇÔN!hJÿ|‘[öE^sw€ý(Ô¹ó?†:ÿ*:D¿™eSÃcq-ÃcÀç'‘ê@bõ_<ˆ‹øïÔX¹&X/êD®+'bdz¯!þ/;_.FùóçºG †£™ ¬èÒQVø ÊÀè½âo1¯ïÁ´rš;ÊçN®6ãV7¬ñ"húsè´ü,êê0zOpc« nlPeoÍ”Ž¿1ˆx”Ö›ý7ã/¡E çòÿð'Á?ü;mHÜœßĈPçæñC¨ø?»2£Ñïº~ZÏÿ÷’Eü ¤~&ýàk–Œã9ÐåsEW4!„5¶<ØÿÁU¶2=;ðýl3„­øQ'+ø½ýÈë?W¿lÄùÜÕs0õ6]Q#ºWÙ)L¸¸šÙb‘h»ß)sü-ûè<*Üv:MZ+æìã„"Û’БÂl&ùœ¯bVmEß¡¾›Öl“B“Dîf0© ›ñ!*@GçÞ°?pWg\®m¢9„¬f»XøN ·[4^jÍë³2 -B ùÔQåàB KÁ­JJDpD9˜…Þ…ªfSÀP¥UÊpîm¡<ã§%ܸ¾¬ÿuàßâÞªq%ð”ø©˜(•Ð\Z«Š±äbU ×ô‹™üJço•æ'hN¥\ʪæ2³ßšYëá'ÕTü“ªË¡uEº\(“†RWìZºåçM'vWIC™KW._µ"Âqilä¼È¹áË&¦?cà8<Æ»á_bøžy†R#öô‘îf>m7IóKçJgõDx|[¥ƒO‘Ý9Å,x«ÒĪᤪóÀë£p2—u'Ýý¢ìÏ~·îÜÞMkÓ‘n.ÊŒJž}Èe×h4ù¯ ]lcQ°Å9!y¾¾Ó]-‘•ÓÕƒÿuëâÑŠãòŒÒ} ^KÁ‹  î=ÃeQ´»òUƒÙ–Ìžï¿wìHø¬=ÄeÉQ/€~ b'é¸ ÄSŽ70Å¿ˆÁ±÷cν–jŒuÅ8Á ‚Û.bldFÚC„Ê”D’”óÙ ž¢’ù/¾ÈÀN*Æ!ø ‹ÁàÿÄW33¹ w]XüÍû}ØžÓÃÝÇì˜ýô,U-ƒw¦ƒÞ%e0p‰{A!»Úc}ÔÖßÏh´ÉÀÙ²‚”W¡-ûáÿg«™f!ékòø´ .ûe$¿P[[–ññn;²Ñ/•íÙn…’5S¢ü<‘Ôó;É™#§Ë¯%_'@î'#ì–ßÖ³ÁïÆ"ìÆ=ÙFÙxûw>~T‘s|íÚ­‰³·ŸBÅu¡Ì/†8{ü«/ŒIßµ6>[>uNDš…<ù„¿$!áo‡:á¯>Ú]õ†h*ƒ§¼‘0µ~]·ìÕêwÝêW¨á/ÏóÃK GÐ'䈽;5&‡äâª#¹è–ô=„úù ß!‹¬/ö"Ì>¨ÜI>˜Q·í€–°í€¶lþ?·ñ€,V%µûBþ ”pWnÄ'.´™éÉ7kO-L¾ÅÏpÕ„²×Öfm<ºíÞÁ‚;èáïUXÃüù¬À­o@‹àì8Õhݪ +ùÀÍÒ-ë¿[³ùs›‹A{> ܨgúê¬Íz‘ð_cmöÅÛ9ÿ¯Ê‹R›WåZ6â1ÂÈqø0rî¾ÓañF3ØØ8êO^þcB:@r}æXÝLm—º½I¾¹uø‘V„²ç×íß²åBJFºˆ+høNµ$ý`†ÿAój ¦Š'ƒf¬Ÿ©ÀÝ/„å>ÏÝÿ›I¹¬O¼r<3GÉz½awŠãŒí¬H?RÂ!ÛçÊŽ¤uëwÈs$ÑK¬ˆAR¿È]ié‰GÒ6L<×Ï]k3³!»–OïøÃÓHÃðAûÊdŒ>‚Œ#cXK-Ú²¨ÿá"‹Åþªë_”}_çk{wò·2é¡[×J=«î}CÔ€ýtÆÔÏÎLAO?švðJšâ?íb÷²½ÄYþf–çŸy'ÿa¿zï3ÿÛtœúÔÆ7‚Kü»‰ßÀlåÍú5AR´eeu§>™^®Ã§f±2ꈪ%•(ý„¬²Ø>*—/aþ뉻H™öyçøË{è¬þl‘\á5Jíïò¤5ä+ÏÕ«…ÿì+ ë³(øEhU?Íõ»Óœ±øÕ¤/š‰êª$UZ„j¼…ù)Ýd±½¿XxE£´†¿™&°üKâ ~ˆðýÏÊDgÆÔßv½x«7¸­Oúd…Íч/ïW¦JÔÊ Ž–Bÿ¿vçY,ȾD˜¿´±ÞÏ‹ôl&!D˜&ú®¿šêS&d†}±ò¿9Ï£aô²zßåÅ?è»´VÍ|7ükœñ:æ=.¯ìWü½}Bª¥ öjݺ„øO·ªûtÎGÍZAî ¢Uüq«Këƒq#K¹a(UóCék6“ÅÞÆÿþ’|ùÇÓPúñϵVÂþUO„(¿³¥¶ìÞ_Þf•p)v}>x!l¢•ø/Þ©Axh5¯†z4̼ªâ×± 3@¥O¨=û¿Ÿ(:ƒ¸þõÑÛNU Š„•§«EÜbeGö¶‘1îé=±BâzƉßü ·ç‰1 ›<Á t()Ø[tRas“{q©@‚s°#û¸x$n…›M9 ïÄ»¼p½p÷EÃÊõ·nÛø‰Ùô¡Ã?–ÿ#XÅé7,Ê!løUàú}>öÔÐ(Ùè~K‹ÏÆ>ÄÙ ^ÖGÙ^ü?EÙZ_ƒ¶ìË)’•…;öe¬^³ZçˆdÂjO4ZÚYØ—pàKeü'ôîÿEå^€gf÷õ‹aÉu‘@üÕwãòæ™ýpØâ›ÆëC¤­k6ìWGÆ-‹›ŒÂ¤…>÷w'®Ý"Wëß$´óÀ‘íûÏ)NœØs<¾P:„Q/=ŸJxµ Ï+8UÊâ\fÃ~ k½¾¤Aú¥“?4ù­ºîw¿Ñ^”Ù»Ñní¦f{_Úž¼nývÁ]¸b’úG&TÈÊФìý)Òú-+ëÂ$rÿU3Ç»¹‰ļºä[©…–ë¦ÂV!¹ƒ_hç„poyX};7¨Û){}»nɾwDŒÕÜŒ´ÔoAÝš}¡¥EÉEòu®»‚ÄIeµÓ‚¢C=Û!Ϥ€¬IqiKÑ6´Ýž ÒöòÞcfêÁ“;²·¸ÛÞQØExi6ßõv›®/%ý˜ËEðÌç˜ÏÌÃV䥔åÉÇì–ÈÂÆùúûÎlg[à]-—Åñ+ׯY½~õ†Õ¤E²)K"®œ×~Vpâ…Ìe¦?±·a¯îºE3¿?5Ž,>øbÿ7sh£áߟ4@h|M}X÷÷šßëÁÎzI^·–GHŨ_Ê“Òh)ϹÏ.åéÞx)ÏOñú>ƒ§G=1¢þQbÄâÞ*«/› <€ ëIÕyÙÐ_˜Ð?KýþŒ~Aì‡)ýan÷µz| è´?OQ‹’ÏNo fÔ'ûú;4ªÙë³5ë|¨9¶Juï÷ õ—¶¾hÐ7ì‹-+„­±‹¿¼5v÷·Æ¶|FHrý7‹Ð„æò–ÑŸhíºF €/¿}©uMØ•ñlr,Ó› /¾`¹5ô˜X¨»þ`ŸIj?€¿m±ˆ¯°XäKìJã0O(AŒ(±X_•ð%UÌ«jî¿Cú:(–_½CzÙ3ɰßC/Oµ^þK„oaI=6Â’¸]‰0!Ñ:‰©lú YåúæÍljÞ‚¢þoÿÌ– endstream endobj 130 0 obj 15181 endobj 37 0 obj <> endobj 36 0 obj <>stream xœÌ¼xSǶ/¾eYòNN :Â$’BïÐBï½  ¸ÉÛ²-Y¶šÕûXV±\%[r‘{7c0Ð!ô’Ò““rR.9³ísÞd''Üónî—÷ç~ßÃÒÞ³÷ž™=ë·Öú­™5¢`ÁTŒB¡ Û‘œÆN]—“š(˜AŒ¦¯¯RÉEdÕφŸgÐ^Å6–?7Œà¼€y^ŰúF¼‚_}ùzÄ‹¯ÐN¼„í BY)­”SAXPpа ‘A¯š´ hYÐÚ ÍA;‚öE%eåƒ ‚Jƒ*ƒê‚Zƒºƒú‚Î]ºô^ÐGA_ý5èiÐÏÔ`êóÔ‘ÔW¨¯S'R§Sߦ®¡n¢î FS¨BªŠj æQ ¨¥Tµ™ÚIí¡ž¤^¢Þ Þ¥¾Oý˜úWêÏÁ”à‚Á£‚_ ž<-øÍàÅÁ+ƒ·Gï N Î –«ƒÁÖà²àÚàÎà£"ÂwMœ9+9/œ¶L&ÌàÅ%£‡xâ8^Fà”° ž -Y(DÇaɰDA ?‹–•–ÌKÅšGå éü¬° A:ºž†® ª¶¦ ³„q‚䌬0ÔâÖ•«‡ú˜•“hW˜Œ.‡¥' ;ãÓãD·ù絬˜d¾0,‹'Î ´Ë ‹Of¤ÆHP»¨ª Aò`DÂd~âo­O ðcñ©<á`½Qùíýžy똌ŒTÉà³éƒwý³ýä,!/5aÚæä´X‘0,<=-†¶9}~ØÆ°p^¢(5F6„Íÿý†ßÄöÿO«D‚ô@Çy™¢˜T¡(--&ÐëD/&‹',\ÉK͊Ɉd!ñÄ''$ðÓ³ËSÓ¥<~"’t|r\Lê²Xª4qðsc\Œ ¿'&N”Å‹HOLçóRÖŧgÅÄ¡QÈÚ—Ž:ÞóÏÒ5Ï”n|p{/>955&f°Êui1q¨ÎeC_Â_®…Þ¹n¨‰$ÄíÏÔ³j°ˆ®®¼5|°hóàñª6÷˵ßÝÂnc±ãX'V=Æî`—°“XæÆj±'Ø]ìÖ‡½ƒÂ.``ŸRVJÉC>=Ÿb£Ø)Š“R@qQ )E”bJ ¥”RFqS<”rJÅKñQ*)U”jJ ÅO©¥ÔQê) ”FJ¥™Ò‚8A¥ÒAé¤tQQº)‡)G(=”£”^Ê1ÊqJåå$åå4å å,åå<åÊÊEÊ%ÊeÊÊUÊ5ÊuÊ Ê»”›”[”Û”;”»”{”û””‡”G”÷(ïS> <¦<¡|Hùˆ²Q$î=ØqÊÊÇA ƒ®"Ê@§¿CK }AßAï ‰ 9¿„‹ðžËxŽx^ù§Q’¾°ñ… ÓÿÓðòÇ¿xò¥É/ù_^ñòÍñ#ž0Þdˆ_ü9åÏO™;Fâ#cG’¡C?c°÷°ŒŠ=v´æ•}¯¸^ ~uâ«S^]õjæ«e¯~ÈÉiäœäbÜ×¹ÅÜŽ°°°™aa–ת½Vûzðë³}L昛o4½qòÆ.›>öÑØŸÇiÆOŸ3¾küOÞžpc——LÔOzmÒÀäi“Oé˜=µvê“iÓ¦Oœ¾h6cÅÌ”™ªYSgÙf]ž½höWojßü·Æ¾µvή¹³çÞûÃ<Ƽ)óªç'ÍÏ_¶`æ‚o¿ñöû Ç-\²°hѤEK%-úÛâ˜Å…‹?]2yÉý¥5Ë"—‰–Ï]~t…jEËÊa+-+«WE­ž¶úïk*×bkåë¯{ýŽõßl°møËÆè¥›â6=Ú|`ó?¶dm}uëú­}Û–n#íÛ_Û.ÛÁÞQ1;⋪Ä.åî—w×EŽ‹¼¹'fOýÞ){?ŠÝÇÞ—¹ìþú<Œ¶ÅpbnÆnˆýG\cü^Þ+¼©¼÷Ò7%~’Tœ¼.¹þàúƒRä©£SW¤šS;SßM‹Hs¤H{Ÿ‘.Nÿ{Flæ¨Ì¬Ìá—…—³ºD¹¢»ÙrþœÓ#ž(þRÒ"’~&KÓäy¹‹r*’_)·«(*™úE5ÐP4ïh ºP]»>Mÿ¿ —ŒË¦-¦ŸÍbË*Ë10|–wÏ¿;ÿ¡í ­À¾Àþ™Ãï<àü·k¬ëv¡ºhCÑÅu%Y%+-+{³¬Ý½Ü}×é9ó‡§@ñ/…ßÿ“ôËè—ôeZÀ¹Æ,€|q`3K²M§ß®Æe„#ä<\“ãHZ‘‘r@ÄN’ÆêßøAßi¯¶Wpá‹Ä–²þŠ 6öp/Œm#F¢Š/º™áv}âÎTâ2+“N0-$ÙjUœ–-ƒ[Ü!»íZ;¨ù.OË9HcÁ º— ÍÓäi€– x¹š z\-!lXÆ„“`ɲ„6œØJÌG•O뢖o0KòyEà(%—zÖW“Ï)éerIjlN¦J™-Rj@tùªy±Ê®¸H* *ÅõW`(ªtĸ7à‹u·Áq¼AP“–%“‹ä*¯‚S¡rj@.ˆKX4‡|-â,ù'Ûá|9Àt‹ÅŒ@cIÔïT, S®N˜4½ðé‰ÐÏò~(ãC">ÇÌÎä'Hd¹€­Õ8(=Ë=ciŒwí>[e騶Œšø ·o¾Á¹ù&k„*Ûø¦Œ- 9a)у ·è-†Éä¬{ô^8ËUy䯅/Nôµ¼Ì¥’(õµ©Üä|ãCÅnS®z¯TÖÜã÷}ñ.’ªàú(à#¨¾M…?þÄܱ5^´àáɇo}ØúéÙw¸õ ]å¯*Ó* fƒQÃÕ)Ì: Á…e¹Õµ>¯ÿèþÖ-ä$2ŒGΘrzÇ—wÏ4Þ¿À”0Ñï¥ô à&^F?®/Ö, Ð+seäXòmÖV8^å7z@ Ô¸]gœ¸›ôÈBÎÊÔû~"ݬ„˜ƒñ É%ç¥ vªˆºCöJ]5ež’2.œ —^'ç;%6³_mXg@÷øÝ!« 4Á…±°ˆÁ'Ï7T.eï¿ûKþèÏÛtòÓõBM#×Éè}¦jêšÖ(×KÌF“Ê(·˜,F‹ñµœ•:Fž³+°=‰¶œbP m~»>O¬b]8LóЉaÄy’9pP¶3G¾^ÇìćÆÇZâj ŸU~ÁnÇ…Æ¥ø¬a€xb»¾e|¯ [ép&Ä>€Ï·+[E•Üœªœâ]•·<õÅMu8ã˺겖®Q_­†›î‡2ÄD¤2#6©4R€«µ®¢Ò&8¼qk¿ð½wF쬪D=2+Ò3f§ d…EŸ»û9¥í–¸ãNŽ$ç[ÉI+»¢¯Þ8ÒôÝ ®j·Y²pFI†GRÓ}òГÆnr¼Él0—‰A"NNC.ž,¬í|Üñk79uõíu‹pj™Ÿ÷¿Ì<«Í7yv< +Y›É$i„H¶ÎˆðÔí‘ååæéóâ­¹…Èúœ Õó]Vgž­þ{L‡UM]ΆR¶›Ü& )¶Yl–zS‰Ù¸Œ}ëÇä9z­\¢R@N…‰Á©?¾wäég\iéÌÙÛÒæ6IÝp2៎Áaßç;~¹îøœˆ($±€ÌUÄL¯ÉÆ@ëg¿g‰ Ì*:V—Wâð‹hÉדHVÆxá_µO¡Œ¶ 7‰) ‰’º|¥ž‡Þ»ÜE¹±*€x8 .„³è]¹~oÊ‚mÜúïò]Xò,V¶9Ƙ—g€Ãx`¶ÓD4èFÈ4Wd‚m`ÿ­èM1[÷¦îxzNYeK ­¿Ë­½qþxŸ àâÏUMñ5*üR˜+¶¦ÊÃÚN—YË š¸u68É÷Ó}ð»;ÍI¾AÎ$ç““œÞþðÖƒC×ßá|8ÙòéÝ'î+•e¥ŠSÓ¸ I<É[ÙøØF!~DÒÒ÷‘ã* ¾#Åž »¾úTÉ=ôvKèÂïh¹„5ä4\(ÎOÙ &‹ÙÉ9‘ÚùHoщâ;ÚðþI3ñf xJ,{J%øýÓ˜sÁ̸·—›¶•Èçp2ìó ãá~˜³‹8NøÚÄ¿‘£®9È|Ô·m*‰E‘ãÖOåîX¸)~Àçî»±¿ôÁ‰>æž}ÿbǤ®ý ƒ„C€T*‰ôbtd ƒ'üÒ!ð9ð·Æg¿¹uˆãpIJ®æt¸a+2qeÎ.äúûMÂ㉵ÁB@b1dðš5[·,Hð}â"‰½Òs‹`CòÊáÚSİJä;¡žJŒ&·3¥ô]˜Wòóly68¸ËZN—GÉŽæ¸cYä[äFrÊÊÎý—om‡ŒO¹³È£Š8™v½)¯>dU?Îlög$Ï[C¾¾&œ›)ÊP ž,jè½{R¯^ã666—×£W‡dœxÔŨùëÄšw©­Dó3úìy¢°ƒ;b[©uºòóòóí\›#ϸOâÉΖI²’[3Ž|zó¯pã!Îmx‡)tGÄèõpfû­³/qt&‹Ùdà5fÐ!÷-«¬ª(¯lO¨Û³'^•ÈI‹ÏÙ—6ŸNbgí°¥BX~¤ÂqHçt¥‰h_¶b?ùüÀ"–d‹N?¨ùfwÈF—!´€bkaaÛ)ÁªÑû͇Ààºçpc_{ýðþõÒSä+2Wnc:|ÅÎ:Ð :ÔÞ\¿¤( DõYûd¦Jãµ›ÕÒæeØ]e3ñ¤9€jÿðzõ¿ÐÏ  Ò'$ƒH†kuƒôÓr ΑDmÈÌŒÎa'Hר—|»°°º¨¨·ænÉWsaG«¹ÑR :óêôEj»ÁªAIÍ ƒÈk`Ý€r‰7G£Ÿad+AŠ%Ér 沕E64~pf«b‹Â"·H¹>3rUld³Çz)pØÈ“p±çðÑûÍgë=ÀìF»º@Z`ð¼ÞSÞØ(ö¥geÈ32¹±1q[eq¹‰¬S0Íd]®Ð˜—+ÙÒj{>p¼²D-É@¶†»€ì ¸B2¶~âƒ;;K+G€3Íáä …2þA¤™›é&`°jå yHA©3OÝU™v.“»5N’„@Q ¬È°ïÃW_Ûÿ=ñä/ï=2¥†s (Ó Êð²*‰Õ ,ùœs©ÅpÆŸÿåý‡n“WïåöÑ?“ÈÏ™yÀj±Zò-…&·á§ƒí騺ˆmq‹ßŽê¸Ríð¸+8%žîæôðOp1šÙ^!ŒJR'sE±©¢d€óDu½_œ{ï*©5¹áF¿ª™’7h<`“ŒùÀÞQx¶Nxü=œà,Žžü-É~{f슷9ã¦n%‡!‹æ7¬9ãÏ®TQÏx[£]Q(guø: ;Ôë(/JO«ÛÁpÓ¢«º¼¤Ôß&/bmß+^Кm[R¾«$Ê¥GlÎ Àt¨ëßÉ|ïø¶)¯E‘ã7L´D˾ êâÓ¯ŽÃ‰3Dƒ ö›fJ?;=ƒŒ~U_¬G‘Ï3¬ëW°»C¶åKŠ@(È/sT^‚BV»¹ÒR‰ î´¸ŒeZ§Ñt™Y©OõX÷¡Bbß?Ód!šÙco©ã`Ã…mŠMz€®E,¥ÏÌB@CäÅGL©B®ìË;G{Ékƒã˜9älš›^àvØ A(7z 8#UWé1¹G?¹pú~Gö‘¨ó\^¯¬ÔâÍ>_ëɆ„E…7ñŠri¹tm®Ö˜ t@mÛÑ“¹U6zùÞèµ)¾èînçnOàãûÓRìH=ô•ŒókØB•òR  Z"Ö(U2dÙu.W¡û²ç$·þ«Š» ïʨ_¿r9v¾@ì0Ø·)âu[tl¹?$ ¿¼RGµEL¹†o±˜rõ"rô€ /]pZIK×Å“n\jEÁK‰Ra4)Œ2î2N±G— ”ìL¬öDkíÇ¿ß! ¥C®èŠ›y ?Ç#>9 šY<Í¥mMÍõ(léÁ¿\v‚…쎌ޭ·[ u‡¨€Ò Ôe q+ò$$D“;dsΚAa~‰«õ,ä±®à‹äœ@'‹‰/Ù*q6üñ!Þ² v“/ËTy6aÚ’v¢¿Ù© Ø +¨ý»û'1å6©PªÎl5P拜‘îè‚X¤©‰ä2ŠÌXS¿ªw/÷Äî;ƒOÀ튇Ã-,÷YwñU"eWb¶f“[ $@¤O-­0i•J‘ˆ§Ü*b.¿‹ÓCÆ£'ÜžÞKµ×ÀUp&£aŸ;Ó™m?Pnb!w¢:n¢ÀãÄRæÛôºó¬öÃvšò z“E«çÄïÞ™¢huz4$`Î3áwé+È:³Æb2iØš4mÐâ"Ÿ¬öhsÝ——9 çž2™ °5ú‚â€(ó¹ŸÀhOè¶z ¦Fx)à )LÑiÕ*©T®Ö¶ÎÂü2gäç;­¸5$Ïú ¼g²Žç˜âM(˜=…¬ Ò­I¦ÏÙK®bɶéSAžàÎi8ÚÞðä'›8ÆÌÈÉJK©È®÷WUÕÕgù3>[ÒJ 4#ý€ôOàˇ2æID³ ñÊ,zn¶Æ HâùY8ãK”bO=fÙê‰eü ¸.MI®G\..•;µ½{J2A4¾tû¶åó6Þúª ¯ ÏÉɱ&“BÄaUE…^¤jeF¿æ¨´V߈\BÈÇCÚլΙŸsg~®)ÇñËÝ7ÚB§RPl]7Èf¼ðnXŽèuA€^ý¼®8½ ΠìC1ÙA? wý25â&ý²ßcwÈ–•Ôg^Õy šX°ƒ¾žTÉvý|npäâÔ<‡µ²Ës¾Àq®pŸÚÝK0-~? eì&b&ïZ/ÏEš¬3:ŠTÜæ>‚'iËèáätlßrœÑ3eËžÝ)£•šÂ2°"¡ÿ—É®HÔ…ëØ¹!ÈI¸ ³]ƒ,Šiurù:K²R— $xb¹¸õÖ©Ó0†pøa²Õ gìN+—4ôVy¿¹Áä°çÕY ÕN^qxñkù m³YÖx«Ö…ï©i{×^ämm8õ)œÁª'o[3¬&'`€ÂÂÚæ¼<›Ýf‡¯À¹÷ápoU¦  v­[ÎqËÈèä2”œ›Ÿ²[‹ÌùzƒÉ¬5p3:gº©zªºÉf̸¤2(G#O€|®Ê(44Ú¬4âT(†/25*ô§L‰Ë%WœEÎüb»—›—ŸgϳÂÉÄýÿ¯Nf²èM.ùê@ ƒ؉žœ¦“­õ__ Ð Õñ½^b:2HOàî;¡Œ"1år½A§MKU º½Ãéí†KzáRn~ažÕêÒå³6ëL&Õ^m;ß=M#7³VuÄ^¹y¸¾ô 7g‘I„ÈÔð‹•u]5Ÿßå0JÈ·ámf‹¹R’ÀÜHòùÕË„ÉR>À“²êžîøñð%n×ùÞ¦®@\%Þþ?!£½2 ÿÍ2z¡\ Ä@,Ž>NÆ’k±Å‚lÐRZx9€7½,ä¬Îjò‘/8àaUЉçÒSë.®Ê Ì{ü2ÿ˜¨P £[Šƒ¯6|¯pGĬMä”×Pp°³¬¯ÖûÎï:‚-ÃÖ[ÉCQ—spޱÐêrx>Ö%$žad|uli³ù\NZŽDØz ÎW;NU¾àb¹<'Ó+kh,v]ìãÖ6ùj»Ï7/°Jv—Èš@ðWŸÿ,`'ý“øÕ8çµr_j¥Vm2¦'fKå-G¡ÝævTso@¬[QÙm‚ÚdqŽN.äìI‰Ý»š ª¹_vTà­Y5É›W!¦:sòLÖíÊlã<9[Vâ/ÑÉUY3I7k¾I­ØŒ×ì²ö–“g?¼p¶ÔNL“BÛH*¸æ:ÃÛwâÖñ}GP _äR« f¥AÂÝFJ5 F1P³ÓJeþÞ#ÍwOqìÎÁ©Î*â¥ã‚ò!õ‡2ß1;L@4&¥^dÖ™uƒYÇ"_0ÓŒ!YÒÎÂÉp\gÞÜÓ·vÕ®X2h%ç$ wÖöÀ%;+R“¨_«Åa<éc®=¸sÝî°­›¸ ¼èìh€§Ê‹ª.4|Ó}—{äAODZÀËÝ!pÿÌ `q“Œ~ÚP¤CžH¦(2É-Á¬8bœ¥*-9mG@Ô _e.Ô9÷¸V³È¥ä÷ˆIúN`eƒN$­ôU²f£ËäÒ«lââé—Jþ¡€ØC³Óûöмtx–x¯öD¡«£˜=üç)’Nø\sJ7ÌóÂÍ#ÀcøÂ-âù®PÆ\â ÁÊ-L1 V’–²{Wêb°ߨ¹·¯»ÇßÓÆa<‰v´ñ{GÿõCÄ·ÿ ç’¯CÒþä›È DÛà›ä}ëDÉ‘¿p•õ‹’ö(×#±„‡Á%p |ކsá È$‡“ã¶Ö%ÄsÅbR€l¹¢¬Öžç²:¹W¡¶šÎ¿6Yk.Ë2'èIZøøíO5&)ä“ sié'‡ÚŠ›OrlfÙþÈõ›ÂÙ+6Gf.”âðXÿ«ÌKí{æ-LKãs33c¥<€oL8ñÉÝú÷áV×4–´¦‰óûà;fš 3•_#¨kòW74fúÓ±0kÄi8æ4…àA/s ,ÇОҋNÓ&Ó߃I´Íô·É$9ò™“×éªÚ×ôrÌÐáW¨4™v‰þ&ÓàÈgNžÒgÀHfà>ô| ÞÀ,åË}”À'³oÀ€%Ò;)¤ŽŠCþô3u¨ŸõM5¨ŸÔOÆ»…a¦ )iÕ†@q“ &•ûO‚× GJt‡N R¢þa^Êáš{TBOÌ”ªOT‘û+™.ݸdb…쨌ô(° $§5$ú2¼Ò“ «É>Ö¢ŠÌvÕS™‰•A¾Ø–v2ë’’-šAk¥û>½“ßâìô²ßih½n‚G‚6ò¹ÏÏB5뢰2ɺ¬ÌÌ"·,bnê×ÐSÓÚ]Vátåu<Šü„é0ÜØîáƒ6˜·sßkÚ‰7½0uþt`Y$jßvç¸šÔæúJo­G_$öpä¥DÙAmUíÉÖAÈ>†T |R©mHëáj¢ï¿5¤uý!uð^xD…éŸÇ$g’SH1©$YWfs¸»¬±›ûÝÝp€oàpÖÖ¯&qtéÌÓ ûÞ&GÅ‘óÃÇryëb“÷<"¥ïßN½'¿à¶]él<2È^],nq7Á$Ôædxþ«÷afM(Cyª Â| ¡ûO$þÖ‘ÈûGºÊ››¸§Ï5=÷ñëq‡ÖrŠR˜M‰6¦,Þ»›+òsߎͩî=Vÿ¸å·¶«®¢ ÀϘqôÈ=ÄkA 8”E7+·8Ý• p2ˆÄÈÈ—Ÿ ¿~â˜ÿX·³¯þ>8 JÌn£NÀ’ïÕ–™kÁQPíì®Âu§ÈÿN§õÒ¿'ú™N‘E8I[@Òæ'fUwþí1ä^¶ÙÌz'Ç­pkuHÑß÷4÷BK‰Éý+˜$ ìON}m/¹š%^.nvæ–ä".Tî-Á*ÑRõ¾¬Q`GsΦü"¯H^ÚA™£Ö}g,õUþ |¨•UÄ{®züõ•{àB–ï‘¿þ’;àNÔ^ ñ©šy;d`ÜN ÿ4th'¥´u!ý-ëgz)ÇG¦2}Ova¥ËV^PõX‹Çn["Ôv¶Íœof`±pÊgJÌ@kV™ÙòsÖª¼2%Èa½YmœK™­^ˆÞ³¿Br|ÏI⛦à/pÚû0øÝípS(#–¨…?2Å!&Du—ñ7.I9žú‘ð‡KõµÕ8CÞÚTÑÚ2êÔCÛ¦®›CÓäÉò39yú®*bñEmˆIµq×;Nvœ*òœ¸çtôÙqOC:0ÂÀl#­sZ¢£â£¥‘_¾ãÜÛ—o}×Á}ð˜il°xø¤²»‡Ãˆo*‘ÆíW¤¥ò¹R¹Ù| iSÝéרO%ÌkýK‘WîŸ _¸G]£#™yëˆ<:9*xè 0Ö÷‰ê;ø·¨ÄËFf+"ÜÂít¸ý=Ÿkêר_¯¼;#‰§–¥qv§g$óWøt¬ö«‡ë/üÖé]«²Mb½‚+ŒØ¿qÝ*2ÌbI! éƒ,Ú3áMb-óÉÑ£çþ7õ.Íuæ´2‡œ:êEÊ a&RâU™$….UŽP—1YºD2 d¸ÅÒuR_4o?¹•½0“¿IfR±`08ÚÒøÓ1¸šUq§²úŠ'¾TQ êAuÑɪ–¾»EÇ*GÓɾù¿Àð‰šIØ¡”v á}­!æ‘ÛÐÿ€½Õußu€WÞËø8”ñ.2=W˜­G[}Ý?Õ–“x€ÏáGËgÉqYÈ)Pbñ«qƇ³›w,µ‰¹Â¬¸}éq(dÎ*L«äûdN1ÀÓe¹Þ¡ì[çúŠksí{>·ùG×6âù!¨•a½­Í7FÝÙrúíÕ›â6ä 1ì 1ëÙä fâ÷ÊËàk_¨‡o…Ô¦GM½Wo(ÊXäHòùÝëbÆdnTmKÀâ⥕«K£ËRÛÖ¡A퀛¯YvÀ³ÌÌx©2dƒl»Ô5ë˜Ä±ì©Ùû6œNaù;=ÅÀ|æÓ½åúdM}G¯8¸ò)q´rxºó œt7”ñ¦ÂåLg}éÙ†Ž[çØþ¥·\Än=1kþ¶ýÒÊ$ÕUž2¯Óì0sô%f0ã µå‡OÔ§FìŬ_É™7E)’N@ã%ŸÇäg ùüª¬†ÚššÚza5ÿ/>ë2…ˆ„zäÂá0b -–>ðÖÀŠœµ4XFßC®¦=¢…+ißÑÉ9W™d’ÏÁ[4ý—ƒÑïRëɵLøÄN\锺kÅ—Á]pN{%÷‚ô†¼mÿ{b«eAÙ0ŒdrNd}ZÌæ ^NÿD3³Ì‚ÌäØÄÙ¼yé›Ô© O.•úÛ¼ÍK9ðyϧmp.^#¦<£öZaSY.ª=Ø©)Ô»ô™™õ€M&£Ú¿½m-×—žš™¡Ò°wîáE9nÌ7Ú~ßÙ+UaÁç7çìÛ’¼#ÀG¡ŒhbqŽ™F!_Ø¥h„ìi[¶M@"Œ¨8Ð,(S–êkõ{ÉWXô^Ȧ1|»ØGß§›.Ü“²¶oå‰v£îéó´ùðUb4«ÊR¬J0˜Ö÷LV_×ë¯TVJJ9âR™=)'ŒafT)ºâ»Ýzªõd]åÉ2|øÏ+µMÂÀ½yˆ…2&ü¼;0—N£+€Äš•3Jl©ûlÙ£É8r É#å$û›ñpdE]žµ…ËH² @ÇhøWúU¸@æx› ÚÊ'Çv¸ÄU[È|±:‘ÓËyì“0ü’é‘©L“Å6K-&“Èkf]ƒR‰-v¦Ú@Žl%ý ÌqV» |€ý5ýhP¸’ì²¼\»éŒ’tò3{‰"UÈÏ$äÆ|Êž ðyøÆuøÖ÷¹]-=í]8|pŸ€œåÜÀ<þ·?|K…3ÿ+ÄÀ¨‘ÿŠLÄöÿkq“s\ÿ÷€!ãªáŠH6)½Pˆ ×u‚vïÐÍPÆE„1õrѸxrg9Qy@š*I‘(„—l¿&–8ólÀþkb‰(±9³ç³w¿…›º‡K¦Ó‹ì&Ñ(ËYÉ&§Š,œ_‘SßÕV÷à,Gæ2è z³‰~03[ p½Ánw6×;á®Óo/suXm,›;ωZ`„òÀhQ[ØŒéÆŒ sÆhr½áiY—·±¦£Ás྽Úd1\½Î¬j\à‘V×x<5‡¢ë·lß!ŒOâÄDåĦŽÅߤëRnK_)ºÝT#ºasýPÊ8N„ÁÛLg7|‘Þ ³«NŸÕ HaOµ'95Õ¯)-­íá5îˆˆÌØÃãF®ÏÞ‘CÒç¤kbhFÑqE ìñéq<fgkeéñN.cÇž+¹ÇG_}­5—T.–Z—ž#Òñ;D­¬=ô©Ãí‡A8£†|‰´0•Éü¬4€ Ån_mey“ÏeÌn@»LLª†ÙÈÁÝïPa9òúã&MŸÙqðo¿ûËÇãZù:Óg)”4°+s}"O¡Ò³äåu^ùæ´1€TÂÞC[( ²Z¨ÐÙ¿‹±Äö#Ξéé9}f_Ïnrp{CZb?—ȯoomhhåÿyX`Zl›‡þSaðT¾‘¨,€»è¸¸4A¡Wõ îBÙÄŸê´<“J4'™ UlxBLwcõûï Äìß%–æ6‚Šƒ›Wø-1í8ŒA*o7ÛLf$|Çh1Zäz €mJk®g´Úr„ùÒÑ(ÆÄÇDGeǦMÀgÐõ)´O銭ª£ø ¹1•dg¬4iõ*J!ÉÕ!ú!×@n¹AÐ+ñˆr~ù­ïá¶nλð2ÍÙÄ´{Û฾k·»Ò§R™‘Å1r Z“èѪË×ÛtV½Åd1±É7Õ{Ñ)øßnúÀÞ¿/§@ìsºª7ªV3ú߃{®Ö6>„4æÖíq™¦}ÂÖk•Ö"G÷oÇÊ;jºë|Í ?œZ›,ÙÅ©¼´Ò,Ž–µÉŠ’hEÎâ2vïh?~åh|éCŽQfVƒ\ddWÙ}ùòý#7Îrbò(¼Ã¬µ”ç ļµƒ±bQ– U–H½®´v:á8×<2â’{˜ Ÿ–·´vx½UÅU¯*V·ï_.à* bCú`LK¦µ~ØBœ»Tßd¦K[j/°vm…$3S,OΖڊҸR~·¬ÊPØïöµõJ©Ôê,f5÷È5>üg¹¸öÖk¡ÔßëK«ÏÞ†Ûªî>BKNûw"fðæ±r'ز Ó+•ÀÇMG/>¹åú'˜¤ #R+42]»FúœÓõYlAAc\Ï,kéÕ8 hp1=p6™×Á¬¦.—³éŸù¿…û¯ù¿é{Ö’42T£6êåRåa³SÞ—þõ`pM‘ýÊ`°,äšÖnôD\&ÓYd]Gƒséùꬷiä¼Á³ùôŒéÒÝ|ñF#Û(£Á7]š'G±_¬UQü ÒQ]óÿ5ä.ý#ÀmQ„÷%¡a¶Òá’ŸŠv(f{eîµÖ¨×q È7çJÀ6ÅTÇžŽwá¤+OCßÃvÄnuüÜíi¼•ál’>-'lÆßýéãó=WäåB¡Lž£µìJŽCaÕ-ž–!‰ÞÍo8}ª²ûê-Î㯊*ËÿŠ3.–ÀpfºPÁ¯Ö×WU5ÔgU šCb‰îEva 9›y &xnu|ëï`++^Ð ­Ζ#Àgì’Vh ÌE¯s»ýµ²’T¹Æ¬Îâ&ÈÕæhK᱂ŠúÞŠ:{)(ÇëåîŒ4iN‚ñ7)Ç&ÎS"2—e–h÷Gç©­ e"—:?K¦ÈÈtËêŠ ¬./·Óí¶Še"U# ª·Ê¬CîTLÍ~Ý$ׯiö r†õUDGÔ×SÀMøÍ *±“˜Á$GÐËákÎfwcIUyI%À‹]z­ÑE×H#ÕãÙ’Ê*·¶+©>*.!'!¿G¼KLã$…®K£Á`z<ùµr¬z¿4“­–ËÔÈw)5N—Íj·9¹—Õ È —‹â~|SFïG׿ƒoUrºáYNZz¶= B1yúžY[>^¡“j³ç çsW$*÷ÝnÓ$kRLj6’d)ÈÆ<⦓-Uf…K£Òª4JöÁÉТµ£Ø™_bG`´!~™‡Àø.,ÿ¶¯øh h']¦€‹T¸a3C$@Qž,ð545T¶r…ôH^N 8€ï:}òX·ÿD믨„Í„ŠÙH'q8QáV9_È‘ËÅJ‡ºD=…¥^¸ÝÕJ,aŠçæD'$–î´j‘¨1U—ŒgÒÅ@nK+æÚOi+ºTùˆþñ%2¡Ð+©+)µVsJÊlƒ¶Žœãƒzôú Ê7\žk¿Ø}¾é<ïJ(ã' Z‰×™R§Ø† ²mïöµQÕ;{wrï¿Ù],iì1 [8 R•ìñ:l¶"'×[â,•x­ÄÍOÊÎNÚ|!êþ'7ÞyØ¥öí¼Á±æœæRÀ¾yìĽCòC™M\òE8IêÕøŸ}¢µé‡ñãÒ®Ô`Ôk´\¹B¯B>5³B\Ûäõµœ8´ä­Í»–ð$õmæ0žªx f3htî>¼½4 $ã¼´ƒIÛÂàÈ[í õmƒ >±—˜êÍñÜÇʘB,%N0“é;H:•§3ãhr,9‰œEN/ID¡C™¬DÛ¨Þ@†²ZéáÃcvØkô%p¡öÜÉ›W| îƒZm“¢RÒ .-ÆIéÀ$¦¸BS jÁW=0øÚÍÚúVO3°"ïh·àõJfE¶K’Àò”ñû×'ìä  0 »pêFbqÿDf"|ýõ™Oi ô¯ÉE´£ô_±¼öwMìp˜_†—e‰õþšú_Ù ºÏ\¡œ»{oPE?2û"¿þ¶;½Sq°{AgIgÝ·YÇú&]w¸¨ô²A¯²=ãÐ×ß²ö›8™W_¼°£@‚*:}ò׬ȽßNäÇ)y`/D'ÔÇàpl`>ººfþœõkÌ_wãÃÇׯ=æ"–¥ìŽõ“k²ªF€ÇD&¢YÍÄgO™‹¶ðå<€Hm=î³·ØÝ\[q­ÚzØv·¾«îH£¿ q­î4ÿîˆɦ5FTŸ4¦açh’‰3‡|cîÅMON´yúNpžýÕ­Y=£/ƒ Mwïâäø€ÙV•—¬Ü–½’+Ùš›œ†3¢â32$GÇf¶žý¶â—ßåVVÕûΘ1òÓÿ¤¢­³»ªÆ_ê 5r!/3::…›)Vçg¢0zXÀùÿ<9ÿ¼pþ?¿DÿEN°Éiœ‰ÔI‡¯þÇchmˆxû_ðQÚP‰À~!},Ø,Ú‘µlñî”úì:qîŒYy@—¥Ú¿†t 0*õ2Ó>£!›'ÐaT¿‘vžNFýÝÈoµûÔyê<`'Ùr çøÉTyùpñ«ô˜Ó~ߎ“|Ÿ™ž¯°)‹³½ÊÐ .ÕÝï8T×XWr8€­ƒƒ+nSÿ»·_âÓÅ•ý£‘Ȯò›ð•cß eüfäàC=½àûáöSóÈ—“éÚÆYAÞN#GgØØ*]¾=ªÚ¸ö‚ü"àÄ}Ò²,¡\–™Ð(è}ïÝà«mH%wÀ7Žß=Ø]•é»Ãv,_ 0šÔj‡Ñká2¾9cö'­Öˆ¤Gæ$ Ä™×hN«Õnµq…Öà«åî¬L‰8y¥cGùÚZ9'N5?7ÁQáѤjI±Ìžj È4Ã}íð‡fJÿu¸ˆ¹„¤Dd“žFO’¹¼Å%ÇÎÃXnýŸ&6לkr=Æw; bf¨ äl û"¸š ì½€ çÕ)WéÔ¢àzÌÍp*m TN/ ìæµæ"-¥Ù˜–0@à±önQª…m‰[Ü!;*²ÿU/Þ±Ù ‹‹JqNßC.V&è ›õla¹çѾøúàWSȯg§=dïŒ`¨ˆ1ýÁLÕA…*…¹R{Z)ÎXêáe:E£wt~Îb¼ž^Øä.«P­;-Â*µ¿ÂP<úhn/½Ž„þ#\NÄ0—nݲlÉ…-÷î^¼xûÁÖ ‹ŸV;þ‡–Ä`”ç-œÕ“Z¤^˜ìâfúUXÁ“ýo1Íf]š¡:'.Í6-º!ãØñºŠǹ¹I&5á²bu…¿¬èÌqŽ®Pþ™MlµZ¥¶½‰ÅØm±X€e´ÙœŸŒh^>7¿Ìæó\k†8›Q2VÊ,2È‘»NíÈŒ$¦ç¦Lr½Þ»O õ„n0¯?A!¦ï1ÉÓtÕn<ÐàSl5Ÿ0‚©Ìb‰/£%Þ¥vh¼Ÿï¸ ¡¼0ólâunNW]ƒ¿®ÈÅ>u¼£”á6“ͨŠ·­ãdfiuá3XpŽæ¿¯Ãd×z4åCõü~5¿íønƒ›˜C›¹{¹ç|af¿°¨§öK®«¥Àï¹ _Ì*=NŽ™s®ø½ôåídkÂVÅÞ¿¾AîJpeÿ²U|„ªw(»ŸÃlÜ“¸lñí†K8Ÿ R½™Uüy8z«›{¼~—ÏÕØÏví­–&iÿH&ʼnÃØïÏ“tÃ`/üÎû}7œùêv†Jø¡Ž™¾5Ið™»/Ã`H=~ñ³‹­ü­…\÷»tàÒ(lÆ<–ÁšR˜aOEa>sÖ|òy’þþr8¢Ýo+ëã–Úò­Ö¢²,r>±˜In%'“SÉp2N&'Ãp¸NF›`$9•ìàæÅ0áL8‚|…\DÎ&G¢ï©ätrd ;΃#á«p:÷×}U#À·!çÒ·¡ŒwÿßÚ]Ř@vÂ[pÖµ_£ö~Õ ‡5Âo›FÀ]—ù×COû£àxæú#XLC§š,VÄÐàBzÊë´Ëô†ÿ@n/J˜[ÈÍ4’I‡› ÿoÓ6ëˆ0ëkË]Èw×UŠÒöG¥Ž—p5!µÀ Š8ƒèV×$íµ31n¯Ja/s¤E ‡àR…B.ðçöBìÁÕ/ü:o®›«qYòÒKVãéƒÚj_ç¨Ã±Íûã²x9œ]­„uëèpTðà÷ÊÑ_üíßî~ÊÿCiúÿæ4ýðßÒô/&Âð‡'Â÷qÃhïàVîÇTø€¸ÂìÚU¹³pµÙÂ’6ñ=Mk¯’ãÈ·Èɭݳ¯À¥pÏ—‚ë›ïp¿ïI©›לP¾¿$í–ú¥­Ùä‹Í|ÚO“Ùò=nÿnâ¯[¾ÛOßmøäس[¾K+ž‹ÆPr'”ÑùoÎ,&³ØùÇ3‹/¬[þ(¶çÂnè`’»ÉÈc{án‰ô<òØ122pwïEGè•ïÝûoÙx?è_ùûAìÿôOv\ 6ÿnãh$î\£ë¯Q ÄÆ4Vñ×Ó‡~æðŽ ¦u…2|ÿOýÖG`ÿÁïÏH n¨{à`¿üÈÅÿö·@Îý{ äâ¿þ#,“ðü |é¿åaÿ™þSé®V#F€–ä'´¼‡4¯JõoV½åªgtO£ú?P¾W±:xè­Žü¿²#…t^ÿ]µøwèüÖþÕ¿‹Ñÿi•$¶þ^Ûƒ„ª­¾]iF—]A×á´3T˜Iè˜Ç €hœÔ†€höp9|³,d¯•Æ¿í ©N,”yÒZ·xÄ€_vÑsÊ„µ©ÝáY'}ÿ_uWÖÔ•ö¥›;.Õá6@tLh§ÇZmµjÕÑ™vh«-nmUÀ ØZDE@¶†-NÀQ– T(ˆŽ‚hÔ–¢J]êÒiÅ¶ÎØEkýô{o<8ßwïM€ †1ÁÌŸ<pÏ9ï¾ýÞ²jÔ@_Qó¦¿N€S” ž8XâýNغ╌Ðüh-7‹Å }Àö½æ.ø$&§$¯ðrѹP%^¾ìßàáµ$ÐÃO¬ÈØZYÐö9(„r•/×Ô/ŒáwÍ(dÉáŠd#áIëâ|üðìexŽ?ž>)Á/Î]Á‡ô¯‚úâ ‹8Ü 1 <áÈõFÀíÇÓ›HÎH¯Ðtå©.Z q…ro:kÞŒ,äjJG9Ø¡-WÏÿ¬#Ì– rˆ èXÅg¥[Ýza];ñ)‡A´‘;-Á š]ãÓ&½;¹oµ*zKîzsÕ*ûw]»ÙÜ›¤ý†î†©t’­ý, ¦>û,=º ÖW9 :XUçiº‚Y^^³fŸzûÒ7§Nþãk¯S³Ý|¢Ñgá‰ï¢w%MÍÍ MŸˆõVß™mÐ'Æì«ìËìûÃX4@_Ù&bè{Þ¬f×ÃÎpŸe‘gØÏZ{†r |lÞ©³‘K™ î4ˆ[Û xŽmz±[ª;`)Ct‹âç\z®Ã6I‚¿Ðgp÷È~ݽQ½Ý=ÝtÔ AúÁ˜«.´²µSIÀ¨6 ÈLm…©=2]l.±›)¦”Ë ±ø-¨3ëÃèÜ]›Ì0+ÕñXÙœrë䃧¥¡gª€Ãû!§ˆ©. ®±P1‹’¸,^¿ØKÝÓÒÔ°ä0æ`2?»à‰Ä)ˆÈÚ™Ÿ½ £Ãý2mË*Ë?!>3x0ÑØFqŠßÕf’áæAk-|%ÐB©Žq€ˆÓŽP÷ÒøäÕˆÄC… xâ»+Û Pµð¸Ï¡ùk×lŽEIââÖæ%¹í®ýhG "T¬ ’Ì[ ÆBì‹)ïån,<.<4HÌiëI ¼þêdKbkó±žö1%Ú1BµfE^¥ÇÑÒ¢åŽÝaÙ#Q³[²Ž"wp«²|‰Št.–…àŒxçuÛáyúNéÙŽÿ$=ÛÞ'=k>Cò°™‘½¬&{n¯Ã|K]½”1"6•9FA+{ H™Ûô3qNÆ×@uð™P! Nïg.3O½·à3·Òä’´ýè úâAh¸w ÍEuyžz7qÎw¼„ʼnË)Gµ¨ŽÅ‰‹Ê]–õƉ“£`9(°„ugÌ»±/qíÁƒïktN5Μ~9ïJ¹@Eœ€º™V˜Ÿž?æ6úúï×îÄlwÓcW’ý`W¦¹=sDû à°N<à —Å7ÔÀÜ}w†{®ÔÇt ýš` á[—¯`V¸2¤l¿Z¹=#[Üó¦¯tM Iؽ\¼()’Á¹±%ÊO|§Féù¢ôB”‡rQ¾2WY\´´2L‹´¨±\{2-.=%ÔÂUE‘µu»¶Ø/ÊT‡FÅ%Ç aLâÖ­(#k'›ÖeçE‡·ÂpvÒ‡q2èï DÀ¸’ž|Páá}»‘éiN}{OºÀ§XWï+VMؤÿr/¤…ýôx²Ÿ†PŽ3Ùkå¼§—QÚS9€¬ç¨cçú Âl.<¯žë'Ãh§؃q‘Ìæ]µû*e[Ç@]¶­ö*”¹eæ(³P™‘–©¥H‘žž•*m’Ç(‚ädT?SÉHkJ¢ÔtyêæÉ¸ÖM/—°ÐÕÜü§¡öÇ1‘¢ËË¢Úß^+×þ¼Œj£°ý”ù·$á{Žc¾–bDz·ü«~ÂC›‹ž’MçûìUìòá}³ïÅ•úTÜŸg\Ü×@S™ÍP)³Ñ2S‘‘&ß g„uƒ<:-,•Œªàg+ÕJuâ°n¤]Ìf ²*Ñ8ì°U›¾Š>nŠãºETb"zä&ŽlÏV.gE” Ám#¤L +†ÂÙ«@»Ñ¿3õ¸Œ,'háØQgè´+¥Ò4žªîÔFPë8㚇ÊäU¤àŒkB4k\ÃãÌ×J~–RÁÈëf! yìòJ…ÐÉØË|‚¦aÁÚ5›7mEÅ&ÄöIЬ“Ì A£›!,²@—»j¤$v¥†ÑM¦’ÛzMÐvƒ1Ús¸tÚ/w,t¥nÍè”Ù`¾§[Gte½X%Qfe%1ÇHIÈ¢$ÀV>R¾\¯NØ®»;?Ý£NÎÙHŒ›ó,èõ©4CJUû¸2jÔ$&ú›iqÍÌŽ¿¤ÿÔw®Âz;A¼‰ß˺pÂåæpÂ,Á w1…ðPœpФÿDo3uÂîu2lß6·QæÜÀ7ÊÔl£ sÜ2qš4T›ê?¯¿o+*/_w¥&@>ý¼@ nÞù"[ª–ÏSO¡¨ôØÔH²ÐB /ŠEo–ÉØ rF<ó¿-Ûœ<;#ü4ù6žIúAïóÚy´<*5„\ÊþtYJàg¿CÛšv6îö]°"ô=$œ±ô< ÍE9Êíbx†¨¨çáY„ªtKQV1 ËÙŸŸ¼È"^ÁØ3¹ ÚÏ8B¢n„ ‰¨F ëú’šïñ)"ïpQc¢ãSZ†O  ¯jø>Œ™A$ýê«‚\^„Ó<,㳿àËþÂ_»rø¨.ÜÐ<ËÇSñIü"œäá‘DEú®¨¼`g0–°y¥œù3W ß_•°ý³0>Wýs øÍ$Ž­ÂŒUT1VQç‡G‚“. ÞÞÐ-@1|TQô,¹‹H€™¼ÎŸ ˆë\åx:>q x‰µ3×K1É0ý?ðƒ;<ý×®üf®{8Ñ*æ{ eitÄ!Ë…¾Ià*Ý<œyÿ÷XC/‡EËyOÒ‰ •pó 44°ûVоuü_Ý+‚†’ u-"o4ÇÓÖ+Âä¾â·›Vç{# Z(‘„¼…Þ"ݯL»ÝrlWcè“öZ˸Y$,eâáñø…UI‘ï‰@Û9Yƒ‡Æ-Þà·ÁïÃUˆ|oÍÑ+@¶þøMÕiP…X•ŠÐ–TÆUkIÓÜæ`‰à.œ€g+G4\_X1äájOÈ æâÑ<ìé ãÉ‹ÍÁ'a$ª[qs½DÄðć.ŸàCÅ‹è'x^öÆÿǃP|V€§ÀY˜Í0Ÿdn{ˆvzK/ß |WGÞߊçÓ#ðôÙ¥Þ?5ðŒrþ56-2O¡@k¿ñÖ‹#ÍÆ{/`ˆí_Ü’õÚ|qwÈÀV_Ü–=d÷E7A:Æ\ŒÒ€£1©b«®Þ£žÂ~¡QYÍfá¶6ó)ü—Sߺ@ ¨Å‘>Å|MÊ·u}ü÷ µ9š:Qèú„PDzwOóÆêg~…«Ã‹÷VªKöµ‰+nß³£é[¨u3ÒÉ|¾UZ±>5Õb›}‹x÷¿Å "Yæ‰0×ÄíìtUFçâûa– jÙ±ç‰çÃæ~ð¸Uõ:Ž4œ?äü%æÎ2X+ ÆË9é¹c˜]¢ß1ïE2SW/ûîÌ£¾Ò÷Þù)ÙŠm©ï½ì¦NÊSådä"á.̓®òÝ=®ÄC…ËCi¶»4cš` *æŸGœ)í#¨Ê^¬ÓM%öXþ Gliù=é 㯠õm¿Å‘ý2#p<çw¾ðÇ€O'° ˜ž£Bª1ý†%„ÌT\ò“졉”0…òZQ‘´p¢[wý”úqˆE¨6ö³vè\7ß(ÌXU]$ã*Îjq„±œE5ÇRXÂ`Q%BÈ%}Í`À¦âjGîvq>ß,ûñ»ݺ?®]¨r¥>y¼ÝnÆPmYŸ‰}«õÿ¹m‘m²Ûpý;180< úžójÆñ ŠÅ‡¿)8Ejž;wªòssYîˆ+®éY=( Iq0˜…Ô°_Ñ[új0·Ãâëf‡ì—½Àİr×jm®8Èn×f{$­·_›rÇ®ô3vÏRSî²Dw &M™É­ÕWEД)µÇ±1ãÕ1Œl“÷îñÐhäµ ŠnÜM›@"LŽè¬·8:¶:“tFÜWZômƒ6‘ØH›ÀPú¤#}·KïBc¦OÃ+‚AaÆJ§_ÁðçG„$G3®ÁâýþÚ\ƒ5¡Å»·©ŠÕ%b»Ý¼ÕYcÛ=Æ…ØôßtËLÈæ ô-á7Íõ öƒòh/ežæÜ˜~oo7†d]m³³!]Ç(;IØQîôÓ–çR {éHW#ÏE›5òx2úÑ(ía“l®£Y/Ù ¬{qõ.kÁËÆñø÷Œâ{NšÛÁpú•ö1av ã5ÑôHM¬Vr'˜wÁ•ZBŽ‚Åód,þwB’:wûxr/æÂô ,0!wg•õïì_ _YTb5®wW»ÿm»b÷o½jÝ÷Vê¾ûJ÷mØ'˜îç÷NǸí)j´í2 8² Î-6Ø'Œ³:Ÿ²L½3qÍOq·¥eÀârUyva($X¶­5U? +Þs ¿RÛ,ÎR©²TYd¿<ú$\ÍÇ%ÁV2'§KÙuéŒ>õlaÌ­§QQZº3‰¤®Ç„Ë¥a£õqÕGG{§\«ËT9Õåâò’ü¢=dÝ(‰ ~`µzWŽ•m{+Ã͇Æ–"å…ÃàÞ˜Û²‚9뫞I3’³™W¥£7&mÚ8z©énƒÒìÜÒfª3˜;f×;ú=c»uÏØñà;‡u—ØÙ Ú³ƒhýmj" ýwJ #\ŽÂ_ º°÷DyeÊBªTUBNLŽ\ƒÈÝ…••QÅÂCbC6Šß_ùÁBéq«Ý´œ–៨ðØÌ„E¥ªL”Èy ÑqIçŠÿŒò˜`ºùÝÏÉú.vóšzCïæ0Üc÷»pït˜~M0‹(¿­Ì@H)ÌNË”§¤¥'¥ˆVyÏóY—š”ÌæºÓ‘B™Fž'^ÇåŠÄô´´DabpR J"7KËí-¿~JŸíë%•J‘01%g›)™[|WyWj’ÿ>‹bý$6¥=ÑÔú ›‚©á?˜CS뇛 trá÷_´H[é™Q&ݲ(Æ@(}p`e:Á[0ÝHR"5ôðÓ%C/ +Q>dÈÿugÀë endstream endobj 131 0 obj 21387 endobj 31 0 obj <> endobj 30 0 obj <>stream xœÕ}\Iûÿ†°{kWâjÀ3ÁÞ{ïÁŠ‚Št)¡÷„ÞDP±"D銊 Ø{¯¨g;Ûõôn6Nî}ÿ³ (zzí÷?ç…Í–Ù™§~Ÿgž™ðu>ÁãñºèI\|$2G«!3Ý]lõ­]=½%Ü•ál7û­ÛtЩwOß-$» R~nÇŠÚÝ ",Nã[úd§o©%¾%+:¦jø±x^.oï ªj­Ô5-µ>jCÔF«MR›¡¦«¶PÍPÍDÍVÍC-@mµZœÚ&µdµ µ<µµ}jUjµjçÕ®ªÕ©=P{ªö“TûߊßÏð¿å÷äåOäOçëò ùÆ|;¾”ïÏ坿Çñ7òÓø9ü|þn~%¿–’ÿ€ÿÿ-ÿ¿ê”z;õÎêÝÔ{¨÷S¡>N}–ºžú"uu{uWu™z€z˜z¼z’zŽzAÿeF <ËÝÃßËÑÞA¦=b„ ÚÖþÚõW´gK¤ŽönÚ}ñÄÅÝÃUâ&ªm(‘hË$ÚvŽ.íYú‹ç.ÒÕh™¶®ÄMâe墽ØÔF{£ÄM* mçî¥í¢ú¢mãîfë(stw“Õž!Õ¶Ò–zHlñC?‰wa°¶‡ÄËÕQ*ÅÇÚŽRm{/+7™ÄV[æ®íèfãâm˽Ÿ·sw“i{x¹ãë®ø nj±»T&µñrôiã7.ž=GÕG™ƒ•Œ{¯Ô_Öv·ÃwÚºÛxs£yMfåè&Õ–IüdÜ{¬%Ú¶ŽR+ü^Ü”‡—£² ÞRG7ûÆ·Öö’Ø[yÙºH¤Êv9ª4ŽO»É¨­<<\ü•Ϻ+ïzÿ~G™Tâb7t‘£«µ·TÛÐ ?¶@›“Ií¹2+üt³ œús¼Óñörçú*ñô¶r‘z»ºZqµ÷’XÉ$^Ê“³%.2++/戭£›»LyÞÅ=@âf™k‹uÆe†µnÔ^ù¹ÀÆÊËÝÍÄÊÆ[&Yænïî&qžkë.³²Á—-°qÇ/Q›¼?«Û䬡òAC‰­£‹‹••²É¹®V6¸Íª?ÒúkÊ;çª^± 3ÄÞ°I;:ÊnÌP]¥¼Õ@yj‘òXçýËmê¯5>ºHyßRå§Žê³T6¹ii“cÕ­ªwÍora¶ò‚¾ƒ·– oW+oÙ²¦_fã¶­dºÊAê«Þ´@E8Õç&mI”mÙ*?U—%ïa«lÈEù¬DuÑEy§}“\š¶¦êl“3Žª3Vª§­Tß¼U” K•Ÿï_ê¦:Û¤ oŽ nÊ»5=ÝtÌ^ʧ¼U¯‘)ïõR~º7½KÖäq¯&Çîªç‚ؼ`†¿›ÍŠ…3ÜmÍò˜èÏö´[¬ãe¿dŽÔÁ@Wæh¨çí´t®ó²y¾.VËçû¹ZM3Ðtì m³qƒ{˜ÒÓbÂÐ^–‡õ^9ixŸÀÉ#úMÙ/xê¨þ!ÓFÈx~¢¢0óÅɃEY?œ®,Î~}¦ª4ç×s‡wç²çköì_¨-Ë{wñȾèÁÑý»+Ïvü@A !z&„>1›˜@ %z¦ÄbB‡˜H #zKˆ9Ä$b8ч0 t‰D_ÂÐ#Fýˆ¥Ä\bÑŸXFÌ#FˆåÄ|b 10"c‰AÄ b!1“G &Œ‰EÄ,b<уèB´!&]‰¶˜B‰v„1•Ð$Ú|b¡Et Ô‰éD7¢#A3ˆo‰NE˜Ý ✂&,1Ñ™hEXÚC´&VñDáK¸VÄZbáG¸ÖÄ:"’ð'Üb=Eî„-‘@¬& BBl ¢‰ “°#6kˆ`‹°'61D!%ˆÍD,JÈGa„7áDÄá„áLì"ʈ,"¸Oì NyÄ¢ˆØJ<$ng‰£Ä>"ŸÈ!2‰:â¨ïÂ~ãúí÷¤ìߺÿªƒÌ`:`뀲ãnø|Ú ÝA¿n=xè`›ÁɃO ¡‡ôrlhŸ¡×‡þ6L2¼ÍðGt¡3bˈ½#é‘Å£rF·=|tÀ˜…cv==®ï¸eãvŒ{0~ÁøL(ðóÄÀ‰‡'žtxòÈÉÛ&£)K¦ ©k§žœ6wÚÁ郧ÏX<£læø™7gÍœ5kÏì(5C‹:pÎQݹºt_ëÍÓóŸ»h^ûy+ç=˜ÇÎ7ž¿eAî cM^©?TßG_¾xÎbïÅw–´Y2lÉ^¾Á(Cƒ*CÆò¥!K —þ²l²›ËÖ®˜ºÂ~Å~ã@“Q&RhZfF™y˜=6Ï6h1Ê¢Ä2ØòèJþJƒ•¬zcþ«µµu¥Èf§­À6HÒK’+¹f7Ön½}/û ûÓf—XÇÇãN>N…Î&ÎÁÎç\R]W»¾sïvÛ]Û=Òc’ÇAÏ~ži^”—‘×>é`i¤ô¿2©ìš·ÜÕž…vbï¤ñXFîÊ ö»+ÉFS¹°‰^Síåv `'¸- Å·åÁ~ÌvÔ„C¨rWÍ ƒðøëˆÏn´„‚Ca1Ùž­Fî/§ñc l ƒŒÝíÙî$JÝP”Ä‘–ösBWƒø0‘ ñ×lŽMšûÁî„[ö¥ddŸ…ïäB®‹iì¨î–¦Áކ» Jவo%$ԦΣ¤àâÝ”êCç»Ìñ0 ‰ Žöë¡sÜÅ›ð?ëRã·ƒíšuKœ±Ìcþ2‘`øö»\ßdP¾‚ê<{ñÙïáfmVÜ&°ì Øã²KRjž¢†€ÎF ëX¡V`00Þn’ïPl]ë{ @ütc/Ô¢‘å2ÛÉc õÝ /V'Ï:(Þq¼$§€ìÐDŸAñ¡q¶t{ù0&×Á„ˆfirÍ¢Ð|6†‘hû ÿ Ó > gQp ŒÿÅ“P“ÿZýsQ]`û_$Tü—„=)8Œ£½;…6(Žú²GIäªbwIÈþw¾‹ãfÛüÿØIƒ €ý{Ã]¯îvw¨—àbÖ‘šÊƒù—ÀqPë[ºb-xv£ªìÌE-°;h·g®C±qÊ @£[Ô#´)‚H8ž:•ë·Ò+Ì#ÀOìíåihÁ+€Î3{àΡNåy›yE¸ûˆ1( 5t{v €$<I{óL1’"’„ñzˆÎs‡ìR* ’$Ê¥à}x³6a LåX3‚=Àô#,O6]àÒŒ¡QûûS ÷Þ9)ª8ÿ< aÇq7Pw‘7RgNî6Ÿm¼\j%v14wÁÔ·-¿ 7Þ~/nlŽNS1~@,&*rjSKÑVYU¶.М&˜M7™í6L ‘Æ… oÎWgWÙ±LM¡¥Ò˜ˆ±Ë˯ÀvסÚ=q#‡=a&ï°–$šD!ta¼ÀÂ> Ë%(“„UJÅÝ+?Ê)]O ñ[ÑRv+Ù €ùl\ªH#aîìÌ®‡q§ðå;Yf편-` xÏûhê ½¼ïDÑìQ–¨@ F¿§ÁyP뜶_„zQnÃf ô@ãš·ws•_W\;UTªA™_ºc¢ï:?€¥”…È- ÎÄäy9ÀúbÁ³œ®iShÌﱜF€Eéú{Ý/M83a4‡½ºz†®‹ÍÅ/ÃÔ±˜ƒ˜:c–;”_€× Úq½ºu[׳6Š#þ%èÃl-OØ JÁ€ ÷bûò%Y3Á0ÉÅÌd¾ž9Öº~4êø`–áv¯Î@~­‰(_‰¥—)  $%µ›ÀƵ;Ä0âƒ<¨Mù·'¦dåïIÝŠ@^@¢û† ø0àL×9)ìÄ“{b‚+Ê)Ô‰d[Q 7…TyX®´wŠVëÆJ±ê¤6!7;“œ-’û3¨#èk:¡ÿ”afH oh4 òÎ(ý@tëI9l`kêiÿŠæ‹üPgæå‰¹Hm²Ç¨•úbcSÝwÁÈ»µãÑþ“⪠çŠo`-Qjª²l~×Í.°‹ øn÷ÕW—*ƒ”mΚrÍ¡R*CñŠy…{ »QOË-‡Oöìí¸X¼rº‰ûhð!•¾ 30`’ï ˼9@s<˜d¹lºñlסœ"u¸4ñ× GóŽ—‹ôQÇ]8FK¢¢ÞLM‘%æâtĽ̡ü"ìtCÉEø›âÑÏ~xÃc§°9ÌxjkuB^rR6ÐÜ ÖÇæ®Éx+´ŠˆóÀr+ß¡Áó„Ó(ß¡äMj¨Bkþ«GÞ¥”ª#1Sݹ!§â!ÃB˜È@}ê68–U}´æhÑ}p–UXï²ßa½EÛ¡“õŠ1ºË2ÌèN¡TM±³™[˜mXêà¸(íl£ÑãÁJxž¯©•3ã¬Û^ÅêìzO·WõULµg5ñà´ ûAz3sî!Óï¦*»Û-lŽÝ¾f'ì)\·Dƒù`¾•ÙLZ ù+©¤þ÷oUFÀ¾Ca¯®‚gln˼Ç)ë‹æ40]²|î’ÙvH ¤‘ÚµI¯NíI=~F83xÞb‹™@SðÊÄ.#O‡ÍAo*&46 ¬’I™o±ÿþU§œ ïJ.ì Û°µBÁ3´³7s¤Øtj?­×H#ç}a‡ë¼+nAŠå3aîß=e v ¡.Rƒ<ìƒ:ö7ë7^4m„Rªi•T«AËÇ·ž]œøì‰ìá:fÈÄS3½B#fÿEX†oç>àdøÒé",ÿœœ‹øœ™/+6¬h`Á~ŽWTx⪒ð?*šozÏÒFo¬q€Ý`mØ£ÜVY·»å-ô÷Ój‘Æd=ÉJÑJ‰»0†e¶Ün{ ¯Nû&FÈ´œWÊ9¸lLòoÚ›I£îÔš Ø(,òÌö{í–U„Ÿ4œ ‰»°ó ÛÝã³Åƒv¬HÞ Ò4ó‹Ò«E‚“µ¾ÎQ±Ñ1â÷¸ƒsìp8½8k­ì²v¤Ü©>|hVäx˜p ÃçcÐq{IõèÙ†î –‹ŽÁ,R…¥20a 8‡<C­`}Î)?ÃdÚËÀéÔÑþv¡kB"ìÅ‚W~s"í<µ@h|x‚ GQ ¹!›WoIš !nsüfì°3a‡õEÙZ Ô3×(¥:''%+›<Þ½'ûô|2p·G®s¾MÒ@+Ú½§õ#v$ö×$œL™Q©AI!€puñ÷õts 5æÔˆ8wÕ³Áç³ß2He9áD*Ä:ØËÃÓÂb±n}À¬¿\ÎyR\+>xíBé}ðµÚ8†"*. ;©4Ô@¼hê€xƃ'ˆ¦ 7E¥¨aC…øpö³sù·¯‰"GßSØÆÈÒØùÏðKûñÙ‘ØÊL¡vÁ>œwvA}È9œ=¹Hé ûk‚c‚AˆæÒ=.W ²ÖnÜ!Jû)8fVMYÐæäõñ[×¥ˆOÁ ònræäN¯×;³zÅæü>÷]9(mÎ0Õk VÞþ3±$FÀˆ€}» ®Ê­ØuLÂŽø$FCbè4jà4©±ÈÀÄa:˜ ÆWYÂ6ÒŸ|±>>ñÏó5ÓÒÓ³ì5ܨàèú¸Mq›D¨/µÆ76ƒåiæÅN-/úü°³xVtìüފܫูôpŸ4ÄË ®IõØVªuæÈž'÷+Ü–­Žˆ©„ç æHÇkð;F}ÇñS…]QKP‰Ê¨c0§E ¤.ÁïêA;‹C<ùliø [ÂT]˜hd4h{æT&a’eŠ/Á:îÒ$EÛh¿à¯9é˜Ñ£k5¹gjDAº$&%rƒêrÎpóš/d¾’²?G:‡ºÍ`½VŠøÂ¤è­±©RàHÉö‡´J±8v°[ØW tPYƒ;ª†¼(Ä(^)Ç6%¢Roš¨¬n`MþÒÖpCéO¡ ±++æ¯aÞ*oáž…¿©:Ù ¶¥Pç©Ûh‡f hM¢Q’";²f½â5˜/ï‡í©ˆðal3hN±È¯NŽOZ»Mü–àHÜWáéí¼5ýà 8èÑÝœƒ'EGËól¿‡o*ÚûÖØP®#ß(ŠÃ–:¸.š¶ù›ã¶¬Mo»Éµ4kµwŒ7ðÑxy1luîÒöûD•ùEÇ·ÝÀÜ*bT™ý½ LáÆÜ‡Bãí±?C½¿A£íW³í¹“%œd÷¦àD¶ãzEGò=ᚢ‰ÉåàØTØKöì*¸Èf¥0A)Q‰ [™ ñOÃj,Óë¶Ç'oÕyþE²Tç“­: ÜQv¥Rjw¥ô¡ŒWŸ`oßp±o³Â—DMWÙ»x/—8-ú@²]’'Íö) ߎÊÌ58|XVGjðø¨õa4"QèÊøO05×´©WJAEIÁÙ-âªÛÖnŽß·.NsKüÚ¸­šT½»°}U€ò,ØÜás<È÷(æÂæIœÎs1 e‡Âßá.ìB¿¡«àU²%éb‡Á\†ÃTMÆýBãVÀqÜ!öŽ©(årv€“£ÉÜaûwíÞÇ©rCØŸ‹Sg5áM§^J.ßw¬[i¶Ì!46<&L<ý\1ùJyÙi Y’îk´&X< =«÷& yØì`obT1Bw™—ÁRQp•iþB0˜y-žG †§Ü!›G6ì<¹;5qW[k3–ïó:Q;Æ$pçæÜí¡»Ük™…¸n%kQ9‡ÜgbÁÅ5rït]‰ùÞÍ®Uܺ@9Gh¬,ÞŠòµl9‰FRH¦Ø·–ÝÇ=Ľ©ÃÙÃë‡ÉöïlP÷{eiîMºÇ¦ÝÓ/aç—lѳ®‚~òv=ã±Ø·Ê#Õ+e:g’á\Çé@ŸžtÄðNmmöÁJ‘à;óäé‘nwÁƒªË]Þy|ÎzŸ°¨™sÀ^Ô ñXu…ÚöÑÖGb€º€±…O\˜÷Äjú¸‘tcWèmá×¥a 0„œƒ:½}¿/ùåÔñ#Øv9·à²ûñ{-ÒÁ °ÐSg¥¡Å’Å6V€–&¥'ÅoH)Ãoa)è‡B2»crÜ °öZ"1^¹ÄÈÉÐ6ù¯a¨õ`µ*ÌiÓ¡ú[lÞìý1#äŒÜ˜Q(ÔW!&¡•QX’ºÐÇò–ôÕŸ6q¹Cöîõqã6‰qpí‹=XÝ¿nlûêÑþºc¢½G³®‚‹4TÓ»ˆxf’P3Q ìOÂJ±Ê±xDzeÌè!•+>¯r~ŸÙsHE^B­ì³!MÎÂ7Ý·Øn¶ÙK¹ëKkà F4…Œÿ3†„ÑTúK‘Š™ Iª~ ›°$õQ†]0LǃPgË Ä6õô‹9Ç©=fYy¢å£ÍЀÚÓ¨õ­i°Ýƒº=—«ENì¸.Óoœîidæ/1¥œŠß˜¿ãRÉΣà ÈôßdN£žhSYà°b¨þÔ™+Júæ5LÀ;áiw´å±Ï`9ƒæS»á\µ¡lþ3òBmI8›GÂ6øþ3Ÿsøa*_ù݃¼NÍ”{¨<{’‹ù&qäQ¹—_)d„@C'¡Õ4޲«¡á-ØöƒãN)*Þ¸‘æ &ìË{û2.¨/ù€ ѵ·]j(„jÛNM…jy°»‹„ð]ì¹ç™,"ÏS¿ÁSädÅãžVz±²{!3S¿Cbêûô㨆b­Aï©øê«,²þ†Uu,ìÒUð‚ e»0…i©‰ÛRJK2*ÁAúÉÄÓ¨êƒÚõBVnw­°{yú{ºÒ‚·v–Þ‹—j!Þ½9PóÞ¼êQõ¡‚ëà8!+^TB ^ ÅQwm‰ÛÊù+tV8î,?]]y^,xkˆŠ˜Ú"çc N^fSXñÝÉs·¸ÚÀn<öø‚AÙ”êFÂlÜ]7Ö nåÁ8QQØ$"†<‚ CÂØå£“˜³ìM˜ÉLd§¨…6*¦PÂÁsõ1TMÖŸ4§=˜¢1˜-2nôo¯À ÌšÀØHN»ºà7¨ö¸æÍ ÑÉ_÷Á¶£aÇ)wP[„Æ#‹•."Îê½9R”|ðˆ8Ì4Ì)Ô]º|¥+Fµ‚·fÎùkÁº¸õb85ÄQ“½ÁÀùS&‰ÏL\ «_«Ã¨â?ŒÁЄ‹l5œþ~Ƀ"gæ;¸’|MG+É·wŒEëPêLþÊަ®Àdj6šAönrŒZSÞýÈŸ©…h09“€›ÊV°•8ʜƿV^áò¦}.òØŠiŒâG*hÉþH©úq]«hÖ5ÈgSšÉÛ®`lr ýþ» –Iø»ÜE©°û2¬Ì#a¯éYËùìjf]FÜVìê«ü÷;ïðÈtÜj¸~kP— [f´Ú!\â«9ÅÆd ˜†×@¾»9r Ò-7ùì8¤6€ q©4êBEyÅ0ðŒ>¤Ce=…¨Œ·Gö'îN×¼±÷ð#ðð)“ä¹§;n[š²š ‹‹£2<%8²‰ˆñ£Ñ˜ÙŒõ6ŸlP S‹v¤&mN\—³GÔ±è6³;03¸†vÖóƒ8Ýd1þ°–ud8Ü8‘ÚT•Ÿwlóæ‘‘ó ‚GËOØ”Z½?¯Éulëæ|ÆbÈn®OR)ó'ä "Á°yKQk«a4ô¥Q‡+Ó`kH?=ÛÔŠö>)…3Á+v˜yK¢Rg*v:­X(CZƒÅîýmÚܵàЕЫ ZœUš—Z„£¬wí|‚“Šä>8ÿ8ûe÷ÑU0M¾†³YØ6ܠ؃Ø0+¼Wa$ˆˆváØú··ð›{óOŽû `öæ»I–›˜.³vÎ+©®¬¬ .°ãÐÖ¯x»dö³ÜýgØN¶á€  VíiÔd°ÔØo„²®²òô±t(Mù[K&R…iÁÒ¨˜5AblIÁý5!±!!Zú»­‰nRé?“”Wð¦m›ãצˆ÷B# Ö&ÇoÛ¬rCÒ}6…&¬Š÷Zwuc~Þ¶+eÐH¸¹bóæ@—PJ'À“·fÝEšë‰Ú±ËѼ°+*‡|ø ’*ã΃/Ø`¦—"XÉ ’“C)›qV¢öÀw¨P‰åi6˜“ÝÓ°1¡a'>û†mÅ„¹:ºLÀ̯Éß™‘‘_’~”Ó—V Gm{ÕvI±)^!2–ÉB]¼ç˜ÙÍÓi¤~Mv¼¹/åÜSQ‰> GSCàèãÕn¹ª©hµŒùMškáì4Mlö>–W¹C ;B=Æ¥GìÛé’ÜœÒüÔ@/kw{#Q{X tÜ0…'QÈ»á:nÔ‡a[î?ž\Î(ü•ÞŽõ§S\{ùG<ß=ë¶ÖñØ8XƯ ’o’à“j²Wè›"Ýè &妞é[TbÕ¶äR¶E¦´¦ûg®*u öPæ UN¼/ë;òp,„¥h$4g’ÎmÚraïñâ’i¹»v§5à°ìÍ.‡¼eÉóÁ80Ûu¹íJo¿q4ü–JyTyè «KíWøFù„ù‰ƒ<#" m‡Ìµ5ŒœFC¥Íí*Pê ƒ€f†2Œ&Pè­bŽjMÂRÊ๎ ¯Rh ¤´€‚ñð(YO/¸ì6±£gk.×~…¸D¦üäõf)Æý¨ Ô/i& Ð §¡oíç;›Ní…ÝÆV„]AZÄà¾`ÉËÂ0MÒÆí6KqçvÁ¾\ ؘ2 MÓ¸°S¸ä\9œ{„©0ºæñ ÀŽàת»?ÜzZ Ž…UÉ* ñ£Ðª¼ïRp³ÖxVîn¨èi2~àÔa¦\F•‹—eZ"~a™9ɾd‹™uÞqþÀLôm±ÈXg¾Ã4° Xnw+¤]0Ñ1™ ÜÚñxÿÉJåÁ°Ïo§7 9CÆí¸©5Î,P “vJ]ý>V×ÇÎMzÈ©ë]>y‰ƒxWà#} ûJuw$j;Ò µÂjÝ_°t eu™ÒЭ^8BÃV¤~¢ôœå©y9 Ak¥kS çR~cFEêJLt4uµ±¸LÚ?û‚ç¶È”è¬hï^ÂsTúkØ*á‡;Ű½&Ò¢¤‹=ݬÃéyëûmÁ¹ \ɺS\™œžž”ƒÃûwA˜=SùˆV&å07FËõ¸Œò!UFù*£|[•Cr¦Â°Íˆ;`g³}n·!`¬õ̉ㆢX"0Ìx¡ {œßŸqâˆH`º˜dCTó?Q‚8$®fl$>Ë=|ùé_/¥Ý(<%®xp¦ü¦~wêŠ÷Ô‡Åͨ`Ûf̨†·?AK¿ù‘¡rZå:ìÔë†à¾|Ðg³”hÓtåÌ 6Ÿy ÉIÙݾjî…³„ãàθa{øì5£ÂéP«« €5eqÅÔšäèm…a»c7€$úhuÕÉS»\®a±á"Ø•Z›—RhHëœ@Zu½LD¦. €!ðXï—¾ˆÖ§B—’)l{\hб1 ¯°2=oC È™Ñåa´ 2´2mMn·J°wë™,‡¾Nö H×zbôg»É<øwsÁÑóÝ ÚͲ#à2Æœ 1‰4l‡ÁƒÉuûOC‡ ¼ƒሇXD¹¥† ˜DÂjkÏ,K=ÌÜ$~‹=£Êüö™êìÊQ^IêIp˜¾f\>A¢Ëeº¯œf1o™ƒlǾ›ågj¸ˆ‡ý¾ª®Š*Tòámy³d™‘õN×½Çj-sÝi%7fR“Bü½¼¤¾ÁIÛ³s2sÅXd•CN3tΟûÚÀùÞø¦i.Ê—4ÏÑ¡õ“lØþ VÃI¾i<¶¿Ü’QÜú]JÞ§Ø[r)‰Qgó©Xö;.¼€ƒ_‰…—   l‹%ÅmIÈÃÿPï§gºÙ—fÍ‹¾¿¹‹sѶ©`Ðñ±°qr p YÐb&ÐG™ 4PeeË%Îú`!=ñ˜éOk²¯_í˜Öþ€mä]¨þVøá²:/7ÏþÅmˆ_4·¬]·5fé³ r¡Òo(Ão«Ùå´„cò¨âÁùphÝY›·®Mš9ÛC|¥®¾wÙ†L3±ëŠ#Þù‘å@óû{ÏKÓm‚Bc¢Åe§0U‚|ÒünAí[p÷©qªjÖéÕAaÝ™:ا®« Š÷”û0ŠÛ¿òÅÖÉ©Ç 5f¨^µñ¥Þ~Á¨r–8` S”#uZimcéà™µ³¼¬l¿ú+F`}Èh|óaîæÏ”7Na ëovl¸™en1_t#gllÞðäêð £8Cy÷"Ù3õžvô‰Ã'xìeø–Óf˜ßr`é£ cá’;Õ½åÒü¡ËöåŒ&êK…(%HO•'×ãÒȉ'¸9È-‡¹cÕ4 —vÿ`…s §å1 Ò ú ~ä% þ û5~ãfEWÂŽkôUNHÃÓð)<7"T×z–…½‹·½Ì6x°¤U‹ï.ï xÐV¶Î+D‚ÇV²ÔbΤˆQW*Ò3&ãóÑ–BâÑ•]Ç+EE{Òƒ ,h—SîÁíé‰9´àtv^ÒÞƒZà O‘éN¤~Ih¼Ë'¤ÓEù¹ûD‚K{2|$Ñ 26RŒV¢*Æ-%<d€Âí¹¥iP0M(¨-òÙ,ÕNþÞfÞtc¦cÄ+°Ö®žFìVÌì‘ó¹ ^ƒï÷Ÿ¸]q²à5¸Š¢òCóžÜ:–ña™í¢Œ™Ý¸j&ýɦ œû±ÀaƒS’ëÐ)ÂB’5d[3q‘`5X$–ö®³Œ¬Gà’Mû×0±[Àz° ”'É,ÛuäÀ®jPvnwãø fc ö#§Q½.ú‘œB]ÆúÇI€{ƒräÔî‚ó^ò`&,bzr騷JÔÒï'èüïÞKèô’ÏÆ°ÙŒ×v»­ÀX„:ú-º)¯{j²£•ÏR`¬ ¼×úo”™*¬™óüVºÿþR Y2fŸ.¼wAÿFñ´pH¤®Ù™ùäºpÙE9¢LU±ƒñ,ƒ%³W8U]=rô 7¹ÐÜÉ[q¾¨ª™/ªJÂ&¿¹/R– dé€é`†‡¹…c¹^îdЧ‘ª£iÔáÞ4¨uçfîâ–çÜ®áh«ÁÇœ¥-‰¸¤*cmPëæÞÅ€s}W‹Mí¢9Sû.Zi÷r9ÒŠ1oP¿üxr y‹š9€ *ï}•'ŸÎùóZj0ð4^f°Èy˜ œž÷rõ@……ð' êÉ‘§(¤÷û#²þÛ~ÜjDK©ÕZê’2‹ eirã6v<ì…Úpõ%÷!‚¯™dêz©Ó“渚ݠ¿E}³ 5á1lû8¶B¦h — ªÅ åÅð ;9 Ornz²¢U¿E¾C^ž4DÉMJ÷A ¨ÕÒž+m¼Åùìùj&`¥ƒ÷ @›y¤‹7Z}³Ú?6„Ò ÷Y¾}áäÝ$‘²Ê´Åî7¹/?ÿvþÄÈÚ˽½¯ÜºÝ»}…ê~zÆÎ®ãË…ì,&>%n#ØHß\thè4=§E¦¢•Ë<&€éô€‹~‚Ôƒ3owˆ†Qþ†6®€^êRpòà¶ÚìRqÞÞ’ô€®Î”.K!±±(IÑ*4 ;ÊÎp6&WvË«à,Ôc4qà,jÿÒõ@Fhš‡V íÞo`¸.€óà qó‚·Ë°-Ž¿¦êMÐÆÊ‹?оÛã›öìêÛ[°êŠx™g³^v(`ëÌ$R5±ÁÀ‘¶qr²±óÛ¶+¬‹ß(N­ Œ]…9¤{Ðöä]¿øs~p¦Ûv‘à—Š¼¬ÒZÇÍ 'ö_nÑÇWôÚzd{*–øÜíR G÷屫A\´˜½ç6 Y.)0æ7M ¹¢ÄÀY$ÔáBžçTê3ò”®b_µáD²ynu¼B“¬£œÑ ÷Çï‹aî`Z®œüâ_ªˆh§~>! D /~†‹Ó‚Óð {Ã/ü!û+SêQ$ɲ–¤û&8 çj±b±ž¤€qí½éPüæAÙíc¢Ãw<OìlruùáY™på¾^QëVÇÇÄk î˜çÆÄ9&ë K¥ Ñ9þ£¬…e+IÈ M& äF¤gúo–Œ¤g÷"•nJöy§†çrP•Xµ7ï𾇸²Ñ†b+Jª4Öƒœl±äê?UróÏÖƒ´C؀ϱá›È.fÐÄô…LŸ±¯Pg4 u>7ƒ_!æõwø4Á¹Øzt~ÔTX{$Ðv~7¹)’n¾>BùЫ¯Y$! §±šAó;p—gê̶e”)†²GS¹9Æ“pßß´¦b4&j# l\`qWå{UË,2?^fQû5Ë,zn¿K :Ã\¸ò#/NÿïÜ’/£û«êª4@¥ 쵪3M%¨5D‹’z4ìŸÕcÄŸ–Õ‰D›ü…Y¥†’4N²ŒÍÕ_­Kh+:@›¦"÷©B;˜‡e½QNþÂR ˆ…¼IKØ«Âmw Q÷{•:øÓËI?¬|õK]WÁ/dá9æ Uœ&ŠY ¼%"W»iˆ¸¨u!ôkj}zDš°I3.‘ÄOl½¼6=E d„%¹'ÒyØ™¼‚Š3ZÇvΡjˆbùU70™ _S{’#¤~‘Òˆ0qX” k1zÆ~Øÿ?ì_ï‡ì‡ç4óÃó±6FÚ}T~x¾Ê« ïg5©ÁR®žx[ŸÑ3ÿnÃê‰ÅÍWOtÒ½Ó³qõDu‘ÅåÚÕê‰Nõ«'BÎcJ)P.Œé*¸ùw.hχW›§Gì׸çÔC>,“1qTeôÕÌòª҂ʌK_ºªqÖàƒåUË,Q.¯fëÕº¦†o*Ž4-ÌVæïè÷ù;é†,3±«Ñï‚Èý@óI}þ.04&:Hü÷Öm¢VX;š†Ë-+ÇuN7>Žüþ‚’ìàt¤…XòVpêœæî“Ïv“ÏdÆëêŽaÎÝûÎß¿§{aœ8nsp©±­±™MYEåž=•âF_ÁaìËþ¼Ãh£MÐüaÎ?µn ÚbÙlâ°š,&jЈ(N#~ü—V :¢Aì¤æ0àï”Àœ~, õ¢xYÅÍÉwï†CÍóÊŸ‹_T «Ž}¹ 7öåkâü7r¾\}›}D¼g·¥ÀÊJ:óå…*_ž•Áùrú_ž¾e7‹ `èÈÕ:´fW|²ÎÏå€OËÕù™#GFᇯµ!Y¿Zä²8‰k)±ó·Ž RX暺c•È]VBö¿ }Ððó2„‡àR‡^'{ˆ[¸5>gf¢çäg—¬ÍE'ÉiÊdƒo8ƒJÁÕLÌñù-®aÃåaU üWÊên–÷9sµ–ÔÁ¢+Ž>P‡a% Ød•pp²SÔK‘•-§„™©õ€:1²ÜK¸%*m5v¦‚oÏ€cå%7éÿS1žÍIq ŽóË×ÏÂøp)~ReÒª¿tM­@;ãݰ¬YÇ?°fÚ-Y³æÒZž<¨ìú•2ÛáÛó £,¿YÍS2¯þTJæä¦dE»!AðO ÐðègK+e¶¡ÿ²×7d}Î:rËZÛª–µ¾Ä‚ÉÙÇMP[µ°õhVÍÑš£…ͶÎÅÖn•Û6]€rng*¸õ­CÖ·ûˆ½Ö·6(•+qrY'LJpy²@{¼ÑëàÈà&4iXZ ù¬¦Œ³ãà·oÊà$ºÙzó_ïæ'qûaøšèØH@‡¬Ú˜¼eíöuéâ{¬—ò›…ž„,0²ÑšfnY¥›ð¥Tñeø€»„ÆþÇåj0Çs5Y¿ÀrF§ªÑŒ£Ð6SÆÖÎÞÖ=Ý'owIqÉNŸt7ñøŸ´“à“;ö4œl˜T?¯Ì6}8³.ÐÖÿpÞöƒ@ð/Oדm&LÿêR{ 9o4õM“çÊÜÝ×&Ï{Ë7ãÏbx‘½Ä,D{ÉçÔ÷ìr%56öšB ßgžÏ+y÷7dž§5ŽOÕgÀ¨fó¿ÿÛ ÿ .–Ÿ&üWÅ'ƒ“ž¡ËŸÜt€‡å§q4ªÉÞ§eH®{6›ùþk¦Fþ¾uÀpÑ%-KÞžOÍŽÿ/K 7'€-Aƒ$žàpè{×|öŸuÍp<ý7Ø?-Ä0‚â)ÂI3PFYòÐgüÏ5ýP_ÿ½ÃßÝÓ?vΣ¬kY¾ëÕA•uûاWþAq½r\UMÆ4U‘ÚUäØ?¥"Çÿ´—ï²ÁMûtüƒiŸþ-Mû¼×«ãJÌÿï Þ]8Æþ<ÐoÌÃýq¼*оñùÔܧ·` å;[¨ê‚e¨¨q7Š!gÐÈÏìFácÞ°űuìFa”föçv£øÚ-•Ð|¸°¥ê´ÿ7~Ù×´ØÓ¯ÜÊ Ñpþ§FÜö¼pávÊ]x'àeÆV—¼JÅén4I³Ø9ïšù-°nx˜» ޶r ·ÆÚi_ù”†s©Ò Ü^oë2Ö¥nÌ¥a$µ_Gí}r´ò4ØŠü™\…Œpa}Òl€zÔ©ÿ 46¥ð+ÎP«ÜcÂV»q\òîuÿ¢nÏo‡Lqã*A¨Žñs˜1]ðbÁPƒ„9T6—H°¡žá?ØÑpßfR՟$JW%ÕÍ©¡øÒR~kÏcK¶4ÇN—1 )”¥ !© ÉSÌbiíEg™!ð,ô…gŸ£³øþÝò‘ïú0èàïyHÕFãfnqzsvSDÁ_ßÍþpöëÔ- pðk³`mád¶ÃÔ|5ÙjKùÓúí¶~õv[¿f»­‡ŸÚnK „³á¥/é8'jaPÝWYäØò¶›‚éÐ}ÅH‘:yžŠ²p°·\n.¼‘pþüæ[é?¿ÚüN€÷›%LQpý~ÂêòK>{Mg|"¥Ñž€–ø'íÌØœ•±Sœ±s[òñ·ŽÊøQ915ú²é…V?Ì„Cò3×n®Yùy¹¸:GÚôû㬌µ ;E “Y?1™g½Ø|‚M‡ê'”Zª!Xù)º…mDú_@6Õ[¿Œvm4ƒá¦þ:•ëKIãYª•i~ÿÖY‚0…pɧGùÅ»Xýû¸á ;ƒAªoCú¥1‘Xß×=±£¨ïí øRƼ‰»–qòàɃ{€{­smãp€k\$xþ¾}16{_2ºß>?º…;–¶/트ºtœ0«YîÑέŕD¶AÁÊJ„÷x¦Þ&5b÷£-b÷Óÿv?û§±ûpH³ÑlÇêõ÷iÝÇeC ï4”£„9Îå=­ûúig)ü¹I±²²0…}£‚ŒëîkÀŒ°Ì›ßÞ…‚ÞãF„»QŒ-o~[Ç®ÂNbéî'dù!YQ™`ÙØÄäý‚³£Þ»š‰IH}ÁÊÿÈN€p&›Ú,у=Ç»ŽØküÈoÆöÔc+S`@›p»ž™¿¡P´å°”ûê` é°mÇþÊÓ'ò uÞ—ð ¨Äªñ—'®'¢ÕPö¥uÃê­w‹&òśȷÙD¾hÉD¢cŠ3 ¶ÝÒÁ΢Á¶o¹•¦´í:KsB>¸¥xDî5V,éc4РŸ×)Ë ßp©ÿJ/k`CWº?Ü‘¿af®t•÷O ) HÜYyäø­|ñnþïlb|—5ù°fñAÑβmZæÎ×íýAÅfSi¹øg<–¶˜œúWvM‡;®9lå à'ø)kŸ~ÈOY‹üôúëü„!s…Ûg@ÚW2v\‹y /ÝKökùñf¹比v¦<¥‰kþw4\O|Â)ÅS_\¦hõÙˆAÕ(Gc.ìø,•1Ïû®­Uy6Áì–9ΙûùMÈÅ—ü/àºK½+°t‘ZkÚäWà4ís«J÷>9$nØR»9K¾nNAØÏÐòïÛ2Žú„_üw'¦µ&¦[X@ÿ÷—š7”7·ø¦«À¯éÓUªX ñÇÿZ-äÖñüaó^êêþµ¹èËš†;ð -0¼Ùrƒ¬<­ûÛŠBûÀéÍï¦:ý5û+ ÂLZdÿoŠ`^Ë>¥Þd_Pæë€ªèíïúÍ6Û–š õóˆ¯ë>.épåÖï¦)y’öÿEi\a³Ò¸ÆzÁŠóêieŸ|7„`åþ"Hã=Õ&š/oj¡K•°ÏÈTÒyRŸJ:§¬¼ÒSmU<çãŸ`ùÔ^×0­*nJ­guÿÄ‚ +lªR1ŸŸ×g„?ì¼`:tÆg>‡PÞ'Â5ùÙ‰Ç_ö5yðǟ̃w„œÊdBur.•P^X\¾qóá´(=½°)¾ƒ8¡æì‡|óÇlB½? ž8Ü2 ’M DòÏPÀI–>šÎ¨v@¡ü“w”–9R.¾\³§<§†n‘Aÿ¥>ÇåÖ—;< 5Rã×çŠÆy8ƒôŠJ×ûÜ~+»DÛØ=ŸÿÁø€#ïÅgÆÓQð!y.·Mô|x¦‰z_¥†Ú[#Ú¨ÜåZêZ°© C,׈ձA@Ó%09·¼¸êL¹¸aS0ÏúŸ.x.ë%ú¯0Ncí›ûå$ÅûB¡—?»Õéq‹cúåŸÓãfcºM ØÞ¶Ë—/Ô2ªðx”—¿Û€GºÊg ÐtLÊ«ØwàQ…ø‹7²Çú«g}EÊíŸùòÞ*qøú‚”³T_ S Oã¾=͉›öaÙñŽ”F{ã¾ù'åV•ª+õ\v¼×báÿ7sö°Û­iÆW¿ðí‹)ÐÝ|šçùá9˜×|íuµ*ù1=e_HO¿¿ž¶ôÄ‘ì*ÅÔÏ9U UuCw`—Çýkõ¬Ï|ñ^{ÿ kF_j9ÅRŸhú¾¿ÏákÞ'äLJVüøÇ4þª5‰ÏíÎö—ö Îû`;U¿_×ý=UÎвÙ^5låï=R:…~\óË ´O±Ý?ÃŒ¿L¥Ÿ®tÝl׆u³-0^RJ”?¶´»Å[Ò¡üêé‚ßÓ1W”ŽéþžŽkSħ•tDŠÈÏ‘‘{'ë¤"¤vK„Ü^õ BšcB¦güJ¢-¨5MpÐ?±N :ÃÒ&)ËdKÒà”4ÓL ’­aŸ6LjÛ– þÎ9¦Ú endstream endobj 132 0 obj 16368 endobj 19 0 obj <> endobj 18 0 obj <>stream xœÔ½@GÚ>¾BH»)v0ŽDÇ=ŽkÜ{·±M1Řދ †*º‰Þ{¯î½÷–b;½çœä2K†|ÿÿ,8Žïâ8ÉÝå¾ïÇ’¶ÍîÎ<Ïû>ï;Å,ÂM°X¬ç­}=%oìº1Ûsi3=Ù€~™V ¦•?Îå¼LX”°ÇÑ‚ç‰Ò— ¢ÔÌh2uìÅÉÜ/LætO  ðei¬Vk˜õ“×à3sƒY –¬5Øl°ÃÀÊÀÞÀÅÀÏ Ì Ú Õ@c 5(5¨1h6è648jpÊàšÁƒûŸ|eðÁOl6û6ŸmÆ~•=½½†½‰½ƒmÏvf°åì(v<;•­a²«Ø ì6v/ûûûû:ûmö'ìïØ?r Ÿ7äN2|Åpšá†‹ Wn5Üihmèbh(1TF&fê  Û§ÛìÙ;cÖ¬ÙëEbyˆ¯·Ô|ÞÒ¥KÍÝäæ˜oð”øz™OÅ?Â<Dâ@Ï és+OOs©§¹—o€§ùú]–ö[wn6Ÿ¾y§ùfÏ Ï×sËP·_ws _wÏ ‰ç s/QˆyÀ؆¹»(ÈÃWê+ ’Ì1_+1w5—ˆ=Ý}ñEž2wO1s`¶¹Ø3$ÐW"Á¿Í}%æÞ!®AROs©ÈÜ7È= Ôƒ¹=Þï% ’š‹CDøx >‚‹²I¤÷_±ÔßÑræ±g”ú¸J™ûJ|ñas‘>ÓCäʼͣcRWß ‰¹ÔS&eîãæiîá+¸Êñ}qQâßÑG•øyÿr÷Ùæ!žÞ®!ž’Ñr™ZùåýÌ{kW±8@>z­hô¬G÷÷•J<¼æìô t •˜ÂÐ|§h©¹…ùOïÐ×_ù¥½þµÜ"bžØ38Ô5@èÊ<®wˆ§«Ô3dtçÏ©«Ø5DŠÛÅÃ×Ë+H$Ý Rxyã&öðuw Xë‚ õý´pw 9¸º‡J=mDÞ¢ Oÿ­"©«;~}©…»ßdì·Ã£½›Ûk5z¡•»§‡o@€«ëh‘[]Ýq™kǾ$í=sëØ-lp³x[=VÎÆÑÇX;vtýè©{Fwíý½ñÑÍÝûåÒ£çY~n»çú±K;Éú±ßîc§ŽÝkûc6ŒØå„±à*µy|c.ÛUºyô%wÝÉb¬âÆ6ü+Ës´,ÑO߱Þ^Âc´ €Ñk=ÇŒžéýX —6ö°íñÛã:vµëØVèØ—b´`Éè§âÑMƒÆö>VF(Ó A£7z|÷ãï2zUèØm¤£ç†Œ~Š?KúØå!ý]GD®ÅZy»ÝŽu ‘‡ýÎõbO‡]‚½,7†xïÞ$ñÙ³Yêkµ%ÔÏzk˜¿Í¶ðWÛí²@·½kÍt|k–ù¾Å³_qZòÆ«û—ÎyÍyÙ›S\–Ï}=bż©Ê•ó§©V-˜¹zጲÏNö7•~j ¹â‹3ƒ-•εUýýüÁöjúÂ᎚á‹G:k¼t´»Ý?ÖSÿÁñÞ†OOô5ÄÄ«„±‹Ø@,%毎„%±‘XF¼IL!v›ˆåÄ\âub±™˜GL%¬ˆ-Ä|baMl%Ó b±˜AØÛ‰EÄLb/aA¼EÌ"ìˆÄ:b11›°'vë‰%Ä+ÄDâ9baLñ,áB¤1D8@¸éD,!# 7"ƒˆ#äDáNdñ„‚D‘@Db“Љ„’&¼ˆl"‰P!„7‘C$‘„„ð!r‰"о ¢‰PÂH%ÔDáOÔDQJÜ#jˆ3D-ÑG4ùÄûÄMâqŒè&ˆ*¢œx›¸@&zˆF¢Œø€¸E\!޽D+QLÜ&.G -ÑDTï—ˆãD?ÑBÔwˆËD q€h# =qƒ8K ]DqŸ¸Jœ"‰vBG¼G\#N‰¢ˆ¨&î׉óÄq‚8Dœ$Þ%>d¢•Šy:+ƒ•ÉÊbiXÙ¬V.+•Ï*`²´¬"V1«„¥céY¥¬2V9«‚UɪbUc÷_˪cÕ³X¬&V3«…ÕÊjcµ³:X¬.V7«‡Õ‹B?k€5Èb`dbfaecg`dbfaecg]`]d]b]f]a]e]c]gÝ`ÝdÝbÝfÝa½Íz‡õ.ë=Ö]Ö=Ö}Ö ¬=psÛý¬e¬FCƒö3ìFö7†Ë û9s8Å\#n÷;r%ÙG- ž¡ž‰~ö¹gýž[ûÜ•ç×<sÜŽq7Ç{?ý´NMX5¡åÅ)/¿Ø`ô¼QÇsä=xiÎK—øÓùÝ×Lü›±…ñM“ZÓW'q'ͤŸtlÒÉI÷Ìž7Ûn–aÖ;yùä]“Ó&·¼<ùåÅ/W½ÜýòAàšpžPca~Çœ~eÝ«ÜW'½ºäÕôWO¼öúk_;?ÅhŠõ”‹¯?÷ºåëySSO-úý´Øé§‡Í˜4£kfôÌ£3še1ë«Ù†³¯¿a2ç¥9¯ÍišóÕ›sÞ¬š»tîóÎóšæ‡-Ø´àØ‚÷’ Í,Z³h×"ñ¢ûo¾•½ØfqÅâCKÞXrpÉÅ¥ã—v,›¼ÌbÙ¡å/-ïZ!^9qåü•WVY­ž²z÷êº5ÓÖ¬YóáÚ²uëŸYï²þî†Ò¯nÌÚd¶©nÓO›Ã7·nqßre«ÍÖ÷¶mÝöýöW¶§Y¼hѱcýŽ›;gî<¼kͮ˖‰»ÍwgìynO‰ÕD«fk/ëlfÚ$Ûî°ýhoúÞÓvNv‡ìãLŽ8.p<¹oʾöïÚÿù~äœâ<âò±k¶Û·oÜ-=O#ÏÏ»^3½¬¼‚½ ÷oo•ϳ¾F¾Å~†~:¿¯üeþ·ôûƒV‹Æ‰öˆŽŠóƒWׇì–L—œ–ZI? M {)¬+|~øY¨ì¶$a ¤P g<„‚îÒ§ô,ZDÛò‘™’ÛP‘˜Ÿ'œ‰j ³â  @ž)(ÑjºÓ(-rS‘U‰ÅÑÙ ÈE)&é±ÚÀû"o 4J©…"P*Sx“¦Î”i @IÃÃ%~ !]ŽÂ)‡…p=» !/·"ÝßhéIGXgï wÙEô«ü¬ôÜÔ<@Õä(„(•{¢Uv‰”úhI» e>h¡`9Ð[–ߨÁŠ€­BäI‹H…=s’‡–tȌʃ”“Ÿ9]ë Ø¾Yp‡ŒKsûF[Gà;Zª¯ÒœZ¸Å¦_…sù޽%{5wûÛüöÈ•wZ ¢½r…Y¡Ù¢y)0­*Ó•ÝØ¿ØÁ.ÜÛMhï,Ú VPhâ9ÝÛQTß"¨®ÐU× F›jØ·“ÅðL>Š‘q'Å)PF˃¼ L\Oì¼'ée¦@¯ÍnL­I5Ñ¡#2ò\R‰ò+$„,´ÐÍC6ó_IH´KÄMªÒ‘»3äÙ hµ•­}ð98ÝäsdÞèPâËÔ¶  Ñ‡hüæçè%a¤ˆ÷Ä,ô2âìß¼ÆÃ«¢#L(:qW÷çý§¯˜²‚"úY\Ú}~— ¿Tóá´ƒœ"Rž’ ’å›×'¤Ï’ iŽ õv…i™š²Õš£v¢¹¤gƒ8Ï?;9ÃìUôÒ…Ðàh›¾¿I¸„,C¥Ž–‡‡¨ƒµÄúmøä ^¿yhpŸ­A­n˜­gÁ> +¹"÷`Jq,uBTŒ½†ÂLÐt]_v¸Ó k ë=lmN3^ÿHqëêÛJ ÕA%‚¢à|u1 Êu%å-ÎU»vØŠ‚…ÁαÞ)Ë©¥þï¢ \°.:j=ãn ´äÒô辨ýª³¯³§¿ô86 £H>õž|h Œàc QËåÊå"¯3Éd 2ù ¹õ D0˜—D3ÖdÌ«2°ØºJÁ ø:ù(Væ/Ãw3U—Eéé9úÈ2#p.½lÌ› / üD8™ÍMNމKÁRÏ4¨Ó¢3)^qvhhF°ÙŠ=vë­Üï9 û5‡K@€©³¿ÈÎ7  L&«Œ)Ê–s»“ò“òcµ1YRàB¡·Hÿâõhñ4È…;?«ù¸gPÐ3xºú"8 eíÞu¢"qåNªœ ½9¡Üx™\Ô "]®Ù¯uÊÞŸzYÓËŒê5G-…6}á À}_lîh¦ 3 NäϤÆÃzõAúù#Ðì-îÁll½y—¦b󛂣׸˜ø˜8µ§µ‹cD"Å»—0 $¥&§'S¼K‡Ðaîâ:—ƒm‘ya! u(0õRVŸÂv’wïo\| ÜâÏi›õpÜ£ÓÞÂwù®gôí›Ö%žùi©9À´bÔž)I°^½‰ñj-¹536—©_Hòh;ÆK¥"Q™´¦¶¼¬¶FZ„}Þ!UK¨žF¾z£ÚûPõ7cÞdÚ {û0n¢4:Z«Ç‹Ù¯±ÐË+ÛßÌ8+ü‚|ä®`/XÞc -¯zt«ôÌ‰Ì j‹½ÓºùGàx{”[‡|8e\ž….5¿Pk†M|¢.—¤lëˆí0ƒä‡w¾}×ú2¹"|õ¸k8Léj;ÝÛ%ónÔûYbîŽÊ8Ø[u¬À£ØÐ">–¯àj^Þ- Ö¤õ2òV\^ôÏ>Jµ’¡u½Ž\“…Ñu…‚nð(Úû¤#LtõëRíh8q|ž^V¬*4:}nºËT‹dˆŸÀuŠÆÚ~擼Fy:)_ ì)EQ‚J- ˆ ”‡S—W ï ©*r ©P œ(”I®°»ÖÚ^T]-èîæ,!yÉCú–¼…¦¸•QPÓ°áh#÷F[ùShC;ñÒ-¥ž‘–rcd¦jÓ´©¹À´šþª‹Õ¸Z5Ã$‰oEG/aª©WG.ÍP`'Og&!”ÉË‘UÁ‡«8#§¸ñh§‚[Yå:hˆÍ3ö²c1-.‹däښȨÅIcaðÒôF-0õ}­°à.I ÉÈ{c¡'®l•ž^¡gÑÁŒò*¹ IZ5u²:Q=囼sâ “ Auò4Íé”Ù)ɶdºo |u˜¤Å§Ç¥Çfɳb³@Ðh[áKðºIíÅ,M]:5f4—hY7°fó1]p-R¹‘ŽÂ‘0,ö“’Ö3 RK†§º§aaÓl -HhŽv¥'¦%¥%¥'™f«ÓãA%)a–뜠s=€Þ€¶&µÕWΟî«Í6Õf¦a–­E.*n{J^"PØ•* ›ãMè%dbšgTPìîÓÀØQ•ÝCëX=€?õ°iHçóÁƒü¢wsqõ(eäíø¢P0 «YlÒã<#ÅŽÛÖ€ À¡BÜ/oˆkeâ‘k£~›p V¼ñÀë(tŽDkßY WAÖæ‹í‚Š®œ>p‹qiª6úÿÓ±à2ÜDõô\ËË{‡I-tÈÈwÇ®q'÷G…«â³+ãêæˆ"¬WÄ¡R±kgàqHœº _dÔ‡íu·—’lŠË  Œ—D‹ç¡“ÅPªè˜‚²7ÉÌVeaÇ”]_…C­8“Qt¡WF|0Հ̜¢ÏmRÒ•ž©Ç· Gí$ëÎ]6ŽùYܼÔüT7äªp@LU¤Enãh-i‘• ŽPôg¸5ö*<Õ›£¨c{ŽÓ&Fº÷àôw˜øwçy¾B• ÄlŠ+ìBlA&Ô*+B[\t–€zc­ƒ…T^^Qª/ËHÉLÑ“sR²†ªn(묲ì$ÑœŠXÏÐp•/ð£xv=Χz:Kžð öf–„uš5á—onÇЛ8VHˆ ‹’¨D1a€ò5u 3°£élãz¨Ñ}xœž5¼ƒÉ¸Ê¸G’J¢Dĉ£Ñ´¶ š?ö»[´¦@W˜ËdòR ™Œ€NF&ªºçÔ‘>-†ÐÇïäå ¤›Že ²éyÃÆüü”\ê’óc±$ •ZÛ¡h‘ t%¡¥•Áf~äÏ®+jH5Õ¢ùJ².97“+**4$ !>J®Ò›ˆºäM hêR1žÜ•9d(Ьß÷šb‚¸hi ›:Î/ÉT _×’¢¨Ì‚,¶@/¼_ø™għŃxS Kôc„†ÛŒ—².ß…Ìÿlý*¿ =›I„VåD8 Qƒ*¥U FUˆ–´MSæv 6“ -;W£©,ï.nTO™Ve8HŒŽÞÃxe©–Ü“ª,§)˜IÖu7–ôêX‰x‰y“`Olìî8|’HK§¦E–€vSèFÂg=N®Úm¼ÛF ?æ[mœHµÄ‚ºAÆ¥ÙÉ|£­•L¢n Ÿ;Ã:†À†o ¯ä'¤¹*űû"Mƒ™—•š4€êȉqŽ‘÷üÞ†& | ¾°ú³i;w{;„ l Ûû[ÞZ‰Æ#¶ãö¥{÷—W Æÿ¸a {?.a°ç ãHÀ؃°ø`µ½ˆ>1A&ð³ä̘²”tÓ˜ÒxÈ幇ìée䱔ܘ¦åKMÌQ3šB?W’8š¶*+ÔHǧ$ËÈ ZyëÐf¤‰çz9\8²œ£åÞƒ…¹5ûuóråRã|CÕŸmôï†iz¸»ÞÜ…ã®Ðã:Œyw‡7\ã¯ô±‹Ü‚åÛ*4N€ë>mùìØ áàà…êk€Âby"z͘f1skp¤¶^“š™š%<5œM\µgh§2ϘºŸ__[Û€ÕØò¦Y´; öôW÷6 x³Zƒ̾¾Ù—¢×àKhrFo¡7Ñ^d ¢éÐýòPAÏ—BÞ4´’^ʯIÖJ’=’–ÁûdÞA¡b@yI.jjÖ44ë+’G_+}ì ޾̆[é·ùÐŽ[2ÒÒ5mšÄh”aê„0`Š<¹ˆ…Ô)É $›&d$e7tÄEv éuh˜NÍÚ¹fe¸BS(ð/—æbó¤Š ñì—ܸ{µúÀ°¯·ô¸ ®Êú쇜{ö”£gK™;OѳàÆÓ6üTEZX|P¤¯iœ,9Ñ4áþçØ½´îD:‡ÅyZ«á,ì§8¯ŠBn¨h=æ†ÇÎ l>ƒoÈ®Ñk…¥Eõ9ÍL0{ èá¾ó,(:φi°D[¡‰ÏC1Þ…DP¼KÿtìÕTúažƒ%9”ý´‰s‘‹äÛ˜^¢X=}í:‹¶Áœár-Ñ´âØî‹%G€) ä"‡‘O9ç¸ÐgøU.'^ñÑ7íÆ<—÷Ð+ü ½§ÀIjȧ}¿Dê+à•ú—ËZ²4©©YžKš€T³ì¬øX‘——WbÌô •Ýp¿—æaך MÊj|ýÂ÷Is–æ­äìÊbRˆ0ѬäJ%e¡u åeuu’Ê@á/ Ín²›pC„@ïáÈ;ä>ÙX¤ðþ´ PEFÛax|¸¹ñ:]²¾‰cMØM“ü¯5w‹Ô»ëONC¬e[ænÓ}ÿ¦€÷!"–†lž4óÎfÈÏß:ÿí-ßA4î#| ÿÚÞ o`EmÛ¿Ûj»ãïŸ-ë:Þ/àݼşܻ¥Ž÷vž¹Øí¼ihÿOAB‰I h ía¦°Ûa.ߦœÁŽi6½&³àAz=_ÓQt3ç$¨5-“•H%2¹4B;£xžMŸøGÆÓ¾Ãõ¬Oà[Û.øêbÚq+ÍâìÂ_#,¦9¡º›6¬aOØ'Bùаàˆîâàw7OÁ šQpé›ðÄGÏÍŸŠÌÐø«Ë q¤«¨óÀ -Fls4;˜‚'à0„'ÆDLj$^‘Þ€Zíx>w¬èdi•°X_™W ¨÷{¡¸1Ò£qk¾ø ?0$8 ¨2¤¶¾ª²¶>¸*P8ꀡÝ8é܆ž?¬àOãêá$Î÷Gfrëà~Înn ÚÏA¦ÜúÑfãYkhÀ C“8ˆ²þë‡8ǹ0€'áãÌF=³Áâ"ÜÍgΛÄ-Åe2©³‡XÌ'h$ÉžqÑØ¼¦B6 N¦ý|þú™æìÀ$Ù‚ù1J\xöõïš ÷›^I'ñ!›ô­qÑ.Î¥ÎøZq¢¿`_q¸;pûŠ|:¼jEeÊ+îj&ßHµí—|O)ÑDîI¯®è»IÔ¦÷Éëùõù-µ5ºN0šb[¢ô!b=w™‚)ä]u¯kñ[Ú:‡¿ähx%èGšš.RÍèKþ§»KÅ`ØêíµRÉ€‹Þø|NÏílÎ<°ßþ`e×ìÙÛ\QÞT/Õ{ÇÇ¥¤Ä â’¶öTl|VvcMËáVæEÃÈ6ÂU…é¼åLçKMÝ'Ñ9Ó9ɯLÖúÎ>ÿLç6ú6Ÿ'~RË«ª†ªXà Xð.á[W…—Ïn+ODô @¬FôL¿U«óÉqpt·4?Ò)ÇQÐu.| ’‚ùw{y"OgóE‹œ€Ч²ïã°áz¤>®æ75@ŸÊŠºx=&9 ©’Ê–.ýÅê!sïpm[S½Y&HKÉJ(ŒÌO¨Å¶]:<]Ϻw ¿E«ø›JBë˜lü ¼'«Z£»¡×U÷F·o”Õ]*¡òÈ­)ÁñAò ¹Òì¡Ð&l”K·„_+‘€MÂ۪ȭF^#¯Ž?ŸÂ¸5ff£š•Y­hü—ƒf"g+9ë*¼¢g=¸Ï†=L¿Í–¹™Ÿ™—‘‘V¢)ÎÀ¡oiŽÒ_Èô8ûÅJ#b”1ª$WFÆÖjÉ©¹`€¢¿$±Ž<¸÷ ý^ƒøäâ8ïP 0æv¤WñQ@w(¡P ‹Øfû[V—ü8ß¿ØPY\S_Z^Ð ©+VC+mÞ¼È3Û¿zÀ3ô•vÀbÓÙçöüý“•çox‘ÛÎ 7; ŽuÕ]Qæ™ø»‡b³eöÖ;ê9QÙZ¸ªÏ¤¢SŸ?”ELÊãžQ·^j ¾©¯¯ÉÛÁÊÇe©³€§Û´Žq›­m´Üç.wÔF˳·ÎÖw¿3fߘiçÙTüóÛ°W¥OÁçÏÃIçYt==‘?’º•Nå¢I†c?˜ú»I—_gÁS÷Ù´¾ÌÌôÚ³k°X.\7|øiûMpÛô›e·^³Þêî%ð÷Uú+6”&˜t|ÕÒp PwíY¼ÒiÎâùB´ íæDÑ“˜.úÒw¬oÚÙ§7þ³ûýÅ÷jÒ0UÅpÕOä͸Þ1(}Œ¡4qxÿ’¼,¬¡†Îb]È ÙšpY0X2º½&4p“œŠ&ϧVeÕ–Ô–hÛ™~ ¥Ë%åJ·èåå* ¥£¢QIpÖ–Ô‡PªQóéL¨àœÇÂ_ëIz ²Áû¬j¡?>ikïx^5æ]‚oÀ÷ø'@yrEÌéÐö=‹÷l[+×Tx Kf`‰RæÓzùÖªÎ~agÕqpˆèª/“å;ë(Þ½Ký•­‡'½³ýè›öÎ oA XºK›hÒy­·ñ  Îõ:[x+½CB„"åf c4© 0 0 ×:{9mXè3mÔ*ñZg|ðz§cUèAÿü"“ågDÍâ’ Ñ7Á7àû‚w«Oל®k¹z¿lÜy> 7»5<ÊöPD€0–©È™ß/×ìN Ìiûa“ªöâüzP JŠc>ÜW׋­y}ißY\‚eìð[=ÜXÇÎýPÿ &Á%ü¼ Å­ý}G(,m,h -²EZîÓlYn¨77îXâ^Z_Q\\QŸ¯,F&ä€lª¡¯nðä€í§Hk‰µ@´]æ vHq6ÍÝÆè'ÿ ŸõSHeÐC¿<í,½Roo¯ºeÌû”€ü×éÝÎ\tad7g;lBËIÞßnÁå¸hËY>ŠãÂ8øçaíÁU÷Ùmh#ÿú@]Ukß•÷›G{XàK^_.xà6\¶·!*Âäm‹jŸš5[òVƒiàµÈ%â"‹@ïõ»G•tž>ö NÍüý#¼”¨”HeºW'jjÔ× 4Å^‰º"ˆëïKì„I<ÜÅ÷ ô/—ÔÕUTÖÕJ˜Œã?w,Oá;p×›ooÙ_°sÌMF¯!g í¶*{a‰OQx—çl$4äÞÔi¯¾È XÝÚB3ø*t>§<'Ê›z·6Êe;¿i[˜O!«eؘìvÓõ»Bšù¾g£Ž€(hõ.|é’9õ0]®pÙ°?D* •†V×”—UWKËEÌP”1¢B›vö±'põ‘c}Œ«c~ÆËþÄÙÌ”Ãþ¶ñ ™ ™¦Iiñ™±š˜ÓÀª šäLEiXI< ð‘•nµ>ÂÛœ¨2Qb¼I|ÜšÙ.;pÍ'd$fe¤¥ffŽíh½v†‰èb®m×ÓsêB°kÅ1¡§Ñ7ù>\g4ÃóÉD¦ªÌЄY¯ 3›b›ZwaIˆ6²5ÌÍ4iâB‡WW¡M.6k­…5Íuºê¦Ë‘Ù&{×x‡X¦S’ó7ØcR⡬Te‰®ªY\稢ùèk¾C¯¬\¥¾ønq~r\‰`üãâ[áVXÐØbplÔõ1oö𺄵Â2 lM“§R¼wÒ“€Êl Xlí°ÝÊ Óë ¢nñIË!û‹âë ”¦–§v¤L+Å׷ܸ‚#áÚÍö°HF’MœS¢rA+“¡€¼ôá9+¨RÆMòJPF+•aÞê€z Fsy¥9éG¸ÐTFäϧF^™Äß´ßòÜ#àM†v—°w©ÎÝhÏü×ß|Í>ÿ$¨@ljO€O½ÿ?ܪhQõ%‡°B˜Ú¨ÖC‡J£‹wᮻƼsõô"þEt“ ¶GGZ%c- Ö’V‘…àß½O~‘™d+DÅL&:fGÂÃÙÑà,µ$(åi‡(ÞìÄto_œsP’»š×Í=éõ™Å…Ýíu½ è"+|uâf C©¶¸¬Ë¾fÕêÝÁÞÂ@·h¯øåÔ&ÆùÆÖˆß+i½°¶ÚTÝ»‡ü’~†^äÆ^Lj-ÔÍN¶–(|R©¶Ùª:@Õ––Õ²êX‹ž[=½&I“e Í÷C‚«GÓÒ@âRâ“beQ©J@Ùx:yVK:›ËµýB^ؾ‹ªn³Ð[ÚÐZZQÖŠ©ôä´Ä„Ø„h5ví>J'à|²·UWÀñ©™ 9¥Æ¤Ž#Q6ŠäWÔªcc㣢#…¼j…**>ÜL¢Ð–U”4b~Ÿ¡8jdkpö56\€×Ü»ßZ~ÊòîûçÏÞ½³ëÈ[Â?þ@£Í«§Y~Y”0¢6¦´S½5µÝ úèœ&hÜÄÌ'[,G¾Íþý6VÝÎGôö9²¿×Z˜êËo® ôö òò ªki©«mŽÿQ‰<€q2ö_û„`ÞŸø‡ö!fZœt=¹ÚèÒ]h‰óeýÿ:ÏûãCT1ê8urPòÃüf–*ôQðh‰Þ'ƒ2b/“ùô×’6ê\pQ— i±)щQñ¦²UB Hête&ÅÛ—' Ê’˜íN‘G ‹Ú#qµ ?›ˆ,r¿+ê)Ë—x"]AL¹™d¤e2ݰËF€wq-;qGìq8È }T8^€â:8¡VRaÞ/…/ó† 8‡ï¸ÑC¼¸/½¢.¬=¡!åkŒdn4ä;žŠµ€(z¿/ÅKoô Ìw0›»ÉiGP±¬º¦HW›"L)æä‘€ô”ô„êúò.Pt1U¶23 Ešla²ÈÛÜÙÕ ì2Ý6°ÿâPSñыަ½MmaÇÌúAgQKCu…®¦úÅëF?äï,¯¯Ôê¥Pòmþ^^í'k*à¸Á;‡ù™T¶‡A¹WÚÂQ'ìßüv NºÁþj:_“ž“šLÛ´ê`q˜Â7,"=G$TÔF•'6Ó[ »ý«lÔñ)Éjaå9ŽCCV ûk«¡¢ª»‰+pwÅÑ«pOù-æÃ˜·ú}vØ–ïÌ· "f7@åx׉ˢ²ÂõúÜiˆ³ò€å…¦š‚ÚZa__íU,î Sò“J¢K’ªÀ!P_ØÚ="øiªI?÷Ôð›übyALa\©:#QˆÜ1u£¯´¦ëýž/Ö 2Óó²²3(ÞÉ{ðct•?kÎkæ+íºxÿ6c¯ûtïæ‹øÍU^v¯nºÙ_R×~¡éƒž~aA¡>§„q5Ì%¯¬8´ëÒÝ;.Éñ[+½÷>¼¤ópý‡ÂÒj}~9“tK‚Nƒ,˜nè@' ކJ:¸¸ã£Ø£cÁÄ{l¸nãï`Æá*·0=—I:r{ZD VÎ×àÚ´ö&©)äÀeh*÷hÑz©®ú@ž©í•’u¥Q2u‚"F!D†HŒž…Á±E EL˜¾$»ŸI„'ÊȾ¤âˆ#Ó?GkMÐw¸œ«QqV£uîä/}üLÖŸïÜgÞTŒ~:ƒç|YZSŠLõ‘ù¡Ê˜¹\€¦¡éDMüÍcXö  :¸Q¿ÿ>iøáì6Üûùªer‹µv;$6Àxx—K›}NHê“˧ßëP”„D($ª¬(­B˜¯ÊŒ±”ÿ¾@Ç]އ.ô©8"¨9«ÈJí1ëÉÁÚÊŸåàÃô¶26,B3øðÀç >ª¾Ty |Õœ¤MêŠÐÇé UVTRY©Ð…FÉbÃ…nŠˆDïp8³B7”­Ë,¹T…´L"‘†JÔ™ L ·Ë”¤Øú¦*2܊óå™Ñ84QȃEEÊšüÜôœ a‡¶8£)=uz¤u`@åæô<˜K¡T Ýt[=Œ«e ð«+lz=‹Œ¸øôúÔ¼¬3º³:}^^aV ò³â’’’â… 1I1 ž’—Dè+Kõ•mžuû\]¤žÁO+…cÄk”9WÀln²2zKJb¼U‚­©­Q#J¼Ç–Q1Yšô´Œ 0+/]r¨2Ua¨X& vo ê?ÒÞxµQP¹øí ¸#µ û˜;åç¹z<¿‚ÿÃ_iÃq&oæ ˆ'õuÂòÖ!N¹Ê–ƒÝõ£nψ,òñ~RƼ,=ÊGÙP¾Ž,Sc·F——”ÖW ¸žbàO¹4øuv6•jü ¼ <4 N——Äd*iXd”,"OY%„sfr~nåBzΨÐi6XhYˆ$ô—ËÜ`rÜ`²'7XQFsz꨽µâ|û”¾éÊt×¢pMøèÉŠààbyy^If¶NØY\’Ñ” lCÂíãd  ¦$e¡•ee¹ Åq:AøPb%8Ô’¢MìRèbKòU^\RYQ, Oˆ“ ]#”I¾Ià«Ü®úæÀÖè¾ÔÏ›’Š’:1õ ùÿG|²B‰á8:Æxz)Ì,…ê2˜^jE…KŽF4æýž/ò/ ]>px÷€½ 9áŪZPiÚÕT{ ©F%OJJJHDD©#@¢—W7èôG­»Ö-±²_o£|{«@ŠA(Þ[ì6¯ÜÇ/žu®ôÔ>ß@[/_üÚ™š,AQ¡¦Ra%â©4Àê¤óí÷¸y@V·æœ€7<æñëÁ!ÿ>§&_¦|ü¼<=ËOîø6E•ƒ:ª½¶¦]ðOÃêé­ô߃»±| $™~8\ãω&;å;•z ‹ÄÊ&ñ:dnÒÊ=_hŽ(OhÆÁï‹ï¡p@5 iFTDæ”Qþ»øµÖyÎ`;…(çMk|¥ùu!‚°¾øXÔqp‰ú¬ÿô•ú2upõ(º^ÅÀ¹1üß—‹ÆOAã¾åørá´œsšû3öLŸfôÆÃtø"<óÄD7$ÏÂ#gYÇ.Âþ‹ìPHð‡ì¿øªKÔÙLûA{A{ÍW3L†f}QÛ›ÛLÁ º1¨û‹¯LfÌò¨öÌw¦ÀO½?hÖ&öŽ_Íròަ`_¾W­+7Â:þs›—¾µm˲¥[/¾w÷ü…»L¬® ~¨IŒÀGÆ<Ùðrø:ßv‰#ð>zy]p_LkâûÔp“NÅÖJëEíŽåöÀø„»YÙu×ïöÀEáàä´¬¦xIÈôÞl8îbgõÅ6Ïns]‹ø´Ùm0ØyÔˆ+ìå_ë\‚fy½èy‹Í+ÜîÕ ëK˜ L·Üƒ&ðSß«î<¨¾F7+¡˜Ä:ág_ù£r|Ô Ñ_„Ë9;¸ˆi†&.÷-?“Ü~ø¥2™ŽIé>{þøyc^/Œ~‰ü§f8§Œ»:+jtÀÕ'$OöpȯW‡ŠH4m‡5š¸¬|O¿¿°QR{&™BÇ~« ç[iþ¢ÿb­RØ[[ZRPœÕ‘ŽµÐ–Ñ™¿ýv‡ ׆k‡ùÕF§îÂïïû ×öµ»|`5:5éuº<×ÔuðXÓÞ…ËݶŠ’cA ˆÎI(O¡x•$õlBf“Þ Ýï*‹Í.K$—%—Ë‹Ci°,LìÒxì›;÷!ëhè{“п&(og>~¯ë¯NúdëÉ×6ÛÛ ¼böƒÔè¬Y i¯cbb#úÕ¯y©ÃÇFÃá‘Sáä¹äÊ â“¢ã£QòˆÌÄogT´K<3Œ:’¼J] é’’´ ¬âxÇíšC&pšÍ[£T»âÉ&<¥ŒÖcÁñndŽ@­ænKLÂø:ÙªÕò¼ˆ e¦ÛX„œè•¨T+#Â|b,…ØPÁ-ËÎÖ Þç© \U0—9€Bøp¼ÊAWGÓ˜µGÕGŒxÑðȰ_á%J Ë’åHòMxkò¥!Y¡föÀÛ[¹ªåæÕkËA>(LÔÆ•G›ð¢Ã;µ‰•fG@m]éMÜ‚ßÒ{0¦ÖÑ^ü5–»Ö®>¹ëÆõS§®Þ²<¹j4ós? “‹oþº«¤Aªû­®(Ñý‰³ÇÃZZÐâ#pÆîä»W˜!òåôN>ŽïÕ€ŠNΪB’<ëÓ°q‡“ÈCQ¨*)Òæ¤1A€ %3%dPyåùeåJ± œë'–R¼œÈè˜ððIîu¢ÎºšÂºFA–~T5— 5åå2âƒØ¤¸Ø8ElTR$ ÂúŠªRíåJÆÓ=‡YyôW|xö0Só¿táþýÏwáÒI]0„_/¾º£Óó˜•iFB~d*ûŠ·«¾&e¤€øœòzmIkOmKe( 22âÃäa Ab¼X‡Ÿ4)Ù„É6Ä'RgùŸ-ðŸ¦kf~ oóÚsÈ÷‡8hù£1ýâŸgb†pŸ4—f“ðÍ9ƒ$zs>®|ÒÄN¦r3NÞÂЫžÍ­ Û ¶ß:Õ*ˆ›j§‘èD•>²~pôÈÿ;“÷}Xù‰Æ<ñÕ'Õë/É>žøŸëÿ ¹Áß¹?ã™ÿt‹NUuAŽ~§ÐÅG¾¼EO9¦k àîð•ìÔ‚½çp$e8tæÃ3-–9ÂâË\ IÐĤûzdûa a2zqßY Ç»]\.,¾ÉA‹èµ|d‡f£Y£af£ÙÐ ÿ™ gCkh…fÁ7ÑaŠ+oODæh1ZŠ&"š‹æ!c(€Kà h 'ÃEž4¾Žz‹dÈ_9q$åIGÖ1GxôÍð?˜ùŽQégŽÁõ7­ß‡/ó~vƒÓøÖ0o9#Çn™wù£#$zñáÇ1ƒ›9=ðÛ_’sè ~yz~Ze\QŒiµ²0Pnb±›,:£(T /Œb´n86ÙþõòƒýÞñÛƒÚv— ytO}qyͤ>ÇÖ];<Ä›½•ò†]A+0m*“z‡n”üª? ÖnåBáè÷?Œy_{Ý=ôuÕ]cÿWÞ«~gØsîï {ÞøhØ3ïYô€~ïçViQíGllž¯òOì*wÓ®µë8âv~þÍ)h2ýlœp¨·¤¹Uxä`Ógà p9âjÀ™Ð^y…ÝàÇ&~u³ííê|ò¶f™ºJÆ4©úýLѸíœVòï˜&#Òyój¯ŠÎP¡èPÄeþ:pæ²à±A¢àëåï}ùµã;Ƽú¿`œè¶ÇƉ¦üã8Ñm¿7N”÷Zø£5z FÂ,†»öŽÐÚC{ükÙ3¿ #þ…ÿàýŽŽœ}|7äÁeO‰ÿêùôjÚíi±é)xí<‹ÞvžMûàà<¬gú·q͇z#Þ¡ÿ©ø¶/·°X¾âÌöÛïœ=ýö;g– } Ø[îÚç°ÛjßЉýCÇ„ü­Óãnü¿æqç¢3pן¤ÿA…ßxš·´zsGÞ½¿` Þ„xèðT­ö_eÎƱ=fIƒÁ’ü|ÍŒLûSÔáMw€M4°{ĥˣ©¯{ £x†è~%©¨ß‘TþIRçaÀؤ‚º‰têù‘T.Á懓 ž‡ ™\ð3zmÿcè…+oü–Uøo@q1vŸ&XF±‹!ó@ó5Ìî1æ]ûËÌ›ŽîÓ·þ8Ò˜ìG}Ô=¾øIõwð"¹‘?¯bûGÖ?™óhýd»Ä™„w{øh* çòÂês³;><ûô¥P N%CþC£üAßÙÐ×ÿ`ÁC°ü¬?Ÿ°á „|…F“ 8ˆçÞ¿wêdy'4=cÛ½ÒÝ'J*„ÉÔ²§J•IÙ@uY+–U¾®¶ö6Âæ)Ìz´tÔhõ çþ]&Ì€nÿøègÎØþeœ¹Á˜ûß’ÿíU¨Ð7ŸÊ߇KT½Ë4ÔÃeªªÿ­eª6ýÆ2U £ËTñ&Ì~ðïšä_84ô0ÌÅŸ“³†§þÁ I;–«\wÓGÝ—>ňÿíÄ£¬0ú·÷º%wzˆ7û*åuÝúÂ&`ÚR&ðÝ$y¤•0ÁæaSrsìÃc& àž?ªÓ1ég;öWpÉmƒçÿè1KÙ;à`dëXc«2±aò:÷©+.$«“KR*.Ût¢?Áy ²§]F ˹)缫¡æ¢mü*¦ N9ýêLÿ‹ {ݼó4aùæhp8Ðã¢~¦Ã@ zÞ0æM„Fòy_§äh@¶ä€oúN¾#/1[óí÷—|+çþ±…åÐÖÐD¸\â5ÿ ¡äÓ†ÔF-zhÙêuš¯7ªøÚ~`̤×áØeú€+qw—:j¯ó1!<±`Äœ¡É2µUœ{‚3£œ‹ƒkëµUjj" "‡’s[ëìZ¤ÀÐUÓqšâíÛ‘V.0kå…ÝT6) ‹ŠS*T­ëcÒ·jȆχÏ1óåì!›M×C1«¾­$Ì„ƒ¿õ0²à‰Óç~^`ÆAÏúö_Ö2ôÔ¸ÿaž‘~WWhü 2|%øRÿ1¿gñ»é½ ¹0öéqÏÿmüî<-$ü?³ÈZ=ìþ´$ä!fØ¡w˜¹ý|§ôh ¨¢à¤*=kÍ‘’­d*+->TˆrI UÇ»$QhõKñ0¹ø‡«ñLüU·TõïtKåý^·Ô¦_º¥(´žöÚ뱯ÐÜ?½0jp½N‡Ü{_ÃÆ\ûoZ€éÓ íŸÈo³Ç’‰ ˜ä§þKy%ÞÜ‘UÐê‡æÿ·Äô¡—?i0ülíod6ìðÄü².Ü«7Ê[wêÓ–ÄÍû—ÄÝô󒸺?²$îyâóŽý›Œäú×ÿažyð“gÐIªz(ë<ƒVµLotéScÞB8ƒžôÿwwíAM]i\*¹¹UБÛÈŠ³„eÕºêh­îª»e¥­3¾»¸** EäiE´hx^ŒAyID6ò¨ÄKQÉd«b«ÅǰØÖ÷îèúZëwã vϽÉÔH„@wüÏî9ç÷ïu~ß÷‰äêôêÝ¥ÅW¿ªú]CŸ (Yš½>#8íS2 ì¢`“às">Tºm;DÇ˾ÀÇô´00`OÐHô6ý;D†£?‘>DØÁE"%–þÿ‹¡cS·‘¾ìÿ5ÅhÊÝwa0}…®ÿRõ5Y. òøÄ߃žHϽ.$8ÅGh‘’GgÐ;Ù –ކ<d›Á¯/¬ê/ „8ípÑ ¢‚Þ»%Û‹TÜA¦(ˆ¬šüü/i²#hoš^On†™ áŠ4šfÛ‚Ìœ)Ê$`"|+@!’Ÿ(MLL MÄ?ö綃t!­ÊÊ:&#£„h*ªÃ¹N€ì7Ê”â-YëH´CH{Çn_€ÍQ!ô•Çîam“{²aÊš67aäè&¶qrlã´+ÑP°Õ®=b³´Þ"ØGÔÓ‡%û6å|ž‘áE±0C {@@Œ.%è&´BB kˆàë¢Ãÿ#+á©@ÿÉ’æÎš` l9þ(†œ¡OÚ¤ g¨\‹oЬu˜‚˜U°H· ÿ™¸Øƒð¸ ª«mèÛ}à3,8ÕEÊtM>83½’–à-ž" w9íCûm ôñ ›G/ Ñ[×ÿðSCý±‹ÎÇ®ï‚Kg-FoÃx4vu¨4r‘3Ôê&‹¶ 1Þ~  Œ ¢É%A'¯Áàóÿ¹V^ªËiz'Ë¡>›¤xÂu7ŸàŠæžGc‰ê{Ê…h¨UÌ…Äl¶Óܹ0–ð™xz] @Åy´ï/ŽÆòá?ü +˜Ahó–`–£Ÿ°]¡)p¦Ãi˜ŒêðvÿÎØÎÁûÏg ¡­»Ñ'Œ=šöAÑòûÕùUgzïÅ´˜ù¹[ìíWú³WŸiÄ6HߣݑÒÖþ¢Û´SÄX ׺uzz½²%˜õ±ßW9RË-˜ˆ”Ä;Ìsx>5 -ƒ=fuµé1cu•9l2ÿ€fhîóŒ…%Ȝ՗6F°å¹÷–­_ý6ÿ8 CHÈöØk°ûÓáƒò¿íÜUæ¸>*Œåê&–ÖV:[NÊ;iŒ·€¹¶T¶O°ØN·Û9<¶cÛ°•¢;:ïnaËWšô¶UÚ1F¶Š1um)b{À³!oŒŠ>Äáb÷§’t#u­fS?w3Q8d˜ÊNÖêßk:îá7 yxã%P#Ê €¸óCs—Ÿ‰€ A$A %á‰xÓ#ùM—X¾ëË’ŽÛ.–&”$LávpüØ5GPš’'n!9kÑ_CÈ_U3.ÝQýuóPm>Ëð·e(Ak7ê7Õ½gÔQ[‡b¡À”‹Û_ô TbWÜ(|Vœ,ˆÚÏ~Ïå´±ÂR~*Ç(ot¤ê{r*å‚>IQâ‚^š¦ª ‚•§`säÉË,ygBž(éíV[s™UÍí¹¨“,l ÔlÈïìíBüP͉q_UHÛêÆhÕ¼ØêљӉÑpm9Ð&kTÌï±Dx½‘DŒëD"æéÙ¢R¤D…æY^ý}{tÔῪGì<»7J~îų–`Ð7ž½¢ob˜"ãÌt›Žz"°“ÉÔ ¯7A/Iñ…—¤xVL –â-L õT;wJË) I‡JN˜þÝ<‰íÑ÷³r¨¤ />6OAöÑ`UøF[cü’ö=è‚ VÉFyÖ®œoªv°‹•ö·jnrã±3úÙ¬§ÚÇY;$au'bÔëêvšM£Ui6h|ÈgE^ê’fAšWÎÛp>Í‹¾gŽv]:…} Nìñæ{?4wÁ&XÃo9‰U¿ì?‡†¬úíGcü¨$ðy1ÁL«k…ÊÆÆ¨ñ}h˜m¶-ô­l|tѺoÝ÷Ô;ðn“9Fm¢Ûj I€hŒÂÒtV-ìå)ì3Œ°”,ý±_(·¡oÁf¼…{Ø;Bo™<ÆIF0™üÏò™`×0Û‘}ìun"SpªuÔs—÷Y21‘r¿ýC·j•o«{­ÞSU|w´&,ê¼*K7äëг^1_yW.ÃJå÷ô®ìÂŒæ›è­¨ð뺉ÞANK@ðµy£¹ªÇùë žš‹¹/gÇ®BgÿuÑ =nõoµúp ‚ r ‹³ ŽkN”æ'_J6oîÊÍyÁú¶ÜœàÛ¡aÛÆNë¿Ä×;*‘¤š$Òxi‚”š,KÆv¹©‰iJßÓ5•E§Êœ·eFnÜÊ:ok£œƒ ûIM¥k‰S•Ê“ôWÝ = ˜xö*&ßÁ>ãW­§;L6ÑaÊ´l²Þ} Ž™5lÒ12TàãØ„½ŒM`WØ„5”Miý‹Yžó-½:rcZÂ%‡z¢¤ÆV³’íä°ÝCÀ!Wp3\’Í ÆSK„rÐÍÁÊt;»›{íì øö®‰ endstream endobj 133 0 obj 20198 endobj 16 0 obj <> endobj 15 0 obj <>stream xœÌ}xGúþʲ´›@±²ÁÆ 9„b:Bï½Ó‹mÜ-Ûr“-ɶÜd¹—qï].’‹Ü n`zo!„šJKBBH¿Ì:ãüþÿY8.9rw¹»'²´;;»;ßû~ßûM ‡0ægȉ¯X>u…ÔÇý9ƒ1ç0£Œ˜Ñ\´}ùKø/;x£ «RÞ+Œp(Q9š ošŒ¢Ž¾6Š¿ñÕQ¼Žá„¾,•SÍéæ0œ#žÑ0£‘F"£IF3æ-3Zcde´Íh‘£‘Ä(Ð(ÒeiŒªöí7:jtÊè}£›F·Œ>7úÚ裮w÷uîHî›Ü ÜYÜ¥ÜÕ\+î®×›«äª¸±\ÀÍäpµ\=·…ÛÅ=Â=ŽÀ½Âý€û9÷n¿±±ñcc3c ãñÆSŒç/2^g¼Éx»±£±±Ì8Ä8Ò8Î8˸ÌXoÜj¹sÛ'OY)õ‘I<<oÏŸ?ßÂ%ÄâÑ‹Ub¹ÄÃÏb<þ$ö‘úûŠýÓ,¶‹Å O±…»ÄGl±ró›õÖk-,×Zï´X+öËœ},¶ºøH\-¬$®b?¹x¢…»Tfá3øÃÂUêç&QH¤~òiËåÎr±«_$VºŠýÙS,üÅ2_‰\Ž¿[Hä2g?…ØÍB!µø¹úº±·ÇÇÝ¥~ ™Ÿ÷ÅgpU[¤r…ÜU&ñWXà;nYµfðžÎ ö¾r >m!uÇ%ݤ®ìÛ<9§p–øÉ-b¥‚½‹ØÂM"÷÷qÁ÷ÅUùË$†G”Kü<þz÷)2±‡³ÌÍG,7Ô˶Ê_ßÏâ©·vö÷÷ 1\+5”zr‰B.öqŸf-ñu ”[l“ú:ûYXKç[XYl»I}ÿþÄ_ÍõÏpu LÊ>°8 ÐÙGèëëÌ>­‡Lì¬Ë W‰}ÎþÎ26‹›ÄÝÝOª0÷‘†Šý<°…Ý$®Î>Ë]d¸Rç•«³Lêgëì¨ï”zHýÄÞëݤ gWüö +W)¾ÉàwÛ'G×>ut»áÂí®ø}|œ U®÷uvÅu.ü#tn›¡äúÁ[ìÄVñØþT=« ±|ðìJCÑm†Cֆ﫟ÜÜõѹ¿^jm(·Ãð¹zðž+/}ªÐާ¾»¼×ƧN¬2œØì臡èëã¨ØùôU¸ngÅZÃKn¼“Õ`à þð~ª.±¡.7çdð´øÉK¸*ò1\+<éc(éñT >O×6ø°O‘ q¼ÚyðWààŸPCÅrÃgè“›ú }ªŽ@Ö ~†û=}øéw–® ¼ÂPVfø”>]JñÔå²§¾K¯#"×jyˆŸëžM+B¥n6Ö+ýŶ›W¸oY-óغFî¹m­B²}] ×ŽõAÞ;7û8ïÚ¨ôuÙ½ìIvs&[ì;åMûySÇ8ÌŸö–ã‚écζèíñá‹gNˆX2ËRµtöÄŠ/Oõ6V~uzSÕƒ³šµßŸëkÕýå¡¶jæâ‘öšþwvÔþréXgº}¼K÷Dwýý“= 1•CØ›‰UÄ|bñaGl!V ˆéÄXb+±†XHÌ ÆÛˆµÄÛÄxb;±Ž˜IL vë‰Y„%±“Ø@Ì&&»ˆÄ;Ä$b7aEÌ!&{ˆMÄ b.1…°!¬‰•Ä<âMâ b±ˆA %8Äb”x…0"–fÄ0‚K,%F¯ÆÄ2œNðˆåÄ(â5‚Oì%F&IØBB@P„!"^'^" ‚&^&œˆT"š&|g"ˆ!”„/áB¤±DáG¸DJH 7"“ˆ'ÂBLd D8@¸ÙD"AÈ"‡H"T„œð$r‰d"’Pj"ð"Rˆ("ˆð&ôDQE”·ˆâ,QKôMD>q‡¸Nœ'ŽD=¡#*‰‰‹Ä¢‹h *ˆ»Ä â2q”è&Zˆâ&ñ.qŒ(" -ñq‰8AôÍDññQJ$Z‰BC\#Îû‰}Dq›xŸ8M Úˆ2ââ q†8D´ÅD5ñ)q•¸@ô'‰ÃÄ)âcâ…œËÓ8éœ N&'‹“ÍÉáärò8ùœN!§ˆSÌ)á”rÊ8N9§‚SÉ©âh9:ûk8µœ:ŽžSÏià4rš8ÍœN+§ÓÎéàìãtrº°:èáôröspú89‡8‡9G8G9Ç8Ç9'8'9§8§9g8g9ç8ç989ïr.qÞã\æ¼Ï¹Â¹Ê¹Æ¹Î¹Á¹Éù€ó!ç#ÎÇœO8Ÿrnqnsaéͽ‹8ȱâ1nÔÆqk¸ŸáÀ¯ã™ó”¼¯ù2þû¤))%?¦ÖPu/~)ï¥^n2wHÅÐ7‡f¿bñJå+·‡ÍváÕÕ¯Ö 1Üyxñpøšâµ»&ËLN˜0‚TÁg¯Ëéáô‘7F½Q=ÂoÄYÓjÓKf«Ì$f>fÑfõfGÎé2ò¡9ÏÜÚ<Àüþ(ãQÞ£ÂGµŽ:=Úntáè_„{DKEQŸ…±Åu‹oRoú¾Y;†c9¦bÌ—oÍz«ñ-8v騤q&ã&+÷éxÿ s'xM€–Y÷NÌ™xq’p’~ÒñÉêÉ'§ÜòÃÔ˜©SNóœ>|zÑô;3,g¬{åLzfÒ̪™‡gÞœµuÖ÷³‰Ù£f—Ï>óÎÖ9&sç„ÏùznàÜ„¹gæí™wt3?`~ï÷…¯-<ºð“E‹~^Ü·ø«%+–œZrkiâ²ÕË_[^¶ü‡+g¯ì^e¾J·zúêè5Fk®ù¿µk?Zç¶îÊú„õ]ÞØµñG¬¬j7ÍßÔf½ÂúþæÄÍßoñÞÊÙºõá¶Âí‚í{¶×î°Ýqv§óNÍ.á.ŸÝ£v'ï±°ñ¶5µí±Ûh÷™ÝÏ{ý÷~`ßí°Êá¡c‰#tJuºíœè2Ëe¯K¥Ëy—‡®¾®u®×\ÿâ–.ŽrÙÝËc¨‡Çž+<ÿŸ¤Ý+ËÛÆ[ë3ÚçCßh߯ý²¤nÒý“LÈfˎɧÊT¸+NZÞ ’ý¼;øWå©«ë¡aadØð±á™Ã#N«–ª¾ŽœY¡ž¨VßÚ½&º#fmLt,/¶.N÷Sü¦øû ‹Î%Æ% “ôÉ»“¿nàJÊš”žÔÙ©Mi+ÓŠaÚ°þé@+Ó÷Z“Ûpο ¦ýø^‹ƒ}<½]Ü·‡,”µ² SÄøàZaÁtJ‹¾—‘ï&”†=Ô€’d€=*õŠhJ°EÆ\#‡õ»-\Öå¸]Ãé_­¥øn ¬Ü¾ŒäL¥©”dÝâi‘ávÑf2è¨%·¤+ò€dk˵™Â@~ãâ|‚TQžIñ@•‘DÉà r ªé/aÂw(7ŒIDÎǙۀC¸Œ‚q¦Ñd9¿3)?È:):Z¶í0] 7d›ÂümjqŠiJ““•‰™‰™Ñi {b‰3Šö›†ì µ ðV³è˜ìœš’&JÉHÉéT­\#q÷Û·{o¬Í//–WjÚ›¾„™7MKöåæêÓ¨aÌaPŘ\ô¨29 EPE#ÝГ}¨ír~WlNp¦P/ œc¢¢)9Œ«"Ý3"‹@ 5$HÏÊÍÍ¡7*+ªò+Í›Jü·‹P< ÜUa’\8²ŠtK‹Êû(˜NÞÞutþf{éwá0fKÄEÆL[àM.3rhwç€@ÍÞqŽú¡þì¡â¢u¦(#7€sŠm©¢PûtUmgÖퟅFMxEÂÏ,áðÇôWOˆXËiú‡c›­êŸG£4?'9¤%·'åGã& RíÝ¥ð–yN‚“LUš¤ Êó³›Sñ—” ŒoddsbA”ÞÚ¢.S´øºËU6qØÎiZÒ:38hA…¦þê·­M¿Csò•9ØVf 44Ú3)¨“UÉØÐ÷µ¤$%¼Àî}´6›~¹wáP]ÙÕ,³a¿¬Ú~¾–óù>¦Nçö/`þBd’`{Dä²X|å--¹87*\¦k¼_Tt%?U‰öø ½ŒeÊøWâŠU`75 %ÁfUäâ|JKÎÏT–«ãEÂŒÏyÕüAjÔ3¿ÔÉ´&wál8ÎGB¸l„`R1nA‘Œ¼”Pöˆ`OxäŠJà%ƒ×H¸_ƒ¼ne‡§^äY')Z]D | ÕØÙq}äÓŽ£…Bkt›®ã ¼~èÛ‰Œ&¹Ø,p -é1)ÆÍEmBÏ{õNSÇxIÑ«‰"lePÏLÕp˜yp6-åG{Ç„„y;z©ÊØ <ÝIÆ¢1<_û•®Z$#Õ€¥©Œ˜&zf1‹‘ ðm8 Ó_ ,Ç Qè­¯ÆÂ~ð#†¬Åä-Jñ¡O”í@óдàÝ[·„ãáªÒCgðCŽ8Xɼ| ®­2ÐÎe!¿PÑ=ÚŒ3Yg²M+Iû4UF)ó>ò–“ãsb=…6’N=¾Åö€BFó-Ð8‘ ºnùÓá†â¾^aâ)ÄE…Fª‚Aê@@í’‚HWŸ<Ñ —‹  ÔöÑp`1œÃíßÌ"Ó_Æ¿_ü€2ÂS悸h“) ÓÓâs0‹Ð&ä<ª¢(»C¨MáiÑ]Ù˜¤Sj$p#ºeŠ&`…Z=Ÿµû·ØîÙQ¹ØîЊ„ÛṢʲ¼Æ 3|×M 5“»]ÌÊ®% eoí!ãk@IøþmÔ€ ¶…G`¿'ƒÁZrINH »ñ¤ ›Ù>ÐÁ«anóÁñ‚‚ó¹Þ2òjlYXE¡¬‡Tîï©›d5·œBoÙä-·UúEzÅIÁz`ÕäwÈïpÄûà[ ºžƒFphogˆ¸SØéVéÕ´”ÒB•??ÂS­V‚hž˜»¥Ê.Ï·®šˆ¦!'ä' ñÐõòÉ’–£¢úŠ MwëŸsyP•:«Ž2/Ç~ê6úh9B°ö)?•Ëú©$¸ÄDÛa<¿%‡:RP\NZ§…jÀE ¾Iîß«Su ø#†hÙWˆ»ÅC±ÕG$0Oµ§AVNq~¦¢2¿P‡ª6£h¸tË6/¿ÊÖpÊïÃÍ-p¶žÃŒ‡¯Ñ®¶>!N8*ù•5…ÔÇ4$\¢`?îÓð^ïV¯6{ÍüZ¯ÍµDãÑø'Ãᨿ^„ŠàR: -m?j@YX¶O†2Ušº‡ 'YÎ6õce×? ÆÑ|ÿ© ×½^ùüðÉ€ZÎg^íçñŠÊÉ ä«á.=´LÊOiLiI0ù•gÆÜÀ•”)úM ö?c1£û×ÒHŒ›×¹!Wܼ +þËüé„&ÂÉÈ^”ìEC£sè\Äy2B$"7aã9@Ÿ³‚/ "YÖÄü؈ýÉ'¸ésኂ”¯?§£,xkv2x‰„>p,Ž®ÐYÀ×P˜à FÉÈsqeá˜MØÌ©¤+5ùmïôZÓ(¬ÞU¸ÌS‚ßñvØÛ)6ÊAUÐ-2¼J®… Ž0ãê1cÇã;bÆZÁ¯&Ñ`SLô†HJp@5U¤}Nth§˜/ÂÉÅÛ÷túÚ3ôÆô1ø}G_Ÿ 9½MÅí¢cÆQî²  6ùœÇNüþ½³íÕÞv¢að6Ž|£» žsЏ—™wht›NêHûx»ôUäêÔÈ|pž‚ït͆ÃÈ£EM¥y±‘ ‰±qQÂèð5ˆ¢|tòÆ­¶åä–Ž¹ëvËý…ž±.àj›#–hÂíö)~‹¬Þ‹à1š§4¦u•~¤ï: nPšrûVt/è–‘ïņÕÔ›TÁ{ãAT’šÕw´ä¢\üÊW(Á&¸²$¿á“GDXEŠBy°Wì*@=F l4x,,™Ï°¸Êüçß¡^Ž™â)c>&Û¡OÊ÷Y,õð³wß¶PYñãIÈnùˆ¢tðó~8â»y "…‚ádkAÎ!8÷€™i…Z>ë·«b4&GXƒ]‚~,;·bi—§®á¥vŒÁ[VEZ§G€3ÜJªélÈΉ Ë–ùEëÕ¢«i ftKöÚˆý×í²šÉ¥ƒCïTCŸÃÑzpw M¡¹û#&ÄŒ¡£7HÁWD±£4ÓÕ ™»~ФÀ«R*ª—©zƒù»ŠÁnàRrNA ¾V[E{É\Fn½&&pÁÝCßÜØÔ3N¸¿08«¦®¦¢]ÔÜ ´™3Á{D·®²ãðHÐY'­¡– ì¢WÔGt¡^ö;,gÙWv•gåÕTŠ“‰{L4Ý[&ž6Mé±×.¤ùþ—e-½˜@ehUoÍ_‰Ùï‡^¢½£Ã•`/p(•4*Ë¢ŠBZ>Ò5i:{NŸo¸ ¾¦ ²„‘ vŒ“Ðä6C?÷ÄFa‡}}ðui¹c¾²Rqlû§ÞwÁiЙ}­šBßô·ÓÐøŠyì2ÈcÊr t?_‚|Ñ }‚‹-̇,.Îñ-\„³Úâ .dp@KNOÉG)A~ŸÔâ^ˆA …ŸËø!ˆïé9°li)È=øÅÉPO½°B–ç_hEUa(˜E42ó8©ßBá.¼? á¸@2.<.>Ĩ԰ ¯îÊò‚ÅaAÀLª.iÁ#_’àÞàJ®Áé&]p:؟܇n¬?ÁìŠÎ‰Æ4ø“Ø{56KLé™YZ)Áw«™Ÿi'OOg‡¯®®Æ†®NI“Vp›ŒÔ+5&9˜qpÈÁPÑEUéç³ÎdaU옊]t'½œìKÈNjÆBÑË+H-5w ×Á/Ð9Ù“Í&Š䬾ݟj*î;!Ä @Žzæ/3ÂùØŽcíXÀÚÑAÎ?8X#¤»Â^JUVnFZVf®0·8=äRuþUÞî2™Ç–._:\} FXVŸÝ Nb/ë_M;I°‰ë½º;›;;=Y³‘Ï ¸e¸ a&|‰ËÕêwØüª_KÎÎTç‚ëSEÂWÙ— !T-? Úó¾æ'"{^-¿9Ô‡§cÿa6˜®Ýg+â= MH„!OûAK.ÍP‚CC*/¾š†›ûù~|y8Ž«lÖ¢aÖâœ'ä7y}BXlÈJ´ÁttŒ-KÊ™f (7K›š ²S²S¨§rûÔ”Þ Å.8·?`ªãÃÙŒEYWv¶>ÍÌàÕú©*–\&—­ßKÁÏKÊMNK®JÌ‹*¢V£×Ñë¦ÌJ´YN6&†±Á×¹…‡x%2eoV|&è¥ Ÿ¬¬ú ,‘eE‚3'MÆ%TU¤ħEç£]°ÜôÛŸt¥g1£±ö?ÐÏÑr>†³àµ.n?—9Kƒ“…ÅçØ4Á_FތӃlš€,·¯ACÆ9œ„£„ð Ú3+Š ó±Q÷§â¢ŸcÐÆæ«°·CøÜÄrÛÓŽû=Ï…\WÁ{-Ý­ºëà>ÛŽ“ú´Ø…Q˜®˜#™c4x¿°è‹ïŸdäG‰šìÊ“›”2ÿ‚²ì´Ìœ|a~QZ6(¢Ú%Mnî^±KC›B¨‹hnÇ”´¸z¾Å ÚA#õïfÑ\ÎoIÈ‹ ©r÷Yî)‰êH̺|)¶ä€âÜŒÖ4l"•œlKHI.[Ÿ©4]‹–ÊÏE—Ç–ÅšIßS׃\,»&“ÉI]|z\õzh9ð²i¾Ï~Îò*ùp:3®¸%;[‡35ÖDZÖ<ȺH68m“ó›‹C€»Á`î¡Á’GóJ +ÃB÷¸Eñ0(D£áh¬³ßstTTbbbr<Î!csŠE°ütéa4 ñ–îYæR%ëh¯©j,Œ+ˆ,Fç&bìQå5ÅMBÁý:kÑ  ñ° v—9ùb™ìDY÷:œ;Þ£é;*ÌÛS¡<:¾¸µ³í>NûûGÊåTÝ~bß¾ËE†Œ³ nÌ­ì;HdüËñE±À„%F†:!úØa(»òA‘¨,ÊkMÍ)El·Ë=Ù›£Ýs˜Vó¡’ù´êLaÁ¡,3ƒ_d9x‡MŸsµ´,E¡*B'˜a¦p ÜÕ¬ý:×°OF–$&g$7'Ä€`ããƒ|‘Ÿ)ô"Áå¢â«ƒ »”PúXàì \3èyU¸‡¬Ö (¸LžÍöë¨"â½Ø<ÁöëÜc{#€†™y­¬¢Ã2bÓcó°:Sš~MÊ*5yú ³*´HNæ$g'§Êäì8£B¥ÞqqáÊ𠸬„ÌÄtï}&ù…™ ¯KÈŒ×øÂב©Ÿ»¿WtÄöåÁ¡îIØê‹±ÎHÈE H·¯µ'5-+;+§Ì¯D–]é•«‘,]}Ø’q8ï»ú¸ïè +tç ëãü8./òqÄT*ðX6bªÙˆÉjžÌⲂ\JðQqyIV‰y[‘b³Aõ¸¨U.Á3 ¤ÁÂláŠ\P­Eò-†¢ÎêH1[4ºŠtKUç³ac°Ëo›X±q·Ð÷¬g•°öþâͬ>‹¨gÆaõûÄsÙî>»X}†£»+5ðc>ùÁ±—æ°>`Íîÿ'Bá’ˆkçêæ.Úf\Ò©)nÔý:œª }7ltö×ï û%<\ì×À]Î/¶Ê 2þ‘Ä¢(àTIáñÈ=0E¼UŸPrÌ@UQNWZ*–˜™,"ÏËÈŽ$Mtž¼i²)zFC"¾8)›-Y›ŸsˆíEî•‘ûâr£Kl¡çÀ7¦5|hÍÀ¥< à½Ì7í•å Ø]ÿ2GÙ©^˜­Öm&à 8äójïÁ\æ Æì ÏõŽÀIéíµ{‡÷"°œÚÐas¸sMææ§Y-¾}æßß|h—àÌ}Ú†ÜÑB4Ù£=pš %Wö|-R5Íw·‰\‡“ß•h8WÀmp(ÎŽÀÐ ½ŠÆ¾¹Ér½LU¢ÏLÉJÉ]€¼U|Á„UžtmR‘<É-É!Ô:È%ÐÉWæ (EÃá#¥5 mëubN3±PÀ?Þä‰L õüN(àañ: =ü*¶#®+Âìžôð6°žÚîè¸]áŸ_ç*tª÷-ÀõÈ)*X˜ Â(I™¢¶¶¢²6?1G]. nO(ŠïÎÊ0­ ÏŽÕHëm‹UÕ€ª)¯¨iPîL9¤‡§{”°MlèOÅ2üG.<‚(z!ß%:·SÔoBžÈË?&<Û€T¿¾ U8]JTUÃÿ놀˜ 1…Ëxõ¯¢‘™rSàÒÝÈxÉd …–xÐÿü8 ¾²â&â{&¨|…-pÂ'ÁñuŠBmôÅÊhz9Ò×V’[% mˆºîƒ3™Ç³2²3 Ó nù‹@·ÞÅùá].}4r›…SNñ](ƇÏâƒi8L)5ý3±<”ô|ÙoË›Æt‡Åp4‡ `sÈÙ|G$ãiùeçªÊâ8ëÊG{šy_±5ÄiBà,H½;Bàt­£!u±ï¸M]réÝlãåe#”Û×ywfd‚”L¡À)s1Õ¤çvÚÇ¨ÞææÞcõ‹÷Æ(¼q žˆá9+ª¼±Xçå²ÓÚãð½£yúö“¬Š†K!…‘À…íl—€(˜€ñ:‹KºNÈ=*¨Vi­»8@ꔿ±|ž056]™HÁ#oè¡YÁù¿9oU>W˜›œ„‘p³,®hÛAJ³¥ð¥l}lÇÓk}ö“îH´!á'ÀÅœgc^2¶‹l›Ý÷÷¶¶âc­øaŸèhÿZúm>RÿjËûÌÀ¢¯î»¸Ì2&†o’{k$y‹ ¨ë;“öñq>¡;¼}vá°9³o ¹ŽBéäòB×noH¥š¢äÇ’ª¸3‰”åÑoÈ‹ÚJêõ õ%ÝàØÞPëÙî«™ÔGAoòrX«cí Qý¡CA(Ø ¶øzYERÛ™Eôær¿Ðöëtg‹YŠ@+üؽ˅j¶ÿ˜Zg³¼C­éØ{ª¯¡¡¯Ç·Þ)>$Ç ““@ Ô19ùmû®b¹j`;´„‹1uïœ_÷í38T!$FçVÆä›góóSyÏ,~nv”ÚÍÀúý/Óÿ¿oH Äš~³ŒÂ™ØÎäÂ4ì&7€õŽ.+½wNó(äò%6¢¤`Á`÷N‚“-|wÀ[bGû«ýÂ"€²Qž„–"BÂÉe'öÐlB„X;DôÀ¢åA(imÒÄiL˜éð%¸£a„ «?•¡h„a†£WçÞñaW¦A/:r¬ñSp“zϾ{µP¿‡®«ðqqU9ImD¾;<ýÜåªiîhü¼á€HÛ\Q¬ÔF†¤ÅüxŸè³Ü߸€ LŸ J`Wæ¯È–™# ¡¡èõ…‡·_?uX¢]´ïLñ±”{å ùÉ… ´åì+EßýJ˜å Ö¶ô ètœþåÄåĦ$g&•Gg«@ ° Üà±ËÏÙ_é |ApUj}ZOæCåzmy1Ð…he~ÿgùœŸâBZBÛ|¯êÀº€®¨‡ÉT>¹¨Ø_e¸”ŸÊuS5_jªtàSÃïë:ý‡%¸ÈÌd×Xï IP˜;ØA¡µ$X(Ÿt+¨BV±¡% åæHú9@cßÿñð× $çÍ5(é*F§»‡Ùð ´äÂ÷Ø@—8¼2'-;--µ:W›U(m^à^ÑM‚ùÁ¡–8/e†T‘3RC‹À йÈjÞ0ò:óeš(›iìw9Ðe„@Å\eæÒròdlV<ð®!^[W¢ÉÐËô/m=]à,uuýþñhè2ëIŽùÞík„hÌêV`*5öƒÐøêÝé…‚²õ§š›ëAkAUiqAA±¶£Xgœêª–31•mÿèõ¼âêÎê.ÓÒÚü¬Nœö‘Õ€2£¯!ã ïzg7©L€›_R,Ó9uû‡@K™öh=‡}IïºÔ :¨&Myýέë\‚6¡ØÓûz p—{AIßí·Å˜¹øó]HÝå0Ì[ô@Ê,&…(ãÁ/lSB3fäs`3ÅedЃ–óýVFÆšÌÇ>}Úך.‚ëf?/¹Ž»`O¡›[°DºŒªáëÏ´Ô] AYá‘”-Ű£r‡·ížÅžÎh<šA)˜Ù¬Ãcjá,àܯ!ó[*ÛÚÕútgd°±;-Gn@åeGEŠ=—ãÐýhÁ@›íFƒ¥> C©Hò^J{V}ycyq Û»Œñs¹¢êVùœòÀ*¶¿ÿ>Ö,)÷.wËz;ÿ ¬Ú,£Fàܪ€/ƒ§Ëü1Õ¦¤™ (ç}ІÿL&-ÀÿXçÑǼû‘ ÔÀñË „àÖ FC·žn¨<¨³m®Vë==§øŠBÉOüB›%”à’Þ¯ÔÁnäJ±ýf¹2¯ÞKèÖæ[ŒE±Ø_.ÙyÚã ¸šb=>¾'¼Ó¯ITšïZJ nk+«=9ò¶õÁq–ËlÆî`cvÿVËñ¸ðdÿz“—4ÈÍeÎt{4 ÌÐÎÜ¿´ge§ëÃ-T ¹­Y¦ êö=ñ€£~Wsª¼«JwŠMøKàÊ»ÁwMjfþåÏzŠx§¶ìpìèönØ9Ÿ£¢ÀVe¹];5ðÒ€7z:~;Àïq¼“-²MB­ÙiRÈÕ ÊÊMwNb‰ ú§Ñ^¾¾^î5~M-µ5M;ulë?f/tÀýèc0ÊüC„‡·?8ACG8—N"¸ 9%1-!Í,2/*#PqñqÑÁÕN7‹ ÂóÊÕÑ‘‰ [WyîATlzBvvVZa1;Øqq³†Y®—j°ss„À”YÎÜ¢]q’ñ*Ö ™òðÔ sdfiÞZ]a½ÏITRÕ¶3mç÷B3ž 6¾,?©Ì¼ ´ä6–UiÊ÷…”šJ\¤áN@sý«?†¡¦ù…q¥€j«Öµ¶(««DhºAöDï'¨ï.Ô–†È…‰$ÖñõþMÌMr¶ïm l€ÓG|~‘`wëÏ÷Zäëáçìe¾P["rÚD0üK\wBUÂÏü$ ±H¤`*©)ÈÜwù´:¤VØPì]¸ˆÒAûüx¾ $cÚ®4•9rD"4¹!ã}¯lu¸!¿ AÛ_&°J­lJ9`άÀÅ< ' &$x……Ê£Á:àZî¿_¾/ìsð9ýÏBc8¬¹:*¸PX”V²¸þÒÜ3*__‰g­oSó T.d‡Ž0Ðy‡þ‘¯ËŽ ¡£$pU«<Ö¥ªŠØ9£Èщž€z“~Jo*ª.¨¨Ìk”৺ªÈðääÄäDQ¼:I ")o]`kkµ¶éøÚ&d´b{ˆ‡»ÐÕ5|oÒLj›ãqt›œ¢Ô{ãpõ ¸ú uh3ôÌBôZÝw=pìyØXgêA“oáë#‘ÌëÌK4âó•·‚!—ÍÂ*µ 5ÅáRŒ¬$Ç$±Î¿˜íÓÕt]ÚÚ5ÍÆQ¥ðÙyúmoš,ÏšZ¸á!¿ibzXª{p†*5Pkܽ7ï¬÷9ÖÝXÖÙ äÛ©‰è4oõ%åúr}n[Ö”‚¾Sº øÿL§ââžtØÊ“ “Ë(Èá <0Êdt„mP0–¨^ Mm}…¦±º4F^)ü 󦦕sÀ×ß<äÂùX͵Ú4wÞ™MŸÜ9sêö'Vg抂Œ[ò}&ÌTùº{¨êï}_ßÊRŸiÜ_ÚÏì'.즷ÚÚnßÜkwòäþÞ“'ìl%ÛÑõÕRoÿ/Ÿ]½¾ºFÏöØ©ØX¹Îü÷œ$Þ~ã…Ž=‰MçøãÁßïØÉ÷Hà¡•&Æ$›°™"K,ÍfÌ_”ä^ß•.Ù;Ùz°;X"ööP9$Îx¾Åá= »h$<Ãÿ¾¼á¢®8F•—+ŒS'Å€X–žŸ€)·0RÓo‰ƒ–·ãÀ¦_·ðNð™ý[xìÄÙ­ï±sŠfÔûb¼À±Ø¥ôφ¯ÓnvžJ[@-€¤¨f‘àL|]h“ïië–å`7‡»{P‚œ±¸p½ù˜%»VºUËöµW–7—%䨊Dѹ‰ ‹ÒTµ«Pl.$íìê­póñŽÔêñó'«ffò«6µ¶¾gþ8Zò3JÐ0ð¦7-—…Çâ É=XÛ{Fßp·7a _.m?Ô[ì=MèÅJBä×q£ƒÍîs!5™Î‹ÉKËNÉfµ%Aá¡i9 Q\j˜{³ª:¾˜}Ø×x´ËK·C“œ)ª9Çsæc»‡ÔÀÎu ×—µ›€p¥®î!\­=ó®ÒŽ,½Å\êßEÛñ÷l´õ_<€2KZP®ÌÔ˜éoÁ¡­WZZŠkjDµ7Á%Ÿœ—¤ÑF&–ƒvИßV7`úë[¦ûùï÷O¦3@zRnl^lZrV¢.*3 H( ëñ½B«ºïœtG¢PpêVÿ t„~ó퉈?§oçÖæ¢j¨«§æ xºæÖ½QXæE7j=ím‚Öú9‹^²0?6Å«ì>Xý‰¾GTVSVX¨×è±Ó& Î;}Ûo´5±ut÷ê¸êÖ½A¨¬cOк¿ÖáZÙÓWý1®CSk¨;¸þ3¬2~›IüÌ4i¡¨ïf¼ˆÁ” ßà2»`7݇¸$ « ªJrÓÌtÈ9€<—X¼Adbd¼ A¡¦áµáõáÕ‘Uf»¾SôbP^’y*•Ò¡#dGbeD™|e›ZÚÀáü¼ Þ6dnÍmI°64|;äù©–œ—VÞ¥@ó>d~‘LÏã=¡g§Wp_l`ží9a´ô1>s·^“ *ÍtÊR?eh´2Tx½ýœ3lŒ}3gèQ˜è§}Éö˜Kƒ1Vn3¶ûº€5Ô„×áóÁ©O»üêÝIJqpFd‰R˜¯J‹Q”\æ±ËgÿLJrÎ «z²«@5Ȉ)H.4\ ‡‰´»Aöô´µuïwo1ô6ºØ ÑH:ŽMý¤r«OšTO HMJKH÷Ú|!õtkRvb»RQ˜P (}™¦¾!¸Ü'"2!2@äï§VõÖ¤çƒbª)Hãé¨pO‹ÉVº`×¾Ñ#=2M\&+T¥‡c4(•oM`]InZVÔ¢ÉMÛ—ž8/Næí£Ž !5.-V·¡tRê‚ 4Ö”m¢éu?iaT×qÀgðý{Ü«ŒK7¾j`RÒÚw`¦Vgg§¥¦edвsÓ²@U¨ññ THìš}ÿåò]¸ V˜Ý“ZYƒpŽÚƒ†}ÆÿºâÀ¾ü¼Ø˜¤¤„ÄxaLd|PS2mPM]Uuc¯‹Þz—C “—Pâ¼#t<…†òŸ jÞ3 j2cé¯?äõ‘“ò`Ú&' o¢ræJž yï} ~æH'ö0Ë/qÀ§\8³žNˆKJЉr±Qá|šÚÛ-9Ý·¿¶G+ ,ŒOJNŽI0 ŽR'âfs ¬ì(H/Ë®¥å¦¤¥d„~2† ß+Uæ*Y@P°,8/¢6DÇÌâ=6p#¦ƒRÕé^E~¡™a€ò ö•–Õ¤èDûÊrSÛR“6¨%Îk;Öæ»§Zy¦F¥:iüóÃ2"% ’új‚ëŠJ2 kE5…YE€*å'ïL²Uù'ªA8å]X__U¥/L(ˆ¬*&”&÷¶$$î ÑF&äcÔhÊjõ!¥¾¡ª•Tä¢T%J@ÊÙžúÞŒÌÔt ¸´¤ôø ¿Ö“àDk2¾P©ÌK(báVVW\櫊HPËDNÊÈD÷„”ÞôÒÊCù5é ÒË«¼}½#Ò"ó„{ÒÃRv±þ™V2I•0³Ò\óº Çßr¿Î&„ë˜Yô"G§Eëª%ðMÄ·¯Q䄳½ò]ž^…EéééyYÂÊÂlËu¾:OO©Ô}ÇE‡O¾ºtäÚiÇòCÂ#)ÕY81þªª¬Pß<èckT¾m¬ï\ÓãÙ©ŽÆš5º(uB\ltŒ0$":DPþzßÚF½¾áðºžÅ³7í\jWðñJ¡JA×}þ¬|°ý)‰BîëTpØZ(øn󡨢æ‘õ•UzáßÍgœ™Úž¿y¼g©o–˜:é-d±H»õÔvÑRô:¯—ö§f¥>¦°…?@‹ýOY!oÔF'k@¨¡àºÒCgJC „y[锽)¾@J¡‰Á»¶z—v« i×Ýþô6>2¶DÆßð¶óá0´Š÷&ÂíÛÏuvÃ`| ’§¤ ›+ö1,û˜sú.ÌºË €Cè[<ìhQw³.Вס{0Ñôĉ‰uÍy- × ôD5øw>|hºõØäÉ®Z\{`f<¢\e“˜nÝþpb€›ÚØ›½yž:1×ÀLúò±ÍËVmݼfÕö“W¯;qÙ0!¢Î×0Áy;æ1¾ G„÷σ¯Ñ»ýÃíÁàv"r¨4²§1 —b”Í>'·ë—à«¶{6yî2: pÿ¹%4=ÞQØØ.„Kê"™ Ô¿O¡ ¸œ>B^®lÙ×^â³,M¢R‚Rd” #3zz°‹ývå ¸N*é9ÚWæ>™í˜}  ÿŒÕP[÷8½ Wñ¦óÛ踭bJ· kmÿa-ë9_ö}É…=ý"ºï×›p©–••’ì22’Û’sM[I†![É”\Ж™q Ó,ä¥ä±£À‡I4i59³~Ã)OQ]ˆ.ö`…> Ådrp‰KXk&ƒ+É©Œ?½¬Zrüä´ëJj5ù½ùØïè ne6cI7À±yGþnhæÉÐËáÈ&EU¿ Æä VªoÀÑcàøå{wh`å‹â6沯¼ºµ¯Ümª¥J±-Y(!’Šã‹")V§È·=™F¸îNHÉŒFeEHêÔÅ ¥Àì§O¿€üá]^z‘·^R¼ ê@^E޳²»UWÞºoäÝ9½òÎ ¶}VÖ+ÚáÁ&fœ=BPˬ‚ÇhdE‚åáa+(Ás–ì€<?ÆW²Gâéê¼E9P›Ãò:E0„ƱڀR4|0ç•":* ½ÅN“¬*Ì<òÅ©PÏay@®¼`#¥…ö¿ ä_H(g×çDE+½““âã‘dÀÌTh…x1Ñnq”` º‚Z-šº;3"T›üô‚<Í·p‹iE; ß¼,ÔÉÒéºéwÓD°L‡YŸ^SV¦ ;±SY«2¨cÊ´qóã ¥½òåÄWyD¨ü$¤Èó\KMË ¤òÌ óMÀÃ-äl¾l¾UŒŒ^²Ñjé¢3›>¸yúÌ6Yb è“C—Ší#ùlHåpÿTì¢Îyï³S¾!h]Ìf:..99)9˜Å$¦ç‰à ²Ï¶~ñâ=~ö²âp]¦°<31+&[—‰“4*¿,·B(8Ý\î.r%‘¹§› ØPnuþ]­µùµMÂ,ßBu=¨šœ*-%¸„èF:"Dƒ¡RURÙ¨­ê+2$xgÞçÀOû_£Ñ'+á'üÇ£=Æv¿þ'Æv™ÄJBc츠)Éi‰é‰fùêœø,@eedæh¤]6'D%ê¢ðŠÜ‚Ü‚ôôã—›Ž‚r*+!=&&&A.Ä­€‘CÅ¢y/\KZú‰çÔòâk a/ _½Î;M¢W—òàKÏZ`ˆ5Î[ž5ùÑÚöwk qcj¯³R¾£'ÔÊO¾ çûÞ:õiÊ‘Ÿ¶#KV.ÕzìSGA‡F×Q¢ËÒfdƒö“ÇÐÃ>³Ñ[žjtÿß6ú3úôþÑ%øqþ;ý^ G*AN%d*¿:Ä—?øž¡.s™ ˜C{oðبÅç!ò»Î~p¬Aj]**{Ÿrã2Â2] 2Üq€ÎZˆ†£aŸ,…#êjÒs[D©Y)”eäe§ä_5EKÌÇ=h šö"8½ ·C8 NNÐMÓÑnÑnc8¾ŠÌÑ"´G34MÂÁd\ÃW¡9œ&ú›…Ò.pŽ+¤GÆ>YN‘ó¬ånÿ¦å‚—HfÜ vÓõGGj>¸Éfxo¿ \þ•í5Øøå´û# Óÿ›Ž‡þ‰´¶¥¬@¨6ÜÝUd"Š"?=ðiôÞ:Ò 'Na‘™š ¡¯.&Ý/Í?Z¥JÊ«-è4$n_ºs  ÙF#L'¿´h ÊšFt«[·ÁÎ×ÚCØ?v` v“nö3áåìle¶¾3›|ÿåŽ |Á÷häh4ކ+y¿ê‚u³øp†±áïS“q«/„¢ H«Øél^/8;YÿB³“¯#+æ—î5hKh«ùërÄæ2Ýá¢s)Û–”hP§ÈsÆèLƒDÈâÁXÌÇ|yp×Ũ“A‡D²Óòzë¾/zMmëÞ¶·ÑÙZgšÙËú¢ÛC:}ÌÐK[öûðþ²”>®Ù¦¡yÊÝ[”y*QX]\/øŠ‚ ÊŽœ>5û“F4Ò«Ï=þÏϽü‡æ€^yæP%šÊÌѶ¼åX„¢•hå™Mp%\W¢UgΠUƒß7ÁgV!ü}Ó&Þ??Nƒ3'ñû­õîc’/û¼ÏÝå0³ïr™À,èbÇugóÿ·Vˆ£³Ÿ?·kæñÚñÛ¬öz²~¼ú¯?ùÇÖ ¨åpîß©¼áÿ@åQ«òÑéÛ]möÛÁñeû>&ÔâŸgÔqõ¢Ô âÙœZ@ìbR_° ý?;9­f"Öÿ,gS0eŸƒ´ÿ_Ñ0LØç=+]Ú+ࢊŸYég|øõ-h~™ ]™<º'Ñ…BÙ$pMNvH¤Bà²RÒ!-9´S?µå’ܰRýæâ b@}”ÇÒkýÚ·~lz¸¼ºì§N:¶¬¢|hH7ó;4;·+¼ÝDžüøý¿GÍüf5»þ©…Ô^;ùúWçß,¤Öüƒ…Ô›=[üDÆÏXE=Lj½C éPŠþ®‹æŸ[Òãöïo‹ah‚I2l.ñã}.,UÑ—rè{φ”šþÑm&Æ¡7§Á!j‘û¼ßŽq¸‡E¦åÈž?ÆñŸæäEÌÉç¹é:ˆîÄŒ|f/ˈ—1ŸÝË3–ß ½š±˜†N\¸«Ü…VV Ýxóã³g>úÐêìB‘‡ñÑ^Û­[ìí¶í°?pâDÏc¢'¡«¨!hˆa8|„àÖ;Æ LÑû8ÁúCbô_dÑüÛÏ…ËŸ¼×A!ü=Qô¦Í0L›g#l4—!m’ ig8ÇEÊý?ÄÁO xÀ`UZ¿”Â=ͨ‹†¾¬ïþ4^ ŒÑ Fów Šú Êø7 ê"¸ 7>YB€-!xë.|ëÉä6pžfRî¦+þ;€ n?Çb2n‘>_ ¢–ÍÍöÂY>†Š®‚+2zqÞõ°ÿ¥í#0ìâ»zaÛ£ñùã<ªÙÅÆŸ£HþãÝP’ Q7 #;’²êeuQí Tê[+<ôaûÁ> Éíj£ªÈèøøäX@†”ëØ^U8õÎÝ;p*®‚S¹L#ÓXuÍ"aüˆvõðpunòÜ×ÞÜÒÞîÑì"˜eìâé‰yìkkiÅÇš\DO&u}õ“ºÒ™í¿;½æo¿‚fØü{`ûSðýö‡ÏCÿ¥ÍºÐfXü;Í÷ÏÐp>xÀ…:¸ŸÞ’¢Î=üLM¢yxAdfjFjjJifqz Š³TR mTQ…Á0á?°³L!ãÿ{ÿ‡§&¢ÆÏ~ø¿‡aœ‰4?Q ‚¿ÿð9ºî¿…ßo0~Ÿ×†ÁP&_còÁf¢aô~ÿ68õ™ƒ“÷'zjp2üíˆé˜Ñÿ{@31 ž7¿ì~za4c<;©þ„ÿ%Œþg£qûó-þq¾õïaο&}÷¯æ_ÿ5ºLÃtyv“a²Ä°Ù.Ì6ð%òîA óÞo' ˜ÿq |˜Fdù×Üù þý;Gú4/œ<_„bvÝëcóçSª3ê™ôˆO×!Í&r(’ ö¾Ø†t?¡uÌÇ/Þ·ËÒíQÁS”ûFøÏþ!Êöhäp´ÿ—á?ÈÏGiÜêHÃ,E¯ü›(j‰øÐït‡õyÜù´”%ãéÿTÇ„`ÆÀLø¢øݸ0šÙø¬‰ÏÿŽŒÇü2þYUÿ—wÝÏ {æSý+»œ'>{ö8“(¯…¡}‡û`Šžs“ 7‹Û#é´øÎÛp4¸NÖ:A"½6npØ V€½ŸD ÔüÚ>ÎO.™ ¤Ì”\ Î7ÝÉ/„K:n^ÇDï¨qÔøäJ²vQeP®ä'øE††‚X›¾«.$Ó¼ æm¶›¨t ˆÚA9ó¥6¼ üd¶cð±)‘”˜=6ì—ð~‹*E¥ y&×Âã÷Ùÿw@z¿ÝÃoeÊ|ªò.ú¿Y•üüžÒÒ&@õ 3|à”œl›@)à®JÒ&=9»k’yg%]À‡áA "H¶ùÛ"°ˆ͹9]i” »½L¢ÉhÎÓ÷ñˆ/P*ȺdmH‘…¢H°#&Ê‘½Ø¬’tHÍe7p$ c¦?sS &ÝÅQ&G™~{ŒûÝ;pÝoGÃr>$AMPÙXJÇ‚óyø0bÀÅLáõ“ü#ÐÀ÷šï†(@¡øÐþļßí9[ 7c&ß›š™_5œÌ7˜oø¨±¥ýú %ŒÜ:à€«Šîƒïƒe8àg˜ü÷ÇþôÑšÊÌv@}qôm4Yž˜à)Ú¶Ï£ÐØçP[;éz°žBœ»3!çÜqÝá‰Kmp€£)¸½'¡·ýâü—ÿÿê®Æ)ªëŠC˜ýˆEËìs :‘ÝmSG"µM™1‰6NˆM $“Ä4È4ˆHBÈ(‚«Aà-áËÈÈ®´?!ú°iCÜ6èŒ V͈±:!3ç­šÞûÞ¾ýHÞ[ö»¿àÝ{Îy¿óõ»ç„ÂÀÄCÚ}È?{kzBz⮌dZ½-õÂ0ø ÞþK}NÚ)RY8`ãfPÀ÷dDЦ›H«l¹¶¡9*Ðɵ°_‹Ô ´i-h•I‘Ww0¨€“7Ñ~|9möǨöW%¼Ä.@±ì}Ч•h+ú^{Q-‚|Ð@,DñE/Àè.m›Vß{üÑ*tÿd zX´åáÆ'¾îüA˹kØ«í1õ5\-×u8uïð?Ì®ªƒrªGs=P}Gïù€ê¡Ç< ú3½È€ê{DTSJ?XEžßØÇƒ°$Ž+V0ÁÔÖi¬`ÉhÑQ„M­@«Ø¥ÚñŽúªúRòùçãSwÇÿ©>­µ¤”6–„‹i#­®(7Ü•úê“/ëfÅÛ °fJ÷ ÐÆ¡ë. éu¿Õ’wg†#Yü³³„7k»M•ÍÇu|DÓï¯n)碌Ô`QÍbãï_t?ýñÑÎúøçdЯ‘Gpƒü#¸é“;®ÁG"ó"¬kP¢¹ÂZDxN¹LC¹+å.æ”Û‹¾Dw|®Ü†{~b×4ñ×Ì.á,mÀŒSMÑØíÑíwƒ©{’­ýª´€¾I_ÞÑþ`«Tÿ>Î(”3Ì(Ž®É;whçoBìý#ê;'#Ì«=¥ì2iJ!ö‹Ö#œÛ1ްÊ÷µnmƒÔ´;êV¥ÄÞ¢Ó¦xÊ}¼øhY•FyÙÖýn‚µuÁ·íÁT¿·É5‘¨Úça'œ°kmþDæl^ ·Pš×ûš±ó-˜ì“é|ç¤T!QV \§ìµ‘‚' tNõ äŒ&á9Ùš“x±ãÔÉŽ¶ô†WŽäÑ…GBó óéBZm8TQyúÔÙO;‰q8£¦MÀx(à>´tbƒ<¬ÃÁõWöñwP ³’•_¬‚E%e´±\—ž|ø-z¯›Ð91³¶Ý\ZnzW×óª3=ÇBDÌ1ï¬ÔÎqø7/ÿq&`L^èŠe·qˆ=缡uÛ¡Ä•×im ÄaœR‰àT´ŠºE*ÀiKÝÖÛÎ×põ6ê¿8Y|Rl¡+ßr¹mqm¸0Óo¸üSVÃåŠxÃE‹Øì?p>Qº@ û2Z8å­éŸòÛ)NùΞҜ£9jj4ù僙’2ΦÕÉ»Íu¦ês™®¿¦´èL3a*ŠnxÄá¾Å'ì/êümÌ˶©M+A¶ä¨–Xƒî¹–ªÜ¬¼}t–:NÒ’^ï܇µ'ZKtƒeŠ™Ñ¬Pµô0Î9f•¡8ˆ—v83¹óÄB3{óz:dÏë¹"o^O6HûÔ%<Õ7ñíº"æó»ÁT¤ÏÕ€ý™É5òºð6:ò°­5eÝë]  }%×Cbrm®gÃÊ–ùm±F{Ü‹ò½†!.‹홉ýDk²M/˜ —}¦õ2§DõNþyZõÚ›|É7î ÇpÀ!³æ"9Òì&r‹ÍP¶½]u€Nâ}ëA~««©N]‚8¨†XUwC[cyÅá}U¡¦=Õ†zZ}¶¾¡YGEt¤4ni瞨í¡Á¯¥ 6aŒ[âxÍCq4zfÕAcìvW¹‚Û‡#Ýøs‹™ ÙÙànQ|«*÷PeÖwíXÁKÜ*8373#]÷óz•7å áª8¯w6&` §¤f·¸±"!Øk RÖ`¯ã¢Ý~|çpg¹t»ùÊÄÉB™‘¯€‚´fH}†òtÈ›êE?ŸÜ!/áá4ÁE¶Á W¦ùš\“Û3~ÓÌ&šáE³²qèÖØúÚÀ…~~ÿR; ä endstream endobj 134 0 obj 19707 endobj 13 0 obj <> endobj 12 0 obj <>stream xœÍ}\Çû÷.Çí­ Ë¹¨wgE±&VDÄB *Ø@¤WiR¤‰2Ø@Å "M° RìØ `‰b×XcbñY’ÿ;{‡#Æ´_ÞÏ…soËìÌS¿Ï3ÏLhJ]¢iº¹¹«÷× OgÇ^#ý¼]„S½ù¶4ßNo/Â#ðéó?Œ·§ÆnyÖŒ—5¥ÒÛõnÕŽ-hÙŽѼ8«e+´³‚N¢wÑ?ѯéJ555 5©šL­«Z/µþjCÔ†«™ªU³R³SóT T›¯¶Dm…Z¼Ú&µdµLµ½jùjÅj§Õ.ª]U»©v_í‰Úkµ÷"5+Òq¢¶"]Q?‘¾h¸h¬h’È^ä- …Šæ‹–ˆbED‰¢TÑNÑ~Q±è˜èŒ¨TtSôDôBÄ‹þOQo¦ÞZ]G]¡®§ÞW}¨úu3u+uu7uõ@õ0õ¥êqê‰êiÝ&OšÚ½Gž£üüÃ<Ý=‚ßèëë+œÂÕWÆ®žî¾Š®ä`Ž«·Ÿ¿«oPo…•««"ÈÃUáæéíªe9aúèñfŠnfã'+Ì\}]½‚¼=c=]}]»+ÜüÞª g?_Ï O?ßÀÞŠ GE ¿«³'yÈ5ÔÙÕ_¸ÐSáïàãHŽž ÷Gß WEŸÂÓ×Ù;ØEx=9ïæç¤ðð#×}ÈÒÔ¿À @çOÿ yãcSUƒ<ƒ„÷z’Ë ?7r§‹Ÿs°0šškAŽž¾Š ×Ð á=N® Ï@oÇ0ò^Ò”€§² Áž¾îµoï©puw pñv T¶+P¥v|Š:£vô÷÷S>ë§¼«æýžA®Þn½Ç{ú8*¬Écc‚(Ö;SË¢¿Æ4“à?¡“®³ƒ½ƒ}|…º¸:¹(O»z9ú;V¸xº¹ùú)Ï{û…»úº®ºñá@uW~uv ðóµqtrìçîçë:k´‹_£3qÐXg?òÕ±MÍY³:g­”Z9»ºxz{;:*›íãèLÚ¡ú'°úÚ$å£U¯˜L8ánU§e7F¨®ŽRÞ:Iyj¼òؤæåÎÕ×j¯¼ÏZùm¢zç(Õ£un²®s쬺Uõ®1u.+/Xzûqöñv š\÷‡1iÛ1ÈL9HK՛ƪ§ú1«N[®Ê¶\”ßžªË®5ƒpQ6ä­|ÖUuÑ[y§{¼ë¶¦êl3žª3Žª§U¿‚Uÿ„+T~‡×¼ÔWu¶NÁ|•/ö­{ºî˜”O«^¤¼7@ùíW÷® :Ô9öS=GQÔº±#Â|§îç2}ü(WKãÙnLÜ'šzL2 ò´2ö²=gÖd‹oÇ)cB}œ¦ g;°‡bÆ žì÷ê8S¿w'û!}:;ôí1ô›®s ¿ÕÖ¯Û<£þÝ“8]´{ûó3Å{R~*‘ºK]¥ÎRG¨\j3•NÝ£¾£.R‡¨SÔQê4u‡zD#j#Kü÷Jz½š^CÇÑñôZz½žN 7ÐéMôfz ½•N$~Lo§SèT:N§3èt&Eï$ž7½‡ÞKgÓ9ô>:—Σ÷Óùôº€.¤‹èbú }ˆ>L¡ÒÇèãt }‚>IŸ¢OÓgè³ô9ú<}¾H—Òet9}‰¾L_¡¯ÒßÑ×èët}ƒ¾IߢoÓwè»ô=ú>ý€JàawGÂÐ4ê=„¢³Õº¨YªmP{#ê('ÚIÜÿ,õu꿉lj3Å]f /‘HæIv°ÝÙ–oäÚh[£õ6ÞÝø‡&M›tibÑ$²IISµ¦úM'5½ÝŒn6¨™O³ï4úhx7·o^Üü§ÍZÄ´Øß¢ Åù¿µìÑÒºep+µV𭯵òmu¿H§KgIWK3ZlíÞ:…ëÌ¥k6Öì­9AóC6}ÚÄ´9 ¥£5TëhÑÎÒþ^§½Ž©N¹Î³¶ƒÚZ·ÍiףݤvËÛ=jŸÑþ¥¬‹l†l·ì„|µ¼L¢X®¸ªxÑ¡i‡YÖv¤;öîhßqvÇÝ":ýÒ¹ygEçA³»8w ˩.OººvÍÓU×m¯;[º5ê6 Û¬nIÝÎt×ìþm÷ z ½³z{÷¸Ð3¢gVÏ+½ä½õŠí­Ó»¢Oï>Ö}ûŽï›Þ÷ÿ¾YóÍão¹oÝ¿ÝÖ¯Y?—~7úìÔè;`Õ@z ÏÀŠAúƒâwœ6ø¡þtý³Cô‡¤|c°À rèZC±¡¡‹áo‡å+5Ò2fôÝpëák†?Ñ{ÄÌÿ72w$?jî¨Õ£ˌߙD™\7u2M1baÞÌ|¢y¤ùƒÑÍG÷]8ºÒ¢‡Å‹ÝcF‰sb숱þcóÆþ2.z|ãñù–î–±–7&¬ž(›h3ñ»I³'°jkµÔº½õë-Öxòöɦ´Ÿb7åòÔNS½¦^žÖkZô´ÓgO¿b3Ìæ’íÛ9¶gèÎØn§°gwf¦îÌq3ÛSöí+68¼vŒqé´Ïéçç—F.Ù®2××»nýÜæ¹q×us¿ã1Ìc›ÇÈÒàAKþv@Oá•>ÖûÕ‡_-ñF£Ò %ZÂÖ$è™DóËA—+ƺbèÍàÕ•>b<„Á ¿úˆ¡sÈé¹Ð’Ó˜ç#Öàb¿·•-ÈS2>›ÃêUíq¾½÷fÀ®ê”8F-™æêb³`Qìê0YGɶ脘-hÚ—²nßæ-Û·Ÿ‡€J©–ÐÁ$¾74ñMj…@ö h#-8GZ¬Ê&?+$ÒŠóûËNgz‘áäÌoh2º KFÚø[:ˤƒoHHO‚@ /AL©ñ‰ð„[ZýnⶈÅzuÀc±é³NÐÚ<¹ Ü9ÖaÂLüü'#ÖØáü»Ã늷ì”oÎÌÚœ‹N tÿÍÆ¬Fe”TiB†6ˆg9†J1É`¼·†ÅblÊ@þ ‡W‰Ä0’9¬^#SBÑïTOr“Q’{ó8hSuA z püqÕЫôÁs$¸uUÖâ+Ä8èWrUàaÅDò§- 5ô :ãæÐ¹ôÝM¸ÍÜC%›dÈÎ8‹N¢+.'ô‹Y)¥0cÿYt(à¨Ó^‡ìi› É o0 ‡[r0ˆ)Ïö<ÅÍ×TŽ1¸¥:˜1ÒwWs¼Æwõ)ÇfŒñJ ñx{ꃱV08 —б˜·1N—ÀV(% ‡:d†8Bj8ÆrX¿+¦± 6})ƒß #`L·÷ØP‹Å\Å!Ó]§š 7švéíÛ׮˕ 5‚'䯒²­Ûºk‚‚ÐEc3RÍÉ0¸î¸42yÄÞ©òì©=/¢RT”ºç(‹ó͸ËE¦»Ûš™˜Ø–¿|U|é’¼†m°”PžÛ9ˆàíÅx(ƒåøî×ÄØ€¥UäÜvГ(忚[P(<¯©dŽ^Õbïç «{ ¬ácæA+>Z+5©r?‡[zn^®wžÕwßäašôÖ ·ÆºxžR¬Ky44{kå¸+Õ{”ÞäÖìè.ÿä‡ydÈ7‡Ä‡®ua I°oŒ$$y jh6‚f)~!¿÷0»-‹ýÊ š?‚ ¾|ÝýÜý°ùn d†l}=-Yhì§"Š©©‰mÙë×Åå„(D;ÞCÇgÐü=Íoƒ9\lZâбE‡æå¸¿èJÙ÷>=±:GüÐzA³å¿dɱŒ wp ˜†œÑ¬-!™ó’–¦,?Ì®xÆ­½³'ï,ÑäáI~BÖÌYéÆV›™@hIó׈©*À-ùFLU£ª@19*€–U¬„gù@±Feb´æW«èÈwˆ®SÆuAƒ<Ç™[˜¸uA¤C˜Îî|ÁôœÙ¯ŸÑÏèήseçJ÷ý‚Þ"`ÜÞX\S>dgGÄÆâÖ4¿¡‹¿Å݇tÅMq3ƒ×¤û½n½†fr•6)»$p÷yQ…&ä0 B—Òž:Y–õ’>uï—ËmN™¦buBr]¯ê5Gk+qÉP<÷·ŠÅò8Äw#2xšž)¬f¬õ’öÚÈ÷N+õ<ÊС»N±xî ^)Â"³Ž*¹ýÈ"x@l`ÿgÏßÑ×®_äÓ¸ÁG™Œ„i ›c–'ÈÞIf¯ðˆ Elï™ö}åF½¯W™ƒ‚7¿+QŠ<,&&ïz ë£36p`ɀ΃çÐ º¾…{PZžS'÷*$·²=†pó0PjM­ÙQù‰0(åàà#@ŸoF¸—B|Æ~ò¯œ mÒY« viv±Î•H'ÜÉË»³i]Lt¢ :JÅ.EËÐdåè3’•öýE¢¤âãw*íWqh‹øž¤…ÁÇóvã[÷À-±ú«ƒö¹œÄSGä#%63M¦x$ç-á.L¬ãfß½>ù§Ãï}ôÃUÊù㼆P÷Ò‘‘ºÝ§™mWúâMáå2ùg$®²×[îàé¬WèzïúvLùØ2ý]P'¤ï5ÖlŒ©kg•æt>ODð®×[t •l:¹‡}0äúm1Þ «8£!#ƒæ{-ž…´qÓZ¡›º¸å‚ÉÁör¥cƒ¢ºT ¨z…Põ 9÷¡æZ•Ýü—¼5:‘PÄZ«¼·˜~å¸ ¡Hû¦Xä¾Þ;qŽ<1tKÔ‘p0˜ªµgAÂÌz¹„X¸ûÆ%„Éæ®_²~Ér7³ 7þ~ &ý>±9wgîΔCè(ºäQ`¼ ›ÖrIX’ÙÌIKwÚÄÊj|ðG{<…t¡”¨1éžà‚Ï8—™² x³,!lU$ò`ñ]¥#F¥aÅnYÞi37ÍD¦hºŸË’TF•x®–0©Z$s•Ðös0œ¹1{ü´0fž<&…¡ÈlUp¢ Ò™  Q›ÐÎe0kÙºÞ¹wvæBÐÉ£{½vÛm&‚QÕV%Àߪ“–GKòÑÖe[çn»6y"…~ás#"C–: VÅpHz0û£¹¶åÛq˜%Â,sZ<ÛÝÞzöDBÚfý!=ü¦â9H˜ë»K¾-l}øW:0aćj<ÇÆä.7Ü ÷Á!x6ñÇ`ú‹‹{î”È·ö?fˆîý¿<£ËUþ03„.ĉu1í]Žï3 Ÿf¥®ŒO•½D._³±nQë‹åPDp d²ßV‰<무õ‚"1•>꤉–äˆ(g4%v»)½:Á1è,âæWq¨tî÷\›cCv;ˆGuÕDZø„5tó“¿ yší‡&h·rëÛeRþ¥2âÖâ¾ïÂx¢.@ôÉÄÓ¸mš3ÉŠmÞÛÐQíã÷TQKbW.”auIFôžåIˆý~ïÞ‡òÊó5DRʯ@HÂpâO8þ5žD¿n“˳«^ :&кÚÓ‹À³«”<M0Ã[MÏg‹q7ÓUr܈— Ç0±*[¬¼Iõ4éš-ÜåøNÄ- Úa")9ŽÃ`O‡G0ĸŸ /´æ_«°E–ЭXÁ1FIúÍtìÕkæþ‡2>ŠàŒ( ÒOžxÐþ¨mÅì‡è!ªH;Z|ð@òIt‡å£T榕Bß ­ì•XûúL˜Q*»„õFIÑÖùÎû]KBÊ ‡»ß¯€vr~/QÅDÕàøJMè% ® £_¥1„×c…p4@8êÂ@O2HèÌ<à[Þ®j)®C,A.b)ËÔGÚ` íEü¶-\ÀöÅ›P G% 6¼wÅ]Æá–Q2hËÄ•lßJºt,=Ì=,*bî"yèB„LX-ÔR„MµFzÈnƒkªÖ¬¢ÐbtO;xù­\¸!‚…ž 6nˆ³ñ ßÔÜýÉI'dÅk³ã֬د]‹Ð;hÂJ!RéÁà~U…x _(C ‰ZêÂ;ÁúFs×nÀ"|MLP0¾Æ÷ƒÖbçà«b¸ª’I­D¤r` ÛÙꃄ#0ÆÛ°9NÃPæ) }‚‡ GšÕ‰cäXNè3\õ×Fºçtx¦ôâÞÜÓE;üd¸Jy¦Þo¾•äݘ³˜2³ ´r”Í>=ûõµÆš³,ÂMŽcñÃïZüèRôººñÒN¿«Zg›; õEv˜1<ã|½B¯r^_¸våîùÀ¯ÛçÒ¸‹vš¡¡hbØ$/;ÖËÞÑϱ>¡‰™ ÅgÊoÀ.1ÏÙé2vÚls7y ŸG¨/b§»~sãõ %°†¦¢w‚åy+»ÈÊé\Usfl•\ ­˜M{v&æ#örþ´ƒí§™Œ÷Ì:-Àê¸Åƒ@F¸ÔóçŸ vèòÍ+Üf†Ç|o'ùvè&†BdUN'ØæŠ´ø<μ×I‡ÒJ{Ì7ÿè=Á—0í.vf%˜ÞlJTöžñ¦Òó  Mœtvéo`é¬^é êLuo7 ÑY©¾2ð ×*¾€[\µ=,Íí°Eæ0Ôrq0v4 Š0‡°Æ&£½“òFçrô¶Ã¿@oh7è¬1Ñ%ÜÎ^¾òBk27œÏÍ)A(%lëL¶;¶â.ìŸfhdg=nŒýÑk7»@Hu{a1_Mh°€&">pØ,plA>MÈ9O®Y†šü™D¯œÉ™30ïWoqiµ•>#„©‰—Ãþ ã`7s~ãl:ôÅ=—½‚®• ö¬`Ä «RõÏCWw}-Afþæ³V’¼ÕëÓ·åfmÌF7Xh/xõͰ©Ò‹8ìÆäá³äÕûᬸŠQ'gº*ýÈG:ƒ:!ôV<ƒƒ¥à¥]@ýWO\CçÈç0Ä@Æ,QDwhFþ%–à'¾¯É¥lX·~ÝŽô-ù¨QÛ¸ Öê1«›e8œ÷”IßêÛ{N¤ƒuÞö†îÐíí3йçyLÿ€LúÖ`îl¾«õd{—ñãì÷?–ŸsN.}»ïæÊóíF˜ÙÏ43s(¸tå@a©X€3´¥á0<çp*n ©¤ƒ¾¼$ðd"˜ ˆŠ k2¹˜—árbbR4?=GXÈ'’€ñ†$¤c°~•¡˜ÈHà(ÜQÁG’k ‰ÀæµE9 Ï­ÄôSÐ@OPyÎþ+Ùç’ß“½ ¿3ëèÌë&¹ zé¨×w#üÑ…V{w¯Ûœ,ß°6~íö4·u5j㙾?Zö˜ŸÈ•íŸ2ØÐ~ê˜1·oßÉ=rV^‡Ãà%°¸šEüQþz½¤¡ë,.—¸ã·Œ3v¿c„chòR—É‚^b _~Ã솑⎌')î\ç7éö’ñÁ½ÄzÝ*”¸^Âe’‡Þ*O ©¯‰å$ÒÅM¹ªŸLùŸ•ü@èÇîl®í¿¥Vv¹"ØØI)ÖàTé-´¶šß.»Z"~#¿”àþ–†7q«8ö˜Ùd ææ‰HlŠEåÆÐ֛Ş«uÞyÑ—XÜ&ŠA#3-Kœsü³ç^Âv,{'9¾fÿÆ]ÛŽíÙy P ÷ÉgÁNrxñÇåãYÜÕ˜³ÚŽ Ãi™Ç׳eø&Wžá‰l €÷²Šô†'Ø $‚wi+‚™¼'- $Ë¥í(YÇJ<—Ïš2ËžšÄbZòéØÅ¨m|cõZ^ ðv}5 pðFZ¥g„,f9Lp²í‹p{„[nùv×äýæå®wQ:—uàt§´ˆ­‹xèyܱÌ4{0$±ú^´#d‹ÛFŸxC-†.2XèáèäŒÜ_bøÞÈÌE׈“¸{ÝŽÍù™)¹$VøÐ,$iÞ úrî 0xÙ ½„a/ß _m¤I &r]ëëêÞÕýêÞo‡Üî,ï¦^”ã6c¦‹«Ý ל‚œœ"9ßù=WE0’¸‚áåÄuJÝDãJå£]«ýù㣮5 Sg¼¬ô{I߆F"¸DÔш5m¢¾»KCHèÌv>³¬³*&ÅŬ_¦½}A|r&A‰DÿðÄ+²ë/ÝÏ›Êaª] Nžpm}r*ºÊ’ß¹·dɲ¥ý¥ù4Þ—«ŠÄ£Å¸™„ÄbIªZA¾h«0. ÃDñ‘äFPTNï- 4Òk ¶·D iY~+ÐÄ®iO$ª.¦m¤üv¾·ôu‘O°#1sµÉÈGWØgÆg ý‘½Ü6ºgxÉÖ.X»`ÝüËW-]³ˆ•ÞÇÆ;O饃5Ÿ€Že…[ÏÜ–Z‰aƒ›CïÜ´Û+®k¯–¬—à_'sÐÍpw õFÚ“§ž8½kóŽô­riÅ0禟[RÙŒ”¤Ý{·Íqóñu–iÀ.Á}¢["0'ô4ømÀ-GˆiFœŸÅ÷áªBq>”ÁÍÔ«@K>Œ¯µÐì¾VÈwe¶æ$'ý|š?Þ{ ýH$¸×CÜëèõ– E± d ³¹™]xþlŽƒ±a€7î‹E2ÜTßmìb܆åçšÏ¿VÆymE{Ûò–dÅôÙ¾V Y;Éî;R’v¦oØ…N°@ô©F î¸B<ÌuæÊá“wä@ä!?)± –M`V=e–Åú¡Å± Vi­_´å²à&¹3íä(™Q·lf÷ú9&ò029àÚüá ‚ÐH–üvŽ ÷–¹UËCîBŽ„Ñbh&!̶c‘„o…ÛTµÂJi¨VÌVPAœX#Áy•ƒ\⢵1)KŠæe:¡©ì8û™ãG»ç\]&Ãí˜XÜñÙ·Ð… …?=Ù]÷cûäÒûóÒ .è@ã~×pû!f~Se~ólÑXv>hJbsV&Æmݵ31±%;=';¹–Ï,ª’…Ð\öÉ$x„-–!Ü áÞÅXä7ûŠéNÝ Ð%&h70¿€Ko%Ü¢ùqÇÅøÇ,‹^´(,"*ÍA‘kf'NÚ¯¸ev¼Á~¶KõØLlZ쪕ññ[7¯MAÛЖÅÛÃO8j¥…¥,Ú…n¡¼â5/TùÍ®|4¦Áô2¡ƒˆƒ‡.Æ­?½ÿÙÅôè íºü@¤ÂÜg‚ƒÌË~žmŒ>9µ‚Yv»øìEÄž.˜n1s~è[ùP³ ™+8`]Çe‘€»=°4d«f0Ò¸¼9ÖgpB•©7†lü ±ß|'Á^Àrxã D\M$r…PICÀ"QL%ôBÐÛd˜üfu™_°ÓnÁ…è"ÜÕ30¡<àeÕ&û"Ï‘ðÒq"XÇœq$¸‡gÔÉ™®X˜•ø˜>›ŸÔjèñÝ…D@èáNN¿ð¸:?{¡,çgô=õ{fwîÑK­©ƒûˆ¥§ÌMR{¶í¨L¬6uS&Öº§<>b@O­Ãvb>ŒßÅmrŽ·A3XÜÇ +Ö˜j³5Ó[æXÂ…î_xg¡ïÍ×Т¤(Ô%[&Œ– Òe5TFpX k€š0…ñQ»~" võì'Í/ëMrغŠ1#yým×oŸ‘ 6W ÅÝ"(á͸¢Å©~Ʊ Ã,‚ýîãæ+Øûö$¸Ë\Ã.GxȽ b»x-&«Ý_MY¬ÃÌèg·˜µ_ÉMÞì{=C/wœ>¶‘8£¹„Ôk“±Ä˜¶V&` 4X©.$óGÈÕ[вjÖTFº²ÈÖe˘¶Ø7Çßà`-p?Q–“tö \ê6ŸGx)‘®ÄzG9ßiîÁ“ÛÁø ô„^—_¿?¶'xÚyÒ^¨Ûº–ºÇjÔRú(Ä7D‚4%  ”ùíkвã»V׉¸ŽQaá‚Ï¥¼ðâáBö[zû«òß‚jÙ˜|"AÔ*:¸‚´4”o“îÈ™%›o ßx0:%±GórNd¦G…%ɶ…Ň­±‹] ZÌÒS‹vÍÝá~Ùp_'%[‡;βs󛄬}|pÁPÖÒú# Úì²zN€š8Û}Фã]µ$§Çç 4”²¬x>+]<ÿPò²ô¶QnBÉ.' µœCfEy¡p²rv+uYç²(6¼­/ Y<Öç~iV!:‰’¢7ÌOcAƒ•†M7 ËÀ¹ŒF÷ ç=|Ï8|ÌŽ1¸ïÎuo¡èpÆâ勳~µ ç»ÊÍÔ 3ÇZz;Μé½ÿ왬ý ùï‹ïÓˆ|‰`håznš³óôé¹Î‡æå<ì’;]n«¾}khPPhhp`hâö퉉)$êŸ[ ¢ S”"XZ‹^‰.|öø#KŸ¿ IRrÔTàèm>¿6Y„竦1¤?}#Á „X²••ö\•Á¯âïÞ 2PLðY ˆ±ºr«ˆïU“Þ•3 '7ßÅÞ×¹ ­!Ys·/M¢©ß˜Ø‡V£c‹ÏËv{9à$±|ãÑ”p'/Vºv—ë„-†mqw4lìrÜ‚…6LܱԤsˆ=‘îQ?C…©°iÖ¨;Ûõ˜··Ïî¼zV&56ÛÉýa[h†^”e½g¥»ªŸçô]fŽšá›š——žz4NV—¹:aÕ–uÚÐá·ævöþóèÊvŒ"˜\숆ÑD0Psr‡ÄµëV&!í¬¤È9Aa³üã¶O‘‡N½¼cɤ}·p×é¾é3æÎ_¾t®|Ç9BйÁ ¿†Â7nB‡› Â×%áKý+C8}só!CJÍïÞ.+½yoôÅArõÜ,o×YÂ_Ö¾œY9rxt“«ü+_dxýJ$îSå¢|N¿t4yîâ­úϹº||Žßúªû#áü3̓ó\Õ¹Nü¹j÷ÖÿÔÑS4¸ þm üÌáö XÃ/bÜV˜XÃrˆu{LÎÉ&@—)¸ ùÆD>À:žÂBGUWHÎ}š2¬vÏÊånŘ`]ñ%JA·ö—0ñä‰d½ƒ…Eð”C‹ç[:öío±¸Ý›^ÐíAiæ©|Ù®ŠcïSË™UClÇ™#Öræ¡  ‰§Šå·Ê¶Dßg±â8÷ÑIòG  îÛ tD|Æa3"ã ÂfĈ›Uþ4ÓíG±?Ñ?A7r?ñ\AnÎÄå%\IÙ“‹´7£uÑ;æ%DËaCð*oÔM„;.˜ …ezМ±¬j:op¸ŸÒŽ@k6b‰VVDú’è *Üš™¹{÷¶cîŸâ[iAûÚ¤w‰@¬i<ñò¹ÄÈò+gñPII®âþŸptSp{xÞa=¡æ0¿SÑvâq·G)+ãÒeE’°e¡ËC;%hóîÃ);î ÎBph…õM@OpŽ™$ü¬!Ä–ßVÿ:DîbÉõÀjÂØ¨Òö Qð&ýH¿ºC‡B|QÎûðyÜòƒ‹ÓÂ3¼‹,võ ÍúÒõ^çµ%X¾&jetj+}fu¦¸è´€z¯ dkWÏÔïªÜBLýfj9ûpô!ør`€»Š‘t}ôú‘I°î.;~þJm™á-å\?oÀÁ)¬W%•X‰¿•Ü*ãuüF" "p•1‹ ‡SQH@ߑʜ³È.(ÄÙ¡€ä%X«…ŒÑ‰I×®8qM¦,QSvÿ1Á•?Áã? ïî64@Êàà+7îÂá»7¯ÐèÆË§üÀ"þ ?Š‹Î[”šæY`:š¸ŸV†ßâN¸ão 9¨_=ÿnµ¼³ÔÊÓgbMœŽ?û!¿äòÑ“×Ë{ûãáäã†]a8 Nà FÄîz9FØM3Šƒ¡Ð˱ÛýŽãöБÜeíAŸé\ ¢íjX ôö‚Zé£/ìHunTæ|6𫬠IzvímºÚ ŸyηxÞFúŽ@•YÜfæxÌŽ9ȉõ˜àî²­ ZÖ‡‰í[2õböÇŠ†"^¥#ú,“Â…™Ý°:´‘¶ã+m¸i»ûO]´rÉʘXméO3Ò¢W¸m4Ÿ¡u0pã¢ô{­ýn…9Á™ÞéÚ.›BVÍFÈ~žK ÑL·a«±ØüñI0ô%qÖcaˆ 4Ç=ÞÈìpWqм£îts#£é¥oß*½.¯y¿RoœYÐ^ç3 OÈÖŒŸûy²Ýæõù V~€48ÜZøÜ­…æîÝí>µW?©ÎÀ†ÖC˜£`wæ›×G«·ápÍUˆrù&Ü0Þ{TÀ~É?TØŒ[ÂÕb­Ú2ç;*÷VSìœR·Ø¹ä‹ÅÎnH¤­Á\çÙ?ðŠ­ë{ÅiÊ+¾WÜ Û‚bQ1è Âtò¿¦!ú|Â×¥,þ‘Òšªaà\Oªª "XËÇ¿!€Ð…`–ˆ¯Í·ºýPp6ÐúG0ø4nˆ .rO™ý‰s=åá’˜…hùدˆLbßncæÆ/‹C‰ÑÐzyÜÔ”ƒ)Ûv£Cìõ™F2Ueù#qê@½•ožçä1ÏVL`à?ãT°£~_|6ʤÏofª*å uª”~ÐÀšf¶¾–žòÚúd3¡>ùUu}ò?TVNúûÝ'Ñ(ö?tXÖmk=Á ‚ñbž?X-…Ll¸©¯ß䃼7D$eÌ=‚N CÂz€zË@‡ùt=Á ëÝ@&w˜¸v}MgvØ,ÿÙqÛ§ÉC§žž³{qmÇvî¼åKçýC‚‹õˆàÖ âTb{çSÓÙBÛßG!C€§ òû™¸æ-/=&çh$|‹ ¤r$7ÈÌlðà2Ó;÷ËJïß5+,«^œël;ÝÙeú ç¼¢ƒ¹¹å5†¶Úu_ ÌÑ¿et¥ƒq ØÁ‘ÿ}1#Êð]]»þ?¨®Ç1¼Å'^ðŸ£g‚ýžÕU1]AÏ]à˳º²%}‡Õ?ôþ<¦¬'^Wˆ¯k%}ýg„LÊ‚¹¯qp«¯œz¬%±a¿wpë–¯W:8vQR’ÒÁeí_-8¸ÛÐÜ„Š#c¡â(å-W5‹HÔ,†·VÇÆ`Œ›`còiBŽÈ ä&ãND¦ ò¹øÿß•\")u•JNêÇ  %Ì&û+2Cß-˜Üã ×½nÁ8«U¹<Eð”#ŽTžZ|úxù®·(ôÞëgër›Sæ©X",ºÀç†0¢ z·ˆuGPÆ”‘æše¿i2@CçŽó¶ŸíêaAnnû©Œ]®c=þœ¤i¸ðôgÇ?CömØù½ú 4{.‚›Â}–ÌÆ-kââ׬Y¼9+ùÖñä,tš}0¹XO×jZŸh´8v‘ì)‡V°Éi99ÛgFFt-3œä=„…suDìj- ŒPà©¿&jÒnÄ_ülñp°Ûïàà¿oÄôÑüŒ?ú“k¶ÎüŽ‘§•v¦zWé…†—qIÄýuiñÖEQߺÔÀ\†¾Wügå¯9ßNý«/‘Ç”Ú(](Äø!úý?¢×Jiý`ó…2¨þ‹‚ÚßN70§üQø®ÔÑäûÿš JÛáöD>kÄÅTMU‹©^%Õ]N¥P.§j{ÿtÿ.¤Ä1Oî¼oÚ}Ò™áдÚ)ÂÖß-¬ú-u#È÷ú'ø@‰|§\®6D|s‚|-Vû6ôÙ¯X“˜8¶ÎétÕD^ê’rº Ò" £E^²jeYý)ñº H×gNÄ )ñûûçpHá?+l~'l¿jÔúÛ·dnû«@ÿ6 JógKœMìßX‰{}^«E¶:â U¨^Gz¥ï:4XË÷ûPÄRÈŸú¯2Àݲø¨¿ÊÔý©ú1ïZUÌûïˆ>Á¶g”µ¹l' Ý8ñaŽt0–4”bù–÷‡Ÿ+)ùêm°?X|¶ÿxé»+,ùl·¾vSü ˜74®6ᬬŒ K“>K– —¹@3ñfؤ©Yvæwío¢}hwüÍ4ºK ý:#Kd{xöF3©ebìÃ,_GŸuhcìú›YX̤³«˜”§ÅgQÊ ?7½8­QG7™ Üuìæ†X[†¼ç3E¡ùäµ"R¨T©”ß ¡ýs°x›žiZ9Ú7ªhCh_¥ñœá§iÞ…7büæ ?·— ÂoÀ[1n_5ã ¼aîã7ÂŒÙÂ'4Ÿu›«ŠìËG2•íÕ«„e$¸ég–“TÚöWiRHóU•K¸ªpÆ y¯pZ /ª¦jáUw¯B(ióLʈ޶$áåÚ‚ä;l ½xùÒ˜˜9Ó–, ‰ ^*ìñœ|‚ç“0e#óeÌIíÍ&3Ÿö§*ô¿°¤¡Ò§ºF!^³ÒŽÁ„è|23¶ê5ýÈSý«"ÉçÍÍ‚Ÿó ¸ˆF!ù¦èMå·\üªSikWîEÚEh_XŠçîÛ†£Èoy`”¥éQ¿„)ȹDxzÚÍð3G,¦ï|íl^E¾,»l´AoY˜EÐ÷š9ca˜³ ŽT ä"¿]ìéà?ÔÎ~2b­¼Ž|ìÅoåg;¥’ ©àãRh~„s±øÉª š‰!š`_Fy¨M1{Ît/±ÀÄ87GÆ 7#ìÂM]"‰Ù±N¢a{å\nƒ­«X â³ Xó¬à @øë/qïãý?tápë_wàɼw¹Õë‡BXRµz~0þtÖàxÅŸOê¶æΊ‰² n¨È£ÎÎ %…*4´ÛHŸü»ûƒHµ5Ë¿\€¢4s @=Dè–1ÃÄŠïøt7-é„Wük«—Jb§ûØE±v’Ë+ŸFwØ·’?a)ÛÃýz .<ï0ô¯M÷ë>Ú/`þ° º,lùÄN ز{wÒÞ‚ƒò“gÚ²moÑæC¨œ­Nç6œÞ}B¬OòÊâ Ãlý=-rJö+œ›²(uY:ÚRV¦Ç±ŸL®T¨,«;Ð7¤ÖI ,ê§•JVK'ßÑiõ><îéTýRaFèË“öÅÞÄ´ÖxÇD¡Ùµ€Ôö$èßÛD]Õ|bCcú/v ?¢^P®LYÕtÂàA1é< â`êÚ7t'xGÙiLKÕ[Û’º·ëp×{ÃÀ(Ìñ÷"ÿøäéòЩgæìª7Iº`ù²¹u*]j¬€•^ø¯Piß#üÂ/Z‡j-y|“>óÉ왚N*¬º®o@ÿ…Y±îðÃÇz>åÌ6èªS+9Q– ´w°7ˆÛÊ÷øPJÔ#'°G…z´kQ!×_GX«1}v t wô‘¯ÒgŸËý í;õÖ0üçÝåëÅû8òð‡æIÊ’÷L»Ç srw@SYËÃnw’“W®I“I"¢ç,Ÿ‡X·ÙÛ2ówÈ«ÈÏýX>£V ±‚9ù—¦Õ†à<ðÿÊâ—>*û¦4(JÛF«ŒJ©÷¿oV¤«ñ¸ªó º?•2¨ìþ9ìL\^äa¸S[¢àûXT£+×C?»ihkyÌã‡ô¤qÂÚ„èå¡ÄnÙ{ðÀ¡òL9^%¨“A}uŠÔÉŠùQؼò_ÝÍÏ—·ù´bè?”úa ËÏQùk·>„=¼qC ÞzÐàËe¨Z`T[‡úÏïÙ¹T6 P¤†ðA€@ü6Ò9ÿCòK£{Wù6¨0_Ï[ØÓ@þ[_V¦–ÿuÙøX™RG_â` ØZ¹ñ£úW5ˆ û ˜%[ Íj8ªœòõþ”ïê;Ug†›ª -¾T"ÖÏ‘‘X>mË›ù§¥y$ži‚i´¨odaÚãìì,f€‹‹²Œåóô¤•k” ¹¢• ¹cY”sàrŽ\`®äs¤°û×îš%]ý¤Aêü³;qf4à5þGó"—>Îv}f‘á?S—5ûc}ßgßð¿«²©»‹b~EµøC¨xô‡_ÌÔðøFùŒŠm>Crj÷—¶Ñ.«?ÉU-*›*ˆÐÇ¿‚ X†u0ÿ'ú©ôó«6#$¶K·ê§/¯½úÇò>«´S«7³+«“[QV·‘^ûv„–vƒóp¨¡WOŸ¼•€m…—ÖŸ;y}JXC•0>S¦ò¯Ö¨hÙ×–¨ÔnùWTZXwÃlþ;‰Ç1»T³Òà/psàJ‹Rî‘[ƒ‚vºÔò"VŒÆÚæ’Mxp}¼T.op·ÇËõ*­jÇÿ„¯ÿâÐ[æ;×½˜p臺²!äÝêôQ:á¨ð£Aç^“R<ê5âõ¿É*VÀHÔÍ%1‡’3 ײ…ãåÓ,‘>ÛY¹×éçt¹î¸Vcî hCÈ ö{”J óH|PTyö=ùÛö”}'?y6aëÆÃ¬@~{W%ù½¶„fÎÛ¦$ÿ';%¸¿èWŸÏÐ3cëÊu{åÆ6³ÐLÖ²f58.ãs•¼;§ä]¢ßÆêmÀá00"I"Po°ÿÊÈ»2]@\'©6ú¨uŒôþp{€ßMJX—E Kв…1 Ð\¹j~\øº¥ëQ2+-G; Žå°uöÊ­AaOnÖæ*þ«¼‘¢”w©c¼ në§ê²oßöUšIÞU30jQtd”Ÿr ²Q‡ÖLÒ>*Ê)¸šÍ~Ý&À_=ï6Џ½ú¥:ÿå,âA¾mÝÞ|ÄíÚö—G#í‹{Ay{ÿwÿ—ÄAÔ[|vT•3Rå ‰vvV‘Iˆ›þ§„"f­SÕ°†íµª>âPÝEiƒ„nžüꕜCº~íÆ7ÿ•»•~>$¯Ž)?6®ò:ÊL©û·/¾@ó†D÷ØöW«I|¾´MÊߨܺ|²âQÕ¿W7ké[ñÕ|T×._ç9åëU.|Šjƒ?µÕº´oß¾ABÖŽyíŸó™$àŸYHRþq©Ñg8¥rµÙaj¨âñ'©²¬ZÜ0YªÅø£8Tãëºäéüò´þ…0æ¾,Áuýµr!DÅ_¬/µ½%&h;Ÿ†I¶ÛhÜ:4Æk›6…ëš6£¨ÿ¸´ endstream endobj 135 0 obj 15288 endobj 76 0 obj <> endobj 49 0 obj <> endobj 136 0 obj <> endobj 32 0 obj <> endobj 137 0 obj <> endobj 14 0 obj <> endobj 138 0 obj <> endobj 35 0 obj <> endobj 17 0 obj <> endobj 139 0 obj <> endobj 38 0 obj <> endobj 140 0 obj <> endobj 20 0 obj <> endobj 141 0 obj <> endobj 2 0 obj <>endobj xref 0 142 0000000000 65535 f 0000059396 00000 n 0000317399 00000 n 0000059247 00000 n 0000056873 00000 n 0000000015 00000 n 0000003791 00000 n 0000070397 00000 n 0000070249 00000 n 0000059444 00000 n 0000061129 00000 n 0000059526 00000 n 0000293952 00000 n 0000293733 00000 n 0000312026 00000 n 0000273916 00000 n 0000273701 00000 n 0000313449 00000 n 0000253393 00000 n 0000253177 00000 n 0000316026 00000 n 0000070101 00000 n 0000070133 00000 n 0000070163 00000 n 0000070195 00000 n 0000057084 00000 n 0000003811 00000 n 0000014543 00000 n 0000072147 00000 n 0000070544 00000 n 0000236699 00000 n 0000236471 00000 n 0000310746 00000 n 0000196944 00000 n 0000196742 00000 n 0000313303 00000 n 0000214974 00000 n 0000214755 00000 n 0000314772 00000 n 0000081119 00000 n 0000081151 00000 n 0000081183 00000 n 0000057279 00000 n 0000014565 00000 n 0000018570 00000 n 0000082873 00000 n 0000081270 00000 n 0000199464 00000 n 0000199250 00000 n 0000309496 00000 n 0000091845 00000 n 0000091877 00000 n 0000091909 00000 n 0000057474 00000 n 0000018591 00000 n 0000024746 00000 n 0000093588 00000 n 0000091985 00000 n 0000102560 00000 n 0000102592 00000 n 0000102624 00000 n 0000057669 00000 n 0000024767 00000 n 0000028956 00000 n 0000104303 00000 n 0000102700 00000 n 0000113275 00000 n 0000113307 00000 n 0000113339 00000 n 0000057864 00000 n 0000028977 00000 n 0000033931 00000 n 0000115018 00000 n 0000113415 00000 n 0000188640 00000 n 0000188435 00000 n 0000309350 00000 n 0000123990 00000 n 0000124022 00000 n 0000124054 00000 n 0000058059 00000 n 0000033952 00000 n 0000036865 00000 n 0000125744 00000 n 0000124141 00000 n 0000134716 00000 n 0000134748 00000 n 0000134780 00000 n 0000058254 00000 n 0000036886 00000 n 0000041455 00000 n 0000136448 00000 n 0000134845 00000 n 0000145420 00000 n 0000145452 00000 n 0000145484 00000 n 0000058449 00000 n 0000041476 00000 n 0000046480 00000 n 0000147164 00000 n 0000145560 00000 n 0000156137 00000 n 0000156172 00000 n 0000156205 00000 n 0000058647 00000 n 0000046501 00000 n 0000050331 00000 n 0000157886 00000 n 0000156282 00000 n 0000166860 00000 n 0000166895 00000 n 0000166930 00000 n 0000058847 00000 n 0000050353 00000 n 0000054694 00000 n 0000168611 00000 n 0000167007 00000 n 0000177585 00000 n 0000177620 00000 n 0000177655 00000 n 0000059047 00000 n 0000054716 00000 n 0000056851 00000 n 0000179325 00000 n 0000177721 00000 n 0000188299 00000 n 0000188334 00000 n 0000188369 00000 n 0000196720 00000 n 0000199228 00000 n 0000214732 00000 n 0000236448 00000 n 0000253154 00000 n 0000273678 00000 n 0000293710 00000 n 0000309327 00000 n 0000310670 00000 n 0000311934 00000 n 0000313204 00000 n 0000314625 00000 n 0000315943 00000 n 0000317198 00000 n trailer << /Size 142 /Root 1 0 R /Info 2 0 R >> startxref 317625 %%EOF Node-path: powersupply/itest/Bilt/trunk/libMagnet_V120/Modification valeur RMS.pdf Node-kind: file Node-action: add Prop-content-length: 36 Text-content-length: 0 Text-content-md5: d41d8cd98f00b204e9800998ecf8427e Content-length: 36 K 14 svn:executable V 1 * PROPS-END Node-path: powersupply/itest/Bilt/trunk/libMagnet_V120/TestClass.cpp Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 8233 Text-content-md5: ffe62e75aea9b9ce8b18ab33f7dcf53a Content-length: 8243 PROPS-END #include #include #include #include "ClassMagnet.h" #include "Exception.h" //g++ -o TestClass TestClass.cpp -L./ -lMagnet using namespace itest; TMagnet *Magnet; void *func1_thread(void *arg); main (int argc, char **argv) { int val=0; struct idata myDataX_Magnet1; struct idata myDataY_Magnet1; struct idata myDataZ_Magnet1; struct mdata mymData_Magnet1; struct fdata myFDataX_Magnet1; try{ std::cout<<"---------------TEST1---------------"<addrIP_magnet()<pole(X).set_current_DC(1); Magnet->pole(Y).set_current_DC(-1); Magnet->pole(Z).set_current_DC(0); Magnet->set_state(1); sleep(2); std::cout<<"STATE :"<get_state()<pole(X).get_idata(&myDataX_Magnet1); Magnet->pole(Y).get_idata(&myDataY_Magnet1); Magnet->get_mdata(&mymData_Magnet1); Magnet->set_state(0); delete Magnet; std::cout<<"---------------IDATA---------------"<pole(X).clear_ferrors(); Magnet->set_state(MAGNET_ON); for(int i=0;i<10;i++) { std::cout<addrIP_magnet()<num_magnet()<pole(X).get_idata(&myDataX_Magnet1); sleep(1); Magnet->pole(X).set_current_DC(1); Magnet->pole(X).get_fdata(&myFDataX_Magnet1); std::cout<<"-----------------"<< "nbr frame:"<set_state(MAGNET_OFF); sleep(2); delete Magnet; } catch(ItestException &e) { for(int i=0;i #include #include #include #include #include #include #include #include #include #include #include #include #include #include "ClassMagnet.h" #include "Exception.h" namespace itest{ //--------------------------------------------------------------------------- //#define __ITEST_DEBUG //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //---------------------------CLASSE SOCKET---------------------------------- //--------------------------------------------------------------------------- //SOCKET //Création de la socket, connexion au BILT Socket::Socket(const char *StrIP):init_device_done(false) { struct sockaddr_in adresse; int resultat,flag; struct timeval Tv; fd_set myset; #ifdef __ITEST_DEBUG std::cout<<"CREATE SOCKET"<init_device_done=true; //modif V202 07/06/07 //Set blocking // fcntl(Sockfd, F_SETFL, flag); #ifdef __ITEST_DEBUG std::cout<<"END CREATED: "<init_device_done) //modif V202 07/06/07 { std::ostringstream Desc; Desc<"<init_device_done) //modif V202 07/06/07 { std::ostringstream Desc; Desc<"<"<NumLastErr=atoi(Ptr))!=0) { std::ostringstream Desc; this->StrLastErr=strchr(Ptr,','); strcpy(&BuffLastErr[0],++this->StrLastErr); this->StrLastErr=&BuffLastErr[0]; Desc<"<StrLastErr<NumLastErr); throw e; } } //---------------------------------- char *TBilt::query(const std::string& _Str) throw (itest::ItestException) { std::ostringstream oss; oss<<_Str<NumMagnet<NumMagnet<NumMagnet<NBRPOLE) { std::ostringstream Desc; Desc<NumMagnet<Pole[Num]; } //--------------------------------------------------------------------------- //GROUPE //Allume ou éteind le groupe //Allume ou éteind l'aimant //0=OFF;1=ON //---------------------------------- void TMagnet::set_state(bool val) throw (itest::ItestException) { try{ std::ostringstream oss; oss<<":p"<Group<write(oss.str()); } catch(ItestException &e) { std::ostringstream Desc; Desc<NumMagnet<NumMagnet<Group<query(oss.str()))-1); //-1 pour avoir meme numero pour groupe et instrument } catch(ItestException &e) { std::ostringstream Desc; Desc<NumMagnet<NumMagnet<magnet=_magnet; mymdata->state=atoi(TabRes[2].c_str())-1; //-1 pour avoir state inst = state group parse_fill_idata(Tabsplit[1].c_str(), &(mymdata->idata[X]),_magnet); parse_fill_idata(Tabsplit[2].c_str(), &(mymdata->idata[Y]),_magnet); parse_fill_idata(Tabsplit[3].c_str(), &(mymdata->idata[Z]),_magnet); } //---------------------------------- void TMagnet::get_mdata(struct mdata * mymdata) throw (itest::ItestException) { try{ std::ostringstream oss; char *Ptr; oss<<":p"<Group<query(oss.str()); #ifdef __ITEST_DEBUG std::cout<<"GET_MDATA: "<NumMagnet); } catch(ItestException &e) { std::ostringstream Desc; Desc<NumMagnet<NumMagnet<Group<Group<write(oss.str()); } catch(ItestException &e) { std::ostringstream Desc; Desc<NumMagnet<NumMagnet<Pole[i]->set_switch(val); } catch(ItestException &e) { std::ostringstream Desc; Desc<query(oss.str())); #ifdef __ITEST_DEBUG std::cout<<"BOUCLE ERR"<NumMagnet<NumMagnet<query(oss.str()); return Ptr; } catch(ItestException &e) { std::ostringstream Desc; Desc<NumMagnet<NumMagnet<Inst<query(oss.str()))); } catch(ItestException &e) { std::ostringstream Desc; Desc<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<Inst<query(oss.str()); return atof(Ptr); } catch(ItestException &e) { std::ostringstream Desc; Desc<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<Inst<query(oss.str()); return atof(Ptr); } catch(ItestException &e) { std::ostringstream Desc; Desc<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<magnet=_magnet; int var=atoi(TabRes[0].c_str()+1); myidata->pole=(var>5?(var-7):(var-1))/2; myidata->state=atoi(TabRes[1].c_str()); myidata->fail=TabRes[2]; myidata->measvolt=atof(TabRes[3].c_str()); myidata->meascurr=atof(TabRes[4].c_str()); } //--------------------------------------------------------------------------- //INSTRUMENT BE549 //Lecture de idata : NoModule,State,Fail,MeasU,MeasI //State : 0=OFF,1=ON,2=WARNING,3=ALARM //Lecture de l'état et des paramètres de l'alimentation du pole void TPole::get_idata(struct idata *myidata) throw (itest::ItestException) { try{ std::ostringstream oss; char *Ptr; oss<<":i"<Inst<query(oss.str()); #ifdef __ITEST_DEBUG std::cout<<"GET_IADATA: "<NumMagnet); } catch(ItestException &e) { std::ostringstream Desc; Desc<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<Inst<query(oss.str()); return atoi(Ptr); } catch(ItestException &e) { std::ostringstream Desc; Desc<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<Inst<query(oss.str()); return atof(Ptr); } catch(ItestException &e) { std::ostringstream Desc; Desc<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<Inst<query(oss.str()); return atoi(Ptr); } catch(ItestException &e) { std::ostringstream Desc; Desc<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<Inst<query(oss.str()); return Ptr; } catch(ItestException &e) { std::ostringstream Desc; Desc<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<Inst<write(oss.str()); } catch(ItestException &e) { std::ostringstream Desc; Desc<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<Inst<write(oss.str()); } catch(ItestException &e) { std::ostringstream Desc; Desc<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<Inst<write(oss.str()); } catch(ItestException &e) { std::ostringstream Desc; Desc<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<Inst<query(oss.str()); #ifdef __ITEST_DEBUG std::cout<<"GET_FDATA: "<nbrframe_sec=atoi(data.substr(start,end-start).c_str()); break; case ERRSEC: mydata->nbrferr_sec=atoi(data.substr(start,end-start).c_str()); break; case RMS: mydata->rms_ac_sett_sec=atof(data.substr(start,end-start).c_str()); break; case AVERAGES: mydata->average_sett_sec=atof(data.substr(start,end-start).c_str()); break; default : break; } start=i+1; i++;} mydata->nbrferr=atoi(data.substr(start,end-start).c_str()); } catch(ItestException &e) { std::ostringstream Desc; Desc<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<Inst<write(oss.str()); } catch(ItestException &e) { std::ostringstream Desc; Desc<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"< #include "Exception.h" namespace itest{ #define MAGNET1 #define MAGNET2 #define NBRPOLE 3 #define INST_MAGN1_POLE_X 1 //Instrument du pole X de l'aimant 1 #define INST_MAGN2_POLE_X 7 //Instrument du pole X de l'aimant 2 #define P1 1 //groupe de BILT de l'aimant 1 #define P2 2 //groupe de BILT de l'aimant 2 #define BUFFSIZE 130 //taille buffer de caractère de réception #define SOCK_PORT 5025 //Port de communication socket #define MAXTIME_CONNECT_READ 10 //temps max d'attente pour une connexion et une lecture sur BILT modif V201 #define X 0 #define Y 1 #define Z 2 #define CONF 0 #define RS485 1 #define MAGNET_OFF 0 #define MAGNET_ON 1 #define Q_SYSTERR ":syst:err?" #define Q_MCURR ";:meas:curr?" #define Q_MVOLT ";:meas:volt?" #define Q_IDATA ";:idata?" #define Q_MDATA ";:mdata?" #define Q_SWITCH ";:switch?" #define Q_CURR_DC ";:curr:dc?" #define Q_FAIL ";:lim:fail?" #define Q_FAILSTR ";:lim:fail:str?" #define Q_STAT ":stat?" #define SWITCH ";:switch " #define CURR_DC ";:curr:dc " #define CURR_AC ";:curr:ac " #define STAT ":stat " #define STATCLEAR ":stat:clear" #define SYSTVERS ":syst:vers?" //comptage #define Q_FDATA ";:fdata?" #define FRST ";:frst" //--------------------------------------------------------------------------- #define ITEST_EXCEPT_TRY_STR "ItestException exception caught while trying " #define ITEST_EXCEPT_MAGN_STR "ItestException exception caught on magnet" #define UNKNOW_EXCEPT_MAGN_STR "Unknown exception caugth on magnet" #define SOCK_ERROR_STR "Socket error" #define CONNECT_FAILED_STR "Connection failed" //--------------------------------------------------------------------------- class Socket{ private: int Sockfd; char R_Buff[BUFFSIZE]; bool init_device_done; //modif V202 07/06/07 pas d'exception dans constructeur mais dans fonctions membres protected: public: Socket(const char *StrIP); ~Socket(void); char *query(const std::string& Str); void write(const std::string& Str); }; //---------------------------------- class TBilt : private Socket //public Socket modif V202 05/06/07 { private: char BuffLastErr[50]; int NumLastErr; const char *StrLastErr; //modif V202 07/06/07 passage en private protected: public: TBilt(const char *StrIP); ~TBilt(void); void write(const std::string& _Str) throw (itest::ItestException); char *query(const std::string& _Str) throw (itest::ItestException); //ajout de const modif V202 05/06/07 }; //---------------------------------- class TPole{ private: // int Group; int Inst; int *PtrSock; char *Ptr_R_Buff; int NumMagnet; int Pole; TBilt *Bilt; public: TPole(TBilt *_Bilt, int _NumMagnet, int _Pole); double get_measure_current(void) throw (itest::ItestException); double get_measure_voltage(void) throw (itest::ItestException); void get_idata(struct idata *) throw (itest::ItestException); int get_switch(void) throw (itest::ItestException); double get_current_DC(void) throw (itest::ItestException); int get_state(void) throw (itest::ItestException); int get_num_alarm(void) throw (itest::ItestException); const char * get_str_alarm(void) throw (itest::ItestException); void set_current_DC(double ValF) throw (itest::ItestException); void set_current_AC(double ValF) throw (itest::ItestException); void set_switch(bool val) throw (itest::ItestException); // void clear_alarm(void) throw (itest::ItestException); //taux de comptage void get_fdata(struct fdata *) throw (itest::ItestException); void clear_ferrors(void) throw (itest::ItestException); }; //---------------------------------- class TMagnet { protected: private: int Group; char StrAddrIp[20]; TBilt *Bilt; TPole *Pole[NBRPOLE]; int NumMagnet; //passe en private modif V202 05/06/07 const char *AddrIP; //passe en private modif V202 05/06/07 public: TMagnet(const char *_AddrIp,int NumMagnet) throw (itest::ItestException); ~TMagnet(void); TMagnet(const TMagnet & Magn) throw (itest::ItestException); TMagnet & operator=(const TMagnet & Magn) throw (itest::ItestException); //modif V201 07/03/07 int num_magnet(void){return NumMagnet;} //modif V202 05/06/07 const char *addrIP_magnet(void){return AddrIP;} //modif V202 05/06/07 TPole & pole(int Num); void clear_all_err(void) throw (itest::ItestException); void clear_alarm(void) throw (itest::ItestException); void set_switch(bool val) throw (itest::ItestException); void set_state(bool val) throw (itest::ItestException); void get_mdata(struct mdata *) throw (itest::ItestException); int get_state(void) throw (itest::ItestException); const char * get_bilt_vers(void) throw (itest::ItestException); }; //--------------------------------------------------------------------------- //Structure de données de idata struct idata{ int magnet; int pole; int state; std::string fail; double measvolt; double meascurr; }; //--------------------------------------------------------------------------- //Structure de données de Mdata struct mdata{ int magnet; int state; struct idata idata[NBRPOLE]; }; //--------------------------------------------------------------------------- //Structure de données de Fdata struct fdata{ unsigned int nbrframe_sec; unsigned int nbrferr_sec; double rms_ac_sett_sec; double average_sett_sec; unsigned int nbrferr; }; //--------------------------------------------------------------------------- } //end namespace //--------------------------------------------------------------------------- #endif //_ITEST_CLASSMAGNET_H_ Node-path: powersupply/itest/Bilt/trunk/libMagnet_V120/Exception.cpp Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 7037 Text-content-md5: 9d76e60e6386c4edf40ea80aef2679ab Content-length: 7047 PROPS-END // ============================================================================ // // = CONTEXT // ITest Power Supplies - C++ Interface - Error & ItestException Classes // // = FILENAME // ItestException.cpp // // = AUTHOR // Nicolas Leclercq - SOLEIL // // ============================================================================ // ============================================================================ // DEPENDENCIES // ============================================================================ #include "Exception.h" namespace itest { // ============================================================================ // Error::Error // ============================================================================ Error::Error (void) : reason ("unknown error"), desc ("unknown error"), origin ("unknown"), severity (itest::ERR), code (-1) { //- noop ctor } // ============================================================================ // Error::Error // ============================================================================ Error::Error (const char *_reason, const char *_desc, const char *_origin, int _severity, int _code) : reason (_reason), desc (_desc), origin (_origin), severity (_severity), code (_code) { //- noop ctor } // ============================================================================ // Error::Error // ============================================================================ Error::Error (const std::string& _reason, const std::string& _desc, const std::string& _origin, int _severity, int _code) : reason (_reason), desc (_desc), origin (_origin), severity (_severity), code (_code) { //- noop ctor } // ============================================================================ // Error::Error // ============================================================================ Error::Error (const Error& _src) : reason (_src.reason), desc (_src.desc), origin (_src.origin), severity (_src.severity), code (_src.code) { //- noop ctor } // ============================================================================ // Error::~Error // ============================================================================ Error::~Error (void) { //- noop dtor } // ============================================================================ // Error::operator= // ============================================================================ Error& Error::operator= (const Error& _src) { //- no self assignment if (this == &_src) return *this; this->reason = _src.reason; this->desc = _src.desc; this->origin = _src.origin; this->severity = _src.severity; this->code = _src.code; return *this; } // ============================================================================ // ItestException::ItestException // ============================================================================ ItestException::ItestException (void) : errors(0) { this->push_error(Error()); } // ============================================================================ // ItestException::ItestException // ============================================================================ ItestException::ItestException (const char *_reason, const char *_desc, const char *_origin, int _severity, int _code) : errors(0) { this->push_error(_reason, _desc, _origin, _severity, _code); } // ============================================================================ // ItestException::ItestException // ============================================================================ ItestException::ItestException (const std::string& _reason, const std::string& _desc, const std::string& _origin, int _severity, int _code) : errors(0) { this->push_error(_reason, _desc, _origin, _severity, _code); } // ============================================================================ // ItestException::ItestException // ============================================================================ ItestException::ItestException (const ItestException& _src) : errors(0) { this->errors = _src.errors; } // ============================================================================ // ItestException::ItestException // ============================================================================ ItestException::ItestException (const ErrorList& _errors) { this->errors = _errors; } // ============================================================================ // ItestException::ItestException // ============================================================================ ItestException& ItestException::operator= (const ItestException& _src) { //- no self assignment if (this == &_src) { return *this; } this->errors.clear(); for (size_t i = 0; i < _src.errors.size(); i++) this->push_error(_src.errors[i]); return *this; } // ============================================================================ // ItestException::~ItestException // ============================================================================ ItestException::~ItestException (void) { this->errors.clear(); } // ============================================================================ // ItestException::push_error // ============================================================================ void ItestException::push_error (const char *_reason, const char *_desc, const char *_origin, int _severity, int _err_code) { this->errors.push_back(Error(_reason, _desc, _origin, _severity, _err_code)); } // ============================================================================ // ItestException::push_error // ============================================================================ void ItestException::push_error (const std::string& _reason, const std::string& _desc, const std::string& _origin, int _err_code, int _severity) { this->errors.push_back(Error(_reason, _desc, _origin, _severity, _err_code)); } // ============================================================================ // ItestException::push_error // ============================================================================ void ItestException::push_error (const Error& _error) { this->errors.push_back(_error); } } // namespace itest Node-path: powersupply/itest/Bilt/trunk/libMagnet_V120/Exception.h Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 4255 Text-content-md5: 216d054c131bc191accef25995d29271 Content-length: 4265 PROPS-END // ============================================================================ // // = CONTEXT // ITest Power Supplies - C++ Interface - Error & Exception Classes // // = FILENAME // Exception.h // // = AUTHOR // Nicolas Leclercq - SOLEIL // // ============================================================================ #ifndef _ITEST_EXCEPTION_H_ #define _ITEST_EXCEPTION_H_ // ============================================================================ // DEPENDENCIES // ============================================================================ #include #include namespace itest { // ============================================================================ // Error severity // ============================================================================ typedef enum { WARN, ERR, PANIC } ErrorSeverity; // ============================================================================ // Error abstraction class // ============================================================================ class Error { public: /** * Initialization. */ Error (void); /** * Initialization. */ Error (const char *reason, const char *desc, const char *origin, int severity = itest::ERR, int err_code = -1); /** * Initialization. */ Error (const std::string& reason, const std::string& desc, const std::string& origin, int severity = itest::ERR, int err_code = -1); /** * Copy constructor. */ Error (const Error& src); /** * Error details: code */ virtual ~Error (void); /** * operator= */ Error& operator= (const Error& _src); /** * Error details: reason */ std::string reason; /** * Error details: description */ std::string desc; /** * Error details: origin */ std::string origin; /** * Error details: severity */ int severity; /** * Error details: code */ int code; }; // ============================================================================ // Error list // ============================================================================ typedef std::vector ErrorList; // ============================================================================ // Exception class // ============================================================================ class ItestException { public: /** * Default constructor */ ItestException (void); /** * Constructor */ ItestException (const char *reason, const char *desc, const char *origin, int severity = itest::ERR, int err_code = -1); /** * Constructor */ ItestException (const std::string& reason, const std::string& desc, const std::string& origin, int severity = itest::ERR, int err_code = -1); /** * Constructor */ ItestException (const Error& error); /** * Constructor */ ItestException (const ErrorList& errors); /** * Copy constructor */ ItestException (const ItestException& src); /** * operator= */ ItestException& operator= (const ItestException& _src); /** * Destructor */ virtual ~ItestException (void); /** * Push the specified error into the errors list. */ void push_error (const char *reason, const char *desc, const char *origin, int severity = itest::ERR, int err_code = -1); /** * Push the specified error into the errors list. */ void push_error (const std::string& reason, const std::string& desc, const std::string& origin, int severity = itest::ERR, int err_code = -1); /** * Push the specified error into the errors list. */ void push_error (const Error& error); /** * The errors list */ ErrorList errors; }; } // namespace itest #endif // _ITEST_EXCEPTION_H_ Revision-number: 9 Prop-content-length: 197 Content-length: 197 K 10 svn:author V 5 meyer K 8 svn:date V 27 2009-11-27T13:49:26.000000Z K 7 svn:log V 97 Modified structure! The pole is no longer a device. The device is now a magnet with three poles. PROPS-END Node-path: powersupply/itest/Bilt/trunk/Bilt.cpp Node-kind: file Node-action: change Text-content-length: 34524 Text-content-md5: 68402666ae3fcfb734bbd4e51fa62769 Content-length: 34524 static const char *RcsId = "$Id: Bilt.cpp,v 1.6 2009-11-27 13:49:26 meyer Exp $"; //+============================================================================= // // file : Bilt.cpp // // description : C++ source for the Bilt and its commands. // The class is derived from Device. It represents the // CORBA servant object which will be accessed from the // network. All commands which can be executed on the // Bilt are implemented in this file. // // project : TANGO Device Server // // $Author: meyer $ // // $Revision: 1.6 $ // // $Revision: 1.6 $ // $Date: 2009-11-27 13:49:26 $ // // SVN only: // $HeadURL: $ // // CVS only: // $Source: /segfs/tango/cvsroot/cppserver/machine/powersupply/SrSteerers/tango/Bilt/Bilt.cpp,v $ // $Log: not supported by cvs2svn $ // Revision 1.5 2009/11/26 10:46:58 meyer // Updated for libMagnet_V120 // // Revision 1.4 2009/11/24 09:21:46 meyer // Absolut value for impedance // // Revision 1.3 2009/11/23 16:46:58 meyer // Corrected state, status and exception handling // // Revision 1.2 2009/11/06 12:46:25 meyer // Added impedance attribute and corrected fromatting of attribute values. // // Revision 1.1.1.1 2009/11/04 16:23:02 meyer // Imported using TkCVS // // // copyleft : European Synchrotron Radiation Facility // BP 220, Grenoble 38043 // FRANCE // //-============================================================================= // // This file is generated by POGO // (Program Obviously used to Generate tango Object) // // (c) - Software Engineering Group - ESRF //============================================================================= //=================================================================== // // The following table gives the correspondence // between commands and method name. // // Command name| Method name // ---------------------------------------- // State | dev_state() // Status | dev_status() // On | on() // Off | off() // Reset | reset() // //=================================================================== #include #include #include #include namespace Bilt_ns { //+---------------------------------------------------------------------------- // // method : Bilt::Bilt(string &s) // // description : constructor for simulated Bilt // // in : - cl : Pointer to the DeviceClass object // - s : Device name // //----------------------------------------------------------------------------- Bilt::Bilt(Tango::DeviceClass *cl,string &s) :Tango::Device_4Impl(cl,s.c_str()) { init_device(); } Bilt::Bilt(Tango::DeviceClass *cl,const char *s) :Tango::Device_4Impl(cl,s) { init_device(); } Bilt::Bilt(Tango::DeviceClass *cl,const char *s,const char *d) :Tango::Device_4Impl(cl,s,d) { init_device(); } //+---------------------------------------------------------------------------- // // method : Bilt::delete_device() // // description : will be called at device destruction or at init command. // //----------------------------------------------------------------------------- void Bilt::delete_device() { // Delete device allocated objects delete BILT; } //+---------------------------------------------------------------------------- // // method : Bilt::init_device() // // description : will be called at device initialization. // //----------------------------------------------------------------------------- void Bilt::init_device() { INFO_STREAM << "Bilt::Bilt() create device " << device_name << endl; // Initialise variables to default values //-------------------------------------------- get_device_property(); set_state (Tango::UNKNOWN); try { BILT = new itest::TMagnet (iPAddress.c_str(), magnetNumber); } catch (itest::ItestException &e) { try { create_tango_exception (e, mdata_errors, "Init failure" , "Cannot initialise ITEST libray objects", "Bilt::init_device"); } catch (Tango::DevFailed &e) { set_state (Tango::FAULT); } } } //+---------------------------------------------------------------------------- // // method : Bilt::get_device_property() // // description : Read the device properties from database. // //----------------------------------------------------------------------------- void Bilt::get_device_property() { // Initialize your default values here (if not done with POGO). //------------------------------------------------------------------ // intitialise mdada structure for magnet read values mdata.magnet = -1; mdata.state = -1; for (int i=0; i_UseDb==true) get_db_device()->get_property(dev_prop); Tango::DbDatum def_prop, cl_prop; BiltClass *ds_class = (static_cast(get_device_class())); int i = -1; // Try to initialize IPAddress from class property cl_prop = ds_class->get_class_property(dev_prop[++i].name); if (cl_prop.is_empty()==false) cl_prop >> iPAddress; else { // Try to initialize IPAddress from default device value def_prop = ds_class->get_default_device_property(dev_prop[i].name); if (def_prop.is_empty()==false) def_prop >> iPAddress; } // And try to extract IPAddress value from database if (dev_prop[i].is_empty()==false) dev_prop[i] >> iPAddress; // Try to initialize MagnetNumber from class property cl_prop = ds_class->get_class_property(dev_prop[++i].name); if (cl_prop.is_empty()==false) cl_prop >> magnetNumber; else { // Try to initialize MagnetNumber from default device value def_prop = ds_class->get_default_device_property(dev_prop[i].name); if (def_prop.is_empty()==false) def_prop >> magnetNumber; } // And try to extract MagnetNumber value from database if (dev_prop[i].is_empty()==false) dev_prop[i] >> magnetNumber; // End of Automatic code generation //------------------------------------------------------------------ } //+---------------------------------------------------------------------------- // // method : Bilt::always_executed_hook() // // description : method always executed before any command is executed // //----------------------------------------------------------------------------- void Bilt::always_executed_hook() { } //+---------------------------------------------------------------------------- // // method : Bilt::read_attr_hardware // // description : Hardware acquisition for attributes. // //----------------------------------------------------------------------------- void Bilt::read_attr_hardware(vector &attr_list) { DEBUG_STREAM << "Bilt::read_attr_hardware(vector &attr_list) entering... "<< endl; // Add your own code here } //+---------------------------------------------------------------------------- // // method : Bilt::read_SetCurrentRMS // // description : Extract real attribute values for SetCurrentRMS acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_SetCurrentRMS(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_SetCurrentRMS(Tango::Attribute &attr) entering... "<< endl; read_fdata(); if ( fdata_errors.length() != 0 ) attr.set_quality(Tango::ATTR_INVALID); else attr.set_value (&fdata[pole_number].rms_ac_sett_sec); } //+---------------------------------------------------------------------------- // // method : Bilt::read_SetCurrentAverage // // description : Extract real attribute values for SetCurrentAverage acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_SetCurrentAverage(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_SetCurrentAverage(Tango::Attribute &attr) entering... "<< endl; read_fdata(); if ( fdata_errors.length() != 0 ) attr.set_quality(Tango::ATTR_INVALID); else attr.set_value (&fdata[pole_number].average_sett_sec); } //+---------------------------------------------------------------------------- // // method : Bilt::read_SetCurrentsRMS // // description : Extract real attribute values for SetCurrentsRMS acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_SetCurrentsRMS(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_SetCurrentsRMS(Tango::Attribute &attr) entering... "<< endl; read_fdata(); if ( fdata_errors.length() != 0 ) attr.set_quality(Tango::ATTR_INVALID); else { for (int i=0; i CURRENT_LIMIT ) impedances[i] = fabs (mdata.idata[i].measvolt / mdata.idata[i].meascurr); else impedances[i] = nan(""); } attr.set_value (&(impedances[0]), POLES); } } //+---------------------------------------------------------------------------- // // method : Bilt::read_DisplayPoleNumber // // description : Extract real attribute values for DisplayPoleNumber acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_DisplayPoleNumber(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_DisplayPoleNumber(Tango::Attribute &attr) entering... "<< endl; attr.set_value (&pole_number); } //+---------------------------------------------------------------------------- // // method : Bilt::write_DisplayPoleNumber // // description : Write DisplayPoleNumber attribute values to hardware. // //----------------------------------------------------------------------------- void Bilt::write_DisplayPoleNumber(Tango::WAttribute &attr) { DEBUG_STREAM << "Bilt::write_DisplayPoleNumber(Tango::WAttribute &attr) entering... "<< endl; attr.get_write_value(pole_number); } //+---------------------------------------------------------------------------- // // method : Bilt::read_CurrentsDC // // description : Extract real attribute values for CurrentsDC acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_CurrentsDC(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_CurrentsDC(Tango::Attribute &attr) entering... "<< endl; read_mdata(); if ( mdata_errors.length() != 0 ) attr.set_quality(Tango::ATTR_INVALID); else { for (int i=0; ipole(i).get_current_DC(); } attr.set_value (&(currents_dc[0]), POLES); } } //+---------------------------------------------------------------------------- // // method : Bilt::write_CurrentsDC // // description : Write CurrentsDC attribute values to hardware. // //----------------------------------------------------------------------------- void Bilt::write_CurrentsDC(Tango::WAttribute &attr) { DEBUG_STREAM << "Bilt::write_CurrentsDC(Tango::WAttribute &attr) entering... "<< endl; const double *set_currents; // check the correct number of setpoints if ( attr.get_write_value_length() == POLES ) attr.get_write_value(set_currents); else { TangoSys_MemStream tms; tms << "Wrong number of setpoints!" << endl; Tango::Except::throw_exception("WriteError", tms.str(), "Bilt::write_CurrentsDC"); } // apply setpoints to the poles try { for (int i=0; ipole(i).set_current_DC (set_currents[i]); } } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot write DC current value", "Bilt::write_CurrentDC"); } } //+---------------------------------------------------------------------------- // // method : Bilt::read_CurrentsAC // // description : Extract real attribute values for CurrentsAC acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_CurrentsAC(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_CurrentsAC(Tango::Attribute &attr) entering... "<< endl; read_mdata(); if ( mdata_errors.length() != 0 ) attr.set_quality(Tango::ATTR_INVALID); else { for (int i=0; i CURRENT_LIMIT ) impedance = fabs (mdata.idata[pole_number].measvolt / mdata.idata[pole_number].meascurr); else impedance = nan(""); attr.set_value (&impedance); } } //+---------------------------------------------------------------------------- // // method : Bilt::read_LocalControl // // description : Extract real attribute values for LocalControl acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_LocalControl(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_LocalControl(Tango::Attribute &attr) entering... "<< endl; try { int switch_state = BILT->pole(pole_number).get_switch(); if ( switch_state == 1 ) local_control = false; else local_control = true; } catch (itest::ItestException &e) { create_tango_exception (e, "Read failure" , "Cannot read the actual switch state", "Bilt::read_LocalControl"); } attr.set_value (&local_control); } //+---------------------------------------------------------------------------- // // method : Bilt::write_LocalControl // // description : Write LocalControl attribute values to hardware. // //----------------------------------------------------------------------------- void Bilt::write_LocalControl(Tango::WAttribute &attr) { DEBUG_STREAM << "Bilt::write_LocalControl(Tango::WAttribute &attr) entering... "<< endl; attr.get_write_value(local_control); try { int switch_state; if ( local_control == true ) switch_state = 0; else switch_state = 1; BILT->pole(pole_number).set_switch (switch_state); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot write switch state", "Bilt::write_LocalControl"); } } //+---------------------------------------------------------------------------- // // method : Bilt::read_SetCurrentAC // // description : Extract real attribute values for SetCurrentAC acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_SetCurrentAC(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_SetCurrentAC(Tango::Attribute &attr) entering... "<< endl; if ( local_control == false ) { attr.set_quality (Tango::ATTR_INVALID); } else { attr.set_value (&set_current_ac); } } //+---------------------------------------------------------------------------- // // method : Bilt::write_SetCurrentAC // // description : Write SetCurrentAC attribute values to hardware. // //----------------------------------------------------------------------------- void Bilt::write_SetCurrentAC(Tango::WAttribute &attr) { DEBUG_STREAM << "Bilt::write_SetCurrentAC(Tango::WAttribute &attr) entering... "<< endl; // check whether local control is true if ( local_control == false ) { TangoSys_MemStream tms; tms << "Can set AC current only when local control enabled!" << endl; Tango::Except::throw_exception("WriteError", tms.str(), "Bilt::write_SetCurrentAC"); } attr.get_write_value(set_current_ac); try { BILT->pole(pole_number).set_current_AC (set_current_ac); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot write AC current value", "Bilt::write_SetCurrentAC"); } } //+---------------------------------------------------------------------------- // // method : Bilt::read_CurrentDC // // description : Extract real attribute values for CurrentDC acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_CurrentDC(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_CurrentDC(Tango::Attribute &attr) entering... "<< endl; try { current_dc = BILT->pole(pole_number).get_current_DC(); } catch (itest::ItestException &e) { create_tango_exception (e, "Read failure" , "Cannot read DC current value", "Bilt::read_CurrentDC"); } attr.set_value (¤t_dc); } //+---------------------------------------------------------------------------- // // method : Bilt::write_CurrentDC // // description : Write CurrentDC attribute values to hardware. // //----------------------------------------------------------------------------- void Bilt::write_CurrentDC(Tango::WAttribute &attr) { DEBUG_STREAM << "Bilt::write_CurrentDC(Tango::WAttribute &attr) entering... "<< endl; attr.get_write_value(attr_CurrentDC_write); try { BILT->pole(pole_number).set_current_DC (attr_CurrentDC_write); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot write DC current value", "Bilt::write_CurrentDC"); } } //+---------------------------------------------------------------------------- // // method : Bilt::read_CurrentAC // // description : Extract real attribute values for CurrentAC acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_CurrentAC(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_CurrentAC(Tango::Attribute &attr) entering... "<< endl; read_mdata(); if ( mdata_errors.length() != 0 ) attr.set_quality(Tango::ATTR_INVALID); else attr.set_value (&mdata.idata[pole_number].meascurr); } //+---------------------------------------------------------------------------- // // method : Bilt::read_Voltage // // description : Extract real attribute values for Voltage acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_Voltage(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_Voltage(Tango::Attribute &attr) entering... "<< endl; read_mdata(); if ( mdata_errors.length() != 0 ) attr.set_quality(Tango::ATTR_INVALID); else attr.set_value (&mdata.idata[pole_number].measvolt); } //+---------------------------------------------------------------------------- // // method : Bilt::read_FramesPerSec // // description : Extract real attribute values for FramesPerSec acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_FramesPerSec(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_FramesPerSec(Tango::Attribute &attr) entering... "<< endl; read_fdata(); if ( fdata_errors.length() != 0 ) attr.set_quality(Tango::ATTR_INVALID); else attr.set_value ((Tango::DevULong *) &fdata[pole_number].nbrframe_sec); } //+---------------------------------------------------------------------------- // // method : Bilt::read_ErrorPerSec // // description : Extract real attribute values for ErrorPerSec acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_ErrorPerSec(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_ErrorPerSec(Tango::Attribute &attr) entering... "<< endl; read_fdata(); if ( fdata_errors.length() != 0 ) attr.set_quality(Tango::ATTR_INVALID); else attr.set_value ((Tango::DevULong *) &fdata[pole_number].nbrferr_sec); } //+---------------------------------------------------------------------------- // // method : Bilt::read_ErrorCounter // // description : Extract real attribute values for ErrorCounter acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_ErrorCounter(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_ErrorCounter(Tango::Attribute &attr) entering... "<< endl; read_fdata(); if ( fdata_errors.length() != 0 ) attr.set_quality(Tango::ATTR_INVALID); else attr.set_value ((Tango::DevULong *) &fdata[pole_number].nbrferr); } //+------------------------------------------------------------------ /** * method: Bilt::on * * description: method to execute "On" * Turns on power supply. * * */ //+------------------------------------------------------------------ void Bilt::on() { DEBUG_STREAM << "Bilt::on(): entering... !" << endl; // Add your own code to control device here try { // reset all pending errors first! reset(); BILT->set_state(1); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot switch on pole", "Bilt::on"); } } //+------------------------------------------------------------------ /** * method: Bilt::off * * description: method to execute "Off" * Turns of power supply * * */ //+------------------------------------------------------------------ void Bilt::off() { DEBUG_STREAM << "Bilt::off(): entering... !" << endl; // Add your own code to control device here try { BILT->set_state(0); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot switch off pole", "Bilt::off"); } } //+------------------------------------------------------------------ /** * method: Bilt::reset * * description: method to execute "Reset" * Reset faults and alarms * * */ //+------------------------------------------------------------------ void Bilt::reset() { DEBUG_STREAM << "Bilt::reset(): entering... !" << endl; // Add your own code to control device here try { BILT->clear_all_err(); BILT->clear_alarm(); for (int i=0; ipole(i).clear_ferrors(); } } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot reset pole", "Bilt::reset"); } } //+------------------------------------------------------------------ /** * method: Bilt::create_tango_exception() * * description: convert an itest exception into a tango exception * * * in : - &e : Reference to itest exception * - reason : Reason of the local Tango exception to be added to the stack * - desc : Description for the local Tango exception to be added to the stack * - origin : Origin if the local Tango exception to be added to the stack */ //+------------------------------------------------------------------ void Bilt::create_tango_exception (itest::ItestException &e, string reason, string desc, string origin) { Tango::DevErrorList errors; create_tango_exception (e, errors, reason, desc, origin); } //+------------------------------------------------------------------ /** * method: Bilt::create_tango_exception() * * description: convert an itest exception into a tango exception * * * in : - &e : Reference to itest exception * - errors : Tango error list to use, to store exception info * - reason : Reason of the local Tango exception to be added to the stack * - desc : Description for the local Tango exception to be added to the stack * - origin : Origin if the local Tango exception to be added to the stack */ //+------------------------------------------------------------------ void Bilt::create_tango_exception (itest::ItestException &e, Tango::DevErrorList &errors, string reason, string desc, string origin) { DEBUG_STREAM << "Bilt::create_tango_exception(): entering... !" << endl; errors.length(e.errors.size() + 1); int i; for(i=0; iget_mdata (&mdata); mdata_errors.length(0); } catch (itest::ItestException &e) { create_tango_exception (e, mdata_errors, "Read failure" , "Cannot read the mdata structure", "Bilt::read_mdata"); } } //+------------------------------------------------------------------ /** * method: Bilt::read_fdata() * * description: Read the fdata structure for the pole. * */ //+------------------------------------------------------------------ void Bilt::read_fdata() { DEBUG_STREAM << "Bilt::read_fdata(): entering... !" << endl; //static struct timeval last_update_time = {0,0}; // check whether the last reading was more than 900ms ago struct timeval now; gettimeofday (&now, NULL); double delay = (now.tv_sec * 1e6 + now.tv_usec) - (last_fdata_update.tv_sec * 1e6 + last_fdata_update.tv_usec); // only read new data every 900 ms!! if ( delay < 900000 ) { return; } else { INFO_STREAM << "fdata delay = " << delay/1000 << "ms" << endl; last_fdata_update = now; } // read the data statistics for the poles try { for (int i=0; ipole(i).get_fdata (&fdata[i]); } fdata_errors.length(0); } catch (itest::ItestException &e) { create_tango_exception (e, fdata_errors, "Read failure" , "Cannot read the fdata structure", "Bilt::read_fdata"); } } //+------------------------------------------------------------------ /** * method: Bilt::dev_status * * description: method to execute "Status" * This command gets the device status (stored in its device_status data member) and returns it to the caller. * * @return Status description * */ //+------------------------------------------------------------------ Tango::ConstDevString Bilt::dev_status() { //Tango::ConstDevString argout = DeviceImpl::dev_status(); DEBUG_STREAM << "Bilt::dev_status(): entering... !" << endl; // Add your own code to control device here stringstream status; Tango::DevState state = dev_state(); switch (state) { case Tango::ON: status << "State : ON" << endl; break; case Tango::OFF: status << "State : OFF" << endl; break; case Tango::ALARM: status << "State : Alarm" << endl; for (int i=0; i 10W in 10ms!" << endl; else { if ( mdata.idata[i].fail == "TEMP" ) status << "Fault descr. : Max. temp on semiconductor reached!" << endl; else { if ( mdata.idata[i].fail == "PWSO" ) status << "Fault descr. : Delivered power > 40W in 100ms!" << endl; else { status << "Fault descr. : Unkown fault code!" << endl; } } } } } } } break; default: status << "Pole state : Unknown" << endl; status << "Error stack : " << endl; for(int i=0; idevice_state data member) and returns it to the caller. * * @return State Code * */ //+------------------------------------------------------------------ Tango::DevState Bilt::dev_state() { Tango::DevState argout; DEBUG_STREAM << "Bilt::dev_state(): entering... !" << endl; // Add your own code to control device here int state; try { read_mdata(); state = mdata.state; } catch (Tango::DevFailed &e) { // do nothing! // Just avoid exceptions when executing state or status! } if ( mdata_errors.length() != 0 ) set_state (Tango::UNKNOWN); else { // set the device state switch (state) { case 0: set_state (Tango::OFF); break; case 1: set_state (Tango::ON); break; case 2: set_state (Tango::ALARM); break; case 3: set_state (Tango::FAULT); break; default: set_state (Tango::UNKNOWN); break; } } argout = DeviceImpl::dev_state(); return argout; } } // namespace Node-path: powersupply/itest/Bilt/trunk/Bilt.h Node-kind: file Node-action: change Text-content-length: 13041 Text-content-md5: 52749b42ed3d54c065dfc7f246db017c Content-length: 13041 //============================================================================= // // file : Bilt.h // // description : Include for the Bilt class. // // project : BILT multi channel power supply // // $Author: meyer $ // // $Revision: 1.4 $ // $Date: 2009-11-27 13:49:26 $ // // SVN only: // $HeadURL: $ // // CVS only: // $Source: /segfs/tango/cvsroot/cppserver/machine/powersupply/SrSteerers/tango/Bilt/Bilt.h,v $ // $Log: not supported by cvs2svn $ // Revision 1.3 2009/11/26 10:46:58 meyer // Updated for libMagnet_V120 // // Revision 1.2 2009/11/06 12:46:25 meyer // Added impedance attribute and corrected fromatting of attribute values. // // Revision 1.1.1.1 2009/11/04 16:23:02 meyer // Imported using TkCVS // // // copyleft : European Synchrotron Radiation Facility // BP 220, Grenoble 38043 // FRANCE // //============================================================================= // // This file is generated by POGO // (Program Obviously used to Generate tango Object) // // (c) - Software Engineering Group - ESRF //============================================================================= #ifndef _BILT_H #define _BILT_H #include #include #include //using namespace Tango; /** * @author $Author: meyer $ * @version $Revision: 1.4 $ */ // Add your own constant definitions here. //----------------------------------------------- // Number of poles per magnet #define POLES 3 // Current limit for a valid impedeance calculation #define CURRENT_LIMIT 0.005 namespace Bilt_ns { /** * Class Description: * The BILT multi channel power supply will be used with 3 channels for the ESRF fast * feedback systems. * The power supply can be controlled in 2 ways : * By this device server for slow or human control or * by the Libera Beam Position monitors for fast feedback with closed loop control. * The devices are exported as one device per steerer magnet. Every device has three * channels. The channels (poles) cannot be switched on individually but have their * individual set points and measurement values. */ /* * Device States Description: * Tango::ON : Magnet is ON, all three channels are ON. * Tango::OFF : Magnet is OFF, all three channels are OFF. * Tango::FAULT : Error detected by the BILT magnet. * Tango::ALARM : Alarm detected on one or more channels. * Tango::UNKNOWN : Communication fault */ class Bilt: public Tango::Device_4Impl { public : // Add your own data members here //----------------------------------------- // Here is the Start of the automatic code generation part //------------------------------------------------------------- /** * @name attributes * Attribute member data. */ //@{ Tango::DevShort *attr_DisplayPoleNumber_read; Tango::DevShort attr_DisplayPoleNumber_write; Tango::DevDouble *attr_CurrentDC_read; Tango::DevDouble attr_CurrentDC_write; Tango::DevDouble *attr_CurrentAC_read; Tango::DevDouble *attr_Voltage_read; Tango::DevDouble *attr_Impedance_read; Tango::DevDouble *attr_SetCurrentRMS_read; Tango::DevDouble *attr_SetCurrentAverage_read; Tango::DevULong *attr_FramesPerSec_read; Tango::DevULong *attr_ErrorPerSec_read; Tango::DevULong *attr_ErrorCounter_read; Tango::DevBoolean *attr_LocalControl_read; Tango::DevBoolean attr_LocalControl_write; Tango::DevDouble *attr_SetCurrentAC_read; Tango::DevDouble attr_SetCurrentAC_write; Tango::DevDouble *attr_CurrentsDC_read; Tango::DevDouble attr_CurrentsDC_write; Tango::DevDouble *attr_CurrentsAC_read; Tango::DevDouble *attr_Voltages_read; Tango::DevDouble *attr_Impedances_read; Tango::DevDouble *attr_SetCurrentsRMS_read; Tango::DevDouble *attr_SetCurrentsAverage_read; Tango::DevULong *attr_ErrorCounters_read; //@} /** * @name Device properties * Device properties member data. */ //@{ /** * IP Address of BILT controller. * Each controller includes several magnets and * each magnet includes 3 power supplies, * for corrections in the X, Y and Z planes. * * */ string iPAddress; /** * Magnet number from 1 to 48 */ Tango::DevShort magnetNumber; //@} /** * @name Device properties * Device property member data. */ //@{ //@} /**@name Constructors * Miscellaneous constructors */ //@{ /** * Constructs a newly allocated Command object. * * @param cl Class. * @param s Device Name */ Bilt(Tango::DeviceClass *cl,string &s); /** * Constructs a newly allocated Command object. * * @param cl Class. * @param s Device Name */ Bilt(Tango::DeviceClass *cl,const char *s); /** * Constructs a newly allocated Command object. * * @param cl Class. * @param s Device name * @param d Device description. */ Bilt(Tango::DeviceClass *cl,const char *s,const char *d); //@} /**@name Destructor * Only one destructor is defined for this class */ //@{ /** * The object destructor. */ ~Bilt() {delete_device();}; /** * will be called at device destruction or at init command. */ void delete_device(); //@} /**@name Miscellaneous methods */ //@{ /** * Initialize the device */ virtual void init_device(); /** * Always executed method before execution command method. */ virtual void always_executed_hook(); //@} /** * @name Bilt methods prototypes */ //@{ /** * Hardware acquisition for attributes. */ virtual void read_attr_hardware(vector &attr_list); /** * Extract real attribute values for DisplayPoleNumber acquisition result. */ virtual void read_DisplayPoleNumber(Tango::Attribute &attr); /** * Write DisplayPoleNumber attribute values to hardware. */ virtual void write_DisplayPoleNumber(Tango::WAttribute &attr); /** * Extract real attribute values for CurrentDC acquisition result. */ virtual void read_CurrentDC(Tango::Attribute &attr); /** * Write CurrentDC attribute values to hardware. */ virtual void write_CurrentDC(Tango::WAttribute &attr); /** * Extract real attribute values for CurrentAC acquisition result. */ virtual void read_CurrentAC(Tango::Attribute &attr); /** * Extract real attribute values for Voltage acquisition result. */ virtual void read_Voltage(Tango::Attribute &attr); /** * Extract real attribute values for Impedance acquisition result. */ virtual void read_Impedance(Tango::Attribute &attr); /** * Extract real attribute values for SetCurrentRMS acquisition result. */ virtual void read_SetCurrentRMS(Tango::Attribute &attr); /** * Extract real attribute values for SetCurrentAverage acquisition result. */ virtual void read_SetCurrentAverage(Tango::Attribute &attr); /** * Extract real attribute values for FramesPerSec acquisition result. */ virtual void read_FramesPerSec(Tango::Attribute &attr); /** * Extract real attribute values for ErrorPerSec acquisition result. */ virtual void read_ErrorPerSec(Tango::Attribute &attr); /** * Extract real attribute values for ErrorCounter acquisition result. */ virtual void read_ErrorCounter(Tango::Attribute &attr); /** * Extract real attribute values for LocalControl acquisition result. */ virtual void read_LocalControl(Tango::Attribute &attr); /** * Write LocalControl attribute values to hardware. */ virtual void write_LocalControl(Tango::WAttribute &attr); /** * Extract real attribute values for SetCurrentAC acquisition result. */ virtual void read_SetCurrentAC(Tango::Attribute &attr); /** * Write SetCurrentAC attribute values to hardware. */ virtual void write_SetCurrentAC(Tango::WAttribute &attr); /** * Extract real attribute values for CurrentsDC acquisition result. */ virtual void read_CurrentsDC(Tango::Attribute &attr); /** * Write CurrentsDC attribute values to hardware. */ virtual void write_CurrentsDC(Tango::WAttribute &attr); /** * Extract real attribute values for CurrentsAC acquisition result. */ virtual void read_CurrentsAC(Tango::Attribute &attr); /** * Extract real attribute values for Voltages acquisition result. */ virtual void read_Voltages(Tango::Attribute &attr); /** * Extract real attribute values for Impedances acquisition result. */ virtual void read_Impedances(Tango::Attribute &attr); /** * Extract real attribute values for SetCurrentsRMS acquisition result. */ virtual void read_SetCurrentsRMS(Tango::Attribute &attr); /** * Extract real attribute values for SetCurrentsAverage acquisition result. */ virtual void read_SetCurrentsAverage(Tango::Attribute &attr); /** * Extract real attribute values for ErrorCounters acquisition result. */ virtual void read_ErrorCounters(Tango::Attribute &attr); /** * Read/Write allowed for DisplayPoleNumber attribute. */ virtual bool is_DisplayPoleNumber_allowed(Tango::AttReqType type); /** * Read/Write allowed for CurrentDC attribute. */ virtual bool is_CurrentDC_allowed(Tango::AttReqType type); /** * Read/Write allowed for CurrentAC attribute. */ virtual bool is_CurrentAC_allowed(Tango::AttReqType type); /** * Read/Write allowed for Voltage attribute. */ virtual bool is_Voltage_allowed(Tango::AttReqType type); /** * Read/Write allowed for Impedance attribute. */ virtual bool is_Impedance_allowed(Tango::AttReqType type); /** * Read/Write allowed for SetCurrentRMS attribute. */ virtual bool is_SetCurrentRMS_allowed(Tango::AttReqType type); /** * Read/Write allowed for SetCurrentAverage attribute. */ virtual bool is_SetCurrentAverage_allowed(Tango::AttReqType type); /** * Read/Write allowed for FramesPerSec attribute. */ virtual bool is_FramesPerSec_allowed(Tango::AttReqType type); /** * Read/Write allowed for ErrorPerSec attribute. */ virtual bool is_ErrorPerSec_allowed(Tango::AttReqType type); /** * Read/Write allowed for ErrorCounter attribute. */ virtual bool is_ErrorCounter_allowed(Tango::AttReqType type); /** * Read/Write allowed for LocalControl attribute. */ virtual bool is_LocalControl_allowed(Tango::AttReqType type); /** * Read/Write allowed for SetCurrentAC attribute. */ virtual bool is_SetCurrentAC_allowed(Tango::AttReqType type); /** * Read/Write allowed for CurrentsDC attribute. */ virtual bool is_CurrentsDC_allowed(Tango::AttReqType type); /** * Read/Write allowed for CurrentsAC attribute. */ virtual bool is_CurrentsAC_allowed(Tango::AttReqType type); /** * Read/Write allowed for Voltages attribute. */ virtual bool is_Voltages_allowed(Tango::AttReqType type); /** * Read/Write allowed for Impedances attribute. */ virtual bool is_Impedances_allowed(Tango::AttReqType type); /** * Read/Write allowed for SetCurrentsRMS attribute. */ virtual bool is_SetCurrentsRMS_allowed(Tango::AttReqType type); /** * Read/Write allowed for SetCurrentsAverage attribute. */ virtual bool is_SetCurrentsAverage_allowed(Tango::AttReqType type); /** * Read/Write allowed for ErrorCounters attribute. */ virtual bool is_ErrorCounters_allowed(Tango::AttReqType type); /** * Execution allowed for On command. */ virtual bool is_On_allowed(const CORBA::Any &any); /** * Execution allowed for Off command. */ virtual bool is_Off_allowed(const CORBA::Any &any); /** * Execution allowed for Reset command. */ virtual bool is_Reset_allowed(const CORBA::Any &any); /** * This command gets the device state (stored in its device_state data member) and returns it to the caller. * @return State Code * @exception DevFailed */ virtual Tango::DevState dev_state(); /** * This command gets the device status (stored in its device_status data member) and returns it to the caller. * @return Status description * @exception DevFailed */ virtual Tango::ConstDevString dev_status(); /** * Turns on power supply. * @exception DevFailed */ void on(); /** * Turns of power supply * @exception DevFailed */ void off(); /** * Reset faults and alarms * @exception DevFailed */ void reset(); /** * Read the device properties from database */ void get_device_property(); //@} // Here is the end of the automatic code generation part //------------------------------------------------------------- protected : // Add your own data members here //----------------------------------------- void create_tango_exception (itest::ItestException &e, string reason, string desc, string origin); void create_tango_exception (itest::ItestException &e, Tango::DevErrorList &errors, string reason, string desc, string origin); void read_mdata(); void read_fdata(); itest::TMagnet *BILT; struct itest::mdata mdata; struct itest::fdata fdata[POLES]; vector currents_dc; vector currents_ac; vector voltages; vector impedances; vector currents_rms; vector currents_average; vector error_counters; short pole_number; double current_dc; double set_current_ac; double impedance; bool local_control; struct timeval last_mdata_update; struct timeval last_fdata_update; Tango::DevErrorList mdata_errors; Tango::DevErrorList fdata_errors; }; } // namespace_ns #endif // _BILT_H Node-path: powersupply/itest/Bilt/trunk/BiltClass.cpp Node-kind: file Node-action: change Text-content-length: 26657 Text-content-md5: 512f08f3f40939bc70b26cfad7755d7f Content-length: 26657 static const char *ClassId = "$Id: BiltClass.cpp,v 1.5 2009-11-27 13:49:26 meyer Exp $"; static const char *TagName = "$Name: not supported by cvs2svn $"; static const char *CvsPath = "$Source: /segfs/tango/cvsroot/cppserver/machine/powersupply/SrSteerers/tango/Bilt/BiltClass.cpp,v $"; static const char *SvnPath = "$HeadURL: $"; static const char *HttpServer = "http://www.esrf.fr/computing/cs/tango/tango_doc/ds_doc/"; //+============================================================================= // // file : BiltClass.cpp // // description : C++ source for the BiltClass. A singleton // class derived from DeviceClass. It implements the // command list and all properties and methods required // by the Bilt once per process. // // project : TANGO Device Server // // $Author: meyer $ // // $Revision: 1.5 $ // // $Log: not supported by cvs2svn $ // Revision 1.4 2009/11/26 10:46:58 meyer // Updated for libMagnet_V120 // // Revision 1.3 2009/11/23 16:46:58 meyer // Corrected state, status and exception handling // // Revision 1.2 2009/11/06 12:46:25 meyer // Added impedance attribute and corrected fromatting of attribute values. // // Revision 1.1.1.1 2009/11/04 16:23:02 meyer // Imported using TkCVS // // // copyleft : European Synchrotron Radiation Facility // BP 220, Grenoble 38043 // FRANCE // //-============================================================================= // // This file is generated by POGO // (Program Obviously used to Generate tango Object) // // (c) - Software Engineering Group - ESRF //============================================================================= #include #include #include //+---------------------------------------------------------------------------- /** * Create BiltClass singleton and return it in a C function for Python usage */ //+---------------------------------------------------------------------------- extern "C" { #ifdef WIN32 __declspec(dllexport) #endif Tango::DeviceClass *_create_Bilt_class(const char *name) { return Bilt_ns::BiltClass::init(name); } } namespace Bilt_ns { //+---------------------------------------------------------------------------- // // method : OnCmd::execute() // // description : method to trigger the execution of the command. // PLEASE DO NOT MODIFY this method core without pogo // // in : - device : The device on which the command must be executed // - in_any : The command input data // // returns : The command output data (packed in the Any object) // //----------------------------------------------------------------------------- CORBA::Any *OnCmd::execute(Tango::DeviceImpl *device,const CORBA::Any &in_any) { cout2 << "OnCmd::execute(): arrived" << endl; ((static_cast(device))->on()); return new CORBA::Any(); } //+---------------------------------------------------------------------------- // // method : OffCmd::execute() // // description : method to trigger the execution of the command. // PLEASE DO NOT MODIFY this method core without pogo // // in : - device : The device on which the command must be executed // - in_any : The command input data // // returns : The command output data (packed in the Any object) // //----------------------------------------------------------------------------- CORBA::Any *OffCmd::execute(Tango::DeviceImpl *device,const CORBA::Any &in_any) { cout2 << "OffCmd::execute(): arrived" << endl; ((static_cast(device))->off()); return new CORBA::Any(); } //+---------------------------------------------------------------------------- // // method : ResetCmd::execute() // // description : method to trigger the execution of the command. // PLEASE DO NOT MODIFY this method core without pogo // // in : - device : The device on which the command must be executed // - in_any : The command input data // // returns : The command output data (packed in the Any object) // //----------------------------------------------------------------------------- CORBA::Any *ResetCmd::execute(Tango::DeviceImpl *device,const CORBA::Any &in_any) { cout2 << "ResetCmd::execute(): arrived" << endl; ((static_cast(device))->reset()); return new CORBA::Any(); } // //---------------------------------------------------------------- // Initialize pointer for singleton pattern //---------------------------------------------------------------- // BiltClass *BiltClass::_instance = NULL; //+---------------------------------------------------------------------------- // // method : BiltClass::BiltClass(string &s) // // description : constructor for the BiltClass // // in : - s : The class name // //----------------------------------------------------------------------------- BiltClass::BiltClass(string &s):DeviceClass(s) { cout2 << "Entering BiltClass constructor" << endl; set_default_property(); get_class_property(); write_class_property(); cout2 << "Leaving BiltClass constructor" << endl; } //+---------------------------------------------------------------------------- // // method : BiltClass::~BiltClass() // // description : destructor for the BiltClass // //----------------------------------------------------------------------------- BiltClass::~BiltClass() { _instance = NULL; } //+---------------------------------------------------------------------------- // // method : BiltClass::instance // // description : Create the object if not already done. Otherwise, just // return a pointer to the object // // in : - name : The class name // //----------------------------------------------------------------------------- BiltClass *BiltClass::init(const char *name) { if (_instance == NULL) { try { string s(name); _instance = new BiltClass(s); } catch (bad_alloc) { throw; } } return _instance; } BiltClass *BiltClass::instance() { if (_instance == NULL) { cerr << "Class is not initialised !!" << endl; exit(-1); } return _instance; } //+---------------------------------------------------------------------------- // // method : BiltClass::command_factory // // description : Create the command object(s) and store them in the // command list // //----------------------------------------------------------------------------- void BiltClass::command_factory() { command_list.push_back(new OnCmd("On", Tango::DEV_VOID, Tango::DEV_VOID, "", "", Tango::OPERATOR)); command_list.push_back(new OffCmd("Off", Tango::DEV_VOID, Tango::DEV_VOID, "", "", Tango::OPERATOR)); command_list.push_back(new ResetCmd("Reset", Tango::DEV_VOID, Tango::DEV_VOID, "", "", Tango::OPERATOR)); // add polling if any for (unsigned int i=0 ; ilength() ; i++) { cout4 << "Device name : " << (*devlist_ptr)[i].in() << endl; // Create devices and add it into the device list //---------------------------------------------------- device_list.push_back(new Bilt(this, (*devlist_ptr)[i])); // Export device to the outside world // Check before if database used. //--------------------------------------------- if ((Tango::Util::_UseDb == true) && (Tango::Util::_FileDb == false)) export_device(device_list.back()); else export_device(device_list.back(), (*devlist_ptr)[i]); } // End of Automatic code generation //------------------------------------------------------------- } //+---------------------------------------------------------------------------- // Method: BiltClass::attribute_factory(vector &att_list) //----------------------------------------------------------------------------- void BiltClass::attribute_factory(vector &att_list) { // Attribute : DisplayPoleNumber DisplayPoleNumberAttrib *display_pole_number = new DisplayPoleNumberAttrib(); Tango::UserDefaultAttrProp display_pole_number_prop; display_pole_number_prop.set_label("Display values for Pole"); display_pole_number_prop.set_unit(" "); display_pole_number_prop.set_format("%1d"); display_pole_number_prop.set_max_value("2"); display_pole_number_prop.set_min_value("0"); display_pole_number_prop.set_description("The pole number for wich to display the scalar attribute values."); display_pole_number->set_default_properties(display_pole_number_prop); att_list.push_back(display_pole_number); // Attribute : CurrentDC CurrentDCAttrib *current_dc = new CurrentDCAttrib(); Tango::UserDefaultAttrProp current_dc_prop; current_dc_prop.set_label("DC Current"); current_dc_prop.set_unit("A"); current_dc_prop.set_format("%6.4f"); current_dc_prop.set_max_value("1.8"); current_dc_prop.set_min_value("-1.8"); current_dc_prop.set_description("The DC current of the selected pole."); current_dc->set_default_properties(current_dc_prop); current_dc->set_memorized(); current_dc->set_memorized_init(true); att_list.push_back(current_dc); // Attribute : CurrentAC CurrentACAttrib *current_ac = new CurrentACAttrib(); Tango::UserDefaultAttrProp current_ac_prop; current_ac_prop.set_label("Current"); current_ac_prop.set_unit("A"); current_ac_prop.set_format("%6.4f"); current_ac_prop.set_description("The measured AC current of the selected pole."); current_ac->set_default_properties(current_ac_prop); att_list.push_back(current_ac); // Attribute : Voltage VoltageAttrib *voltage = new VoltageAttrib(); Tango::UserDefaultAttrProp voltage_prop; voltage_prop.set_label("Voltage"); voltage_prop.set_unit("V"); voltage_prop.set_format("%6.4f"); voltage_prop.set_description("The measured voltage of the selected pole."); voltage->set_default_properties(voltage_prop); att_list.push_back(voltage); // Attribute : Impedance ImpedanceAttrib *impedance = new ImpedanceAttrib(); Tango::UserDefaultAttrProp impedance_prop; impedance_prop.set_label("Impedance"); impedance_prop.set_unit("Ohm"); impedance_prop.set_format("%4.2f"); impedance_prop.set_max_alarm("5.0"); impedance_prop.set_description("Calculated impedance of the selected pole."); impedance->set_default_properties(impedance_prop); att_list.push_back(impedance); // Attribute : SetCurrentRMS SetCurrentRMSAttrib *set_current_rms = new SetCurrentRMSAttrib(); Tango::UserDefaultAttrProp set_current_rms_prop; set_current_rms_prop.set_label("RMS AC current setpoint/s"); set_current_rms_prop.set_unit("A"); set_current_rms_prop.set_format("%6.4f"); set_current_rms_prop.set_description("Statistic when driven by the Libera.\nRMS value of the AC setpoint applied on the DAC during the last second.\nX=sqr( (sum(setAC)*sum(setAC)) / n - ((sum(setAC)/n) *(sum(setAC)/n)) )"); set_current_rms->set_default_properties(set_current_rms_prop); att_list.push_back(set_current_rms); // Attribute : SetCurrentAverage SetCurrentAverageAttrib *set_current_average = new SetCurrentAverageAttrib(); Tango::UserDefaultAttrProp set_current_average_prop; set_current_average_prop.set_label("Average AC current setpoint/s"); set_current_average_prop.set_unit("A"); set_current_average_prop.set_format("%6.4f"); set_current_average_prop.set_description("Statistic when driven by the Libera.\nThe average AC setpoint applied to the DAC during the last second.\nX=SUM(setAC)/n"); set_current_average->set_default_properties(set_current_average_prop); att_list.push_back(set_current_average); // Attribute : FramesPerSec FramesPerSecAttrib *frames_per_sec = new FramesPerSecAttrib(); Tango::UserDefaultAttrProp frames_per_sec_prop; frames_per_sec_prop.set_label("Frames/s"); frames_per_sec_prop.set_unit(" "); frames_per_sec_prop.set_format("%3d"); frames_per_sec_prop.set_description("Statistic when driven by the Libera.\nThe number of setpoints per second."); frames_per_sec->set_default_properties(frames_per_sec_prop); att_list.push_back(frames_per_sec); // Attribute : ErrorPerSec ErrorPerSecAttrib *error_per_sec = new ErrorPerSecAttrib(); Tango::UserDefaultAttrProp error_per_sec_prop; error_per_sec_prop.set_label("Errors/s"); error_per_sec_prop.set_unit(" "); error_per_sec_prop.set_format("%3d"); error_per_sec_prop.set_description("Statistic when driven by the Libera.\nThe number of errors detected per second."); error_per_sec->set_default_properties(error_per_sec_prop); att_list.push_back(error_per_sec); // Attribute : ErrorCounter ErrorCounterAttrib *error_counter = new ErrorCounterAttrib(); Tango::UserDefaultAttrProp error_counter_prop; error_counter_prop.set_label("Error Counter"); error_counter_prop.set_unit(" "); error_counter_prop.set_format("%6d"); error_counter_prop.set_description("Statistic when driven by the Libera.\nThe total number of errors since the last reset."); error_counter->set_default_properties(error_counter_prop); att_list.push_back(error_counter); // Attribute : LocalControl LocalControlAttrib *local_control = new LocalControlAttrib(); Tango::UserDefaultAttrProp local_control_prop; local_control_prop.set_label("Local Control"); local_control_prop.set_unit(" "); local_control_prop.set_description("If true the AC current can be set on the device,\notherwise it is driven by the Libera."); local_control->set_default_properties(local_control_prop); att_list.push_back(local_control); // Attribute : SetCurrentAC SetCurrentACAttrib *set_current_ac = new SetCurrentACAttrib(); Tango::UserDefaultAttrProp set_current_ac_prop; set_current_ac_prop.set_label("AC Current Setpoint"); set_current_ac_prop.set_unit("A"); set_current_ac_prop.set_format("%6.4f"); set_current_ac_prop.set_max_value("0.2"); set_current_ac_prop.set_min_value("-0.2"); set_current_ac_prop.set_description("The AC current setpoint in local mode. If driven by the Libera, the attribute \nattribute value in INVALID."); set_current_ac->set_default_properties(set_current_ac_prop); att_list.push_back(set_current_ac); // Attribute : CurrentsDC CurrentsDCAttrib *currents_dc = new CurrentsDCAttrib(); Tango::UserDefaultAttrProp currents_dc_prop; currents_dc_prop.set_label("DC Currents"); currents_dc_prop.set_unit("A"); currents_dc_prop.set_format("%6.4f"); currents_dc_prop.set_max_value("1.8"); currents_dc_prop.set_min_value("-1.8"); currents_dc_prop.set_description("The DC currents of the three poles."); currents_dc->set_default_properties(currents_dc_prop); att_list.push_back(currents_dc); // Attribute : CurrentsAC CurrentsACAttrib *currents_ac = new CurrentsACAttrib(); Tango::UserDefaultAttrProp currents_ac_prop; currents_ac_prop.set_label("Currents"); currents_ac_prop.set_unit("A"); currents_ac_prop.set_format("%6.4f"); currents_ac_prop.set_description("The measured AC currents of the three poles."); currents_ac->set_default_properties(currents_ac_prop); att_list.push_back(currents_ac); // Attribute : Voltages VoltagesAttrib *voltages = new VoltagesAttrib(); Tango::UserDefaultAttrProp voltages_prop; voltages_prop.set_label("Voltages"); voltages_prop.set_unit("V"); voltages_prop.set_format("%6.4"); voltages_prop.set_description("The measured voltages of the three poles."); voltages->set_default_properties(voltages_prop); att_list.push_back(voltages); // Attribute : Impedances ImpedancesAttrib *impedances = new ImpedancesAttrib(); Tango::UserDefaultAttrProp impedances_prop; impedances_prop.set_label("Impedances"); impedances_prop.set_unit("Ohm"); impedances_prop.set_format("%4.2f"); impedances_prop.set_max_alarm("5.0"); impedances_prop.set_description("Calculated impedances for the three poles."); impedances->set_default_properties(impedances_prop); att_list.push_back(impedances); // Attribute : SetCurrentsRMS SetCurrentsRMSAttrib *set_currents_rms = new SetCurrentsRMSAttrib(); Tango::UserDefaultAttrProp set_currents_rms_prop; set_currents_rms_prop.set_label("RMS AC current setpoints/s"); set_currents_rms_prop.set_unit("A"); set_currents_rms_prop.set_format("%6.4"); set_currents_rms_prop.set_description("Statistic when driven by the Libera. One RMS value for every pole\nof the magnet.\nRMS value of the AC setpoint applied on the DAC during the last second.\nX=sqr( (sum(setAC)*sum(setAC)) / n - ((sum(setAC)/n) *(sum(setAC)/n)) )"); set_currents_rms->set_default_properties(set_currents_rms_prop); att_list.push_back(set_currents_rms); // Attribute : SetCurrentsAverage SetCurrentsAverageAttrib *set_currents_average = new SetCurrentsAverageAttrib(); Tango::UserDefaultAttrProp set_currents_average_prop; set_currents_average_prop.set_label("Average AC current setpoints/s"); set_currents_average_prop.set_unit("A"); set_currents_average_prop.set_format("%6.4"); set_currents_average_prop.set_description("Statistic when driven by the Libera. One average value for every pole\nof the magnet.\nRMS value of the AC setpoint applied on the DAC during the last second.\nX=sqr( (sum(setAC)*sum(setAC)) / n - ((sum(setAC)/n) *(sum(setAC)/n)) )"); set_currents_average->set_default_properties(set_currents_average_prop); att_list.push_back(set_currents_average); // Attribute : ErrorCounters ErrorCountersAttrib *error_counters = new ErrorCountersAttrib(); Tango::UserDefaultAttrProp error_counters_prop; error_counters_prop.set_label("Error counters"); error_counters_prop.set_unit(" "); error_counters_prop.set_format("%6d"); error_counters_prop.set_description("Statistic when driven by the Libera.\nThe total number of errors since the last reset for the \nthree poles."); error_counters->set_default_properties(error_counters_prop); att_list.push_back(error_counters); // End of Automatic code generation //------------------------------------------------------------- } //+---------------------------------------------------------------------------- // // method : BiltClass::get_class_property() // // description : Read the class properties from database. // //----------------------------------------------------------------------------- void BiltClass::get_class_property() { // Initialize your default values here (if not done with POGO). //------------------------------------------------------------------ // Read class properties from database.(Automatic code generation) //------------------------------------------------------------------ // Call database and extract values //-------------------------------------------- if (Tango::Util::instance()->_UseDb==true) get_db_class()->get_property(cl_prop); Tango::DbDatum def_prop; int i = -1; // End of Automatic code generation //------------------------------------------------------------------ } //+---------------------------------------------------------------------------- // // method : BiltClass::set_default_property // // description: Set default property (class and device) for wizard. // For each property, add to wizard property name and description // If default value has been set, add it to wizard property and // store it in a DbDatum. // //----------------------------------------------------------------------------- void BiltClass::set_default_property() { string prop_name; string prop_desc; string prop_def; vector vect_data; // Set Default Class Properties // Set Default Device Properties prop_name = "IPAddress"; prop_desc = "IP Address of BILT controller.\nEach controller includes several magnets and\neach magnet includes 3 power supplies,\nfor corrections in the X, Y and Z planes.\n\n"; prop_def = "0.0.0.0"; vect_data.clear(); vect_data.push_back("0.0.0.0"); if (prop_def.length()>0) { Tango::DbDatum data(prop_name); data << vect_data ; dev_def_prop.push_back(data); add_wiz_dev_prop(prop_name, prop_desc, prop_def); } else add_wiz_dev_prop(prop_name, prop_desc); prop_name = "MagnetNumber"; prop_desc = "Magnet number from 1 to 48"; prop_def = "0"; vect_data.clear(); vect_data.push_back("0"); if (prop_def.length()>0) { Tango::DbDatum data(prop_name); data << vect_data ; dev_def_prop.push_back(data); add_wiz_dev_prop(prop_name, prop_desc, prop_def); } else add_wiz_dev_prop(prop_name, prop_desc); } //+---------------------------------------------------------------------------- // // method : BiltClass::write_class_property // // description : Set class description as property in database // //----------------------------------------------------------------------------- void BiltClass::write_class_property() { // First time, check if database used //-------------------------------------------- if (Tango::Util::_UseDb == false) return; Tango::DbData data; string classname = get_name(); string header; string::size_type start, end; // Put title Tango::DbDatum title("ProjectTitle"); string str_title("BILT multi channel power supply"); title << str_title; data.push_back(title); // Put Description Tango::DbDatum description("Description"); vector str_desc; str_desc.push_back("The BILT multi channel power supply will be used with 3 channels for the ESRF fast"); str_desc.push_back("feedback systems."); str_desc.push_back("The power supply can be controlled in 2 ways :"); str_desc.push_back("By this device server for slow or human control or"); str_desc.push_back("by the Libera Beam Position monitors for fast feedback with closed loop control."); str_desc.push_back("The devices are exported as one device per steerer magnet. Every device has three"); str_desc.push_back("channels. The channels (poles) cannot be switched on individually but have their"); str_desc.push_back("individual set points and measurement values."); description << str_desc; data.push_back(description); // put cvs or svn location string filename(classname); filename += "Class.cpp"; // Create a string with the class ID to // get the string into the binary string class_id(ClassId); // check for cvs information string src_path(CvsPath); start = src_path.find("/"); if (start!=string::npos) { end = src_path.find(filename); if (end>start) { string strloc = src_path.substr(start, end-start); // Check if specific repository start = strloc.find("/cvsroot/"); if (start!=string::npos && start>0) { string repository = strloc.substr(0, start); if (repository.find("/segfs/")!=string::npos) strloc = "ESRF:" + strloc.substr(start, strloc.length()-start); } Tango::DbDatum cvs_loc("cvs_location"); cvs_loc << strloc; data.push_back(cvs_loc); } } // check for svn information else { string src_path(SvnPath); start = src_path.find("://"); if (start!=string::npos) { end = src_path.find(filename); if (end>start) { header = "$HeadURL: "; start = header.length(); string strloc = src_path.substr(start, (end-start)); Tango::DbDatum svn_loc("svn_location"); svn_loc << strloc; data.push_back(svn_loc); } } } // Get CVS or SVN revision tag // CVS tag string tagname(TagName); header = "$Name: "; start = header.length(); string endstr(" $"); end = tagname.find(endstr); if (end!=string::npos && end>start) { string strtag = tagname.substr(start, end-start); Tango::DbDatum cvs_tag("cvs_tag"); cvs_tag << strtag; data.push_back(cvs_tag); } // SVN tag string svnpath(SvnPath); header = "$HeadURL: "; start = header.length(); end = svnpath.find(endstr); if (end!=string::npos && end>start) { string strloc = svnpath.substr(start, end-start); string tagstr ("/tags/"); start = strloc.find(tagstr); if ( start!=string::npos ) { start = start + tagstr.length(); end = strloc.find(filename); string strtag = strloc.substr(start, end-start-1); Tango::DbDatum svn_tag("svn_tag"); svn_tag << strtag; data.push_back(svn_tag); } } // Get URL location string httpServ(HttpServer); if (httpServ.length()>0) { Tango::DbDatum db_doc_url("doc_url"); db_doc_url << httpServ; data.push_back(db_doc_url); } // Put inheritance Tango::DbDatum inher_datum("InheritedFrom"); vector inheritance; inheritance.push_back("Device_4Impl"); inher_datum << inheritance; data.push_back(inher_datum); // Call database and and values //-------------------------------------------- get_db_class()->put_property(data); } } // namespace Node-path: powersupply/itest/Bilt/trunk/BiltClass.h Node-kind: file Node-action: change Text-content-length: 13502 Text-content-md5: 932435e892193f918e1bbe3e841d0786 Content-length: 13502 //============================================================================= // // file : BiltClass.h // // description : Include for the BiltClass root class. // This class is the singleton class for // the Bilt device class. // It contains all properties and methods which the // Bilt requires only once e.g. the commands. // // project : TANGO Device Server // // $Author: meyer $ // // $Revision: 1.4 $ // $Date: 2009-11-27 13:49:26 $ // // SVN only: // $HeadURL: $ // // CVS only: // $Source: /segfs/tango/cvsroot/cppserver/machine/powersupply/SrSteerers/tango/Bilt/BiltClass.h,v $ // $Log: not supported by cvs2svn $ // Revision 1.3 2009/11/26 10:46:58 meyer // Updated for libMagnet_V120 // // Revision 1.2 2009/11/06 12:46:25 meyer // Added impedance attribute and corrected fromatting of attribute values. // // Revision 1.1.1.1 2009/11/04 16:23:02 meyer // Imported using TkCVS // // // copyleft : European Synchrotron Radiation Facility // BP 220, Grenoble 38043 // FRANCE // //============================================================================= // // This file is generated by POGO // (Program Obviously used to Generate tango Object) // // (c) - Software Engineering Group - ESRF //============================================================================= #ifndef _BILTCLASS_H #define _BILTCLASS_H #include #include namespace Bilt_ns {//===================================== // Define classes for attributes //===================================== class ErrorCountersAttrib: public Tango::SpectrumAttr { public: ErrorCountersAttrib():SpectrumAttr("ErrorCounters", Tango::DEV_ULONG, Tango::READ, 3) {}; ~ErrorCountersAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_ErrorCounters(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_ErrorCounters_allowed(ty);} }; class SetCurrentsAverageAttrib: public Tango::SpectrumAttr { public: SetCurrentsAverageAttrib():SpectrumAttr("SetCurrentsAverage", Tango::DEV_DOUBLE, Tango::READ, 3) {}; ~SetCurrentsAverageAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_SetCurrentsAverage(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_SetCurrentsAverage_allowed(ty);} }; class SetCurrentsRMSAttrib: public Tango::SpectrumAttr { public: SetCurrentsRMSAttrib():SpectrumAttr("SetCurrentsRMS", Tango::DEV_DOUBLE, Tango::READ, 3) {}; ~SetCurrentsRMSAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_SetCurrentsRMS(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_SetCurrentsRMS_allowed(ty);} }; class ImpedancesAttrib: public Tango::SpectrumAttr { public: ImpedancesAttrib():SpectrumAttr("Impedances", Tango::DEV_DOUBLE, Tango::READ, 3) {}; ~ImpedancesAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_Impedances(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_Impedances_allowed(ty);} }; class VoltagesAttrib: public Tango::SpectrumAttr { public: VoltagesAttrib():SpectrumAttr("Voltages", Tango::DEV_DOUBLE, Tango::READ, 3) {}; ~VoltagesAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_Voltages(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_Voltages_allowed(ty);} }; class CurrentsACAttrib: public Tango::SpectrumAttr { public: CurrentsACAttrib():SpectrumAttr("CurrentsAC", Tango::DEV_DOUBLE, Tango::READ, 3) {}; ~CurrentsACAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_CurrentsAC(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_CurrentsAC_allowed(ty);} }; class CurrentsDCAttrib: public Tango::SpectrumAttr { public: CurrentsDCAttrib():SpectrumAttr("CurrentsDC", Tango::DEV_DOUBLE, Tango::READ_WRITE, 3) {}; ~CurrentsDCAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_CurrentsDC(att);} virtual void write(Tango::DeviceImpl *dev,Tango::WAttribute &att) {(static_cast(dev))->write_CurrentsDC(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_CurrentsDC_allowed(ty);} }; class SetCurrentACAttrib: public Tango::Attr { public: SetCurrentACAttrib():Attr("SetCurrentAC", Tango::DEV_DOUBLE, Tango::READ_WRITE) {}; ~SetCurrentACAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_SetCurrentAC(att);} virtual void write(Tango::DeviceImpl *dev,Tango::WAttribute &att) {(static_cast(dev))->write_SetCurrentAC(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_SetCurrentAC_allowed(ty);} }; class LocalControlAttrib: public Tango::Attr { public: LocalControlAttrib():Attr("LocalControl", Tango::DEV_BOOLEAN, Tango::READ_WRITE) {}; ~LocalControlAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_LocalControl(att);} virtual void write(Tango::DeviceImpl *dev,Tango::WAttribute &att) {(static_cast(dev))->write_LocalControl(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_LocalControl_allowed(ty);} }; class ErrorCounterAttrib: public Tango::Attr { public: ErrorCounterAttrib():Attr("ErrorCounter", Tango::DEV_ULONG, Tango::READ) {}; ~ErrorCounterAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_ErrorCounter(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_ErrorCounter_allowed(ty);} }; class ErrorPerSecAttrib: public Tango::Attr { public: ErrorPerSecAttrib():Attr("ErrorPerSec", Tango::DEV_ULONG, Tango::READ) {}; ~ErrorPerSecAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_ErrorPerSec(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_ErrorPerSec_allowed(ty);} }; class FramesPerSecAttrib: public Tango::Attr { public: FramesPerSecAttrib():Attr("FramesPerSec", Tango::DEV_ULONG, Tango::READ) {}; ~FramesPerSecAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_FramesPerSec(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_FramesPerSec_allowed(ty);} }; class SetCurrentAverageAttrib: public Tango::Attr { public: SetCurrentAverageAttrib():Attr("SetCurrentAverage", Tango::DEV_DOUBLE, Tango::READ) {}; ~SetCurrentAverageAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_SetCurrentAverage(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_SetCurrentAverage_allowed(ty);} }; class SetCurrentRMSAttrib: public Tango::Attr { public: SetCurrentRMSAttrib():Attr("SetCurrentRMS", Tango::DEV_DOUBLE, Tango::READ) {}; ~SetCurrentRMSAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_SetCurrentRMS(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_SetCurrentRMS_allowed(ty);} }; class ImpedanceAttrib: public Tango::Attr { public: ImpedanceAttrib():Attr("Impedance", Tango::DEV_DOUBLE, Tango::READ) {}; ~ImpedanceAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_Impedance(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_Impedance_allowed(ty);} }; class VoltageAttrib: public Tango::Attr { public: VoltageAttrib():Attr("Voltage", Tango::DEV_DOUBLE, Tango::READ) {}; ~VoltageAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_Voltage(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_Voltage_allowed(ty);} }; class CurrentACAttrib: public Tango::Attr { public: CurrentACAttrib():Attr("CurrentAC", Tango::DEV_DOUBLE, Tango::READ) {}; ~CurrentACAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_CurrentAC(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_CurrentAC_allowed(ty);} }; class CurrentDCAttrib: public Tango::Attr { public: CurrentDCAttrib():Attr("CurrentDC", Tango::DEV_DOUBLE, Tango::READ_WRITE) {}; ~CurrentDCAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_CurrentDC(att);} virtual void write(Tango::DeviceImpl *dev,Tango::WAttribute &att) {(static_cast(dev))->write_CurrentDC(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_CurrentDC_allowed(ty);} }; class DisplayPoleNumberAttrib: public Tango::Attr { public: DisplayPoleNumberAttrib():Attr("DisplayPoleNumber", Tango::DEV_SHORT, Tango::READ_WRITE) {}; ~DisplayPoleNumberAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_DisplayPoleNumber(att);} virtual void write(Tango::DeviceImpl *dev,Tango::WAttribute &att) {(static_cast(dev))->write_DisplayPoleNumber(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_DisplayPoleNumber_allowed(ty);} }; //========================================= // Define classes for commands //========================================= class ResetCmd : public Tango::Command { public: ResetCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out, const char *in_desc, const char *out_desc, Tango::DispLevel level) :Command(name,in,out,in_desc,out_desc, level) {}; ResetCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out) :Command(name,in,out) {}; ~ResetCmd() {}; virtual CORBA::Any *execute (Tango::DeviceImpl *dev, const CORBA::Any &any); virtual bool is_allowed (Tango::DeviceImpl *dev, const CORBA::Any &any) {return (static_cast(dev))->is_Reset_allowed(any);} }; class OffCmd : public Tango::Command { public: OffCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out, const char *in_desc, const char *out_desc, Tango::DispLevel level) :Command(name,in,out,in_desc,out_desc, level) {}; OffCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out) :Command(name,in,out) {}; ~OffCmd() {}; virtual CORBA::Any *execute (Tango::DeviceImpl *dev, const CORBA::Any &any); virtual bool is_allowed (Tango::DeviceImpl *dev, const CORBA::Any &any) {return (static_cast(dev))->is_Off_allowed(any);} }; class OnCmd : public Tango::Command { public: OnCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out, const char *in_desc, const char *out_desc, Tango::DispLevel level) :Command(name,in,out,in_desc,out_desc, level) {}; OnCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out) :Command(name,in,out) {}; ~OnCmd() {}; virtual CORBA::Any *execute (Tango::DeviceImpl *dev, const CORBA::Any &any); virtual bool is_allowed (Tango::DeviceImpl *dev, const CORBA::Any &any) {return (static_cast(dev))->is_On_allowed(any);} }; // // The BiltClass singleton definition // class #ifdef WIN32 __declspec(dllexport) #endif BiltClass : public Tango::DeviceClass { public: // properties member data // add your own data members here //------------------------------------ public: Tango::DbData cl_prop; Tango::DbData cl_def_prop; Tango::DbData dev_def_prop; // Method prototypes static BiltClass *init(const char *); static BiltClass *instance(); ~BiltClass(); Tango::DbDatum get_class_property(string &); Tango::DbDatum get_default_device_property(string &); Tango::DbDatum get_default_class_property(string &); protected: BiltClass(string &); static BiltClass *_instance; void command_factory(); void get_class_property(); void attribute_factory(vector &); void write_class_property(); void set_default_property(); string get_cvstag(); string get_cvsroot(); private: void device_factory(const Tango::DevVarStringArray *); }; } // namespace Bilt_ns #endif // _BILTCLASS_H Node-path: powersupply/itest/Bilt/trunk/BiltStateMachine.cpp Node-kind: file Node-action: change Text-content-length: 11455 Text-content-md5: 654aac3b9a9b432a80875111e9877ac4 Content-length: 11455 static const char *RcsId = "$Id $"; //+============================================================================= // // file : BiltStateMachine.cpp // // description : C++ source for the Bilt and its alowed // methods for commands and attributes // // project : TANGO Device Server // // $Author: meyer $ // // $Revision: 1.4 $ // $Date: 2009-11-27 13:49:26 $ // // SVN only: // $HeadURL: $ // // CVS only: // $Source: /segfs/tango/cvsroot/cppserver/machine/powersupply/SrSteerers/tango/Bilt/BiltStateMachine.cpp,v $ // $Log: not supported by cvs2svn $ // Revision 1.3 2009/11/26 10:46:58 meyer // Updated for libMagnet_V120 // // Revision 1.2 2009/11/06 12:46:25 meyer // Added impedance attribute and corrected fromatting of attribute values. // // Revision 1.1.1.1 2009/11/04 16:23:02 meyer // Imported using TkCVS // // // copyleft : European Synchrotron Radiation Facility // BP 220, Grenoble 38043 // FRANCE // //-============================================================================= // // This file is generated by POGO // (Program Obviously used to Generate tango Object) // // (c) - Software Engineering Group - ESRF //============================================================================= #include #include #include /*==================================================================== * This file contains the methods to allow commands and attributes * read or write execution. * * If you wand to add your own code, add it between * the "End/Re-Start of Generated Code" comments. * * If you want, you can also add your own methods. *==================================================================== */ namespace Bilt_ns { //================================================= // Attributes Allowed Methods //================================================= //+---------------------------------------------------------------------------- // // method : Bilt::is_CurrentDC_allowed // // description : Read/Write allowed for CurrentDC attribute. // //----------------------------------------------------------------------------- bool Bilt::is_CurrentDC_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_CurrentAC_allowed // // description : Read/Write allowed for CurrentAC attribute. // //----------------------------------------------------------------------------- bool Bilt::is_CurrentAC_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_Voltage_allowed // // description : Read/Write allowed for Voltage attribute. // //----------------------------------------------------------------------------- bool Bilt::is_Voltage_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_FramesPerSec_allowed // // description : Read/Write allowed for FramesPerSec attribute. // //----------------------------------------------------------------------------- bool Bilt::is_FramesPerSec_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_ErrorPerSec_allowed // // description : Read/Write allowed for ErrorPerSec attribute. // //----------------------------------------------------------------------------- bool Bilt::is_ErrorPerSec_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_ErrorCounter_allowed // // description : Read/Write allowed for ErrorCounter attribute. // //----------------------------------------------------------------------------- bool Bilt::is_ErrorCounter_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_LocalControl_allowed // // description : Read/Write allowed for LocalControl attribute. // //----------------------------------------------------------------------------- bool Bilt::is_LocalControl_allowed(Tango::AttReqType type) { if (get_state() == Tango::OFF || get_state() == Tango::FAULT || get_state() == Tango::UNKNOWN) { // End of Generated Code // Re-Start of Generated Code return false; } return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_SetCurrentAC_allowed // // description : Read/Write allowed for SetCurrentAC attribute. // //----------------------------------------------------------------------------- bool Bilt::is_SetCurrentAC_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_Impedance_allowed // // description : Read/Write allowed for Impedance attribute. // //----------------------------------------------------------------------------- bool Bilt::is_Impedance_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_DisplayPoleNumber_allowed // // description : Read/Write allowed for DisplayPoleNumber attribute. // //----------------------------------------------------------------------------- bool Bilt::is_DisplayPoleNumber_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_CurrentsDC_allowed // // description : Read/Write allowed for CurrentsDC attribute. // //----------------------------------------------------------------------------- bool Bilt::is_CurrentsDC_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_CurrentsAC_allowed // // description : Read/Write allowed for CurrentsAC attribute. // //----------------------------------------------------------------------------- bool Bilt::is_CurrentsAC_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_Voltages_allowed // // description : Read/Write allowed for Voltages attribute. // //----------------------------------------------------------------------------- bool Bilt::is_Voltages_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_Impedances_allowed // // description : Read/Write allowed for Impedances attribute. // //----------------------------------------------------------------------------- bool Bilt::is_Impedances_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_SetCurrentRMS_allowed // // description : Read/Write allowed for SetCurrentRMS attribute. // //----------------------------------------------------------------------------- bool Bilt::is_SetCurrentRMS_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_SetCurrentAverage_allowed // // description : Read/Write allowed for SetCurrentAverage attribute. // //----------------------------------------------------------------------------- bool Bilt::is_SetCurrentAverage_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_SetCurrentsRMS_allowed // // description : Read/Write allowed for SetCurrentsRMS attribute. // //----------------------------------------------------------------------------- bool Bilt::is_SetCurrentsRMS_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_SetCurrentsAverage_allowed // // description : Read/Write allowed for SetCurrentsAverage attribute. // //----------------------------------------------------------------------------- bool Bilt::is_SetCurrentsAverage_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_ErrorCounters_allowed // // description : Read/Write allowed for ErrorCounters attribute. // //----------------------------------------------------------------------------- bool Bilt::is_ErrorCounters_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //================================================= // Commands Allowed Methods //================================================= //+---------------------------------------------------------------------------- // // method : Bilt::is_On_allowed // // description : Execution allowed for On command. // //----------------------------------------------------------------------------- bool Bilt::is_On_allowed(const CORBA::Any &any) { if (get_state() == Tango::ON || get_state() == Tango::FAULT || get_state() == Tango::ALARM || get_state() == Tango::UNKNOWN) { // End of Generated Code // Re-Start of Generated Code return false; } return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_Off_allowed // // description : Execution allowed for Off command. // //----------------------------------------------------------------------------- bool Bilt::is_Off_allowed(const CORBA::Any &any) { if (get_state() == Tango::OFF) { // End of Generated Code // Re-Start of Generated Code return false; } return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_Reset_allowed // // description : Execution allowed for Reset command. // //----------------------------------------------------------------------------- bool Bilt::is_Reset_allowed(const CORBA::Any &any) { // End of Generated Code // Re-Start of Generated Code return true; } } // namespace Bilt_ns Node-path: powersupply/itest/Bilt/trunk/Makefile Node-kind: file Node-action: change Text-content-length: 5119 Text-content-md5: 4de310a8afdfa867486eed9247225ac1 Content-length: 5119 #============================================================================= # # file : Makefile # # description : Include for the Bilt class. # # project : Makefile to generate a Tango server # # $Author: meyer $ # # $Revision: 1.3 $ # # $Log: not supported by cvs2svn $ # Revision 1.2 2009/11/26 10:46:58 meyer # Updated for libMagnet_V120 # # Revision 1.1.1.1 2009/11/04 16:23:02 meyer # Imported using TkCVS # # # copyleft : European Synchrotron Radiation Facility # BP 220, Grenoble 38043 # FRANCE # #============================================================================= # This file is generated by POGO # (Program Obviously used to Generate tango Object) # # (c) - Software Engineering Group - ESRF #============================================================================= # CLASS = Bilt MAJOR_VERS = 2 MINOR_VERS = 0 RELEASE = Release_$(MAJOR_VERS)_$(MINOR_VERS) OS = $(shell /csadmin/common/scripts/get_os) PROCESSOR = $(shell uname -p) #----------------------------------------- # Set default home directories #----------------------------------------- TANGO_HOME = /segfs/tango/release CPP_SERVERS = $(TANGO_HOME)/cppserver ifdef no_debug DEBUG = -O else DEBUG = -g endif ifdef _solaris CC = CC BIN_DIR=$(OS)_CC AR_SL = $(CC) -mt -G VERS_OPT = -h SL_EXT = so endif ifdef linux CC = c++ CC_SHLIB = $(CC) -fPIC $(PROCESSOR)=1 ifdef x86_64 NBITS=_64 endif BIN_DIR=$(OS)$(NBITS) AR_SL = $(CC) -fPIC -shared SL_EXT = so VERS_OPT = -Wl,-soname, endif INCLUDE_DIRS = -I$(TANGO_HOME)/$(BIN_DIR)/include -I. \ -I$(CPP_SERVERS)/include \ -I libMagnet_V120 OBJS_DIR = obj/$(BIN_DIR) LIB_DIRS = -L $(TANGO_HOME)/$(BIN_DIR)/lib \ -L libMagnet_V120 TARGET_LIB = $(CPP_SERVERS)/lib/$(BIN_DIR)/libtgclasses.a #----------------------------------------- # Set CXXFLAGS and LFLAGS #----------------------------------------- ifdef _solaris CXXFLAGS = $(DEBUG) -mt -D_PTHREADS $(INCLUDE_DIRS) LFLAGS = $(DEBUG) $(LIB_DIRS) \ -ltango \ -llog4tango \ -lomniORB4 \ -lomniDynamic4 \ -lomnithread \ -lCOS4 \ -lpthread \ -lposix4 -lsocket -lnsl endif ifdef linux CXXFLAGS = $(DEBUG) -D_REENTRANT $(INCLUDE_DIRS) LFLAGS = $(DEBUG) $(LIB_DIRS) \ -ltango \ -llog4tango \ -lomniORB4 \ -lomniDynamic4 \ -lomnithread \ -lCOS4 \ -ldl -lpthread \ -lMagnet endif #----------------------------------------- # Set dependences #----------------------------------------- SVC_OBJS = $(OBJS_DIR)/$(CLASS).o \ $(OBJS_DIR)/$(CLASS)StateMachine.o \ $(OBJS_DIR)/$(CLASS)Class.o \ $(OBJS_DIR)/ClassFactory.o \ $(OBJS_DIR)/main.o SHLIB_OBJS = $(OBJS_DIR)/$(CLASS)Class.so.o \ $(OBJS_DIR)/$(CLASS)StateMachine.so.o \ $(OBJS_DIR)/$(CLASS).so.o SVC_INC = $(CLASS)Class.h \ $(CLASS).h $(OBJS_DIR)/%.o: %.cpp $(SVC_INC) $(CC) $(CXXFLAGS) -c $< -o $(OBJS_DIR)/$*.o $(OBJS_DIR)/%.so.o: %.cpp $(SVC_INC) $(CC_SHLIB) $(CXXFLAGS) -c $< -o $(OBJS_DIR)/$*.so.o #----------------------------------------- # Make Entry #----------------------------------------- all: $(CLASS) $(CLASS): make_obj_dir make_bin_dir $(SVC_OBJS) $(CC) $(SVC_OBJS) -o $(CLASS) $(LFLAGS) @mv $(CLASS) bin/$(BIN_DIR)/$(CLASS) shlib: make_obj_dir make_shlib_dir $(SHLIB_OBJS) $(AR_SL) -o \ shlib/$(BIN_DIR)/$(CLASS).$(SL_EXT).$(MAJOR_VERS).$(MINOR_VERS) \ $(VERS_OPT)$(CLASS).$(SL_EXT).$(MAJOR_VERS) \ $(SHLIB_OBJS) $(LFLAGS) @rm -f shlib/$(BIN_DIR)/$(CLASS).$(SL_EXT) @cd shlib/$(BIN_DIR); \ ln -s $(CLASS).$(SL_EXT).$(MAJOR_VERS).$(MINOR_VERS) $(CLASS).$(SL_EXT) clean: rm -f $(OBJS_DIR)/*.o \ $(OBJS_DIR)/*.so.o \ bin/$(BIN_DIR)/$(CLASS) \ core make_obj_dir: @mkdir -p obj @mkdir -p obj/$(BIN_DIR) make_bin_dir: @mkdir -p bin @mkdir -p bin/$(BIN_DIR) make_shlib_dir: @mkdir -p shlib @mkdir -p shlib/$(BIN_DIR) #----------------------------------------- # Install binary file #----------------------------------------- install: cp bin/$(BIN_DIR)/$(CLASS) $(TANGO_HOME)/$(BIN_DIR)/bin #----------------------------------------- # Update class library and header files # recompile without debug mode. #----------------------------------------- lib: clean @make no_debug=1 cp *.h $(CPP_SERVERS)/include ar ruv $(TARGET_LIB) $(CLASS).o ar ruv $(TARGET_LIB) $(CLASS)Class.o ar ruv $(TARGET_LIB) $(CLASS)StateMachine.o ident $(TARGET_LIB) | grep $(CLASS) #------------------------------------------------------ # Tag the CVS/SVN module corresponding to this class # copy cvs_tag or svn_tag to tag: entry #------------------------------------------------------ #svn_tag: # svn copy ../trunk ../tags/$(RELEASE) # svn commit ../tags/$(RELEASE) \ # -m "Tagging the $(RELEASE) of the $(CLASS) project." # #cvs_tag: # @cvstag "$(CLASS)-$(RELEASE)" # @make $(CLASS) # @make show_tag #show_cvs_tag: # @cvstag -d # # Only these make options work with the current Pogo version 5.3.x! tag: @cvstag "$(CLASS)-$(RELEASE)" @make $(CLASS) @make show_tag show_tag: @cvstag -d Revision-number: 10 Prop-content-length: 147 Content-length: 147 K 8 svn:date V 27 2009-11-27T13:49:27.000000Z K 7 svn:log V 73 This commit was manufactured by cvs2svn to create tag 'Bilt-Release_2_0'. PROPS-END Node-path: powersupply/itest/Bilt/tags/Bilt-Release_2_0 Node-kind: dir Node-action: add Node-copyfrom-rev: 9 Node-copyfrom-path: powersupply/itest/Bilt/trunk Revision-number: 11 Prop-content-length: 133 Content-length: 133 K 10 svn:author V 5 meyer K 8 svn:date V 27 2009-12-18T10:19:23.000000Z K 7 svn:log V 33 Using libMagnet version 130 now. PROPS-END Node-path: powersupply/itest/Bilt/trunk/Makefile Node-kind: file Node-action: change Text-content-length: 5265 Text-content-md5: fa02b413097285330bf9abd1fb409e16 Content-length: 5265 #============================================================================= # # file : Makefile # # description : Include for the Bilt class. # # project : Makefile to generate a Tango server # # $Author: meyer $ # # $Revision: 1.4 $ # # $Log: not supported by cvs2svn $ # Revision 1.3 2009/11/27 13:49:26 meyer # Modified structure! The pole is no longer a device. # The device is now a magnet with three poles. # # Revision 1.2 2009/11/26 10:46:58 meyer # Updated for libMagnet_V120 # # Revision 1.1.1.1 2009/11/04 16:23:02 meyer # Imported using TkCVS # # # copyleft : European Synchrotron Radiation Facility # BP 220, Grenoble 38043 # FRANCE # #============================================================================= # This file is generated by POGO # (Program Obviously used to Generate tango Object) # # (c) - Software Engineering Group - ESRF #============================================================================= # CLASS = Bilt MAJOR_VERS = 2 MINOR_VERS = 0 RELEASE = Release_$(MAJOR_VERS)_$(MINOR_VERS) OS = $(shell /csadmin/common/scripts/get_os) PROCESSOR = $(shell uname -p) #----------------------------------------- # Set default home directories #----------------------------------------- TANGO_HOME = /segfs/tango/release CPP_SERVERS = $(TANGO_HOME)/cppserver ifdef no_debug DEBUG = -O else DEBUG = -g endif ifdef _solaris CC = CC BIN_DIR=$(OS)_CC AR_SL = $(CC) -mt -G VERS_OPT = -h SL_EXT = so endif ifdef linux CC = c++ CC_SHLIB = $(CC) -fPIC $(PROCESSOR)=1 ifdef x86_64 NBITS=_64 endif BIN_DIR=$(OS)$(NBITS) AR_SL = $(CC) -fPIC -shared SL_EXT = so VERS_OPT = -Wl,-soname, endif INCLUDE_DIRS = -I$(TANGO_HOME)/$(BIN_DIR)/include -I. \ -I$(CPP_SERVERS)/include \ -I libMagnet_V130 OBJS_DIR = obj/$(BIN_DIR) LIB_DIRS = -L $(TANGO_HOME)/$(BIN_DIR)/lib \ -L libMagnet_V130 TARGET_LIB = $(CPP_SERVERS)/lib/$(BIN_DIR)/libtgclasses.a #----------------------------------------- # Set CXXFLAGS and LFLAGS #----------------------------------------- ifdef _solaris CXXFLAGS = $(DEBUG) -mt -D_PTHREADS $(INCLUDE_DIRS) LFLAGS = $(DEBUG) $(LIB_DIRS) \ -ltango \ -llog4tango \ -lomniORB4 \ -lomniDynamic4 \ -lomnithread \ -lCOS4 \ -lpthread \ -lposix4 -lsocket -lnsl endif ifdef linux CXXFLAGS = $(DEBUG) -D_REENTRANT $(INCLUDE_DIRS) LFLAGS = $(DEBUG) $(LIB_DIRS) \ -ltango \ -llog4tango \ -lomniORB4 \ -lomniDynamic4 \ -lomnithread \ -lCOS4 \ -ldl -lpthread \ -lMagnet endif #----------------------------------------- # Set dependences #----------------------------------------- SVC_OBJS = $(OBJS_DIR)/$(CLASS).o \ $(OBJS_DIR)/$(CLASS)StateMachine.o \ $(OBJS_DIR)/$(CLASS)Class.o \ $(OBJS_DIR)/ClassFactory.o \ $(OBJS_DIR)/main.o SHLIB_OBJS = $(OBJS_DIR)/$(CLASS)Class.so.o \ $(OBJS_DIR)/$(CLASS)StateMachine.so.o \ $(OBJS_DIR)/$(CLASS).so.o SVC_INC = $(CLASS)Class.h \ $(CLASS).h $(OBJS_DIR)/%.o: %.cpp $(SVC_INC) $(CC) $(CXXFLAGS) -c $< -o $(OBJS_DIR)/$*.o $(OBJS_DIR)/%.so.o: %.cpp $(SVC_INC) $(CC_SHLIB) $(CXXFLAGS) -c $< -o $(OBJS_DIR)/$*.so.o #----------------------------------------- # Make Entry #----------------------------------------- all: $(CLASS) $(CLASS): make_obj_dir make_bin_dir $(SVC_OBJS) $(CC) $(SVC_OBJS) -o $(CLASS) $(LFLAGS) @mv $(CLASS) bin/$(BIN_DIR)/$(CLASS) shlib: make_obj_dir make_shlib_dir $(SHLIB_OBJS) $(AR_SL) -o \ shlib/$(BIN_DIR)/$(CLASS).$(SL_EXT).$(MAJOR_VERS).$(MINOR_VERS) \ $(VERS_OPT)$(CLASS).$(SL_EXT).$(MAJOR_VERS) \ $(SHLIB_OBJS) $(LFLAGS) @rm -f shlib/$(BIN_DIR)/$(CLASS).$(SL_EXT) @cd shlib/$(BIN_DIR); \ ln -s $(CLASS).$(SL_EXT).$(MAJOR_VERS).$(MINOR_VERS) $(CLASS).$(SL_EXT) clean: rm -f $(OBJS_DIR)/*.o \ $(OBJS_DIR)/*.so.o \ bin/$(BIN_DIR)/$(CLASS) \ core make_obj_dir: @mkdir -p obj @mkdir -p obj/$(BIN_DIR) make_bin_dir: @mkdir -p bin @mkdir -p bin/$(BIN_DIR) make_shlib_dir: @mkdir -p shlib @mkdir -p shlib/$(BIN_DIR) #----------------------------------------- # Install binary file #----------------------------------------- install: cp bin/$(BIN_DIR)/$(CLASS) $(TANGO_HOME)/$(BIN_DIR)/bin #----------------------------------------- # Update class library and header files # recompile without debug mode. #----------------------------------------- lib: clean @make no_debug=1 cp *.h $(CPP_SERVERS)/include ar ruv $(TARGET_LIB) $(CLASS).o ar ruv $(TARGET_LIB) $(CLASS)Class.o ar ruv $(TARGET_LIB) $(CLASS)StateMachine.o ident $(TARGET_LIB) | grep $(CLASS) #------------------------------------------------------ # Tag the CVS/SVN module corresponding to this class # copy cvs_tag or svn_tag to tag: entry #------------------------------------------------------ #svn_tag: # svn copy ../trunk ../tags/$(RELEASE) # svn commit ../tags/$(RELEASE) \ # -m "Tagging the $(RELEASE) of the $(CLASS) project." # #cvs_tag: # @cvstag "$(CLASS)-$(RELEASE)" # @make $(CLASS) # @make show_tag #show_cvs_tag: # @cvstag -d # # Only these make options work with the current Pogo version 5.3.x! tag: @cvstag "$(CLASS)-$(RELEASE)" @make $(CLASS) @make show_tag show_tag: @cvstag -d Revision-number: 12 Prop-content-length: 140 Content-length: 140 K 10 svn:author V 5 meyer K 8 svn:date V 27 2009-12-18T12:01:40.000000Z K 7 svn:log V 40 Corrected alarm handling in dev_state() PROPS-END Node-path: powersupply/itest/Bilt/trunk/Bilt.cpp Node-kind: file Node-action: change Text-content-length: 34873 Text-content-md5: b79a0fac1d22c75a615ec23c9e712635 Content-length: 34873 static const char *RcsId = "$Id: Bilt.cpp,v 1.7 2009-12-18 12:01:40 meyer Exp $"; //+============================================================================= // // file : Bilt.cpp // // description : C++ source for the Bilt and its commands. // The class is derived from Device. It represents the // CORBA servant object which will be accessed from the // network. All commands which can be executed on the // Bilt are implemented in this file. // // project : TANGO Device Server // // $Author: meyer $ // // $Revision: 1.7 $ // // $Revision: 1.7 $ // $Date: 2009-12-18 12:01:40 $ // // SVN only: // $HeadURL: $ // // CVS only: // $Source: /segfs/tango/cvsroot/cppserver/machine/powersupply/SrSteerers/tango/Bilt/Bilt.cpp,v $ // $Log: not supported by cvs2svn $ // Revision 1.6 2009/11/27 13:49:26 meyer // Modified structure! The pole is no longer a device. // The device is now a magnet with three poles. // // Revision 1.5 2009/11/26 10:46:58 meyer // Updated for libMagnet_V120 // // Revision 1.4 2009/11/24 09:21:46 meyer // Absolut value for impedance // // Revision 1.3 2009/11/23 16:46:58 meyer // Corrected state, status and exception handling // // Revision 1.2 2009/11/06 12:46:25 meyer // Added impedance attribute and corrected fromatting of attribute values. // // Revision 1.1.1.1 2009/11/04 16:23:02 meyer // Imported using TkCVS // // // copyleft : European Synchrotron Radiation Facility // BP 220, Grenoble 38043 // FRANCE // //-============================================================================= // // This file is generated by POGO // (Program Obviously used to Generate tango Object) // // (c) - Software Engineering Group - ESRF //============================================================================= //=================================================================== // // The following table gives the correspondence // between commands and method name. // // Command name| Method name // ---------------------------------------- // State | dev_state() // Status | dev_status() // On | on() // Off | off() // Reset | reset() // //=================================================================== #include #include #include #include namespace Bilt_ns { //+---------------------------------------------------------------------------- // // method : Bilt::Bilt(string &s) // // description : constructor for simulated Bilt // // in : - cl : Pointer to the DeviceClass object // - s : Device name // //----------------------------------------------------------------------------- Bilt::Bilt(Tango::DeviceClass *cl,string &s) :Tango::Device_4Impl(cl,s.c_str()) { init_device(); } Bilt::Bilt(Tango::DeviceClass *cl,const char *s) :Tango::Device_4Impl(cl,s) { init_device(); } Bilt::Bilt(Tango::DeviceClass *cl,const char *s,const char *d) :Tango::Device_4Impl(cl,s,d) { init_device(); } //+---------------------------------------------------------------------------- // // method : Bilt::delete_device() // // description : will be called at device destruction or at init command. // //----------------------------------------------------------------------------- void Bilt::delete_device() { // Delete device allocated objects delete BILT; } //+---------------------------------------------------------------------------- // // method : Bilt::init_device() // // description : will be called at device initialization. // //----------------------------------------------------------------------------- void Bilt::init_device() { INFO_STREAM << "Bilt::Bilt() create device " << device_name << endl; // Initialise variables to default values //-------------------------------------------- get_device_property(); set_state (Tango::UNKNOWN); try { BILT = new itest::TMagnet (iPAddress.c_str(), magnetNumber); } catch (itest::ItestException &e) { try { create_tango_exception (e, mdata_errors, "Init failure" , "Cannot initialise ITEST libray objects", "Bilt::init_device"); } catch (Tango::DevFailed &e) { set_state (Tango::FAULT); } } } //+---------------------------------------------------------------------------- // // method : Bilt::get_device_property() // // description : Read the device properties from database. // //----------------------------------------------------------------------------- void Bilt::get_device_property() { // Initialize your default values here (if not done with POGO). //------------------------------------------------------------------ // intitialise mdada structure for magnet read values mdata.magnet = -1; mdata.state = -1; for (int i=0; i_UseDb==true) get_db_device()->get_property(dev_prop); Tango::DbDatum def_prop, cl_prop; BiltClass *ds_class = (static_cast(get_device_class())); int i = -1; // Try to initialize IPAddress from class property cl_prop = ds_class->get_class_property(dev_prop[++i].name); if (cl_prop.is_empty()==false) cl_prop >> iPAddress; else { // Try to initialize IPAddress from default device value def_prop = ds_class->get_default_device_property(dev_prop[i].name); if (def_prop.is_empty()==false) def_prop >> iPAddress; } // And try to extract IPAddress value from database if (dev_prop[i].is_empty()==false) dev_prop[i] >> iPAddress; // Try to initialize MagnetNumber from class property cl_prop = ds_class->get_class_property(dev_prop[++i].name); if (cl_prop.is_empty()==false) cl_prop >> magnetNumber; else { // Try to initialize MagnetNumber from default device value def_prop = ds_class->get_default_device_property(dev_prop[i].name); if (def_prop.is_empty()==false) def_prop >> magnetNumber; } // And try to extract MagnetNumber value from database if (dev_prop[i].is_empty()==false) dev_prop[i] >> magnetNumber; // End of Automatic code generation //------------------------------------------------------------------ } //+---------------------------------------------------------------------------- // // method : Bilt::always_executed_hook() // // description : method always executed before any command is executed // //----------------------------------------------------------------------------- void Bilt::always_executed_hook() { } //+---------------------------------------------------------------------------- // // method : Bilt::read_attr_hardware // // description : Hardware acquisition for attributes. // //----------------------------------------------------------------------------- void Bilt::read_attr_hardware(vector &attr_list) { DEBUG_STREAM << "Bilt::read_attr_hardware(vector &attr_list) entering... "<< endl; // Add your own code here } //+---------------------------------------------------------------------------- // // method : Bilt::read_SetCurrentRMS // // description : Extract real attribute values for SetCurrentRMS acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_SetCurrentRMS(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_SetCurrentRMS(Tango::Attribute &attr) entering... "<< endl; read_fdata(); if ( fdata_errors.length() != 0 ) attr.set_quality(Tango::ATTR_INVALID); else attr.set_value (&fdata[pole_number].rms_ac_sett_sec); } //+---------------------------------------------------------------------------- // // method : Bilt::read_SetCurrentAverage // // description : Extract real attribute values for SetCurrentAverage acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_SetCurrentAverage(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_SetCurrentAverage(Tango::Attribute &attr) entering... "<< endl; read_fdata(); if ( fdata_errors.length() != 0 ) attr.set_quality(Tango::ATTR_INVALID); else attr.set_value (&fdata[pole_number].average_sett_sec); } //+---------------------------------------------------------------------------- // // method : Bilt::read_SetCurrentsRMS // // description : Extract real attribute values for SetCurrentsRMS acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_SetCurrentsRMS(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_SetCurrentsRMS(Tango::Attribute &attr) entering... "<< endl; read_fdata(); if ( fdata_errors.length() != 0 ) attr.set_quality(Tango::ATTR_INVALID); else { for (int i=0; i CURRENT_LIMIT ) impedances[i] = fabs (mdata.idata[i].measvolt / mdata.idata[i].meascurr); else impedances[i] = nan(""); } attr.set_value (&(impedances[0]), POLES); } } //+---------------------------------------------------------------------------- // // method : Bilt::read_DisplayPoleNumber // // description : Extract real attribute values for DisplayPoleNumber acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_DisplayPoleNumber(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_DisplayPoleNumber(Tango::Attribute &attr) entering... "<< endl; attr.set_value (&pole_number); } //+---------------------------------------------------------------------------- // // method : Bilt::write_DisplayPoleNumber // // description : Write DisplayPoleNumber attribute values to hardware. // //----------------------------------------------------------------------------- void Bilt::write_DisplayPoleNumber(Tango::WAttribute &attr) { DEBUG_STREAM << "Bilt::write_DisplayPoleNumber(Tango::WAttribute &attr) entering... "<< endl; attr.get_write_value(pole_number); } //+---------------------------------------------------------------------------- // // method : Bilt::read_CurrentsDC // // description : Extract real attribute values for CurrentsDC acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_CurrentsDC(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_CurrentsDC(Tango::Attribute &attr) entering... "<< endl; read_mdata(); if ( mdata_errors.length() != 0 ) attr.set_quality(Tango::ATTR_INVALID); else { for (int i=0; ipole(i).get_current_DC(); } attr.set_value (&(currents_dc[0]), POLES); } } //+---------------------------------------------------------------------------- // // method : Bilt::write_CurrentsDC // // description : Write CurrentsDC attribute values to hardware. // //----------------------------------------------------------------------------- void Bilt::write_CurrentsDC(Tango::WAttribute &attr) { DEBUG_STREAM << "Bilt::write_CurrentsDC(Tango::WAttribute &attr) entering... "<< endl; const double *set_currents; // check the correct number of setpoints if ( attr.get_write_value_length() == POLES ) attr.get_write_value(set_currents); else { TangoSys_MemStream tms; tms << "Wrong number of setpoints!" << endl; Tango::Except::throw_exception("WriteError", tms.str(), "Bilt::write_CurrentsDC"); } // apply setpoints to the poles try { for (int i=0; ipole(i).set_current_DC (set_currents[i]); } } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot write DC current value", "Bilt::write_CurrentDC"); } } //+---------------------------------------------------------------------------- // // method : Bilt::read_CurrentsAC // // description : Extract real attribute values for CurrentsAC acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_CurrentsAC(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_CurrentsAC(Tango::Attribute &attr) entering... "<< endl; read_mdata(); if ( mdata_errors.length() != 0 ) attr.set_quality(Tango::ATTR_INVALID); else { for (int i=0; i CURRENT_LIMIT ) impedance = fabs (mdata.idata[pole_number].measvolt / mdata.idata[pole_number].meascurr); else impedance = nan(""); attr.set_value (&impedance); } } //+---------------------------------------------------------------------------- // // method : Bilt::read_LocalControl // // description : Extract real attribute values for LocalControl acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_LocalControl(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_LocalControl(Tango::Attribute &attr) entering... "<< endl; try { int switch_state = BILT->pole(pole_number).get_switch(); if ( switch_state == 1 ) local_control = false; else local_control = true; } catch (itest::ItestException &e) { create_tango_exception (e, "Read failure" , "Cannot read the actual switch state", "Bilt::read_LocalControl"); } attr.set_value (&local_control); } //+---------------------------------------------------------------------------- // // method : Bilt::write_LocalControl // // description : Write LocalControl attribute values to hardware. // //----------------------------------------------------------------------------- void Bilt::write_LocalControl(Tango::WAttribute &attr) { DEBUG_STREAM << "Bilt::write_LocalControl(Tango::WAttribute &attr) entering... "<< endl; attr.get_write_value(local_control); try { int switch_state; if ( local_control == true ) switch_state = 0; else switch_state = 1; BILT->pole(pole_number).set_switch (switch_state); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot write switch state", "Bilt::write_LocalControl"); } } //+---------------------------------------------------------------------------- // // method : Bilt::read_SetCurrentAC // // description : Extract real attribute values for SetCurrentAC acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_SetCurrentAC(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_SetCurrentAC(Tango::Attribute &attr) entering... "<< endl; if ( local_control == false ) { attr.set_quality (Tango::ATTR_INVALID); } else { attr.set_value (&set_current_ac); } } //+---------------------------------------------------------------------------- // // method : Bilt::write_SetCurrentAC // // description : Write SetCurrentAC attribute values to hardware. // //----------------------------------------------------------------------------- void Bilt::write_SetCurrentAC(Tango::WAttribute &attr) { DEBUG_STREAM << "Bilt::write_SetCurrentAC(Tango::WAttribute &attr) entering... "<< endl; // check whether local control is true if ( local_control == false ) { TangoSys_MemStream tms; tms << "Can set AC current only when local control enabled!" << endl; Tango::Except::throw_exception("WriteError", tms.str(), "Bilt::write_SetCurrentAC"); } attr.get_write_value(set_current_ac); try { BILT->pole(pole_number).set_current_AC (set_current_ac); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot write AC current value", "Bilt::write_SetCurrentAC"); } } //+---------------------------------------------------------------------------- // // method : Bilt::read_CurrentDC // // description : Extract real attribute values for CurrentDC acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_CurrentDC(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_CurrentDC(Tango::Attribute &attr) entering... "<< endl; try { current_dc = BILT->pole(pole_number).get_current_DC(); } catch (itest::ItestException &e) { create_tango_exception (e, "Read failure" , "Cannot read DC current value", "Bilt::read_CurrentDC"); } attr.set_value (¤t_dc); } //+---------------------------------------------------------------------------- // // method : Bilt::write_CurrentDC // // description : Write CurrentDC attribute values to hardware. // //----------------------------------------------------------------------------- void Bilt::write_CurrentDC(Tango::WAttribute &attr) { DEBUG_STREAM << "Bilt::write_CurrentDC(Tango::WAttribute &attr) entering... "<< endl; attr.get_write_value(attr_CurrentDC_write); try { BILT->pole(pole_number).set_current_DC (attr_CurrentDC_write); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot write DC current value", "Bilt::write_CurrentDC"); } } //+---------------------------------------------------------------------------- // // method : Bilt::read_CurrentAC // // description : Extract real attribute values for CurrentAC acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_CurrentAC(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_CurrentAC(Tango::Attribute &attr) entering... "<< endl; read_mdata(); if ( mdata_errors.length() != 0 ) attr.set_quality(Tango::ATTR_INVALID); else attr.set_value (&mdata.idata[pole_number].meascurr); } //+---------------------------------------------------------------------------- // // method : Bilt::read_Voltage // // description : Extract real attribute values for Voltage acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_Voltage(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_Voltage(Tango::Attribute &attr) entering... "<< endl; read_mdata(); if ( mdata_errors.length() != 0 ) attr.set_quality(Tango::ATTR_INVALID); else attr.set_value (&mdata.idata[pole_number].measvolt); } //+---------------------------------------------------------------------------- // // method : Bilt::read_FramesPerSec // // description : Extract real attribute values for FramesPerSec acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_FramesPerSec(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_FramesPerSec(Tango::Attribute &attr) entering... "<< endl; read_fdata(); if ( fdata_errors.length() != 0 ) attr.set_quality(Tango::ATTR_INVALID); else attr.set_value ((Tango::DevULong *) &fdata[pole_number].nbrframe_sec); } //+---------------------------------------------------------------------------- // // method : Bilt::read_ErrorPerSec // // description : Extract real attribute values for ErrorPerSec acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_ErrorPerSec(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_ErrorPerSec(Tango::Attribute &attr) entering... "<< endl; read_fdata(); if ( fdata_errors.length() != 0 ) attr.set_quality(Tango::ATTR_INVALID); else attr.set_value ((Tango::DevULong *) &fdata[pole_number].nbrferr_sec); } //+---------------------------------------------------------------------------- // // method : Bilt::read_ErrorCounter // // description : Extract real attribute values for ErrorCounter acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_ErrorCounter(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_ErrorCounter(Tango::Attribute &attr) entering... "<< endl; read_fdata(); if ( fdata_errors.length() != 0 ) attr.set_quality(Tango::ATTR_INVALID); else attr.set_value ((Tango::DevULong *) &fdata[pole_number].nbrferr); } //+------------------------------------------------------------------ /** * method: Bilt::on * * description: method to execute "On" * Turns on power supply. * * */ //+------------------------------------------------------------------ void Bilt::on() { DEBUG_STREAM << "Bilt::on(): entering... !" << endl; // Add your own code to control device here try { // reset all pending errors first! reset(); BILT->set_state(1); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot switch on pole", "Bilt::on"); } } //+------------------------------------------------------------------ /** * method: Bilt::off * * description: method to execute "Off" * Turns of power supply * * */ //+------------------------------------------------------------------ void Bilt::off() { DEBUG_STREAM << "Bilt::off(): entering... !" << endl; // Add your own code to control device here try { BILT->set_state(0); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot switch off pole", "Bilt::off"); } } //+------------------------------------------------------------------ /** * method: Bilt::reset * * description: method to execute "Reset" * Reset faults and alarms * * */ //+------------------------------------------------------------------ void Bilt::reset() { DEBUG_STREAM << "Bilt::reset(): entering... !" << endl; // Add your own code to control device here try { BILT->clear_all_err(); BILT->clear_alarm(); for (int i=0; ipole(i).clear_ferrors(); } } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot reset pole", "Bilt::reset"); } } //+------------------------------------------------------------------ /** * method: Bilt::create_tango_exception() * * description: convert an itest exception into a tango exception * * * in : - &e : Reference to itest exception * - reason : Reason of the local Tango exception to be added to the stack * - desc : Description for the local Tango exception to be added to the stack * - origin : Origin if the local Tango exception to be added to the stack */ //+------------------------------------------------------------------ void Bilt::create_tango_exception (itest::ItestException &e, string reason, string desc, string origin) { Tango::DevErrorList errors; create_tango_exception (e, errors, reason, desc, origin); } //+------------------------------------------------------------------ /** * method: Bilt::create_tango_exception() * * description: convert an itest exception into a tango exception * * * in : - &e : Reference to itest exception * - errors : Tango error list to use, to store exception info * - reason : Reason of the local Tango exception to be added to the stack * - desc : Description for the local Tango exception to be added to the stack * - origin : Origin if the local Tango exception to be added to the stack */ //+------------------------------------------------------------------ void Bilt::create_tango_exception (itest::ItestException &e, Tango::DevErrorList &errors, string reason, string desc, string origin) { DEBUG_STREAM << "Bilt::create_tango_exception(): entering... !" << endl; errors.length(e.errors.size() + 1); int i; for(i=0; iget_mdata (&mdata); mdata_errors.length(0); } catch (itest::ItestException &e) { create_tango_exception (e, mdata_errors, "Read failure" , "Cannot read the mdata structure", "Bilt::read_mdata"); } } //+------------------------------------------------------------------ /** * method: Bilt::read_fdata() * * description: Read the fdata structure for the pole. * */ //+------------------------------------------------------------------ void Bilt::read_fdata() { DEBUG_STREAM << "Bilt::read_fdata(): entering... !" << endl; //static struct timeval last_update_time = {0,0}; // check whether the last reading was more than 900ms ago struct timeval now; gettimeofday (&now, NULL); double delay = (now.tv_sec * 1e6 + now.tv_usec) - (last_fdata_update.tv_sec * 1e6 + last_fdata_update.tv_usec); // only read new data every 900 ms!! if ( delay < 900000 ) { return; } else { INFO_STREAM << "fdata delay = " << delay/1000 << "ms" << endl; last_fdata_update = now; } // read the data statistics for the poles try { for (int i=0; ipole(i).get_fdata (&fdata[i]); } fdata_errors.length(0); } catch (itest::ItestException &e) { create_tango_exception (e, fdata_errors, "Read failure" , "Cannot read the fdata structure", "Bilt::read_fdata"); } } //+------------------------------------------------------------------ /** * method: Bilt::dev_status * * description: method to execute "Status" * This command gets the device status (stored in its device_status data member) and returns it to the caller. * * @return Status description * */ //+------------------------------------------------------------------ Tango::ConstDevString Bilt::dev_status() { //Tango::ConstDevString argout = DeviceImpl::dev_status(); DEBUG_STREAM << "Bilt::dev_status(): entering... !" << endl; // Add your own code to control device here stringstream status; Tango::DevState state = dev_state(); switch (state) { case Tango::ON: status << "State : ON" << endl; break; case Tango::OFF: status << "State : OFF" << endl; break; case Tango::ALARM: status << "State : Alarm" << endl; for (int i=0; i 10W in 10ms!" << endl; else { if ( mdata.idata[i].fail == "TEMP" ) status << "Fault descr. : Max. temp on semiconductor reached!" << endl; else { if ( mdata.idata[i].fail == "PWSO" ) status << "Fault descr. : Delivered power > 40W in 100ms!" << endl; else { status << "Fault descr. : Unkown fault code!" << endl; } } } } } } } break; default: status << "Pole state : Unknown" << endl; status << "Error stack : " << endl; for(int i=0; idevice_state data member) and returns it to the caller. * * @return State Code * */ //+------------------------------------------------------------------ Tango::DevState Bilt::dev_state() { Tango::DevState argout = DeviceImpl::dev_state(); DEBUG_STREAM << "Bilt::dev_state(): entering... !" << endl; // Add your own code to control device here int state; try { read_mdata(); state = mdata.state; INFO_STREAM << "magnet state for " << get_name() << " = " << state << endl; } catch (Tango::DevFailed &e) { // do nothing! // Just avoid exceptions when executing state or status! } if ( mdata_errors.length() != 0 ) set_state (Tango::UNKNOWN); else { // set the device state switch (state) { case 0: set_state (Tango::OFF); break; case 1: set_state (Tango::ON); break; case 2: set_state (Tango::ALARM); break; case 3: set_state (Tango::FAULT); break; default: set_state (Tango::UNKNOWN); break; } } // Check for attribute alarms if ( get_state() == Tango::ON && argout == Tango::ALARM ) set_state (Tango::ALARM); return get_state(); } } // namespace Revision-number: 13 Prop-content-length: 130 Content-length: 130 K 10 svn:author V 5 meyer K 8 svn:date V 27 2009-12-18T12:02:18.000000Z K 7 svn:log V 30 Changed version number to 2.1 PROPS-END Node-path: powersupply/itest/Bilt/trunk/BiltClass.cpp Node-kind: file Node-action: change Text-content-length: 26807 Text-content-md5: fa86d28353daa175d2fa96a1b8c73e5f Content-length: 26807 static const char *ClassId = "$Id: BiltClass.cpp,v 1.6 2009-12-18 12:02:18 meyer Exp $"; static const char *TagName = "$Name: not supported by cvs2svn $"; static const char *CvsPath = "$Source: /segfs/tango/cvsroot/cppserver/machine/powersupply/SrSteerers/tango/Bilt/BiltClass.cpp,v $"; static const char *SvnPath = "$HeadURL: $"; static const char *HttpServer = "http://www.esrf.fr/computing/cs/tango/tango_doc/ds_doc/"; //+============================================================================= // // file : BiltClass.cpp // // description : C++ source for the BiltClass. A singleton // class derived from DeviceClass. It implements the // command list and all properties and methods required // by the Bilt once per process. // // project : TANGO Device Server // // $Author: meyer $ // // $Revision: 1.6 $ // // $Log: not supported by cvs2svn $ // Revision 1.5 2009/11/27 13:49:26 meyer // Modified structure! The pole is no longer a device. // The device is now a magnet with three poles. // // Revision 1.4 2009/11/26 10:46:58 meyer // Updated for libMagnet_V120 // // Revision 1.3 2009/11/23 16:46:58 meyer // Corrected state, status and exception handling // // Revision 1.2 2009/11/06 12:46:25 meyer // Added impedance attribute and corrected fromatting of attribute values. // // Revision 1.1.1.1 2009/11/04 16:23:02 meyer // Imported using TkCVS // // // copyleft : European Synchrotron Radiation Facility // BP 220, Grenoble 38043 // FRANCE // //-============================================================================= // // This file is generated by POGO // (Program Obviously used to Generate tango Object) // // (c) - Software Engineering Group - ESRF //============================================================================= #include #include #include //+---------------------------------------------------------------------------- /** * Create BiltClass singleton and return it in a C function for Python usage */ //+---------------------------------------------------------------------------- extern "C" { #ifdef WIN32 __declspec(dllexport) #endif Tango::DeviceClass *_create_Bilt_class(const char *name) { return Bilt_ns::BiltClass::init(name); } } namespace Bilt_ns { //+---------------------------------------------------------------------------- // // method : OnCmd::execute() // // description : method to trigger the execution of the command. // PLEASE DO NOT MODIFY this method core without pogo // // in : - device : The device on which the command must be executed // - in_any : The command input data // // returns : The command output data (packed in the Any object) // //----------------------------------------------------------------------------- CORBA::Any *OnCmd::execute(Tango::DeviceImpl *device,const CORBA::Any &in_any) { cout2 << "OnCmd::execute(): arrived" << endl; ((static_cast(device))->on()); return new CORBA::Any(); } //+---------------------------------------------------------------------------- // // method : OffCmd::execute() // // description : method to trigger the execution of the command. // PLEASE DO NOT MODIFY this method core without pogo // // in : - device : The device on which the command must be executed // - in_any : The command input data // // returns : The command output data (packed in the Any object) // //----------------------------------------------------------------------------- CORBA::Any *OffCmd::execute(Tango::DeviceImpl *device,const CORBA::Any &in_any) { cout2 << "OffCmd::execute(): arrived" << endl; ((static_cast(device))->off()); return new CORBA::Any(); } //+---------------------------------------------------------------------------- // // method : ResetCmd::execute() // // description : method to trigger the execution of the command. // PLEASE DO NOT MODIFY this method core without pogo // // in : - device : The device on which the command must be executed // - in_any : The command input data // // returns : The command output data (packed in the Any object) // //----------------------------------------------------------------------------- CORBA::Any *ResetCmd::execute(Tango::DeviceImpl *device,const CORBA::Any &in_any) { cout2 << "ResetCmd::execute(): arrived" << endl; ((static_cast(device))->reset()); return new CORBA::Any(); } // //---------------------------------------------------------------- // Initialize pointer for singleton pattern //---------------------------------------------------------------- // BiltClass *BiltClass::_instance = NULL; //+---------------------------------------------------------------------------- // // method : BiltClass::BiltClass(string &s) // // description : constructor for the BiltClass // // in : - s : The class name // //----------------------------------------------------------------------------- BiltClass::BiltClass(string &s):DeviceClass(s) { cout2 << "Entering BiltClass constructor" << endl; set_default_property(); get_class_property(); write_class_property(); cout2 << "Leaving BiltClass constructor" << endl; } //+---------------------------------------------------------------------------- // // method : BiltClass::~BiltClass() // // description : destructor for the BiltClass // //----------------------------------------------------------------------------- BiltClass::~BiltClass() { _instance = NULL; } //+---------------------------------------------------------------------------- // // method : BiltClass::instance // // description : Create the object if not already done. Otherwise, just // return a pointer to the object // // in : - name : The class name // //----------------------------------------------------------------------------- BiltClass *BiltClass::init(const char *name) { if (_instance == NULL) { try { string s(name); _instance = new BiltClass(s); } catch (bad_alloc) { throw; } } return _instance; } BiltClass *BiltClass::instance() { if (_instance == NULL) { cerr << "Class is not initialised !!" << endl; exit(-1); } return _instance; } //+---------------------------------------------------------------------------- // // method : BiltClass::command_factory // // description : Create the command object(s) and store them in the // command list // //----------------------------------------------------------------------------- void BiltClass::command_factory() { command_list.push_back(new OnCmd("On", Tango::DEV_VOID, Tango::DEV_VOID, "", "", Tango::OPERATOR)); command_list.push_back(new OffCmd("Off", Tango::DEV_VOID, Tango::DEV_VOID, "", "", Tango::OPERATOR)); command_list.push_back(new ResetCmd("Reset", Tango::DEV_VOID, Tango::DEV_VOID, "", "", Tango::OPERATOR)); // add polling if any for (unsigned int i=0 ; ilength() ; i++) { cout4 << "Device name : " << (*devlist_ptr)[i].in() << endl; // Create devices and add it into the device list //---------------------------------------------------- device_list.push_back(new Bilt(this, (*devlist_ptr)[i])); // Export device to the outside world // Check before if database used. //--------------------------------------------- if ((Tango::Util::_UseDb == true) && (Tango::Util::_FileDb == false)) export_device(device_list.back()); else export_device(device_list.back(), (*devlist_ptr)[i]); } // End of Automatic code generation //------------------------------------------------------------- } //+---------------------------------------------------------------------------- // Method: BiltClass::attribute_factory(vector &att_list) //----------------------------------------------------------------------------- void BiltClass::attribute_factory(vector &att_list) { // Attribute : DisplayPoleNumber DisplayPoleNumberAttrib *display_pole_number = new DisplayPoleNumberAttrib(); Tango::UserDefaultAttrProp display_pole_number_prop; display_pole_number_prop.set_label("Display values for Pole"); display_pole_number_prop.set_unit(" "); display_pole_number_prop.set_format("%1d"); display_pole_number_prop.set_max_value("2"); display_pole_number_prop.set_min_value("0"); display_pole_number_prop.set_description("The pole number for wich to display the scalar attribute values."); display_pole_number->set_default_properties(display_pole_number_prop); att_list.push_back(display_pole_number); // Attribute : CurrentDC CurrentDCAttrib *current_dc = new CurrentDCAttrib(); Tango::UserDefaultAttrProp current_dc_prop; current_dc_prop.set_label("DC Current"); current_dc_prop.set_unit("A"); current_dc_prop.set_format("%6.4f"); current_dc_prop.set_max_value("1.8"); current_dc_prop.set_min_value("-1.8"); current_dc_prop.set_description("The DC current of the selected pole."); current_dc->set_default_properties(current_dc_prop); current_dc->set_memorized(); current_dc->set_memorized_init(true); att_list.push_back(current_dc); // Attribute : CurrentAC CurrentACAttrib *current_ac = new CurrentACAttrib(); Tango::UserDefaultAttrProp current_ac_prop; current_ac_prop.set_label("Current"); current_ac_prop.set_unit("A"); current_ac_prop.set_format("%6.4f"); current_ac_prop.set_description("The measured AC current of the selected pole."); current_ac->set_default_properties(current_ac_prop); att_list.push_back(current_ac); // Attribute : Voltage VoltageAttrib *voltage = new VoltageAttrib(); Tango::UserDefaultAttrProp voltage_prop; voltage_prop.set_label("Voltage"); voltage_prop.set_unit("V"); voltage_prop.set_format("%6.4f"); voltage_prop.set_description("The measured voltage of the selected pole."); voltage->set_default_properties(voltage_prop); att_list.push_back(voltage); // Attribute : Impedance ImpedanceAttrib *impedance = new ImpedanceAttrib(); Tango::UserDefaultAttrProp impedance_prop; impedance_prop.set_label("Impedance"); impedance_prop.set_unit("Ohm"); impedance_prop.set_format("%4.2f"); impedance_prop.set_max_alarm("5.0"); impedance_prop.set_description("Calculated impedance of the selected pole."); impedance->set_default_properties(impedance_prop); att_list.push_back(impedance); // Attribute : SetCurrentRMS SetCurrentRMSAttrib *set_current_rms = new SetCurrentRMSAttrib(); Tango::UserDefaultAttrProp set_current_rms_prop; set_current_rms_prop.set_label("RMS AC current setpoint/s"); set_current_rms_prop.set_unit("A"); set_current_rms_prop.set_format("%6.4f"); set_current_rms_prop.set_description("Statistic when driven by the Libera.\nRMS value of the AC setpoint applied on the DAC during the last second.\nX=sqr( (sum(setAC)*sum(setAC)) / n - ((sum(setAC)/n) *(sum(setAC)/n)) )"); set_current_rms->set_default_properties(set_current_rms_prop); att_list.push_back(set_current_rms); // Attribute : SetCurrentAverage SetCurrentAverageAttrib *set_current_average = new SetCurrentAverageAttrib(); Tango::UserDefaultAttrProp set_current_average_prop; set_current_average_prop.set_label("Average AC current setpoint/s"); set_current_average_prop.set_unit("A"); set_current_average_prop.set_format("%6.4f"); set_current_average_prop.set_description("Statistic when driven by the Libera.\nThe average AC setpoint applied to the DAC during the last second.\nX=SUM(setAC)/n"); set_current_average->set_default_properties(set_current_average_prop); att_list.push_back(set_current_average); // Attribute : FramesPerSec FramesPerSecAttrib *frames_per_sec = new FramesPerSecAttrib(); Tango::UserDefaultAttrProp frames_per_sec_prop; frames_per_sec_prop.set_label("Frames/s"); frames_per_sec_prop.set_unit(" "); frames_per_sec_prop.set_format("%3d"); frames_per_sec_prop.set_description("Statistic when driven by the Libera.\nThe number of setpoints per second."); frames_per_sec->set_default_properties(frames_per_sec_prop); att_list.push_back(frames_per_sec); // Attribute : ErrorPerSec ErrorPerSecAttrib *error_per_sec = new ErrorPerSecAttrib(); Tango::UserDefaultAttrProp error_per_sec_prop; error_per_sec_prop.set_label("Errors/s"); error_per_sec_prop.set_unit(" "); error_per_sec_prop.set_format("%3d"); error_per_sec_prop.set_description("Statistic when driven by the Libera.\nThe number of errors detected per second."); error_per_sec->set_default_properties(error_per_sec_prop); att_list.push_back(error_per_sec); // Attribute : ErrorCounter ErrorCounterAttrib *error_counter = new ErrorCounterAttrib(); Tango::UserDefaultAttrProp error_counter_prop; error_counter_prop.set_label("Error Counter"); error_counter_prop.set_unit(" "); error_counter_prop.set_format("%6d"); error_counter_prop.set_description("Statistic when driven by the Libera.\nThe total number of errors since the last reset."); error_counter->set_default_properties(error_counter_prop); att_list.push_back(error_counter); // Attribute : LocalControl LocalControlAttrib *local_control = new LocalControlAttrib(); Tango::UserDefaultAttrProp local_control_prop; local_control_prop.set_label("Local Control"); local_control_prop.set_unit(" "); local_control_prop.set_description("If true the AC current can be set on the device,\notherwise it is driven by the Libera."); local_control->set_default_properties(local_control_prop); att_list.push_back(local_control); // Attribute : SetCurrentAC SetCurrentACAttrib *set_current_ac = new SetCurrentACAttrib(); Tango::UserDefaultAttrProp set_current_ac_prop; set_current_ac_prop.set_label("AC Current Setpoint"); set_current_ac_prop.set_unit("A"); set_current_ac_prop.set_format("%6.4f"); set_current_ac_prop.set_max_value("0.2"); set_current_ac_prop.set_min_value("-0.2"); set_current_ac_prop.set_description("The AC current setpoint in local mode. If driven by the Libera, the attribute \nattribute value in INVALID."); set_current_ac->set_default_properties(set_current_ac_prop); att_list.push_back(set_current_ac); // Attribute : CurrentsDC CurrentsDCAttrib *currents_dc = new CurrentsDCAttrib(); Tango::UserDefaultAttrProp currents_dc_prop; currents_dc_prop.set_label("DC Currents"); currents_dc_prop.set_unit("A"); currents_dc_prop.set_format("%6.4f"); currents_dc_prop.set_max_value("1.8"); currents_dc_prop.set_min_value("-1.8"); currents_dc_prop.set_description("The DC currents of the three poles."); currents_dc->set_default_properties(currents_dc_prop); att_list.push_back(currents_dc); // Attribute : CurrentsAC CurrentsACAttrib *currents_ac = new CurrentsACAttrib(); Tango::UserDefaultAttrProp currents_ac_prop; currents_ac_prop.set_label("Currents"); currents_ac_prop.set_unit("A"); currents_ac_prop.set_format("%6.4f"); currents_ac_prop.set_description("The measured AC currents of the three poles."); currents_ac->set_default_properties(currents_ac_prop); att_list.push_back(currents_ac); // Attribute : Voltages VoltagesAttrib *voltages = new VoltagesAttrib(); Tango::UserDefaultAttrProp voltages_prop; voltages_prop.set_label("Voltages"); voltages_prop.set_unit("V"); voltages_prop.set_format("%6.4"); voltages_prop.set_description("The measured voltages of the three poles."); voltages->set_default_properties(voltages_prop); att_list.push_back(voltages); // Attribute : Impedances ImpedancesAttrib *impedances = new ImpedancesAttrib(); Tango::UserDefaultAttrProp impedances_prop; impedances_prop.set_label("Impedances"); impedances_prop.set_unit("Ohm"); impedances_prop.set_format("%4.2f"); impedances_prop.set_max_alarm("5.0"); impedances_prop.set_description("Calculated impedances for the three poles."); impedances->set_default_properties(impedances_prop); att_list.push_back(impedances); // Attribute : SetCurrentsRMS SetCurrentsRMSAttrib *set_currents_rms = new SetCurrentsRMSAttrib(); Tango::UserDefaultAttrProp set_currents_rms_prop; set_currents_rms_prop.set_label("RMS AC current setpoints/s"); set_currents_rms_prop.set_unit("A"); set_currents_rms_prop.set_format("%6.4"); set_currents_rms_prop.set_description("Statistic when driven by the Libera. One RMS value for every pole\nof the magnet.\nRMS value of the AC setpoint applied on the DAC during the last second.\nX=sqr( (sum(setAC)*sum(setAC)) / n - ((sum(setAC)/n) *(sum(setAC)/n)) )"); set_currents_rms->set_default_properties(set_currents_rms_prop); att_list.push_back(set_currents_rms); // Attribute : SetCurrentsAverage SetCurrentsAverageAttrib *set_currents_average = new SetCurrentsAverageAttrib(); Tango::UserDefaultAttrProp set_currents_average_prop; set_currents_average_prop.set_label("Average AC current setpoints/s"); set_currents_average_prop.set_unit("A"); set_currents_average_prop.set_format("%6.4"); set_currents_average_prop.set_description("Statistic when driven by the Libera. One average value for every pole\nof the magnet.\nRMS value of the AC setpoint applied on the DAC during the last second.\nX=sqr( (sum(setAC)*sum(setAC)) / n - ((sum(setAC)/n) *(sum(setAC)/n)) )"); set_currents_average->set_default_properties(set_currents_average_prop); att_list.push_back(set_currents_average); // Attribute : ErrorCounters ErrorCountersAttrib *error_counters = new ErrorCountersAttrib(); Tango::UserDefaultAttrProp error_counters_prop; error_counters_prop.set_label("Error counters"); error_counters_prop.set_unit(" "); error_counters_prop.set_format("%6d"); error_counters_prop.set_description("Statistic when driven by the Libera.\nThe total number of errors since the last reset for the \nthree poles."); error_counters->set_default_properties(error_counters_prop); att_list.push_back(error_counters); // End of Automatic code generation //------------------------------------------------------------- } //+---------------------------------------------------------------------------- // // method : BiltClass::get_class_property() // // description : Read the class properties from database. // //----------------------------------------------------------------------------- void BiltClass::get_class_property() { // Initialize your default values here (if not done with POGO). //------------------------------------------------------------------ // Read class properties from database.(Automatic code generation) //------------------------------------------------------------------ // Call database and extract values //-------------------------------------------- if (Tango::Util::instance()->_UseDb==true) get_db_class()->get_property(cl_prop); Tango::DbDatum def_prop; int i = -1; // End of Automatic code generation //------------------------------------------------------------------ } //+---------------------------------------------------------------------------- // // method : BiltClass::set_default_property // // description: Set default property (class and device) for wizard. // For each property, add to wizard property name and description // If default value has been set, add it to wizard property and // store it in a DbDatum. // //----------------------------------------------------------------------------- void BiltClass::set_default_property() { string prop_name; string prop_desc; string prop_def; vector vect_data; // Set Default Class Properties // Set Default Device Properties prop_name = "IPAddress"; prop_desc = "IP Address of BILT controller.\nEach controller includes several magnets and\neach magnet includes 3 power supplies,\nfor corrections in the X, Y and Z planes.\n\n"; prop_def = "0.0.0.0"; vect_data.clear(); vect_data.push_back("0.0.0.0"); if (prop_def.length()>0) { Tango::DbDatum data(prop_name); data << vect_data ; dev_def_prop.push_back(data); add_wiz_dev_prop(prop_name, prop_desc, prop_def); } else add_wiz_dev_prop(prop_name, prop_desc); prop_name = "MagnetNumber"; prop_desc = "Magnet number from 1 to 48"; prop_def = "0"; vect_data.clear(); vect_data.push_back("0"); if (prop_def.length()>0) { Tango::DbDatum data(prop_name); data << vect_data ; dev_def_prop.push_back(data); add_wiz_dev_prop(prop_name, prop_desc, prop_def); } else add_wiz_dev_prop(prop_name, prop_desc); } //+---------------------------------------------------------------------------- // // method : BiltClass::write_class_property // // description : Set class description as property in database // //----------------------------------------------------------------------------- void BiltClass::write_class_property() { // First time, check if database used //-------------------------------------------- if (Tango::Util::_UseDb == false) return; Tango::DbData data; string classname = get_name(); string header; string::size_type start, end; // Put title Tango::DbDatum title("ProjectTitle"); string str_title("BILT multi channel power supply"); title << str_title; data.push_back(title); // Put Description Tango::DbDatum description("Description"); vector str_desc; str_desc.push_back("The BILT multi channel power supply will be used with 3 channels for the ESRF fast"); str_desc.push_back("feedback systems."); str_desc.push_back("The power supply can be controlled in 2 ways :"); str_desc.push_back("By this device server for slow or human control or"); str_desc.push_back("by the Libera Beam Position monitors for fast feedback with closed loop control."); str_desc.push_back("The devices are exported as one device per steerer magnet. Every device has three"); str_desc.push_back("channels. The channels (poles) cannot be switched on individually but have their"); str_desc.push_back("individual set points and measurement values."); description << str_desc; data.push_back(description); // put cvs or svn location string filename(classname); filename += "Class.cpp"; // Create a string with the class ID to // get the string into the binary string class_id(ClassId); // check for cvs information string src_path(CvsPath); start = src_path.find("/"); if (start!=string::npos) { end = src_path.find(filename); if (end>start) { string strloc = src_path.substr(start, end-start); // Check if specific repository start = strloc.find("/cvsroot/"); if (start!=string::npos && start>0) { string repository = strloc.substr(0, start); if (repository.find("/segfs/")!=string::npos) strloc = "ESRF:" + strloc.substr(start, strloc.length()-start); } Tango::DbDatum cvs_loc("cvs_location"); cvs_loc << strloc; data.push_back(cvs_loc); } } // check for svn information else { string src_path(SvnPath); start = src_path.find("://"); if (start!=string::npos) { end = src_path.find(filename); if (end>start) { header = "$HeadURL: "; start = header.length(); string strloc = src_path.substr(start, (end-start)); Tango::DbDatum svn_loc("svn_location"); svn_loc << strloc; data.push_back(svn_loc); } } } // Get CVS or SVN revision tag // CVS tag string tagname(TagName); header = "$Name: "; start = header.length(); string endstr(" $"); end = tagname.find(endstr); if (end!=string::npos && end>start) { string strtag = tagname.substr(start, end-start); Tango::DbDatum cvs_tag("cvs_tag"); cvs_tag << strtag; data.push_back(cvs_tag); } // SVN tag string svnpath(SvnPath); header = "$HeadURL: "; start = header.length(); end = svnpath.find(endstr); if (end!=string::npos && end>start) { string strloc = svnpath.substr(start, end-start); string tagstr ("/tags/"); start = strloc.find(tagstr); if ( start!=string::npos ) { start = start + tagstr.length(); end = strloc.find(filename); string strtag = strloc.substr(start, end-start-1); Tango::DbDatum svn_tag("svn_tag"); svn_tag << strtag; data.push_back(svn_tag); } } // Get URL location string httpServ(HttpServer); if (httpServ.length()>0) { Tango::DbDatum db_doc_url("doc_url"); db_doc_url << httpServ; data.push_back(db_doc_url); } // Put inheritance Tango::DbDatum inher_datum("InheritedFrom"); vector inheritance; inheritance.push_back("Device_4Impl"); inher_datum << inheritance; data.push_back(inher_datum); // Call database and and values //-------------------------------------------- get_db_class()->put_property(data); } } // namespace Node-path: powersupply/itest/Bilt/trunk/Makefile Node-kind: file Node-action: change Text-content-length: 5345 Text-content-md5: 5c8fb82ce46676c0b5fa606ff23a696b Content-length: 5345 #============================================================================= # # file : Makefile # # description : Include for the Bilt class. # # project : Makefile to generate a Tango server # # $Author: meyer $ # # $Revision: 1.5 $ # # $Log: not supported by cvs2svn $ # Revision 1.4 2009/12/18 10:19:23 meyer # Using libMagnet version 130 now. # # Revision 1.3 2009/11/27 13:49:26 meyer # Modified structure! The pole is no longer a device. # The device is now a magnet with three poles. # # Revision 1.2 2009/11/26 10:46:58 meyer # Updated for libMagnet_V120 # # Revision 1.1.1.1 2009/11/04 16:23:02 meyer # Imported using TkCVS # # # copyleft : European Synchrotron Radiation Facility # BP 220, Grenoble 38043 # FRANCE # #============================================================================= # This file is generated by POGO # (Program Obviously used to Generate tango Object) # # (c) - Software Engineering Group - ESRF #============================================================================= # CLASS = Bilt MAJOR_VERS = 2 MINOR_VERS = 1 RELEASE = Release_$(MAJOR_VERS)_$(MINOR_VERS) OS = $(shell /csadmin/common/scripts/get_os) PROCESSOR = $(shell uname -p) #----------------------------------------- # Set default home directories #----------------------------------------- TANGO_HOME = /segfs/tango/release CPP_SERVERS = $(TANGO_HOME)/cppserver ifdef no_debug DEBUG = -O else DEBUG = -g endif ifdef _solaris CC = CC BIN_DIR=$(OS)_CC AR_SL = $(CC) -mt -G VERS_OPT = -h SL_EXT = so endif ifdef linux CC = c++ CC_SHLIB = $(CC) -fPIC $(PROCESSOR)=1 ifdef x86_64 NBITS=_64 endif BIN_DIR=$(OS)$(NBITS) AR_SL = $(CC) -fPIC -shared SL_EXT = so VERS_OPT = -Wl,-soname, endif INCLUDE_DIRS = -I$(TANGO_HOME)/$(BIN_DIR)/include -I. \ -I$(CPP_SERVERS)/include \ -I libMagnet_V130 OBJS_DIR = obj/$(BIN_DIR) LIB_DIRS = -L $(TANGO_HOME)/$(BIN_DIR)/lib \ -L libMagnet_V130 TARGET_LIB = $(CPP_SERVERS)/lib/$(BIN_DIR)/libtgclasses.a #----------------------------------------- # Set CXXFLAGS and LFLAGS #----------------------------------------- ifdef _solaris CXXFLAGS = $(DEBUG) -mt -D_PTHREADS $(INCLUDE_DIRS) LFLAGS = $(DEBUG) $(LIB_DIRS) \ -ltango \ -llog4tango \ -lomniORB4 \ -lomniDynamic4 \ -lomnithread \ -lCOS4 \ -lpthread \ -lposix4 -lsocket -lnsl endif ifdef linux CXXFLAGS = $(DEBUG) -D_REENTRANT $(INCLUDE_DIRS) LFLAGS = $(DEBUG) $(LIB_DIRS) \ -ltango \ -llog4tango \ -lomniORB4 \ -lomniDynamic4 \ -lomnithread \ -lCOS4 \ -ldl -lpthread \ -lMagnet endif #----------------------------------------- # Set dependences #----------------------------------------- SVC_OBJS = $(OBJS_DIR)/$(CLASS).o \ $(OBJS_DIR)/$(CLASS)StateMachine.o \ $(OBJS_DIR)/$(CLASS)Class.o \ $(OBJS_DIR)/ClassFactory.o \ $(OBJS_DIR)/main.o SHLIB_OBJS = $(OBJS_DIR)/$(CLASS)Class.so.o \ $(OBJS_DIR)/$(CLASS)StateMachine.so.o \ $(OBJS_DIR)/$(CLASS).so.o SVC_INC = $(CLASS)Class.h \ $(CLASS).h $(OBJS_DIR)/%.o: %.cpp $(SVC_INC) $(CC) $(CXXFLAGS) -c $< -o $(OBJS_DIR)/$*.o $(OBJS_DIR)/%.so.o: %.cpp $(SVC_INC) $(CC_SHLIB) $(CXXFLAGS) -c $< -o $(OBJS_DIR)/$*.so.o #----------------------------------------- # Make Entry #----------------------------------------- all: $(CLASS) $(CLASS): make_obj_dir make_bin_dir $(SVC_OBJS) $(CC) $(SVC_OBJS) -o $(CLASS) $(LFLAGS) @mv $(CLASS) bin/$(BIN_DIR)/$(CLASS) shlib: make_obj_dir make_shlib_dir $(SHLIB_OBJS) $(AR_SL) -o \ shlib/$(BIN_DIR)/$(CLASS).$(SL_EXT).$(MAJOR_VERS).$(MINOR_VERS) \ $(VERS_OPT)$(CLASS).$(SL_EXT).$(MAJOR_VERS) \ $(SHLIB_OBJS) $(LFLAGS) @rm -f shlib/$(BIN_DIR)/$(CLASS).$(SL_EXT) @cd shlib/$(BIN_DIR); \ ln -s $(CLASS).$(SL_EXT).$(MAJOR_VERS).$(MINOR_VERS) $(CLASS).$(SL_EXT) clean: rm -f $(OBJS_DIR)/*.o \ $(OBJS_DIR)/*.so.o \ bin/$(BIN_DIR)/$(CLASS) \ core make_obj_dir: @mkdir -p obj @mkdir -p obj/$(BIN_DIR) make_bin_dir: @mkdir -p bin @mkdir -p bin/$(BIN_DIR) make_shlib_dir: @mkdir -p shlib @mkdir -p shlib/$(BIN_DIR) #----------------------------------------- # Install binary file #----------------------------------------- install: cp bin/$(BIN_DIR)/$(CLASS) $(TANGO_HOME)/$(BIN_DIR)/bin #----------------------------------------- # Update class library and header files # recompile without debug mode. #----------------------------------------- lib: clean @make no_debug=1 cp *.h $(CPP_SERVERS)/include ar ruv $(TARGET_LIB) $(CLASS).o ar ruv $(TARGET_LIB) $(CLASS)Class.o ar ruv $(TARGET_LIB) $(CLASS)StateMachine.o ident $(TARGET_LIB) | grep $(CLASS) #------------------------------------------------------ # Tag the CVS/SVN module corresponding to this class # copy cvs_tag or svn_tag to tag: entry #------------------------------------------------------ #svn_tag: # svn copy ../trunk ../tags/$(RELEASE) # svn commit ../tags/$(RELEASE) \ # -m "Tagging the $(RELEASE) of the $(CLASS) project." # #cvs_tag: # @cvstag "$(CLASS)-$(RELEASE)" # @make $(CLASS) # @make show_tag #show_cvs_tag: # @cvstag -d # # Only these make options work with the current Pogo version 5.3.x! tag: @cvstag "$(CLASS)-$(RELEASE)" @make $(CLASS) @make show_tag show_tag: @cvstag -d Revision-number: 14 Prop-content-length: 147 Content-length: 147 K 8 svn:date V 27 2009-12-18T12:02:19.000000Z K 7 svn:log V 73 This commit was manufactured by cvs2svn to create tag 'Bilt-Release_2_1'. PROPS-END Node-path: powersupply/itest/Bilt/tags/Bilt-Release_2_1 Node-kind: dir Node-action: add Node-copyfrom-rev: 13 Node-copyfrom-path: powersupply/itest/Bilt/trunk Revision-number: 15 Prop-content-length: 128 Content-length: 128 K 10 svn:author V 5 meyer K 8 svn:date V 27 2010-01-05T11:38:48.000000Z K 7 svn:log V 28 Added libMagnet version 1.3 PROPS-END Node-path: powersupply/itest/Bilt/trunk/libMagnet_V130 Node-kind: dir Node-action: add Node-path: powersupply/itest/Bilt/trunk/libMagnet_V130/ClassMagnet.cpp Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 35131 Text-content-md5: 25c4eac0ea82678c44e3b0d187b70c09 Content-length: 35141 PROPS-END // ============================================================================ // // = CONTEXT // ITest Power Supplies - C++ Interface // // = FILENAME // ClassMagnet.cpp // // = AUTHOR // Sebastien Laurent - ITEST // // = VERSION // 1.30 // // ============================================================================ // V130 // idata modified : return average value of voltage and current // get_measre_current_aver and get_measure_voltage_aver added // V120 // fdata modified : RMS value // V110 // first library for BE549 // ============================================================================ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "ClassMagnet.h" #include "Exception.h" namespace itest{ //--------------------------------------------------------------------------- //#define __ITEST_DEBUG //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //---------------------------CLASSE SOCKET---------------------------------- //--------------------------------------------------------------------------- //SOCKET //Création de la socket, connexion au BILT Socket::Socket(const char *StrIP):init_device_done(false) { struct sockaddr_in adresse; int resultat,flag; struct timeval Tv; fd_set myset; #ifdef __ITEST_DEBUG std::cout<<"CREATE SOCKET"<init_device_done=true; //modif V202 07/06/07 //Set blocking // fcntl(Sockfd, F_SETFL, flag); #ifdef __ITEST_DEBUG std::cout<<"END CREATED: "<init_device_done) //modif V202 07/06/07 { std::ostringstream Desc; Desc<"<init_device_done) //modif V202 07/06/07 { std::ostringstream Desc; Desc<"<"<NumLastErr=atoi(Ptr))!=0) { std::ostringstream Desc; this->StrLastErr=strchr(Ptr,','); strcpy(&BuffLastErr[0],++this->StrLastErr); this->StrLastErr=&BuffLastErr[0]; Desc<"<StrLastErr<NumLastErr); throw e; } } //---------------------------------- char *TBilt::query(const std::string& _Str) throw (itest::ItestException) { std::ostringstream oss; oss<<_Str<NumMagnet<NumMagnet<NumMagnet<NBRPOLE) { std::ostringstream Desc; Desc<NumMagnet<Pole[Num]; } //--------------------------------------------------------------------------- //GROUPE //Allume ou éteind le groupe //Allume ou éteind l'aimant //0=OFF;1=ON //---------------------------------- void TMagnet::set_state(bool val) throw (itest::ItestException) { try{ std::ostringstream oss; oss<<":p"<Group<write(oss.str()); } catch(ItestException &e) { std::ostringstream Desc; Desc<NumMagnet<NumMagnet<Group<query(oss.str()))-1); //-1 pour avoir meme numero pour groupe et instrument } catch(ItestException &e) { std::ostringstream Desc; Desc<NumMagnet<NumMagnet<magnet=_magnet; mymdata->state=atoi(TabRes[2].c_str())-1; //-1 pour avoir state inst = state group parse_fill_idata(Tabsplit[1].c_str(), &(mymdata->idata[X]),_magnet); parse_fill_idata(Tabsplit[2].c_str(), &(mymdata->idata[Y]),_magnet); parse_fill_idata(Tabsplit[3].c_str(), &(mymdata->idata[Z]),_magnet); } //---------------------------------- void TMagnet::get_mdata(struct mdata * mymdata) throw (itest::ItestException) { try{ std::ostringstream oss; char *Ptr; oss<<":p"<Group<query(oss.str()); #ifdef __ITEST_DEBUG std::cout<<"GET_MDATA: "<NumMagnet); } catch(ItestException &e) { std::ostringstream Desc; Desc<NumMagnet<NumMagnet<Group<Group<write(oss.str()); } catch(ItestException &e) { std::ostringstream Desc; Desc<NumMagnet<NumMagnet<Pole[i]->set_switch(val); } catch(ItestException &e) { std::ostringstream Desc; Desc<query(oss.str())); #ifdef __ITEST_DEBUG std::cout<<"BOUCLE ERR"<NumMagnet<NumMagnet<query(oss.str()); return Ptr; } catch(ItestException &e) { std::ostringstream Desc; Desc<NumMagnet<NumMagnet<Inst<query(oss.str()))); } catch(ItestException &e) { std::ostringstream Desc; Desc<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<Inst<query(oss.str()); return atof(Ptr); } catch(ItestException &e) { std::ostringstream Desc; Desc<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<Inst<query(oss.str()); return atof(Ptr); } catch(ItestException &e) { std::ostringstream Desc; Desc<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<Inst<query(oss.str()); return atof(Ptr); } catch(ItestException &e) { std::ostringstream Desc; Desc<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<Inst<query(oss.str()); return atof(Ptr); } catch(ItestException &e) { std::ostringstream Desc; Desc<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<magnet=_magnet; int var=atoi(TabRes[0].c_str()+1); myidata->pole=(var>5?(var-7):(var-1))/2; myidata->state=atoi(TabRes[1].c_str()); myidata->fail=TabRes[2]; myidata->measvolt=atof(TabRes[3].c_str()); myidata->meascurr=atof(TabRes[4].c_str()); } //--------------------------------------------------------------------------- //INSTRUMENT BE549 //Lecture de idata : NoModule,State,Fail,MeasU,MeasI //State : 0=OFF,1=ON,2=WARNING,3=ALARM //Lecture de l'état et des paramètres de l'alimentation du pole void TPole::get_idata(struct idata *myidata) throw (itest::ItestException) { try{ std::ostringstream oss; char *Ptr; oss<<":i"<Inst<query(oss.str()); #ifdef __ITEST_DEBUG std::cout<<"GET_IADATA: "<NumMagnet); } catch(ItestException &e) { std::ostringstream Desc; Desc<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<Inst<query(oss.str()); return atoi(Ptr); } catch(ItestException &e) { std::ostringstream Desc; Desc<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<Inst<query(oss.str()); return atof(Ptr); } catch(ItestException &e) { std::ostringstream Desc; Desc<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<Inst<query(oss.str()); return atoi(Ptr); } catch(ItestException &e) { std::ostringstream Desc; Desc<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<Inst<query(oss.str()); return Ptr; } catch(ItestException &e) { std::ostringstream Desc; Desc<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<Inst<write(oss.str()); } catch(ItestException &e) { std::ostringstream Desc; Desc<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<Inst<write(oss.str()); } catch(ItestException &e) { std::ostringstream Desc; Desc<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<Inst<write(oss.str()); } catch(ItestException &e) { std::ostringstream Desc; Desc<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<Inst<query(oss.str()); #ifdef __ITEST_DEBUG std::cout<<"GET_FDATA: "<nbrframe_sec=atoi(data.substr(start,end-start).c_str()); break; case ERRSEC: mydata->nbrferr_sec=atoi(data.substr(start,end-start).c_str()); break; case RMS: mydata->rms_ac_sett_sec=atof(data.substr(start,end-start).c_str()); break; case AVERAGES: mydata->average_sett_sec=atof(data.substr(start,end-start).c_str()); break; default : break; } start=i+1; i++;} mydata->nbrferr=atoi(data.substr(start,end-start).c_str()); } catch(ItestException &e) { std::ostringstream Desc; Desc<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<Inst<write(oss.str()); } catch(ItestException &e) { std::ostringstream Desc; Desc<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"< #include "Exception.h" namespace itest{ #define MAGNET1 #define MAGNET2 #define NBRPOLE 3 #define INST_MAGN1_POLE_X 1 //Instrument du pole X de l'aimant 1 #define INST_MAGN2_POLE_X 7 //Instrument du pole X de l'aimant 2 #define P1 1 //groupe de BILT de l'aimant 1 #define P2 2 //groupe de BILT de l'aimant 2 #define BUFFSIZE 130 //taille buffer de caractère de réception #define SOCK_PORT 5025 //Port de communication socket #define MAXTIME_CONNECT_READ 10 //temps max d'attente pour une connexion et une lecture sur BILT modif V201 #define X 0 #define Y 1 #define Z 2 #define CONF 0 #define RS485 1 #define MAGNET_OFF 0 #define MAGNET_ON 1 #define Q_SYSTERR ":syst:err?" #define Q_MCURRAVER ";:meas:curr:aver?" //modif V130 #define Q_MVOLTAVER ";:meas:volt:aver?" //modif V130 #define Q_MCURR ";:meas:curr?" #define Q_MVOLT ";:meas:volt?" #define Q_IDATA ";:idata?" #define Q_MDATA ";:mdata?" #define Q_SWITCH ";:switch?" #define Q_CURR_DC ";:curr:dc?" #define Q_FAIL ";:lim:fail?" #define Q_FAILSTR ";:lim:fail:str?" #define Q_STAT ":stat?" #define SWITCH ";:switch " #define CURR_DC ";:curr:dc " #define CURR_AC ";:curr:ac " #define STAT ":stat " #define STATCLEAR ":stat:clear" #define SYSTVERS ":syst:vers?" //comptage #define Q_FDATA ";:fdata?" #define FRST ";:frst" //--------------------------------------------------------------------------- #define ITEST_EXCEPT_TRY_STR "ItestException exception caught while trying " #define ITEST_EXCEPT_MAGN_STR "ItestException exception caught on magnet" #define UNKNOW_EXCEPT_MAGN_STR "Unknown exception caugth on magnet" #define SOCK_ERROR_STR "Socket error" #define CONNECT_FAILED_STR "Connection failed" //--------------------------------------------------------------------------- class Socket{ private: int Sockfd; char R_Buff[BUFFSIZE]; bool init_device_done; //modif V202 07/06/07 pas d'exception dans constructeur mais dans fonctions membres protected: public: Socket(const char *StrIP); ~Socket(void); char *query(const std::string& Str); void write(const std::string& Str); }; //---------------------------------- class TBilt : private Socket //public Socket modif V202 05/06/07 { private: char BuffLastErr[50]; int NumLastErr; const char *StrLastErr; //modif V202 07/06/07 passage en private protected: public: TBilt(const char *StrIP); ~TBilt(void); void write(const std::string& _Str) throw (itest::ItestException); char *query(const std::string& _Str) throw (itest::ItestException); //ajout de const modif V202 05/06/07 }; //---------------------------------- class TPole{ private: // int Group; int Inst; int *PtrSock; char *Ptr_R_Buff; int NumMagnet; int Pole; TBilt *Bilt; public: TPole(TBilt *_Bilt, int _NumMagnet, int _Pole); double get_measure_current_aver(void) throw (itest::ItestException); //modif V130 double get_measure_voltage_aver(void) throw (itest::ItestException); //modif V130 double get_measure_current(void) throw (itest::ItestException); double get_measure_voltage(void) throw (itest::ItestException); void get_idata(struct idata *) throw (itest::ItestException); int get_switch(void) throw (itest::ItestException); double get_current_DC(void) throw (itest::ItestException); int get_state(void) throw (itest::ItestException); int get_num_alarm(void) throw (itest::ItestException); const char * get_str_alarm(void) throw (itest::ItestException); void set_current_DC(double ValF) throw (itest::ItestException); void set_current_AC(double ValF) throw (itest::ItestException); void set_switch(bool val) throw (itest::ItestException); // void clear_alarm(void) throw (itest::ItestException); //taux de comptage void get_fdata(struct fdata *) throw (itest::ItestException); void clear_ferrors(void) throw (itest::ItestException); }; //---------------------------------- class TMagnet { protected: private: int Group; char StrAddrIp[20]; TBilt *Bilt; TPole *Pole[NBRPOLE]; int NumMagnet; //passe en private modif V202 05/06/07 const char *AddrIP; //passe en private modif V202 05/06/07 public: TMagnet(const char *_AddrIp,int NumMagnet) throw (itest::ItestException); ~TMagnet(void); TMagnet(const TMagnet & Magn) throw (itest::ItestException); TMagnet & operator=(const TMagnet & Magn) throw (itest::ItestException); //modif V201 07/03/07 int num_magnet(void){return NumMagnet;} //modif V202 05/06/07 const char *addrIP_magnet(void){return AddrIP;} //modif V202 05/06/07 TPole & pole(int Num); void clear_all_err(void) throw (itest::ItestException); void clear_alarm(void) throw (itest::ItestException); void set_switch(bool val) throw (itest::ItestException); void set_state(bool val) throw (itest::ItestException); void get_mdata(struct mdata *) throw (itest::ItestException); int get_state(void) throw (itest::ItestException); const char * get_bilt_vers(void) throw (itest::ItestException); }; //--------------------------------------------------------------------------- //Structure de données de idata struct idata{ int magnet; int pole; int state; std::string fail; double measvolt; double meascurr; }; //--------------------------------------------------------------------------- //Structure de données de Mdata struct mdata{ int magnet; int state; struct idata idata[NBRPOLE]; }; //--------------------------------------------------------------------------- //Structure de données de Fdata struct fdata{ unsigned int nbrframe_sec; unsigned int nbrferr_sec; double rms_ac_sett_sec; double average_sett_sec; unsigned int nbrferr; }; //--------------------------------------------------------------------------- } //end namespace //--------------------------------------------------------------------------- #endif //_ITEST_CLASSMAGNET_H_ Node-path: powersupply/itest/Bilt/trunk/libMagnet_V130/Exception.cpp Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 7037 Text-content-md5: 9d76e60e6386c4edf40ea80aef2679ab Content-length: 7047 PROPS-END // ============================================================================ // // = CONTEXT // ITest Power Supplies - C++ Interface - Error & ItestException Classes // // = FILENAME // ItestException.cpp // // = AUTHOR // Nicolas Leclercq - SOLEIL // // ============================================================================ // ============================================================================ // DEPENDENCIES // ============================================================================ #include "Exception.h" namespace itest { // ============================================================================ // Error::Error // ============================================================================ Error::Error (void) : reason ("unknown error"), desc ("unknown error"), origin ("unknown"), severity (itest::ERR), code (-1) { //- noop ctor } // ============================================================================ // Error::Error // ============================================================================ Error::Error (const char *_reason, const char *_desc, const char *_origin, int _severity, int _code) : reason (_reason), desc (_desc), origin (_origin), severity (_severity), code (_code) { //- noop ctor } // ============================================================================ // Error::Error // ============================================================================ Error::Error (const std::string& _reason, const std::string& _desc, const std::string& _origin, int _severity, int _code) : reason (_reason), desc (_desc), origin (_origin), severity (_severity), code (_code) { //- noop ctor } // ============================================================================ // Error::Error // ============================================================================ Error::Error (const Error& _src) : reason (_src.reason), desc (_src.desc), origin (_src.origin), severity (_src.severity), code (_src.code) { //- noop ctor } // ============================================================================ // Error::~Error // ============================================================================ Error::~Error (void) { //- noop dtor } // ============================================================================ // Error::operator= // ============================================================================ Error& Error::operator= (const Error& _src) { //- no self assignment if (this == &_src) return *this; this->reason = _src.reason; this->desc = _src.desc; this->origin = _src.origin; this->severity = _src.severity; this->code = _src.code; return *this; } // ============================================================================ // ItestException::ItestException // ============================================================================ ItestException::ItestException (void) : errors(0) { this->push_error(Error()); } // ============================================================================ // ItestException::ItestException // ============================================================================ ItestException::ItestException (const char *_reason, const char *_desc, const char *_origin, int _severity, int _code) : errors(0) { this->push_error(_reason, _desc, _origin, _severity, _code); } // ============================================================================ // ItestException::ItestException // ============================================================================ ItestException::ItestException (const std::string& _reason, const std::string& _desc, const std::string& _origin, int _severity, int _code) : errors(0) { this->push_error(_reason, _desc, _origin, _severity, _code); } // ============================================================================ // ItestException::ItestException // ============================================================================ ItestException::ItestException (const ItestException& _src) : errors(0) { this->errors = _src.errors; } // ============================================================================ // ItestException::ItestException // ============================================================================ ItestException::ItestException (const ErrorList& _errors) { this->errors = _errors; } // ============================================================================ // ItestException::ItestException // ============================================================================ ItestException& ItestException::operator= (const ItestException& _src) { //- no self assignment if (this == &_src) { return *this; } this->errors.clear(); for (size_t i = 0; i < _src.errors.size(); i++) this->push_error(_src.errors[i]); return *this; } // ============================================================================ // ItestException::~ItestException // ============================================================================ ItestException::~ItestException (void) { this->errors.clear(); } // ============================================================================ // ItestException::push_error // ============================================================================ void ItestException::push_error (const char *_reason, const char *_desc, const char *_origin, int _severity, int _err_code) { this->errors.push_back(Error(_reason, _desc, _origin, _severity, _err_code)); } // ============================================================================ // ItestException::push_error // ============================================================================ void ItestException::push_error (const std::string& _reason, const std::string& _desc, const std::string& _origin, int _err_code, int _severity) { this->errors.push_back(Error(_reason, _desc, _origin, _severity, _err_code)); } // ============================================================================ // ItestException::push_error // ============================================================================ void ItestException::push_error (const Error& _error) { this->errors.push_back(_error); } } // namespace itest Node-path: powersupply/itest/Bilt/trunk/libMagnet_V130/Exception.h Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 4255 Text-content-md5: 216d054c131bc191accef25995d29271 Content-length: 4265 PROPS-END // ============================================================================ // // = CONTEXT // ITest Power Supplies - C++ Interface - Error & Exception Classes // // = FILENAME // Exception.h // // = AUTHOR // Nicolas Leclercq - SOLEIL // // ============================================================================ #ifndef _ITEST_EXCEPTION_H_ #define _ITEST_EXCEPTION_H_ // ============================================================================ // DEPENDENCIES // ============================================================================ #include #include namespace itest { // ============================================================================ // Error severity // ============================================================================ typedef enum { WARN, ERR, PANIC } ErrorSeverity; // ============================================================================ // Error abstraction class // ============================================================================ class Error { public: /** * Initialization. */ Error (void); /** * Initialization. */ Error (const char *reason, const char *desc, const char *origin, int severity = itest::ERR, int err_code = -1); /** * Initialization. */ Error (const std::string& reason, const std::string& desc, const std::string& origin, int severity = itest::ERR, int err_code = -1); /** * Copy constructor. */ Error (const Error& src); /** * Error details: code */ virtual ~Error (void); /** * operator= */ Error& operator= (const Error& _src); /** * Error details: reason */ std::string reason; /** * Error details: description */ std::string desc; /** * Error details: origin */ std::string origin; /** * Error details: severity */ int severity; /** * Error details: code */ int code; }; // ============================================================================ // Error list // ============================================================================ typedef std::vector ErrorList; // ============================================================================ // Exception class // ============================================================================ class ItestException { public: /** * Default constructor */ ItestException (void); /** * Constructor */ ItestException (const char *reason, const char *desc, const char *origin, int severity = itest::ERR, int err_code = -1); /** * Constructor */ ItestException (const std::string& reason, const std::string& desc, const std::string& origin, int severity = itest::ERR, int err_code = -1); /** * Constructor */ ItestException (const Error& error); /** * Constructor */ ItestException (const ErrorList& errors); /** * Copy constructor */ ItestException (const ItestException& src); /** * operator= */ ItestException& operator= (const ItestException& _src); /** * Destructor */ virtual ~ItestException (void); /** * Push the specified error into the errors list. */ void push_error (const char *reason, const char *desc, const char *origin, int severity = itest::ERR, int err_code = -1); /** * Push the specified error into the errors list. */ void push_error (const std::string& reason, const std::string& desc, const std::string& origin, int severity = itest::ERR, int err_code = -1); /** * Push the specified error into the errors list. */ void push_error (const Error& error); /** * The errors list */ ErrorList errors; }; } // namespace itest #endif // _ITEST_EXCEPTION_H_ Node-path: powersupply/itest/Bilt/trunk/libMagnet_V130/Manuel_esrf_bibliothequeC++_itest_ed4.pdf Node-kind: file Node-action: add Prop-content-length: 36 Text-content-length: 321921 Text-content-md5: 8dbd3aa234273658b9af52bc75a41ece Content-length: 321957 K 14 svn:executable V 1 * PROPS-END %PDF-1.3 %Çì¢ 5 0 obj <> stream xœí]˒ݶÝ߯àÎr\C ’ËÈQ\Nœ*Kšr²PUJÑÖ4ÆŽÿ6•M¤}> |_àöÙäÜ]iÚ*»tf£»4@ð,Q©6‰jþ yòzs¶¹}¿JžŸoΫLÕÂÖižXSÖÿuº¨RW4Eoß×*ùÓéæÞF¥¶*“à¿É_!úK-·L³æŸV´ÿ÷'¯“;ÇT›h•*“?«eTUåT§žNŒÕ©qIQê4/“ã×›[ûúøçM-ÅfYSèøéæÖ£ÊÓܘyÓ ®n¥±¶‡.:H¹Zdtõœ­‹õЫ2iáôP(!ÈÓ^xi¬ %yÐj½èÒhWœV{L›ò’Sã-ÅëSÃß6T†ñoŸg´èò¼Hù•ªE;pøy)cÊl§ÑÓc> : •¦õRZ*£¥”Ç^nt¡T’kU¥Í¼ïL³Ú-š‰¿žêßlž1ƒQѤUîʶ  ×ý\®ÇO·¡Œ×EZØL aöv0œ®²eSkuQøÑ‚’~âà1J é/CI ÈÇN¸3ºÜÉŒX§ªå°Wï”*õœ†jð„:¡…¨9é¨Â¶ä#¿Ó;Ô—‡Õ²Rƒ rÚK\yos¶±…NlQ¨&ãúºÓ¬IÁÀ«-àÊèÊ¿^lþž¼Ù˜ä·:ÈÿRÿûsì#!¶…ñĵò] ÿA«D Û°\U³à@ž]Ï<èªùÛ¥–𳤿lIr= Û0˜vA×mLºpX̓5W3x—ÝÆäq·,ʬ ÷¨[ø–e–ça©W[‹ä¾MÝäQÂRO©¬úÄs Y]òΦf›@Ú¿ïì™ÕÜɯú²>Њï:k윪Ýdf¼Ôxhq—7;ÂŽ‹ÁJº{N“ÈûC©ïºG»Ú¼ƒÎ·-Vao¨¬¾”©Ã<Gl#Ú©Ê<µÊ„iöî @0´„Ð{ }¤²ÎÇÅï iJ›(@ $@ t…Óãá¥Cƒ>#U¯jÍGÖéz%QÕ+ä,-[œGœËyôú ÒkÀ’Ûåaȸ_Pñ,¹^¹ïœ0ôy9*^t¥*»s.¶;µYÄŃf·K¨ª^ãdEpNgV °öç:=®x{KÔ…l\­WT:€@ŃQH › ÚL*Ð …nx`îAZJäÐl@ÕNiƒž³Ú´¥Nh© I+ …H H Ë@‡ Ã§[«ígf´õCi6 aªnxÚ›’EÀÀþE+Ômš‚'íwÝ¿ŒÝ¼T1p¹þ¥KçL1”ºMUø¾BN*†# ¥®†À¿ ºÊdݡڽˆ§{+gÆc\Õ«H :H’=I+\ªu>MÒxi¾Ëѯ™}ÏG´TO; «Ç«‹èaJ@È€@SÀÑx[€¶ Øl7{ou˜¿K<»r{4»»?BÕmI'Pd^À8 'úðë^1¥'(º@ $@Ÿ˜ÖɸaÐ wG›¦ãåý¥aÍ;¡2^ ÙÞöü‡—¥é-@¯âDÓWbÑôߊMk÷ †'H èÊ¡+”~hÔó:ØèÊ4(`™`ÇH{ÂýMþ–sì}ø»OóR©«=^%wÛ$@Ý\èÐx†@Â*÷Ë*W2—²‹¿«°üôúA0T^Ö³¯Éu\üeo_\nƒ\H h?Ðõв/“òîÁ¹ß@az¼–>aHÒõ¼âwÅ©ÊåwòY ¾ï7k¯}nñ_îõ]x«áÌg±mDH ˆB73A§6Ãv¼ŒwÙËw &èxDàó&N€ÿ<ë*Îðʼn“Šž%x×H_Ó½'BœH /:„)^ ½@_¬kík¡}Ò>ÞûÇ’Ž“tÜnE`{ïíóÔ&ˆB`hÞ«M¼Óà›"œ?=thù@ ³¹6fÃ{3ö&$´ÝùH…ÿDÞ$yé;_ä^DH bB‡ ÃU¬Ëâl‘sCJÁâ[?5Ð,Y)°wÇ»Ôm‚ýLÓ9r `[@øêLÌÄÇP½ƹu¡²| ÃkÃ&3ùäå*\H :¼<’@’”ÜhfûÖ*f–,.ŹÈyõ·í¡*ñààï¦<ùh‰@ $@ ´/èÐxàbè‹kÐ#¾}_‰6Éñ3[Ú¶HÏqý„Þ#*(þž‚s¦ÈâÛ,HG†7‚ì>½¡ª%€ª‹ÞXQõß,«ö' œ2…ã}•”æg;ÄÏp>ÙìÒ˜b÷ȃ!šÎ¼+TÑ.«´ªiõ¢6ã¬>ŠÁ2=‚ œ }·ÉÏÔR­x‡N¢¿Æ}±{®’û5`?˜{Vß”Níì7qc¼ç|Þ ±`»% ˆÑVû§u@ŒðÌÅ Áø[¼qæûR<ŸMWŒO-ÀA`léwºÀ‡Ëy£±s=aÖe–yÙ¤E'–+gUð}†fü*9ã—×gbÊͶ |Z Xhµãxƒ(hãħµèg¾ Aƒ€½x“á a„óÝ,(t<Ãèï°ò\Ë›Oè¼,lsA›xÙé±Ô®ˆ‹Ÿ³ˆ[Þçýs§Ë"þDàXÐ@«MŒ³ÿÑ@á9†¸q|Ÿ Šõÿ‰Ž~XRÅ'ÈÖv§]oåð=‘þC×BÕŒ¡rL«ñFß)æ{#¼éŒë`ÚzÅ_¤j*.b A{ú™Ée©ÑÞÄT V?Ž%f&Æ¿§ìB ›y¼/#ñÆâoigäÀ-uñÚ¬µâÊï`Ú8&·fj(\Ý…Ni<Lõ¼¥oä1´ÿ9:#€ Çë<÷Eƒ——ïzÞË­ª×Œª> stream xœí[“%¹qßïó)ú”è9 d&n~3%Z±2±äŒ#d‡"˽Ó3{_™ú¶ ?qßõ ê‚ü'ÎéêÞî¥H‘$÷ (~¸d¢è¯îÜÅÓkÿlÿòÁÛ_½øêN•å·Ät wB¹þoô©\bj:ïü†òÝßñâ×/ÜEJ¾Sÿ{÷ß§©ÿ§–›/Üþ³=þûoï~þº–êåλ‹£»××2J)Ñõzù;¡x—²¿„|÷ú틟þêo^ÿîE-E˜›Òë_üôý–.hKù¼¥Äúz$²&}ד\¬E®Iõ|QªÚšô¦%Ñ%E¿)Ý™”×Â3IÔ% 5°ÙÖ¢3y½â6Ûoí«|vFiò¸-Ÿó.­I_،߶$¾°ó¼ÿ©}ã?šªe•¶6wÄåz›Ûwþ»–’.ä(oEý¬çË™X ‰ˆ¯7Ÿm«Éûmøòñ6ߨ¤-cô|½ê_ÚýÂö¼ï¬Ö×½ôâ|ºô¡íŸ?é)â\Ùòý¢—^GQä5éUOJDqCÿÛÈÿ­%mã1ìÃ1,#yޱN 2Ç9@¯n\¶—[Çc…²n‚1é#›q}ß"ÞoZÿÛjM2~c“––‹Ë>nI÷F—ìåz鿵5ýÌVk¢5©ü$ã6ã·¦ZŸžj­¯ÛÌë€ ‘]½‹ÆëI“æú¬WÞ9Oþêûœ#¶æ â…D¢%ÓVQéJ)Ò>ê/×Yù>¼Jg¬Õ6R³÷Q'¥?Hë™3𤅨c2>eí_R¬FI_zjÆI8‹—lÒ;¶×y‹üZF]•í‰u­Ù*\lÒ…üŸŠÖz¯ˆiSzß¶Í']‰#0‘&-8>¬Ö;¶þJ—øÅë»_¿ðwíŸfnÿvÖ­kt½Í uݬkžË—ØMл¾糌5ÊõU8ªÕ[.">oÿ¡%Õž$lIß÷Œ9ó¾V/‹e¹dGZk,þ뵉…4‚ÐZol%>³Ißööd¡Ää‰ßtë [ž†fZ[)ÕŸù.¦Úˆr´R7—òØJ‹a’Ô$<׊”xlK­õ_{£pPM"•’/[Ã}`Ëú´¯uL<6ˆ.üÛÕT ¿¿ýG¶¤Iᓌßáó&Õœ>yå·K÷q5çn5¾ª ßÛvŸTbÒ“z½YµªùtRí=jI®î¢[»ÊK}í±Îëå’d´9JfJ#šÅ_Ø Œ÷®¹¹_Y­ïlÒG6ã0¥noós[‰Ï®¾ é!:iRü¶_ت~ÞµŠL° ë…­.T„toQC¾IE£­Õ¹Öš4s°e‰M*6i \ôt£|ªªïÛ¶™ôÜI—Ûg_Nåú;~n+1é“Î;ÑšTâ\'ùÆŽáIK|yjPmÎÑ0kœkÕsM¸f¬+îÑÜÓ„“JüóO{Z‰~_3'Mñ‘}äﯴᑓÉdÒ†D“6©Ä?ÿ­þe]ZÃ]9VÖÌÛÒ*ͩꗴ¬¬ÿ©kW³…¸Öþ;»P^ë^z¦ÿØv‰ ìO®ÎÆcY_Û÷þUþcË<`p,ÛéÆœ°öËÅ=¬ß_/:éÚú©µ®¯Ÿ÷dœ¼Ð‡¶¡b‹Ÿà8×^ÛtOL[Yïö>‘Äï»M¿´‹Âk›ô_ZÒK¢jTä¥ù"ײO \_['3ü°ÔMŠÚ¦Š£e¯Ooÿs'uŸôêÍÞsyß8œtásx'VÍÄ8¹6æ³ÀPÖ¹eÒ“ªNÌšIÆÉìt®“×~Êwœ$ë_ÙŒ´ÛøF+C×ë_lÒ¤“–˜Ôk2;=z€>`á™.ÃȾ±î ›£×ßÿ@ëÎÌú´žrÝùÞ>qÒ½¾¶Zð¾{YëqKñ/E¸íÖu‡/ùž©{Ìý]îìò1¥“åœsó®Í81&'àÖJ„ès‚–Í>Þ˜Z'Í8)þËSÝdxhÍd8L2NúÅugÌ8¹B“¤Içü­-þºÝÿ\öã™ÉœdÜ ã‹å¤UÏùÓ“xR¯ëFÌ=öÃd’ùÔfü×;ÀM3pbœsºÿâóI—ø¢?qô¦¯Mæ÷®­“•îÑãå¡ÉkßèÐCÒ¤%nÏ{×g¯™"ƒísÃŒlŸk‹Ð°…ÿRBº´/9/Ù_rÛêáûötuÀþß·Ÿ º/°ðOzE*7ö'5ÿ¡»ö&ãK/TôÖ'­Nú£ûŸj _bkL>kL²MZôëç÷&LZë÷§šùê³2»µ~Ù&tïuqSä[Ò»6i’qR…o®¬Nºÿ­ý=;_°¬¡ýÜÖ~R/CøuŸ‰Ž/Dä|Z<~!š|nx׎ÓyÑcÂdöŸà¼±=¼îíT?ñD'»éçì³ÉÞódãÿ\Y“MëÉk?ÚxÝšyèíÛ'½aÃð=ÛÕÞ1ëÙ„ê–o˜^®méÕòúÚ8&]Ûºï“Û¹Ò'I“/'þò‡S|¼-ÞJš”õ«Õæ¾<ÿÖfœt¸s¶Ø¹lçøOFйÅﺽyÏ—æÉkŸÛYùý©wœôœµ÷Ž>Õ|ö{?€M>ÞøD}» gµ&M8é&ç¾ò¯Ñ¯Þ¹=ˆõ¶q&õZ>R¿¬¯s¡ þо؟¦ÍÈùœ|j§ùácËú¹ç¾ØÞG·Ã ®õ]ÖÄá›4—­üžáä¥MpÃM<ãqÞóá÷Üpý•î½N´ÎÕëܨ½YrïÆÄ¤ÿzµ%&›¯×¬=îÞp}Ú¾çcÔµø]¯!=ŽÛ›»“ˆšÉºM6i’ñj@…nüF'VV]ÖdxLFßd¶<·w4é“)îÛIoš4Τ%&Ããö‚sßóK©ÎzÌã—õ¨ÇhqOBí&vùÄ ï±*:m™—H[w‘v†¬´WiQ¶þî³$¡Ü‰Ë5=ݽ}‘ª+·ýzÓý—øúzøs×U½yññß¾ »ÿ[ñõ¿¿{¶Ç¼zQ\;úr®hï(6e“°ëëÒ–×xÞ¼zá[PôQ¼ÉaËñæç¡>·¼Àó> ¾@ º…0—£3?e]Xg}À«äbÖåC]`û¦ÚkK8:©.°†gH}ÉãlSh,è> ³&ÿzÒy¿?‰pÖD߬å¥àƒÜhˆNv‰YÞï&y¿ž´KHSCn1ЏÎíà·P¶_oÀ^©kùy誂ÖÙþyŠ®S¤¯óÆQòj…ÖN!˜fׄ!ËXd7žý!Ÿë'1àµÈK®m™Úþü2×ûëV;‹*ôvRCó"2K²èB{Ûý(zšö í+ÆØ~t½ý‚dýZ¦Žæ-bð³„!‹.´·ßò §i¿¼BÚ¯·_ A¿–©£y‹¬œ¶åç ® ìm÷ìy’v#—.ªÙäúí«7ªö{Q5Z¬% C]hŸ±”=MóÕa«»]¼Þ~œ~-SGó’êºÀÞvÏþ§i·:\U³¥ëÍò¸~cõ òÆ1ë C†±¸ÞdÏú€'i.n£T­ùz{¥’Æ×1õ3o€;:kÂe,²·Ù³?äiÚ­Z%!íV®¯ %ÊðJ8ûê¹ÙN@8E©âúŠð¬xšaÉmowl¯pµ½Ø9½ÀY¢Èœ½wøóP‡û.dz?äiúY=] …˜·d‹ö8^k ïÃõÿàç <Õ[ðÙ š–kw½Ñ=MwÝ•h1Æ·ƒ Ãëü9(Eõ¦{¶ÂŸ¤éÄÉEîëu‹qc‡®È…rÛlÿ÷-º¿îi=ÏžÖÿÜö´¤]HÓ6ÿºÕøïËÿÚ°”jß½ä‹+÷rË|—Ù;WV!Fw–ÕøìO&\>ŸèÍúÓYVôL¬êêžòú]Ýž/íäÁ0£Ã$ Sxbퟯ C†±¸¾d<ëžfÙ rá{Vë{'ÕÜëüöªCt|kê6üýÝÍ»xö‡¼jËw¿žy—ÀŒì G‘ <ø9šJQ¿Äó>ài>бH»VS µÍÇû–ÿ¿Îgšùl7 \ \hkÏpZá©m‚«¬üiV?¶ð\¬m',3'çX›íÎs‹b_f€šyHx³'äDë'Êb~êºÀ6œùWnºŸê;ÞU§î’ûJðûJ°ßž¼^ÜnêTÁbáBDNX÷˜Å±­µÒÒ„Ë%†;u²IÛ]Kãß3ÅÏ2^ÿºÈ-2ÅG7Ëè–ðfOH´&H‹ƒÃŸ‡úX\ŸëŸõO´ìK›ã}iÛ özf*‘ê8Ùô>‚vóä6<¾Ý郊º¬ïlYKÌw®}‚‚p'ÊÕžãåú“5Zn\Ü•²Ç³bc]‡ÂXõ&óîzsµ¯úRÖ‘N¡,¸×„7[Qôj蛄#‹*rÝ {î‡<ÍŽNû"X§•à¶»_÷æ¯_XO RÞ¯S}Ï*½c¾k©¼wϰ— £rMxc‡) ÃþóP‹†ýs=àI‡}öÿ0ì'w8>~Ø—<ì`ÿšðÆvÞêcqC{®çmŸ›”»R»^g1ÏÒ§öŸoÖŸ9ùÍSvÅüÜ•UQ?Ø¢$w‹’þ4¥¬E9Ëx#^ÍgYFbÚc¡—†-áÍž ekê°ü›°gB×XˆãAOóñ¸ÝèáëÃ<©©`èÅ“Qø°©`(ë;[Ö6dü[ £Òd:š<ð!'™ôŸ¼ö¤°}Œ9¯/5²ê[‹}Kˆ°›„£cèBU‡{Þ=i‡kªé/ Ã»fúd‡›ö¸=ôƒò–°›„è¡ì C‡{Þ=i‡«>tù èp4lnw¸[VÌ´ÃQX>vÛZ·ì~•²ÛZ_MÌÕåuÜv—w ~&¢ö×,ë¹%Ÿ/‡IT‹ñÞ÷„¼…æE£0oÁ6*Ë iyÖ¶shõ-T6kšÛ).ò”6k=–ªÎyÛÏ÷½®‰voüPß¾Å}ÿ¯= ,½ºD¿!eIØöT†50‹¨«”-4ËI)´Õ’RX}þõÓJÎÃ[Pâ2@PÊk´Ü:Ô¶ZRl9öPhå¥È02UÙ·G†µ€Ê¬TÚ¹c ×Ú¨§ÐùÕæ¹§–AÒ^˶¥æ÷~’ÂR-dͰÕs}0ï5u}ãk­™\o~öº–S5•Êt­)U`Áí]<Öö „KkW_{¦pß]ÜvšÛ|V«Žž¹nD„¼v-‰}J Ûç¥vS¬oGï\„|<†JÙvü:‡­‹s¯\Ù*YÖÚ.Çàkm['.$XÛ^MðŠ‹ïÕóÛ“u–kõuc¯©µm0¾Ü¬kPÆP­ëÒu ë*D{]kC†?WAËŸÀa'ºQÏv#ÖXÏÐæ/[–­çt?’BFX›zÖ„cšÌ´W³oš„=‹*òØ|Ö‡<å~$×®Âô§Ý\Þn}û·¶}Öv%ªö1 C ŽETžó!O™+Í”â:dÿjÄ€`ýk†Õá/›—>¹šhb\M’&FÒÄÖ±uø™í?;L‰‹•I»e!†„~¢¹ï¹:Ë_¹Õ:}:tÚ¢=jpÛc;äœÈÛ*1ÈC¹ˆ’/¶—ÖðE×—ø¥CË×£A§¶”ÑItÚ’§4$)9c •Ç(÷^ËëÔ7Ê}ŽXŸ€‹†‹Àųáâ ¸x\¼S\ª1«åíkÿ(ÀÅÅʼnáâ¸8o¸ô æC§¶rñ%{Љ4BRrÁ˜•œ<ÈÝÈ¥.`ÈÅ笹,¦+êD:‚\|æ:$ áIÉæâS¹ø”"È£(y@.ÕâÕ\ªñ„\|òÀ%9Ã%àp‰Qq‰KÅ%2p‰^qiŸŸ „P€KȆKHÀ%Ã%p \).Á—ö7¼¹dà"IqYÍX¥!ÀEØp.â qÀ…3pᤸ´¿[¨åAq©F+ÈIqao¸°.T ÊÀ…¢áR½ÐàB¬¸—¶é>È›Q£äíSŽòd¸ÔN¦ëPY.µ^FÇW€‹ËŠ‹KP‚‹Š‹ ÀűââÈpq¸8‡\JÑXJB*%j(%h&Eô‹ÖLŠ‘§‰ä2Éyä¨qä€4²h™‘EµÂ´†Ó$Ú‰®CšÔä¿ÈÓ"EÍ!Ɉ!1RH¤!$ ’Ó bF1i1j1ŒÃ¢úŸZJ#è5èF¡ègï¿w'}KÙÜÀõw»Û+ ®½Oilîö¡ÁYk‡qõ¾·ßI ¼…5l¿K Ù"۶߇[¼¥pPõÍ=?4BÑGûm)™µF  \Rõ¾@=ÚV£ÒF´FD.!k.¡ — \i´Ý&Ð ÍeßÐ84‚æR;$Ô£uY¥‘‘KršKòÈ%‘æ’¹ÔÁ§5"r©ƒWkdä’ŠæR§¨G›@”#—6 )€\rÒ\rF.u*Tuªâ5—ÂÈ¥ˆæRr)Qs) ¹ì¡[ý7µECiTÓ^q©¶?p¡º6iàQ#²ÖH5rÒõ(ÀeÙ 5Ú2 ´†$ÔˆŠKõÉ€ËòFiàÒ>õ+ "‡¬¸T߸…¨5bF¬¹4#Kk°Ó\Ø#—jËi A.ÕÔqç]j¿Ë¶Ž”ý×"íßIù²Û«4–]ÊAcÙ†U©hâA#ÕÕꧺ–)i]éi]•´®’ƒ4Š–.kì Ïž—uúÐÈËJ®4–µ~ÐàˆRFyôZZ-Aš!oÛ¿¹±£´nÿÂØþEtû—€í_¢nÿîŒ+2¶5(5€jrf%gr!%ò¨)T³1xW43ƒ€!ŠjÆ¥<È#+yÂü9)yÑ@GÍkÙ¹@. CÈkÙ%Ñ:yùT4¯ÚŸ—O1‚N@^> #¯:¯ä ¯X€W̆WLÀ+Ã+ ðŠlxE^Ñ^¡¯ ¯€Wˆ†WàØð ¼‚7¼‚^’ /IÀK¢á%x‰^BÀK¼á%xq1¼8/ކàÅbx1/ö†;àEÅ𢠼†8ˆº2uåÂHŽº¾éP!&ñgu%ÅhŽºÚFÐø3!&ñgu½C:ª5A®âÏ*=Œ«©v‡¬©– FÖTû%€Ž‰?«¾Œ®©V’Ž®©vTRrˆ?«v+9ÄŸUKNqq&þ¬ÚƒšKµ‘KuÃè˜ø³jFÐø³jß’’CüYµG.ÕzÖ\ª…-JnâϪ®¹TK¹T{?€Ž‰?ã ñgÕ«Ð\ªß‘”âϪßÂJñgœTü'Vý'à’LüYµò€K4hÕ›.bЪ?¨¸DˆA«þ¤â! ­z¤ŠK0qhÕ¯.ÁD¢Uÿ¸‹Æ‚Ѫ\D…£qû“]Z®ÂÑÚ)«€´:›.!i,&&‚Ò˜MT3„¥1C\³ L«Ö9paš¶\¨å*8­: † %àBÑp¡\H bàB¸S\Ú_Uòj™)y.>(.^ ÏÀÅ“á²ü±²QÇÃÅeàâpqQqq¸8V\ççKõ¨à<@Iæ<@‰pN£sNÃK« ç4ŠWç4ŠƒrQç4r†s9ªs9 Êç42›s™àœFvæœF*š ¥ ç4RRç4R„sIÔ9ÄpN#‘:§‘¼á p‰Ùp‰ ¸Äh¸Ä\"—HŠKôX‚S\B.!).!.!— †K`à¼áp‘\$+.’4—tM]ïÚGͺ¾¤|1Ó·Ñ|jo•yßÞó•¹.æ;›orÍÝz‚-'Ø&רü›)ý8ù–Vú‡­ÖVëGošIéŸÙ†x»žÈËûß•›äûÜÖá¸AÿÑæ—m-¨d¹÷JSL.(š\c4Iš¼ø76éKÓ†“~n”&°'­ú‡ëm?´ª½oiÒ„Æ8éÏŸÙŒYªóäõ'Úv˜Ôa¢5é]_œi‡­ß¸KŠyï7ߟÂ?iŠOÎðŸ”>!{£;EMšÞ޳køßùM3¶Iøes‰IÂÞ.ŸÙ†Ÿ´é¤]&ľ¶Z¶ç.5¯k¯kçèïíG8Eè%¥>>Ö îB«ônÏÔìº!Ó ðO¶T½m÷¤˜©éÞq5™j''o:érÿrj¼ß¨Ä`íàŠó{?˜L¶#N:þ¤®“>=˓꿱e]lÆIþý©¹éÜz?©Ääd@üg›q2àn­œwmû¥iú×6_ÙüÓæoª}ߢ|î½'SØ®7 uŸTkÒË'm&Ëöegxà©õ~R…ÒÉIºm¸rŠ;Óɸ›Ìµ_œý_Z¥ìxoëÚWûIKñí®ö-yÊV4”§ÅsÆçÕk)õZ¢^åñKÉËÇù¦µrÊö±íûÃÌï{Þd®Ÿ$ýñ”¥5éf7ÌãÛ Îü¤³MOõãs¾Ä¶öò%ȱö~l«qjÊ™¼÷ÚÑ7ýùÚ=÷Íbçê~n5›¬•Ö—¼ÞIÚ†¤½“Lºïd}¾aUÝ6¡&3Ω&œÔÿ_9ÉOf‰sæÆb$nwþ,q6²Â^ïüÙú®V¨tzеÒñXN‹Ô5Ú?ƒ¼Ýù£å-4|·Ðq%Qòu¨4z€ú ÓƒØG~çÏ ÓïüÑ:ɃN‹ T-ä~3–ÐBöy éå˰CÞïüÑýàÀ  —~çϨÆËzžmÐñÀ¥Ýù3ÈÛ?JÞîüå¸,gó¹.ýΟQÇ.ýΟCg½ógÔYïüub”\°f%'r7rYïüQýΟQ'!—õΟQGËzçϨCž”Üi.Ë?ƒ¼Ýù£åQ”< —õΟQ‡ËzçϨ㠗õøí¡ÓîüÑQqiwþh¹(.íÎ-÷ŠK¿óGiô;~çÖIÀ¥ßù£u¸´;´).íÎ%owþ òvç–'Å¥ßù£5¸ô;´—~çÖqÀ¥Ýù£4Ú?£gðõ9g¿úoÀ¥o¿ŠKoŸ‹òö¹€·ÏEyû\ÀÛçÞ>ãí‹o_œñö«Ý# c¼}qÊÛÞ¾8åí‹o_¼òöŃ·/¼}ñÆÛ¯ÆXãí‹o_¼ñö…”·/Þ¾òö«Ïí@®¼}!ðö«¨¹o¿NcÀ…·/ ÞþzäÿÐ9ðþƒvÔSÝ%Ð{Â}í¸'è$otBs¿{Öw?°'Æú´‹JÇ•‚:íºt­cîiÇ>u}\pXŸö—@µE£ãtÌý"´ÿÀ=!e¨µïŒZ'ˆÑs¿H;ªïŒ)yµc Z§}xDX@ÇÜ/BYà.œÌÈ«|ŽC^”ŠæEÉÜ/ÒŽƒêú¤ˆ¼Ú‘PÐaäÕŽ…‚޹_„ÚIUŸöIêÓ¾Ijhxµ? ¡uÌý"íh¨®Oô†WtÀ«Ý:íf9­cî9þòãž †W»éNëxëýù¥#æ~‘vLT×G’á%x‰^ÂÀkø›%ub?]שO7®“ãøéZ¨èo×u‚-Jñëu¢õçë:‰ã÷k!v ãñ ¶ÓŸ°ër¢¿aW•”<9‡¬äA΢䄱â&W0š@\ “0ž@\ô #4Xqq„%xÅÅ9Í¥$#. ¹p‰š ÓÉb:¹˜˜N.ÓYÍ/Í…³Šé¬öš¹Šé¬f`¹Šéälb:9CL'gÓÉ b:9™˜NNÓÉ b:«áœ”œ±ÓÉ b:«¯¸DÓÉb:9š˜NŽÓÉÑÄt¶?“ :ÓÉQÅtVÿ¸ÓYÝ&àTL'ÓÉb:9˜˜NÓÉbb:Y ¦³ÿ™q¥¡b:«+Š%¨˜Nˆé\þô gÓY]fàÂ&¦³ýueÐ11Õu. 1Ì*¦³NÚÀ…TL'Ät2©˜N&ÓÉ1Õl5\b:«k¸xˆéd1ìUL'û€%¨˜Îj¿¯b:Ù›˜Îj½gb:ÙALg5U 1uå.NÅtV»b ‹Šé¤1TTL'ÓYÍSˆ.&¦“ ÄtÖ%ÙĦˆé¬=bÓ³Šé¬¶*”ULgµS!6=«˜NÊ&¦³Z©›žLLgµR!6=™˜NJÓYmTˆMO*¦³Ú§À%©˜NŠÓIQÅtV»Ôp‰ÓYG˜á!¦³Ú¥†K„˜Îj†— b:«M %ÓYíQàTLgu —àK01$ÔYMOäò·”ÔUë"ýaÿÒž“¹qõö!µÉÉœIY“Ã3“¤sçχœTuR¯Sg™&ç©&'z}ø!§îêbÝlÕ‡]$b”NŽ$Ý8cyó>Ô^¿ö+[Öäöœ÷L&'Í{lùj37§¢®G7Ž£ÿÙžTëbaLZðæ 'CýÑãàÑ£rêÿÜ©ÂsOüA§þ_¶?]憋I&ÏœŒO{FñÜÁâG_+pã¬îQ‡I«ž;ÉøÌ—F=ó‚s}ê­/r¸u–uRÜ¿‡îú”Ççϵþ$ãSNçÎŒÛauÙdÀüàsË·[ðú|rÿP^'/0©ÚëSžgq:7åONÙŸºügR‡scoÒ)¬í8 “žóh«ðÜM<çšfÒà ô²8m1l¾wÿ#7Á­7’/g®ñfý#Ið“·?Ž© ë_ÍÙŽ¡ôòåï¦èŸ{éªvo^|ü·^õ}õâ×õŸÿ”¶h endstream endobj 27 0 obj 10660 endobj 43 0 obj <> stream xœÕ]Ýn·¾×S R MÚì˜Ãá4@Äq·‰“8ºH‹-ɲÉòoê èõ¦÷}™\ÚoQÎr¸"÷|œ93Úu¬6´ yxxþÏááúY%j©*ÑÿÄ_ŽÎž<«ŒPÝú³±mÝTF9ÿ·•mWÛ¶Ÿsã®iªÏ/¾9µé\•ý]ýŽþèáºZ÷ÿ­A§¿WŸz¨ÒTRÔBU‡<Œ®ë¬xÉJY+[µNÖ«Ï>üò£ÃNJѺŸtx|ðá½~¨©¥âÈ“~Äúã)c†¡WaHXr: ë¬ñÓ†¡³~HÕ­•qREFŽàN›CJ0 ËÐNIYFœ.»Oòˆ3 l× )Úaè‚.|ÙéZ ©#ø‡ôÄoêÏè¤Hs¡tW¦9=óÍ~¤­•P.‚úSXçœÒfkH)]&¥8_dŸ»<Í :Z©Ë¨?¥½ ’÷ŠÎz wB6M=e!•Ï?„#D×Ý Ð½Y= }†Z¥ldý]Jä¿öCQ›:6kMNÕÑz“`Rul­n¶¤ºçK<Ü žéËIÐ…Ãy;#eœõ¾ Ck ›Z8iãЃ@tã¤)C¿O1}Dѳò`á]ø’ õE­gKÉ<(\cµÈ´+ˆ¨-r= È !•,ž‡Ç±a]c¤Q³¸?˜hãTDÔ„I­U­¯Ë¼¸\w\äNŠUÔT'¥Í‡Rè³fíy!ZslÉÂ]b¿RÖ%Þ&®¤êƒ“þÊ^E‡nP©“”奅9*qGïk"ÂzgLQò·eJ>ëë UqÒ=J›Ó0I[Õl…H€‚醚κAq‘¸uX}s «þ§GãoÜÔûh—8½ƒ6ÞozŸ'\mCZGÒé²í?ж™÷6µ1ÒE~ÑuÞÇ›™½ÇZxDgÑYÖ‹°£zã÷_„YÎéMtp2̲º-ã ?¢³Îû!ijåW^ø$lèŒYtÕÔÆz¦–‘øþÃ0Mµ‘™C l•HïqÌ&˜ºG}JÄN( _R$¾ÿ(ÄNÊKŒJ„(“!ë\-×"ôEp¸zsÖ!Œ“B8=oÜm‚fE>tVžåƒÞL4Œ—iÙmEný¹ºòŽ't@5ƳVÚŒŸÁ¤Å¡cº€ Ïèö`áQ˜¥|TÝ–é`zÅ¡ËI<äσH)£Û®¼áJÀì§tà8‪ô<ûÌQ°^`áu?ìØ™Ë¬çq¯”A1~TÒ”7 :/<7Œ)õ´pž-@›$ml&¥+ÝP§gUžàð{pƘ4)¹1Þ —@]ÀŽ@z½ÊÒ›J oÇï‚h…nâÂé¬ÐYVYT'ýÏ`þ•U]œUÓY`áá¶ßÔâù ]<&–Wå°RuYÃZ£|R©|8¯kW2}oY^ç!KRxþd8hkd7¢ËÇE»0aÞ¡öè©bñìÉb_KÑ €Ñ Ø„gÄ€Q?a¤gP0ç5OH(¹Ûûè‰Fòž§Ê Áó|€ÎàØ<œÅÿ »"_‡xùfpÂè8 Àô‹ÀÁðÂÉ·,ݸªMˆsçå<å8¥: \IÂY]ž²€*†‡Ì'ÁA¶¢n¥N$Øö5=èe•§t! ¥wébxR T’gûâÕ%öIQ?žš—ò8Tk±}bÇÓ#p @Õ×KƒÀŽTÐPz•ô(_¸Ø¾ó|/Kþ‰jÀk¡}¢9"¥êxŸenGì! k=ÈÕXé¶2¢4„)¥‹ÐJLà_YŠ6ÃNzºy!l"8 /€W^¹Z9©¡t»ƒqwĘ3)xðCZ;-"?ÐcÇ4SiwüŠâÊÍwè¬[UÚo ÎкÖIqùµ: àçÓð-—{I·Ke´í“À« ¯Ê2àr‘× l\x —#^X\51ŸPà5“¹‘,€ßyÐÊØ¦­oûä\‡Ž46^sàÞM_#Gó‹”ïEÄÅ‹*æ%Å3YÍ3¼þp1, (éö‡>*ÙÊÚö2®D|ËO*»,]ñšfxoÜ@8ÇËH€®-~»¸s‡—›ñÞñ½ÉÓŒªÎd8º´ªSªŒç‚Â;\¼6“+ “Ðgæ9…ñ°,ÜåãÕY ’ „f1d­gÄlÏz—’¾LˆñÛ“¾ð`½|÷ªÏ#é,ÙÂ~öªñ@IÍW¦é'Ú$þ¨‹À{=[z³=y1²Ë»%@4Àðůƒxí`aHÞ&¯3÷iœ%¯³MÀ¼ÒÐìBÿâÈwâ;;YܔͻþYùÌD”jÀ/“ÚQî³IÏ8«Ïfâ@{¼ÜùH¿ÿì>ôÅELÞËÞK½«’‰G°àØÀÀ…bNn-×ÙÝú«¶Tõ¯YýÍÿyìÿ<:ðÎEUFH×aìùAã¥6~:[j´jÂ'cT·ýñrnèìà[Æx)Qµë×:ñ«—\W…ï^²]m\ÿ=¶>*_ùÒïÂ9ûïïÊŠ7ʇr¢“)ÍòYG­“›¯5;£ _ÑYÇÃ’M–ùæ³* ë:ëæ >êl¶p¢ËÃ|ǯêÊ­?¶Î{Os$N)x@/pÆ—tÇšû!…µ¦ÄÊyñlL=³þ‚ÒãëÎÌ[”™¯Y¨žP$žÒ…€Ú¨¬\Ð…€^sØÔ¶µjdßéâ2*ŽK#@ àD¯b-*qìbëTž‰M¢ h ´äh©¤JVòP ?釤è¿Aqëk0S$nP$Þ âÓY/žLÑ2‘´œXÀÆŒp(AµÄ¡•÷y>ñUx*òl8@̃Žçð¶=§ OYrñ1äXI` xxý‘ÂC‹ý…‚¯UçGµK}Þ/q_?=ŠQФùxN¡ü $±TŽÑz㕤”Zß^E„7ß‹Y‡A­úP8»ë~§!ÀëÝ#!Ä£ðݬìè*Ç ‹,K‡+°:$–â¥Y¨zû…ˆÿQÉSk?oÃIž§Y°Co© ¶Ë(r—þ„ëë²ô; «¶4î4A$(±Ø‚…ÿei$ ×Š.ü ËåÀ8"`O€0Jð`ážÃ> &@&ÀŽ T$aÇen«ÕJ7}¦¹žÎô½pZÀ€ p”M›OüŽÈz·dª$ù¬X’ÇS8žòŒÀësJàŽ]G¸;î;yCeký<ë < J7€bÀšIî”gÛ×¢x%C°#HÏxžŸWðYl+Ày2ÍË$y¾(°‡ó¢ˆq·L›gÇIðæpϲ:ç%à|ñª*‹9´8ý{À2É@¾ÀxHì)6ñj×.63«p»ˆÍþÝeõ™Éª×=––ª^YgÚóÞ¦CW«gæC×èž0ï÷ƒŽ_Är«•fBó ¥/6^t1ë@²<ãAÍ5ƒ=ßʬM„³µ¾ü ¯7·yàÅs¬#’3¾ã<É™M‰‘«¨AT^ @z»CÚƒÊ ¯6Æ£Äâ°“W©2Áól¼‰'÷ ^å…w#!Yt)¬®t«ê~Ú~ªK<äFbÏñ³ó¬2(çÎîUI7é5ÕÚ†$P+Y)!›Ð©dE»ùt>ÙþË:Ö½HBòq37ÄëT2]©S©m<á*å#3Ú¨” R©·$wùÂWtÖqA¥&¹ Å2ÐvS0Èä€%™ú2Ð4°NYVû%=6¨N;çqV¨…nÝL×–ã·(¬’ßžD¢ä·AgFŽÄ.œŠ¼l]Ý6*ûµÐòø „ð¤Ôõ;\R5Ô¨–{–0³ÔS“S¨U Á+8éUÎ[ä•·Ûýèáû`FPFÈ8#þœ¤F©ì™/,5ÐäC3h&/>¥Ä& $nS"ü1¥O8KUÂIXw7˜TC€­jºKÉ,^†¬¤þçÿËT«endstream endobj 44 0 obj 3931 endobj 54 0 obj <> stream xœí]Û’Þ¶‘®½§ø¯vÃP‚àVåbãx«²›M|˜ÚS¥ÊeI£ƒ3ÒH–åTži!/ãËøf¯ü €h°? ÿÆiâJâÓl6}B³Ñx}¨+!õðOø—G/Î^Ÿù‘^ÛÿÿÓ™8¨Zö#}JwvTIcÿW‹®°4?ø¼Õ‡ß\Ÿ}vVWª7‡äÿGÿdñšªþ3¢¦ÿþèÅá׫PQWµ<\<±8ú¾×µã“°dŠJêCgDÕšÃÅ‹³þãg_ŸY,ªi ‹Çg}5 µU+ey9ŒhËn©”zë†jmQú¡K÷œVÌ] C²ê´@6òØ#7Ré¡€?æQ)DžpþØC>•ç%@àuá¹ZÔºæ~; 5US‹& Ægü7Fúkx^˦ÏóœÏùãa¤«d-M@õ ÷œ1²Q³!)›<û8¯ÀüÂò™8›7|(<¨E“'ýgè5—¼·ê‡½¯EÛ¦Øérùü'7¢êºÏ}â°[-Òú uÒš?ô9gò¿CAÛIÛQ“©:jkUÇN7íLª‡u “óúh½5) èÐ%ÐÏ·WB¨/9xð 9¬ªÚ†ž8¦+#TûCNésN€ă¯ùƒß2²žqëõ^6{…kuS'ÚåDT燻ž;âëZH‘OÙŠùçZeÝÔ¦Õ÷&ZU¨ÓrÒú*¿ñ¹ÇÙÕ¡TM5Bètˆbßuò¡qÅö/?oW™z1 ÙˆO›) L'2ý”“Ä_òÇFa±úÕú¨^¦ ú¥¬}>èÞê·‹'ÿÁ˪c/gàX_Z»=ŒlzÃ…š×D=ƽÊÜ„€‘Èù5‡zåÞØ«Y,¿ª ?¸¥ï;Ê,…&Ä$Îç1§ÔóÆnóå#‚dÏU0¥<øˆÏh ÀÅç–ìr2ðòðgkÚÿÍþ÷kŸóh»Z9‘CŽÃ«³/Æ!¡”é“¿+«tmÛŽIŽˆÀD„E0‡øììµE#6$4M?ì ÂÀÐîÅÞÿzvö_‡—É̆„Pte~žJté<ý@ ÂkòÚØ^*ÂOÿÖ^H†cÅD…ã匆ÕIÄ¥p¿FŠ#[-ŒaÜï«ðû86Ƶ lÕt)׿ßÕ" £?0ušÂ°ôdîç±kì–5P‰‚¤âLWA™Ž.ƒrâ×AÍåy| |%R-ŠtÌÖb_47¸LFѾ¯•m¾vϽt&ªV²N¼Ê *]÷†>§lÀ(úħ¨^8—¥­í¢E-'× dô¶_9ôÊ®u°¯O9ú—×¥{°1¢Sé|hjéEÃ}Ç‘]ûIJ—¹ž|[Šì1‡úãφ±¾­ôíÿÞM’¦ ÊögÅ7ÑÕ$‰·—_µvÚS=ækvÉ‘ƒÅÎdâDÕ©Z÷é’µµèú”Yä9?¿N5µÉ/uN(Ïekì5vËlMÀ8þñ…éùª‘i„oi ãá#._Ïøû/š‰cÈžÅD¹–ñ1ŸxßoùЧîAš¢þ’£R™WPª@ÀJ‰ã'è§ œ¦½ñw\̀Ѓ¼?`ŽÓOe½@;!û® €Ó@õÀŒ€p¡¼òE‘ȯÿ’R¢éT$óšÎ>ܬPùˆÃp›y¦%Úæ8>M,Ìÿq.°ç‡éùäCĔЙæ"k8Æ”¾­åCu]P€«É ½Åõל"­mymHÞ›ò-o?Ý–w4a}%U3‰?Øm‚=©ÿA÷–`cœßn'µ × ìf)Ԧݬ”M—uJô‰þ²íl¬hk£Ó©ˆ;Ò ÂmÃÈ߇-­ê•JöŠa`B!|ìM!F†nt?QLQh·­ˆ(tÜg8D@A FVµR~ ¢˜  1¢f6?QLQÔÍl"~ ¢˜  6¶éMÜZ 0pEZ¿YwðþWÙÖÖ§bf»ÓHǘˆT„ŸmH[ðB2FVD*FќӰº?’=þ¶rÙĵDR'ˆAìD%ÓýÖ­™áˆ‚ç~[íœAD¹r¿™HßÅÆý®Cg:,¡ªU`Ôã~‡\Æq N¤. @Q& ‘I¬NÏlDÔw @Pf“>ŸèÂã™êF5P/ƒŽ Í‘Åcr%rxüy¬4§ª¿EšUb¹©òœšÞÔŠ†[*Ó©ñ$¦HujS[7{³‡sÉÒ=D´]:ˆÈ¶š[³á ÒÚÐ‰Ž¹|ßP~¨µöÐn%†x뇤|‡ï6À®‹ûùíFŒsÿ‘'Ì«¢]_öýtÏ€¶ ó’¿±$1°;¿ãsE¢êâ”/<ÓIEÖ<ñ6k ýõˆ¯DØp“M2`D.²šZ)Ù¯­X‰4üx*iüo¾€¿ä{ ÿñPZš,&À8 `ƒõ¿Nýh©ÜqI¼%~çSxTz‚\!‚p–¥k³9¼F‰ªo5Éá}ǧ´)³C3N€«EÉ ÀC0)Tû’S ØT•ÓP}(0”ÍpŸˆÏÎj|æèÿÕ¬<“:”'œØ'`>XDz¤Ï/‚i¿åÌf¬GHXiÑš< Er_L‘wKxð-_W áyªèA–uïÇ=Ïz²\ükÃ>'³ÓÂþÚ‰ºÖrrã¿å«ð;®Þ,šªæƒ7‹Ê£§€BáÝwœŠkΜ-ß @M¼é«¾›tÿ°x'³6€¨¢Ä>°? ô] Š[Ó™‚®šš2³õŠãúÑë 2Ë"íãh§˜Ž ß(@Xløf÷Æu«nÏNoD@ À–T\vì = •‡@7Ÿ0 „a3üZeaöÀV”°E*œ7nu%Û)ß¾¶?+2ô@œ@=Ç– Yœ|¼°¢éÀo•N¨,¨E)ãCÞȯN§4ƒ IŠ_ÊÊ(€úäkwvS¿ä%•ewàÛrtu?–Ô!µ#¡åNÇRÂOZoI²¬|ßg_»ýaÕWªí­[CNrøCÍé`´þÊŽXÎ^òØiì(h2PצlH^´W<Ö9—,Îf ¤@{‹¬~ŽUqàAîVc°šÜÚ°Tqàs.ù!7S£ŠsÄpk J(òU$d5:”¼%KÕ»àHÀÖ=[·)øž#*©ˆqÑÁyÓIënq‹z¡¨÷[ % bK 6¤)Ôz½¨T<< A”ö@ g <˶¬e)9ÆPËõ˜íÓUBŸl¯ÝL7¬ƒÕÛnÊë-†é~Çjêº[¨-<ªfx5Þ Ñ‡s»I¿Á¸ã^Óæ}ÒO}`¨ÜS†—˜öcfÀ¼Æï¡ç²i«f̸¦&a|ë?;Óp ÌZøèJ,ø„ Ò°9‚‡ZCÙ‡ÿ¹DÿÁ|€à%ðé8Jq–™XÉU¹Ì€Ô]Ö~—¾u«Æyµ{ÊeÕÄü… }ýysAÕÓ)Ï"†tM™ç0be‡ú“†eú&¸ ìˆyU;ß^Ì[–Ë3U›T/ 8S®}p)[N°Yy–…•…Àøôs^11?ç”;Ùiûª×i·Г+Å’€eI©üÖ™ù¢žº.@eI|²xºhkP$²ËˆJ¤µl¶eŸî„•ÌåØƒ‚Ôø¨_›Z/øÈSŸ§É|nuqª„„gË(æ›Îâ’²äúÊw¹ì*•Ú}Ô¬,³ýÆñ‰VŒ¦hHÕÏÔ§r~ÒúJГ™§ÛaŸÒ%.8¨F¡°ÂôôEWbèeõï•_)úÌ}¤]_×¹ÓT1ý~ù´mN™\KC=žøŸÎ×Mßz8`7ÔÄk[<¢bÂòŽi(SõªI?6¯7á]£ØÙ§Vu’¥^}ð‡ºâP×÷ƺntbûLeL£ïi¡tÓåix倌Ru`ú|uÉitfÀu‡IR)þ±²>mEt͹š£"eN8‡™9XéÖ½éûìÁÊh{C¡À©@Þ §ì”ãÅœtߥ¶Ö'4ÁáȲ÷fI—|‚¤áfGNÁƒ¤_d“'œ õÍPE]g<8Ú †üQXÚ-É[BÚê ð tÔ_Ähpø¬ã[Nx0ºìðm™˜q¸ÊhcÈ€«`i¿å¤úÎ[Õ¼!/¡á%*ê²&ý–£ !±zAž ‚ƒÖÀ(½.’ˆÝšýã G™Î†²!Ýz |ù½ ¦IëwS]„Ë7z¬µ:OÖÇÎ9ÕªY8³°ç•xxpá… >iù <0¹^lçJ«JÕ)MeVŒ‚fÓ$ëè¦ ¬˜%˜h0% rÀ‹»H-“{@ê‚Úl¡ß™ž}« }ð"µœvcWqv*íH™Rú´ÈŽ/¨™bÅé¤î ŹF+œª±)J¤‹áü4Úó-…ÖB! 9¡7¦ŒfâŠ@ð¡ù`%ª²”¯íM5ËæÃ¢%t•Å^yœðu–Ïd1Ь8Pìc%޲yTÙ•6;Ò¡ssI›~ßfg‹˜ÞÕ6;ÒˆØ/¥'¾EO Æ^&ôïC_˜pODà"‚ ·0 # %ODá"Š "  #ŠÆô)~ ¢˜  1¢°KžRá"Š "  # QÏxá"Š "   at› ŠáQPˆE'e2‘0QLQ´¦N©ðÅPˆ…Õö” ?QLQÈ~Æ ?QLQÔmº¨a ¢˜  1 è…] ÝGa`B!< 1 Ð]›¢ŠáQPˆ±Ascˆ¢ŠÚ®ˆ©ýR/&4ö_Ûiàj°ØÝ€ïÆã¶_êët¦a€4¬éÈkCû¥‰ŠÐ~i"Ê“1²"RáÚ/ÍhX›±xáB²Yû%bÒâcIc$b±ÜïÆÌÚ/ƒä~Æ$Åíû-ê9ÑœŒ¿­)P)±î÷ éÉ[ˆ1p¿ÛnÖŠèºû=èiŠ#ª²û-û9QSÝïAËRQÇß½ÝVëI$Q«1,B AÔÈ5Ò²* f*Ð6ËØJ» Ê:µ£:Bˆ†vT‰®Hî(z“ÉK$oæK£_ÐQ§gÒç?™ÈÜÌÅw5{âáy›9§èhô<Þ‹t}ú|âxI›ùŒ`ÿgïO\F"e3kï-w“ÑÔØ'6³Ó“ÍÖ-ŠØ`T‰„?µn©+Ø a!ä ™Û·4DK®´EʨKƒ¬4dšáaaµsi˜Dƒ5ƒáµui C–nÞŒ‡6ÔÞ¥¡ <=,8¡6/ 6Hè@¬^MØ@ÍaXüÀ,ߨ>š>ß½>Ú¾©]Ùäˆ]»²Rë—Æ´]Y"7Ô®¬‘ÃmHã¾T,#!u49Ô¾^!O9{ë‹ó'g@÷•3» 9]àœìzR|VÖƒ”—UN€Z›…›%Ý’`ï½ýÆ­àÖIv5=ßHÝT¶s’3ÇÀ¬´rÉ@–uÙ+â§œô O/wÙ[.—;X²rœc)Y- )RC@Å^%KŽ(€Ó„%‡vKÎL•2ɉ àÁêíþ«¤ì*eÆšË{‡x#ôÙѬ¥¨H±¬Öµ¬»V¾qÉ^wxD+p‡v‰T?«c½wˆwØ!f‹¤Wü•5‘)»×gÙÕ“XÿéâR«×œCLÉüK;svŒ  X&9‘)u‰Û;~äÝâJizYë¡\¹u‹º²¸îÝ⇷O<~#yŸ¿7Ê…ÆÌöÝ;®;ì¸ÞÃÜy#-·To?¸ÝÁMCVÐÚ¼v:óroï¾|Ãwk›JÕýÝìßP¦Ž@,ÁQG…nÙ,: ´1ß¿aëÌM“Þ|”½ܹêì[WÛNZöÞÙ·| ‡‚3â…-–{³”õ:}‡¥öÜ[º8¬tHº³¿«Q:XÑÝMæöF€”U¸ˆUî»1\wc˜¬†ïÆ`cÿ:ñzw¦CèÇN>Cå)ïÇ>»˜}ÓÅÒ{/‰*XÚéœ÷{ç:ʺ¼€Då¦~iEڸѲmëÿ¿´9Ë·ÿ_ŒfwöÅØðépw{ö“\ë¶)c±b•sVr5a±]r®û¹¬ûjè91ïV^Ú»«¥\P0FÈ'Ü„]¸ð½¯¨aùr td¿r¨Í‹í`^¶eùõA¥o_hXnJ:–Ó5;–Ÿ7u7:“÷4d¡LË7}6@QÎrhòîÀ5 Û¾”ï'´}©Ñ÷_Ê¡S\q·ãWXó.¹Å½&"ãsªqÞH]µ÷=àço¦œT’E¸#;Œ\î^ðî“»OžÜjòä¼QMÕ&Å"ïŠÍZu= ׋“v²ùRAªe·ªC>Ãn»ˆsg †±ƒí¼¹ò]0€%F”}•Ý%’å œÏÓNùïå öm'¼ th|°%¥ذ÷¶Ûü…}46;o@C‰³ØtµÔŠË,ÙÉmòWw‰ÅÎj%¯µÅY-nò®Š þêæ6stìb~2Gø*å ψ¯:6/H¡ew?”å=Ë.qèA3ýwa3°é‚ë²…[Ü*¼®,Èü¥ƒÅïíWïÓ¥òRO¡þŸóagfý¸/+5qeÙ‚… 9ÈüþÆ¡Ž½™`eéË:m«ŠüŠ-cÏç a eü‘a U¦² ùótÛ¯O>6VÙNP%ÈÇBY¼öÄzÏá8y{{% âîÝ^Ù•Ü^Üty%Úp刳)ËHäk›¶¯ɲóÙR­Ýªxl…¾zå+ƒygîlÜseãí}©,¸±Qt¦2(¼±ÑÄæ‰ 76Ö²ééKÒ[½±‘j~öÆÆÅú ÷5.ëaþÂÆí}ŒPÉ×¾¤øÄ+`pÌm«·¬æã½Å uYã*£nöÏ^+±pS#ø€¸ñ.¼|²ù3ýV†ÎËTÊ ni$ʽ|Kccnñ–ÆSÆv Ä®lª€`[¨²Ë*´¿˜À[®O G·‰6Å—@eýa§¶jDà̧ X<0ePRP¶óéÂEëKÙò²=Ç ®bžÎù<€jS©ÅJ ÐéO€ž®Ð‚ΦL 7š*98ÚŠÊÜMSº­¾—àÚRà›TclØ8ï8zâ3H̘Ú¶)ßûZ6°•-›rY³9 vùò䕺ÈÓ¥‰ËR­¹â³R£OÕlAvWo¸Ž÷peÕ¨+ŸÝò•èB[Òô}%:cÿ}%:‹Ž«D_)ä OùÙì+À'•'EšT¸¤*ð{Ž©dMC±Yר7ÒØ lTv·e82Ÿ²ü™<·IÅVpowŸåølRAòË&µøÚ²I]Œ<ŽÝ¤²=ª®¾ P`(w¿IÝœb“Z¦„'ݤÂ>µ”¦×Eº\¢í´µù“Ì'8Yú+®ÞcÜwnaªáVº[Û¿ï-aXŠÊ¬è¢••õ€4ð±d[ùòÞ#]½}A4ÖáCùö„û„³'_¥C'^âŠÖ¬dçu+Á¬¡—»x1GÓOÑc¼‰møçïHDêOendstream endobj 55 0 obj 6091 endobj 62 0 obj <> stream xœí]Û’µ®ÜîSüw@R;Öi4îÂ!UäT¶ÂEHQk¯mÖÞ]Ûë@Þ0oÁ%æÚG­éÖŒæÿw1!†ÂXýK­VŸ¤‘>Í\ïXÇÅŽ¹Ó_<9º>Š”QÛÿ{ÄwçGj]¿“#³äaÇ{%v\9Ò³‡GŽã ü,Ô àϱñЮ7Ž?Ï_MéÁR•0öO͇ÑU·òÞûL«ÝG—GŸ±NfWü¹ûIýÖò5tÿxÖðïžì>8±\¹•ƒuLìNYã8jtÄ­¼z7ÞõfwòäèÝ¿¼wò͑墤t•NÎŽÞ=u¤¾ë…H”§Ž¢­ª…R‘tHL[–‘ô0´ÓÊV‹¤ GÝ yª´C”³ÈÜ¥KN@Ü,²6‚óºà¸Ù}<”ó–JDw©ãlˆ¤KÜð…#ÉN2.û¯ñˆD¢_ãJIçLȱ®s<æeè&±ú]hgŒjFBÖÕ‡uEŒ/™ÏäÑ<ǤÔPsYý +ô{Þ ®õ,pïû’;4!öÏwE16¦vî6Š´Œ¤ÏiB'Ó†•üGJñØOáØûH†á¨mJP0-û™W;»¤ÁÅx´FïM©HzˆÆñŽŠóTë+\‹hø“¼†UÇ ×‰ô((]®êÜïcIϱXD-Bx¢á%nø‰õu“¶®÷Us ¸^KVDWpQ]'ê:Â3Æ¯Ž§Íb±]¯ì4µÉú1E+#’ *T´˜¢¾«Û"·;«ZJ•"Õp®K侩Ö7D$o±}Þ¦ôÇBۅ͉Ç\¸…’ûaó Lº‡½Žc“×–¢¤í\“1ég3ŠàoÖ(e­¿…€µH•N±n‡JR‹~¶D"4;ìq­{X^q‰OvŸÚÕéµ]s»p•Â-’Ÿñqä~%€À!Ö¥¯¾Ø==»Ùùíßø•9ß¹Ý:7,³!3ü?÷BXòPÔSjä V*²$TªÞ(†ë¶àŠI†¥AÈ]ï×`‰àš{ö¹†eof5’¦{£Lb㛀 ³¦s©MÓ¶þPh:fšÎrxÕf)RQšn#¨b’Âkz.CéröÙªðˆPî]ÇY Si«ÃEµ8eÌ$辩?ù•¾|?£>Ç–˜×3,Ö ëA‹XQ}J³I[õACÕÄñHÃUrG{&e­ßbI¿|ϯ@FëCõŸñC7aÆ…1ËÞ`ñ Fö=ãÃX×aB.ÂŒm¼.±÷>­Ê†¯°¦7É•è,ö'ÂNgEÄpšœþ滆¨>Ã͈á¡f°VˆLó$ä£AI–˜_áZMÃkË>ïãHA¢î ¢ÎAØï«=nbÕ¿éÜ>dŒuáC¶»÷™4y¢(sßË&cá±Ô7ã#8#Ì6f # ]5(¡óH2Š÷ ö#òöó '8¡–œCº<¶k®WÆ>}Û…ˆÿáNçU"ÕâýMB5DÉ÷+,1þHð"H„R-<ùB“QsôKì{«9ØÒ.%Šн^O¦‹ª8Ĕٗ²i›à…0²“Ÿ©™.QðÂPä•è̱¦æ|`€ª™FQ|%W™é48ܤT[Ô…VáP…a¬6i6%˜3ÍÜKË,Xæ4^ÖAyzj™Çʬ4ã3Ï\È[¶ ¸kÀž„ì°¾A»Ç–Ù.Ë1ÓìÑzÅíDéŸä9²@B¬¡§t”$ä$µrJ»ƒG¤µ“\®Tg¦c°¿†áy?qÆFœÖnáQ#q\¶ Ù#mUîF•G¢„þÔq†G4¬õXhns à(nÍ%®‚Jõ3ª~óÞßÔú…Ûš8i®ªÔyI5 ÕÛœbîÂ> hKۈΡD­h3ôŸðð€îk®$7H¾÷I=qº½à’óñ a:‡ÉÎÆø<´Fw/W¡/ï£QbÊ&8,@6`n#R1Òó#Ì»ž”æ÷‡Ýå99öõÚÊ¥Ø2aHÜ)~…E¿½('\’È=m %|¹ »Ü†Îm Õ§#˜¾Ãƒ&:<E¶èíÈMYæ~óLDúV=-xœ:s+ú§Ž¿„$\M86Ñ0".­ìH~áY¹ÖI©ž}•O¸npb /±X€˜Âê”ÑIˆxÙÜÙËM–k¯µ`Àö„Ž5a7!¯¡‹'‹Bâ  nh¸Î%2Æ÷Mc&fžú¥ذEŽvO@"ÑŒ³-NëÔo”¬À ãצžc©•¥ö¿â¬A@ÃÛ®Ü<û5e6Ïi“˜cëkÅÅùóÖ“FëM$"i¬Ü#©¥UÜ>Á‹hX¿ßÒ’ÌÚÒ$µ]åª9Û M1f÷‚vöÆ heèÍQ+6Ö…ØŠ• à©4qŠÿ×: ‚Vòªy‘Ûk5НŒ›„@öw A[=ínƒTQó+€ •¤­ì‘ˆf¢Ö&äõó@Ð` / @ ´[ƒ Ü9 ¥`„Æ@hë1´Â>Æ7rš+ë ´•°Š ´Á¶íû· ´· ´· ´ÿa<%†MÌÁmfÂsZ jÒ½E5cÕ@õÿG°Ú­g÷°š0|øªT’\Ë` ÐîšeF?¥"d0ÕˆXdz襀2ôrcÉ5‹¾|ï—û™^üãA]©x‘ŠÆd`P.µƒlýŽRŒ¢Éý{PWî?S±r«I¼thĬ [1” ô0S(÷’ÏÑW–&!ú*•úê@%÷å ¿ü· ¯ì uv‚£DÞ˜}‹c[N¨<ÒD8ÔžÐé¡›QE`š¹MËPƒSZÕŽ€Y( Ø5²a}ƒvË–ñšå˜ÙöŽPJR¸—+¾E)½9äJþ€Ø$4Ó¶ík‹Þßo} yiÛ–_ÙW>jÚNº if㢇Íà™Mï{£l¶ Õ¶×ÔìûŠ»`§¯@söÆÖ5Êà ›ÿôþÀz«†Të;2q(s †bòr(ÀekÔ×ý fýMïÜ[9¹9ðu8@ã´p"Îç æûºÿí¡Y0 m¯½Âá×ö®Âm¸Aäü[íBDwÛùm"©¶L{‘Wö"Dß§·¨¶ìE€êÇe˜å[›Š;Ðõ›¿ Ò¦£Œ•ö Ľ¾g¯oŸ£vľÃÞ»B÷÷m×#ñæ1”:Ì[ØÁ\>DjÛÔl;ÂûN„‰M&✖+>S¬\Y$¶µç"Ž¨ÚŽ¸ ëGzîÅ9 NOHO¸ 1 qhì½N8tÛÆ*q@ˆúÓ­'„›}ÒÔh¤H~‚%E«'sB8.¾1 8‹×Íè7Abù"—Á ßs©qÿpW÷°G`Ʋ–RFJ©8$‰D!Ñš ¶Ï’·@,]€:î>ñSÙµvÌóïž9üÙ77BÁѧòÔ|ú=4?ûæ6Y½ÇòÔ|ú=4?ûæ½,tŸÊSóé÷Ðüì›Ë±{,OͧßCsðsò-îgÚì[©|‘Ë2ûV.µù–­_j7–KßÊ2xgÊ"¤¢„¾Õ.ƒWÁ$APÁL€2¼âvjöí!z”*˜J[Ã+ªÄ9`£w àÏS{#dyŸh(;'+6™†r/ÍŒGv´Pv®2Ó“¥¨§Tžôt˜«d_&3빫©°L„À2ÑQš-“™biƒ•ÊS†,¢¦˜Â:e†ˆoж0A «ÄqNvñZ˜¬âK‡Ì/8v”aeî–eô×`Cü(÷=Ʋ¾-‚@ 9ÀšHªìF |`M¤™´óHòJÈ¡•”c)r0ùíѺ-dÅÓ~[ÿðXÙú·QkŸ…²äðú×ÚÞMù¨Š_‰O ú5˜õ»PJ$ŒNl«¶¡¾Ÿµ<_M‹kbI9mëãv5~yr,´Ó@¸ý1Ö–ÿ&•»Ê(§×bo±?ðÙnš5lhm7ZèĶÓ®ßD{ [¯r[ÏÄý#Â÷áƒðLß«N«ÄÀ€¦½`3{Æ*÷”¨K~DŒã!¶O‘ðÄaXÛ÷VZÞOlF-¼ |y+¯åRafš>dq‹Wb®1+⌰e»½¶{¹ÏU[¼¬JèxÉ1¹”fN·$ùØ1O¹ü'%ëú~:åzãÙ¶m7yÃFxÓË Vü†È¿MÇÍígjÇœ»}d ¬ÃßZ§Í:Äè0#ân,q†FèîU4éƒÁ#°y¾p¤±ë•œÅìÊ·8§ RQ‹øª~WÆÀ¤D|æ…H])W‚K³õ‰fåÖçÞ§FÄarL¼Ú°òúΚ›¤sG0+ÈœúÅ]*ž6ã7ÚרäÝäléë¦pÅÝ:Þûz/ùµÑÕxDÄÒ²Ò!VD¬¶œˆ¶]…&³ð&àî„®~ª;Ñ^0Åäº/H§ZËoˆj»¿'v©=°Ž¥;9ÀÇUÙ4ãq·Ù™PEú~BXù±\©¿Þeåim?è1-´|éÖm#Öv•zÛã¨uçi¼TpË[[ˆ´·!—b‰¡åúкý»s?C ½ ¤ã–$ºòƈ;XŸP/O™›0|W²z]žÛ,+Âvê‡að€yï[‘Äåû˜ÔvàE÷× š`;¤&D Û À Ä÷P0D‡èð%ž€ÂlSý2 §íuèµû£$ÜcåF!…i»FN|ý¦ÍØõ+ø+~I¡•ÂNŸŠ3‘.Â->=ú/8V endstream endobj 63 0 obj 4857 endobj 70 0 obj <> stream xœíÛ’µ±òz¾â¼…\v¬Ûh4©JªB U„„‹½—T¹Öë †5ë]l’üV¾ˆGà+¢Ñµ5ÝšÑÌž€‹¶tZ­VßÕ£ÑÜYÇÅ‘MÿÆ¿\¾8ÜBϨíŸ_øñùA ¢ë½c§‡£ܶ¸œúnŸž̨ңð'n„N¿qiT9R Îf.¾9*&FG™ÒƒíUÂØÿk>8pKí½ûƒ8¾s}øøÀ:5šcñÿãûdï¯éäôC ÿ~ùâøö¹ÅÊÕÑRÆÄñü©Å1Ž£fžCü(ïì¢c¹`Žç/oýíWçŸ,%åtþøðÖÅÔÕw½±çË©G[F ¥B×kßÅ´EºžøqZY°Ðu5u‰nÐ<QÏã€Ü¥KL€<, 6‚ó:áxØ#¼”ç-@Ätqãl]×xà«©Kv’qцWü-"ýEž3«ružã5ÿiê:Á„‰¨~ãÇ#¤šu !ëìü"ÖÅgòj¾Â]q æ²NúKÌÐk¬y¯1Ô­Ç>2Þ÷%v(B¬Ÿ¿ô=б1Ž{×c·V¤eèzà»!tý}Ìä?O]Ñûd޽³dhŽÚºÍqвŸiõ$—¸¸`Vè½)Y»žàa½£âD û£2€bþŽZÉÕ¿óÄK›ÙǤ(„¡Qó°/0TΦ’û)IäàW>ÊiÃÇÂ;yUŠèc\OðŒÄÀ+AXdkî‰AMpUŸï¥Ç4ªœè¼ ÈÅǾŽ+@õš›a“–|]e½Ýñ¥ôöY©1‰\÷u]"t¼¾ ½Hü‰E ¢ ¶;Õ#è"TpSˆâ!v8?Ñ1½”±oPû{÷¥!Oåöz:•Û›Þ&­®ô^w€Áˆ‘mâ.<5ð4Ú#Üu…'é\ÄaD‚.âüqÂ8-LàªQ %ެçSñ©?b¯1ñ ÄùÞm¬ÛW¾Ä¸ˆ3‹„€n1ë ôÄy[‚.BfñŒÄÁI‚®Þ7ÀÃè® ¼/©'–flH‰¢¥Žsû:†5káü&¡åm*}JVW‚Ãq+~NCÙzN—‡[=§W^w蕲Ln~Ý€޵~Ü}Å>ÚŽÎg› 'ýÐ%Ö%ÂË]¡qÏ1rB•ªÚ2/#,G×B-ø¯·JÛ#Hý~¯ÕϱC\—uÓ[æjÝÕ®0šàah×UCƒ~ Û?1áMS mË9ÚR‡6›ºÀÒ A¼¡@¼ÇÐö&¡8„4ê&‹´ø6½LÄØ†}CµÊg¢«µKÖ¯×4½²ô»©çLŽlrÛgbè´ëþÇŽÝ/¼ÆÝ–4Ùa2„½·YfFÝ3ATwóL¥«­+ œ‘°÷S¾Ó³É5m°m'²Éd–£o0ɤYˆ9uKØ s¿«cZáÃ☨HxzWÇÕyw¬"ò?"Ì!^w$ Ni§|c°MB„ª¡-jw=³'Ù%]ñµ¸ÔQsJ¥ÏÛü:rÁÓ3%­i‹ã—Y pI±$‰˜I°‡ðÇm93!¶g{U€Ø´•Þöœ©ô`ã=L<äù¼ã·³æba²¶7Á ¶×Šh«»ñ«N”U×ßc‡¸v¿Ç~Ê][î½;1mÛg×½Ë ï©Ä䧪Ðòæ.Á†ºØˆÌ!pß0>.Ú¶_mVü?¾úa“}¼q÷<´% mËþ«9ÅšL†ÒVâµñ¶û'v.HjôdÃÛògªçV÷{[ ƒþ[Òn³¿k=}Śц~·%ýðæLèÊîkU$¨o[±ëo»„ÀE¨ ‘‚}[õ+…ŸZ®¾ÇIÞõvƒ©Ýî±ZiãĆÛ=ÈgpA»7Å'OOz¿G9Òm”ΤÒÝÀ잤—*0.iu›ö,dË€³m·¾Ô¯IAjçÞòxªQga&Bøar­ócûÚs¹Õ›\^I€]?ñ0pTÄÃ4=ñ`ŽÊ3{…¡n«þV(²RA|ŠÉ¯­›Œ8ȳ¯šÙ¯ îÔRuðèp5h{ŽÖVÓØÓ÷äªD@"L—i[á›ÀEÌHXs[Ñ™HeˆÓî æ¦jØJо°a‹P‚â‘/¡&mùç†-àžê±Æ7iNF¿DWô•Œ/ B%j•»—˜®6`/±!'Üqë3…• ç”N‰ Gh5…Úê¤ÄcŒ¶¢QØ8åsÒÝÉX[•ÀENéº /@ð‹amõ5¢‹WI Uø•¢kH5a¦Ú¶ì6RßpqÀ ¿ ŽåJæî²<ñt¸fi¥K#ò€¶\g÷Æ´­¦»[;o|$8¿û1™{C¿<³Ÿ;¶•ÓnÖ·œvà;÷}[Nž.¥Y}’ÚÆ÷ú6‹ÈVB—ƒrWhÎ/ËðWIIΕ¿!C0ž›Óý¶CJ™±€˜n¶ã®§qb ÈéJ‡ÂˆÐ›E‚ˆ(ŒC¡F¸ŒØ„(DD` Ñ÷EhB "¢0ñ&0:¤æUj¦Ö8hµÝæà¯C3]c˜_©‘ƒùcS$rä" N+ ºä4iBqÙPßž®,.lºàÛj”3ˆ,jß=ºúÎöixa[lÇ Ûî(¨¬)YpMúd£“IÒjÆ)dWÙJÌÜö i©·ed=WX¯ÃlS‹wÕ-h€jׂ=®ÊÌõ«t>ЕpÅ‘)U,ù 9‡Aþd®eÊ PÍÔÈJ= YÑÜ€vM+}P¦cƵ}WMñ¹ò½¨~ìzq´AfúcŠÑŸ„„|å&¼¦5ÚýÞì­`øñüá gx\HÐ8ó×»”âCQ+†÷¨úôvñm¦|ã +®œ)¿0)ÍæTÁ0 ·yG¡žâ®Û”ÅÉ"¸«N>Ät"\¡£dºÎ‡‡˜[ãŸ`ô.Í1¼CÊC>Àr½ÆËt J¦W뜀k$¨'ýÏHPdý ©!‹|•PÚòÔ¹ §û*§v :B,° D:o€©ËÎv‰»®+VvÕ˜~fe<}‡êxÆ‡Ž»þŸƒñ´G(ðÅ3bàÃ&–ÖTÀ/ÕqAo’YCÁæKOÊýͯeÿIØìëº„ï ®"UúQìùêÒoE»þ3—ËvÌÉÚµ«R»&lŠÐ’×xÚG Q¯®$™„t¢wr)º=ÄžžpŽÄÀ6n Ýؽ «Î¦®êSlÃx=M|É"l IÇ}Ú°üÚaøN¡²PåàVŒP^# Œ)ÐBcL1ù®S\…bú> stream xœí]Ýrž?O±Eªˆ8«ùÙ™µª0©€­¢H€¢„%Û RlÙ2P¼¯‘·ÈeÈu ³?sÎìéoW½«=ŠV:¸ ¬¦§·§»çëîÙ™ÕY"R©Qþ y|º8[œ%™PEõsfóÔ$™rþ¿VæEjó’gï¡ÓÉ{Ï/Dš.iý7ù=¤~íåºT—ÿT¢ã¿?>M~³ï¥Ê,‘"*ÙâeEaE­—LT&Se“ÜÉÔ¸dÿtqçûû]x)™Ö%ÓþáâÎAI2©Q*PþVR¬ŸžÊ²†ôº& ëE6¤£zœÍ<[C:)I*Í­ L ¡6ÂÊl[R¤ÖˆvJÊnÅé°¯èTŽ9Làqaœ"oHÏéÀó’¤S-¤âŸÑÿ›¨~F™‚Í…ÒE·Íéœß-)yª„rAÔ[õ8ç”Î6HJénóQ[ù÷¹õl^QRh¥îVý5èsy¯)×ËZz!¤1mé± i|þ¼¦dBa܃Zº_EV7¤G5)WÊ×?¤F~¿$…õhVËÑT+9^ŽÖCB/ÇÜj³Õ¥_Âäšõèn\Û1éˆlæ[dR®/)øŠ’* g©pÒÒ“Ú虓Y·ô¯¨¦ÇT-À”ŸÓçD­g,k5s³àŒÕ¢µºêµÝ$`®ãZy!¤’óáy¬g2™©AÞo :s*(šÕL¹U«UŸvûb=î°Ó;±Va¥:)m›Kĵå„TylÌÀ)µ_*닉K©Êâ¤ü‚ºWQÒ:I]Þ5°­Jx¢Ï5Aá‚’®Ì)JþÒæú¨^…Ué€Úæiͤ­2%°`üÀœríQdGH<ØO>^ȤüSÖ£áoœÔ—RE¯Ix¹ÿÑ%¹Æ¦üLÖE@Ð9[¥Û¼-m.ÙpY•ë¶‹c®5N«§¿¥(é´$ù¬mݪ¢xQËÒ*ðœÐçÕ_‰föK'Re|°Ô…G¸ŠçŸM¡`U±™ Ô Л P¾XÉ;™¢˜:¯«±P¾4Å‚¯WipSÒ1_£–öJVˆ½©Mû.©]®·ñM‰&…XUZT˜cåÔ“´SÝö:§–ªþ‹Êê™P$«{B±¬PÑZ¹*CC ¦¤ süÈÓþ¨3â.øªVÂ:Y\dUãÁi]¢ƒ@|OÈõ&°€#:0赦Ü[¡¡Jþîqðÿ¯‡‡äxácÄ·Ò‰ÒÆ'Ú<9]³þé¤úÉáÊŽÿd‘éj#€ÖüâNXëѦ„¸5Úº·¾¯È\bµo(j¸ýY=5#¤k­r•*% ûªÍõ¸6fîä*Я)×aCRÒ´"­Í•PY¿¤J¼ê¾6霒^v„{[‰ªêi¹Syˆ…wªÂªt“òl˺³;œ»iƒªN­>ûB ³v¤êU5X[©Ü¶­íq)³nžÖ~ƒr½Û`­òÂ6”ˆâ‘·>¬+ #´(º­ý”Šös.Oé´ŸQY•%–.Ks“7Æ™¨3¿e© Å :X›·X½†¸)÷%ª‘åšs-+öG#P èB/a äA40,Pج’Çc#X¸’§*x¿$IQvm­w¬ÄUâZçr½x1B$ `L‡"U»<´TYá«xµZ3@`EÖ |~§{ö óòÁj¹ý)+.Þ¦âA\”ÅÓ LèT žö7TÖçw«À(g»>§þ—¼£Ó‰} ¼ ‡7ñž) ^) Kàƒ÷‡%ðØ`ÃxdCÞú v;÷ªå›Ùz—Àw |—À†pxk^«ø®R—ë]Ÿ2O™&yç3x¯(ý‰fÀ?RRg:žÌMêÖ…y L À>ïˆ*(|yØpËr©´HµÜ½³št ‚#e£÷š€Aé¦Í[©h ¾I ‚xØ‘¥ÁŠ )B /?Ö8/eóN•ñz‡-×¥[ */¦yGî@AËÛ±åéÅ;‡û„>T¯Àµ£1žWÙKð"‡×_8M4¥^¼Ò¾GüýØ¥OŸFâAßs¹34KmUªm‘,•¼> wÊc½ ôïQY÷èy}4Àd ¸AHà (=~M³ßoKR»½Õ,ØG[%€^¼ ñ0ùê3\{Ÿrû}b(Îv•ØŒ*1гòŽÕ‚~SKyF9›û:·±À+‘OvX4?,â½Ìæ}Ôwˆt_·è½Œ¯ÄŠbW‰Í ×À­º®Ý&\›òèM­×æÕa¶¹~¨§ <Ñé9žÁ/“yû¼€kôÚѧe·¼Ä<±zw@ê<ÎêWLù«¬&iuª@n}‹²=opòဪ ¬Óõ…ÏÖ+/¾x60.÷íÖ6iFßtαQP6¯\]ª¬˜ä:ì÷Ô[y©=rôçØ€,ðÖÜrä½õ™#Ø–æá( ñÌ ÂŸ·7âó¬,€ɼ‡ž9ä4õP&¬Þñ~p p4ˆ€°¶¤ïç|{À­ÿ‰ÃÀm°%x'Ÿd@U è·šÐö¼&g´%F_(å}ò‘w­ ä59¼¸7QGƒ&ˆœ®K9ÕµÓ’m–É; <z^¿1e6òõè_[Äûl)@™Ñ›] äx_ü}*â6Àèk^ 3}¾ øDà½y]+å)wyJñà’0¯/º™û…mñõþ›Ö"•Ún)SóʈÑ×}y-~WcºÔ¾èÕ&þÍ •Mª_^Xþù‘ùjendstream endobj 82 0 obj 2842 endobj 89 0 obj <> stream xœí]ëŽÝ¶FÿîSôG›´=ZÞ$Q iR mŠ&öÍÁÚëË&ë½Ù›ØÏ”Gè5~‹R")Îh†:Ô9»ŽÝœ ¢ñp8œçH™«•¨¤Z‰þïøž\\­ŒPÝðlš¶ªWFY÷ïF¶]Õ´=ÏáýN®>»8øú@T¦³+ôïÕ?XêN®­tÿ× þ÷£ç«OœTiVRTB­Žž8]×5Âë%WÊÈJ5«Öʪ¶«£çüóãuÏttrðÁqOª«Z©H9ï)[ž2&n£â¡Ë¾* UÆ^]6c‰ðƒ¬³Zµy½˜*»H¯ î`JS«~,Z6³¹ z­rTÝwüº²¹¸ /9¤vfŽ|ºA®\º±ö“Û,ÓŒýiab³¬ì<÷­2º)(L‚0ÕðMQÆŸP2glSV‰˜.³s>6aÎ0AÂØž14£³®|[æ¦ómë?¨Ï5ŽkÊÅÕÛA›8üS“·ÛË«þLcH7nw1°mcHZ7ÆexYWSy»¹¥t©»¶þg¤\µfh¯kÓ¿8uíõï&VÆÍx§0÷{ÜŒgmL_nƒ†ÙŒ®á7¼Zýä~½ÿÝýó½ûçôÀ´ÊªÖVõŸ¢ž(c œ<H€ÃÛ¡?7­^ÕʈJBŒN€p "D×b!‰9¢ÀÑ‹0]]#-"a‘8‚È1ˆ°["’ˆ‘#Šƒˆ¦Å¶ˆ„$bäˆ"Ç×WNŒ\™Zu£˜ÞI‘pŸ8ð‡§gÿ^O§·7ÞçŽÛ;¢Ê´LÛ+ÛI E| ³&öB5¼)F-†¸":lXKÿ¬t—|¡@˜}ÌHÄ‘ÂʦsÅÉQãŸ{# (üsÓtpƒƒšVFã.£ûÌîîL1•Ü+K,™ò{ ZdÇIú¦T”lnÆ<38kPj" N²*d¶_ ®Ñ„} úÇ]c%î Ærk¤F#®z¸†IÌ3­s("qÝÂUË¡•j•ƶ0,M'p\B Ìa@ydâê–ô˜XvËËmÜ ëþ5ìªÑÚmÄékjW«[ôvÀ¸íU¶±;ú{ëúC¿Q¢Ïña6FbQJ¸¼»½Ïüæ ??¦_„í|›~D¹˜é×÷K¢(óY Ý‚0JDÒyj°¢}×ÎlU׺ߒmÿ’3þŽÆŸÂ/¼šk7-…¥3K~鵂ŸãÃŒdÏ`–þ2út‹ç;ö¤Z¤×ÌשU–9ᢒ®©ñÿg]j¬—†hu˜5‹iÄ(‰‰—Ü|˜´¥#òà üå„®ï‰=J)Îøæ”jÎ,ù)ÕêCap¿Ô$‚o¸ÈnTSçÝL3‰Ñ}KÇŸÐaLì1±±HWEÓåE½òJI¡„·U,˜ /éj^ßDøß?è½ÃÚUcWSìo¨Ð0™²õF‘+!u·e)µ0pËCòåZTAÓ²‚4W@¤à[w´õó{80Ã’4œîý·Yž`:äË´q¨OM›·Õ¢úI—TU¦äà›L[´Ö®¯Ûú7T S”E%“,4ó#'[ÇfÍ’sâöU êT4nI½¾¨Œ‡2n`–œíƒ\Žé6.ð_´ŽÍ8>©õ”ÆPY{–or¶ìÒ°% ¡WÔRhfå*Ïí•d×9ùªuç ê}ÆÕÛmÈŒ%~Ìö)«(@˜*÷z Q¿Åøù NüM‘Voí¢D+@a$1u€éTÃd#djI+D«ò‘õŠ†È‚Í+Ê4^å¯\Lºm¯¾‹,‹,¦þ}—Í× C® w½_eG¤^Ù^Ÿoé74HÌÀ|LgþÆMÐô¸a QrŠ'}«U˜éÿ6x•±ñ¢*\Ðþm茿ý€F$³–U¨|õ)*Ýàµæ Uz‚1ûsß´F‹/3y°q?ž)œŒs˜dªóÆ"–ù4d*x‹ÃT§/=<.tDIß~ØÓïk;ƒÿ¬µrKIßœ‡¹[ôÕÙUšùâK¿3(‘°åÁÎ Wxg ¿ý38±—²̰¼“Þ#xƒ  0«ÚJ1—a° $“™‘Yö1%•iÏ@XßPU¯©ªeS¦êuIàäÁK;£! béŽÑqÁS3¢dÖÊvUíjÖºÿ&™*Ä—äP›|e€ð]‘½ ÔθjXù|îÌdF<€%øY¦C‘á‹ÆÍl=Àa @x¥›Ô”Ï8zøu7ôìF½î…–`³Ö#1ÂiÞZ¡Šh °? #Lbü@2¦Ü€dŒó‡ xfà§¾°tJ« hÄ SK_NjƵݣfæøn¦ïÉM¾Q<Ó†0f )®…¶*O*òÆdšïÃykh/Fü 2™žù€™Œf”ø %åÎá’/o~­CF‹·”_ï¤ËiÏèUV^™–“éŽÊô§žd]Õã/bFÖÖ‰0sÜ d€º¯‹”` =Ç5m.ð]åH‡9~ïç°ƒ2’™CÒ9>¢K¸GIhŠäZ„á•Ä â›1#£CbV½¦õäc?Ðlü˜Á ,³ cÔ¯è.È:Íf¸˜#%LØ•š(3tÙ‘&ªËóËŽÎ'3#ë õvY'^¶Û2¥(îD*õ.!˜:«ÄLK]¶–½•ÙúÌ-“ÇLD“Ÿ‚‹Ú(ÐÕ1aS¦S·™¢mdîÌêÌiÝÖ ô#aD#'Ž•ÿ¼GøëFt: IÀÈ ¯cad‹u„$bäˆ"Ç B*‹EB1rD€£¡:]£…DÂ("qcÑvi IÄÈEŽŽW ðIï¤H8KÓ%x|z*ƒÇ;q¯4&ó¤Çp¼!iã¬#{©Þ£C\6,„¥îƒ CqçŸlðYVþYªv‘¢Æ›®÷8š…n;…p彃ÚÎÀÓñ9žvØÑ)¦’{ËO;8C¦sÙq’¾1œÞ({‘ '‰—’H²Y3Dq±8šp8Þ,èwE”¸Kb1ÔX#í4qÕƒ5,Å#.k°HµSži!C1‰ ,38*ûà ,ýá—sP™¸º%=&±yW§Œ¶Ã5;ûÓ·ÚùšH…Óoª[Âù-Ã§ØÆjÑ`ü:ËàÔ™ÏÖ `…hõ$µU2/¼ÄL ¸¦®²"ZsºÏdÃ[Ý+=ò€d¢S”e8nÑ„×væ·h‹Ý‘Ïy€àöÐdàhòæ†W“+3Ìá%¸š*‰Á¯<£k.ÀtýöˆFÙ Â6`ⶨ¦éÊÎ ½¦ÖÜBKT¯ ú÷1q-üK=,©ès‚q1ƒüÉAÅÖî7uÕ™Î'Ý’&Ø÷Œrq™éîµ5ãc?^O̘‡±½¤ÁƬý+*ž oÚÆp1{--câ‹áÚLÇì}4Ã&";¨âK&XK‰¤'ÔÍdnŒÉógõ6Àj‡ê?Ÿj·Õ¦ÀÝÁ™oVÞç#86:æ0c‡Ÿ³F.9Ç÷æJ ô¢;#߈o8ú—ëB8 &ØHd<£ûkjQw fÌ&úŠ,šÛÖJ ¯Øáîós·óµzC¢3$¦ž2»|>Ïhћބ…ÿ—–3¦6ó†ÆfÀ^kÝ¿lq!˜Úø’CÛvñ%ǹ,ín¿¤ÎÏ´œ[ñgZ·–HÙŸŽz‡NGY×bõÿÛ’úûãCsù»y|ˆÙÕ6GRÃkã8Åþ¤Î[«ïäI ÐLÕéÊu ¥ÐLÀ>¼[wMŠ6&êðIOÂß®Áù¸óM¡™w0ÄP†dî¸ê€Ïë €$1Þ„´Þ;É Î)Ì  Èà;˜ Ë (Ì™­oïÌ_8 ±U‹Ð)w Öd/„¿tʰæÖ7 3pGI»b5ášß#¤)cÔݰšÏ»”Á»Ê´g@sŒöùœI ™ŠÀ)ãGf¹«ñ×F»meøîAžßÐ%ž1…)!Õ n3 ûcŒxäΰ5A? Ý¶H¶fÓ››¹ÀXÕ2äZÑõ¾Ì¿£iÃdåÛØ¸g°rJM®Ô„„eQà&Êýù€““ u#! “k*!G/ ¾P7F‰#ˆ€ƒˆvrÙm$$­Â—nBŽAD­±%"!‰9¢ˆZ#[HÝa[DB1rDšB«¤è¥ÞI‘p–\•žÊÀUNÜÄÞj‚®ò€£¤ÇŽKZ„Ç >©\ oŠQ‹!®ˆ›b ßÙ;F±I|g¯ìääî`Vþ¹U“»ƒAÔøçZOîAáŸ{‡NÀ²G÷Ë„•‹Ï+·£;SLµ88аrÎ …&'éRQb(,Î^dÃIâÅ$Â7ã¼#ö‹Á5špÇ% úÇ]c%î ÆŠ¦&·õ¢hÄUÔ0¸¬á"…åÐBc&\f`TöÐ7–â2ÂÊ-ˆL\Ý’ËÞVNÕýl{¨ÜÛ¹x } F¾/¾O(²c¿ŒÃ7œÌkVæÕó‚Ñ“±hÑEs鸒Wx‹î Üp¡Kþ;ïq}®ü´ãg¯=®/“º{\ß×÷ÿë[ds˜`ef¦ô”}¥ª3صx±è<’‡ñÍv ÄoèæÏÝÆÜTÅÀàüû—ã­µqÆ=ði¾š¿ÏÀ§t÷ð» ðø$D À\0»@ÑŽ¿åÿ1`¦+çoŠ,Ђäd>Ä2?"r­«4sëþÖÝ=®d+ɦë\‰­«¦v-èÒ+Ú÷`[Hãw 2|àèÿþVUûendstream endobj 90 0 obj 4496 endobj 97 0 obj <> stream xœí]é®Ý¶FÿÞ§8H6ird’¢6§ Ð,ÒˆwšÂp|½%Þ®íëÄ úN}¤ ¿â·(%’ÒPóQ{}m‰‘ âÎ gç’OvªÐf§ú?ñnÜ?:9:ÙYeºáÙÖMQí¬iÝkÝtEÝô0—>ïºÝÇ®©Âví.ùïîOpô‡·-ÊþŸ5ýÿ÷w^uXµÝiU(³»zËá躮Vž/½3V¦Þ5­.ªvwõþÑÛyçê×G‹-ËèêñÑÛ×û¡ª¨Œ‰#ú‘Ú-ÏX†NýªÊ0tÓÏ«­ C÷ú!S4µŽ@;6r·ÆÖ)&ŸP·Fë<ã|ÚW|)w%@€\œ§´jÂÐC>ñi?T¥ÒeD‡¯øGÆú Š2W¦ìò2çkþ¨i £LQ½ëçµ­)ílȘ2/>.+°¾¨¾vZÍ>'ֺ̳þˆ ô!·¼SõØcï”®ª;U!·Ï_û«Tç}â±;/ªË0ô…jŒ©£ê?çBþC?ý±ݱ<™ºcíB‚¥îØÔe5³ê^/qqÁÒ«6ºÉ'†õvVëuC‰OøÐ a[¨V×qè–ºmµÍcÿŠsz—³ ó`âC>ñ)cëŽHZ'‡Š98\U—*ñ.o¢u~ˆë®g^)mtv=2…y•ÕÖlÒ~Ѷ5‘QëšÚŒ^_äu1Í;Îj‡r=µÕºN‡(öMP/y"4vÈÄóä~ojW”¸˜¸×¦/NúW¯áC—¸Õi®òÜÄ”•HÑåšÈpLJ.L)F¿Z¥¤PŸy‡èj®sÙÜö@emªY‰$H 9_â<èŒI|ruwåHïú?}=ÿORƒ–Õ®›^[†„×Xg?»FÙ¢õùî>E÷£! 2€wf~ŧÇÚ–cVŸŠ¢yùXZ£cto*6¢lNøÄS?±³Sp¹Z>­elQO؉q•y¾a¿ßu…±e'>✂õŠÓÆê®Ê³zÌч*H+Õ.õ;>ñ†‡2®Èjòk "eddõ._ãC>ñ—ê“ÑxÍî[g¶tÿ~íþ½{dã ±ªUnmÍîþQëæÄ§{G_¸ç2ùÝTUCz~ˆ@XÛéäwÛ”»ª®†M^ žñ÷H€€x#„# f‰~S9­!<ãï‘ñ$FˆH‚@ $Œs×iá‰$ˆ'1BDb ¡ÊŠO„Äø{$A@<‰"’ = ÛcŸ&ÓïHL…HÔŠ*>ãï‘ñ$FˆH‚@ $LM,*>ãï‘ñ$FˆH‚@ $TC,*>ãï‘ñ$FˆH‚@ô$ÊÆÇ‹O‰é÷@‚‚ $&ˆ@‚B $œþ ‰ðDHŒ¿GÄ“!" qåèđѻROú¨Ç§{ñ)¬:@†§;Gß=`!iʯ>89ø–, z¥8¦çŸûà“BLñixv±Ã¤THxñϽë'8HtðϽ禓sûgÕÌÖB|Ó›™+ RâZþ¹R#§£ÙW'ÖÄ0žÏfú“çEWh(k†ët®£S–3Ïï˜%ë4Ò¼ZÎt>O{$G¥$«•3Ï“Éi´%9¥œé|òÇø<[ èåLçó€;FÇDçCø¨&NªDçáùlÁ†Äk|Öu 1=å½Dã³:*Ö<£ŒfEÐT°$ó“'Ñõ¬üˆ¥‚Ið§ÕE¢çY⟒tò{’×ÏRnL:ù=ͨL¿14W„‹ŽhØ?ž5’')wK$-¶Õ̯gå1-f§˜Ö·i5:ÃÃ*VÑÓ “ÖƒfF‹×Œ4ª§5^Z‘Í`XÕF#{ZeÑšHÏ`xÝ4î¶íhx·Iã{˜ü0AáÓZjâcãk78Œ¹#¯ºßîê¶ïT=„«¼ÿÜï!µ2ª¤[ÔôÀâ¦ßM—­n’ý{£ÜÌq³þ©ßµ¶VWeºE]9ü­œrTü ã…gÔZÝÄMxè Ucóë8 bË[œ•=/!#Oè|(kT„ºÁ¡ÀD  ” 9z°óÐãêŒî’FSJß7Cû>==³L<ñéQàþ1â}Ĥ{ùFºÜ¹bj ¦ÎY´ü}ébƒªv{íœ2ÇúC‘.¾ òku׿%óÔóP¶]W¨²³yÑ=÷h*¥›.õ”ËàGNÿ~Ð_mÚä@4KçÖQ5qá4>æ:xÌ­ ¬ÿ”[Àż(/*ï©L•JmJU¦¬WµnuŽ)Àx xF7ÉM€”ÏgÜ €=ç¢zÁ-á& Œºd9R|ÄÑ_ç±9ªŸ/S\@«`"0‡™e§ÂabÎyQ¾£2'‘iQfð`9y™VFu‘‰/ßæ` r&$þÜp€y}ùN?¶·•*¬3½)/0Õ_yËi«ëHð#^qN9ApéäX`cÀI.y0aˆnp¯ŒrÀ9€ð€ÔL}˃~¦tJ]ãÏ¡²Øê>`§™dŸÊåŽÈ¨öëŠ×bƒé•N4Ø?å¨b~hKUç ô \) Ñbc_‰,;_Rýs-ýäR.eTRï¾ 3Æ:Ȉ§œ)6íëj3†¯hC$Nÿ™Qa[Eï«åÕR7](0>ÁîDVÍ3Dz¢a”ˆ¥Âg¡ÒmãËꢳÃ_6}HCýí¬è`ù4D½éBÒIæùê‡Õ¦ ž æ ,˜Þ §lL´  @1ä ï‚ÐðjòÐ!Ø7ä¡¶¨Ê1Øþœ‡Ra3â Ë›ûzKg5VHâÀ”3äUÛÎïò¨ Ä\ámß|‡ºj0‡å޳eKz=yC¶Lórg[10}¦˜½QÃ¥«Ý^k‡až#gýVñ9ÒTÃUÂÝުœ‡,UѪñ)È~Ÿyæh+QÖ4!„®ü¾^TÊÙvºä´!C-“@’*Á¶ ºÅ…™MíDÅ !©ng08B¥Šò7¯9Úñ¥´\ó/µv°˜ Qz¥ë•{áåÀ-LÊB°èÆ–jaH|ò©qe… *‘õ òᎢ¿Í+¾w÷ÅŽjlƒ­4ãÀáÈåuwá ý>˜{=™;ÃÊÃ…îÔ¼ÕíRƒ)\D2C›ÓÆBt$•Ð5Nö7œ|Óul—»¿^Eé F:éçü:góžGCOÒ¥ùþäJhîœþ¬.1Ñ;ÉÄþÕ¤¬µKʪYW<Òòr"`O ‰2"âäz>«ÝD Ùöå⦸û{s˜–ûŠ$$€€l®Ø†·Ã) 9ˆ<[q×ÚÂÕG³ûO¤¸“í»>ž„Õ8üõháö¶ç@   '}"k–Ä"…î|µH3Ðà\ÊÀÇòoè·ŸHætHr{ã ˆÉùŽ] hC‚˜¯éÉ3 ˜¯AÖYl®çŒü”~%N]u¯‘Ë2À+Vë'î7Cù4¼üEwÖÀó@¶‘¤e IpµàÃÄvò'+æ”WîJ‹ p¿–ƒºè¤\¦8°·Péð[=+;È-•ÉóùJî§·ÏÜ´>Å€/ñ š 9×Ý]ý»!d›ލ'‚¢ò7™å†‚ÍÔ­«Ršs+Øš¶¨;× 6Pƒˆê0Äç öþg,ADEäÊžåÐÃÞA Ne¦Ë"+PÙÁj~¸ÒZˇŽMô— ÷ ,ýòéM´cf{Ó7¦8Û—*lE¹Ï¸Ës`M9káÓ{T_xN–ï,sŸÊîð©þóæ­ç*C ®KÚ#¢ÒÆos²¨é×rö>[š8+W(ÏÍUCo«±ªÎ_A“Ëñåä|—b¥jŠ¢jµÎªAv($9ÚÈ_9ZéÌç«]éüÅ‰í·Š—åPQV÷º­ ¥-ÝÈ2ö×ä#¾†…Mvr’?[’]Œ¾àôÎXÀ.`¥É»é¿ß Y¤4Ãß²ÔÇí—£tÛYÁoŒêf¢¤P7¼@šVW³2ŽN<åPÇaÈÌ>"‘Bí8®ßr&‚¦èwØÁÐS>ô˜&®sV‡D];(3ZãƒoÖ½KVýËÃßRsü¦‹6²Úª.ñ±Ul“6aõ:g5JÛ˜¦N¥]ÆÖí›)í·8ÔG>0¹½ÔXáÞã ö(ó€a_Ù¸e—ªËKû6GäÖT^ðeßá¸Iì[WâV¶ûÉ(ó®ÌïD¬§xÄ'iËœÈk‹šš¦0•î}®M¤¸l€5À0½h¢,DÁV¬—Ü8ÔR€$€*e¬‚‰C%­Uÿ7ÐÌþ!ÊÄ%ÎÄk!œcø’Ù0}H.c4DXÍihol7\­>øR”Å:°€¸C¸Œ ¬àÞrûm‘]¼ÇÑ»Q(_`A¿á¸ÀÐÁË~Æq…FyçFË–æ¼ï3æ>|—9–ó«áã1ÇòÜc!›ß1›¢pß°7m£ C@@‚¯Š M½n· _òî/ž ,…·8I0³ãC&_C}\5jEõÀUñ!u(_¥ˆU /¿ðßÉeê²°vì/È25Ø%€8ô‚ `çYEžg>åz8º¨”ªÍlAËIT‚@gC0ñ¿"òÚó‰ˆR>Ð(ÌA"ñ@/k§¼d36(‚R ˆ”ßäE8w«}Yõ-ÒêÍL¦¯EÒ‰ì@€æ@Û¨ åÄð"EoV€MåL#…º&²<™ÃÉ|Pì_sé€t?DJÖUUk?%­O%)´vK³cJ¥PЛ"á˜È—²àup³IÖÁþK–ÚeƒƒX£Ìhe[EYržÞ¶2a9/&€Ò¶¼e¾@¼{ɶºPÈôÀ¾dm™†Pè_v“Çñî!« x¹Ehuȱ@‘`Ùñ2a§ŠfhžVE‘¡ÿ€´DYp]dM¹þT’ÏÒ¿Êà§|èlÇtè :‘*þ·#TÒ…ÆZ[”FÙó0šï¹8hËwü§ÊÆ:¹°ôõ¨d XçeNñ2G/Û.Ñ&@ê\Ȧ„"h4¨—œMÿ)Jÿ¥áƒ/ÝÉz¶ ÊÈd®ðÔW\?À¶n?`ìL¶©vyüg@\ÛTûºUÊ ª%|-¨vys˜èA+A¶/úÙ·_+ß–u_eu¿LªÛjB$|PÈúÐ=(¹ÁfpèHí­îÿZå—uëFV!.ñ.Ç"Y÷&×sØ—n?S&kd2¼QÑÿù?•&w endstream endobj 98 0 obj 4928 endobj 105 0 obj <> stream xœí]ÝnÝÆ¾?OAô¢qКûÃåE 4¶ ¤uÇÑEZ0déØV#Y–%¥ оS+êu K.yÎ’ó-9¤ŽdÉ=1H›Ýáìü}³3Kú,ÉR!“¬úÓþpp²8[œ%:“eý»6Eš'ZZ÷_#Š25E5çás‘ÉãÓÅ7‹,Õ¥M:ÿMþGp„mªªjÚáÏ'É{Yˆ,Íd²÷ÊÑ(ËÒdž1‘H-Ri’Š4·ÉÞÉâÁWŸîýcá¨h¥ªI{‡‹ûÕPžæR¶#o«ãö'µn†.ýPfÉfhå×í¦5CÇÕL #ÚI 9lˆ[©M—RÀ]Ö¶Rˆ8ãtÙKº•#Î$ð¸v]VéÑÒ…ÕJU&TKþ Ýñ/„õ3:©•y&U—9Ýó£j¤He&mKêw~µRéÞ”*.>*+°¿V}v³›s:Ô.4BÅYGzJ-ï’Îzï©—™Èó.õP…Ô>?ñ#:ËÊvÝOÝy‘QÍз~¨Ò´ªN…ü§j¨õÇ|íŽyíÉ¡;t莅QyϪ+½´›küÑ)=·]„C+º°Ùo©…hg½ ³ÀÂs:TKX§™¦zå…®­Ðqê/)§G”-0 0žÒ…„­7,iÍsãp¹QYÇ»¼‰šøבg>Ë„Ñýð4֬˵Ðr’ö›­­lÕ~RaäÚëÓ¸.6ë£Ú ¹j=Õ aºC!õI³nx!ª56gá6¹_Jã²—BVÙIõ?2ª^I‡R«Tå±…]VÚ':¬i.éЭ)EŠ«”î¬gÞ!J#ÛIûT6¯ý$edÞK‘€Ã ª  ‡”­˜²Ÿì%ß,DRý©RÔö'nZê`Û8ئ¥¹ƒRƒ™MÏJ-y&lË·ñÈXje:€®S­…m™¬±Ú¡­ÍÖ™ÀOtáÊY«Öˆ~R/Ô©´ëÀTç¥K!tÖÁÏî­s¿03ªèrîçÐO*¬*Ûdîo£V‹¼]xégY­³NÞ”»Œ]va°ËàÌ:§²Ùo˜ÏÔ:µá=ñ”²ú¶‘ ÑÙ¸$Â…«¨²Ã…Í•u‡ª÷Dô!§”:×>ĆV>ísY´±7¶^¸_mb ç zcë>n¥k¼¿»Œ³è kw–hfY¨p³ÝY<ƒF«u"ÜdnÆŠ²ø¥µO‡.š”OŠõfèO}ö£¤ ÍÀ X•õu§†<4ƒpÙÊ3à’ìÂÄ—Sš¾JôM|3G”ÖI=Œ]G°ðmŸÑ ¯p™5 whëÛÍ_ÚYF¨,wv['{µJ0g™.CeÎ@”,ºÊ e~åýQº !›¹;¶ÐóU°?°åSÊ×[: § ÕÕµ¢L€…Ç”‰Fa"ˬ‰o(¦°Ò )Û;.UÁªŒoè‚Z `Ðú1ºíPt! îU[hQ^[û”  !`L+ÊjÃWn„-⬂…€¯/éŸÑèò<¥Óè6[ª`Ö%j¬PjµÆ¡+Ê==à« K§ÆT»¨·'įi°çm˜5ˆìqŸ±àó¼…/Y hê¥ë '5Œ"ÎØ6ˆXä•¿gñöhKŸ¨GdÿEFRÉö‰_Ry=õ³¤‘ek&{~Hk•åqòß? ¢àñÚî{û˜:ºäÄmªã @ÀãÈ‚ä[?TjZ›ÿÇÛÀkãæ;‚ú` 2=‚ù3ñ< OC-ºJ)@ùs t€ì$¼ˆ ò@ ÌšŒˆjÒ†­*{ÐÅPa©•H«3ðR¨þ€2yfã·ë"@™¬ ³M@âç¦Õ1@ŽþVÐäy<È¥€ ° ²[=âÚ¨új^ʳ®7Ônx˜XmÏâäGŒÌú‰åË`!°K°¡Xµ`NnþŽ¥ ¯Ix8¢!^þÈ¿¦Ü ’¸¢ÎG˜ØúþSêÛõ¡"(^-¦Ú^º˜ìrÝ`;Ó+V²™5\±úc5Ô=Ä€(Î+߬èqù¦«ÃXí«+«†½I šÒW˜ 7É0(~… Aë²Ïúñ~ÆÑUpÄ­¿r›j'IÞUó©žÄ;½>£ãš_ÇA1PH–&¡ÏH)bZl3R_;¯à8x8 " Í€ÀèypÇc욇¼]ÇvÐpÈ1 ÃJàÕ€/¶-0‹gq Q±“gKM)*¯yPŠ’,g~Úà¡ µÛ¼¤P òuì²’°„़2üìL‚wc& Ïë+7O©Ø@šÂ+É sïú„%9QÅÕ1½Ò<Û˜xܾò >’wm•GÁ¶oû‚!_ø 'žÇàp2\§(¶ûžÔY)ù ÌeÞ¹q@ÃýU^‰i¶oƒ£Q@k€ût!¨øÅ|‡¢'¨îŽÂË!gGCËãuù‘öíGÁ–NØ o/ßný 9@'Ðçž-«åúΈŸ±Œð,‚s£]K`ªÀµã:IbAJ 20`½G§É i^O E-`ûÇJ&åé¤üÚÝ"Ï7-jÆYý@¥Ü¥V:-Ò6í"^‚ žÁ»ID  ˆ—ùt¡ºk• ÒÍJxµR0Ä»Æ2íF×äã ïì2éF×°3 ‰·ÕGÔ;ûšËÇP¶›ÞB]¬’;ZëjäUry}‘ {e•WSQ8^\m]°maU1PãþÛn]wƒ¤ 6eX ÌYq꩟5’$ƒÛ^@~àúò>fFoЀãÂìŒ8vÅ¥»¡ØØt%µk\ “žÑOhêwQ©ÊmïÅÆÑÄ»g<ûî`‚'ÕøÍžÐrÀÂæEQÕ?@†,ð·t(o¼sÝ«•yÕ ÜN¯VQ´žSMƒW èie¾ë:qϿٷú'ð–BÈÀ9Kt„R¼yòD°WTà͉†§ÂÊ¢ÂßÁ¸Œ %XFt÷+]ËÂÖ±t Q½v4ù½‰Æ§Â÷&¤Nhft‡&]‹ât F«àÈÊ ÐýÁuÉÇÔmy…þöÔozߨRc<‘WÁç•ky(±Í,ž×îu°mpx¼¥Ë Ã-‰¸œââ'É0{¡Wq€#Ìîã7ð(\|ÈÿÚŽwôó×ỾñÁšdq!G› ³o½Ç ÛìzÛÜ^Óôw‘†{ààÀkƒÓ /”ÄÊòK­dj:÷ g;#‰>Ðý…ÑÔÖï/Œ¾Pp÷¶‰1×Ä0f´þr0Ìâݺaucú•ò¿•5RmkJ2nÊúÐW5¨´;ô•©t³Nªí`Ôî¨Xäõ„]ž½Ë³wyö}‹ÀÈyÍîXš“¾Ä®IÔߊ‘É?"ù³û×Å’ähላ4OTžå©‹a'‹<ßüv\ÿ¦•Ñþ7÷SýéÄþÀf~Üñâ[Æ—h\¬bØæÛ¶LüÇ9L™j›ä¸,~óqéŽYÙûl´YÙûn݇õ•Íy¦²Žª´°býÝ ×Íy§¢ä¿¬ÒÑrwáÕ²  SÊ×;:ë”Ó=®(«í;Ã!ßmì¶Äí‹-á´”>àœÎÏAù? »¤´ÞSZ`HèˆÇ×c*GMžáŽÏyG®uVÑz[Õ@å:Ëh©t— ½ü¾fÐ9±\Ké!5¢‡ôaOè6€”~dYßËú€ÒY@{À[½ï³žx@g IkÛžÀyv g{äùˆÿ~oz)¬³©Bß~ïGFñšÒš}²öb:Ø6  %,¿¥yëÏ,,ŸÏX Š7¿& íÝ(ÒÊí«€W3âѳ€Ç}N7†òÖ²Ìë{„60±d  [’áÍóz> —âC€ÎAê Ø6/äAèB†õô$ì  £Vñï::T#\!Êpü¿(|¤À±ÍÞÎ4Õ  ³dö55ƿҡkÆ…ÊßqÊ¥0›+SíoþÊTž«ú¯•]ߢëù=rÛ¹2er›Š»cê~Ÿ%÷¨}Ý~.qW䣿¡+K:$Y Ð2tȲ’/@+g¡/p¬y2~,Ì åæM,Jƒî7Èܯ¨¡ð d)¼âïÇYÄÞ° þ‡å‘@^Kºðñ…ÃUcШñ¯2Ϋ-oÓL€M€'‚„ˆô~à'}KUã0¿Ÿ`z'@ Ð ¯§Á+x ÔS†ŸJ,€°^¿vRÕ%L‹Ý³ëL×§Åío>-–ÒeÁá‹d`3¿Gn;i±ti±‹æw>/ ÀœA·”y°J Œò Ÿ3ŽN+BLf8Ð8­·M ›V_0YJqwló~÷{Wb¸Î«·vÅ>ÁƒF“S0k‚ug½¦CÍ» á¹cÅâKxI\Ùi@KV(SX SV %6¿׿ QméFÖÕØÌï‘»6hU/&Õßۢʹf€8}t ^6¹ë8Ö4ãw8¶-»»ïtY̾zÃÞÌFØ ¾}„ý®AÅà^Ü=ÝØá±úó?Ád endstream endobj 106 0 obj 3755 endobj 113 0 obj <> stream xœí]K“ܶ¾Ï¯à)¶+ŠI¬œâXI9¶«"ySå$N©V»«—÷)iùߦr’|ö8$g€é@ÃY­äµÊ*©€F¿»½ÊŠ\ȬèM8:[\-®²ªÝêï•jò:«d«W¢érÕôcî=¢Î¾¼X7Í+DÑŒ  :ñu*ó²å´ü3ºã·õ+:h¢y!ËÎMsºç?õ&—…l§¥~?Ìk[YV[ )K7ù(­Àþ¦ãk7»yEAÓD%J7ê—” ”ó®é¨—Ãê]!êÚ^Ýÿ¢Dù7U˜9¥€[›Ë[„5ÛÒ~ö—xL œÈO,s´u"¶Ê_zÊÒ#À=¢ø™ŒøF¿¤šøÅ'0 ,6x ]QÓ¨>¥,öÃgt“€`ÃT›ï®)[Ÿoœ‡2xÎ&_RêÐ/MDHàê¼—U£òZŸÛR”y»‚1Xí®-åô¯¨Šù†Ž:èAm^T¥gë@ÁtɪM³#J Ê<ý U0¯é!­&¯pÐ4ïXÖïõ†=ç˜nÈãX؃ã_ä1ç$©ª*:sù f晾K‡õIñM¦Q›Óp{QÒ¿cÉ2ÀðÒ Ä ƒ´†¡w=Þ/|ìæ*s”Ç]‹æ„+‡a¶QŒæÖáæñ©Z dïñ‡ úŸ;;çÑÑГ#q /u”^Ñ–M³+ò@Šƒ!„–%^Ve­Í[g˜·K‡ó`K êŸ(Œr±XÐ×:§ŒÈ;]Àúà‹`nM¬©ØLxÓµ<§ä?ËMîz-¸Gâñ¿|‹{to^pÄÛ£+>±A@#ƒsL–^N° /Ð2ð¢¶ldhܱ‰y²­ÿ²vÍÓ†À^%ó%@¢dÑØ€ýå^`‰æ´É^ö€{ö(žP˜î°!`¡Öæáeœcé^þù`#«:zØÆF|yÀ€\Q¬eÒ]Y@h"yQêÊ\Lj;ûR~Køéfœ©@Ò4Â.5Ñoµ7ßje§gó­‚·›oŒv©+òq¸VÆÉº}+s"/ïëö­ØÎ¾U4_$$ÝcdDvV$«£H•W¥EÞraž…‡êžrVrcoA0?`ë·÷!X𺾠ÐK²•˜Ž†>…¹(µŒYeëQÉ©¤uÅзÀê;Œ$ïl¨àiĨ#ž`ÀÅLáJ$‰•È6±ÿ•‚’Ã.f%,"( ºI{JÜ´sö‡Fÿ¦DNʦð•üá¥Á̺µ{@é] ôc´vŸÖºåÚx˪‘yÙU†Ê|Öãé)Yyv5§4¯8ʨÿÛ_ú{ÿ¯m®ªrݤ?2·ëÁÁ³õ(P_ ^ü øÍÓ)bh’¨0ôÑÍ\Ðë%u" fv`ïª+Û>¯<ì!ŽÄK•€è7A;ØHá¹iX>B•Øæ)Íú›“@ivÎjý%õ+•W·f8îÆ;^m¤cå­ö·èÚõ%#@Už²£Ü "LJ¨ò$ `Bn—{ÌÅ«eGG¨]ßß½1^`ë<‘ ˆÃå‹kºðDxJpâhâÖíí˪ËUhƒ] }è&Åâ{Úk§]0G=¤vt}9¤Ûì¬ -×`Ñ]& Ð.Ï3…Ìvy_“;¯…Ÿ³Òˆ‘T²kÝ8»è´Íd6+N-ü­l¶bÙÚåŽ?tHƒ¹ø§&E8(œÐ-®» kMúVm¬Å%åÞ¡¹üSªæ¥Ùj!]µ_Èþòój jh%‘BjØÚaïyšý…@uóÊ%¬"¯x\Pä“+Ÿî\G@kƒ]ƒ`ÂÄDs¼r/:r¹Áa2ª¼”jçI±Ç¬OŸÕå »ÃPf%K)´lµ/Åhã]‰î $Íèï#ËK¡ƒj^T±ÞìTû™~ñ =§/Ã_·äº8/ÛP©­wfºFqá%XýL΃ÎÙæÁëòæJ7Ú£xÉq@hçÉ£Âÿø #¼–$°¸G•.ÏÙ»í˜y;æÏƒº ›äE2í]ù»”`|ÐðšIòR‹ÇFÓ–lpºÉ]I@$ç¼K˜|ÿ/¹šVù½Âq…ùd>¡X£ÃËÿ[ëö€|®ùxî¾Ñø'P(L¾÷±Ñ9*C@Á¾K iÁñn%÷xð´pDÇ~̰²¢”h)¨NUÑ€„<ÿˆw‰œ#å1Dró‘¿§: žÃïŠß‚ÅQ°Å¯(¹NÚÔ¹²î3zœÑÈPMʽð£üwyÞÐW£"Ú´òì*¯ñûþ vf=Õͨ†ž |q(ªßÜPrZL|CˆçYƒnç=$Œ“û˜ã+ K⎛! Oþ¡¤TurgQB†Ý~c9ú©3À&¼ž8G/+¥ò®O¯ÃØ/þÆVÞx •üœÂcŠü)ñ€‡ŸœˆsG£ñ×3xá"/6LÎH{ž•3˜6¼hÔŒITnç5ûî)eÄz5É¥+^mÄs€„Ÿ³ìán‚l*KÙ7YÒ™xî«qæÁFeâ7èx g†¦„ôpÎMx,ÉqöXæ¸í±Äõ„Dx,@YiCªµNÇzÞίëºÔ{‰¼ïÇ‚iÌŸë²Ç“PÇñŠÄûu~@dâîŽ TÊÜErI)±dÀΊÏ!Än/ÝÄ 8Hàån½>€+uØYäR™qçG׫U½éŠ4¶ñoL&»£¼²$P}À à)Hq‚Ì”¤ä‡A]Õ¾Õ *ë¡w`‘?öpû~-0‰¼›J<7iµB&[ïéFÞ˼vˆ]Ëa=ìNŽ|nwu2>1çÛXsv'¸; ï`Ý„ëä¯ä7qxuÂÑ3ÁÚö{ ¡œª;ñh’ã©p> stream xœÕZÛr5-^÷+æðD-itá È¥€@‘d ^RE9¶ƒMloÇâø¡ä/ÐŒ¤iºµ«];âJÊÛéîiõé«f/ÖoXÿ98[\,.ɸ>K¥Û®‘ܸhÛ*ÝóÜy \4wW‹G ÖJkšìßæG’úÂ)6­èÿ ºÓßΚo—½ZÙko–Ïk­bÞ0h¸„–«Fh;Ó,Ï·~º½üsá´H!z¦åáâÖ~OêÚŽóH9ï)ÊKHWžÄ”SHG^NIÇH§=‰·ZAdjå0(7\ª\Sb ª (ŽÅžá£œÔ0‹r ˜¤|Ý“D+ˆ¨þŸø-2ý3EŸ3.lÙçøÌßõÝrÆMTõ¥—3† 9#q.Êîþ"Îá3Ói.1) *eÓ_b‡®pä]a®W^»eÐu¹öBŸŸ{ŠdÌF¹{^»Ë"%é‰'iÎU„þ1vòýžó±Ó±29MGåj‚LÓQ+ÑÍ¢ºÇ%.䣽3¹ RÒ çµ rý޹ÁKL<,[f@EÒsïti@–µ?Öž`³.ÂxBp…_#³Ž«¼u±«›CÂuJ°,»|ˆª2‰p׉7ž1àPÊ`'‚w°Y%°ï-›G húŸ~D¿ÕŽ¥®m›¤Ʊ´s­T5ÊgÃÐß[:&Ú­}g´R¨¬¡ËVJ0ÑÈ_{’붆ɬžå‚¯ÆÙªË”œë« šuS…dY/¶­‘’eº¬‹51NÄbÁðDaÜ–PV…IoªžHxâµÇYHži~ìƒW¹«Ñ]6S¸¹Eš”4oþv¡ñƒûëxš“…ÔN¶éD§ûÝçlÁ¥a átñd %N«Íþ_jÑt`U® &#‡S`fƒ &ºR0©9¢Š„ã‘Û줆FÝ–ôg‹„Ó„ ¼TàŸŽ¿5çÈASFyW9~™™ Ñ.µIÛk!±"~ OØ+Í\1Y1ÀlØpˆMÿ¹Ç"`þ6ö•û~·<ò¼Ãb‡˜D('N¸ï§V—ŠýuÔX÷œ©¯ëÖÁ£!GU goqôaÅ׳2ucØI;l¦^»ñr]Šq=»²HÕMô€éÌ•Ûõ6Baõ¡ Â’àðí¼·Í'íí~ÌL˜8ùà'ø u³‰ˆvÉ*?B½+ÆÙŽÃ°sÑ㬩gây“âÁ³Á²å¦ËöŠ\ðƒzcÄxÙõψÄh|ŠIGÞSœÑÕÓ{‰¹ºïï¾Î+ËÑô`›E¿Æ‰ô¨¶åRŒCó>|ã„P.°¬‚ñô'…¤ÏIA—›Èó»çÜÔCÏeåìò9×ué=©&³Jí´ÔgvÕ–ú “ÞU¹9ø”1VþªòéA•úèS¢+£Hg$|JpO$W2c¬þ-¶þ¢ Žº¨?Àp¬°."7^Vùkç?Âvþª ®:çºÁ˜g즜Ýè/¢pDƒY¢¥$z(áÁslC¼ž’½î8Ø*\6ˆØ"¼ŒN*Xd«%Øn«@*»!EºìÒ QC<‘HÏ7¤¸\£‹È²$=³Q=/.É[]VO Dûæ"<1îIÍZn…›EkJg'¨sí³ªÆ·¦HÏ7—›-Ò©‡n²H)IØEtÖÒ–“v6µõƒ™K;ÍeF„ÁLË~0“J9‡ƒÙgž½0ÇY>c¿ÉìëªÞAŒŸR3Líªk†D;!¢„0•¨‡kúc"Þ{cfÍ\X× ë¢—@ˆ¨/uSt¹»oè2k¦ŽõÃa*‘í-~"aDx”n§D¾Î9ŽåøJ¹ˆb²Ý,‡‹ÜûîÇd®ùh³|š´um‚HÇ}\rˆòE#€ÊEnfÿT%mÝxO ;|#˜[‡GÐ’Xš½!Ý~X! &‘´uÑûoM[•º…-ÚêÄ~ݶº¡W=´n"Œ¨«ãu½ý¼ªÚ0©M\%¶[1‰í‡£lCZs딜çøf+ØÝÈVö~"‘.«šDàÚù¸>&ö÷œDYZÓì×Nv„YDN¡´s¶ð×M*DílýΗ47~ã—çúu—ɤH|ø]’숉 ì¯ÌAâ"š8Ëc qs]¥*¾±ê•¯j.éÉr¢²§^]cDr›C\Ê<½…mÝnùZßöJžÞ¸Lìÿ£w2;_X'wpó¯¦ãK‡ô•%‘ „£‰Ëb¢Fg ÷yÜB É}Þ÷òŸ{Rþ}…ðÍöt]ö¤ô½Ü7X ½»C⻄Eá[ôé›ç§·1Û0s _5ëþÍXÔ endstream endobj 122 0 obj 2060 endobj 4 0 obj <> /Contents 5 0 R >> endobj 25 0 obj <> /Contents 26 0 R >> endobj 42 0 obj <> /Contents 43 0 R >> endobj 53 0 obj <> /Contents 54 0 R >> endobj 61 0 obj <> /Contents 62 0 R >> endobj 69 0 obj <> /Contents 70 0 R >> endobj 80 0 obj <> /Contents 81 0 R >> endobj 88 0 obj <> /Contents 89 0 R >> endobj 96 0 obj <> /Contents 97 0 R >> endobj 104 0 obj <> /Contents 105 0 R >> endobj 112 0 obj <> /Contents 113 0 R >> endobj 120 0 obj <> /Contents 121 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 4 0 R 25 0 R 42 0 R 53 0 R 61 0 R 69 0 R 80 0 R 88 0 R 96 0 R 104 0 R 112 0 R 120 0 R ] /Count 12 /Rotate 0>> endobj 1 0 obj <> endobj 9 0 obj <> endobj 11 0 obj [/Indexed /DeviceRGB 255 <000000FF00006B6BD2FFFFFF666666FF66667B7B7B6666C24A4AB96B6B6B4242 B1F30000FF9090B1B1DA888888737373B1A1A1FFB1B1CC6B6B181818FF33337B 7BCC6666B9E33333B9B9B99090D2DADADA8888CCB98888FFC2C2424242E37B7B FFE3E3DA9999FF1818FF7B7BEB2121B1B1EBFF4A4A8080D2C2C2E3A9A9A93333 33F33333D252529090E3DADAF3CCCCEBEB1818FFA1A1999999A1A1DAB99090FF D2D2525252EBA9A98080E3A1A1E3EBEBF3080808FF08087B7BD2FF73737373C2 5A5AB9B1B1B1292929FF4242E34242C2C2C2E3E3E3DADAEBF38888FFF3F3EB90 90FF2929FF8888C2C2EBB1B1F3FF5A5AD2D2D2EB4242E34A4A9999F3CCCCF3A1 A1F3C2C2F37373D2FF6B6B8080806B6BC26666CC5252B94A4AB1FF9999B9B9E3 B1B1E3909090B1A9A9FFB9B9D26B6BCC7373212121FF39398080CCE339399999 D29090DAC28080FFCCCC4A4A4AE38080FFEBEBFF2121FF8080F32121B9B9EBFF 52528888D28080DA393939DA4A4A9999E39090EBE3E3F3DADAFFD2D2EBF31010 FFA9A9A1A1A1A9A9DAB99999FFDADA5A5A5A8888E3A9A9E3A1A1EBF3F3F3EBEB FF101010FF10107B7BDA7373CC5A5AC2CCCCCCEBEBEBB9B9F3B1B1FFD2D2F3CC CCFFA9A9F3C2C2FF6B6BCC5252C2D273739999DAC28888F329298888DA9999EB E3E3FF8888EBA9A9EBF3F3FFD2D2FFF7B796FC949005E770C2F0F4F7B82899EB 94F741F7FC9490F7B84E6D892D05E770C2F118F7B77BF741F7FC949003EE8803 D600F713EE00016FF7A2E3007DF1C2F164000FF8DF0008402004F7A3A0C40000 1F200C000FF8000000C4000CC40000DF0008000000F713E22A001EC4000CDEFD 30C2F18CF7A10E03EE8803D60000000305E00FC2F1A800E44A05E0F8000032F7 B9C59A3DEC000030001DE803B600C2F1E000CD7C00000900CD5C000000FF92D0 05E10005E17003B600C2F20400CD7CC2F21000F56A033238FFFFFFC2F2780010 260000300021F9000028FF92D0601232FF94D0FF92A005E100F432F805E100C2 F22C66E8880000006021D3FF92D0F432F805E100C2F26C66E94B00000060D91D>]endobj 10 0 obj <>stream xœí} Oi–¶s1Ónó!H ‚Âf0IX&|&\‡5Ù| .FÁËe@_˜ F€Âm#I‡ÉÆÍF ¼?tÏ9ï¥Þ*@fâäö‚ Æ—AçbSHôïÝœiñ×­ôÆ |E ã‹`c±ªw ~~^±Iäo*ô%1Œ/+óŒÕû'6+6Áö³ò3ßBÁxo¨xÌïŸh‘¿B_ƒÁøhÙXœ{2PÜ]ï÷û»Aø¹«ÁøFp3¸Ÿ u‡zçªxƒñm`3Ä¡ýÅÐB¡¹3…¾ ƒñ…н±ØTõ$„xRÅÓúŒoþ`0^UÕ47×gî3ßî÷nãKñÅ•_ }) ãËâ—¿ßߢ©½×Â`0 ˆë}…¾ƒQT³ø3ß(n3ûŒoÑB_ƒÁ( b· } £0ˆ²ñg0¾MDÙø3ß&˜ü Æ7ŠëìûŒooXúŒoi&?ƒñ­àæó ¿_/äã®ü­µ_ð‚~ëë…¾ã7Ÿ·øWz—:7®|×ùžÔëFþÉ|_ôÒÎÇZÏwTè‹`0þA1S/‰òW6®t^¹Ò Mþëyä_?ðùþ—?× —Âäg0.‰ûÀxã †zõn,Zm;{­Ñ÷ïÿ[È¿ñù²L~ãÒ~'(Ÿ¯P °”?=4NÍ=óù’¨¶]¸Nî–ŠkI2ùŒKÂOt¯j©ðw^¿¡üѨ1©¿•ˆbë»V€ë´aý\^ +?ƒqiÜDÅ‚G3”ñ9¿Yï›üA2ß—ÌØö?˜Ïd“Ù$\+?ƒñˆåïÓÑXçw6å¯Öä§:!YhåÏmõ3@~V~ãó0°Ñ¹!Ž&déO+4:(^S…6‹;Tþ7…¸VDi&›Aîù³>îçg0. g°Sµl!@“äÔÂ/Ò}‚ü€ú@ÿd6+²V~㲘Yê\zNGcADgç†$ÿmÝÑ×*óý¬(ùÔögüÙ üŒÏÅÍÅ`pf—‚ ý@AþÃh4-ϱ+a ~D~¬øù²lûŒÏBïÒâRh³Â_ BÀ Èo ?)¿¦~mf¹ŸM²íg0>þÅx|1¾ø!þ!aø$òGÑ}¨üY‹ý…·ýÄþ$Û~ã³P¬ÿP¯Š ,Å—üףј>¥Õ&üÙB“?+J~äüïòZŒlܯB4‰†ô_ôÓL~cX¿™óg}ÉÆ|ãÚèëöð~*mwwyxïã×p:üëÙY8ŽÐgÚÏú_{jFTüPù“IV~ã3ðóœDÕñ c|Ï|¾?(É—ìÅæøº½©ðþ~d?Lã^ ¯6œÏeÀéò*œFàùRûíkÎó¦J!ßÇFôïÉRw]l\øc0.ŒÇOû逹/GõËQ}IÓö'³è¼3™Tþ—­½ìÚOõS¤û€×ÀíÝÿ>ïçOV‡VOV"«4æá“?^:,ÃÔ¸`þ¸èë“I¿;ãâ(Ö?é}ÒÛ;ÛÜ\SÕDLíóŠQ}¶j?xnâþxžòçºà>)ŒJt&ú¯6ä\|xHpÿ%Š?6éýáKöSvFùýã2é—}D8bò3—¿7ê õÂz‚ìŸû'£Øgé½:H’éGÔ8¾ho>±OÔßGþ*âõONVON]~ûס“!|t?ŒÊOQƒØIì›ç"ùÉ÷Ó ¿lR;òñãRh …B+ÐBž„zç~3 ýF²o R(¿Ãö¯ãß—ôO¡‚£éôzƒ¾çgþ£C#'CC@þW-å—ÒI$Ì€AäÏ’ñÏR¹ß¢>+?ƒqÜX‘Qèý-–Óoúœ@Ê÷3™yÛ×ìu%ÒôƒòHÈW¥ò¯"ÅÚ:424´{‚äÔ틤63¾ùµðgù…+ö2Œ‹âþ€ÄÊÊñÿ/­7¶™õ¾,ÖÝl9n^Ⱦþyð°HãWQ×ÑÞíæì¿ündhw„„ÿääDÿ0±¬? ?|á²uvƒ~Ó÷[®„•ŸÁ¸8~(¦FüýÿÆ›NÛïÓõ>‡ò¿ÝGîKáO…SaUëá‚ ŒüjûáW#€¡]Š (þ»ïÎPýQù÷¥ö'ö­Ó…ògÇůÓ0ëêXùŒ‹ãfw1Bñ`eÓxÓÅô'E_ßxÖ$s‚È¿¿Of=œŠDVwÏ^*ú½GvGFliÿè±DP_†½³U•õ§(–XÒß  ~Ö0V~ãsð˜È?V,B¿ÅxÓ-çÝüY[Á¯Qr;ùQ¶w‰æ¹_¥ðCÊOLkþð[úÓ‰ ÿOê¯Ã`üçUo_"ѧËj–Ä_¬èa]+?ƒqq<öuwûíÊŸWíOf{¨ânöóß½Šäߗ‰h½>¢Z?æûCÄSú‡FýÉõ[oìb¹ÈIääe¿êÓ0®ËýjjU‹`åg0.·€äÿ@…ñ^žîõ³Rû Û?Ü¿ M°×zg;ù‡PÞIù²ÞÙCê¿Bã?tbô…_î6ŒöŸ:û¦ˆúBû1Ð"ž¬ü ÆgÀß]è®Gþ#û7'´›å>_6LÿÞÕ« I}ª÷åŒ÷ND±ì=ÁzãT ?ÕûOÞ}âÅjî ågÅg0.çâ›þz’ÿâ çZ åÙÏ¿Qgâ*¥ü²à×`¾Òä¦b?°ý­¥ð¹·Èþ·ôŽóý„é´˜‡œØ×ƒ¦Ÿ'ô0Ÿ¿±¼¿ ù³¦ïÏŸÏ?ÂÒ/¹i6ß;¥þ!)ü#µÞQÊ/»úWëg££Ín£€ Èr¿˜Ù“dåg0>é3Ù_ßíF~£“?ébûß_¥”_VüÃ~¥ò á7ëýôRÒÿDŒðÇ©½‘ðnÿiUc|Øö3Ÿ‹XßðþŸ-úÍ8O±­á—Í_Ìc„_Ò?’Ûß=#é—"ÿÖHúÿ›Ê}¤üb€¿œÜüO¥vïæ\/7#†øeiF?Oèa0.ëÑ´wÂoÙŸ¯üz4 ÖûòÉß|ÕÈù#‘HûIûnûî¶³wgTî“Å~hVfŸÃ”_)ÿÍ ¾4-(Ùop+ŒÓ¼½€/“ŸÁ¸q±®–– „fÿŒó,Û~.ä§^þ„®ö›Ëøà„>Tþ!9Êgä­Áè¿êœ_ð%åËñ½)ç„~‚ZɇÆösÎÏ`\bîîf ÂbÿŒó´‘¿áêUQï¾GçÍÓ}ò“!1ÆG)¿9ÌÇÈù‡TÒ/föÐJ@ûûgy—lüàjšóN`0‡\¤s`ÐßüY‹û.ýüS ´ýªÚŸ@ÛNÚ/çõœ¨‚ñß\ÐkïJùMåˆ~`üö^C„îê˰ò3—…Z¤³bsSð_°¿þ†óDSùÝ ~ V¹’~þ”X¿/,øIåG¡·­æ·÷VŒÔ·ôÐËy8Ù­”?Ë9?ƒqY(î?ž©ûÏU~Ëõ»ÙþI³Ú/&öÐ^±Ž‡˜²«¤ß¾”gî?‡dÊ¿z"‚)D(?.äçø­ŒZÊGäülûŒ ã0z]ùgff*Èúûgœ§ZÕ~*÷çð›Õ~k”ϼ´ý‘°š×£êýNò{½§ÿI¿Ö}±–Ìùû Ǩ}]ìϰò3—BßmuWŽŸgfn û+Ðø»“ß>³'o„_s¾ò‹¥|(é²ÿ<ò{ñž# ü/UüHøi^ŸsÔÀ¸X»;ÃÕ~ã’°îÁûóù'>Jþlþ:E??P_Tûç§§kÐöâpÎõœ¿;‘®^ÌçO!õ÷‰œíùÊß®gõ‘úæÊ{©ˆUïK$–moÊÛu‰A>¬ü ÆE¡ïŸ®æÆïåüëæb^Ùd&ï뎤í—+ùØjt¹ß£»wz:<üÓÙÙªÉâZ¾“ï†ï´/ù›‘KyHåŸü¤ÿ\ƒ!q]õñ#€ø7ˆûçVû¬•2if ꃜu ñ“S{‘ý~ãûXÆ;ûixô•}a®W¿þôŽº÷iBϪ¹’O¿Èùé ¯:rþ.P~ZFL(¿ìyàî~ãÓPm¸þDz§]ÿ„ë¿ucJ/®Ü]:utw»+c¸ûVáûåœÞýˆõVƒ^»ŸîÌ1¢~{ÿðoâ^]«ÏDÂäÏÙ®¥±Tß±'‰~¤±}ª6yð·øWa0¾ÜÖwáõz®æ›ÂŸ?¯Ù6+í=Xt›²ÎÈIòÓHŸÈ~*%Ù¿&‡í…Qßi!ÏœúÈ«= Ÿ`Ý‘{]?Ú~rýÖÚÝ„F½x¯yûàäßè†ÁøÊÑ­¶Rþ_**Ôð^Êøëýÿ7ï>›ôc;ÊïkãŒvs˜ÎÇ 7Œö¾”ÔÇÁ{â†\Æ*^'CrmO9£'<šÃ?ï5¤tOÖûS{ÚEO_FŒñÑø[þó0_/Ž>ïÍŠMIý‰s¦ôz3ö™=”rÛoו벆øÒŒ~q“nû}ºWmkôâÊž«òîÜrdßnûnX ðÙÜ/áè7œ”Â/”_oÓã«EµYïÚcÓsúüÝ3y¨±I?òÍ·mÎÍ‘îí£Ûõí«™}4Ä_êÿÉIÎøDîäÄä¾ÝgõóEð wíWâmÜÇ‘ý>¾cƒqA˜äÿ¹¥E®å1¡–ñšÉûÀ¤©üú>½öþþvYò»º/²~âp8bQ(n/Üë„_Ýw>¢—ñÀé¼h$rÎk—Âï3oÒËýý Æ'!jÿ—‰–‰½ŠW½¿¾Û…ü9Û=»ô}zí'Í'(ë$ôr>á”pþ’ú«Î¹w«Öd¾°^ÄCÌé‘ý|ùƒZ³êf]jØnÜßÏ`| ¢FOß ÿ6Å}¼oOÞžŽå<|IºQ¯“ü¹°ãK¦ù}b–®S÷»V¾§¤ÂÒò§h= ü®¿æ}Ä»7žµ:ú4Ú?÷ß„Áø&`*ÿ¦céÞn—›vÞ›Ê/´?›qŽá?KÐðþ«2éW{åb~n#ýÞ™sø#j6_Šfó%ö#®“&3bÙn›i½ü¿ƒñ á¶EþÇzÝîz¡ûn·ëäžÔ÷ɂ޸º£ÒËôòNÝ)¹œW$üSÎõRŽ„á§•»ÂF­…?õNy±Ž‡-áQ> ƧÀPþ›@yâ=4y«¾üu"r]û‘üI`¿Ë Úá”è—Py?!Ü;÷bFOÔŠ½ÒóGhh_äìü¹“ìp°i?“ŸÁøD«£êf-HzÁüzy—î7åÕd²–öÌ¿vP:ÚŽºäO…çwï~däýéðÙ‰òü4¶/uÒ_°aªÖ”ýÄñòƒß?ŸÁ`bzxïc}{nIý±âWå>>::ZoþØŒýWk¯ÖÄj>Ÿ|Qê§á½Â\^Î'žÎ`0ƒQq·¯÷—n…1BqñÀÀÊïŸÁ`üCã ø~q´9f˜Ügò3_/¢Ñè!î×kæ÷WZ }y ãï…ê¨XÊç9¾˜hOªÜ…˜ü ÆW‹¾¨ä7t/–¢~Áäg0¾^û¯{½cHxE|IýÞ¹‰B_ƒÁø»!Åš_Eh%´‚¬³/˜êí›cåg0¾b ‚ôGBÈþf>P¸ÏÊÏ`|ÕÀ¬ÿ@wÚˆø`ø‘úMMþB_ƒÁø{¥ÿ7ú^¤}¯Ð|ä~0(ˆÇk  Ø`D‡öí×­ØÚ·Û[U;/$`4 ‡ý1íÙ÷hýÿÄÿm1¸ º¿|'€þz«îá`90>FB=»S‚ìóîÌvô:hØp%FŠ’ÙXÚOe-#¯C;à-¸³0ˆ~¿£Ž–¯ë0Ïi[hÃìÂû¢Òƒ!¡­r– ±J¢}Y]ú‚­…E”Q<ž‹åü–æ›Òo ì™MÐ<½G> }®öŸ>85èoñœ8ß¼ö Ù­h¿$‡‡ØÐ¬K7 Žá@÷©MXE÷#hÃJûG%ñiwËlŠñ¸5yKcRøIý~;é—÷‘ößOM‚ðO~?e6EðÈ{`?6ê#í[‘îÛí†%  6¤=vÏZ%ÿéÙ >0_qý˜žk„-˜·”ŸœB#n©šFxn´¸ßˆÜo´´ß&þëkmD×Ú ŽDÄGšÙáàGhHtr?RC¼/ŦP|—dÇnÄthÁ}â|¾ê)U„—ÜïÁ嬀ö¸¨º‚,nÂøp‡/ðöZ´è…XçÒ"ÿÅÅ¥xü7,ûýWÓ"ÙýÅÅà´ ù©Âm«{8‹‘òw$?p\áNݬ`{Ñ2à¡é‚ž:.£W]ûï -ðUvà7¥á é“uóœ’_Í=ôõÓ 1V½;++ñ¯áÃø±jØÅ.B}—(3viÒ~öôþÁyÚo×} þÞšMøÅ4gü›=pŠ?i¿Hš…ðÛÄŸ( •²¥ûÃnÀÝ~up«ßˆyªßO´¿µ,èkR‡bÿÔÔ䔡ü¦P1`Usaý¿ßކ͖´£êߤð‹½]÷Qõå^„€VKôÿÏ5ØTN`—}|Týy¢;<”ú7ZÍzì'í·YýÒ5°é>„‚kZ÷1àëT@(ÿÔý§OÇŸ"åi/--5%ßd$  ‚~´ÿúÔ”ð‹-ké?ŸêÿúǽKAäz$þŽþöaì>¼ ;ƒ6ò— ¦nÕŸ1⸠‘gyžö*ëLò×S…š;•m·­c«Þh¥çE>ùÓm•Èö¨`;üNG”XN¢m–ªJ ñ³fÁàSèoùý\^[ÚEûÅÞ]û ö›ªoj¿®4ÛËk¦ò?²ë¾Ò~Cù×µÝ?’H?,µ_‰¿Cûï’ðdXÖz/›¤~¿aü%ó—…ç—Ú?)ÔßÔ} (÷ úÀý)Ãú;tÉßÞJÛ¶!üZ÷Û¡µ¶Ãó±6Rú•ë—–_ÿXk¿|¨ÂÀ<ÑÞR~“þ û5]`ìÊoñ^»WíWºÄ¿&ŒÿS²ü:ï?Ê/Ô_˜~|HÖKá—q€èýC)Ñ^k¿f¿”~8øAZ±vµd~’¨/´ö —Ÿ•¼'êÓß²šüõÀsäz0ø¯ÿGûýñ½Øè„f#êô½Ù鯄ò{ªù%ëbH¢K ò÷É¿Ùu\uü-²ÇŠ®ÏzòÈß7}{‡¾IüŠ·dzº#`½”D¼úð½@삾ߌ.Å?þ¼"à=öÎ×þ½SS÷Úß,ÙeßEù­ò_3é¾~<Àl)¿®Ú]­ûÃ:ëwhÿ­~Cùïjí_6ó}ñ÷kí—•ïʯ´_Å€×È{tû–÷ÝŸ²åû¢¡÷Ý*”¿µÝ,á[[-ÁoÕOZûI÷üHÿg†æ«ä=¥ü˜üká×A e…€®FWt5v]k¼ÖUÛu­ËUûµî“í¿&…_Š>=¿Mè?E’~ÓúK`©öãš÷ãvíÏëïùAi&©š¢¿ÔþŒÖ~"¾Èõ³Û X ±òG4ÿÑ¿,mtv¯t^±‘ŸJóŽ-¨¬M“Á®ö´íx0 zh7íÑl‘ßëé»;1›'­óp£Eõ‹Ù<òÇ*ËËMò{^D©œ¯È§:–Æ«óP ©óô]LùÍBŸ“úJûEÕ/m¯ùS;GûAùO䷴ߪó­iöËðHª¿¡ÿGÍ–ö7«¼_è¾,õ©@0_i¿æ¿%ýH}þ»†õy¿~Ò}§òkö[¼'íŸt~Ù€1€lD€©ísŠ}ÛDúvÊûÛ-í?&ío•vÍ¿`¾!ýó¸ÕKÅ—ûg¦öÏ+áGç¯6Óù§„ô7Ú­€Úk°á£K‰¿Mû­Œ™MýI÷§ïÔíéSÅþ[ѯÔHdª?Žâ/ÆõÇ•ç_ú„Û·©D⟥[júä--Í‚ßãP'ð|ã xüà*þŸ¢èþ£þËÿÿ°ñ ºïknm"}O“òƒ°W")Óƒ“-$#ïê<1'ùït”‹à±Yzñf]™†(ìÚòÈuJÛeRoYâ xÚðc垎 uõÙ‚€KÏŸ—”ß)þB÷õ]´ß©ûμÿ•tkpdïÌKüåi¿Ðÿõ#;ý…0µßVï7´_øÿ~³âÒ¯u_)¿ ·–ÏÑþ)ËX1à{¡ý´ÕñÚöŸ„[$þöÎ@$;Ðÿeë±ØTõï™,ø¡òߟKñŸ¯12~É|!ùêXûS5–æKÆ+÷/F¨íïß…´wA+hç/»~|o6Jd’þ÷¥FÞ/CÀ¸¦©©û¢Ê/{þ¤ ûb‹¼3¬Tÿ¬ ½Èû…óÏêq×¹•.@ü?ß²qeãÊ•ÎNÜÑ3Ä‚¥ùcuTàv´Z÷»‰ìÚã½#l¬ˆXX$U˜̦¤Ü´ý^ÙùîU¹|ò£“Ç‚ßV>ùÛ:›–Ah:0h¼„ÏâW÷Űᢠûí!À .Í=çGíß;gðO>ý8JþÍkhûÖ_Ëÿš~›ö«´ÝMùlõþa©ûŽa?*Õ¿%^P@‰ÿ¤j’úùÚ?µl)ÿ¤*øOé^?5ö=?Ù}cô=(Û/ˆ/°-+ôLº/©ÿRåüÊjŽçIúíŸÊ/çµù¯‘Ù¾­æ§´^°¿F¿@î×BÂÔ'þ»û±èÿãÁ5£äoÚcèÏ{½·[YúÏH¿/[©æ½Ùß/¸}~=¢¨€LþÅÞÒ~!öº»ÏVðc˜’ïJû´-íÇç´QíÏÙ´_qÝÅø“'x`y¿ÃøËœ_ê>>ÖuÙïÐ…ß>pØÔKû‡UÍßÈûupKÕþßAøûoYù¾Nío˜4h?)Šþ“†ðË1>$ýTó±À>þOdþdÿ[·[e ÀìÓ. ~/)÷©„_Sÿeÿ ÿŠþRþíÊߨò~Êú)é@•üæÍ í>\#×ßEY?…gÚoØ~=ÔGþM²_û\¤ýOu¹ÏðýôœQIáû5ý3Õá×#R~â;²_åüTû3 R¤ü¢»O0ßÇ÷±wEîñ7µÏÒþ:ówjÿš«ö»´WfÞoô£@Ð,¿ììü_äû‚þ„ñu‡ö÷ëš¿‘÷[)¿½Ãó}cدCÿyÿ”îó³úù•ù—%ÿ)ìé{=eËù ío•UÿV™ðËÑ>ªòGy»RûgÇVŸŽç­¿Çbä¯ÕõW£³ÿFÕÝ'Jïßj÷Iþ‰÷Ž´ëý.ôWÂ/ºûóéo9Ô~‹ýV©Ÿ^«:¿òšû2ûÏHÐ#¶¬ä~ÖªøgDÕ¯ÇR~à'ºûðQhž1 ƒÁ`0 ƒÁ`0 ƒÁø\üƒÔ endstream endobj 21 0 obj <> endobj 22 0 obj <> endobj 23 0 obj <> endobj 24 0 obj <> endobj 8 0 obj <>stream xœkhÙDÀ€ endstream endobj 7 0 obj <>stream xœc`Ù endstream endobj 29 0 obj [/Indexed /DeviceRGB 255 <000000FF00006B6BD2FFFFFF666666FF66667B7B7B6666C24A4AB96B6B6B4242 B1F30000FF9090B1B1DA888888737373B1A1A1FFB1B1CC6B6B181818FF33337B 7BCC6666B9E33333B9B9B99090D2DADADA8888CCB98888FFC2C2424242E37B7B FFE3E3DA9999FF1818FF7B7BEB2121B1B1EBFF4A4A8080D2C2C2E3A9A9A93333 33F33333D252529090E3DADAF3CCCCEBEB1818FFA1A1999999A1A1DAB99090FF D2D2525252EBA9A98080E3A1A1E3EBEBF3080808FF08087B7BD2FF73737373C2 5A5AB9B1B1B1292929FF4242E34242C2C2C2E3E3E3DADAEBF38888FFF3F3EB90 90FF2929FF8888C2C2EBB1B1F3FF5A5AD2D2D2EB4242E34A4A9999F3CCCCF3A1 A1F3C2C2F37373D2FF6B6B8080806B6BC26666CC5252B94A4AB1FF9999B9B9E3 B1B1E3909090B1A9A9FFB9B9D26B6BCC7373212121FF39398080CCE339399999 D29090DAC28080FFCCCC4A4A4AE38080FFEBEBFF2121FF8080F32121B9B9EBFF 52528888D28080DA393939DA4A4A9999E39090EBE3E3F3DADAFFD2D2EBF31010 FFA9A9A1A1A1A9A9DAB99999FFDADA5A5A5A8888E3A9A9E3A1A1EBF3F3F3EBEB FF101010FF10107B7BDA7373CC5A5AC2CCCCCCEBEBEBB9B9F3B1B1FFD2D2F3CC CCFFA9A9F3C2C2FF6B6BCC5252C2D273739999DAC28888F329298888DA9999EB E3E3FF8888EBA9A9EBF3F3FFD2D2FFF7B796FC949005E770C2F0F4F7B82899EB 94F741F7FC9490F7B84E6D892D05E770C2F118F7B77BF741F7FC949003EE8803 D600F713EE00016FF7A2E3007DF1C2F164000FF8DF0008402004F7A3A0C40000 1F200C000FF8000000C4000CC40000DF0008000000F713E22A001EC4000CDEFD 30C2F18CF7A10E03EE8803D60000000305E00FC2F1A800E44A05E0F8000032F7 B9C59A3DEC000030001DE803B600C2F1E000CD7C00000900CD5C000000FF92D0 05E10005E17003B600C2F20400CD7CC2F21000F56A033238FFFFFFC2F2780010 260000300021F9000028FF92D0601232FF94D0FF92A005E100F432F805E100C2 F22C66E8880000006021D3FF92D0F432F805E100C2F26C66E94B00000060D91D>]endobj 28 0 obj <>stream xœí} Oi–¶s1Ónó!H ‚Âf0IX&|&\‡5Ù| .FÁËe@_˜ F€Âm#I‡ÉÆÍF ¼?tÏ9ï¥Þ*@fâäö‚ Æ—AçbSHôïÝœiñ×­ôÆ |E ã‹`c±ªw ~~^±Iäo*ô%1Œ/+óŒÕû'6+6Áö³ò3ßBÁxo¨xÌïŸh‘¿B_ƒÁøhÙXœ{2PÜ]ï÷û»Aø¹«ÁøFp3¸Ÿ u‡zçªxƒñm`3Ä¡ýÅÐB¡¹3…¾ ƒñ…н±ØTõ$„xRÅÓúŒoþ`0^UÕ47×gî3ßî÷nãKñÅ•_ }) ãËâ—¿ßߢ©½×Â`0 ˆë}…¾ƒQT³ø3ß(n3ûŒoÑB_ƒÁ( b· } £0ˆ²ñg0¾MDÙø3ß&˜ü Æ7ŠëìûŒooXúŒoi&?ƒñ­àæó ¿_/äã®ü­µ_ð‚~ëë…¾ã7Ÿ·øWz—:7®|×ùžÔëFþÉ|_ôÒÎÇZÏwTè‹`0þA1S/‰òW6®t^¹Ò Mþëyä_?ðùþ—?× —Âäg0.‰ûÀxã †zõn,Zm;{­Ñ÷ïÿ[È¿ñù²L~ãÒ~'(Ÿ¯P °”?=4NÍ=óù’¨¶]¸Nî–ŠkI2ùŒKÂOt¯j©ðw^¿¡üѨ1©¿•ˆbë»V€ë´aý\^ +?ƒqiÜDÅ‚G3”ñ9¿Yï›üA2ß—ÌØö?˜Ïd“Ù$\+?ƒñˆåïÓÑXçw6å¯Öä§:!YhåÏmõ3@~V~ãó0°Ñ¹!Ž&déO+4:(^S…6‹;Tþ7…¸VDi&›Aîù³>îçg0. g°Sµl!@“äÔÂ/Ò}‚ü€ú@ÿd6+²V~㲘Yê\zNGcADgç†$ÿmÝÑ×*óý¬(ùÔögüÙ üŒÏÅÍÅ`pf—‚ ý@AþÃh4-ϱ+a ~D~¬øù²lûŒÏBïÒâRh³Â_ BÀ Èo ?)¿¦~mf¹ŸM²íg0>þÅx|1¾ø!þ!aø$òGÑ}¨üY‹ý…·ýÄþ$Û~ã³P¬ÿP¯Š ,Å—üףј>¥Õ&üÙB“?+J~äüïòZŒlܯB4‰†ô_ôÓL~cX¿™óg}ÉÆ|ãÚèëöð~*mwwyxïã×p:üëÙY8ŽÐgÚÏú_{jFTüPù“IV~ã3ðóœDÕñ c|Ï|¾?(É—ìÅæøº½©ðþ~d?Lã^ ¯6œÏeÀéò*œFàùRûíkÎó¦J!ßÇFôïÉRw]l\øc0.ŒÇOû逹/GõËQ}IÓö'³è¼3™Tþ—­½ìÚOõS¤û€×ÀíÝÿ>ïçOV‡VOV"«4æá“?^:,ÃÔ¸`þ¸èë“I¿;ãâ(Ö?é}ÒÛ;ÛÜ\SÕDLíóŠQ}¶j?xnâþxžòçºà>)ŒJt&ú¯6ä\|xHpÿ%Š?6éýáKöSvFùýã2é—}D8bò3—¿7ê õÂz‚ìŸû'£Øgé½:H’éGÔ8¾ho>±OÔßGþ*âõONVON]~ûס“!|t?ŒÊOQƒØIì›ç"ùÉ÷Ó ¿lR;òñãRh …B+ÐBž„zç~3 ýF²o R(¿Ãö¯ãß—ôO¡‚£éôzƒ¾çgþ£C#'CC@þW-å—ÒI$Ì€AäÏ’ñÏR¹ß¢>+?ƒqÜX‘Qèý-–Óoúœ@Ê÷3™yÛ×ìu%ÒôƒòHÈW¥ò¯"ÅÚ:424´{‚äÔ틤63¾ùµðgù…+ö2Œ‹âþ€ÄÊÊñÿ/­7¶™õ¾,ÖÝl9n^Ⱦþyð°HãWQ×ÑÞíæì¿ündhw„„ÿääDÿ0±¬? ?|á²uvƒ~Ó÷[®„•ŸÁ¸8~(¦FüýÿÆ›NÛïÓõ>‡ò¿ÝGîKáO…SaUëá‚ ŒüjûáW#€¡]Š (þ»ïÎPýQù÷¥ö'ö­Ó…ògÇůÓ0ëêXùŒ‹ãfw1Bñ`eÓxÓÅô'E_ßxÖ$s‚È¿¿Of=œŠDVwÏ^*ú½GvGFliÿè±DP_†½³U•õ§(–XÒß  ~Ö0V~ãsð˜È?V,B¿ÅxÓ-çÝüY[Á¯Qr;ùQ¶w‰æ¹_¥ðCÊOLkþð[úÓ‰ ÿOê¯Ã`üçUo_"ѧËj–Ä_¬èa]+?ƒqq<öuwûíÊŸWíOf{¨ânöóß½Šäߗ‰h½>¢Z?æûCÄSú‡FýÉõ[oìb¹ÈIääe¿êÓ0®ËýjjU‹`åg0.·€äÿ@…ñ^žîõ³Rû Û?Ü¿ M°×zg;ù‡PÞIù²ÞÙCê¿Bã?tbô…_î6ŒöŸ:û¦ˆúBû1Ð"ž¬ü ÆgÀß]è®Gþ#û7'´›å>_6LÿÞÕ« I}ª÷åŒ÷ND±ì=ÁzãT ?ÕûOÞ}âÅjî ågÅg0.çâ›þz’ÿâ çZ åÙÏ¿Qgâ*¥ü²à×`¾Òä¦b?°ý­¥ð¹·Èþ·ôŽóý„é´˜‡œØ×ƒ¦Ÿ'ô0Ÿ¿±¼¿ ù³¦ïÏŸÏ?ÂÒ/¹i6ß;¥þ!)ü#µÞQÊ/»úWëg££Ín£€ Èr¿˜Ù“dåg0>é3Ù_ßíF~£“?ébûß_¥”_VüÃ~¥ò á7ëýôRÒÿDŒðÇ©½‘ðnÿiUc|Øö3Ÿ‹XßðþŸ-úÍ8O±­á—Í_Ìc„_Ò?’Ûß=#é—"ÿÖHúÿ›Ê}¤üb€¿œÜüO¥vïæ\/7#†øeiF?Oèa0.ëÑ´wÂoÙŸ¯üz4 ÖûòÉß|ÕÈù#‘HûIûnûî¶³wgTî“Å~hVfŸÃ”_)ÿÍ ¾4-(Ùop+ŒÓ¼½€/“ŸÁ¸q±®–– „fÿŒó,Û~.ä§^þ„®ö›Ëøà„>Tþ!9Êgä­Áè¿êœ_ð%åËñ½)ç„~‚ZɇÆösÎÏ`\bîîf ÂbÿŒó´‘¿áêUQï¾GçÍÓ}ò“!1ÆG)¿9ÌÇÈù‡TÒ/föÐJ@ûûgy—lüàjšóN`0‡\¤s`ÐßüY‹û.ýüS ´ýªÚŸ@ÛNÚ/çõœ¨‚ñß\ÐkïJùMåˆ~`üö^C„îê˰ò3—…Z¤³bsSð_°¿þ†óDSùÝ ~ V¹’~þ”X¿/,øIåG¡·­æ·÷VŒÔ·ôÐËy8Ù­”?Ë9?ƒqY(î?ž©ûÏU~Ëõ»ÙþI³Ú/&öÐ^±Ž‡˜²«¤ß¾”gî?‡dÊ¿z"‚)D(?.äçø­ŒZÊGäülûŒ ã0z]ùgff*Èúûgœ§ZÕ~*÷çð›Õ~k”ϼ´ý‘°š×£êýNò{½§ÿI¿Ö}±–Ìùû Ǩ}]ìϰò3—BßmuWŽŸgfn û+Ðø»“ß>³'o„_s¾ò‹¥|(é²ÿ<ò{ñž# ü/UüHøi^ŸsÔÀ¸X»;ÃÕ~ã’°îÁûóù'>Jþlþ:E??P_Tûç§§kÐöâpÎõœ¿;‘®^ÌçO!õ÷‰œíùÊß®gõ‘úæÊ{©ˆUïK$–moÊÛu‰A>¬ü ÆE¡ïŸ®æÆïåüëæb^Ùd&ï뎤í—+ùØjt¹ß£»wz:<üÓÙÙªÉâZ¾“ï†ï´/ù›‘KyHåŸü¤ÿ\ƒ!q]õñ#€ø7ˆûçVû¬•2if ꃜu ñ“S{‘ý~ãûXÆ;ûixô•}a®W¿þôŽº÷iBϪ¹’O¿Èùé ¯:rþ.P~ZFL(¿ìyàî~ãÓPm¸þDz§]ÿ„ë¿ucJ/®Ü]:utw»+c¸ûVáûåœÞýˆõVƒ^»ŸîÌ1¢~{ÿðoâ^]«ÏDÂäÏÙ®¥±Tß±'‰~¤±}ª6yð·øWa0¾ÜÖwáõz®æ›ÂŸ?¯Ù6+í=Xt›²ÎÈIòÓHŸÈ~*%Ù¿&‡í…Qßi!ÏœúÈ«= Ÿ`Ý‘{]?Ú~rýÖÚÝ„F½x¯yûàäßè†ÁøÊÑ­¶Rþ_**Ôð^Êøëýÿ7ï>›ôc;ÊïkãŒvs˜ÎÇ 7Œö¾”ÔÇÁ{â†\Æ*^'CrmO9£'<šÃ?ï5¤tOÖûS{ÚEO_FŒñÑø[þó0_/Ž>ïÍŠMIý‰s¦ôz3ö™=”rÛoו벆øÒŒ~q“nû}ºWmkôâÊž«òîÜrdßnûnX ðÙÜ/áè7œ”Â/”_oÓã«EµYïÚcÓsúüÝ3y¨±I?òÍ·mÎÍ‘îí£Ûõí«™}4Ä_êÿÉIÎøDîäÄä¾ÝgõóEð wíWâmÜÇ‘ý>¾cƒqA˜äÿ¹¥E®å1¡–ñšÉûÀ¤©üú>½öþþvYò»º/²~âp8bQ(n/Üë„_Ýw>¢—ñÀé¼h$rÎk—Âï3oÒËýý Æ'!jÿ—‰–‰½ŠW½¿¾Û…ü9Û=»ô}zí'Í'(ë$ôr>á”pþ’ú«Î¹w«Öd¾°^ÄCÌé‘ý|ùƒZ³êf]jØnÜßÏ`| ¢FOß ÿ6Å}¼oOÞžŽå<|IºQ¯“ü¹°ãK¦ù}b–®S÷»V¾§¤ÂÒò§h= ü®¿æ}Ä»7žµ:ú4Ú?÷ß„Áø&`*ÿ¦céÞn—›vÞ›Ê/´?›qŽá?KÐðþ«2éW{åb~n#ýÞ™sø#j6_Šfó%ö#®“&3bÙn›i½ü¿ƒñ á¶EþÇzÝîz¡ûn·ëäžÔ÷ɂ޸º£ÒËôòNÝ)¹œW$üSÎõRŽ„á§•»ÂF­…?õNy±Ž‡-áQ> ƧÀPþ›@yâ=4y«¾üu"r]û‘üI`¿Ë Úá”è—Py?!Ü;÷bFOÔŠ½ÒóGhh_äìü¹“ìp°i?“ŸÁøD«£êf-HzÁüzy—î7åÕd²–öÌ¿vP:ÚŽºäO…çwï~däýéðÙ‰òü4¶/uÒ_°aªÖ”ýÄñòƒß?ŸÁ`bzxïc}{nIý±âWå>>::ZoþØŒýWk¯ÖÄj>Ÿ|Qê§á½Â\^Î'žÎ`0ƒQq·¯÷—n…1BqñÀÀÊïŸÁ`üCã ø~q´9f˜Ügò3_/¢Ñè!î×kæ÷WZ }y ãï…ê¨XÊç9¾˜hOªÜ…˜ü ÆW‹¾¨ä7t/–¢~Áäg0¾^û¯{½cHxE|IýÞ¹‰B_ƒÁø»!Åš_Eh%´‚¬³/˜êí›cåg0¾b ‚ôGBÈþf>P¸ÏÊÏ`|ÕÀ¬ÿ@wÚˆø`ø‘úMMþB_ƒÁø{¥ÿ7ú^¤}¯Ð|ä~0(ˆÇk  Ø`D‡öí×­ØÚ·Û[U;/$`4 ‡ý1íÙ÷hýÿÄÿm1¸ º¿|'€þz«îá`90>FB=»S‚ìóîÌvô:hØp%FŠ’ÙXÚOe-#¯C;à-¸³0ˆ~¿£Ž–¯ë0Ïi[hÃìÂû¢Òƒ!¡­r– ±J¢}Y]ú‚­…E”Q<ž‹åü–æ›Òo ì™MÐ<½G> }®öŸ>85èoñœ8ß¼ö Ù­h¿$‡‡ØÐ¬K7 Žá@÷©MXE÷#hÃJûG%ñiwËlŠñ¸5yKcRøIý~;é—÷‘ößOM‚ðO~?e6EðÈ{`?6ê#í[‘îÛí†%  6¤=vÏZ%ÿéÙ >0_qý˜žk„-˜·”ŸœB#n©šFxn´¸ßˆÜo´´ß&þëkmD×Ú ŽDÄGšÙáàGhHtr?RC¼/ŦP|—dÇnÄthÁ}â|¾ê)U„—ÜïÁ嬀ö¸¨º‚,nÂøp‡/ðöZ´è…XçÒ"ÿÅÅ¥xü7,ûýWÓ"ÙýÅÅà´ ù©Âm«{8‹‘òw$?p\áNݬ`{Ñ2à¡é‚ž:.£W]ûï -ðUvà7¥á é“uóœ’_Í=ôõÓ 1V½;++ñ¯áÃø±jØÅ.B}—(3viÒ~öôþÁyÚo×} þÞšMøÅ4gü›=pŠ?i¿Hš…ðÛÄŸ( •²¥ûÃnÀÝ~up«ßˆyªßO´¿µ,èkR‡bÿÔÔ䔡ü¦P1`Usaý¿ßކ͖´£êߤð‹½]÷Qõå^„€VKôÿÏ5ØTN`—}|Týy¢;<”ú7ZÍzì'í·YýÒ5°é>„‚kZ÷1àëT@(ÿÔý§OÇŸ"åi/--5%ßd$  ‚~´ÿúÔ”ð‹-ké?ŸêÿúǽKAäz$þŽþöaì>¼ ;ƒ6ò— ¦nÕŸ1⸠‘gyžö*ëLò×S…š;•m·­c«Þh¥çE>ùÓm•Èö¨`;üNG”XN¢m–ªJ ñ³fÁàSèoùý\^[ÚEûÅÞ]û ö›ªoj¿®4ÛËk¦ò?²ë¾Ò~Cù×µÝ?’H?,µ_‰¿Cûï’ðdXÖz/›¤~¿aü%ó—…ç—Ú?)ÔßÔ} (÷ úÀý)Ãú;tÉßÞJÛ¶!üZ÷Û¡µ¶Ãó±6Rú•ë—–_ÿXk¿|¨ÂÀ<ÑÞR~“þ û5]`ìÊoñ^»WíWºÄ¿&ŒÿS²ü:ï?Ê/Ô_˜~|HÖKá—q€èýC)Ñ^k¿f¿”~8øAZ±vµd~’¨/´ö —Ÿ•¼'êÓß²šüõÀsäz0ø¯ÿGûýñ½Øè„f#êô½Ù鯄ò{ªù%ëbH¢K ò÷É¿Ùu\uü-²ÇŠ®ÏzòÈß7}{‡¾IüŠ·dzº#`½”D¼úð½@삾ߌ.Å?þ¼"à=öÎ×þ½SS÷Úß,ÙeßEù­ò_3é¾~<Àl)¿®Ú]­ûÃ:ëwhÿ­~Cùïjí_6ó}ñ÷kí—•ïʯ´_Å€×È{tû–÷ÝŸ²åû¢¡÷Ý*”¿µÝ,á[[-ÁoÕOZûI÷üHÿg†æ«ä=¥ü˜üká×A e…€®FWt5v]k¼ÖUÛu­ËUûµî“í¿&…_Š>=¿Mè?E’~ÓúK`©öãš÷ãvíÏëïùAi&©š¢¿ÔþŒÖ~"¾Èõ³Û X ±òG4ÿÑ¿,mtv¯t^±‘ŸJóŽ-¨¬M“Á®ö´íx0 zh7íÑl‘ßëé»;1›'­óp£Eõ‹Ù<òÇ*ËËMò{^D©œ¯È§:–Æ«óP ©óô]LùÍBŸ“úJûEÕ/m¯ùS;GûAùO䷴ߪó­iöËðHª¿¡ÿGÍ–ö7«¼_è¾,õ©@0_i¿æ¿%ýH}þ»†õy¿~Ò}§òkö[¼'íŸt~Ù€1€lD€©ísŠ}ÛDúvÊûÛ-í?&ío•vÍ¿`¾!ýó¸ÕKÅ—ûg¦öÏ+áGç¯6Óù§„ô7Ú­€Úk°á£K‰¿Mû­Œ™MýI÷§ïÔíéSÅþ[ѯÔHdª?Žâ/ÆõÇ•ç_ú„Û·©D⟥[júä--Í‚ßãP'ð|ã xüà*þŸ¢èþ£þËÿÿ°ñ ºïknm"}O“òƒ°W")Óƒ“-$#ïê<1'ùït”‹à±Yzñf]™†(ìÚòÈuJÛeRoYâ xÚðc垎 uõÙ‚€KÏŸ—”ß)þB÷õ]´ß©ûμÿ•tkpdïÌKüåi¿Ðÿõ#;ý…0µßVï7´_øÿ~³âÒ¯u_)¿ ·–ÏÑþ)ËX1à{¡ý´ÕñÚöŸ„[$þöÎ@$;Ðÿeë±ØTõï™,ø¡òߟKñŸ¯12~É|!ùêXûS5–æKÆ+÷/F¨íïß…´wA+hç/»~|o6Jd’þ÷¥FÞ/CÀ¸¦©©û¢Ê/{þ¤ ûb‹¼3¬Tÿ¬ ½Èû…óÏêq×¹•.@ü?ß²qeãÊ•ÎNÜÑ3Ä‚¥ùcuTàv´Z÷»‰ìÚã½#l¬ˆXX$U˜̦¤Ü´ý^ÙùîU¹|ò£“Ç‚ßV>ùÛ:›–Ah:0h¼„ÏâW÷Űᢠûí!À .Í=çGíß;gðO>ý8JþÍkhûÖ_Ëÿš~›ö«´ÝMùlõþa©ûŽa?*Õ¿%^P@‰ÿ¤j’úùÚ?µl)ÿ¤*øOé^?5ö=?Ù}cô=(Û/ˆ/°-+ôLº/©ÿRåüÊjŽçIúíŸÊ/çµù¯‘Ù¾­æ§´^°¿F¿@î×BÂÔ'þ»û±èÿãÁ5£äoÚcèÏ{½·[YúÏH¿/[©æ½Ùß/¸}~=¢¨€LþÅÞÒ~!öº»ÏVðc˜’ïJû´-íÇç´QíÏÙ´_qÝÅø“'x`y¿ÃøËœ_ê>>ÖuÙïÐ…ß>pØÔKû‡UÍßÈûupKÕþßAøûoYù¾Nío˜4h?)Šþ“†ðË1>$ýTó±À>þOdþdÿ[·[e ÀìÓ. ~/)÷©„_Sÿeÿ ÿŠþRþíÊߨò~Êú)é@•üæÍ í>\#×ßEY?…gÚoØ~=ÔGþM²_û\¤ýOu¹ÏðýôœQIáû5ý3Õá×#R~â;²_åüTû3 R¤ü¢»O0ßÇ÷±wEîñ7µÏÒþ:ówjÿš«ö»´WfÞoô£@Ð,¿ììü_äû‚þ„ñu‡ö÷ëš¿‘÷[)¿½Ãó}cدCÿyÿ”îó³úù•ù—%ÿ)ìé{=eËù ío•UÿV™ðËÑ>ªòGy»RûgÇVŸŽç­¿Çbä¯ÕõW£³ÿFÕÝ'Jïßj÷Iþ‰÷Ž´ëý.ôWÂ/ºûóéo9Ô~‹ýV©Ÿ^«:¿òšû2ûÏHÐ#¶¬ä~ÖªøgDÕ¯ÇR~à'ºûðQhž1 ƒÁ`0 ƒÁ`0 ƒÁø\üƒÔ endstream endobj 39 0 obj <> endobj 40 0 obj <> endobj 41 0 obj <> endobj 46 0 obj [/Indexed /DeviceRGB 255 <000000FF00006B6BD2FFFFFF666666FF66667B7B7B6666C24A4AB96B6B6B4242 B1F30000FF9090B1B1DA888888737373B1A1A1FFB1B1CC6B6B181818FF33337B 7BCC6666B9E33333B9B9B99090D2DADADA8888CCB98888FFC2C2424242E37B7B FFE3E3DA9999FF1818FF7B7BEB2121B1B1EBFF4A4A8080D2C2C2E3A9A9A93333 33F33333D252529090E3DADAF3CCCCEBEB1818FFA1A1999999A1A1DAB99090FF D2D2525252EBA9A98080E3A1A1E3EBEBF3080808FF08087B7BD2FF73737373C2 5A5AB9B1B1B1292929FF4242E34242C2C2C2E3E3E3DADAEBF38888FFF3F3EB90 90FF2929FF8888C2C2EBB1B1F3FF5A5AD2D2D2EB4242E34A4A9999F3CCCCF3A1 A1F3C2C2F37373D2FF6B6B8080806B6BC26666CC5252B94A4AB1FF9999B9B9E3 B1B1E3909090B1A9A9FFB9B9D26B6BCC7373212121FF39398080CCE339399999 D29090DAC28080FFCCCC4A4A4AE38080FFEBEBFF2121FF8080F32121B9B9EBFF 52528888D28080DA393939DA4A4A9999E39090EBE3E3F3DADAFFD2D2EBF31010 FFA9A9A1A1A1A9A9DAB99999FFDADA5A5A5A8888E3A9A9E3A1A1EBF3F3F3EBEB FF101010FF10107B7BDA7373CC5A5AC2CCCCCCEBEBEBB9B9F3B1B1FFD2D2F3CC CCFFA9A9F3C2C2FF6B6BCC5252C2D273739999DAC28888F329298888DA9999EB E3E3FF8888EBA9A9EBF3F3FFD2D2FFF7B796FC949005E770C2F0F4F7B82899EB 94F741F7FC9490F7B84E6D892D05E770C2F118F7B77BF741F7FC949003EE8803 D600F713EE00016FF7A2E3007DF1C2F164000FF8DF0008402004F7A3A0C40000 1F200C000FF8000000C4000CC40000DF0008000000F713E22A001EC4000CDEFD 30C2F18CF7A10E03EE8803D60000000305E00FC2F1A800E44A05E0F8000032F7 B9C59A3DEC000030001DE803B600C2F1E000CD7C00000900CD5C000000FF92D0 05E10005E17003B600C2F20400CD7CC2F21000F56A033238FFFFFFC2F2780010 260000300021F9000028FF92D0601232FF94D0FF92A005E100F432F805E100C2 F22C66E8880000006021D3FF92D0F432F805E100C2F26C66E94B00000060D91D>]endobj 45 0 obj <>stream xœí} Oi–¶s1Ónó!H ‚Âf0IX&|&\‡5Ù| .FÁËe@_˜ F€Âm#I‡ÉÆÍF ¼?tÏ9ï¥Þ*@fâäö‚ Æ—AçbSHôïÝœiñ×­ôÆ |E ã‹`c±ªw ~~^±Iäo*ô%1Œ/+óŒÕû'6+6Áö³ò3ßBÁxo¨xÌïŸh‘¿B_ƒÁøhÙXœ{2PÜ]ï÷û»Aø¹«ÁøFp3¸Ÿ u‡zçªxƒñm`3Ä¡ýÅÐB¡¹3…¾ ƒñ…н±ØTõ$„xRÅÓúŒoþ`0^UÕ47×gî3ßî÷nãKñÅ•_ }) ãËâ—¿ßߢ©½×Â`0 ˆë}…¾ƒQT³ø3ß(n3ûŒoÑB_ƒÁ( b· } £0ˆ²ñg0¾MDÙø3ß&˜ü Æ7ŠëìûŒooXúŒoi&?ƒñ­àæó ¿_/äã®ü­µ_ð‚~ëë…¾ã7Ÿ·øWz—:7®|×ùžÔëFþÉ|_ôÒÎÇZÏwTè‹`0þA1S/‰òW6®t^¹Ò Mþëyä_?ðùþ—?× —Âäg0.‰ûÀxã †zõn,Zm;{­Ñ÷ïÿ[È¿ñù²L~ãÒ~'(Ÿ¯P °”?=4NÍ=óù’¨¶]¸Nî–ŠkI2ùŒKÂOt¯j©ðw^¿¡üѨ1©¿•ˆbë»V€ë´aý\^ +?ƒqiÜDÅ‚G3”ñ9¿Yï›üA2ß—ÌØö?˜Ïd“Ù$\+?ƒñˆåïÓÑXçw6å¯Öä§:!YhåÏmõ3@~V~ãó0°Ñ¹!Ž&déO+4:(^S…6‹;Tþ7…¸VDi&›Aîù³>îçg0. g°Sµl!@“äÔÂ/Ò}‚ü€ú@ÿd6+²V~㲘Yê\zNGcADgç†$ÿmÝÑ×*óý¬(ùÔögüÙ üŒÏÅÍÅ`pf—‚ ý@AþÃh4-ϱ+a ~D~¬øù²lûŒÏBïÒâRh³Â_ BÀ Èo ?)¿¦~mf¹ŸM²íg0>þÅx|1¾ø!þ!aø$òGÑ}¨üY‹ý…·ýÄþ$Û~ã³P¬ÿP¯Š ,Å—üףј>¥Õ&üÙB“?+J~äüïòZŒlܯB4‰†ô_ôÓL~cX¿™óg}ÉÆ|ãÚèëöð~*mwwyxïã×p:üëÙY8ŽÐgÚÏú_{jFTüPù“IV~ã3ðóœDÕñ c|Ï|¾?(É—ìÅæøº½©ðþ~d?Lã^ ¯6œÏeÀéò*œFàùRûíkÎó¦J!ßÇFôïÉRw]l\øc0.ŒÇOû逹/GõËQ}IÓö'³è¼3™Tþ—­½ìÚOõS¤û€×ÀíÝÿ>ïçOV‡VOV"«4æá“?^:,ÃÔ¸`þ¸èë“I¿;ãâ(Ö?é}ÒÛ;ÛÜ\SÕDLíóŠQ}¶j?xnâþxžòçºà>)ŒJt&ú¯6ä\|xHpÿ%Š?6éýáKöSvFùýã2é—}D8bò3—¿7ê õÂz‚ìŸû'£Øgé½:H’éGÔ8¾ho>±OÔßGþ*âõONVON]~ûס“!|t?ŒÊOQƒØIì›ç"ùÉ÷Ó ¿lR;òñãRh …B+ÐBž„zç~3 ýF²o R(¿Ãö¯ãß—ôO¡‚£éôzƒ¾çgþ£C#'CC@þW-å—ÒI$Ì€AäÏ’ñÏR¹ß¢>+?ƒqÜX‘Qèý-–Óoúœ@Ê÷3™yÛ×ìu%ÒôƒòHÈW¥ò¯"ÅÚ:424´{‚äÔ틤63¾ùµðgù…+ö2Œ‹âþ€ÄÊÊñÿ/­7¶™õ¾,ÖÝl9n^Ⱦþyð°HãWQ×ÑÞíæì¿ündhw„„ÿääDÿ0±¬? ?|á²uvƒ~Ó÷[®„•ŸÁ¸8~(¦FüýÿÆ›NÛïÓõ>‡ò¿ÝGîKáO…SaUëá‚ ŒüjûáW#€¡]Š (þ»ïÎPýQù÷¥ö'ö­Ó…ògÇůÓ0ëêXùŒ‹ãfw1Bñ`eÓxÓÅô'E_ßxÖ$s‚È¿¿Of=œŠDVwÏ^*ú½GvGFliÿè±DP_†½³U•õ§(–XÒß  ~Ö0V~ãsð˜È?V,B¿ÅxÓ-çÝüY[Á¯Qr;ùQ¶w‰æ¹_¥ðCÊOLkþð[úÓ‰ ÿOê¯Ã`üçUo_"ѧËj–Ä_¬èa]+?ƒqq<öuwûíÊŸWíOf{¨ânöóß½Šäߗ‰h½>¢Z?æûCÄSú‡FýÉõ[oìb¹ÈIääe¿êÓ0®ËýjjU‹`åg0.·€äÿ@…ñ^žîõ³Rû Û?Ü¿ M°×zg;ù‡PÞIù²ÞÙCê¿Bã?tbô…_î6ŒöŸ:û¦ˆúBû1Ð"ž¬ü ÆgÀß]è®Gþ#û7'´›å>_6LÿÞÕ« I}ª÷åŒ÷ND±ì=ÁzãT ?ÕûOÞ}âÅjî ågÅg0.çâ›þz’ÿâ çZ åÙÏ¿Qgâ*¥ü²à×`¾Òä¦b?°ý­¥ð¹·Èþ·ôŽóý„é´˜‡œØ×ƒ¦Ÿ'ô0Ÿ¿±¼¿ ù³¦ïÏŸÏ?ÂÒ/¹i6ß;¥þ!)ü#µÞQÊ/»úWëg££Ín£€ Èr¿˜Ù“dåg0>é3Ù_ßíF~£“?ébûß_¥”_VüÃ~¥ò á7ëýôRÒÿDŒðÇ©½‘ðnÿiUc|Øö3Ÿ‹XßðþŸ-úÍ8O±­á—Í_Ìc„_Ò?’Ûß=#é—"ÿÖHúÿ›Ê}¤üb€¿œÜüO¥vïæ\/7#†øeiF?Oèa0.ëÑ´wÂoÙŸ¯üz4 ÖûòÉß|ÕÈù#‘HûIûnûî¶³wgTî“Å~hVfŸÃ”_)ÿÍ ¾4-(Ùop+ŒÓ¼½€/“ŸÁ¸q±®–– „fÿŒó,Û~.ä§^þ„®ö›Ëøà„>Tþ!9Êgä­Áè¿êœ_ð%åËñ½)ç„~‚ZɇÆösÎÏ`\bîîf ÂbÿŒó´‘¿áêUQï¾GçÍÓ}ò“!1ÆG)¿9ÌÇÈù‡TÒ/föÐJ@ûûgy—lüàjšóN`0‡\¤s`ÐßüY‹û.ýüS ´ýªÚŸ@ÛNÚ/çõœ¨‚ñß\ÐkïJùMåˆ~`üö^C„îê˰ò3—…Z¤³bsSð_°¿þ†óDSùÝ ~ V¹’~þ”X¿/,øIåG¡·­æ·÷VŒÔ·ôÐËy8Ù­”?Ë9?ƒqY(î?ž©ûÏU~Ëõ»ÙþI³Ú/&öÐ^±Ž‡˜²«¤ß¾”gî?‡dÊ¿z"‚)D(?.äçø­ŒZÊGäülûŒ ã0z]ùgff*Èúûgœ§ZÕ~*÷çð›Õ~k”ϼ´ý‘°š×£êýNò{½§ÿI¿Ö}±–Ìùû Ǩ}]ìϰò3—BßmuWŽŸgfn û+Ðø»“ß>³'o„_s¾ò‹¥|(é²ÿ<ò{ñž# ü/UüHøi^ŸsÔÀ¸X»;ÃÕ~ã’°îÁûóù'>Jþlþ:E??P_Tûç§§kÐöâpÎõœ¿;‘®^ÌçO!õ÷‰œíùÊß®gõ‘úæÊ{©ˆUïK$–moÊÛu‰A>¬ü ÆE¡ïŸ®æÆïåüëæb^Ùd&ï뎤í—+ùØjt¹ß£»wz:<üÓÙÙªÉâZ¾“ï†ï´/ù›‘KyHåŸü¤ÿ\ƒ!q]õñ#€ø7ˆûçVû¬•2if ꃜu ñ“S{‘ý~ãûXÆ;ûixô•}a®W¿þôŽº÷iBϪ¹’O¿Èùé ¯:rþ.P~ZFL(¿ìyàî~ãÓPm¸þDz§]ÿ„ë¿ucJ/®Ü]:utw»+c¸ûVáûåœÞýˆõVƒ^»ŸîÌ1¢~{ÿðoâ^]«ÏDÂäÏÙ®¥±Tß±'‰~¤±}ª6yð·øWa0¾ÜÖwáõz®æ›ÂŸ?¯Ù6+í=Xt›²ÎÈIòÓHŸÈ~*%Ù¿&‡í…Qßi!ÏœúÈ«= Ÿ`Ý‘{]?Ú~rýÖÚÝ„F½x¯yûàäßè†ÁøÊÑ­¶Rþ_**Ôð^Êøëýÿ7ï>›ôc;ÊïkãŒvs˜ÎÇ 7Œö¾”ÔÇÁ{â†\Æ*^'CrmO9£'<šÃ?ï5¤tOÖûS{ÚEO_FŒñÑø[þó0_/Ž>ïÍŠMIý‰s¦ôz3ö™=”rÛoו벆øÒŒ~q“nû}ºWmkôâÊž«òîÜrdßnûnX ðÙÜ/áè7œ”Â/”_oÓã«EµYïÚcÓsúüÝ3y¨±I?òÍ·mÎÍ‘îí£Ûõí«™}4Ä_êÿÉIÎøDîäÄä¾ÝgõóEð wíWâmÜÇ‘ý>¾cƒqA˜äÿ¹¥E®å1¡–ñšÉûÀ¤©üú>½öþþvYò»º/²~âp8bQ(n/Üë„_Ýw>¢—ñÀé¼h$rÎk—Âï3oÒËýý Æ'!jÿ—‰–‰½ŠW½¿¾Û…ü9Û=»ô}zí'Í'(ë$ôr>á”pþ’ú«Î¹w«Öd¾°^ÄCÌé‘ý|ùƒZ³êf]jØnÜßÏ`| ¢FOß ÿ6Å}¼oOÞžŽå<|IºQ¯“ü¹°ãK¦ù}b–®S÷»V¾§¤ÂÒò§h= ü®¿æ}Ä»7žµ:ú4Ú?÷ß„Áø&`*ÿ¦céÞn—›vÞ›Ê/´?›qŽá?KÐðþ«2éW{åb~n#ýÞ™sø#j6_Šfó%ö#®“&3bÙn›i½ü¿ƒñ á¶EþÇzÝîz¡ûn·ëäžÔ÷ɂ޸º£ÒËôòNÝ)¹œW$üSÎõRŽ„á§•»ÂF­…?õNy±Ž‡-áQ> ƧÀPþ›@yâ=4y«¾üu"r]û‘üI`¿Ë Úá”è—Py?!Ü;÷bFOÔŠ½ÒóGhh_äìü¹“ìp°i?“ŸÁøD«£êf-HzÁüzy—î7åÕd²–öÌ¿vP:ÚŽºäO…çwï~däýéðÙ‰òü4¶/uÒ_°aªÖ”ýÄñòƒß?ŸÁ`bzxïc}{nIý±âWå>>::ZoþØŒýWk¯ÖÄj>Ÿ|Qê§á½Â\^Î'žÎ`0ƒQq·¯÷—n…1BqñÀÀÊïŸÁ`üCã ø~q´9f˜Ügò3_/¢Ñè!î×kæ÷WZ }y ãï…ê¨XÊç9¾˜hOªÜ…˜ü ÆW‹¾¨ä7t/–¢~Áäg0¾^û¯{½cHxE|IýÞ¹‰B_ƒÁø»!Åš_Eh%´‚¬³/˜êí›cåg0¾b ‚ôGBÈþf>P¸ÏÊÏ`|ÕÀ¬ÿ@wÚˆø`ø‘úMMþB_ƒÁø{¥ÿ7ú^¤}¯Ð|ä~0(ˆÇk  Ø`D‡öí×­ØÚ·Û[U;/$`4 ‡ý1íÙ÷hýÿÄÿm1¸ º¿|'€þz«îá`90>FB=»S‚ìóîÌvô:hØp%FŠ’ÙXÚOe-#¯C;à-¸³0ˆ~¿£Ž–¯ë0Ïi[hÃìÂû¢Òƒ!¡­r– ±J¢}Y]ú‚­…E”Q<ž‹åü–æ›Òo ì™MÐ<½G> }®öŸ>85èoñœ8ß¼ö Ù­h¿$‡‡ØÐ¬K7 Žá@÷©MXE÷#hÃJûG%ñiwËlŠñ¸5yKcRøIý~;é—÷‘ößOM‚ðO~?e6EðÈ{`?6ê#í[‘îÛí†%  6¤=vÏZ%ÿéÙ >0_qý˜žk„-˜·”ŸœB#n©šFxn´¸ßˆÜo´´ß&þëkmD×Ú ŽDÄGšÙáàGhHtr?RC¼/ŦP|—dÇnÄthÁ}â|¾ê)U„—ÜïÁ嬀ö¸¨º‚,nÂøp‡/ðöZ´è…XçÒ"ÿÅÅ¥xü7,ûýWÓ"ÙýÅÅà´ ù©Âm«{8‹‘òw$?p\áNݬ`{Ñ2à¡é‚ž:.£W]ûï -ðUvà7¥á é“uóœ’_Í=ôõÓ 1V½;++ñ¯áÃø±jØÅ.B}—(3viÒ~öôþÁyÚo×} þÞšMøÅ4gü›=pŠ?i¿Hš…ðÛÄŸ( •²¥ûÃnÀÝ~up«ßˆyªßO´¿µ,èkR‡bÿÔÔ䔡ü¦P1`Usaý¿ßކ͖´£êߤð‹½]÷Qõå^„€VKôÿÏ5ØTN`—}|Týy¢;<”ú7ZÍzì'í·YýÒ5°é>„‚kZ÷1àëT@(ÿÔý§OÇŸ"åi/--5%ßd$  ‚~´ÿúÔ”ð‹-ké?ŸêÿúǽKAäz$þŽþöaì>¼ ;ƒ6ò— ¦nÕŸ1⸠‘gyžö*ëLò×S…š;•m·­c«Þh¥çE>ùÓm•Èö¨`;üNG”XN¢m–ªJ ñ³fÁàSèoùý\^[ÚEûÅÞ]û ö›ªoj¿®4ÛËk¦ò?²ë¾Ò~Cù×µÝ?’H?,µ_‰¿Cûï’ðdXÖz/›¤~¿aü%ó—…ç—Ú?)ÔßÔ} (÷ úÀý)Ãú;tÉßÞJÛ¶!üZ÷Û¡µ¶Ãó±6Rú•ë—–_ÿXk¿|¨ÂÀ<ÑÞR~“þ û5]`ìÊoñ^»WíWºÄ¿&ŒÿS²ü:ï?Ê/Ô_˜~|HÖKá—q€èýC)Ñ^k¿f¿”~8øAZ±vµd~’¨/´ö —Ÿ•¼'êÓß²šüõÀsäz0ø¯ÿGûýñ½Øè„f#êô½Ù鯄ò{ªù%ëbH¢K ò÷É¿Ùu\uü-²ÇŠ®ÏzòÈß7}{‡¾IüŠ·dzº#`½”D¼úð½@삾ߌ.Å?þ¼"à=öÎ×þ½SS÷Úß,ÙeßEù­ò_3é¾~<Àl)¿®Ú]­ûÃ:ëwhÿ­~Cùïjí_6ó}ñ÷kí—•ïʯ´_Å€×È{tû–÷ÝŸ²åû¢¡÷Ý*”¿µÝ,á[[-ÁoÕOZûI÷üHÿg†æ«ä=¥ü˜üká×A e…€®FWt5v]k¼ÖUÛu­ËUûµî“í¿&…_Š>=¿Mè?E’~ÓúK`©öãš÷ãvíÏëïùAi&©š¢¿ÔþŒÖ~"¾Èõ³Û X ±òG4ÿÑ¿,mtv¯t^±‘ŸJóŽ-¨¬M“Á®ö´íx0 zh7íÑl‘ßëé»;1›'­óp£Eõ‹Ù<òÇ*ËËMò{^D©œ¯È§:–Æ«óP ©óô]LùÍBŸ“úJûEÕ/m¯ùS;GûAùO䷴ߪó­iöËðHª¿¡ÿGÍ–ö7«¼_è¾,õ©@0_i¿æ¿%ýH}þ»†õy¿~Ò}§òkö[¼'íŸt~Ù€1€lD€©ísŠ}ÛDúvÊûÛ-í?&ío•vÍ¿`¾!ýó¸ÕKÅ—ûg¦öÏ+áGç¯6Óù§„ô7Ú­€Úk°á£K‰¿Mû­Œ™MýI÷§ïÔíéSÅþ[ѯÔHdª?Žâ/ÆõÇ•ç_ú„Û·©D⟥[júä--Í‚ßãP'ð|ã xüà*þŸ¢èþ£þËÿÿ°ñ ºïknm"}O“òƒ°W")Óƒ“-$#ïê<1'ùït”‹à±Yzñf]™†(ìÚòÈuJÛeRoYâ xÚðc垎 uõÙ‚€KÏŸ—”ß)þB÷õ]´ß©ûμÿ•tkpdïÌKüåi¿Ðÿõ#;ý…0µßVï7´_øÿ~³âÒ¯u_)¿ ·–ÏÑþ)ËX1à{¡ý´ÕñÚöŸ„[$þöÎ@$;Ðÿeë±ØTõï™,ø¡òߟKñŸ¯12~É|!ùêXûS5–æKÆ+÷/F¨íïß…´wA+hç/»~|o6Jd’þ÷¥FÞ/CÀ¸¦©©û¢Ê/{þ¤ ûb‹¼3¬Tÿ¬ ½Èû…óÏêq×¹•.@ü?ß²qeãÊ•ÎNÜÑ3Ä‚¥ùcuTàv´Z÷»‰ìÚã½#l¬ˆXX$U˜̦¤Ü´ý^ÙùîU¹|ò£“Ç‚ßV>ùÛ:›–Ah:0h¼„ÏâW÷Űᢠûí!À .Í=çGíß;gðO>ý8JþÍkhûÖ_Ëÿš~›ö«´ÝMùlõþa©ûŽa?*Õ¿%^P@‰ÿ¤j’úùÚ?µl)ÿ¤*øOé^?5ö=?Ù}cô=(Û/ˆ/°-+ôLº/©ÿRåüÊjŽçIúíŸÊ/çµù¯‘Ù¾­æ§´^°¿F¿@î×BÂÔ'þ»û±èÿãÁ5£äoÚcèÏ{½·[YúÏH¿/[©æ½Ùß/¸}~=¢¨€LþÅÞÒ~!öº»ÏVðc˜’ïJû´-íÇç´QíÏÙ´_qÝÅø“'x`y¿ÃøËœ_ê>>ÖuÙïÐ…ß>pØÔKû‡UÍßÈûupKÕþßAøûoYù¾Nío˜4h?)Šþ“†ðË1>$ýTó±À>þOdþdÿ[·[e ÀìÓ. ~/)÷©„_Sÿeÿ ÿŠþRþíÊߨò~Êú)é@•üæÍ í>\#×ßEY?…gÚoØ~=ÔGþM²_û\¤ýOu¹ÏðýôœQIáû5ý3Õá×#R~â;²_åüTû3 R¤ü¢»O0ßÇ÷±wEîñ7µÏÒþ:ówjÿš«ö»´WfÞoô£@Ð,¿ììü_äû‚þ„ñu‡ö÷ëš¿‘÷[)¿½Ãó}cدCÿyÿ”îó³úù•ù—%ÿ)ìé{=eËù ío•UÿV™ðËÑ>ªòGy»RûgÇVŸŽç­¿Çbä¯ÕõW£³ÿFÕÝ'Jïßj÷Iþ‰÷Ž´ëý.ôWÂ/ºûóéo9Ô~‹ýV©Ÿ^«:¿òšû2ûÏHÐ#¶¬ä~ÖªøgDÕ¯ÇR~à'ºûðQhž1 ƒÁ`0 ƒÁ`0 ƒÁø\üƒÔ endstream endobj 50 0 obj <> endobj 51 0 obj <> endobj 52 0 obj <> endobj 57 0 obj [/Indexed /DeviceRGB 255 <000000FF00006B6BD2FFFFFF666666FF66667B7B7B6666C24A4AB96B6B6B4242 B1F30000FF9090B1B1DA888888737373B1A1A1FFB1B1CC6B6B181818FF33337B 7BCC6666B9E33333B9B9B99090D2DADADA8888CCB98888FFC2C2424242E37B7B FFE3E3DA9999FF1818FF7B7BEB2121B1B1EBFF4A4A8080D2C2C2E3A9A9A93333 33F33333D252529090E3DADAF3CCCCEBEB1818FFA1A1999999A1A1DAB99090FF D2D2525252EBA9A98080E3A1A1E3EBEBF3080808FF08087B7BD2FF73737373C2 5A5AB9B1B1B1292929FF4242E34242C2C2C2E3E3E3DADAEBF38888FFF3F3EB90 90FF2929FF8888C2C2EBB1B1F3FF5A5AD2D2D2EB4242E34A4A9999F3CCCCF3A1 A1F3C2C2F37373D2FF6B6B8080806B6BC26666CC5252B94A4AB1FF9999B9B9E3 B1B1E3909090B1A9A9FFB9B9D26B6BCC7373212121FF39398080CCE339399999 D29090DAC28080FFCCCC4A4A4AE38080FFEBEBFF2121FF8080F32121B9B9EBFF 52528888D28080DA393939DA4A4A9999E39090EBE3E3F3DADAFFD2D2EBF31010 FFA9A9A1A1A1A9A9DAB99999FFDADA5A5A5A8888E3A9A9E3A1A1EBF3F3F3EBEB FF101010FF10107B7BDA7373CC5A5AC2CCCCCCEBEBEBB9B9F3B1B1FFD2D2F3CC CCFFA9A9F3C2C2FF6B6BCC5252C2D273739999DAC28888F329298888DA9999EB E3E3FF8888EBA9A9EBF3F3FFD2D2FFF7B796FC949005E770C2F0F4F7B82899EB 94F741F7FC9490F7B84E6D892D05E770C2F118F7B77BF741F7FC949003EE8803 D600F713EE00016FF7A2E3007DF1C2F164000FF8DF0008402004F7A3A0C40000 1F200C000FF8000000C4000CC40000DF0008000000F713E22A001EC4000CDEFD 30C2F18CF7A10E03EE8803D60000000305E00FC2F1A800E44A05E0F8000032F7 B9C59A3DEC000030001DE803B600C2F1E000CD7C00000900CD5C000000FF92D0 05E10005E17003B600C2F20400CD7CC2F21000F56A033238FFFFFFC2F2780010 260000300021F9000028FF92D0601232FF94D0FF92A005E100F432F805E100C2 F22C66E8880000006021D3FF92D0F432F805E100C2F26C66E94B00000060D91D>]endobj 56 0 obj <>stream xœí} Oi–¶s1Ónó!H ‚Âf0IX&|&\‡5Ù| .FÁËe@_˜ F€Âm#I‡ÉÆÍF ¼?tÏ9ï¥Þ*@fâäö‚ Æ—AçbSHôïÝœiñ×­ôÆ |E ã‹`c±ªw ~~^±Iäo*ô%1Œ/+óŒÕû'6+6Áö³ò3ßBÁxo¨xÌïŸh‘¿B_ƒÁøhÙXœ{2PÜ]ï÷û»Aø¹«ÁøFp3¸Ÿ u‡zçªxƒñm`3Ä¡ýÅÐB¡¹3…¾ ƒñ…н±ØTõ$„xRÅÓúŒoþ`0^UÕ47×gî3ßî÷nãKñÅ•_ }) ãËâ—¿ßߢ©½×Â`0 ˆë}…¾ƒQT³ø3ß(n3ûŒoÑB_ƒÁ( b· } £0ˆ²ñg0¾MDÙø3ß&˜ü Æ7ŠëìûŒooXúŒoi&?ƒñ­àæó ¿_/äã®ü­µ_ð‚~ëë…¾ã7Ÿ·øWz—:7®|×ùžÔëFþÉ|_ôÒÎÇZÏwTè‹`0þA1S/‰òW6®t^¹Ò Mþëyä_?ðùþ—?× —Âäg0.‰ûÀxã †zõn,Zm;{­Ñ÷ïÿ[È¿ñù²L~ãÒ~'(Ÿ¯P °”?=4NÍ=óù’¨¶]¸Nî–ŠkI2ùŒKÂOt¯j©ðw^¿¡üѨ1©¿•ˆbë»V€ë´aý\^ +?ƒqiÜDÅ‚G3”ñ9¿Yï›üA2ß—ÌØö?˜Ïd“Ù$\+?ƒñˆåïÓÑXçw6å¯Öä§:!YhåÏmõ3@~V~ãó0°Ñ¹!Ž&déO+4:(^S…6‹;Tþ7…¸VDi&›Aîù³>îçg0. g°Sµl!@“äÔÂ/Ò}‚ü€ú@ÿd6+²V~㲘Yê\zNGcADgç†$ÿmÝÑ×*óý¬(ùÔögüÙ üŒÏÅÍÅ`pf—‚ ý@AþÃh4-ϱ+a ~D~¬øù²lûŒÏBïÒâRh³Â_ BÀ Èo ?)¿¦~mf¹ŸM²íg0>þÅx|1¾ø!þ!aø$òGÑ}¨üY‹ý…·ýÄþ$Û~ã³P¬ÿP¯Š ,Å—üףј>¥Õ&üÙB“?+J~äüïòZŒlܯB4‰†ô_ôÓL~cX¿™óg}ÉÆ|ãÚèëöð~*mwwyxïã×p:üëÙY8ŽÐgÚÏú_{jFTüPù“IV~ã3ðóœDÕñ c|Ï|¾?(É—ìÅæøº½©ðþ~d?Lã^ ¯6œÏeÀéò*œFàùRûíkÎó¦J!ßÇFôïÉRw]l\øc0.ŒÇOû逹/GõËQ}IÓö'³è¼3™Tþ—­½ìÚOõS¤û€×ÀíÝÿ>ïçOV‡VOV"«4æá“?^:,ÃÔ¸`þ¸èë“I¿;ãâ(Ö?é}ÒÛ;ÛÜ\SÕDLíóŠQ}¶j?xnâþxžòçºà>)ŒJt&ú¯6ä\|xHpÿ%Š?6éýáKöSvFùýã2é—}D8bò3—¿7ê õÂz‚ìŸû'£Øgé½:H’éGÔ8¾ho>±OÔßGþ*âõONVON]~ûס“!|t?ŒÊOQƒØIì›ç"ùÉ÷Ó ¿lR;òñãRh …B+ÐBž„zç~3 ýF²o R(¿Ãö¯ãß—ôO¡‚£éôzƒ¾çgþ£C#'CC@þW-å—ÒI$Ì€AäÏ’ñÏR¹ß¢>+?ƒqÜX‘Qèý-–Óoúœ@Ê÷3™yÛ×ìu%ÒôƒòHÈW¥ò¯"ÅÚ:424´{‚äÔ틤63¾ùµðgù…+ö2Œ‹âþ€ÄÊÊñÿ/­7¶™õ¾,ÖÝl9n^Ⱦþyð°HãWQ×ÑÞíæì¿ündhw„„ÿääDÿ0±¬? ?|á²uvƒ~Ó÷[®„•ŸÁ¸8~(¦FüýÿÆ›NÛïÓõ>‡ò¿ÝGîKáO…SaUëá‚ ŒüjûáW#€¡]Š (þ»ïÎPýQù÷¥ö'ö­Ó…ògÇůÓ0ëêXùŒ‹ãfw1Bñ`eÓxÓÅô'E_ßxÖ$s‚È¿¿Of=œŠDVwÏ^*ú½GvGFliÿè±DP_†½³U•õ§(–XÒß  ~Ö0V~ãsð˜È?V,B¿ÅxÓ-çÝüY[Á¯Qr;ùQ¶w‰æ¹_¥ðCÊOLkþð[úÓ‰ ÿOê¯Ã`üçUo_"ѧËj–Ä_¬èa]+?ƒqq<öuwûíÊŸWíOf{¨ânöóß½Šäߗ‰h½>¢Z?æûCÄSú‡FýÉõ[oìb¹ÈIääe¿êÓ0®ËýjjU‹`åg0.·€äÿ@…ñ^žîõ³Rû Û?Ü¿ M°×zg;ù‡PÞIù²ÞÙCê¿Bã?tbô…_î6ŒöŸ:û¦ˆúBû1Ð"ž¬ü ÆgÀß]è®Gþ#û7'´›å>_6LÿÞÕ« I}ª÷åŒ÷ND±ì=ÁzãT ?ÕûOÞ}âÅjî ågÅg0.çâ›þz’ÿâ çZ åÙÏ¿Qgâ*¥ü²à×`¾Òä¦b?°ý­¥ð¹·Èþ·ôŽóý„é´˜‡œØ×ƒ¦Ÿ'ô0Ÿ¿±¼¿ ù³¦ïÏŸÏ?ÂÒ/¹i6ß;¥þ!)ü#µÞQÊ/»úWëg££Ín£€ Èr¿˜Ù“dåg0>é3Ù_ßíF~£“?ébûß_¥”_VüÃ~¥ò á7ëýôRÒÿDŒðÇ©½‘ðnÿiUc|Øö3Ÿ‹XßðþŸ-úÍ8O±­á—Í_Ìc„_Ò?’Ûß=#é—"ÿÖHúÿ›Ê}¤üb€¿œÜüO¥vïæ\/7#†øeiF?Oèa0.ëÑ´wÂoÙŸ¯üz4 ÖûòÉß|ÕÈù#‘HûIûnûî¶³wgTî“Å~hVfŸÃ”_)ÿÍ ¾4-(Ùop+ŒÓ¼½€/“ŸÁ¸q±®–– „fÿŒó,Û~.ä§^þ„®ö›Ëøà„>Tþ!9Êgä­Áè¿êœ_ð%åËñ½)ç„~‚ZɇÆösÎÏ`\bîîf ÂbÿŒó´‘¿áêUQï¾GçÍÓ}ò“!1ÆG)¿9ÌÇÈù‡TÒ/föÐJ@ûûgy—lüàjšóN`0‡\¤s`ÐßüY‹û.ýüS ´ýªÚŸ@ÛNÚ/çõœ¨‚ñß\ÐkïJùMåˆ~`üö^C„îê˰ò3—…Z¤³bsSð_°¿þ†óDSùÝ ~ V¹’~þ”X¿/,øIåG¡·­æ·÷VŒÔ·ôÐËy8Ù­”?Ë9?ƒqY(î?ž©ûÏU~Ëõ»ÙþI³Ú/&öÐ^±Ž‡˜²«¤ß¾”gî?‡dÊ¿z"‚)D(?.äçø­ŒZÊGäülûŒ ã0z]ùgff*Èúûgœ§ZÕ~*÷çð›Õ~k”ϼ´ý‘°š×£êýNò{½§ÿI¿Ö}±–Ìùû Ǩ}]ìϰò3—BßmuWŽŸgfn û+Ðø»“ß>³'o„_s¾ò‹¥|(é²ÿ<ò{ñž# ü/UüHøi^ŸsÔÀ¸X»;ÃÕ~ã’°îÁûóù'>Jþlþ:E??P_Tûç§§kÐöâpÎõœ¿;‘®^ÌçO!õ÷‰œíùÊß®gõ‘úæÊ{©ˆUïK$–moÊÛu‰A>¬ü ÆE¡ïŸ®æÆïåüëæb^Ùd&ï뎤í—+ùØjt¹ß£»wz:<üÓÙÙªÉâZ¾“ï†ï´/ù›‘KyHåŸü¤ÿ\ƒ!q]õñ#€ø7ˆûçVû¬•2if ꃜu ñ“S{‘ý~ãûXÆ;ûixô•}a®W¿þôŽº÷iBϪ¹’O¿Èùé ¯:rþ.P~ZFL(¿ìyàî~ãÓPm¸þDz§]ÿ„ë¿ucJ/®Ü]:utw»+c¸ûVáûåœÞýˆõVƒ^»ŸîÌ1¢~{ÿðoâ^]«ÏDÂäÏÙ®¥±Tß±'‰~¤±}ª6yð·øWa0¾ÜÖwáõz®æ›ÂŸ?¯Ù6+í=Xt›²ÎÈIòÓHŸÈ~*%Ù¿&‡í…Qßi!ÏœúÈ«= Ÿ`Ý‘{]?Ú~rýÖÚÝ„F½x¯yûàäßè†ÁøÊÑ­¶Rþ_**Ôð^Êøëýÿ7ï>›ôc;ÊïkãŒvs˜ÎÇ 7Œö¾”ÔÇÁ{â†\Æ*^'CrmO9£'<šÃ?ï5¤tOÖûS{ÚEO_FŒñÑø[þó0_/Ž>ïÍŠMIý‰s¦ôz3ö™=”rÛoו벆øÒŒ~q“nû}ºWmkôâÊž«òîÜrdßnûnX ðÙÜ/áè7œ”Â/”_oÓã«EµYïÚcÓsúüÝ3y¨±I?òÍ·mÎÍ‘îí£Ûõí«™}4Ä_êÿÉIÎøDîäÄä¾ÝgõóEð wíWâmÜÇ‘ý>¾cƒqA˜äÿ¹¥E®å1¡–ñšÉûÀ¤©üú>½öþþvYò»º/²~âp8bQ(n/Üë„_Ýw>¢—ñÀé¼h$rÎk—Âï3oÒËýý Æ'!jÿ—‰–‰½ŠW½¿¾Û…ü9Û=»ô}zí'Í'(ë$ôr>á”pþ’ú«Î¹w«Öd¾°^ÄCÌé‘ý|ùƒZ³êf]jØnÜßÏ`| ¢FOß ÿ6Å}¼oOÞžŽå<|IºQ¯“ü¹°ãK¦ù}b–®S÷»V¾§¤ÂÒò§h= ü®¿æ}Ä»7žµ:ú4Ú?÷ß„Áø&`*ÿ¦céÞn—›vÞ›Ê/´?›qŽá?KÐðþ«2éW{åb~n#ýÞ™sø#j6_Šfó%ö#®“&3bÙn›i½ü¿ƒñ á¶EþÇzÝîz¡ûn·ëäžÔ÷ɂ޸º£ÒËôòNÝ)¹œW$üSÎõRŽ„á§•»ÂF­…?õNy±Ž‡-áQ> ƧÀPþ›@yâ=4y«¾üu"r]û‘üI`¿Ë Úá”è—Py?!Ü;÷bFOÔŠ½ÒóGhh_äìü¹“ìp°i?“ŸÁøD«£êf-HzÁüzy—î7åÕd²–öÌ¿vP:ÚŽºäO…çwï~däýéðÙ‰òü4¶/uÒ_°aªÖ”ýÄñòƒß?ŸÁ`bzxïc}{nIý±âWå>>::ZoþØŒýWk¯ÖÄj>Ÿ|Qê§á½Â\^Î'žÎ`0ƒQq·¯÷—n…1BqñÀÀÊïŸÁ`üCã ø~q´9f˜Ügò3_/¢Ñè!î×kæ÷WZ }y ãï…ê¨XÊç9¾˜hOªÜ…˜ü ÆW‹¾¨ä7t/–¢~Áäg0¾^û¯{½cHxE|IýÞ¹‰B_ƒÁø»!Åš_Eh%´‚¬³/˜êí›cåg0¾b ‚ôGBÈþf>P¸ÏÊÏ`|ÕÀ¬ÿ@wÚˆø`ø‘úMMþB_ƒÁø{¥ÿ7ú^¤}¯Ð|ä~0(ˆÇk  Ø`D‡öí×­ØÚ·Û[U;/$`4 ‡ý1íÙ÷hýÿÄÿm1¸ º¿|'€þz«îá`90>FB=»S‚ìóîÌvô:hØp%FŠ’ÙXÚOe-#¯C;à-¸³0ˆ~¿£Ž–¯ë0Ïi[hÃìÂû¢Òƒ!¡­r– ±J¢}Y]ú‚­…E”Q<ž‹åü–æ›Òo ì™MÐ<½G> }®öŸ>85èoñœ8ß¼ö Ù­h¿$‡‡ØÐ¬K7 Žá@÷©MXE÷#hÃJûG%ñiwËlŠñ¸5yKcRøIý~;é—÷‘ößOM‚ðO~?e6EðÈ{`?6ê#í[‘îÛí†%  6¤=vÏZ%ÿéÙ >0_qý˜žk„-˜·”ŸœB#n©šFxn´¸ßˆÜo´´ß&þëkmD×Ú ŽDÄGšÙáàGhHtr?RC¼/ŦP|—dÇnÄthÁ}â|¾ê)U„—ÜïÁ嬀ö¸¨º‚,nÂøp‡/ðöZ´è…XçÒ"ÿÅÅ¥xü7,ûýWÓ"ÙýÅÅà´ ù©Âm«{8‹‘òw$?p\áNݬ`{Ñ2à¡é‚ž:.£W]ûï -ðUvà7¥á é“uóœ’_Í=ôõÓ 1V½;++ñ¯áÃø±jØÅ.B}—(3viÒ~öôþÁyÚo×} þÞšMøÅ4gü›=pŠ?i¿Hš…ðÛÄŸ( •²¥ûÃnÀÝ~up«ßˆyªßO´¿µ,èkR‡bÿÔÔ䔡ü¦P1`Usaý¿ßކ͖´£êߤð‹½]÷Qõå^„€VKôÿÏ5ØTN`—}|Týy¢;<”ú7ZÍzì'í·YýÒ5°é>„‚kZ÷1àëT@(ÿÔý§OÇŸ"åi/--5%ßd$  ‚~´ÿúÔ”ð‹-ké?ŸêÿúǽKAäz$þŽþöaì>¼ ;ƒ6ò— ¦nÕŸ1⸠‘gyžö*ëLò×S…š;•m·­c«Þh¥çE>ùÓm•Èö¨`;üNG”XN¢m–ªJ ñ³fÁàSèoùý\^[ÚEûÅÞ]û ö›ªoj¿®4ÛËk¦ò?²ë¾Ò~Cù×µÝ?’H?,µ_‰¿Cûï’ðdXÖz/›¤~¿aü%ó—…ç—Ú?)ÔßÔ} (÷ úÀý)Ãú;tÉßÞJÛ¶!üZ÷Û¡µ¶Ãó±6Rú•ë—–_ÿXk¿|¨ÂÀ<ÑÞR~“þ û5]`ìÊoñ^»WíWºÄ¿&ŒÿS²ü:ï?Ê/Ô_˜~|HÖKá—q€èýC)Ñ^k¿f¿”~8øAZ±vµd~’¨/´ö —Ÿ•¼'êÓß²šüõÀsäz0ø¯ÿGûýñ½Øè„f#êô½Ù鯄ò{ªù%ëbH¢K ò÷É¿Ùu\uü-²ÇŠ®ÏzòÈß7}{‡¾IüŠ·dzº#`½”D¼úð½@삾ߌ.Å?þ¼"à=öÎ×þ½SS÷Úß,ÙeßEù­ò_3é¾~<Àl)¿®Ú]­ûÃ:ëwhÿ­~Cùïjí_6ó}ñ÷kí—•ïʯ´_Å€×È{tû–÷ÝŸ²åû¢¡÷Ý*”¿µÝ,á[[-ÁoÕOZûI÷üHÿg†æ«ä=¥ü˜üká×A e…€®FWt5v]k¼ÖUÛu­ËUûµî“í¿&…_Š>=¿Mè?E’~ÓúK`©öãš÷ãvíÏëïùAi&©š¢¿ÔþŒÖ~"¾Èõ³Û X ±òG4ÿÑ¿,mtv¯t^±‘ŸJóŽ-¨¬M“Á®ö´íx0 zh7íÑl‘ßëé»;1›'­óp£Eõ‹Ù<òÇ*ËËMò{^D©œ¯È§:–Æ«óP ©óô]LùÍBŸ“úJûEÕ/m¯ùS;GûAùO䷴ߪó­iöËðHª¿¡ÿGÍ–ö7«¼_è¾,õ©@0_i¿æ¿%ýH}þ»†õy¿~Ò}§òkö[¼'íŸt~Ù€1€lD€©ísŠ}ÛDúvÊûÛ-í?&ío•vÍ¿`¾!ýó¸ÕKÅ—ûg¦öÏ+áGç¯6Óù§„ô7Ú­€Úk°á£K‰¿Mû­Œ™MýI÷§ïÔíéSÅþ[ѯÔHdª?Žâ/ÆõÇ•ç_ú„Û·©D⟥[júä--Í‚ßãP'ð|ã xüà*þŸ¢èþ£þËÿÿ°ñ ºïknm"}O“òƒ°W")Óƒ“-$#ïê<1'ùït”‹à±Yzñf]™†(ìÚòÈuJÛeRoYâ xÚðc垎 uõÙ‚€KÏŸ—”ß)þB÷õ]´ß©ûμÿ•tkpdïÌKüåi¿Ðÿõ#;ý…0µßVï7´_øÿ~³âÒ¯u_)¿ ·–ÏÑþ)ËX1à{¡ý´ÕñÚöŸ„[$þöÎ@$;Ðÿeë±ØTõï™,ø¡òߟKñŸ¯12~É|!ùêXûS5–æKÆ+÷/F¨íïß…´wA+hç/»~|o6Jd’þ÷¥FÞ/CÀ¸¦©©û¢Ê/{þ¤ ûb‹¼3¬Tÿ¬ ½Èû…óÏêq×¹•.@ü?ß²qeãÊ•ÎNÜÑ3Ä‚¥ùcuTàv´Z÷»‰ìÚã½#l¬ˆXX$U˜̦¤Ü´ý^ÙùîU¹|ò£“Ç‚ßV>ùÛ:›–Ah:0h¼„ÏâW÷Űᢠûí!À .Í=çGíß;gðO>ý8JþÍkhûÖ_Ëÿš~›ö«´ÝMùlõþa©ûŽa?*Õ¿%^P@‰ÿ¤j’úùÚ?µl)ÿ¤*øOé^?5ö=?Ù}cô=(Û/ˆ/°-+ôLº/©ÿRåüÊjŽçIúíŸÊ/çµù¯‘Ù¾­æ§´^°¿F¿@î×BÂÔ'þ»û±èÿãÁ5£äoÚcèÏ{½·[YúÏH¿/[©æ½Ùß/¸}~=¢¨€LþÅÞÒ~!öº»ÏVðc˜’ïJû´-íÇç´QíÏÙ´_qÝÅø“'x`y¿ÃøËœ_ê>>ÖuÙïÐ…ß>pØÔKû‡UÍßÈûupKÕþßAøûoYù¾Nío˜4h?)Šþ“†ðË1>$ýTó±À>þOdþdÿ[·[e ÀìÓ. ~/)÷©„_Sÿeÿ ÿŠþRþíÊߨò~Êú)é@•üæÍ í>\#×ßEY?…gÚoØ~=ÔGþM²_û\¤ýOu¹ÏðýôœQIáû5ý3Õá×#R~â;²_åüTû3 R¤ü¢»O0ßÇ÷±wEîñ7µÏÒþ:ówjÿš«ö»´WfÞoô£@Ð,¿ììü_äû‚þ„ñu‡ö÷ëš¿‘÷[)¿½Ãó}cدCÿyÿ”îó³úù•ù—%ÿ)ìé{=eËù ío•UÿV™ðËÑ>ªòGy»RûgÇVŸŽç­¿Çbä¯ÕõW£³ÿFÕÝ'Jïßj÷Iþ‰÷Ž´ëý.ôWÂ/ºûóéo9Ô~‹ýV©Ÿ^«:¿òšû2ûÏHÐ#¶¬ä~ÖªøgDÕ¯ÇR~à'ºûðQhž1 ƒÁ`0 ƒÁ`0 ƒÁø\üƒÔ endstream endobj 58 0 obj <> endobj 59 0 obj <> endobj 60 0 obj <> endobj 65 0 obj [/Indexed /DeviceRGB 255 <000000FF00006B6BD2FFFFFF666666FF66667B7B7B6666C24A4AB96B6B6B4242 B1F30000FF9090B1B1DA888888737373B1A1A1FFB1B1CC6B6B181818FF33337B 7BCC6666B9E33333B9B9B99090D2DADADA8888CCB98888FFC2C2424242E37B7B FFE3E3DA9999FF1818FF7B7BEB2121B1B1EBFF4A4A8080D2C2C2E3A9A9A93333 33F33333D252529090E3DADAF3CCCCEBEB1818FFA1A1999999A1A1DAB99090FF D2D2525252EBA9A98080E3A1A1E3EBEBF3080808FF08087B7BD2FF73737373C2 5A5AB9B1B1B1292929FF4242E34242C2C2C2E3E3E3DADAEBF38888FFF3F3EB90 90FF2929FF8888C2C2EBB1B1F3FF5A5AD2D2D2EB4242E34A4A9999F3CCCCF3A1 A1F3C2C2F37373D2FF6B6B8080806B6BC26666CC5252B94A4AB1FF9999B9B9E3 B1B1E3909090B1A9A9FFB9B9D26B6BCC7373212121FF39398080CCE339399999 D29090DAC28080FFCCCC4A4A4AE38080FFEBEBFF2121FF8080F32121B9B9EBFF 52528888D28080DA393939DA4A4A9999E39090EBE3E3F3DADAFFD2D2EBF31010 FFA9A9A1A1A1A9A9DAB99999FFDADA5A5A5A8888E3A9A9E3A1A1EBF3F3F3EBEB FF101010FF10107B7BDA7373CC5A5AC2CCCCCCEBEBEBB9B9F3B1B1FFD2D2F3CC CCFFA9A9F3C2C2FF6B6BCC5252C2D273739999DAC28888F329298888DA9999EB E3E3FF8888EBA9A9EBF3F3FFD2D2FFF7B796FC949005E770C2F0F4F7B82899EB 94F741F7FC9490F7B84E6D892D05E770C2F118F7B77BF741F7FC949003EE8803 D600F713EE00016FF7A2E3007DF1C2F164000FF8DF0008402004F7A3A0C40000 1F200C000FF8000000C4000CC40000DF0008000000F713E22A001EC4000CDEFD 30C2F18CF7A10E03EE8803D60000000305E00FC2F1A800E44A05E0F8000032F7 B9C59A3DEC000030001DE803B600C2F1E000CD7C00000900CD5C000000FF92D0 05E10005E17003B600C2F20400CD7CC2F21000F56A033238FFFFFFC2F2780010 260000300021F9000028FF92D0601232FF94D0FF92A005E100F432F805E100C2 F22C66E8880000006021D3FF92D0F432F805E100C2F26C66E94B00000060D91D>]endobj 64 0 obj <>stream xœí} Oi–¶s1Ónó!H ‚Âf0IX&|&\‡5Ù| .FÁËe@_˜ F€Âm#I‡ÉÆÍF ¼?tÏ9ï¥Þ*@fâäö‚ Æ—AçbSHôïÝœiñ×­ôÆ |E ã‹`c±ªw ~~^±Iäo*ô%1Œ/+óŒÕû'6+6Áö³ò3ßBÁxo¨xÌïŸh‘¿B_ƒÁøhÙXœ{2PÜ]ï÷û»Aø¹«ÁøFp3¸Ÿ u‡zçªxƒñm`3Ä¡ýÅÐB¡¹3…¾ ƒñ…н±ØTõ$„xRÅÓúŒoþ`0^UÕ47×gî3ßî÷nãKñÅ•_ }) ãËâ—¿ßߢ©½×Â`0 ˆë}…¾ƒQT³ø3ß(n3ûŒoÑB_ƒÁ( b· } £0ˆ²ñg0¾MDÙø3ß&˜ü Æ7ŠëìûŒooXúŒoi&?ƒñ­àæó ¿_/äã®ü­µ_ð‚~ëë…¾ã7Ÿ·øWz—:7®|×ùžÔëFþÉ|_ôÒÎÇZÏwTè‹`0þA1S/‰òW6®t^¹Ò Mþëyä_?ðùþ—?× —Âäg0.‰ûÀxã †zõn,Zm;{­Ñ÷ïÿ[È¿ñù²L~ãÒ~'(Ÿ¯P °”?=4NÍ=óù’¨¶]¸Nî–ŠkI2ùŒKÂOt¯j©ðw^¿¡üѨ1©¿•ˆbë»V€ë´aý\^ +?ƒqiÜDÅ‚G3”ñ9¿Yï›üA2ß—ÌØö?˜Ïd“Ù$\+?ƒñˆåïÓÑXçw6å¯Öä§:!YhåÏmõ3@~V~ãó0°Ñ¹!Ž&déO+4:(^S…6‹;Tþ7…¸VDi&›Aîù³>îçg0. g°Sµl!@“äÔÂ/Ò}‚ü€ú@ÿd6+²V~㲘Yê\zNGcADgç†$ÿmÝÑ×*óý¬(ùÔögüÙ üŒÏÅÍÅ`pf—‚ ý@AþÃh4-ϱ+a ~D~¬øù²lûŒÏBïÒâRh³Â_ BÀ Èo ?)¿¦~mf¹ŸM²íg0>þÅx|1¾ø!þ!aø$òGÑ}¨üY‹ý…·ýÄþ$Û~ã³P¬ÿP¯Š ,Å—üףј>¥Õ&üÙB“?+J~äüïòZŒlܯB4‰†ô_ôÓL~cX¿™óg}ÉÆ|ãÚèëöð~*mwwyxïã×p:üëÙY8ŽÐgÚÏú_{jFTüPù“IV~ã3ðóœDÕñ c|Ï|¾?(É—ìÅæøº½©ðþ~d?Lã^ ¯6œÏeÀéò*œFàùRûíkÎó¦J!ßÇFôïÉRw]l\øc0.ŒÇOû逹/GõËQ}IÓö'³è¼3™Tþ—­½ìÚOõS¤û€×ÀíÝÿ>ïçOV‡VOV"«4æá“?^:,ÃÔ¸`þ¸èë“I¿;ãâ(Ö?é}ÒÛ;ÛÜ\SÕDLíóŠQ}¶j?xnâþxžòçºà>)ŒJt&ú¯6ä\|xHpÿ%Š?6éýáKöSvFùýã2é—}D8bò3—¿7ê õÂz‚ìŸû'£Øgé½:H’éGÔ8¾ho>±OÔßGþ*âõONVON]~ûס“!|t?ŒÊOQƒØIì›ç"ùÉ÷Ó ¿lR;òñãRh …B+ÐBž„zç~3 ýF²o R(¿Ãö¯ãß—ôO¡‚£éôzƒ¾çgþ£C#'CC@þW-å—ÒI$Ì€AäÏ’ñÏR¹ß¢>+?ƒqÜX‘Qèý-–Óoúœ@Ê÷3™yÛ×ìu%ÒôƒòHÈW¥ò¯"ÅÚ:424´{‚äÔ틤63¾ùµðgù…+ö2Œ‹âþ€ÄÊÊñÿ/­7¶™õ¾,ÖÝl9n^Ⱦþyð°HãWQ×ÑÞíæì¿ündhw„„ÿääDÿ0±¬? ?|á²uvƒ~Ó÷[®„•ŸÁ¸8~(¦FüýÿÆ›NÛïÓõ>‡ò¿ÝGîKáO…SaUëá‚ ŒüjûáW#€¡]Š (þ»ïÎPýQù÷¥ö'ö­Ó…ògÇůÓ0ëêXùŒ‹ãfw1Bñ`eÓxÓÅô'E_ßxÖ$s‚È¿¿Of=œŠDVwÏ^*ú½GvGFliÿè±DP_†½³U•õ§(–XÒß  ~Ö0V~ãsð˜È?V,B¿ÅxÓ-çÝüY[Á¯Qr;ùQ¶w‰æ¹_¥ðCÊOLkþð[úÓ‰ ÿOê¯Ã`üçUo_"ѧËj–Ä_¬èa]+?ƒqq<öuwûíÊŸWíOf{¨ânöóß½Šäߗ‰h½>¢Z?æûCÄSú‡FýÉõ[oìb¹ÈIääe¿êÓ0®ËýjjU‹`åg0.·€äÿ@…ñ^žîõ³Rû Û?Ü¿ M°×zg;ù‡PÞIù²ÞÙCê¿Bã?tbô…_î6ŒöŸ:û¦ˆúBû1Ð"ž¬ü ÆgÀß]è®Gþ#û7'´›å>_6LÿÞÕ« I}ª÷åŒ÷ND±ì=ÁzãT ?ÕûOÞ}âÅjî ågÅg0.çâ›þz’ÿâ çZ åÙÏ¿Qgâ*¥ü²à×`¾Òä¦b?°ý­¥ð¹·Èþ·ôŽóý„é´˜‡œØ×ƒ¦Ÿ'ô0Ÿ¿±¼¿ ù³¦ïÏŸÏ?ÂÒ/¹i6ß;¥þ!)ü#µÞQÊ/»úWëg££Ín£€ Èr¿˜Ù“dåg0>é3Ù_ßíF~£“?ébûß_¥”_VüÃ~¥ò á7ëýôRÒÿDŒðÇ©½‘ðnÿiUc|Øö3Ÿ‹XßðþŸ-úÍ8O±­á—Í_Ìc„_Ò?’Ûß=#é—"ÿÖHúÿ›Ê}¤üb€¿œÜüO¥vïæ\/7#†øeiF?Oèa0.ëÑ´wÂoÙŸ¯üz4 ÖûòÉß|ÕÈù#‘HûIûnûî¶³wgTî“Å~hVfŸÃ”_)ÿÍ ¾4-(Ùop+ŒÓ¼½€/“ŸÁ¸q±®–– „fÿŒó,Û~.ä§^þ„®ö›Ëøà„>Tþ!9Êgä­Áè¿êœ_ð%åËñ½)ç„~‚ZɇÆösÎÏ`\bîîf ÂbÿŒó´‘¿áêUQï¾GçÍÓ}ò“!1ÆG)¿9ÌÇÈù‡TÒ/föÐJ@ûûgy—lüàjšóN`0‡\¤s`ÐßüY‹û.ýüS ´ýªÚŸ@ÛNÚ/çõœ¨‚ñß\ÐkïJùMåˆ~`üö^C„îê˰ò3—…Z¤³bsSð_°¿þ†óDSùÝ ~ V¹’~þ”X¿/,øIåG¡·­æ·÷VŒÔ·ôÐËy8Ù­”?Ë9?ƒqY(î?ž©ûÏU~Ëõ»ÙþI³Ú/&öÐ^±Ž‡˜²«¤ß¾”gî?‡dÊ¿z"‚)D(?.äçø­ŒZÊGäülûŒ ã0z]ùgff*Èúûgœ§ZÕ~*÷çð›Õ~k”ϼ´ý‘°š×£êýNò{½§ÿI¿Ö}±–Ìùû Ǩ}]ìϰò3—BßmuWŽŸgfn û+Ðø»“ß>³'o„_s¾ò‹¥|(é²ÿ<ò{ñž# ü/UüHøi^ŸsÔÀ¸X»;ÃÕ~ã’°îÁûóù'>Jþlþ:E??P_Tûç§§kÐöâpÎõœ¿;‘®^ÌçO!õ÷‰œíùÊß®gõ‘úæÊ{©ˆUïK$–moÊÛu‰A>¬ü ÆE¡ïŸ®æÆïåüëæb^Ùd&ï뎤í—+ùØjt¹ß£»wz:<üÓÙÙªÉâZ¾“ï†ï´/ù›‘KyHåŸü¤ÿ\ƒ!q]õñ#€ø7ˆûçVû¬•2if ꃜu ñ“S{‘ý~ãûXÆ;ûixô•}a®W¿þôŽº÷iBϪ¹’O¿Èùé ¯:rþ.P~ZFL(¿ìyàî~ãÓPm¸þDz§]ÿ„ë¿ucJ/®Ü]:utw»+c¸ûVáûåœÞýˆõVƒ^»ŸîÌ1¢~{ÿðoâ^]«ÏDÂäÏÙ®¥±Tß±'‰~¤±}ª6yð·øWa0¾ÜÖwáõz®æ›ÂŸ?¯Ù6+í=Xt›²ÎÈIòÓHŸÈ~*%Ù¿&‡í…Qßi!ÏœúÈ«= Ÿ`Ý‘{]?Ú~rýÖÚÝ„F½x¯yûàäßè†ÁøÊÑ­¶Rþ_**Ôð^Êøëýÿ7ï>›ôc;ÊïkãŒvs˜ÎÇ 7Œö¾”ÔÇÁ{â†\Æ*^'CrmO9£'<šÃ?ï5¤tOÖûS{ÚEO_FŒñÑø[þó0_/Ž>ïÍŠMIý‰s¦ôz3ö™=”rÛoו벆øÒŒ~q“nû}ºWmkôâÊž«òîÜrdßnûnX ðÙÜ/áè7œ”Â/”_oÓã«EµYïÚcÓsúüÝ3y¨±I?òÍ·mÎÍ‘îí£Ûõí«™}4Ä_êÿÉIÎøDîäÄä¾ÝgõóEð wíWâmÜÇ‘ý>¾cƒqA˜äÿ¹¥E®å1¡–ñšÉûÀ¤©üú>½öþþvYò»º/²~âp8bQ(n/Üë„_Ýw>¢—ñÀé¼h$rÎk—Âï3oÒËýý Æ'!jÿ—‰–‰½ŠW½¿¾Û…ü9Û=»ô}zí'Í'(ë$ôr>á”pþ’ú«Î¹w«Öd¾°^ÄCÌé‘ý|ùƒZ³êf]jØnÜßÏ`| ¢FOß ÿ6Å}¼oOÞžŽå<|IºQ¯“ü¹°ãK¦ù}b–®S÷»V¾§¤ÂÒò§h= ü®¿æ}Ä»7žµ:ú4Ú?÷ß„Áø&`*ÿ¦céÞn—›vÞ›Ê/´?›qŽá?KÐðþ«2éW{åb~n#ýÞ™sø#j6_Šfó%ö#®“&3bÙn›i½ü¿ƒñ á¶EþÇzÝîz¡ûn·ëäžÔ÷ɂ޸º£ÒËôòNÝ)¹œW$üSÎõRŽ„á§•»ÂF­…?õNy±Ž‡-áQ> ƧÀPþ›@yâ=4y«¾üu"r]û‘üI`¿Ë Úá”è—Py?!Ü;÷bFOÔŠ½ÒóGhh_äìü¹“ìp°i?“ŸÁøD«£êf-HzÁüzy—î7åÕd²–öÌ¿vP:ÚŽºäO…çwï~däýéðÙ‰òü4¶/uÒ_°aªÖ”ýÄñòƒß?ŸÁ`bzxïc}{nIý±âWå>>::ZoþØŒýWk¯ÖÄj>Ÿ|Qê§á½Â\^Î'žÎ`0ƒQq·¯÷—n…1BqñÀÀÊïŸÁ`üCã ø~q´9f˜Ügò3_/¢Ñè!î×kæ÷WZ }y ãï…ê¨XÊç9¾˜hOªÜ…˜ü ÆW‹¾¨ä7t/–¢~Áäg0¾^û¯{½cHxE|IýÞ¹‰B_ƒÁø»!Åš_Eh%´‚¬³/˜êí›cåg0¾b ‚ôGBÈþf>P¸ÏÊÏ`|ÕÀ¬ÿ@wÚˆø`ø‘úMMþB_ƒÁø{¥ÿ7ú^¤}¯Ð|ä~0(ˆÇk  Ø`D‡öí×­ØÚ·Û[U;/$`4 ‡ý1íÙ÷hýÿÄÿm1¸ º¿|'€þz«îá`90>FB=»S‚ìóîÌvô:hØp%FŠ’ÙXÚOe-#¯C;à-¸³0ˆ~¿£Ž–¯ë0Ïi[hÃìÂû¢Òƒ!¡­r– ±J¢}Y]ú‚­…E”Q<ž‹åü–æ›Òo ì™MÐ<½G> }®öŸ>85èoñœ8ß¼ö Ù­h¿$‡‡ØÐ¬K7 Žá@÷©MXE÷#hÃJûG%ñiwËlŠñ¸5yKcRøIý~;é—÷‘ößOM‚ðO~?e6EðÈ{`?6ê#í[‘îÛí†%  6¤=vÏZ%ÿéÙ >0_qý˜žk„-˜·”ŸœB#n©šFxn´¸ßˆÜo´´ß&þëkmD×Ú ŽDÄGšÙáàGhHtr?RC¼/ŦP|—dÇnÄthÁ}â|¾ê)U„—ÜïÁ嬀ö¸¨º‚,nÂøp‡/ðöZ´è…XçÒ"ÿÅÅ¥xü7,ûýWÓ"ÙýÅÅà´ ù©Âm«{8‹‘òw$?p\áNݬ`{Ñ2à¡é‚ž:.£W]ûï -ðUvà7¥á é“uóœ’_Í=ôõÓ 1V½;++ñ¯áÃø±jØÅ.B}—(3viÒ~öôþÁyÚo×} þÞšMøÅ4gü›=pŠ?i¿Hš…ðÛÄŸ( •²¥ûÃnÀÝ~up«ßˆyªßO´¿µ,èkR‡bÿÔÔ䔡ü¦P1`Usaý¿ßކ͖´£êߤð‹½]÷Qõå^„€VKôÿÏ5ØTN`—}|Týy¢;<”ú7ZÍzì'í·YýÒ5°é>„‚kZ÷1àëT@(ÿÔý§OÇŸ"åi/--5%ßd$  ‚~´ÿúÔ”ð‹-ké?ŸêÿúǽKAäz$þŽþöaì>¼ ;ƒ6ò— ¦nÕŸ1⸠‘gyžö*ëLò×S…š;•m·­c«Þh¥çE>ùÓm•Èö¨`;üNG”XN¢m–ªJ ñ³fÁàSèoùý\^[ÚEûÅÞ]û ö›ªoj¿®4ÛËk¦ò?²ë¾Ò~Cù×µÝ?’H?,µ_‰¿Cûï’ðdXÖz/›¤~¿aü%ó—…ç—Ú?)ÔßÔ} (÷ úÀý)Ãú;tÉßÞJÛ¶!üZ÷Û¡µ¶Ãó±6Rú•ë—–_ÿXk¿|¨ÂÀ<ÑÞR~“þ û5]`ìÊoñ^»WíWºÄ¿&ŒÿS²ü:ï?Ê/Ô_˜~|HÖKá—q€èýC)Ñ^k¿f¿”~8øAZ±vµd~’¨/´ö —Ÿ•¼'êÓß²šüõÀsäz0ø¯ÿGûýñ½Øè„f#êô½Ù鯄ò{ªù%ëbH¢K ò÷É¿Ùu\uü-²ÇŠ®ÏzòÈß7}{‡¾IüŠ·dzº#`½”D¼úð½@삾ߌ.Å?þ¼"à=öÎ×þ½SS÷Úß,ÙeßEù­ò_3é¾~<Àl)¿®Ú]­ûÃ:ëwhÿ­~Cùïjí_6ó}ñ÷kí—•ïʯ´_Å€×È{tû–÷ÝŸ²åû¢¡÷Ý*”¿µÝ,á[[-ÁoÕOZûI÷üHÿg†æ«ä=¥ü˜üká×A e…€®FWt5v]k¼ÖUÛu­ËUûµî“í¿&…_Š>=¿Mè?E’~ÓúK`©öãš÷ãvíÏëïùAi&©š¢¿ÔþŒÖ~"¾Èõ³Û X ±òG4ÿÑ¿,mtv¯t^±‘ŸJóŽ-¨¬M“Á®ö´íx0 zh7íÑl‘ßëé»;1›'­óp£Eõ‹Ù<òÇ*ËËMò{^D©œ¯È§:–Æ«óP ©óô]LùÍBŸ“úJûEÕ/m¯ùS;GûAùO䷴ߪó­iöËðHª¿¡ÿGÍ–ö7«¼_è¾,õ©@0_i¿æ¿%ýH}þ»†õy¿~Ò}§òkö[¼'íŸt~Ù€1€lD€©ísŠ}ÛDúvÊûÛ-í?&ío•vÍ¿`¾!ýó¸ÕKÅ—ûg¦öÏ+áGç¯6Óù§„ô7Ú­€Úk°á£K‰¿Mû­Œ™MýI÷§ïÔíéSÅþ[ѯÔHdª?Žâ/ÆõÇ•ç_ú„Û·©D⟥[júä--Í‚ßãP'ð|ã xüà*þŸ¢èþ£þËÿÿ°ñ ºïknm"}O“òƒ°W")Óƒ“-$#ïê<1'ùït”‹à±Yzñf]™†(ìÚòÈuJÛeRoYâ xÚðc垎 uõÙ‚€KÏŸ—”ß)þB÷õ]´ß©ûμÿ•tkpdïÌKüåi¿Ðÿõ#;ý…0µßVï7´_øÿ~³âÒ¯u_)¿ ·–ÏÑþ)ËX1à{¡ý´ÕñÚöŸ„[$þöÎ@$;Ðÿeë±ØTõï™,ø¡òߟKñŸ¯12~É|!ùêXûS5–æKÆ+÷/F¨íïß…´wA+hç/»~|o6Jd’þ÷¥FÞ/CÀ¸¦©©û¢Ê/{þ¤ ûb‹¼3¬Tÿ¬ ½Èû…óÏêq×¹•.@ü?ß²qeãÊ•ÎNÜÑ3Ä‚¥ùcuTàv´Z÷»‰ìÚã½#l¬ˆXX$U˜̦¤Ü´ý^ÙùîU¹|ò£“Ç‚ßV>ùÛ:›–Ah:0h¼„ÏâW÷Űᢠûí!À .Í=çGíß;gðO>ý8JþÍkhûÖ_Ëÿš~›ö«´ÝMùlõþa©ûŽa?*Õ¿%^P@‰ÿ¤j’úùÚ?µl)ÿ¤*øOé^?5ö=?Ù}cô=(Û/ˆ/°-+ôLº/©ÿRåüÊjŽçIúíŸÊ/çµù¯‘Ù¾­æ§´^°¿F¿@î×BÂÔ'þ»û±èÿãÁ5£äoÚcèÏ{½·[YúÏH¿/[©æ½Ùß/¸}~=¢¨€LþÅÞÒ~!öº»ÏVðc˜’ïJû´-íÇç´QíÏÙ´_qÝÅø“'x`y¿ÃøËœ_ê>>ÖuÙïÐ…ß>pØÔKû‡UÍßÈûupKÕþßAøûoYù¾Nío˜4h?)Šþ“†ðË1>$ýTó±À>þOdþdÿ[·[e ÀìÓ. ~/)÷©„_Sÿeÿ ÿŠþRþíÊߨò~Êú)é@•üæÍ í>\#×ßEY?…gÚoØ~=ÔGþM²_û\¤ýOu¹ÏðýôœQIáû5ý3Õá×#R~â;²_åüTû3 R¤ü¢»O0ßÇ÷±wEîñ7µÏÒþ:ówjÿš«ö»´WfÞoô£@Ð,¿ììü_äû‚þ„ñu‡ö÷ëš¿‘÷[)¿½Ãó}cدCÿyÿ”îó³úù•ù—%ÿ)ìé{=eËù ío•UÿV™ðËÑ>ªòGy»RûgÇVŸŽç­¿Çbä¯ÕõW£³ÿFÕÝ'Jïßj÷Iþ‰÷Ž´ëý.ôWÂ/ºûóéo9Ô~‹ýV©Ÿ^«:¿òšû2ûÏHÐ#¶¬ä~ÖªøgDÕ¯ÇR~à'ºûðQhž1 ƒÁ`0 ƒÁ`0 ƒÁø\üƒÔ endstream endobj 66 0 obj <> endobj 67 0 obj <> endobj 68 0 obj <> endobj 73 0 obj [/Indexed /DeviceRGB 255 <000000FF00006B6BD2FFFFFF666666FF66667B7B7B6666C24A4AB96B6B6B4242 B1F30000FF9090B1B1DA888888737373B1A1A1FFB1B1CC6B6B181818FF33337B 7BCC6666B9E33333B9B9B99090D2DADADA8888CCB98888FFC2C2424242E37B7B FFE3E3DA9999FF1818FF7B7BEB2121B1B1EBFF4A4A8080D2C2C2E3A9A9A93333 33F33333D252529090E3DADAF3CCCCEBEB1818FFA1A1999999A1A1DAB99090FF D2D2525252EBA9A98080E3A1A1E3EBEBF3080808FF08087B7BD2FF73737373C2 5A5AB9B1B1B1292929FF4242E34242C2C2C2E3E3E3DADAEBF38888FFF3F3EB90 90FF2929FF8888C2C2EBB1B1F3FF5A5AD2D2D2EB4242E34A4A9999F3CCCCF3A1 A1F3C2C2F37373D2FF6B6B8080806B6BC26666CC5252B94A4AB1FF9999B9B9E3 B1B1E3909090B1A9A9FFB9B9D26B6BCC7373212121FF39398080CCE339399999 D29090DAC28080FFCCCC4A4A4AE38080FFEBEBFF2121FF8080F32121B9B9EBFF 52528888D28080DA393939DA4A4A9999E39090EBE3E3F3DADAFFD2D2EBF31010 FFA9A9A1A1A1A9A9DAB99999FFDADA5A5A5A8888E3A9A9E3A1A1EBF3F3F3EBEB FF101010FF10107B7BDA7373CC5A5AC2CCCCCCEBEBEBB9B9F3B1B1FFD2D2F3CC CCFFA9A9F3C2C2FF6B6BCC5252C2D273739999DAC28888F329298888DA9999EB E3E3FF8888EBA9A9EBF3F3FFD2D2FFF7B796FC949005E770C2F0F4F7B82899EB 94F741F7FC9490F7B84E6D892D05E770C2F118F7B77BF741F7FC949003EE8803 D600F713EE00016FF7A2E3007DF1C2F164000FF8DF0008402004F7A3A0C40000 1F200C000FF8000000C4000CC40000DF0008000000F713E22A001EC4000CDEFD 30C2F18CF7A10E03EE8803D60000000305E00FC2F1A800E44A05E0F8000032F7 B9C59A3DEC000030001DE803B600C2F1E000CD7C00000900CD5C000000FF92D0 05E10005E17003B600C2F20400CD7CC2F21000F56A033238FFFFFFC2F2780010 260000300021F9000028FF92D0601232FF94D0FF92A005E100F432F805E100C2 F22C66E8880000006021D3FF92D0F432F805E100C2F26C66E94B00000060D91D>]endobj 72 0 obj <>stream xœí} Oi–¶s1Ónó!H ‚Âf0IX&|&\‡5Ù| .FÁËe@_˜ F€Âm#I‡ÉÆÍF ¼?tÏ9ï¥Þ*@fâäö‚ Æ—AçbSHôïÝœiñ×­ôÆ |E ã‹`c±ªw ~~^±Iäo*ô%1Œ/+óŒÕû'6+6Áö³ò3ßBÁxo¨xÌïŸh‘¿B_ƒÁøhÙXœ{2PÜ]ï÷û»Aø¹«ÁøFp3¸Ÿ u‡zçªxƒñm`3Ä¡ýÅÐB¡¹3…¾ ƒñ…н±ØTõ$„xRÅÓúŒoþ`0^UÕ47×gî3ßî÷nãKñÅ•_ }) ãËâ—¿ßߢ©½×Â`0 ˆë}…¾ƒQT³ø3ß(n3ûŒoÑB_ƒÁ( b· } £0ˆ²ñg0¾MDÙø3ß&˜ü Æ7ŠëìûŒooXúŒoi&?ƒñ­àæó ¿_/äã®ü­µ_ð‚~ëë…¾ã7Ÿ·øWz—:7®|×ùžÔëFþÉ|_ôÒÎÇZÏwTè‹`0þA1S/‰òW6®t^¹Ò Mþëyä_?ðùþ—?× —Âäg0.‰ûÀxã †zõn,Zm;{­Ñ÷ïÿ[È¿ñù²L~ãÒ~'(Ÿ¯P °”?=4NÍ=óù’¨¶]¸Nî–ŠkI2ùŒKÂOt¯j©ðw^¿¡üѨ1©¿•ˆbë»V€ë´aý\^ +?ƒqiÜDÅ‚G3”ñ9¿Yï›üA2ß—ÌØö?˜Ïd“Ù$\+?ƒñˆåïÓÑXçw6å¯Öä§:!YhåÏmõ3@~V~ãó0°Ñ¹!Ž&déO+4:(^S…6‹;Tþ7…¸VDi&›Aîù³>îçg0. g°Sµl!@“äÔÂ/Ò}‚ü€ú@ÿd6+²V~㲘Yê\zNGcADgç†$ÿmÝÑ×*óý¬(ùÔögüÙ üŒÏÅÍÅ`pf—‚ ý@AþÃh4-ϱ+a ~D~¬øù²lûŒÏBïÒâRh³Â_ BÀ Èo ?)¿¦~mf¹ŸM²íg0>þÅx|1¾ø!þ!aø$òGÑ}¨üY‹ý…·ýÄþ$Û~ã³P¬ÿP¯Š ,Å—üףј>¥Õ&üÙB“?+J~äüïòZŒlܯB4‰†ô_ôÓL~cX¿™óg}ÉÆ|ãÚèëöð~*mwwyxïã×p:üëÙY8ŽÐgÚÏú_{jFTüPù“IV~ã3ðóœDÕñ c|Ï|¾?(É—ìÅæøº½©ðþ~d?Lã^ ¯6œÏeÀéò*œFàùRûíkÎó¦J!ßÇFôïÉRw]l\øc0.ŒÇOû逹/GõËQ}IÓö'³è¼3™Tþ—­½ìÚOõS¤û€×ÀíÝÿ>ïçOV‡VOV"«4æá“?^:,ÃÔ¸`þ¸èë“I¿;ãâ(Ö?é}ÒÛ;ÛÜ\SÕDLíóŠQ}¶j?xnâþxžòçºà>)ŒJt&ú¯6ä\|xHpÿ%Š?6éýáKöSvFùýã2é—}D8bò3—¿7ê õÂz‚ìŸû'£Øgé½:H’éGÔ8¾ho>±OÔßGþ*âõONVON]~ûס“!|t?ŒÊOQƒØIì›ç"ùÉ÷Ó ¿lR;òñãRh …B+ÐBž„zç~3 ýF²o R(¿Ãö¯ãß—ôO¡‚£éôzƒ¾çgþ£C#'CC@þW-å—ÒI$Ì€AäÏ’ñÏR¹ß¢>+?ƒqÜX‘Qèý-–Óoúœ@Ê÷3™yÛ×ìu%ÒôƒòHÈW¥ò¯"ÅÚ:424´{‚äÔ틤63¾ùµðgù…+ö2Œ‹âþ€ÄÊÊñÿ/­7¶™õ¾,ÖÝl9n^Ⱦþyð°HãWQ×ÑÞíæì¿ündhw„„ÿääDÿ0±¬? ?|á²uvƒ~Ó÷[®„•ŸÁ¸8~(¦FüýÿÆ›NÛïÓõ>‡ò¿ÝGîKáO…SaUëá‚ ŒüjûáW#€¡]Š (þ»ïÎPýQù÷¥ö'ö­Ó…ògÇůÓ0ëêXùŒ‹ãfw1Bñ`eÓxÓÅô'E_ßxÖ$s‚È¿¿Of=œŠDVwÏ^*ú½GvGFliÿè±DP_†½³U•õ§(–XÒß  ~Ö0V~ãsð˜È?V,B¿ÅxÓ-çÝüY[Á¯Qr;ùQ¶w‰æ¹_¥ðCÊOLkþð[úÓ‰ ÿOê¯Ã`üçUo_"ѧËj–Ä_¬èa]+?ƒqq<öuwûíÊŸWíOf{¨ânöóß½Šäߗ‰h½>¢Z?æûCÄSú‡FýÉõ[oìb¹ÈIääe¿êÓ0®ËýjjU‹`åg0.·€äÿ@…ñ^žîõ³Rû Û?Ü¿ M°×zg;ù‡PÞIù²ÞÙCê¿Bã?tbô…_î6ŒöŸ:û¦ˆúBû1Ð"ž¬ü ÆgÀß]è®Gþ#û7'´›å>_6LÿÞÕ« I}ª÷åŒ÷ND±ì=ÁzãT ?ÕûOÞ}âÅjî ågÅg0.çâ›þz’ÿâ çZ åÙÏ¿Qgâ*¥ü²à×`¾Òä¦b?°ý­¥ð¹·Èþ·ôŽóý„é´˜‡œØ×ƒ¦Ÿ'ô0Ÿ¿±¼¿ ù³¦ïÏŸÏ?ÂÒ/¹i6ß;¥þ!)ü#µÞQÊ/»úWëg££Ín£€ Èr¿˜Ù“dåg0>é3Ù_ßíF~£“?ébûß_¥”_VüÃ~¥ò á7ëýôRÒÿDŒðÇ©½‘ðnÿiUc|Øö3Ÿ‹XßðþŸ-úÍ8O±­á—Í_Ìc„_Ò?’Ûß=#é—"ÿÖHúÿ›Ê}¤üb€¿œÜüO¥vïæ\/7#†øeiF?Oèa0.ëÑ´wÂoÙŸ¯üz4 ÖûòÉß|ÕÈù#‘HûIûnûî¶³wgTî“Å~hVfŸÃ”_)ÿÍ ¾4-(Ùop+ŒÓ¼½€/“ŸÁ¸q±®–– „fÿŒó,Û~.ä§^þ„®ö›Ëøà„>Tþ!9Êgä­Áè¿êœ_ð%åËñ½)ç„~‚ZɇÆösÎÏ`\bîîf ÂbÿŒó´‘¿áêUQï¾GçÍÓ}ò“!1ÆG)¿9ÌÇÈù‡TÒ/föÐJ@ûûgy—lüàjšóN`0‡\¤s`ÐßüY‹û.ýüS ´ýªÚŸ@ÛNÚ/çõœ¨‚ñß\ÐkïJùMåˆ~`üö^C„îê˰ò3—…Z¤³bsSð_°¿þ†óDSùÝ ~ V¹’~þ”X¿/,øIåG¡·­æ·÷VŒÔ·ôÐËy8Ù­”?Ë9?ƒqY(î?ž©ûÏU~Ëõ»ÙþI³Ú/&öÐ^±Ž‡˜²«¤ß¾”gî?‡dÊ¿z"‚)D(?.äçø­ŒZÊGäülûŒ ã0z]ùgff*Èúûgœ§ZÕ~*÷çð›Õ~k”ϼ´ý‘°š×£êýNò{½§ÿI¿Ö}±–Ìùû Ǩ}]ìϰò3—BßmuWŽŸgfn û+Ðø»“ß>³'o„_s¾ò‹¥|(é²ÿ<ò{ñž# ü/UüHøi^ŸsÔÀ¸X»;ÃÕ~ã’°îÁûóù'>Jþlþ:E??P_Tûç§§kÐöâpÎõœ¿;‘®^ÌçO!õ÷‰œíùÊß®gõ‘úæÊ{©ˆUïK$–moÊÛu‰A>¬ü ÆE¡ïŸ®æÆïåüëæb^Ùd&ï뎤í—+ùØjt¹ß£»wz:<üÓÙÙªÉâZ¾“ï†ï´/ù›‘KyHåŸü¤ÿ\ƒ!q]õñ#€ø7ˆûçVû¬•2if ꃜu ñ“S{‘ý~ãûXÆ;ûixô•}a®W¿þôŽº÷iBϪ¹’O¿Èùé ¯:rþ.P~ZFL(¿ìyàî~ãÓPm¸þDz§]ÿ„ë¿ucJ/®Ü]:utw»+c¸ûVáûåœÞýˆõVƒ^»ŸîÌ1¢~{ÿðoâ^]«ÏDÂäÏÙ®¥±Tß±'‰~¤±}ª6yð·øWa0¾ÜÖwáõz®æ›ÂŸ?¯Ù6+í=Xt›²ÎÈIòÓHŸÈ~*%Ù¿&‡í…Qßi!ÏœúÈ«= Ÿ`Ý‘{]?Ú~rýÖÚÝ„F½x¯yûàäßè†ÁøÊÑ­¶Rþ_**Ôð^Êøëýÿ7ï>›ôc;ÊïkãŒvs˜ÎÇ 7Œö¾”ÔÇÁ{â†\Æ*^'CrmO9£'<šÃ?ï5¤tOÖûS{ÚEO_FŒñÑø[þó0_/Ž>ïÍŠMIý‰s¦ôz3ö™=”rÛoו벆øÒŒ~q“nû}ºWmkôâÊž«òîÜrdßnûnX ðÙÜ/áè7œ”Â/”_oÓã«EµYïÚcÓsúüÝ3y¨±I?òÍ·mÎÍ‘îí£Ûõí«™}4Ä_êÿÉIÎøDîäÄä¾ÝgõóEð wíWâmÜÇ‘ý>¾cƒqA˜äÿ¹¥E®å1¡–ñšÉûÀ¤©üú>½öþþvYò»º/²~âp8bQ(n/Üë„_Ýw>¢—ñÀé¼h$rÎk—Âï3oÒËýý Æ'!jÿ—‰–‰½ŠW½¿¾Û…ü9Û=»ô}zí'Í'(ë$ôr>á”pþ’ú«Î¹w«Öd¾°^ÄCÌé‘ý|ùƒZ³êf]jØnÜßÏ`| ¢FOß ÿ6Å}¼oOÞžŽå<|IºQ¯“ü¹°ãK¦ù}b–®S÷»V¾§¤ÂÒò§h= ü®¿æ}Ä»7žµ:ú4Ú?÷ß„Áø&`*ÿ¦céÞn—›vÞ›Ê/´?›qŽá?KÐðþ«2éW{åb~n#ýÞ™sø#j6_Šfó%ö#®“&3bÙn›i½ü¿ƒñ á¶EþÇzÝîz¡ûn·ëäžÔ÷ɂ޸º£ÒËôòNÝ)¹œW$üSÎõRŽ„á§•»ÂF­…?õNy±Ž‡-áQ> ƧÀPþ›@yâ=4y«¾üu"r]û‘üI`¿Ë Úá”è—Py?!Ü;÷bFOÔŠ½ÒóGhh_äìü¹“ìp°i?“ŸÁøD«£êf-HzÁüzy—î7åÕd²–öÌ¿vP:ÚŽºäO…çwï~däýéðÙ‰òü4¶/uÒ_°aªÖ”ýÄñòƒß?ŸÁ`bzxïc}{nIý±âWå>>::ZoþØŒýWk¯ÖÄj>Ÿ|Qê§á½Â\^Î'žÎ`0ƒQq·¯÷—n…1BqñÀÀÊïŸÁ`üCã ø~q´9f˜Ügò3_/¢Ñè!î×kæ÷WZ }y ãï…ê¨XÊç9¾˜hOªÜ…˜ü ÆW‹¾¨ä7t/–¢~Áäg0¾^û¯{½cHxE|IýÞ¹‰B_ƒÁø»!Åš_Eh%´‚¬³/˜êí›cåg0¾b ‚ôGBÈþf>P¸ÏÊÏ`|ÕÀ¬ÿ@wÚˆø`ø‘úMMþB_ƒÁø{¥ÿ7ú^¤}¯Ð|ä~0(ˆÇk  Ø`D‡öí×­ØÚ·Û[U;/$`4 ‡ý1íÙ÷hýÿÄÿm1¸ º¿|'€þz«îá`90>FB=»S‚ìóîÌvô:hØp%FŠ’ÙXÚOe-#¯C;à-¸³0ˆ~¿£Ž–¯ë0Ïi[hÃìÂû¢Òƒ!¡­r– ±J¢}Y]ú‚­…E”Q<ž‹åü–æ›Òo ì™MÐ<½G> }®öŸ>85èoñœ8ß¼ö Ù­h¿$‡‡ØÐ¬K7 Žá@÷©MXE÷#hÃJûG%ñiwËlŠñ¸5yKcRøIý~;é—÷‘ößOM‚ðO~?e6EðÈ{`?6ê#í[‘îÛí†%  6¤=vÏZ%ÿéÙ >0_qý˜žk„-˜·”ŸœB#n©šFxn´¸ßˆÜo´´ß&þëkmD×Ú ŽDÄGšÙáàGhHtr?RC¼/ŦP|—dÇnÄthÁ}â|¾ê)U„—ÜïÁ嬀ö¸¨º‚,nÂøp‡/ðöZ´è…XçÒ"ÿÅÅ¥xü7,ûýWÓ"ÙýÅÅà´ ù©Âm«{8‹‘òw$?p\áNݬ`{Ñ2à¡é‚ž:.£W]ûï -ðUvà7¥á é“uóœ’_Í=ôõÓ 1V½;++ñ¯áÃø±jØÅ.B}—(3viÒ~öôþÁyÚo×} þÞšMøÅ4gü›=pŠ?i¿Hš…ðÛÄŸ( •²¥ûÃnÀÝ~up«ßˆyªßO´¿µ,èkR‡bÿÔÔ䔡ü¦P1`Usaý¿ßކ͖´£êߤð‹½]÷Qõå^„€VKôÿÏ5ØTN`—}|Týy¢;<”ú7ZÍzì'í·YýÒ5°é>„‚kZ÷1àëT@(ÿÔý§OÇŸ"åi/--5%ßd$  ‚~´ÿúÔ”ð‹-ké?ŸêÿúǽKAäz$þŽþöaì>¼ ;ƒ6ò— ¦nÕŸ1⸠‘gyžö*ëLò×S…š;•m·­c«Þh¥çE>ùÓm•Èö¨`;üNG”XN¢m–ªJ ñ³fÁàSèoùý\^[ÚEûÅÞ]û ö›ªoj¿®4ÛËk¦ò?²ë¾Ò~Cù×µÝ?’H?,µ_‰¿Cûï’ðdXÖz/›¤~¿aü%ó—…ç—Ú?)ÔßÔ} (÷ úÀý)Ãú;tÉßÞJÛ¶!üZ÷Û¡µ¶Ãó±6Rú•ë—–_ÿXk¿|¨ÂÀ<ÑÞR~“þ û5]`ìÊoñ^»WíWºÄ¿&ŒÿS²ü:ï?Ê/Ô_˜~|HÖKá—q€èýC)Ñ^k¿f¿”~8øAZ±vµd~’¨/´ö —Ÿ•¼'êÓß²šüõÀsäz0ø¯ÿGûýñ½Øè„f#êô½Ù鯄ò{ªù%ëbH¢K ò÷É¿Ùu\uü-²ÇŠ®ÏzòÈß7}{‡¾IüŠ·dzº#`½”D¼úð½@삾ߌ.Å?þ¼"à=öÎ×þ½SS÷Úß,ÙeßEù­ò_3é¾~<Àl)¿®Ú]­ûÃ:ëwhÿ­~Cùïjí_6ó}ñ÷kí—•ïʯ´_Å€×È{tû–÷ÝŸ²åû¢¡÷Ý*”¿µÝ,á[[-ÁoÕOZûI÷üHÿg†æ«ä=¥ü˜üká×A e…€®FWt5v]k¼ÖUÛu­ËUûµî“í¿&…_Š>=¿Mè?E’~ÓúK`©öãš÷ãvíÏëïùAi&©š¢¿ÔþŒÖ~"¾Èõ³Û X ±òG4ÿÑ¿,mtv¯t^±‘ŸJóŽ-¨¬M“Á®ö´íx0 zh7íÑl‘ßëé»;1›'­óp£Eõ‹Ù<òÇ*ËËMò{^D©œ¯È§:–Æ«óP ©óô]LùÍBŸ“úJûEÕ/m¯ùS;GûAùO䷴ߪó­iöËðHª¿¡ÿGÍ–ö7«¼_è¾,õ©@0_i¿æ¿%ýH}þ»†õy¿~Ò}§òkö[¼'íŸt~Ù€1€lD€©ísŠ}ÛDúvÊûÛ-í?&ío•vÍ¿`¾!ýó¸ÕKÅ—ûg¦öÏ+áGç¯6Óù§„ô7Ú­€Úk°á£K‰¿Mû­Œ™MýI÷§ïÔíéSÅþ[ѯÔHdª?Žâ/ÆõÇ•ç_ú„Û·©D⟥[júä--Í‚ßãP'ð|ã xüà*þŸ¢èþ£þËÿÿ°ñ ºïknm"}O“òƒ°W")Óƒ“-$#ïê<1'ùït”‹à±Yzñf]™†(ìÚòÈuJÛeRoYâ xÚðc垎 uõÙ‚€KÏŸ—”ß)þB÷õ]´ß©ûμÿ•tkpdïÌKüåi¿Ðÿõ#;ý…0µßVï7´_øÿ~³âÒ¯u_)¿ ·–ÏÑþ)ËX1à{¡ý´ÕñÚöŸ„[$þöÎ@$;Ðÿeë±ØTõï™,ø¡òߟKñŸ¯12~É|!ùêXûS5–æKÆ+÷/F¨íïß…´wA+hç/»~|o6Jd’þ÷¥FÞ/CÀ¸¦©©û¢Ê/{þ¤ ûb‹¼3¬Tÿ¬ ½Èû…óÏêq×¹•.@ü?ß²qeãÊ•ÎNÜÑ3Ä‚¥ùcuTàv´Z÷»‰ìÚã½#l¬ˆXX$U˜̦¤Ü´ý^ÙùîU¹|ò£“Ç‚ßV>ùÛ:›–Ah:0h¼„ÏâW÷Űᢠûí!À .Í=çGíß;gðO>ý8JþÍkhûÖ_Ëÿš~›ö«´ÝMùlõþa©ûŽa?*Õ¿%^P@‰ÿ¤j’úùÚ?µl)ÿ¤*øOé^?5ö=?Ù}cô=(Û/ˆ/°-+ôLº/©ÿRåüÊjŽçIúíŸÊ/çµù¯‘Ù¾­æ§´^°¿F¿@î×BÂÔ'þ»û±èÿãÁ5£äoÚcèÏ{½·[YúÏH¿/[©æ½Ùß/¸}~=¢¨€LþÅÞÒ~!öº»ÏVðc˜’ïJû´-íÇç´QíÏÙ´_qÝÅø“'x`y¿ÃøËœ_ê>>ÖuÙïÐ…ß>pØÔKû‡UÍßÈûupKÕþßAøûoYù¾Nío˜4h?)Šþ“†ðË1>$ýTó±À>þOdþdÿ[·[e ÀìÓ. ~/)÷©„_Sÿeÿ ÿŠþRþíÊߨò~Êú)é@•üæÍ í>\#×ßEY?…gÚoØ~=ÔGþM²_û\¤ýOu¹ÏðýôœQIáû5ý3Õá×#R~â;²_åüTû3 R¤ü¢»O0ßÇ÷±wEîñ7µÏÒþ:ówjÿš«ö»´WfÞoô£@Ð,¿ììü_äû‚þ„ñu‡ö÷ëš¿‘÷[)¿½Ãó}cدCÿyÿ”îó³úù•ù—%ÿ)ìé{=eËù ío•UÿV™ðËÑ>ªòGy»RûgÇVŸŽç­¿Çbä¯ÕõW£³ÿFÕÝ'Jïßj÷Iþ‰÷Ž´ëý.ôWÂ/ºûóéo9Ô~‹ýV©Ÿ^«:¿òšû2ûÏHÐ#¶¬ä~ÖªøgDÕ¯ÇR~à'ºûðQhž1 ƒÁ`0 ƒÁ`0 ƒÁø\üƒÔ endstream endobj 77 0 obj <> endobj 78 0 obj <> endobj 79 0 obj <> endobj 84 0 obj [/Indexed /DeviceRGB 255 <000000FF00006B6BD2FFFFFF666666FF66667B7B7B6666C24A4AB96B6B6B4242 B1F30000FF9090B1B1DA888888737373B1A1A1FFB1B1CC6B6B181818FF33337B 7BCC6666B9E33333B9B9B99090D2DADADA8888CCB98888FFC2C2424242E37B7B FFE3E3DA9999FF1818FF7B7BEB2121B1B1EBFF4A4A8080D2C2C2E3A9A9A93333 33F33333D252529090E3DADAF3CCCCEBEB1818FFA1A1999999A1A1DAB99090FF D2D2525252EBA9A98080E3A1A1E3EBEBF3080808FF08087B7BD2FF73737373C2 5A5AB9B1B1B1292929FF4242E34242C2C2C2E3E3E3DADAEBF38888FFF3F3EB90 90FF2929FF8888C2C2EBB1B1F3FF5A5AD2D2D2EB4242E34A4A9999F3CCCCF3A1 A1F3C2C2F37373D2FF6B6B8080806B6BC26666CC5252B94A4AB1FF9999B9B9E3 B1B1E3909090B1A9A9FFB9B9D26B6BCC7373212121FF39398080CCE339399999 D29090DAC28080FFCCCC4A4A4AE38080FFEBEBFF2121FF8080F32121B9B9EBFF 52528888D28080DA393939DA4A4A9999E39090EBE3E3F3DADAFFD2D2EBF31010 FFA9A9A1A1A1A9A9DAB99999FFDADA5A5A5A8888E3A9A9E3A1A1EBF3F3F3EBEB FF101010FF10107B7BDA7373CC5A5AC2CCCCCCEBEBEBB9B9F3B1B1FFD2D2F3CC CCFFA9A9F3C2C2FF6B6BCC5252C2D273739999DAC28888F329298888DA9999EB E3E3FF8888EBA9A9EBF3F3FFD2D2FFF7B796FC949005E770C2F0F4F7B82899EB 94F741F7FC9490F7B84E6D892D05E770C2F118F7B77BF741F7FC949003EE8803 D600F713EE00016FF7A2E3007DF1C2F164000FF8DF0008402004F7A3A0C40000 1F200C000FF8000000C4000CC40000DF0008000000F713E22A001EC4000CDEFD 30C2F18CF7A10E03EE8803D60000000305E00FC2F1A800E44A05E0F8000032F7 B9C59A3DEC000030001DE803B600C2F1E000CD7C00000900CD5C000000FF92D0 05E10005E17003B600C2F20400CD7CC2F21000F56A033238FFFFFFC2F2780010 260000300021F9000028FF92D0601232FF94D0FF92A005E100F432F805E100C2 F22C66E8880000006021D3FF92D0F432F805E100C2F26C66E94B00000060D91D>]endobj 83 0 obj <>stream xœí} Oi–¶s1Ónó!H ‚Âf0IX&|&\‡5Ù| .FÁËe@_˜ F€Âm#I‡ÉÆÍF ¼?tÏ9ï¥Þ*@fâäö‚ Æ—AçbSHôïÝœiñ×­ôÆ |E ã‹`c±ªw ~~^±Iäo*ô%1Œ/+óŒÕû'6+6Áö³ò3ßBÁxo¨xÌïŸh‘¿B_ƒÁøhÙXœ{2PÜ]ï÷û»Aø¹«ÁøFp3¸Ÿ u‡zçªxƒñm`3Ä¡ýÅÐB¡¹3…¾ ƒñ…н±ØTõ$„xRÅÓúŒoþ`0^UÕ47×gî3ßî÷nãKñÅ•_ }) ãËâ—¿ßߢ©½×Â`0 ˆë}…¾ƒQT³ø3ß(n3ûŒoÑB_ƒÁ( b· } £0ˆ²ñg0¾MDÙø3ß&˜ü Æ7ŠëìûŒooXúŒoi&?ƒñ­àæó ¿_/äã®ü­µ_ð‚~ëë…¾ã7Ÿ·øWz—:7®|×ùžÔëFþÉ|_ôÒÎÇZÏwTè‹`0þA1S/‰òW6®t^¹Ò Mþëyä_?ðùþ—?× —Âäg0.‰ûÀxã †zõn,Zm;{­Ñ÷ïÿ[È¿ñù²L~ãÒ~'(Ÿ¯P °”?=4NÍ=óù’¨¶]¸Nî–ŠkI2ùŒKÂOt¯j©ðw^¿¡üѨ1©¿•ˆbë»V€ë´aý\^ +?ƒqiÜDÅ‚G3”ñ9¿Yï›üA2ß—ÌØö?˜Ïd“Ù$\+?ƒñˆåïÓÑXçw6å¯Öä§:!YhåÏmõ3@~V~ãó0°Ñ¹!Ž&déO+4:(^S…6‹;Tþ7…¸VDi&›Aîù³>îçg0. g°Sµl!@“äÔÂ/Ò}‚ü€ú@ÿd6+²V~㲘Yê\zNGcADgç†$ÿmÝÑ×*óý¬(ùÔögüÙ üŒÏÅÍÅ`pf—‚ ý@AþÃh4-ϱ+a ~D~¬øù²lûŒÏBïÒâRh³Â_ BÀ Èo ?)¿¦~mf¹ŸM²íg0>þÅx|1¾ø!þ!aø$òGÑ}¨üY‹ý…·ýÄþ$Û~ã³P¬ÿP¯Š ,Å—üףј>¥Õ&üÙB“?+J~äüïòZŒlܯB4‰†ô_ôÓL~cX¿™óg}ÉÆ|ãÚèëöð~*mwwyxïã×p:üëÙY8ŽÐgÚÏú_{jFTüPù“IV~ã3ðóœDÕñ c|Ï|¾?(É—ìÅæøº½©ðþ~d?Lã^ ¯6œÏeÀéò*œFàùRûíkÎó¦J!ßÇFôïÉRw]l\øc0.ŒÇOû逹/GõËQ}IÓö'³è¼3™Tþ—­½ìÚOõS¤û€×ÀíÝÿ>ïçOV‡VOV"«4æá“?^:,ÃÔ¸`þ¸èë“I¿;ãâ(Ö?é}ÒÛ;ÛÜ\SÕDLíóŠQ}¶j?xnâþxžòçºà>)ŒJt&ú¯6ä\|xHpÿ%Š?6éýáKöSvFùýã2é—}D8bò3—¿7ê õÂz‚ìŸû'£Øgé½:H’éGÔ8¾ho>±OÔßGþ*âõONVON]~ûס“!|t?ŒÊOQƒØIì›ç"ùÉ÷Ó ¿lR;òñãRh …B+ÐBž„zç~3 ýF²o R(¿Ãö¯ãß—ôO¡‚£éôzƒ¾çgþ£C#'CC@þW-å—ÒI$Ì€AäÏ’ñÏR¹ß¢>+?ƒqÜX‘Qèý-–Óoúœ@Ê÷3™yÛ×ìu%ÒôƒòHÈW¥ò¯"ÅÚ:424´{‚äÔ틤63¾ùµðgù…+ö2Œ‹âþ€ÄÊÊñÿ/­7¶™õ¾,ÖÝl9n^Ⱦþyð°HãWQ×ÑÞíæì¿ündhw„„ÿääDÿ0±¬? ?|á²uvƒ~Ó÷[®„•ŸÁ¸8~(¦FüýÿÆ›NÛïÓõ>‡ò¿ÝGîKáO…SaUëá‚ ŒüjûáW#€¡]Š (þ»ïÎPýQù÷¥ö'ö­Ó…ògÇůÓ0ëêXùŒ‹ãfw1Bñ`eÓxÓÅô'E_ßxÖ$s‚È¿¿Of=œŠDVwÏ^*ú½GvGFliÿè±DP_†½³U•õ§(–XÒß  ~Ö0V~ãsð˜È?V,B¿ÅxÓ-çÝüY[Á¯Qr;ùQ¶w‰æ¹_¥ðCÊOLkþð[úÓ‰ ÿOê¯Ã`üçUo_"ѧËj–Ä_¬èa]+?ƒqq<öuwûíÊŸWíOf{¨ânöóß½Šäߗ‰h½>¢Z?æûCÄSú‡FýÉõ[oìb¹ÈIääe¿êÓ0®ËýjjU‹`åg0.·€äÿ@…ñ^žîõ³Rû Û?Ü¿ M°×zg;ù‡PÞIù²ÞÙCê¿Bã?tbô…_î6ŒöŸ:û¦ˆúBû1Ð"ž¬ü ÆgÀß]è®Gþ#û7'´›å>_6LÿÞÕ« I}ª÷åŒ÷ND±ì=ÁzãT ?ÕûOÞ}âÅjî ågÅg0.çâ›þz’ÿâ çZ åÙÏ¿Qgâ*¥ü²à×`¾Òä¦b?°ý­¥ð¹·Èþ·ôŽóý„é´˜‡œØ×ƒ¦Ÿ'ô0Ÿ¿±¼¿ ù³¦ïÏŸÏ?ÂÒ/¹i6ß;¥þ!)ü#µÞQÊ/»úWëg££Ín£€ Èr¿˜Ù“dåg0>é3Ù_ßíF~£“?ébûß_¥”_VüÃ~¥ò á7ëýôRÒÿDŒðÇ©½‘ðnÿiUc|Øö3Ÿ‹XßðþŸ-úÍ8O±­á—Í_Ìc„_Ò?’Ûß=#é—"ÿÖHúÿ›Ê}¤üb€¿œÜüO¥vïæ\/7#†øeiF?Oèa0.ëÑ´wÂoÙŸ¯üz4 ÖûòÉß|ÕÈù#‘HûIûnûî¶³wgTî“Å~hVfŸÃ”_)ÿÍ ¾4-(Ùop+ŒÓ¼½€/“ŸÁ¸q±®–– „fÿŒó,Û~.ä§^þ„®ö›Ëøà„>Tþ!9Êgä­Áè¿êœ_ð%åËñ½)ç„~‚ZɇÆösÎÏ`\bîîf ÂbÿŒó´‘¿áêUQï¾GçÍÓ}ò“!1ÆG)¿9ÌÇÈù‡TÒ/föÐJ@ûûgy—lüàjšóN`0‡\¤s`ÐßüY‹û.ýüS ´ýªÚŸ@ÛNÚ/çõœ¨‚ñß\ÐkïJùMåˆ~`üö^C„îê˰ò3—…Z¤³bsSð_°¿þ†óDSùÝ ~ V¹’~þ”X¿/,øIåG¡·­æ·÷VŒÔ·ôÐËy8Ù­”?Ë9?ƒqY(î?ž©ûÏU~Ëõ»ÙþI³Ú/&öÐ^±Ž‡˜²«¤ß¾”gî?‡dÊ¿z"‚)D(?.äçø­ŒZÊGäülûŒ ã0z]ùgff*Èúûgœ§ZÕ~*÷çð›Õ~k”ϼ´ý‘°š×£êýNò{½§ÿI¿Ö}±–Ìùû Ǩ}]ìϰò3—BßmuWŽŸgfn û+Ðø»“ß>³'o„_s¾ò‹¥|(é²ÿ<ò{ñž# ü/UüHøi^ŸsÔÀ¸X»;ÃÕ~ã’°îÁûóù'>Jþlþ:E??P_Tûç§§kÐöâpÎõœ¿;‘®^ÌçO!õ÷‰œíùÊß®gõ‘úæÊ{©ˆUïK$–moÊÛu‰A>¬ü ÆE¡ïŸ®æÆïåüëæb^Ùd&ï뎤í—+ùØjt¹ß£»wz:<üÓÙÙªÉâZ¾“ï†ï´/ù›‘KyHåŸü¤ÿ\ƒ!q]õñ#€ø7ˆûçVû¬•2if ꃜu ñ“S{‘ý~ãûXÆ;ûixô•}a®W¿þôŽº÷iBϪ¹’O¿Èùé ¯:rþ.P~ZFL(¿ìyàî~ãÓPm¸þDz§]ÿ„ë¿ucJ/®Ü]:utw»+c¸ûVáûåœÞýˆõVƒ^»ŸîÌ1¢~{ÿðoâ^]«ÏDÂäÏÙ®¥±Tß±'‰~¤±}ª6yð·øWa0¾ÜÖwáõz®æ›ÂŸ?¯Ù6+í=Xt›²ÎÈIòÓHŸÈ~*%Ù¿&‡í…Qßi!ÏœúÈ«= Ÿ`Ý‘{]?Ú~rýÖÚÝ„F½x¯yûàäßè†ÁøÊÑ­¶Rþ_**Ôð^Êøëýÿ7ï>›ôc;ÊïkãŒvs˜ÎÇ 7Œö¾”ÔÇÁ{â†\Æ*^'CrmO9£'<šÃ?ï5¤tOÖûS{ÚEO_FŒñÑø[þó0_/Ž>ïÍŠMIý‰s¦ôz3ö™=”rÛoו벆øÒŒ~q“nû}ºWmkôâÊž«òîÜrdßnûnX ðÙÜ/áè7œ”Â/”_oÓã«EµYïÚcÓsúüÝ3y¨±I?òÍ·mÎÍ‘îí£Ûõí«™}4Ä_êÿÉIÎøDîäÄä¾ÝgõóEð wíWâmÜÇ‘ý>¾cƒqA˜äÿ¹¥E®å1¡–ñšÉûÀ¤©üú>½öþþvYò»º/²~âp8bQ(n/Üë„_Ýw>¢—ñÀé¼h$rÎk—Âï3oÒËýý Æ'!jÿ—‰–‰½ŠW½¿¾Û…ü9Û=»ô}zí'Í'(ë$ôr>á”pþ’ú«Î¹w«Öd¾°^ÄCÌé‘ý|ùƒZ³êf]jØnÜßÏ`| ¢FOß ÿ6Å}¼oOÞžŽå<|IºQ¯“ü¹°ãK¦ù}b–®S÷»V¾§¤ÂÒò§h= ü®¿æ}Ä»7žµ:ú4Ú?÷ß„Áø&`*ÿ¦céÞn—›vÞ›Ê/´?›qŽá?KÐðþ«2éW{åb~n#ýÞ™sø#j6_Šfó%ö#®“&3bÙn›i½ü¿ƒñ á¶EþÇzÝîz¡ûn·ëäžÔ÷ɂ޸º£ÒËôòNÝ)¹œW$üSÎõRŽ„á§•»ÂF­…?õNy±Ž‡-áQ> ƧÀPþ›@yâ=4y«¾üu"r]û‘üI`¿Ë Úá”è—Py?!Ü;÷bFOÔŠ½ÒóGhh_äìü¹“ìp°i?“ŸÁøD«£êf-HzÁüzy—î7åÕd²–öÌ¿vP:ÚŽºäO…çwï~däýéðÙ‰òü4¶/uÒ_°aªÖ”ýÄñòƒß?ŸÁ`bzxïc}{nIý±âWå>>::ZoþØŒýWk¯ÖÄj>Ÿ|Qê§á½Â\^Î'žÎ`0ƒQq·¯÷—n…1BqñÀÀÊïŸÁ`üCã ø~q´9f˜Ügò3_/¢Ñè!î×kæ÷WZ }y ãï…ê¨XÊç9¾˜hOªÜ…˜ü ÆW‹¾¨ä7t/–¢~Áäg0¾^û¯{½cHxE|IýÞ¹‰B_ƒÁø»!Åš_Eh%´‚¬³/˜êí›cåg0¾b ‚ôGBÈþf>P¸ÏÊÏ`|ÕÀ¬ÿ@wÚˆø`ø‘úMMþB_ƒÁø{¥ÿ7ú^¤}¯Ð|ä~0(ˆÇk  Ø`D‡öí×­ØÚ·Û[U;/$`4 ‡ý1íÙ÷hýÿÄÿm1¸ º¿|'€þz«îá`90>FB=»S‚ìóîÌvô:hØp%FŠ’ÙXÚOe-#¯C;à-¸³0ˆ~¿£Ž–¯ë0Ïi[hÃìÂû¢Òƒ!¡­r– ±J¢}Y]ú‚­…E”Q<ž‹åü–æ›Òo ì™MÐ<½G> }®öŸ>85èoñœ8ß¼ö Ù­h¿$‡‡ØÐ¬K7 Žá@÷©MXE÷#hÃJûG%ñiwËlŠñ¸5yKcRøIý~;é—÷‘ößOM‚ðO~?e6EðÈ{`?6ê#í[‘îÛí†%  6¤=vÏZ%ÿéÙ >0_qý˜žk„-˜·”ŸœB#n©šFxn´¸ßˆÜo´´ß&þëkmD×Ú ŽDÄGšÙáàGhHtr?RC¼/ŦP|—dÇnÄthÁ}â|¾ê)U„—ÜïÁ嬀ö¸¨º‚,nÂøp‡/ðöZ´è…XçÒ"ÿÅÅ¥xü7,ûýWÓ"ÙýÅÅà´ ù©Âm«{8‹‘òw$?p\áNݬ`{Ñ2à¡é‚ž:.£W]ûï -ðUvà7¥á é“uóœ’_Í=ôõÓ 1V½;++ñ¯áÃø±jØÅ.B}—(3viÒ~öôþÁyÚo×} þÞšMøÅ4gü›=pŠ?i¿Hš…ðÛÄŸ( •²¥ûÃnÀÝ~up«ßˆyªßO´¿µ,èkR‡bÿÔÔ䔡ü¦P1`Usaý¿ßކ͖´£êߤð‹½]÷Qõå^„€VKôÿÏ5ØTN`—}|Týy¢;<”ú7ZÍzì'í·YýÒ5°é>„‚kZ÷1àëT@(ÿÔý§OÇŸ"åi/--5%ßd$  ‚~´ÿúÔ”ð‹-ké?ŸêÿúǽKAäz$þŽþöaì>¼ ;ƒ6ò— ¦nÕŸ1⸠‘gyžö*ëLò×S…š;•m·­c«Þh¥çE>ùÓm•Èö¨`;üNG”XN¢m–ªJ ñ³fÁàSèoùý\^[ÚEûÅÞ]û ö›ªoj¿®4ÛËk¦ò?²ë¾Ò~Cù×µÝ?’H?,µ_‰¿Cûï’ðdXÖz/›¤~¿aü%ó—…ç—Ú?)ÔßÔ} (÷ úÀý)Ãú;tÉßÞJÛ¶!üZ÷Û¡µ¶Ãó±6Rú•ë—–_ÿXk¿|¨ÂÀ<ÑÞR~“þ û5]`ìÊoñ^»WíWºÄ¿&ŒÿS²ü:ï?Ê/Ô_˜~|HÖKá—q€èýC)Ñ^k¿f¿”~8øAZ±vµd~’¨/´ö —Ÿ•¼'êÓß²šüõÀsäz0ø¯ÿGûýñ½Øè„f#êô½Ù鯄ò{ªù%ëbH¢K ò÷É¿Ùu\uü-²ÇŠ®ÏzòÈß7}{‡¾IüŠ·dzº#`½”D¼úð½@삾ߌ.Å?þ¼"à=öÎ×þ½SS÷Úß,ÙeßEù­ò_3é¾~<Àl)¿®Ú]­ûÃ:ëwhÿ­~Cùïjí_6ó}ñ÷kí—•ïʯ´_Å€×È{tû–÷ÝŸ²åû¢¡÷Ý*”¿µÝ,á[[-ÁoÕOZûI÷üHÿg†æ«ä=¥ü˜üká×A e…€®FWt5v]k¼ÖUÛu­ËUûµî“í¿&…_Š>=¿Mè?E’~ÓúK`©öãš÷ãvíÏëïùAi&©š¢¿ÔþŒÖ~"¾Èõ³Û X ±òG4ÿÑ¿,mtv¯t^±‘ŸJóŽ-¨¬M“Á®ö´íx0 zh7íÑl‘ßëé»;1›'­óp£Eõ‹Ù<òÇ*ËËMò{^D©œ¯È§:–Æ«óP ©óô]LùÍBŸ“úJûEÕ/m¯ùS;GûAùO䷴ߪó­iöËðHª¿¡ÿGÍ–ö7«¼_è¾,õ©@0_i¿æ¿%ýH}þ»†õy¿~Ò}§òkö[¼'íŸt~Ù€1€lD€©ísŠ}ÛDúvÊûÛ-í?&ío•vÍ¿`¾!ýó¸ÕKÅ—ûg¦öÏ+áGç¯6Óù§„ô7Ú­€Úk°á£K‰¿Mû­Œ™MýI÷§ïÔíéSÅþ[ѯÔHdª?Žâ/ÆõÇ•ç_ú„Û·©D⟥[júä--Í‚ßãP'ð|ã xüà*þŸ¢èþ£þËÿÿ°ñ ºïknm"}O“òƒ°W")Óƒ“-$#ïê<1'ùït”‹à±Yzñf]™†(ìÚòÈuJÛeRoYâ xÚðc垎 uõÙ‚€KÏŸ—”ß)þB÷õ]´ß©ûμÿ•tkpdïÌKüåi¿Ðÿõ#;ý…0µßVï7´_øÿ~³âÒ¯u_)¿ ·–ÏÑþ)ËX1à{¡ý´ÕñÚöŸ„[$þöÎ@$;Ðÿeë±ØTõï™,ø¡òߟKñŸ¯12~É|!ùêXûS5–æKÆ+÷/F¨íïß…´wA+hç/»~|o6Jd’þ÷¥FÞ/CÀ¸¦©©û¢Ê/{þ¤ ûb‹¼3¬Tÿ¬ ½Èû…óÏêq×¹•.@ü?ß²qeãÊ•ÎNÜÑ3Ä‚¥ùcuTàv´Z÷»‰ìÚã½#l¬ˆXX$U˜̦¤Ü´ý^ÙùîU¹|ò£“Ç‚ßV>ùÛ:›–Ah:0h¼„ÏâW÷Űᢠûí!À .Í=çGíß;gðO>ý8JþÍkhûÖ_Ëÿš~›ö«´ÝMùlõþa©ûŽa?*Õ¿%^P@‰ÿ¤j’úùÚ?µl)ÿ¤*øOé^?5ö=?Ù}cô=(Û/ˆ/°-+ôLº/©ÿRåüÊjŽçIúíŸÊ/çµù¯‘Ù¾­æ§´^°¿F¿@î×BÂÔ'þ»û±èÿãÁ5£äoÚcèÏ{½·[YúÏH¿/[©æ½Ùß/¸}~=¢¨€LþÅÞÒ~!öº»ÏVðc˜’ïJû´-íÇç´QíÏÙ´_qÝÅø“'x`y¿ÃøËœ_ê>>ÖuÙïÐ…ß>pØÔKû‡UÍßÈûupKÕþßAøûoYù¾Nío˜4h?)Šþ“†ðË1>$ýTó±À>þOdþdÿ[·[e ÀìÓ. ~/)÷©„_Sÿeÿ ÿŠþRþíÊߨò~Êú)é@•üæÍ í>\#×ßEY?…gÚoØ~=ÔGþM²_û\¤ýOu¹ÏðýôœQIáû5ý3Õá×#R~â;²_åüTû3 R¤ü¢»O0ßÇ÷±wEîñ7µÏÒþ:ówjÿš«ö»´WfÞoô£@Ð,¿ììü_äû‚þ„ñu‡ö÷ëš¿‘÷[)¿½Ãó}cدCÿyÿ”îó³úù•ù—%ÿ)ìé{=eËù ío•UÿV™ðËÑ>ªòGy»RûgÇVŸŽç­¿Çbä¯ÕõW£³ÿFÕÝ'Jïßj÷Iþ‰÷Ž´ëý.ôWÂ/ºûóéo9Ô~‹ýV©Ÿ^«:¿òšû2ûÏHÐ#¶¬ä~ÖªøgDÕ¯ÇR~à'ºûðQhž1 ƒÁ`0 ƒÁ`0 ƒÁø\üƒÔ endstream endobj 85 0 obj <> endobj 86 0 obj <> endobj 87 0 obj <> endobj 92 0 obj [/Indexed /DeviceRGB 255 <000000FF00006B6BD2FFFFFF666666FF66667B7B7B6666C24A4AB96B6B6B4242 B1F30000FF9090B1B1DA888888737373B1A1A1FFB1B1CC6B6B181818FF33337B 7BCC6666B9E33333B9B9B99090D2DADADA8888CCB98888FFC2C2424242E37B7B FFE3E3DA9999FF1818FF7B7BEB2121B1B1EBFF4A4A8080D2C2C2E3A9A9A93333 33F33333D252529090E3DADAF3CCCCEBEB1818FFA1A1999999A1A1DAB99090FF D2D2525252EBA9A98080E3A1A1E3EBEBF3080808FF08087B7BD2FF73737373C2 5A5AB9B1B1B1292929FF4242E34242C2C2C2E3E3E3DADAEBF38888FFF3F3EB90 90FF2929FF8888C2C2EBB1B1F3FF5A5AD2D2D2EB4242E34A4A9999F3CCCCF3A1 A1F3C2C2F37373D2FF6B6B8080806B6BC26666CC5252B94A4AB1FF9999B9B9E3 B1B1E3909090B1A9A9FFB9B9D26B6BCC7373212121FF39398080CCE339399999 D29090DAC28080FFCCCC4A4A4AE38080FFEBEBFF2121FF8080F32121B9B9EBFF 52528888D28080DA393939DA4A4A9999E39090EBE3E3F3DADAFFD2D2EBF31010 FFA9A9A1A1A1A9A9DAB99999FFDADA5A5A5A8888E3A9A9E3A1A1EBF3F3F3EBEB FF101010FF10107B7BDA7373CC5A5AC2CCCCCCEBEBEBB9B9F3B1B1FFD2D2F3CC CCFFA9A9F3C2C2FF6B6BCC5252C2D273739999DAC28888F329298888DA9999EB E3E3FF8888EBA9A9EBF3F3FFD2D2FFF7B796FC949005E770C2F0F4F7B82899EB 94F741F7FC9490F7B84E6D892D05E770C2F118F7B77BF741F7FC949003EE8803 D600F713EE00016FF7A2E3007DF1C2F164000FF8DF0008402004F7A3A0C40000 1F200C000FF8000000C4000CC40000DF0008000000F713E22A001EC4000CDEFD 30C2F18CF7A10E03EE8803D60000000305E00FC2F1A800E44A05E0F8000032F7 B9C59A3DEC000030001DE803B600C2F1E000CD7C00000900CD5C000000FF92D0 05E10005E17003B600C2F20400CD7CC2F21000F56A033238FFFFFFC2F2780010 260000300021F9000028FF92D0601232FF94D0FF92A005E100F432F805E100C2 F22C66E8880000006021D3FF92D0F432F805E100C2F26C66E94B00000060D91D>]endobj 91 0 obj <>stream xœí} Oi–¶s1Ónó!H ‚Âf0IX&|&\‡5Ù| .FÁËe@_˜ F€Âm#I‡ÉÆÍF ¼?tÏ9ï¥Þ*@fâäö‚ Æ—AçbSHôïÝœiñ×­ôÆ |E ã‹`c±ªw ~~^±Iäo*ô%1Œ/+óŒÕû'6+6Áö³ò3ßBÁxo¨xÌïŸh‘¿B_ƒÁøhÙXœ{2PÜ]ï÷û»Aø¹«ÁøFp3¸Ÿ u‡zçªxƒñm`3Ä¡ýÅÐB¡¹3…¾ ƒñ…н±ØTõ$„xRÅÓúŒoþ`0^UÕ47×gî3ßî÷nãKñÅ•_ }) ãËâ—¿ßߢ©½×Â`0 ˆë}…¾ƒQT³ø3ß(n3ûŒoÑB_ƒÁ( b· } £0ˆ²ñg0¾MDÙø3ß&˜ü Æ7ŠëìûŒooXúŒoi&?ƒñ­àæó ¿_/äã®ü­µ_ð‚~ëë…¾ã7Ÿ·øWz—:7®|×ùžÔëFþÉ|_ôÒÎÇZÏwTè‹`0þA1S/‰òW6®t^¹Ò Mþëyä_?ðùþ—?× —Âäg0.‰ûÀxã †zõn,Zm;{­Ñ÷ïÿ[È¿ñù²L~ãÒ~'(Ÿ¯P °”?=4NÍ=óù’¨¶]¸Nî–ŠkI2ùŒKÂOt¯j©ðw^¿¡üѨ1©¿•ˆbë»V€ë´aý\^ +?ƒqiÜDÅ‚G3”ñ9¿Yï›üA2ß—ÌØö?˜Ïd“Ù$\+?ƒñˆåïÓÑXçw6å¯Öä§:!YhåÏmõ3@~V~ãó0°Ñ¹!Ž&déO+4:(^S…6‹;Tþ7…¸VDi&›Aîù³>îçg0. g°Sµl!@“äÔÂ/Ò}‚ü€ú@ÿd6+²V~㲘Yê\zNGcADgç†$ÿmÝÑ×*óý¬(ùÔögüÙ üŒÏÅÍÅ`pf—‚ ý@AþÃh4-ϱ+a ~D~¬øù²lûŒÏBïÒâRh³Â_ BÀ Èo ?)¿¦~mf¹ŸM²íg0>þÅx|1¾ø!þ!aø$òGÑ}¨üY‹ý…·ýÄþ$Û~ã³P¬ÿP¯Š ,Å—üףј>¥Õ&üÙB“?+J~äüïòZŒlܯB4‰†ô_ôÓL~cX¿™óg}ÉÆ|ãÚèëöð~*mwwyxïã×p:üëÙY8ŽÐgÚÏú_{jFTüPù“IV~ã3ðóœDÕñ c|Ï|¾?(É—ìÅæøº½©ðþ~d?Lã^ ¯6œÏeÀéò*œFàùRûíkÎó¦J!ßÇFôïÉRw]l\øc0.ŒÇOû逹/GõËQ}IÓö'³è¼3™Tþ—­½ìÚOõS¤û€×ÀíÝÿ>ïçOV‡VOV"«4æá“?^:,ÃÔ¸`þ¸èë“I¿;ãâ(Ö?é}ÒÛ;ÛÜ\SÕDLíóŠQ}¶j?xnâþxžòçºà>)ŒJt&ú¯6ä\|xHpÿ%Š?6éýáKöSvFùýã2é—}D8bò3—¿7ê õÂz‚ìŸû'£Øgé½:H’éGÔ8¾ho>±OÔßGþ*âõONVON]~ûס“!|t?ŒÊOQƒØIì›ç"ùÉ÷Ó ¿lR;òñãRh …B+ÐBž„zç~3 ýF²o R(¿Ãö¯ãß—ôO¡‚£éôzƒ¾çgþ£C#'CC@þW-å—ÒI$Ì€AäÏ’ñÏR¹ß¢>+?ƒqÜX‘Qèý-–Óoúœ@Ê÷3™yÛ×ìu%ÒôƒòHÈW¥ò¯"ÅÚ:424´{‚äÔ틤63¾ùµðgù…+ö2Œ‹âþ€ÄÊÊñÿ/­7¶™õ¾,ÖÝl9n^Ⱦþyð°HãWQ×ÑÞíæì¿ündhw„„ÿääDÿ0±¬? ?|á²uvƒ~Ó÷[®„•ŸÁ¸8~(¦FüýÿÆ›NÛïÓõ>‡ò¿ÝGîKáO…SaUëá‚ ŒüjûáW#€¡]Š (þ»ïÎPýQù÷¥ö'ö­Ó…ògÇůÓ0ëêXùŒ‹ãfw1Bñ`eÓxÓÅô'E_ßxÖ$s‚È¿¿Of=œŠDVwÏ^*ú½GvGFliÿè±DP_†½³U•õ§(–XÒß  ~Ö0V~ãsð˜È?V,B¿ÅxÓ-çÝüY[Á¯Qr;ùQ¶w‰æ¹_¥ðCÊOLkþð[úÓ‰ ÿOê¯Ã`üçUo_"ѧËj–Ä_¬èa]+?ƒqq<öuwûíÊŸWíOf{¨ânöóß½Šäߗ‰h½>¢Z?æûCÄSú‡FýÉõ[oìb¹ÈIääe¿êÓ0®ËýjjU‹`åg0.·€äÿ@…ñ^žîõ³Rû Û?Ü¿ M°×zg;ù‡PÞIù²ÞÙCê¿Bã?tbô…_î6ŒöŸ:û¦ˆúBû1Ð"ž¬ü ÆgÀß]è®Gþ#û7'´›å>_6LÿÞÕ« I}ª÷åŒ÷ND±ì=ÁzãT ?ÕûOÞ}âÅjî ågÅg0.çâ›þz’ÿâ çZ åÙÏ¿Qgâ*¥ü²à×`¾Òä¦b?°ý­¥ð¹·Èþ·ôŽóý„é´˜‡œØ×ƒ¦Ÿ'ô0Ÿ¿±¼¿ ù³¦ïÏŸÏ?ÂÒ/¹i6ß;¥þ!)ü#µÞQÊ/»úWëg££Ín£€ Èr¿˜Ù“dåg0>é3Ù_ßíF~£“?ébûß_¥”_VüÃ~¥ò á7ëýôRÒÿDŒðÇ©½‘ðnÿiUc|Øö3Ÿ‹XßðþŸ-úÍ8O±­á—Í_Ìc„_Ò?’Ûß=#é—"ÿÖHúÿ›Ê}¤üb€¿œÜüO¥vïæ\/7#†øeiF?Oèa0.ëÑ´wÂoÙŸ¯üz4 ÖûòÉß|ÕÈù#‘HûIûnûî¶³wgTî“Å~hVfŸÃ”_)ÿÍ ¾4-(Ùop+ŒÓ¼½€/“ŸÁ¸q±®–– „fÿŒó,Û~.ä§^þ„®ö›Ëøà„>Tþ!9Êgä­Áè¿êœ_ð%åËñ½)ç„~‚ZɇÆösÎÏ`\bîîf ÂbÿŒó´‘¿áêUQï¾GçÍÓ}ò“!1ÆG)¿9ÌÇÈù‡TÒ/föÐJ@ûûgy—lüàjšóN`0‡\¤s`ÐßüY‹û.ýüS ´ýªÚŸ@ÛNÚ/çõœ¨‚ñß\ÐkïJùMåˆ~`üö^C„îê˰ò3—…Z¤³bsSð_°¿þ†óDSùÝ ~ V¹’~þ”X¿/,øIåG¡·­æ·÷VŒÔ·ôÐËy8Ù­”?Ë9?ƒqY(î?ž©ûÏU~Ëõ»ÙþI³Ú/&öÐ^±Ž‡˜²«¤ß¾”gî?‡dÊ¿z"‚)D(?.äçø­ŒZÊGäülûŒ ã0z]ùgff*Èúûgœ§ZÕ~*÷çð›Õ~k”ϼ´ý‘°š×£êýNò{½§ÿI¿Ö}±–Ìùû Ǩ}]ìϰò3—BßmuWŽŸgfn û+Ðø»“ß>³'o„_s¾ò‹¥|(é²ÿ<ò{ñž# ü/UüHøi^ŸsÔÀ¸X»;ÃÕ~ã’°îÁûóù'>Jþlþ:E??P_Tûç§§kÐöâpÎõœ¿;‘®^ÌçO!õ÷‰œíùÊß®gõ‘úæÊ{©ˆUïK$–moÊÛu‰A>¬ü ÆE¡ïŸ®æÆïåüëæb^Ùd&ï뎤í—+ùØjt¹ß£»wz:<üÓÙÙªÉâZ¾“ï†ï´/ù›‘KyHåŸü¤ÿ\ƒ!q]õñ#€ø7ˆûçVû¬•2if ꃜu ñ“S{‘ý~ãûXÆ;ûixô•}a®W¿þôŽº÷iBϪ¹’O¿Èùé ¯:rþ.P~ZFL(¿ìyàî~ãÓPm¸þDz§]ÿ„ë¿ucJ/®Ü]:utw»+c¸ûVáûåœÞýˆõVƒ^»ŸîÌ1¢~{ÿðoâ^]«ÏDÂäÏÙ®¥±Tß±'‰~¤±}ª6yð·øWa0¾ÜÖwáõz®æ›ÂŸ?¯Ù6+í=Xt›²ÎÈIòÓHŸÈ~*%Ù¿&‡í…Qßi!ÏœúÈ«= Ÿ`Ý‘{]?Ú~rýÖÚÝ„F½x¯yûàäßè†ÁøÊÑ­¶Rþ_**Ôð^Êøëýÿ7ï>›ôc;ÊïkãŒvs˜ÎÇ 7Œö¾”ÔÇÁ{â†\Æ*^'CrmO9£'<šÃ?ï5¤tOÖûS{ÚEO_FŒñÑø[þó0_/Ž>ïÍŠMIý‰s¦ôz3ö™=”rÛoו벆øÒŒ~q“nû}ºWmkôâÊž«òîÜrdßnûnX ðÙÜ/áè7œ”Â/”_oÓã«EµYïÚcÓsúüÝ3y¨±I?òÍ·mÎÍ‘îí£Ûõí«™}4Ä_êÿÉIÎøDîäÄä¾ÝgõóEð wíWâmÜÇ‘ý>¾cƒqA˜äÿ¹¥E®å1¡–ñšÉûÀ¤©üú>½öþþvYò»º/²~âp8bQ(n/Üë„_Ýw>¢—ñÀé¼h$rÎk—Âï3oÒËýý Æ'!jÿ—‰–‰½ŠW½¿¾Û…ü9Û=»ô}zí'Í'(ë$ôr>á”pþ’ú«Î¹w«Öd¾°^ÄCÌé‘ý|ùƒZ³êf]jØnÜßÏ`| ¢FOß ÿ6Å}¼oOÞžŽå<|IºQ¯“ü¹°ãK¦ù}b–®S÷»V¾§¤ÂÒò§h= ü®¿æ}Ä»7žµ:ú4Ú?÷ß„Áø&`*ÿ¦céÞn—›vÞ›Ê/´?›qŽá?KÐðþ«2éW{åb~n#ýÞ™sø#j6_Šfó%ö#®“&3bÙn›i½ü¿ƒñ á¶EþÇzÝîz¡ûn·ëäžÔ÷ɂ޸º£ÒËôòNÝ)¹œW$üSÎõRŽ„á§•»ÂF­…?õNy±Ž‡-áQ> ƧÀPþ›@yâ=4y«¾üu"r]û‘üI`¿Ë Úá”è—Py?!Ü;÷bFOÔŠ½ÒóGhh_äìü¹“ìp°i?“ŸÁøD«£êf-HzÁüzy—î7åÕd²–öÌ¿vP:ÚŽºäO…çwï~däýéðÙ‰òü4¶/uÒ_°aªÖ”ýÄñòƒß?ŸÁ`bzxïc}{nIý±âWå>>::ZoþØŒýWk¯ÖÄj>Ÿ|Qê§á½Â\^Î'žÎ`0ƒQq·¯÷—n…1BqñÀÀÊïŸÁ`üCã ø~q´9f˜Ügò3_/¢Ñè!î×kæ÷WZ }y ãï…ê¨XÊç9¾˜hOªÜ…˜ü ÆW‹¾¨ä7t/–¢~Áäg0¾^û¯{½cHxE|IýÞ¹‰B_ƒÁø»!Åš_Eh%´‚¬³/˜êí›cåg0¾b ‚ôGBÈþf>P¸ÏÊÏ`|ÕÀ¬ÿ@wÚˆø`ø‘úMMþB_ƒÁø{¥ÿ7ú^¤}¯Ð|ä~0(ˆÇk  Ø`D‡öí×­ØÚ·Û[U;/$`4 ‡ý1íÙ÷hýÿÄÿm1¸ º¿|'€þz«îá`90>FB=»S‚ìóîÌvô:hØp%FŠ’ÙXÚOe-#¯C;à-¸³0ˆ~¿£Ž–¯ë0Ïi[hÃìÂû¢Òƒ!¡­r– ±J¢}Y]ú‚­…E”Q<ž‹åü–æ›Òo ì™MÐ<½G> }®öŸ>85èoñœ8ß¼ö Ù­h¿$‡‡ØÐ¬K7 Žá@÷©MXE÷#hÃJûG%ñiwËlŠñ¸5yKcRøIý~;é—÷‘ößOM‚ðO~?e6EðÈ{`?6ê#í[‘îÛí†%  6¤=vÏZ%ÿéÙ >0_qý˜žk„-˜·”ŸœB#n©šFxn´¸ßˆÜo´´ß&þëkmD×Ú ŽDÄGšÙáàGhHtr?RC¼/ŦP|—dÇnÄthÁ}â|¾ê)U„—ÜïÁ嬀ö¸¨º‚,nÂøp‡/ðöZ´è…XçÒ"ÿÅÅ¥xü7,ûýWÓ"ÙýÅÅà´ ù©Âm«{8‹‘òw$?p\áNݬ`{Ñ2à¡é‚ž:.£W]ûï -ðUvà7¥á é“uóœ’_Í=ôõÓ 1V½;++ñ¯áÃø±jØÅ.B}—(3viÒ~öôþÁyÚo×} þÞšMøÅ4gü›=pŠ?i¿Hš…ðÛÄŸ( •²¥ûÃnÀÝ~up«ßˆyªßO´¿µ,èkR‡bÿÔÔ䔡ü¦P1`Usaý¿ßކ͖´£êߤð‹½]÷Qõå^„€VKôÿÏ5ØTN`—}|Týy¢;<”ú7ZÍzì'í·YýÒ5°é>„‚kZ÷1àëT@(ÿÔý§OÇŸ"åi/--5%ßd$  ‚~´ÿúÔ”ð‹-ké?ŸêÿúǽKAäz$þŽþöaì>¼ ;ƒ6ò— ¦nÕŸ1⸠‘gyžö*ëLò×S…š;•m·­c«Þh¥çE>ùÓm•Èö¨`;üNG”XN¢m–ªJ ñ³fÁàSèoùý\^[ÚEûÅÞ]û ö›ªoj¿®4ÛËk¦ò?²ë¾Ò~Cù×µÝ?’H?,µ_‰¿Cûï’ðdXÖz/›¤~¿aü%ó—…ç—Ú?)ÔßÔ} (÷ úÀý)Ãú;tÉßÞJÛ¶!üZ÷Û¡µ¶Ãó±6Rú•ë—–_ÿXk¿|¨ÂÀ<ÑÞR~“þ û5]`ìÊoñ^»WíWºÄ¿&ŒÿS²ü:ï?Ê/Ô_˜~|HÖKá—q€èýC)Ñ^k¿f¿”~8øAZ±vµd~’¨/´ö —Ÿ•¼'êÓß²šüõÀsäz0ø¯ÿGûýñ½Øè„f#êô½Ù鯄ò{ªù%ëbH¢K ò÷É¿Ùu\uü-²ÇŠ®ÏzòÈß7}{‡¾IüŠ·dzº#`½”D¼úð½@삾ߌ.Å?þ¼"à=öÎ×þ½SS÷Úß,ÙeßEù­ò_3é¾~<Àl)¿®Ú]­ûÃ:ëwhÿ­~Cùïjí_6ó}ñ÷kí—•ïʯ´_Å€×È{tû–÷ÝŸ²åû¢¡÷Ý*”¿µÝ,á[[-ÁoÕOZûI÷üHÿg†æ«ä=¥ü˜üká×A e…€®FWt5v]k¼ÖUÛu­ËUûµî“í¿&…_Š>=¿Mè?E’~ÓúK`©öãš÷ãvíÏëïùAi&©š¢¿ÔþŒÖ~"¾Èõ³Û X ±òG4ÿÑ¿,mtv¯t^±‘ŸJóŽ-¨¬M“Á®ö´íx0 zh7íÑl‘ßëé»;1›'­óp£Eõ‹Ù<òÇ*ËËMò{^D©œ¯È§:–Æ«óP ©óô]LùÍBŸ“úJûEÕ/m¯ùS;GûAùO䷴ߪó­iöËðHª¿¡ÿGÍ–ö7«¼_è¾,õ©@0_i¿æ¿%ýH}þ»†õy¿~Ò}§òkö[¼'íŸt~Ù€1€lD€©ísŠ}ÛDúvÊûÛ-í?&ío•vÍ¿`¾!ýó¸ÕKÅ—ûg¦öÏ+áGç¯6Óù§„ô7Ú­€Úk°á£K‰¿Mû­Œ™MýI÷§ïÔíéSÅþ[ѯÔHdª?Žâ/ÆõÇ•ç_ú„Û·©D⟥[júä--Í‚ßãP'ð|ã xüà*þŸ¢èþ£þËÿÿ°ñ ºïknm"}O“òƒ°W")Óƒ“-$#ïê<1'ùït”‹à±Yzñf]™†(ìÚòÈuJÛeRoYâ xÚðc垎 uõÙ‚€KÏŸ—”ß)þB÷õ]´ß©ûμÿ•tkpdïÌKüåi¿Ðÿõ#;ý…0µßVï7´_øÿ~³âÒ¯u_)¿ ·–ÏÑþ)ËX1à{¡ý´ÕñÚöŸ„[$þöÎ@$;Ðÿeë±ØTõï™,ø¡òߟKñŸ¯12~É|!ùêXûS5–æKÆ+÷/F¨íïß…´wA+hç/»~|o6Jd’þ÷¥FÞ/CÀ¸¦©©û¢Ê/{þ¤ ûb‹¼3¬Tÿ¬ ½Èû…óÏêq×¹•.@ü?ß²qeãÊ•ÎNÜÑ3Ä‚¥ùcuTàv´Z÷»‰ìÚã½#l¬ˆXX$U˜̦¤Ü´ý^ÙùîU¹|ò£“Ç‚ßV>ùÛ:›–Ah:0h¼„ÏâW÷Űᢠûí!À .Í=çGíß;gðO>ý8JþÍkhûÖ_Ëÿš~›ö«´ÝMùlõþa©ûŽa?*Õ¿%^P@‰ÿ¤j’úùÚ?µl)ÿ¤*øOé^?5ö=?Ù}cô=(Û/ˆ/°-+ôLº/©ÿRåüÊjŽçIúíŸÊ/çµù¯‘Ù¾­æ§´^°¿F¿@î×BÂÔ'þ»û±èÿãÁ5£äoÚcèÏ{½·[YúÏH¿/[©æ½Ùß/¸}~=¢¨€LþÅÞÒ~!öº»ÏVðc˜’ïJû´-íÇç´QíÏÙ´_qÝÅø“'x`y¿ÃøËœ_ê>>ÖuÙïÐ…ß>pØÔKû‡UÍßÈûupKÕþßAøûoYù¾Nío˜4h?)Šþ“†ðË1>$ýTó±À>þOdþdÿ[·[e ÀìÓ. ~/)÷©„_Sÿeÿ ÿŠþRþíÊߨò~Êú)é@•üæÍ í>\#×ßEY?…gÚoØ~=ÔGþM²_û\¤ýOu¹ÏðýôœQIáû5ý3Õá×#R~â;²_åüTû3 R¤ü¢»O0ßÇ÷±wEîñ7µÏÒþ:ówjÿš«ö»´WfÞoô£@Ð,¿ììü_äû‚þ„ñu‡ö÷ëš¿‘÷[)¿½Ãó}cدCÿyÿ”îó³úù•ù—%ÿ)ìé{=eËù ío•UÿV™ðËÑ>ªòGy»RûgÇVŸŽç­¿Çbä¯ÕõW£³ÿFÕÝ'Jïßj÷Iþ‰÷Ž´ëý.ôWÂ/ºûóéo9Ô~‹ýV©Ÿ^«:¿òšû2ûÏHÐ#¶¬ä~ÖªøgDÕ¯ÇR~à'ºûðQhž1 ƒÁ`0 ƒÁ`0 ƒÁø\üƒÔ endstream endobj 93 0 obj <> endobj 94 0 obj <> endobj 95 0 obj <> endobj 100 0 obj [/Indexed /DeviceRGB 255 <000000FF00006B6BD2FFFFFF666666FF66667B7B7B6666C24A4AB96B6B6B4242 B1F30000FF9090B1B1DA888888737373B1A1A1FFB1B1CC6B6B181818FF33337B 7BCC6666B9E33333B9B9B99090D2DADADA8888CCB98888FFC2C2424242E37B7B FFE3E3DA9999FF1818FF7B7BEB2121B1B1EBFF4A4A8080D2C2C2E3A9A9A93333 33F33333D252529090E3DADAF3CCCCEBEB1818FFA1A1999999A1A1DAB99090FF D2D2525252EBA9A98080E3A1A1E3EBEBF3080808FF08087B7BD2FF73737373C2 5A5AB9B1B1B1292929FF4242E34242C2C2C2E3E3E3DADAEBF38888FFF3F3EB90 90FF2929FF8888C2C2EBB1B1F3FF5A5AD2D2D2EB4242E34A4A9999F3CCCCF3A1 A1F3C2C2F37373D2FF6B6B8080806B6BC26666CC5252B94A4AB1FF9999B9B9E3 B1B1E3909090B1A9A9FFB9B9D26B6BCC7373212121FF39398080CCE339399999 D29090DAC28080FFCCCC4A4A4AE38080FFEBEBFF2121FF8080F32121B9B9EBFF 52528888D28080DA393939DA4A4A9999E39090EBE3E3F3DADAFFD2D2EBF31010 FFA9A9A1A1A1A9A9DAB99999FFDADA5A5A5A8888E3A9A9E3A1A1EBF3F3F3EBEB FF101010FF10107B7BDA7373CC5A5AC2CCCCCCEBEBEBB9B9F3B1B1FFD2D2F3CC CCFFA9A9F3C2C2FF6B6BCC5252C2D273739999DAC28888F329298888DA9999EB E3E3FF8888EBA9A9EBF3F3FFD2D2FFF7B796FC949005E770C2F0F4F7B82899EB 94F741F7FC9490F7B84E6D892D05E770C2F118F7B77BF741F7FC949003EE8803 D600F713EE00016FF7A2E3007DF1C2F164000FF8DF0008402004F7A3A0C40000 1F200C000FF8000000C4000CC40000DF0008000000F713E22A001EC4000CDEFD 30C2F18CF7A10E03EE8803D60000000305E00FC2F1A800E44A05E0F8000032F7 B9C59A3DEC000030001DE803B600C2F1E000CD7C00000900CD5C000000FF92D0 05E10005E17003B600C2F20400CD7CC2F21000F56A033238FFFFFFC2F2780010 260000300021F9000028FF92D0601232FF94D0FF92A005E100F432F805E100C2 F22C66E8880000006021D3FF92D0F432F805E100C2F26C66E94B00000060D91D>]endobj 99 0 obj <>stream xœí} Oi–¶s1Ónó!H ‚Âf0IX&|&\‡5Ù| .FÁËe@_˜ F€Âm#I‡ÉÆÍF ¼?tÏ9ï¥Þ*@fâäö‚ Æ—AçbSHôïÝœiñ×­ôÆ |E ã‹`c±ªw ~~^±Iäo*ô%1Œ/+óŒÕû'6+6Áö³ò3ßBÁxo¨xÌïŸh‘¿B_ƒÁøhÙXœ{2PÜ]ï÷û»Aø¹«ÁøFp3¸Ÿ u‡zçªxƒñm`3Ä¡ýÅÐB¡¹3…¾ ƒñ…н±ØTõ$„xRÅÓúŒoþ`0^UÕ47×gî3ßî÷nãKñÅ•_ }) ãËâ—¿ßߢ©½×Â`0 ˆë}…¾ƒQT³ø3ß(n3ûŒoÑB_ƒÁ( b· } £0ˆ²ñg0¾MDÙø3ß&˜ü Æ7ŠëìûŒooXúŒoi&?ƒñ­àæó ¿_/äã®ü­µ_ð‚~ëë…¾ã7Ÿ·øWz—:7®|×ùžÔëFþÉ|_ôÒÎÇZÏwTè‹`0þA1S/‰òW6®t^¹Ò Mþëyä_?ðùþ—?× —Âäg0.‰ûÀxã †zõn,Zm;{­Ñ÷ïÿ[È¿ñù²L~ãÒ~'(Ÿ¯P °”?=4NÍ=óù’¨¶]¸Nî–ŠkI2ùŒKÂOt¯j©ðw^¿¡üѨ1©¿•ˆbë»V€ë´aý\^ +?ƒqiÜDÅ‚G3”ñ9¿Yï›üA2ß—ÌØö?˜Ïd“Ù$\+?ƒñˆåïÓÑXçw6å¯Öä§:!YhåÏmõ3@~V~ãó0°Ñ¹!Ž&déO+4:(^S…6‹;Tþ7…¸VDi&›Aîù³>îçg0. g°Sµl!@“äÔÂ/Ò}‚ü€ú@ÿd6+²V~㲘Yê\zNGcADgç†$ÿmÝÑ×*óý¬(ùÔögüÙ üŒÏÅÍÅ`pf—‚ ý@AþÃh4-ϱ+a ~D~¬øù²lûŒÏBïÒâRh³Â_ BÀ Èo ?)¿¦~mf¹ŸM²íg0>þÅx|1¾ø!þ!aø$òGÑ}¨üY‹ý…·ýÄþ$Û~ã³P¬ÿP¯Š ,Å—üףј>¥Õ&üÙB“?+J~äüïòZŒlܯB4‰†ô_ôÓL~cX¿™óg}ÉÆ|ãÚèëöð~*mwwyxïã×p:üëÙY8ŽÐgÚÏú_{jFTüPù“IV~ã3ðóœDÕñ c|Ï|¾?(É—ìÅæøº½©ðþ~d?Lã^ ¯6œÏeÀéò*œFàùRûíkÎó¦J!ßÇFôïÉRw]l\øc0.ŒÇOû逹/GõËQ}IÓö'³è¼3™Tþ—­½ìÚOõS¤û€×ÀíÝÿ>ïçOV‡VOV"«4æá“?^:,ÃÔ¸`þ¸èë“I¿;ãâ(Ö?é}ÒÛ;ÛÜ\SÕDLíóŠQ}¶j?xnâþxžòçºà>)ŒJt&ú¯6ä\|xHpÿ%Š?6éýáKöSvFùýã2é—}D8bò3—¿7ê õÂz‚ìŸû'£Øgé½:H’éGÔ8¾ho>±OÔßGþ*âõONVON]~ûס“!|t?ŒÊOQƒØIì›ç"ùÉ÷Ó ¿lR;òñãRh …B+ÐBž„zç~3 ýF²o R(¿Ãö¯ãß—ôO¡‚£éôzƒ¾çgþ£C#'CC@þW-å—ÒI$Ì€AäÏ’ñÏR¹ß¢>+?ƒqÜX‘Qèý-–Óoúœ@Ê÷3™yÛ×ìu%ÒôƒòHÈW¥ò¯"ÅÚ:424´{‚äÔ틤63¾ùµðgù…+ö2Œ‹âþ€ÄÊÊñÿ/­7¶™õ¾,ÖÝl9n^Ⱦþyð°HãWQ×ÑÞíæì¿ündhw„„ÿääDÿ0±¬? ?|á²uvƒ~Ó÷[®„•ŸÁ¸8~(¦FüýÿÆ›NÛïÓõ>‡ò¿ÝGîKáO…SaUëá‚ ŒüjûáW#€¡]Š (þ»ïÎPýQù÷¥ö'ö­Ó…ògÇůÓ0ëêXùŒ‹ãfw1Bñ`eÓxÓÅô'E_ßxÖ$s‚È¿¿Of=œŠDVwÏ^*ú½GvGFliÿè±DP_†½³U•õ§(–XÒß  ~Ö0V~ãsð˜È?V,B¿ÅxÓ-çÝüY[Á¯Qr;ùQ¶w‰æ¹_¥ðCÊOLkþð[úÓ‰ ÿOê¯Ã`üçUo_"ѧËj–Ä_¬èa]+?ƒqq<öuwûíÊŸWíOf{¨ânöóß½Šäߗ‰h½>¢Z?æûCÄSú‡FýÉõ[oìb¹ÈIääe¿êÓ0®ËýjjU‹`åg0.·€äÿ@…ñ^žîõ³Rû Û?Ü¿ M°×zg;ù‡PÞIù²ÞÙCê¿Bã?tbô…_î6ŒöŸ:û¦ˆúBû1Ð"ž¬ü ÆgÀß]è®Gþ#û7'´›å>_6LÿÞÕ« I}ª÷åŒ÷ND±ì=ÁzãT ?ÕûOÞ}âÅjî ågÅg0.çâ›þz’ÿâ çZ åÙÏ¿Qgâ*¥ü²à×`¾Òä¦b?°ý­¥ð¹·Èþ·ôŽóý„é´˜‡œØ×ƒ¦Ÿ'ô0Ÿ¿±¼¿ ù³¦ïÏŸÏ?ÂÒ/¹i6ß;¥þ!)ü#µÞQÊ/»úWëg££Ín£€ Èr¿˜Ù“dåg0>é3Ù_ßíF~£“?ébûß_¥”_VüÃ~¥ò á7ëýôRÒÿDŒðÇ©½‘ðnÿiUc|Øö3Ÿ‹XßðþŸ-úÍ8O±­á—Í_Ìc„_Ò?’Ûß=#é—"ÿÖHúÿ›Ê}¤üb€¿œÜüO¥vïæ\/7#†øeiF?Oèa0.ëÑ´wÂoÙŸ¯üz4 ÖûòÉß|ÕÈù#‘HûIûnûî¶³wgTî“Å~hVfŸÃ”_)ÿÍ ¾4-(Ùop+ŒÓ¼½€/“ŸÁ¸q±®–– „fÿŒó,Û~.ä§^þ„®ö›Ëøà„>Tþ!9Êgä­Áè¿êœ_ð%åËñ½)ç„~‚ZɇÆösÎÏ`\bîîf ÂbÿŒó´‘¿áêUQï¾GçÍÓ}ò“!1ÆG)¿9ÌÇÈù‡TÒ/föÐJ@ûûgy—lüàjšóN`0‡\¤s`ÐßüY‹û.ýüS ´ýªÚŸ@ÛNÚ/çõœ¨‚ñß\ÐkïJùMåˆ~`üö^C„îê˰ò3—…Z¤³bsSð_°¿þ†óDSùÝ ~ V¹’~þ”X¿/,øIåG¡·­æ·÷VŒÔ·ôÐËy8Ù­”?Ë9?ƒqY(î?ž©ûÏU~Ëõ»ÙþI³Ú/&öÐ^±Ž‡˜²«¤ß¾”gî?‡dÊ¿z"‚)D(?.äçø­ŒZÊGäülûŒ ã0z]ùgff*Èúûgœ§ZÕ~*÷çð›Õ~k”ϼ´ý‘°š×£êýNò{½§ÿI¿Ö}±–Ìùû Ǩ}]ìϰò3—BßmuWŽŸgfn û+Ðø»“ß>³'o„_s¾ò‹¥|(é²ÿ<ò{ñž# ü/UüHøi^ŸsÔÀ¸X»;ÃÕ~ã’°îÁûóù'>Jþlþ:E??P_Tûç§§kÐöâpÎõœ¿;‘®^ÌçO!õ÷‰œíùÊß®gõ‘úæÊ{©ˆUïK$–moÊÛu‰A>¬ü ÆE¡ïŸ®æÆïåüëæb^Ùd&ï뎤í—+ùØjt¹ß£»wz:<üÓÙÙªÉâZ¾“ï†ï´/ù›‘KyHåŸü¤ÿ\ƒ!q]õñ#€ø7ˆûçVû¬•2if ꃜu ñ“S{‘ý~ãûXÆ;ûixô•}a®W¿þôŽº÷iBϪ¹’O¿Èùé ¯:rþ.P~ZFL(¿ìyàî~ãÓPm¸þDz§]ÿ„ë¿ucJ/®Ü]:utw»+c¸ûVáûåœÞýˆõVƒ^»ŸîÌ1¢~{ÿðoâ^]«ÏDÂäÏÙ®¥±Tß±'‰~¤±}ª6yð·øWa0¾ÜÖwáõz®æ›ÂŸ?¯Ù6+í=Xt›²ÎÈIòÓHŸÈ~*%Ù¿&‡í…Qßi!ÏœúÈ«= Ÿ`Ý‘{]?Ú~rýÖÚÝ„F½x¯yûàäßè†ÁøÊÑ­¶Rþ_**Ôð^Êøëýÿ7ï>›ôc;ÊïkãŒvs˜ÎÇ 7Œö¾”ÔÇÁ{â†\Æ*^'CrmO9£'<šÃ?ï5¤tOÖûS{ÚEO_FŒñÑø[þó0_/Ž>ïÍŠMIý‰s¦ôz3ö™=”rÛoו벆øÒŒ~q“nû}ºWmkôâÊž«òîÜrdßnûnX ðÙÜ/áè7œ”Â/”_oÓã«EµYïÚcÓsúüÝ3y¨±I?òÍ·mÎÍ‘îí£Ûõí«™}4Ä_êÿÉIÎøDîäÄä¾ÝgõóEð wíWâmÜÇ‘ý>¾cƒqA˜äÿ¹¥E®å1¡–ñšÉûÀ¤©üú>½öþþvYò»º/²~âp8bQ(n/Üë„_Ýw>¢—ñÀé¼h$rÎk—Âï3oÒËýý Æ'!jÿ—‰–‰½ŠW½¿¾Û…ü9Û=»ô}zí'Í'(ë$ôr>á”pþ’ú«Î¹w«Öd¾°^ÄCÌé‘ý|ùƒZ³êf]jØnÜßÏ`| ¢FOß ÿ6Å}¼oOÞžŽå<|IºQ¯“ü¹°ãK¦ù}b–®S÷»V¾§¤ÂÒò§h= ü®¿æ}Ä»7žµ:ú4Ú?÷ß„Áø&`*ÿ¦céÞn—›vÞ›Ê/´?›qŽá?KÐðþ«2éW{åb~n#ýÞ™sø#j6_Šfó%ö#®“&3bÙn›i½ü¿ƒñ á¶EþÇzÝîz¡ûn·ëäžÔ÷ɂ޸º£ÒËôòNÝ)¹œW$üSÎõRŽ„á§•»ÂF­…?õNy±Ž‡-áQ> ƧÀPþ›@yâ=4y«¾üu"r]û‘üI`¿Ë Úá”è—Py?!Ü;÷bFOÔŠ½ÒóGhh_äìü¹“ìp°i?“ŸÁøD«£êf-HzÁüzy—î7åÕd²–öÌ¿vP:ÚŽºäO…çwï~däýéðÙ‰òü4¶/uÒ_°aªÖ”ýÄñòƒß?ŸÁ`bzxïc}{nIý±âWå>>::ZoþØŒýWk¯ÖÄj>Ÿ|Qê§á½Â\^Î'žÎ`0ƒQq·¯÷—n…1BqñÀÀÊïŸÁ`üCã ø~q´9f˜Ügò3_/¢Ñè!î×kæ÷WZ }y ãï…ê¨XÊç9¾˜hOªÜ…˜ü ÆW‹¾¨ä7t/–¢~Áäg0¾^û¯{½cHxE|IýÞ¹‰B_ƒÁø»!Åš_Eh%´‚¬³/˜êí›cåg0¾b ‚ôGBÈþf>P¸ÏÊÏ`|ÕÀ¬ÿ@wÚˆø`ø‘úMMþB_ƒÁø{¥ÿ7ú^¤}¯Ð|ä~0(ˆÇk  Ø`D‡öí×­ØÚ·Û[U;/$`4 ‡ý1íÙ÷hýÿÄÿm1¸ º¿|'€þz«îá`90>FB=»S‚ìóîÌvô:hØp%FŠ’ÙXÚOe-#¯C;à-¸³0ˆ~¿£Ž–¯ë0Ïi[hÃìÂû¢Òƒ!¡­r– ±J¢}Y]ú‚­…E”Q<ž‹åü–æ›Òo ì™MÐ<½G> }®öŸ>85èoñœ8ß¼ö Ù­h¿$‡‡ØÐ¬K7 Žá@÷©MXE÷#hÃJûG%ñiwËlŠñ¸5yKcRøIý~;é—÷‘ößOM‚ðO~?e6EðÈ{`?6ê#í[‘îÛí†%  6¤=vÏZ%ÿéÙ >0_qý˜žk„-˜·”ŸœB#n©šFxn´¸ßˆÜo´´ß&þëkmD×Ú ŽDÄGšÙáàGhHtr?RC¼/ŦP|—dÇnÄthÁ}â|¾ê)U„—ÜïÁ嬀ö¸¨º‚,nÂøp‡/ðöZ´è…XçÒ"ÿÅÅ¥xü7,ûýWÓ"ÙýÅÅà´ ù©Âm«{8‹‘òw$?p\áNݬ`{Ñ2à¡é‚ž:.£W]ûï -ðUvà7¥á é“uóœ’_Í=ôõÓ 1V½;++ñ¯áÃø±jØÅ.B}—(3viÒ~öôþÁyÚo×} þÞšMøÅ4gü›=pŠ?i¿Hš…ðÛÄŸ( •²¥ûÃnÀÝ~up«ßˆyªßO´¿µ,èkR‡bÿÔÔ䔡ü¦P1`Usaý¿ßކ͖´£êߤð‹½]÷Qõå^„€VKôÿÏ5ØTN`—}|Týy¢;<”ú7ZÍzì'í·YýÒ5°é>„‚kZ÷1àëT@(ÿÔý§OÇŸ"åi/--5%ßd$  ‚~´ÿúÔ”ð‹-ké?ŸêÿúǽKAäz$þŽþöaì>¼ ;ƒ6ò— ¦nÕŸ1⸠‘gyžö*ëLò×S…š;•m·­c«Þh¥çE>ùÓm•Èö¨`;üNG”XN¢m–ªJ ñ³fÁàSèoùý\^[ÚEûÅÞ]û ö›ªoj¿®4ÛËk¦ò?²ë¾Ò~Cù×µÝ?’H?,µ_‰¿Cûï’ðdXÖz/›¤~¿aü%ó—…ç—Ú?)ÔßÔ} (÷ úÀý)Ãú;tÉßÞJÛ¶!üZ÷Û¡µ¶Ãó±6Rú•ë—–_ÿXk¿|¨ÂÀ<ÑÞR~“þ û5]`ìÊoñ^»WíWºÄ¿&ŒÿS²ü:ï?Ê/Ô_˜~|HÖKá—q€èýC)Ñ^k¿f¿”~8øAZ±vµd~’¨/´ö —Ÿ•¼'êÓß²šüõÀsäz0ø¯ÿGûýñ½Øè„f#êô½Ù鯄ò{ªù%ëbH¢K ò÷É¿Ùu\uü-²ÇŠ®ÏzòÈß7}{‡¾IüŠ·dzº#`½”D¼úð½@삾ߌ.Å?þ¼"à=öÎ×þ½SS÷Úß,ÙeßEù­ò_3é¾~<Àl)¿®Ú]­ûÃ:ëwhÿ­~Cùïjí_6ó}ñ÷kí—•ïʯ´_Å€×È{tû–÷ÝŸ²åû¢¡÷Ý*”¿µÝ,á[[-ÁoÕOZûI÷üHÿg†æ«ä=¥ü˜üká×A e…€®FWt5v]k¼ÖUÛu­ËUûµî“í¿&…_Š>=¿Mè?E’~ÓúK`©öãš÷ãvíÏëïùAi&©š¢¿ÔþŒÖ~"¾Èõ³Û X ±òG4ÿÑ¿,mtv¯t^±‘ŸJóŽ-¨¬M“Á®ö´íx0 zh7íÑl‘ßëé»;1›'­óp£Eõ‹Ù<òÇ*ËËMò{^D©œ¯È§:–Æ«óP ©óô]LùÍBŸ“úJûEÕ/m¯ùS;GûAùO䷴ߪó­iöËðHª¿¡ÿGÍ–ö7«¼_è¾,õ©@0_i¿æ¿%ýH}þ»†õy¿~Ò}§òkö[¼'íŸt~Ù€1€lD€©ísŠ}ÛDúvÊûÛ-í?&ío•vÍ¿`¾!ýó¸ÕKÅ—ûg¦öÏ+áGç¯6Óù§„ô7Ú­€Úk°á£K‰¿Mû­Œ™MýI÷§ïÔíéSÅþ[ѯÔHdª?Žâ/ÆõÇ•ç_ú„Û·©D⟥[júä--Í‚ßãP'ð|ã xüà*þŸ¢èþ£þËÿÿ°ñ ºïknm"}O“òƒ°W")Óƒ“-$#ïê<1'ùït”‹à±Yzñf]™†(ìÚòÈuJÛeRoYâ xÚðc垎 uõÙ‚€KÏŸ—”ß)þB÷õ]´ß©ûμÿ•tkpdïÌKüåi¿Ðÿõ#;ý…0µßVï7´_øÿ~³âÒ¯u_)¿ ·–ÏÑþ)ËX1à{¡ý´ÕñÚöŸ„[$þöÎ@$;Ðÿeë±ØTõï™,ø¡òߟKñŸ¯12~É|!ùêXûS5–æKÆ+÷/F¨íïß…´wA+hç/»~|o6Jd’þ÷¥FÞ/CÀ¸¦©©û¢Ê/{þ¤ ûb‹¼3¬Tÿ¬ ½Èû…óÏêq×¹•.@ü?ß²qeãÊ•ÎNÜÑ3Ä‚¥ùcuTàv´Z÷»‰ìÚã½#l¬ˆXX$U˜̦¤Ü´ý^ÙùîU¹|ò£“Ç‚ßV>ùÛ:›–Ah:0h¼„ÏâW÷Űᢠûí!À .Í=çGíß;gðO>ý8JþÍkhûÖ_Ëÿš~›ö«´ÝMùlõþa©ûŽa?*Õ¿%^P@‰ÿ¤j’úùÚ?µl)ÿ¤*øOé^?5ö=?Ù}cô=(Û/ˆ/°-+ôLº/©ÿRåüÊjŽçIúíŸÊ/çµù¯‘Ù¾­æ§´^°¿F¿@î×BÂÔ'þ»û±èÿãÁ5£äoÚcèÏ{½·[YúÏH¿/[©æ½Ùß/¸}~=¢¨€LþÅÞÒ~!öº»ÏVðc˜’ïJû´-íÇç´QíÏÙ´_qÝÅø“'x`y¿ÃøËœ_ê>>ÖuÙïÐ…ß>pØÔKû‡UÍßÈûupKÕþßAøûoYù¾Nío˜4h?)Šþ“†ðË1>$ýTó±À>þOdþdÿ[·[e ÀìÓ. ~/)÷©„_Sÿeÿ ÿŠþRþíÊߨò~Êú)é@•üæÍ í>\#×ßEY?…gÚoØ~=ÔGþM²_û\¤ýOu¹ÏðýôœQIáû5ý3Õá×#R~â;²_åüTû3 R¤ü¢»O0ßÇ÷±wEîñ7µÏÒþ:ówjÿš«ö»´WfÞoô£@Ð,¿ììü_äû‚þ„ñu‡ö÷ëš¿‘÷[)¿½Ãó}cدCÿyÿ”îó³úù•ù—%ÿ)ìé{=eËù ío•UÿV™ðËÑ>ªòGy»RûgÇVŸŽç­¿Çbä¯ÕõW£³ÿFÕÝ'Jïßj÷Iþ‰÷Ž´ëý.ôWÂ/ºûóéo9Ô~‹ýV©Ÿ^«:¿òšû2ûÏHÐ#¶¬ä~ÖªøgDÕ¯ÇR~à'ºûðQhž1 ƒÁ`0 ƒÁ`0 ƒÁø\üƒÔ endstream endobj 101 0 obj <> endobj 102 0 obj <> endobj 103 0 obj <> endobj 108 0 obj [/Indexed /DeviceRGB 255 <000000FF00006B6BD2FFFFFF666666FF66667B7B7B6666C24A4AB96B6B6B4242 B1F30000FF9090B1B1DA888888737373B1A1A1FFB1B1CC6B6B181818FF33337B 7BCC6666B9E33333B9B9B99090D2DADADA8888CCB98888FFC2C2424242E37B7B FFE3E3DA9999FF1818FF7B7BEB2121B1B1EBFF4A4A8080D2C2C2E3A9A9A93333 33F33333D252529090E3DADAF3CCCCEBEB1818FFA1A1999999A1A1DAB99090FF D2D2525252EBA9A98080E3A1A1E3EBEBF3080808FF08087B7BD2FF73737373C2 5A5AB9B1B1B1292929FF4242E34242C2C2C2E3E3E3DADAEBF38888FFF3F3EB90 90FF2929FF8888C2C2EBB1B1F3FF5A5AD2D2D2EB4242E34A4A9999F3CCCCF3A1 A1F3C2C2F37373D2FF6B6B8080806B6BC26666CC5252B94A4AB1FF9999B9B9E3 B1B1E3909090B1A9A9FFB9B9D26B6BCC7373212121FF39398080CCE339399999 D29090DAC28080FFCCCC4A4A4AE38080FFEBEBFF2121FF8080F32121B9B9EBFF 52528888D28080DA393939DA4A4A9999E39090EBE3E3F3DADAFFD2D2EBF31010 FFA9A9A1A1A1A9A9DAB99999FFDADA5A5A5A8888E3A9A9E3A1A1EBF3F3F3EBEB FF101010FF10107B7BDA7373CC5A5AC2CCCCCCEBEBEBB9B9F3B1B1FFD2D2F3CC CCFFA9A9F3C2C2FF6B6BCC5252C2D273739999DAC28888F329298888DA9999EB E3E3FF8888EBA9A9EBF3F3FFD2D2FFF7B796FC949005E770C2F0F4F7B82899EB 94F741F7FC9490F7B84E6D892D05E770C2F118F7B77BF741F7FC949003EE8803 D600F713EE00016FF7A2E3007DF1C2F164000FF8DF0008402004F7A3A0C40000 1F200C000FF8000000C4000CC40000DF0008000000F713E22A001EC4000CDEFD 30C2F18CF7A10E03EE8803D60000000305E00FC2F1A800E44A05E0F8000032F7 B9C59A3DEC000030001DE803B600C2F1E000CD7C00000900CD5C000000FF92D0 05E10005E17003B600C2F20400CD7CC2F21000F56A033238FFFFFFC2F2780010 260000300021F9000028FF92D0601232FF94D0FF92A005E100F432F805E100C2 F22C66E8880000006021D3FF92D0F432F805E100C2F26C66E94B00000060D91D>]endobj 107 0 obj <>stream xœí} Oi–¶s1Ónó!H ‚Âf0IX&|&\‡5Ù| .FÁËe@_˜ F€Âm#I‡ÉÆÍF ¼?tÏ9ï¥Þ*@fâäö‚ Æ—AçbSHôïÝœiñ×­ôÆ |E ã‹`c±ªw ~~^±Iäo*ô%1Œ/+óŒÕû'6+6Áö³ò3ßBÁxo¨xÌïŸh‘¿B_ƒÁøhÙXœ{2PÜ]ï÷û»Aø¹«ÁøFp3¸Ÿ u‡zçªxƒñm`3Ä¡ýÅÐB¡¹3…¾ ƒñ…н±ØTõ$„xRÅÓúŒoþ`0^UÕ47×gî3ßî÷nãKñÅ•_ }) ãËâ—¿ßߢ©½×Â`0 ˆë}…¾ƒQT³ø3ß(n3ûŒoÑB_ƒÁ( b· } £0ˆ²ñg0¾MDÙø3ß&˜ü Æ7ŠëìûŒooXúŒoi&?ƒñ­àæó ¿_/äã®ü­µ_ð‚~ëë…¾ã7Ÿ·øWz—:7®|×ùžÔëFþÉ|_ôÒÎÇZÏwTè‹`0þA1S/‰òW6®t^¹Ò Mþëyä_?ðùþ—?× —Âäg0.‰ûÀxã †zõn,Zm;{­Ñ÷ïÿ[È¿ñù²L~ãÒ~'(Ÿ¯P °”?=4NÍ=óù’¨¶]¸Nî–ŠkI2ùŒKÂOt¯j©ðw^¿¡üѨ1©¿•ˆbë»V€ë´aý\^ +?ƒqiÜDÅ‚G3”ñ9¿Yï›üA2ß—ÌØö?˜Ïd“Ù$\+?ƒñˆåïÓÑXçw6å¯Öä§:!YhåÏmõ3@~V~ãó0°Ñ¹!Ž&déO+4:(^S…6‹;Tþ7…¸VDi&›Aîù³>îçg0. g°Sµl!@“äÔÂ/Ò}‚ü€ú@ÿd6+²V~㲘Yê\zNGcADgç†$ÿmÝÑ×*óý¬(ùÔögüÙ üŒÏÅÍÅ`pf—‚ ý@AþÃh4-ϱ+a ~D~¬øù²lûŒÏBïÒâRh³Â_ BÀ Èo ?)¿¦~mf¹ŸM²íg0>þÅx|1¾ø!þ!aø$òGÑ}¨üY‹ý…·ýÄþ$Û~ã³P¬ÿP¯Š ,Å—üףј>¥Õ&üÙB“?+J~äüïòZŒlܯB4‰†ô_ôÓL~cX¿™óg}ÉÆ|ãÚèëöð~*mwwyxïã×p:üëÙY8ŽÐgÚÏú_{jFTüPù“IV~ã3ðóœDÕñ c|Ï|¾?(É—ìÅæøº½©ðþ~d?Lã^ ¯6œÏeÀéò*œFàùRûíkÎó¦J!ßÇFôïÉRw]l\øc0.ŒÇOû逹/GõËQ}IÓö'³è¼3™Tþ—­½ìÚOõS¤û€×ÀíÝÿ>ïçOV‡VOV"«4æá“?^:,ÃÔ¸`þ¸èë“I¿;ãâ(Ö?é}ÒÛ;ÛÜ\SÕDLíóŠQ}¶j?xnâþxžòçºà>)ŒJt&ú¯6ä\|xHpÿ%Š?6éýáKöSvFùýã2é—}D8bò3—¿7ê õÂz‚ìŸû'£Øgé½:H’éGÔ8¾ho>±OÔßGþ*âõONVON]~ûס“!|t?ŒÊOQƒØIì›ç"ùÉ÷Ó ¿lR;òñãRh …B+ÐBž„zç~3 ýF²o R(¿Ãö¯ãß—ôO¡‚£éôzƒ¾çgþ£C#'CC@þW-å—ÒI$Ì€AäÏ’ñÏR¹ß¢>+?ƒqÜX‘Qèý-–Óoúœ@Ê÷3™yÛ×ìu%ÒôƒòHÈW¥ò¯"ÅÚ:424´{‚äÔ틤63¾ùµðgù…+ö2Œ‹âþ€ÄÊÊñÿ/­7¶™õ¾,ÖÝl9n^Ⱦþyð°HãWQ×ÑÞíæì¿ündhw„„ÿääDÿ0±¬? ?|á²uvƒ~Ó÷[®„•ŸÁ¸8~(¦FüýÿÆ›NÛïÓõ>‡ò¿ÝGîKáO…SaUëá‚ ŒüjûáW#€¡]Š (þ»ïÎPýQù÷¥ö'ö­Ó…ògÇůÓ0ëêXùŒ‹ãfw1Bñ`eÓxÓÅô'E_ßxÖ$s‚È¿¿Of=œŠDVwÏ^*ú½GvGFliÿè±DP_†½³U•õ§(–XÒß  ~Ö0V~ãsð˜È?V,B¿ÅxÓ-çÝüY[Á¯Qr;ùQ¶w‰æ¹_¥ðCÊOLkþð[úÓ‰ ÿOê¯Ã`üçUo_"ѧËj–Ä_¬èa]+?ƒqq<öuwûíÊŸWíOf{¨ânöóß½Šäߗ‰h½>¢Z?æûCÄSú‡FýÉõ[oìb¹ÈIääe¿êÓ0®ËýjjU‹`åg0.·€äÿ@…ñ^žîõ³Rû Û?Ü¿ M°×zg;ù‡PÞIù²ÞÙCê¿Bã?tbô…_î6ŒöŸ:û¦ˆúBû1Ð"ž¬ü ÆgÀß]è®Gþ#û7'´›å>_6LÿÞÕ« I}ª÷åŒ÷ND±ì=ÁzãT ?ÕûOÞ}âÅjî ågÅg0.çâ›þz’ÿâ çZ åÙÏ¿Qgâ*¥ü²à×`¾Òä¦b?°ý­¥ð¹·Èþ·ôŽóý„é´˜‡œØ×ƒ¦Ÿ'ô0Ÿ¿±¼¿ ù³¦ïÏŸÏ?ÂÒ/¹i6ß;¥þ!)ü#µÞQÊ/»úWëg££Ín£€ Èr¿˜Ù“dåg0>é3Ù_ßíF~£“?ébûß_¥”_VüÃ~¥ò á7ëýôRÒÿDŒðÇ©½‘ðnÿiUc|Øö3Ÿ‹XßðþŸ-úÍ8O±­á—Í_Ìc„_Ò?’Ûß=#é—"ÿÖHúÿ›Ê}¤üb€¿œÜüO¥vïæ\/7#†øeiF?Oèa0.ëÑ´wÂoÙŸ¯üz4 ÖûòÉß|ÕÈù#‘HûIûnûî¶³wgTî“Å~hVfŸÃ”_)ÿÍ ¾4-(Ùop+ŒÓ¼½€/“ŸÁ¸q±®–– „fÿŒó,Û~.ä§^þ„®ö›Ëøà„>Tþ!9Êgä­Áè¿êœ_ð%åËñ½)ç„~‚ZɇÆösÎÏ`\bîîf ÂbÿŒó´‘¿áêUQï¾GçÍÓ}ò“!1ÆG)¿9ÌÇÈù‡TÒ/föÐJ@ûûgy—lüàjšóN`0‡\¤s`ÐßüY‹û.ýüS ´ýªÚŸ@ÛNÚ/çõœ¨‚ñß\ÐkïJùMåˆ~`üö^C„îê˰ò3—…Z¤³bsSð_°¿þ†óDSùÝ ~ V¹’~þ”X¿/,øIåG¡·­æ·÷VŒÔ·ôÐËy8Ù­”?Ë9?ƒqY(î?ž©ûÏU~Ëõ»ÙþI³Ú/&öÐ^±Ž‡˜²«¤ß¾”gî?‡dÊ¿z"‚)D(?.äçø­ŒZÊGäülûŒ ã0z]ùgff*Èúûgœ§ZÕ~*÷çð›Õ~k”ϼ´ý‘°š×£êýNò{½§ÿI¿Ö}±–Ìùû Ǩ}]ìϰò3—BßmuWŽŸgfn û+Ðø»“ß>³'o„_s¾ò‹¥|(é²ÿ<ò{ñž# ü/UüHøi^ŸsÔÀ¸X»;ÃÕ~ã’°îÁûóù'>Jþlþ:E??P_Tûç§§kÐöâpÎõœ¿;‘®^ÌçO!õ÷‰œíùÊß®gõ‘úæÊ{©ˆUïK$–moÊÛu‰A>¬ü ÆE¡ïŸ®æÆïåüëæb^Ùd&ï뎤í—+ùØjt¹ß£»wz:<üÓÙÙªÉâZ¾“ï†ï´/ù›‘KyHåŸü¤ÿ\ƒ!q]õñ#€ø7ˆûçVû¬•2if ꃜu ñ“S{‘ý~ãûXÆ;ûixô•}a®W¿þôŽº÷iBϪ¹’O¿Èùé ¯:rþ.P~ZFL(¿ìyàî~ãÓPm¸þDz§]ÿ„ë¿ucJ/®Ü]:utw»+c¸ûVáûåœÞýˆõVƒ^»ŸîÌ1¢~{ÿðoâ^]«ÏDÂäÏÙ®¥±Tß±'‰~¤±}ª6yð·øWa0¾ÜÖwáõz®æ›ÂŸ?¯Ù6+í=Xt›²ÎÈIòÓHŸÈ~*%Ù¿&‡í…Qßi!ÏœúÈ«= Ÿ`Ý‘{]?Ú~rýÖÚÝ„F½x¯yûàäßè†ÁøÊÑ­¶Rþ_**Ôð^Êøëýÿ7ï>›ôc;ÊïkãŒvs˜ÎÇ 7Œö¾”ÔÇÁ{â†\Æ*^'CrmO9£'<šÃ?ï5¤tOÖûS{ÚEO_FŒñÑø[þó0_/Ž>ïÍŠMIý‰s¦ôz3ö™=”rÛoו벆øÒŒ~q“nû}ºWmkôâÊž«òîÜrdßnûnX ðÙÜ/áè7œ”Â/”_oÓã«EµYïÚcÓsúüÝ3y¨±I?òÍ·mÎÍ‘îí£Ûõí«™}4Ä_êÿÉIÎøDîäÄä¾ÝgõóEð wíWâmÜÇ‘ý>¾cƒqA˜äÿ¹¥E®å1¡–ñšÉûÀ¤©üú>½öþþvYò»º/²~âp8bQ(n/Üë„_Ýw>¢—ñÀé¼h$rÎk—Âï3oÒËýý Æ'!jÿ—‰–‰½ŠW½¿¾Û…ü9Û=»ô}zí'Í'(ë$ôr>á”pþ’ú«Î¹w«Öd¾°^ÄCÌé‘ý|ùƒZ³êf]jØnÜßÏ`| ¢FOß ÿ6Å}¼oOÞžŽå<|IºQ¯“ü¹°ãK¦ù}b–®S÷»V¾§¤ÂÒò§h= ü®¿æ}Ä»7žµ:ú4Ú?÷ß„Áø&`*ÿ¦céÞn—›vÞ›Ê/´?›qŽá?KÐðþ«2éW{åb~n#ýÞ™sø#j6_Šfó%ö#®“&3bÙn›i½ü¿ƒñ á¶EþÇzÝîz¡ûn·ëäžÔ÷ɂ޸º£ÒËôòNÝ)¹œW$üSÎõRŽ„á§•»ÂF­…?õNy±Ž‡-áQ> ƧÀPþ›@yâ=4y«¾üu"r]û‘üI`¿Ë Úá”è—Py?!Ü;÷bFOÔŠ½ÒóGhh_äìü¹“ìp°i?“ŸÁøD«£êf-HzÁüzy—î7åÕd²–öÌ¿vP:ÚŽºäO…çwï~däýéðÙ‰òü4¶/uÒ_°aªÖ”ýÄñòƒß?ŸÁ`bzxïc}{nIý±âWå>>::ZoþØŒýWk¯ÖÄj>Ÿ|Qê§á½Â\^Î'žÎ`0ƒQq·¯÷—n…1BqñÀÀÊïŸÁ`üCã ø~q´9f˜Ügò3_/¢Ñè!î×kæ÷WZ }y ãï…ê¨XÊç9¾˜hOªÜ…˜ü ÆW‹¾¨ä7t/–¢~Áäg0¾^û¯{½cHxE|IýÞ¹‰B_ƒÁø»!Åš_Eh%´‚¬³/˜êí›cåg0¾b ‚ôGBÈþf>P¸ÏÊÏ`|ÕÀ¬ÿ@wÚˆø`ø‘úMMþB_ƒÁø{¥ÿ7ú^¤}¯Ð|ä~0(ˆÇk  Ø`D‡öí×­ØÚ·Û[U;/$`4 ‡ý1íÙ÷hýÿÄÿm1¸ º¿|'€þz«îá`90>FB=»S‚ìóîÌvô:hØp%FŠ’ÙXÚOe-#¯C;à-¸³0ˆ~¿£Ž–¯ë0Ïi[hÃìÂû¢Òƒ!¡­r– ±J¢}Y]ú‚­…E”Q<ž‹åü–æ›Òo ì™MÐ<½G> }®öŸ>85èoñœ8ß¼ö Ù­h¿$‡‡ØÐ¬K7 Žá@÷©MXE÷#hÃJûG%ñiwËlŠñ¸5yKcRøIý~;é—÷‘ößOM‚ðO~?e6EðÈ{`?6ê#í[‘îÛí†%  6¤=vÏZ%ÿéÙ >0_qý˜žk„-˜·”ŸœB#n©šFxn´¸ßˆÜo´´ß&þëkmD×Ú ŽDÄGšÙáàGhHtr?RC¼/ŦP|—dÇnÄthÁ}â|¾ê)U„—ÜïÁ嬀ö¸¨º‚,nÂøp‡/ðöZ´è…XçÒ"ÿÅÅ¥xü7,ûýWÓ"ÙýÅÅà´ ù©Âm«{8‹‘òw$?p\áNݬ`{Ñ2à¡é‚ž:.£W]ûï -ðUvà7¥á é“uóœ’_Í=ôõÓ 1V½;++ñ¯áÃø±jØÅ.B}—(3viÒ~öôþÁyÚo×} þÞšMøÅ4gü›=pŠ?i¿Hš…ðÛÄŸ( •²¥ûÃnÀÝ~up«ßˆyªßO´¿µ,èkR‡bÿÔÔ䔡ü¦P1`Usaý¿ßކ͖´£êߤð‹½]÷Qõå^„€VKôÿÏ5ØTN`—}|Týy¢;<”ú7ZÍzì'í·YýÒ5°é>„‚kZ÷1àëT@(ÿÔý§OÇŸ"åi/--5%ßd$  ‚~´ÿúÔ”ð‹-ké?ŸêÿúǽKAäz$þŽþöaì>¼ ;ƒ6ò— ¦nÕŸ1⸠‘gyžö*ëLò×S…š;•m·­c«Þh¥çE>ùÓm•Èö¨`;üNG”XN¢m–ªJ ñ³fÁàSèoùý\^[ÚEûÅÞ]û ö›ªoj¿®4ÛËk¦ò?²ë¾Ò~Cù×µÝ?’H?,µ_‰¿Cûï’ðdXÖz/›¤~¿aü%ó—…ç—Ú?)ÔßÔ} (÷ úÀý)Ãú;tÉßÞJÛ¶!üZ÷Û¡µ¶Ãó±6Rú•ë—–_ÿXk¿|¨ÂÀ<ÑÞR~“þ û5]`ìÊoñ^»WíWºÄ¿&ŒÿS²ü:ï?Ê/Ô_˜~|HÖKá—q€èýC)Ñ^k¿f¿”~8øAZ±vµd~’¨/´ö —Ÿ•¼'êÓß²šüõÀsäz0ø¯ÿGûýñ½Øè„f#êô½Ù鯄ò{ªù%ëbH¢K ò÷É¿Ùu\uü-²ÇŠ®ÏzòÈß7}{‡¾IüŠ·dzº#`½”D¼úð½@삾ߌ.Å?þ¼"à=öÎ×þ½SS÷Úß,ÙeßEù­ò_3é¾~<Àl)¿®Ú]­ûÃ:ëwhÿ­~Cùïjí_6ó}ñ÷kí—•ïʯ´_Å€×È{tû–÷ÝŸ²åû¢¡÷Ý*”¿µÝ,á[[-ÁoÕOZûI÷üHÿg†æ«ä=¥ü˜üká×A e…€®FWt5v]k¼ÖUÛu­ËUûµî“í¿&…_Š>=¿Mè?E’~ÓúK`©öãš÷ãvíÏëïùAi&©š¢¿ÔþŒÖ~"¾Èõ³Û X ±òG4ÿÑ¿,mtv¯t^±‘ŸJóŽ-¨¬M“Á®ö´íx0 zh7íÑl‘ßëé»;1›'­óp£Eõ‹Ù<òÇ*ËËMò{^D©œ¯È§:–Æ«óP ©óô]LùÍBŸ“úJûEÕ/m¯ùS;GûAùO䷴ߪó­iöËðHª¿¡ÿGÍ–ö7«¼_è¾,õ©@0_i¿æ¿%ýH}þ»†õy¿~Ò}§òkö[¼'íŸt~Ù€1€lD€©ísŠ}ÛDúvÊûÛ-í?&ío•vÍ¿`¾!ýó¸ÕKÅ—ûg¦öÏ+áGç¯6Óù§„ô7Ú­€Úk°á£K‰¿Mû­Œ™MýI÷§ïÔíéSÅþ[ѯÔHdª?Žâ/ÆõÇ•ç_ú„Û·©D⟥[júä--Í‚ßãP'ð|ã xüà*þŸ¢èþ£þËÿÿ°ñ ºïknm"}O“òƒ°W")Óƒ“-$#ïê<1'ùït”‹à±Yzñf]™†(ìÚòÈuJÛeRoYâ xÚðc垎 uõÙ‚€KÏŸ—”ß)þB÷õ]´ß©ûμÿ•tkpdïÌKüåi¿Ðÿõ#;ý…0µßVï7´_øÿ~³âÒ¯u_)¿ ·–ÏÑþ)ËX1à{¡ý´ÕñÚöŸ„[$þöÎ@$;Ðÿeë±ØTõï™,ø¡òߟKñŸ¯12~É|!ùêXûS5–æKÆ+÷/F¨íïß…´wA+hç/»~|o6Jd’þ÷¥FÞ/CÀ¸¦©©û¢Ê/{þ¤ ûb‹¼3¬Tÿ¬ ½Èû…óÏêq×¹•.@ü?ß²qeãÊ•ÎNÜÑ3Ä‚¥ùcuTàv´Z÷»‰ìÚã½#l¬ˆXX$U˜̦¤Ü´ý^ÙùîU¹|ò£“Ç‚ßV>ùÛ:›–Ah:0h¼„ÏâW÷Űᢠûí!À .Í=çGíß;gðO>ý8JþÍkhûÖ_Ëÿš~›ö«´ÝMùlõþa©ûŽa?*Õ¿%^P@‰ÿ¤j’úùÚ?µl)ÿ¤*øOé^?5ö=?Ù}cô=(Û/ˆ/°-+ôLº/©ÿRåüÊjŽçIúíŸÊ/çµù¯‘Ù¾­æ§´^°¿F¿@î×BÂÔ'þ»û±èÿãÁ5£äoÚcèÏ{½·[YúÏH¿/[©æ½Ùß/¸}~=¢¨€LþÅÞÒ~!öº»ÏVðc˜’ïJû´-íÇç´QíÏÙ´_qÝÅø“'x`y¿ÃøËœ_ê>>ÖuÙïÐ…ß>pØÔKû‡UÍßÈûupKÕþßAøûoYù¾Nío˜4h?)Šþ“†ðË1>$ýTó±À>þOdþdÿ[·[e ÀìÓ. ~/)÷©„_Sÿeÿ ÿŠþRþíÊߨò~Êú)é@•üæÍ í>\#×ßEY?…gÚoØ~=ÔGþM²_û\¤ýOu¹ÏðýôœQIáû5ý3Õá×#R~â;²_åüTû3 R¤ü¢»O0ßÇ÷±wEîñ7µÏÒþ:ówjÿš«ö»´WfÞoô£@Ð,¿ììü_äû‚þ„ñu‡ö÷ëš¿‘÷[)¿½Ãó}cدCÿyÿ”îó³úù•ù—%ÿ)ìé{=eËù ío•UÿV™ðËÑ>ªòGy»RûgÇVŸŽç­¿Çbä¯ÕõW£³ÿFÕÝ'Jïßj÷Iþ‰÷Ž´ëý.ôWÂ/ºûóéo9Ô~‹ýV©Ÿ^«:¿òšû2ûÏHÐ#¶¬ä~ÖªøgDÕ¯ÇR~à'ºûðQhž1 ƒÁ`0 ƒÁ`0 ƒÁø\üƒÔ endstream endobj 109 0 obj <> endobj 110 0 obj <> endobj 111 0 obj <> endobj 116 0 obj [/Indexed /DeviceRGB 255 <000000FF00006B6BD2FFFFFF666666FF66667B7B7B6666C24A4AB96B6B6B4242 B1F30000FF9090B1B1DA888888737373B1A1A1FFB1B1CC6B6B181818FF33337B 7BCC6666B9E33333B9B9B99090D2DADADA8888CCB98888FFC2C2424242E37B7B FFE3E3DA9999FF1818FF7B7BEB2121B1B1EBFF4A4A8080D2C2C2E3A9A9A93333 33F33333D252529090E3DADAF3CCCCEBEB1818FFA1A1999999A1A1DAB99090FF D2D2525252EBA9A98080E3A1A1E3EBEBF3080808FF08087B7BD2FF73737373C2 5A5AB9B1B1B1292929FF4242E34242C2C2C2E3E3E3DADAEBF38888FFF3F3EB90 90FF2929FF8888C2C2EBB1B1F3FF5A5AD2D2D2EB4242E34A4A9999F3CCCCF3A1 A1F3C2C2F37373D2FF6B6B8080806B6BC26666CC5252B94A4AB1FF9999B9B9E3 B1B1E3909090B1A9A9FFB9B9D26B6BCC7373212121FF39398080CCE339399999 D29090DAC28080FFCCCC4A4A4AE38080FFEBEBFF2121FF8080F32121B9B9EBFF 52528888D28080DA393939DA4A4A9999E39090EBE3E3F3DADAFFD2D2EBF31010 FFA9A9A1A1A1A9A9DAB99999FFDADA5A5A5A8888E3A9A9E3A1A1EBF3F3F3EBEB FF101010FF10107B7BDA7373CC5A5AC2CCCCCCEBEBEBB9B9F3B1B1FFD2D2F3CC CCFFA9A9F3C2C2FF6B6BCC5252C2D273739999DAC28888F329298888DA9999EB E3E3FF8888EBA9A9EBF3F3FFD2D2FFF7B796FC949005E770C2F0F4F7B82899EB 94F741F7FC9490F7B84E6D892D05E770C2F118F7B77BF741F7FC949003EE8803 D600F713EE00016FF7A2E3007DF1C2F164000FF8DF0008402004F7A3A0C40000 1F200C000FF8000000C4000CC40000DF0008000000F713E22A001EC4000CDEFD 30C2F18CF7A10E03EE8803D60000000305E00FC2F1A800E44A05E0F8000032F7 B9C59A3DEC000030001DE803B600C2F1E000CD7C00000900CD5C000000FF92D0 05E10005E17003B600C2F20400CD7CC2F21000F56A033238FFFFFFC2F2780010 260000300021F9000028FF92D0601232FF94D0FF92A005E100F432F805E100C2 F22C66E8880000006021D3FF92D0F432F805E100C2F26C66E94B00000060D91D>]endobj 115 0 obj <>stream xœí} Oi–¶s1Ónó!H ‚Âf0IX&|&\‡5Ù| .FÁËe@_˜ F€Âm#I‡ÉÆÍF ¼?tÏ9ï¥Þ*@fâäö‚ Æ—AçbSHôïÝœiñ×­ôÆ |E ã‹`c±ªw ~~^±Iäo*ô%1Œ/+óŒÕû'6+6Áö³ò3ßBÁxo¨xÌïŸh‘¿B_ƒÁøhÙXœ{2PÜ]ï÷û»Aø¹«ÁøFp3¸Ÿ u‡zçªxƒñm`3Ä¡ýÅÐB¡¹3…¾ ƒñ…н±ØTõ$„xRÅÓúŒoþ`0^UÕ47×gî3ßî÷nãKñÅ•_ }) ãËâ—¿ßߢ©½×Â`0 ˆë}…¾ƒQT³ø3ß(n3ûŒoÑB_ƒÁ( b· } £0ˆ²ñg0¾MDÙø3ß&˜ü Æ7ŠëìûŒooXúŒoi&?ƒñ­àæó ¿_/äã®ü­µ_ð‚~ëë…¾ã7Ÿ·øWz—:7®|×ùžÔëFþÉ|_ôÒÎÇZÏwTè‹`0þA1S/‰òW6®t^¹Ò Mþëyä_?ðùþ—?× —Âäg0.‰ûÀxã †zõn,Zm;{­Ñ÷ïÿ[È¿ñù²L~ãÒ~'(Ÿ¯P °”?=4NÍ=óù’¨¶]¸Nî–ŠkI2ùŒKÂOt¯j©ðw^¿¡üѨ1©¿•ˆbë»V€ë´aý\^ +?ƒqiÜDÅ‚G3”ñ9¿Yï›üA2ß—ÌØö?˜Ïd“Ù$\+?ƒñˆåïÓÑXçw6å¯Öä§:!YhåÏmõ3@~V~ãó0°Ñ¹!Ž&déO+4:(^S…6‹;Tþ7…¸VDi&›Aîù³>îçg0. g°Sµl!@“äÔÂ/Ò}‚ü€ú@ÿd6+²V~㲘Yê\zNGcADgç†$ÿmÝÑ×*óý¬(ùÔögüÙ üŒÏÅÍÅ`pf—‚ ý@AþÃh4-ϱ+a ~D~¬øù²lûŒÏBïÒâRh³Â_ BÀ Èo ?)¿¦~mf¹ŸM²íg0>þÅx|1¾ø!þ!aø$òGÑ}¨üY‹ý…·ýÄþ$Û~ã³P¬ÿP¯Š ,Å—üףј>¥Õ&üÙB“?+J~äüïòZŒlܯB4‰†ô_ôÓL~cX¿™óg}ÉÆ|ãÚèëöð~*mwwyxïã×p:üëÙY8ŽÐgÚÏú_{jFTüPù“IV~ã3ðóœDÕñ c|Ï|¾?(É—ìÅæøº½©ðþ~d?Lã^ ¯6œÏeÀéò*œFàùRûíkÎó¦J!ßÇFôïÉRw]l\øc0.ŒÇOû逹/GõËQ}IÓö'³è¼3™Tþ—­½ìÚOõS¤û€×ÀíÝÿ>ïçOV‡VOV"«4æá“?^:,ÃÔ¸`þ¸èë“I¿;ãâ(Ö?é}ÒÛ;ÛÜ\SÕDLíóŠQ}¶j?xnâþxžòçºà>)ŒJt&ú¯6ä\|xHpÿ%Š?6éýáKöSvFùýã2é—}D8bò3—¿7ê õÂz‚ìŸû'£Øgé½:H’éGÔ8¾ho>±OÔßGþ*âõONVON]~ûס“!|t?ŒÊOQƒØIì›ç"ùÉ÷Ó ¿lR;òñãRh …B+ÐBž„zç~3 ýF²o R(¿Ãö¯ãß—ôO¡‚£éôzƒ¾çgþ£C#'CC@þW-å—ÒI$Ì€AäÏ’ñÏR¹ß¢>+?ƒqÜX‘Qèý-–Óoúœ@Ê÷3™yÛ×ìu%ÒôƒòHÈW¥ò¯"ÅÚ:424´{‚äÔ틤63¾ùµðgù…+ö2Œ‹âþ€ÄÊÊñÿ/­7¶™õ¾,ÖÝl9n^Ⱦþyð°HãWQ×ÑÞíæì¿ündhw„„ÿääDÿ0±¬? ?|á²uvƒ~Ó÷[®„•ŸÁ¸8~(¦FüýÿÆ›NÛïÓõ>‡ò¿ÝGîKáO…SaUëá‚ ŒüjûáW#€¡]Š (þ»ïÎPýQù÷¥ö'ö­Ó…ògÇůÓ0ëêXùŒ‹ãfw1Bñ`eÓxÓÅô'E_ßxÖ$s‚È¿¿Of=œŠDVwÏ^*ú½GvGFliÿè±DP_†½³U•õ§(–XÒß  ~Ö0V~ãsð˜È?V,B¿ÅxÓ-çÝüY[Á¯Qr;ùQ¶w‰æ¹_¥ðCÊOLkþð[úÓ‰ ÿOê¯Ã`üçUo_"ѧËj–Ä_¬èa]+?ƒqq<öuwûíÊŸWíOf{¨ânöóß½Šäߗ‰h½>¢Z?æûCÄSú‡FýÉõ[oìb¹ÈIääe¿êÓ0®ËýjjU‹`åg0.·€äÿ@…ñ^žîõ³Rû Û?Ü¿ M°×zg;ù‡PÞIù²ÞÙCê¿Bã?tbô…_î6ŒöŸ:û¦ˆúBû1Ð"ž¬ü ÆgÀß]è®Gþ#û7'´›å>_6LÿÞÕ« I}ª÷åŒ÷ND±ì=ÁzãT ?ÕûOÞ}âÅjî ågÅg0.çâ›þz’ÿâ çZ åÙÏ¿Qgâ*¥ü²à×`¾Òä¦b?°ý­¥ð¹·Èþ·ôŽóý„é´˜‡œØ×ƒ¦Ÿ'ô0Ÿ¿±¼¿ ù³¦ïÏŸÏ?ÂÒ/¹i6ß;¥þ!)ü#µÞQÊ/»úWëg££Ín£€ Èr¿˜Ù“dåg0>é3Ù_ßíF~£“?ébûß_¥”_VüÃ~¥ò á7ëýôRÒÿDŒðÇ©½‘ðnÿiUc|Øö3Ÿ‹XßðþŸ-úÍ8O±­á—Í_Ìc„_Ò?’Ûß=#é—"ÿÖHúÿ›Ê}¤üb€¿œÜüO¥vïæ\/7#†øeiF?Oèa0.ëÑ´wÂoÙŸ¯üz4 ÖûòÉß|ÕÈù#‘HûIûnûî¶³wgTî“Å~hVfŸÃ”_)ÿÍ ¾4-(Ùop+ŒÓ¼½€/“ŸÁ¸q±®–– „fÿŒó,Û~.ä§^þ„®ö›Ëøà„>Tþ!9Êgä­Áè¿êœ_ð%åËñ½)ç„~‚ZɇÆösÎÏ`\bîîf ÂbÿŒó´‘¿áêUQï¾GçÍÓ}ò“!1ÆG)¿9ÌÇÈù‡TÒ/föÐJ@ûûgy—lüàjšóN`0‡\¤s`ÐßüY‹û.ýüS ´ýªÚŸ@ÛNÚ/çõœ¨‚ñß\ÐkïJùMåˆ~`üö^C„îê˰ò3—…Z¤³bsSð_°¿þ†óDSùÝ ~ V¹’~þ”X¿/,øIåG¡·­æ·÷VŒÔ·ôÐËy8Ù­”?Ë9?ƒqY(î?ž©ûÏU~Ëõ»ÙþI³Ú/&öÐ^±Ž‡˜²«¤ß¾”gî?‡dÊ¿z"‚)D(?.äçø­ŒZÊGäülûŒ ã0z]ùgff*Èúûgœ§ZÕ~*÷çð›Õ~k”ϼ´ý‘°š×£êýNò{½§ÿI¿Ö}±–Ìùû Ǩ}]ìϰò3—BßmuWŽŸgfn û+Ðø»“ß>³'o„_s¾ò‹¥|(é²ÿ<ò{ñž# ü/UüHøi^ŸsÔÀ¸X»;ÃÕ~ã’°îÁûóù'>Jþlþ:E??P_Tûç§§kÐöâpÎõœ¿;‘®^ÌçO!õ÷‰œíùÊß®gõ‘úæÊ{©ˆUïK$–moÊÛu‰A>¬ü ÆE¡ïŸ®æÆïåüëæb^Ùd&ï뎤í—+ùØjt¹ß£»wz:<üÓÙÙªÉâZ¾“ï†ï´/ù›‘KyHåŸü¤ÿ\ƒ!q]õñ#€ø7ˆûçVû¬•2if ꃜu ñ“S{‘ý~ãûXÆ;ûixô•}a®W¿þôŽº÷iBϪ¹’O¿Èùé ¯:rþ.P~ZFL(¿ìyàî~ãÓPm¸þDz§]ÿ„ë¿ucJ/®Ü]:utw»+c¸ûVáûåœÞýˆõVƒ^»ŸîÌ1¢~{ÿðoâ^]«ÏDÂäÏÙ®¥±Tß±'‰~¤±}ª6yð·øWa0¾ÜÖwáõz®æ›ÂŸ?¯Ù6+í=Xt›²ÎÈIòÓHŸÈ~*%Ù¿&‡í…Qßi!ÏœúÈ«= Ÿ`Ý‘{]?Ú~rýÖÚÝ„F½x¯yûàäßè†ÁøÊÑ­¶Rþ_**Ôð^Êøëýÿ7ï>›ôc;ÊïkãŒvs˜ÎÇ 7Œö¾”ÔÇÁ{â†\Æ*^'CrmO9£'<šÃ?ï5¤tOÖûS{ÚEO_FŒñÑø[þó0_/Ž>ïÍŠMIý‰s¦ôz3ö™=”rÛoו벆øÒŒ~q“nû}ºWmkôâÊž«òîÜrdßnûnX ðÙÜ/áè7œ”Â/”_oÓã«EµYïÚcÓsúüÝ3y¨±I?òÍ·mÎÍ‘îí£Ûõí«™}4Ä_êÿÉIÎøDîäÄä¾ÝgõóEð wíWâmÜÇ‘ý>¾cƒqA˜äÿ¹¥E®å1¡–ñšÉûÀ¤©üú>½öþþvYò»º/²~âp8bQ(n/Üë„_Ýw>¢—ñÀé¼h$rÎk—Âï3oÒËýý Æ'!jÿ—‰–‰½ŠW½¿¾Û…ü9Û=»ô}zí'Í'(ë$ôr>á”pþ’ú«Î¹w«Öd¾°^ÄCÌé‘ý|ùƒZ³êf]jØnÜßÏ`| ¢FOß ÿ6Å}¼oOÞžŽå<|IºQ¯“ü¹°ãK¦ù}b–®S÷»V¾§¤ÂÒò§h= ü®¿æ}Ä»7žµ:ú4Ú?÷ß„Áø&`*ÿ¦céÞn—›vÞ›Ê/´?›qŽá?KÐðþ«2éW{åb~n#ýÞ™sø#j6_Šfó%ö#®“&3bÙn›i½ü¿ƒñ á¶EþÇzÝîz¡ûn·ëäžÔ÷ɂ޸º£ÒËôòNÝ)¹œW$üSÎõRŽ„á§•»ÂF­…?õNy±Ž‡-áQ> ƧÀPþ›@yâ=4y«¾üu"r]û‘üI`¿Ë Úá”è—Py?!Ü;÷bFOÔŠ½ÒóGhh_äìü¹“ìp°i?“ŸÁøD«£êf-HzÁüzy—î7åÕd²–öÌ¿vP:ÚŽºäO…çwï~däýéðÙ‰òü4¶/uÒ_°aªÖ”ýÄñòƒß?ŸÁ`bzxïc}{nIý±âWå>>::ZoþØŒýWk¯ÖÄj>Ÿ|Qê§á½Â\^Î'žÎ`0ƒQq·¯÷—n…1BqñÀÀÊïŸÁ`üCã ø~q´9f˜Ügò3_/¢Ñè!î×kæ÷WZ }y ãï…ê¨XÊç9¾˜hOªÜ…˜ü ÆW‹¾¨ä7t/–¢~Áäg0¾^û¯{½cHxE|IýÞ¹‰B_ƒÁø»!Åš_Eh%´‚¬³/˜êí›cåg0¾b ‚ôGBÈþf>P¸ÏÊÏ`|ÕÀ¬ÿ@wÚˆø`ø‘úMMþB_ƒÁø{¥ÿ7ú^¤}¯Ð|ä~0(ˆÇk  Ø`D‡öí×­ØÚ·Û[U;/$`4 ‡ý1íÙ÷hýÿÄÿm1¸ º¿|'€þz«îá`90>FB=»S‚ìóîÌvô:hØp%FŠ’ÙXÚOe-#¯C;à-¸³0ˆ~¿£Ž–¯ë0Ïi[hÃìÂû¢Òƒ!¡­r– ±J¢}Y]ú‚­…E”Q<ž‹åü–æ›Òo ì™MÐ<½G> }®öŸ>85èoñœ8ß¼ö Ù­h¿$‡‡ØÐ¬K7 Žá@÷©MXE÷#hÃJûG%ñiwËlŠñ¸5yKcRøIý~;é—÷‘ößOM‚ðO~?e6EðÈ{`?6ê#í[‘îÛí†%  6¤=vÏZ%ÿéÙ >0_qý˜žk„-˜·”ŸœB#n©šFxn´¸ßˆÜo´´ß&þëkmD×Ú ŽDÄGšÙáàGhHtr?RC¼/ŦP|—dÇnÄthÁ}â|¾ê)U„—ÜïÁ嬀ö¸¨º‚,nÂøp‡/ðöZ´è…XçÒ"ÿÅÅ¥xü7,ûýWÓ"ÙýÅÅà´ ù©Âm«{8‹‘òw$?p\áNݬ`{Ñ2à¡é‚ž:.£W]ûï -ðUvà7¥á é“uóœ’_Í=ôõÓ 1V½;++ñ¯áÃø±jØÅ.B}—(3viÒ~öôþÁyÚo×} þÞšMøÅ4gü›=pŠ?i¿Hš…ðÛÄŸ( •²¥ûÃnÀÝ~up«ßˆyªßO´¿µ,èkR‡bÿÔÔ䔡ü¦P1`Usaý¿ßކ͖´£êߤð‹½]÷Qõå^„€VKôÿÏ5ØTN`—}|Týy¢;<”ú7ZÍzì'í·YýÒ5°é>„‚kZ÷1àëT@(ÿÔý§OÇŸ"åi/--5%ßd$  ‚~´ÿúÔ”ð‹-ké?ŸêÿúǽKAäz$þŽþöaì>¼ ;ƒ6ò— ¦nÕŸ1⸠‘gyžö*ëLò×S…š;•m·­c«Þh¥çE>ùÓm•Èö¨`;üNG”XN¢m–ªJ ñ³fÁàSèoùý\^[ÚEûÅÞ]û ö›ªoj¿®4ÛËk¦ò?²ë¾Ò~Cù×µÝ?’H?,µ_‰¿Cûï’ðdXÖz/›¤~¿aü%ó—…ç—Ú?)ÔßÔ} (÷ úÀý)Ãú;tÉßÞJÛ¶!üZ÷Û¡µ¶Ãó±6Rú•ë—–_ÿXk¿|¨ÂÀ<ÑÞR~“þ û5]`ìÊoñ^»WíWºÄ¿&ŒÿS²ü:ï?Ê/Ô_˜~|HÖKá—q€èýC)Ñ^k¿f¿”~8øAZ±vµd~’¨/´ö —Ÿ•¼'êÓß²šüõÀsäz0ø¯ÿGûýñ½Øè„f#êô½Ù鯄ò{ªù%ëbH¢K ò÷É¿Ùu\uü-²ÇŠ®ÏzòÈß7}{‡¾IüŠ·dzº#`½”D¼úð½@삾ߌ.Å?þ¼"à=öÎ×þ½SS÷Úß,ÙeßEù­ò_3é¾~<Àl)¿®Ú]­ûÃ:ëwhÿ­~Cùïjí_6ó}ñ÷kí—•ïʯ´_Å€×È{tû–÷ÝŸ²åû¢¡÷Ý*”¿µÝ,á[[-ÁoÕOZûI÷üHÿg†æ«ä=¥ü˜üká×A e…€®FWt5v]k¼ÖUÛu­ËUûµî“í¿&…_Š>=¿Mè?E’~ÓúK`©öãš÷ãvíÏëïùAi&©š¢¿ÔþŒÖ~"¾Èõ³Û X ±òG4ÿÑ¿,mtv¯t^±‘ŸJóŽ-¨¬M“Á®ö´íx0 zh7íÑl‘ßëé»;1›'­óp£Eõ‹Ù<òÇ*ËËMò{^D©œ¯È§:–Æ«óP ©óô]LùÍBŸ“úJûEÕ/m¯ùS;GûAùO䷴ߪó­iöËðHª¿¡ÿGÍ–ö7«¼_è¾,õ©@0_i¿æ¿%ýH}þ»†õy¿~Ò}§òkö[¼'íŸt~Ù€1€lD€©ísŠ}ÛDúvÊûÛ-í?&ío•vÍ¿`¾!ýó¸ÕKÅ—ûg¦öÏ+áGç¯6Óù§„ô7Ú­€Úk°á£K‰¿Mû­Œ™MýI÷§ïÔíéSÅþ[ѯÔHdª?Žâ/ÆõÇ•ç_ú„Û·©D⟥[júä--Í‚ßãP'ð|ã xüà*þŸ¢èþ£þËÿÿ°ñ ºïknm"}O“òƒ°W")Óƒ“-$#ïê<1'ùït”‹à±Yzñf]™†(ìÚòÈuJÛeRoYâ xÚðc垎 uõÙ‚€KÏŸ—”ß)þB÷õ]´ß©ûμÿ•tkpdïÌKüåi¿Ðÿõ#;ý…0µßVï7´_øÿ~³âÒ¯u_)¿ ·–ÏÑþ)ËX1à{¡ý´ÕñÚöŸ„[$þöÎ@$;Ðÿeë±ØTõï™,ø¡òߟKñŸ¯12~É|!ùêXûS5–æKÆ+÷/F¨íïß…´wA+hç/»~|o6Jd’þ÷¥FÞ/CÀ¸¦©©û¢Ê/{þ¤ ûb‹¼3¬Tÿ¬ ½Èû…óÏêq×¹•.@ü?ß²qeãÊ•ÎNÜÑ3Ä‚¥ùcuTàv´Z÷»‰ìÚã½#l¬ˆXX$U˜̦¤Ü´ý^ÙùîU¹|ò£“Ç‚ßV>ùÛ:›–Ah:0h¼„ÏâW÷Űᢠûí!À .Í=çGíß;gðO>ý8JþÍkhûÖ_Ëÿš~›ö«´ÝMùlõþa©ûŽa?*Õ¿%^P@‰ÿ¤j’úùÚ?µl)ÿ¤*øOé^?5ö=?Ù}cô=(Û/ˆ/°-+ôLº/©ÿRåüÊjŽçIúíŸÊ/çµù¯‘Ù¾­æ§´^°¿F¿@î×BÂÔ'þ»û±èÿãÁ5£äoÚcèÏ{½·[YúÏH¿/[©æ½Ùß/¸}~=¢¨€LþÅÞÒ~!öº»ÏVðc˜’ïJû´-íÇç´QíÏÙ´_qÝÅø“'x`y¿ÃøËœ_ê>>ÖuÙïÐ…ß>pØÔKû‡UÍßÈûupKÕþßAøûoYù¾Nío˜4h?)Šþ“†ðË1>$ýTó±À>þOdþdÿ[·[e ÀìÓ. ~/)÷©„_Sÿeÿ ÿŠþRþíÊߨò~Êú)é@•üæÍ í>\#×ßEY?…gÚoØ~=ÔGþM²_û\¤ýOu¹ÏðýôœQIáû5ý3Õá×#R~â;²_åüTû3 R¤ü¢»O0ßÇ÷±wEîñ7µÏÒþ:ówjÿš«ö»´WfÞoô£@Ð,¿ììü_äû‚þ„ñu‡ö÷ëš¿‘÷[)¿½Ãó}cدCÿyÿ”îó³úù•ù—%ÿ)ìé{=eËù ío•UÿV™ðËÑ>ªòGy»RûgÇVŸŽç­¿Çbä¯ÕõW£³ÿFÕÝ'Jïßj÷Iþ‰÷Ž´ëý.ôWÂ/ºûóéo9Ô~‹ýV©Ÿ^«:¿òšû2ûÏHÐ#¶¬ä~ÖªøgDÕ¯ÇR~à'ºûðQhž1 ƒÁ`0 ƒÁ`0 ƒÁø\üƒÔ endstream endobj 117 0 obj <> endobj 118 0 obj <> endobj 119 0 obj <> endobj 124 0 obj [/Indexed /DeviceRGB 255 <000000FF00006B6BD2FFFFFF666666FF66667B7B7B6666C24A4AB96B6B6B4242 B1F30000FF9090B1B1DA888888737373B1A1A1FFB1B1CC6B6B181818FF33337B 7BCC6666B9E33333B9B9B99090D2DADADA8888CCB98888FFC2C2424242E37B7B FFE3E3DA9999FF1818FF7B7BEB2121B1B1EBFF4A4A8080D2C2C2E3A9A9A93333 33F33333D252529090E3DADAF3CCCCEBEB1818FFA1A1999999A1A1DAB99090FF D2D2525252EBA9A98080E3A1A1E3EBEBF3080808FF08087B7BD2FF73737373C2 5A5AB9B1B1B1292929FF4242E34242C2C2C2E3E3E3DADAEBF38888FFF3F3EB90 90FF2929FF8888C2C2EBB1B1F3FF5A5AD2D2D2EB4242E34A4A9999F3CCCCF3A1 A1F3C2C2F37373D2FF6B6B8080806B6BC26666CC5252B94A4AB1FF9999B9B9E3 B1B1E3909090B1A9A9FFB9B9D26B6BCC7373212121FF39398080CCE339399999 D29090DAC28080FFCCCC4A4A4AE38080FFEBEBFF2121FF8080F32121B9B9EBFF 52528888D28080DA393939DA4A4A9999E39090EBE3E3F3DADAFFD2D2EBF31010 FFA9A9A1A1A1A9A9DAB99999FFDADA5A5A5A8888E3A9A9E3A1A1EBF3F3F3EBEB FF101010FF10107B7BDA7373CC5A5AC2CCCCCCEBEBEBB9B9F3B1B1FFD2D2F3CC CCFFA9A9F3C2C2FF6B6BCC5252C2D273739999DAC28888F329298888DA9999EB E3E3FF8888EBA9A9EBF3F3FFD2D2FFF7B796FC949005E770C2F0F4F7B82899EB 94F741F7FC9490F7B84E6D892D05E770C2F118F7B77BF741F7FC949003EE8803 D600F713EE00016FF7A2E3007DF1C2F164000FF8DF0008402004F7A3A0C40000 1F200C000FF8000000C4000CC40000DF0008000000F713E22A001EC4000CDEFD 30C2F18CF7A10E03EE8803D60000000305E00FC2F1A800E44A05E0F8000032F7 B9C59A3DEC000030001DE803B600C2F1E000CD7C00000900CD5C000000FF92D0 05E10005E17003B600C2F20400CD7CC2F21000F56A033238FFFFFFC2F2780010 260000300021F9000028FF92D0601232FF94D0FF92A005E100F432F805E100C2 F22C66E8880000006021D3FF92D0F432F805E100C2F26C66E94B00000060D91D>]endobj 123 0 obj <>stream xœí} Oi–¶s1Ónó!H ‚Âf0IX&|&\‡5Ù| .FÁËe@_˜ F€Âm#I‡ÉÆÍF ¼?tÏ9ï¥Þ*@fâäö‚ Æ—AçbSHôïÝœiñ×­ôÆ |E ã‹`c±ªw ~~^±Iäo*ô%1Œ/+óŒÕû'6+6Áö³ò3ßBÁxo¨xÌïŸh‘¿B_ƒÁøhÙXœ{2PÜ]ï÷û»Aø¹«ÁøFp3¸Ÿ u‡zçªxƒñm`3Ä¡ýÅÐB¡¹3…¾ ƒñ…н±ØTõ$„xRÅÓúŒoþ`0^UÕ47×gî3ßî÷nãKñÅ•_ }) ãËâ—¿ßߢ©½×Â`0 ˆë}…¾ƒQT³ø3ß(n3ûŒoÑB_ƒÁ( b· } £0ˆ²ñg0¾MDÙø3ß&˜ü Æ7ŠëìûŒooXúŒoi&?ƒñ­àæó ¿_/äã®ü­µ_ð‚~ëë…¾ã7Ÿ·øWz—:7®|×ùžÔëFþÉ|_ôÒÎÇZÏwTè‹`0þA1S/‰òW6®t^¹Ò Mþëyä_?ðùþ—?× —Âäg0.‰ûÀxã †zõn,Zm;{­Ñ÷ïÿ[È¿ñù²L~ãÒ~'(Ÿ¯P °”?=4NÍ=óù’¨¶]¸Nî–ŠkI2ùŒKÂOt¯j©ðw^¿¡üѨ1©¿•ˆbë»V€ë´aý\^ +?ƒqiÜDÅ‚G3”ñ9¿Yï›üA2ß—ÌØö?˜Ïd“Ù$\+?ƒñˆåïÓÑXçw6å¯Öä§:!YhåÏmõ3@~V~ãó0°Ñ¹!Ž&déO+4:(^S…6‹;Tþ7…¸VDi&›Aîù³>îçg0. g°Sµl!@“äÔÂ/Ò}‚ü€ú@ÿd6+²V~㲘Yê\zNGcADgç†$ÿmÝÑ×*óý¬(ùÔögüÙ üŒÏÅÍÅ`pf—‚ ý@AþÃh4-ϱ+a ~D~¬øù²lûŒÏBïÒâRh³Â_ BÀ Èo ?)¿¦~mf¹ŸM²íg0>þÅx|1¾ø!þ!aø$òGÑ}¨üY‹ý…·ýÄþ$Û~ã³P¬ÿP¯Š ,Å—üףј>¥Õ&üÙB“?+J~äüïòZŒlܯB4‰†ô_ôÓL~cX¿™óg}ÉÆ|ãÚèëöð~*mwwyxïã×p:üëÙY8ŽÐgÚÏú_{jFTüPù“IV~ã3ðóœDÕñ c|Ï|¾?(É—ìÅæøº½©ðþ~d?Lã^ ¯6œÏeÀéò*œFàùRûíkÎó¦J!ßÇFôïÉRw]l\øc0.ŒÇOû逹/GõËQ}IÓö'³è¼3™Tþ—­½ìÚOõS¤û€×ÀíÝÿ>ïçOV‡VOV"«4æá“?^:,ÃÔ¸`þ¸èë“I¿;ãâ(Ö?é}ÒÛ;ÛÜ\SÕDLíóŠQ}¶j?xnâþxžòçºà>)ŒJt&ú¯6ä\|xHpÿ%Š?6éýáKöSvFùýã2é—}D8bò3—¿7ê õÂz‚ìŸû'£Øgé½:H’éGÔ8¾ho>±OÔßGþ*âõONVON]~ûס“!|t?ŒÊOQƒØIì›ç"ùÉ÷Ó ¿lR;òñãRh …B+ÐBž„zç~3 ýF²o R(¿Ãö¯ãß—ôO¡‚£éôzƒ¾çgþ£C#'CC@þW-å—ÒI$Ì€AäÏ’ñÏR¹ß¢>+?ƒqÜX‘Qèý-–Óoúœ@Ê÷3™yÛ×ìu%ÒôƒòHÈW¥ò¯"ÅÚ:424´{‚äÔ틤63¾ùµðgù…+ö2Œ‹âþ€ÄÊÊñÿ/­7¶™õ¾,ÖÝl9n^Ⱦþyð°HãWQ×ÑÞíæì¿ündhw„„ÿääDÿ0±¬? ?|á²uvƒ~Ó÷[®„•ŸÁ¸8~(¦FüýÿÆ›NÛïÓõ>‡ò¿ÝGîKáO…SaUëá‚ ŒüjûáW#€¡]Š (þ»ïÎPýQù÷¥ö'ö­Ó…ògÇůÓ0ëêXùŒ‹ãfw1Bñ`eÓxÓÅô'E_ßxÖ$s‚È¿¿Of=œŠDVwÏ^*ú½GvGFliÿè±DP_†½³U•õ§(–XÒß  ~Ö0V~ãsð˜È?V,B¿ÅxÓ-çÝüY[Á¯Qr;ùQ¶w‰æ¹_¥ðCÊOLkþð[úÓ‰ ÿOê¯Ã`üçUo_"ѧËj–Ä_¬èa]+?ƒqq<öuwûíÊŸWíOf{¨ânöóß½Šäߗ‰h½>¢Z?æûCÄSú‡FýÉõ[oìb¹ÈIääe¿êÓ0®ËýjjU‹`åg0.·€äÿ@…ñ^žîõ³Rû Û?Ü¿ M°×zg;ù‡PÞIù²ÞÙCê¿Bã?tbô…_î6ŒöŸ:û¦ˆúBû1Ð"ž¬ü ÆgÀß]è®Gþ#û7'´›å>_6LÿÞÕ« I}ª÷åŒ÷ND±ì=ÁzãT ?ÕûOÞ}âÅjî ågÅg0.çâ›þz’ÿâ çZ åÙÏ¿Qgâ*¥ü²à×`¾Òä¦b?°ý­¥ð¹·Èþ·ôŽóý„é´˜‡œØ×ƒ¦Ÿ'ô0Ÿ¿±¼¿ ù³¦ïÏŸÏ?ÂÒ/¹i6ß;¥þ!)ü#µÞQÊ/»úWëg££Ín£€ Èr¿˜Ù“dåg0>é3Ù_ßíF~£“?ébûß_¥”_VüÃ~¥ò á7ëýôRÒÿDŒðÇ©½‘ðnÿiUc|Øö3Ÿ‹XßðþŸ-úÍ8O±­á—Í_Ìc„_Ò?’Ûß=#é—"ÿÖHúÿ›Ê}¤üb€¿œÜüO¥vïæ\/7#†øeiF?Oèa0.ëÑ´wÂoÙŸ¯üz4 ÖûòÉß|ÕÈù#‘HûIûnûî¶³wgTî“Å~hVfŸÃ”_)ÿÍ ¾4-(Ùop+ŒÓ¼½€/“ŸÁ¸q±®–– „fÿŒó,Û~.ä§^þ„®ö›Ëøà„>Tþ!9Êgä­Áè¿êœ_ð%åËñ½)ç„~‚ZɇÆösÎÏ`\bîîf ÂbÿŒó´‘¿áêUQï¾GçÍÓ}ò“!1ÆG)¿9ÌÇÈù‡TÒ/föÐJ@ûûgy—lüàjšóN`0‡\¤s`ÐßüY‹û.ýüS ´ýªÚŸ@ÛNÚ/çõœ¨‚ñß\ÐkïJùMåˆ~`üö^C„îê˰ò3—…Z¤³bsSð_°¿þ†óDSùÝ ~ V¹’~þ”X¿/,øIåG¡·­æ·÷VŒÔ·ôÐËy8Ù­”?Ë9?ƒqY(î?ž©ûÏU~Ëõ»ÙþI³Ú/&öÐ^±Ž‡˜²«¤ß¾”gî?‡dÊ¿z"‚)D(?.äçø­ŒZÊGäülûŒ ã0z]ùgff*Èúûgœ§ZÕ~*÷çð›Õ~k”ϼ´ý‘°š×£êýNò{½§ÿI¿Ö}±–Ìùû Ǩ}]ìϰò3—BßmuWŽŸgfn û+Ðø»“ß>³'o„_s¾ò‹¥|(é²ÿ<ò{ñž# ü/UüHøi^ŸsÔÀ¸X»;ÃÕ~ã’°îÁûóù'>Jþlþ:E??P_Tûç§§kÐöâpÎõœ¿;‘®^ÌçO!õ÷‰œíùÊß®gõ‘úæÊ{©ˆUïK$–moÊÛu‰A>¬ü ÆE¡ïŸ®æÆïåüëæb^Ùd&ï뎤í—+ùØjt¹ß£»wz:<üÓÙÙªÉâZ¾“ï†ï´/ù›‘KyHåŸü¤ÿ\ƒ!q]õñ#€ø7ˆûçVû¬•2if ꃜu ñ“S{‘ý~ãûXÆ;ûixô•}a®W¿þôŽº÷iBϪ¹’O¿Èùé ¯:rþ.P~ZFL(¿ìyàî~ãÓPm¸þDz§]ÿ„ë¿ucJ/®Ü]:utw»+c¸ûVáûåœÞýˆõVƒ^»ŸîÌ1¢~{ÿðoâ^]«ÏDÂäÏÙ®¥±Tß±'‰~¤±}ª6yð·øWa0¾ÜÖwáõz®æ›ÂŸ?¯Ù6+í=Xt›²ÎÈIòÓHŸÈ~*%Ù¿&‡í…Qßi!ÏœúÈ«= Ÿ`Ý‘{]?Ú~rýÖÚÝ„F½x¯yûàäßè†ÁøÊÑ­¶Rþ_**Ôð^Êøëýÿ7ï>›ôc;ÊïkãŒvs˜ÎÇ 7Œö¾”ÔÇÁ{â†\Æ*^'CrmO9£'<šÃ?ï5¤tOÖûS{ÚEO_FŒñÑø[þó0_/Ž>ïÍŠMIý‰s¦ôz3ö™=”rÛoו벆øÒŒ~q“nû}ºWmkôâÊž«òîÜrdßnûnX ðÙÜ/áè7œ”Â/”_oÓã«EµYïÚcÓsúüÝ3y¨±I?òÍ·mÎÍ‘îí£Ûõí«™}4Ä_êÿÉIÎøDîäÄä¾ÝgõóEð wíWâmÜÇ‘ý>¾cƒqA˜äÿ¹¥E®å1¡–ñšÉûÀ¤©üú>½öþþvYò»º/²~âp8bQ(n/Üë„_Ýw>¢—ñÀé¼h$rÎk—Âï3oÒËýý Æ'!jÿ—‰–‰½ŠW½¿¾Û…ü9Û=»ô}zí'Í'(ë$ôr>á”pþ’ú«Î¹w«Öd¾°^ÄCÌé‘ý|ùƒZ³êf]jØnÜßÏ`| ¢FOß ÿ6Å}¼oOÞžŽå<|IºQ¯“ü¹°ãK¦ù}b–®S÷»V¾§¤ÂÒò§h= ü®¿æ}Ä»7žµ:ú4Ú?÷ß„Áø&`*ÿ¦céÞn—›vÞ›Ê/´?›qŽá?KÐðþ«2éW{åb~n#ýÞ™sø#j6_Šfó%ö#®“&3bÙn›i½ü¿ƒñ á¶EþÇzÝîz¡ûn·ëäžÔ÷ɂ޸º£ÒËôòNÝ)¹œW$üSÎõRŽ„á§•»ÂF­…?õNy±Ž‡-áQ> ƧÀPþ›@yâ=4y«¾üu"r]û‘üI`¿Ë Úá”è—Py?!Ü;÷bFOÔŠ½ÒóGhh_äìü¹“ìp°i?“ŸÁøD«£êf-HzÁüzy—î7åÕd²–öÌ¿vP:ÚŽºäO…çwï~däýéðÙ‰òü4¶/uÒ_°aªÖ”ýÄñòƒß?ŸÁ`bzxïc}{nIý±âWå>>::ZoþØŒýWk¯ÖÄj>Ÿ|Qê§á½Â\^Î'žÎ`0ƒQq·¯÷—n…1BqñÀÀÊïŸÁ`üCã ø~q´9f˜Ügò3_/¢Ñè!î×kæ÷WZ }y ãï…ê¨XÊç9¾˜hOªÜ…˜ü ÆW‹¾¨ä7t/–¢~Áäg0¾^û¯{½cHxE|IýÞ¹‰B_ƒÁø»!Åš_Eh%´‚¬³/˜êí›cåg0¾b ‚ôGBÈþf>P¸ÏÊÏ`|ÕÀ¬ÿ@wÚˆø`ø‘úMMþB_ƒÁø{¥ÿ7ú^¤}¯Ð|ä~0(ˆÇk  Ø`D‡öí×­ØÚ·Û[U;/$`4 ‡ý1íÙ÷hýÿÄÿm1¸ º¿|'€þz«îá`90>FB=»S‚ìóîÌvô:hØp%FŠ’ÙXÚOe-#¯C;à-¸³0ˆ~¿£Ž–¯ë0Ïi[hÃìÂû¢Òƒ!¡­r– ±J¢}Y]ú‚­…E”Q<ž‹åü–æ›Òo ì™MÐ<½G> }®öŸ>85èoñœ8ß¼ö Ù­h¿$‡‡ØÐ¬K7 Žá@÷©MXE÷#hÃJûG%ñiwËlŠñ¸5yKcRøIý~;é—÷‘ößOM‚ðO~?e6EðÈ{`?6ê#í[‘îÛí†%  6¤=vÏZ%ÿéÙ >0_qý˜žk„-˜·”ŸœB#n©šFxn´¸ßˆÜo´´ß&þëkmD×Ú ŽDÄGšÙáàGhHtr?RC¼/ŦP|—dÇnÄthÁ}â|¾ê)U„—ÜïÁ嬀ö¸¨º‚,nÂøp‡/ðöZ´è…XçÒ"ÿÅÅ¥xü7,ûýWÓ"ÙýÅÅà´ ù©Âm«{8‹‘òw$?p\áNݬ`{Ñ2à¡é‚ž:.£W]ûï -ðUvà7¥á é“uóœ’_Í=ôõÓ 1V½;++ñ¯áÃø±jØÅ.B}—(3viÒ~öôþÁyÚo×} þÞšMøÅ4gü›=pŠ?i¿Hš…ðÛÄŸ( •²¥ûÃnÀÝ~up«ßˆyªßO´¿µ,èkR‡bÿÔÔ䔡ü¦P1`Usaý¿ßކ͖´£êߤð‹½]÷Qõå^„€VKôÿÏ5ØTN`—}|Týy¢;<”ú7ZÍzì'í·YýÒ5°é>„‚kZ÷1àëT@(ÿÔý§OÇŸ"åi/--5%ßd$  ‚~´ÿúÔ”ð‹-ké?ŸêÿúǽKAäz$þŽþöaì>¼ ;ƒ6ò— ¦nÕŸ1⸠‘gyžö*ëLò×S…š;•m·­c«Þh¥çE>ùÓm•Èö¨`;üNG”XN¢m–ªJ ñ³fÁàSèoùý\^[ÚEûÅÞ]û ö›ªoj¿®4ÛËk¦ò?²ë¾Ò~Cù×µÝ?’H?,µ_‰¿Cûï’ðdXÖz/›¤~¿aü%ó—…ç—Ú?)ÔßÔ} (÷ úÀý)Ãú;tÉßÞJÛ¶!üZ÷Û¡µ¶Ãó±6Rú•ë—–_ÿXk¿|¨ÂÀ<ÑÞR~“þ û5]`ìÊoñ^»WíWºÄ¿&ŒÿS²ü:ï?Ê/Ô_˜~|HÖKá—q€èýC)Ñ^k¿f¿”~8øAZ±vµd~’¨/´ö —Ÿ•¼'êÓß²šüõÀsäz0ø¯ÿGûýñ½Øè„f#êô½Ù鯄ò{ªù%ëbH¢K ò÷É¿Ùu\uü-²ÇŠ®ÏzòÈß7}{‡¾IüŠ·dzº#`½”D¼úð½@삾ߌ.Å?þ¼"à=öÎ×þ½SS÷Úß,ÙeßEù­ò_3é¾~<Àl)¿®Ú]­ûÃ:ëwhÿ­~Cùïjí_6ó}ñ÷kí—•ïʯ´_Å€×È{tû–÷ÝŸ²åû¢¡÷Ý*”¿µÝ,á[[-ÁoÕOZûI÷üHÿg†æ«ä=¥ü˜üká×A e…€®FWt5v]k¼ÖUÛu­ËUûµî“í¿&…_Š>=¿Mè?E’~ÓúK`©öãš÷ãvíÏëïùAi&©š¢¿ÔþŒÖ~"¾Èõ³Û X ±òG4ÿÑ¿,mtv¯t^±‘ŸJóŽ-¨¬M“Á®ö´íx0 zh7íÑl‘ßëé»;1›'­óp£Eõ‹Ù<òÇ*ËËMò{^D©œ¯È§:–Æ«óP ©óô]LùÍBŸ“úJûEÕ/m¯ùS;GûAùO䷴ߪó­iöËðHª¿¡ÿGÍ–ö7«¼_è¾,õ©@0_i¿æ¿%ýH}þ»†õy¿~Ò}§òkö[¼'íŸt~Ù€1€lD€©ísŠ}ÛDúvÊûÛ-í?&ío•vÍ¿`¾!ýó¸ÕKÅ—ûg¦öÏ+áGç¯6Óù§„ô7Ú­€Úk°á£K‰¿Mû­Œ™MýI÷§ïÔíéSÅþ[ѯÔHdª?Žâ/ÆõÇ•ç_ú„Û·©D⟥[júä--Í‚ßãP'ð|ã xüà*þŸ¢èþ£þËÿÿ°ñ ºïknm"}O“òƒ°W")Óƒ“-$#ïê<1'ùït”‹à±Yzñf]™†(ìÚòÈuJÛeRoYâ xÚðc垎 uõÙ‚€KÏŸ—”ß)þB÷õ]´ß©ûμÿ•tkpdïÌKüåi¿Ðÿõ#;ý…0µßVï7´_øÿ~³âÒ¯u_)¿ ·–ÏÑþ)ËX1à{¡ý´ÕñÚöŸ„[$þöÎ@$;Ðÿeë±ØTõï™,ø¡òߟKñŸ¯12~É|!ùêXûS5–æKÆ+÷/F¨íïß…´wA+hç/»~|o6Jd’þ÷¥FÞ/CÀ¸¦©©û¢Ê/{þ¤ ûb‹¼3¬Tÿ¬ ½Èû…óÏêq×¹•.@ü?ß²qeãÊ•ÎNÜÑ3Ä‚¥ùcuTàv´Z÷»‰ìÚã½#l¬ˆXX$U˜̦¤Ü´ý^ÙùîU¹|ò£“Ç‚ßV>ùÛ:›–Ah:0h¼„ÏâW÷Űᢠûí!À .Í=çGíß;gðO>ý8JþÍkhûÖ_Ëÿš~›ö«´ÝMùlõþa©ûŽa?*Õ¿%^P@‰ÿ¤j’úùÚ?µl)ÿ¤*øOé^?5ö=?Ù}cô=(Û/ˆ/°-+ôLº/©ÿRåüÊjŽçIúíŸÊ/çµù¯‘Ù¾­æ§´^°¿F¿@î×BÂÔ'þ»û±èÿãÁ5£äoÚcèÏ{½·[YúÏH¿/[©æ½Ùß/¸}~=¢¨€LþÅÞÒ~!öº»ÏVðc˜’ïJû´-íÇç´QíÏÙ´_qÝÅø“'x`y¿ÃøËœ_ê>>ÖuÙïÐ…ß>pØÔKû‡UÍßÈûupKÕþßAøûoYù¾Nío˜4h?)Šþ“†ðË1>$ýTó±À>þOdþdÿ[·[e ÀìÓ. ~/)÷©„_Sÿeÿ ÿŠþRþíÊߨò~Êú)é@•üæÍ í>\#×ßEY?…gÚoØ~=ÔGþM²_û\¤ýOu¹ÏðýôœQIáû5ý3Õá×#R~â;²_åüTû3 R¤ü¢»O0ßÇ÷±wEîñ7µÏÒþ:ówjÿš«ö»´WfÞoô£@Ð,¿ììü_äû‚þ„ñu‡ö÷ëš¿‘÷[)¿½Ãó}cدCÿyÿ”îó³úù•ù—%ÿ)ìé{=eËù ío•UÿV™ðËÑ>ªòGy»RûgÇVŸŽç­¿Çbä¯ÕõW£³ÿFÕÝ'Jïßj÷Iþ‰÷Ž´ëý.ôWÂ/ºûóéo9Ô~‹ýV©Ÿ^«:¿òšû2ûÏHÐ#¶¬ä~ÖªøgDÕ¯ÇR~à'ºûðQhž1 ƒÁ`0 ƒÁ`0 ƒÁø\üƒÔ endstream endobj 125 0 obj <> endobj 126 0 obj <> endobj 127 0 obj <> endobj 75 0 obj <> endobj 74 0 obj <>stream xœí| |TEºïWUçtw4!@H€î¤ÓÐ A–@$¥C (;¤MBØLÀÑAƒÃ @PÑQÀäŠH§#Ð+Ñõ¢ƒàUpGpÔq™Qï¨óþUÝBćÎóýî}ïÇ9üë«o©ª¯ª¾Z´#"+-#AcÇLÈÈ"õŒ¸ÉäÊ…ÕA¾hË©\Rëø:í[ x—Èüâ¬êÙ ¿½'j°Û§º.¬øUµ•Ùž JM†ÐqmÅ™!ÿj‘ô®®ª© ñ§¤¾úº™ÕÙ_R ‰¢;ë·é£Éô(Èxøø¤e”qFŸOΖyÆ Ñ¥w…@䢴…’é$ëOÏS3¢í”Gci Ã´›¢èö iä¤BÚA.f'NEÔét/½MÓè:úˆNP •Ð{,õx©šºR¶ñ)ÒZeìƒU* 'h?[À&PòÅ<¹Ñò:£™ºQŠqÈx ÜôK6¨¹¿R'êCutÅЦg5F3QÓoh<P3ï' ô­ä Þt9]IÐþšÞfYá1úùƽ>J_q7Q˜á‡›FR­¥1ÇèC:Í"Ù@öÛ‰÷5ö….g·„Óˆ«0zÒã´õgýy7Þ £ÕRitëhÚo¤#¬„ùX3{NlÓ3[rX£‹ñ±aP_*…‡[è9´qŠeÂ-ˆ$Q«õÒjõ¬³· ‡3è~:B¯Á÷0î§éŸ¬/Þ÷ùͼΘbì0>‚/²ÓGS©Š–Ðõôfõyúýƒ}Ï#`yX{A¿Q?i܉±íMùð} ¬' îÕ˜¥5á=†^vbôb»’g³Ù:¶‘5±·ÙÛÜÄù"þ™ð‹WÄ»Ú ]7†¢¦®Ô í:i ÍÁ ܌ѾýÝA/ÐAÖ…õféèÑ1”ÿ†ã…xæ‡ù{b…X§Ñom9Ñò·–ïz2#ÊF`Óc…/YWøÊæ±ö<_ÏŸQÂ&œb È…O¬ÄˆWµë´Ú;úH½Bßi®h¹¶å5£Äø-Æ‚‘ ~õ¡4ºŒ#~f!šæÃ¿j¼×ÑRº…êévÄË´•v¢ßè ¥?Óß1Äáó\´¾Q·‚ÝŽ÷^ö8{޽À²÷Ù7òåIxSø žË xŸÍWàÝÀðcüÑCTŠ:± ïf±W¼­‘¦i†ž…·X_­?jzÅœb.6O·üñÌçgûžõ}¯…Zâ[®jÙØò\ËÇÆdãøï¢têOWÂË{ƒÛð>†HÜK/ÒéMåëWŒ3Çœˆ†4ÌZ.ÁF⽂Ã; ï6o›Îæà­cËØoØrö[¶–Ý­ÞMèÛ6öol/Þ§Ø~¼GÙqöWöûŠ#ˆ¹@4»xžÁ³ÑÓ>‚áãñÎæUx«ùu| fèQÞÈ÷ñc¢³p‰tQ!‰{Åâyñ†øVãZš–¡åh“µÙÚrí°öšö–ö½n×½ú}³þ¼)Át™i’iži“i·éÓ³É<Ö<ݼÔü†Ù°¸°[½„~ï¡¶O†é0«Ñcµ_ñãXq¢Z_É&aÄL|¢X nÿ©Ïb'…ƒ½ÃêÅ\1ßxXñŠ*6™`I®³h l'ŸŸâk]ØDþ)KÑî`Oñ*QÀM²ýu­‹¶\ÿ„ˆ¿ICùM¬™¿ –‹åÆ¿ÓP}3;®o毑C;Á;Óq¬ê•üz•Ïå«©T»LÿžæbÜÿMÿÆ{8_ÅúŠ7´Íô‘pò¯ÙI¶»Æ!6JKæ×ðl¶;îYÖ‹>g‹¨šÝMö4û3k"ÆvˆGÙhÞ³åçV6‡Ð!‘ÈÞÈ'}d½y6–Ÿä“Ä3¦#b cØ%þ“nd‚e"vÂO ]‹°÷ÁžæÅnò:Ë¢8ºûý©–g䎭¿¥¯Fœ=(ÒhËsš†ëOS½ö&öÎ\cq”º`<’0BÓqŠ~H é Œ[±h¦-Wò£HTã„:NãŒG ;ë@sŒØyŸ¡mf{Ï2ê¥oCì’'ÒDOîðËs† Í2xÐÀËdõÏÌè—žæî›šÒ§·+Ù™”è°÷êÙ#!¾{\·®±c:Ù¢£¬#;DXÌ&]œQš×YTîð÷.÷k½ÅÅé’wV@PÑFPîw@Tt¾ßQ®Ìç[z`9«¥'héiµd6G大9¼N‡ÿP¡ÓÑĦŽ+E~m¡Óçð®òW¨üz•·"Ÿ˜ˆoÜœB‡Ÿ•;¼þ¢%sê½å…¨®!²C³`f‡ô4jè‰l$rþnÎêÖm8SÞÍ;´“Å §üñÎB¯¿»³Pzà.oÅ ÿØq¥Þ„ÄD_zšŸT:§ûÉ™ïv+*PÍøM~³jÆ1Wö†V;Òšë×4Ùhz¹»ã 猊i¥~Qá“mtr£ÝB·?Œ;Ç¢ò˜‚Ò•mµ ¢Þ7×!Ùúú•ÿÖq¥mµ‰2õùP‡Ÿ»ŠÊë‹Ðð aÉÚâ+|¥~¶ :d?dŸ‚½›éôJIù<‡?™ïœS?¯_ï§ñ7$âã=ûŒïuÔO,u&úsœ¾ŠÂ ±T?þ†ÆîG÷ó5éi ¶NÁamˆŠe:ZÛff¶êTN™Ë\ÉøÖqeÒ#çH„ƒßQé€'¥NôiˆLf¡úÊ!0Ããc(åŸù˜ë((¯· …Ü&Ëûu—Íé¨?M˜çç?_R’˜\¶Ó$³2JZ úpÞïvûûö•b.ÀŒÂÇኘž¶¤‰ûÕ6†Æbl+|C30ø‰‰rzW7yh:ÿ²q¥AÞAÓäÉpûü¼\jšÃš.“¤fYXÓZ¼Ü‰8~’ä÷E¿¥wëŸh[×ÎÞ9Cý¬ëÿF=3¨/™à,7µÔá­/mÉÄó¸ ~H«.”cAܯ¹0R#½ñSK¥tW‘Ó;·¼K >ú;”Šî æx‚PU!~§µÖ,™Ò޲.ÍeRñ?£ÉlA+ sùmåÅÁÔ×!1ñ'j2NÊRŠœ+ꓨû|~Øyüyîu¬pXëÍK&N­¯ïpž®›U}}‘ÓQT_^_Ñd,›îtØœõûD©(­¯ö–‡§¿ÉØ¿:Á_´Æ‡NÌaCÚœòœlÕ¸[5ajé>>±VM, pÆ Êó} ÉЕîךGI¹”J¡d’Áù†UàeŸ°ÏC´Li5%P|e#%³„eŒ*›xPf Ë8dZPæQ2ùÈ¢`biÛP Ë—®.øBMlñÒ}_ÛÒÛ¦$mS½)›õ9nØ¢Vhø˜£bS6z±ˆÆA7èùÚrrÁþZð@ïàÙ$ œÒ€ €˜”£¥À8ØúÛeaˆµ4Í| Uè/‘MŸLIÀ(äÚÔW«¡Dä‹%öˆžÔù$èRÍ=aû’ñ‘ÔÃ.IÙMF¹Zýpð‘@Œy-%€F!G=;¤Ï %â9ÙWãKä—À‘ÈZ_ AGC>ùË+Êäðl£ùNÈ_ޱé„|GÀ‹rßÊ2°·ÂÇÐÇ‚çÒíZA¤-êLo²vîToRƒ6‘b¡R@¿eŸÃ}’þKŸ~EÒ¿¶ú§ }åç|ûx;ÌÔ\ÝêëýüU‹­ÆWÈ;M±ä•0¿I½Ð¿¿ÙÚ ênîi|GêOÒ@ð NAÖy?Ý*N‘:·i#âf çý¡h|ÇM=M.þb¼©|÷ÉØC,$Ãn‚*?ƒziQ<ò Ñ_[Ç cƒ¹/-À¸a!ãsÔQ zöÏ¡|7´Ÿ!Ç@Î;›Ü²¶ŸBw=Pƒétƒ~µŠa”‘åÑNžl#8dS1ÈØ²ÂÍO‘a¨ñL¡+Ð  Èv7OW¤ êí û^ðãf326e|ÈØPñxR1+ç±c#c,¸f¶ñY´ ˆÒðQrk}a«Ö‹œGé³\ ²n[2fÂúÞÁ¸g_Ê~ʘjCzšj[­A[mhªŒ}I…Gõ!•7Ó ³Á±SåƒW®G¹&Â4ì\Ÿj€ŠùÔYŽœ÷0 E+ÝJ.èFëoÓ­?M/ þ§!?t0Æg³Zƒ_jwÓ‡|qs3¥a.åÚ½·Ý$a>Êæ¡¾fŒeoíÝ«èQž¤eº¾ÓøTßÉo"œoKÛƒ5u’J´Õý\ù¿~LßI³ÿL?jÚQº}%óßX&àSÈÀ2 ¯ÅÍ6Yæ³&ó$²!nNUš߯¬5S®ÖE­;ä“Pw†6Ÿ†¡œÀ—Úmb=dÚI—‰£˜G´ÅÑr Y?hukµ¹Æ’¢áx½•kÀ¦jMeï©u•mWk2Ûh RÊ–gƒÜŸÕù@joîŽ×Ö¸|€z‹Ómâ³]œ¶‰Ïa(gk—mh”¤¡³Å^§(ÓUž5²ÿjœ¬Ö“Úç  „íÛÓÖòQÌø“Ú‡ÑÔðºú.èÚG°c¾å™¹Ö˜fºÞ˜&FÓÐϽ¦• _¼ÑÐz¦º(+´—ŇÏR9Nú!êÑzŽºhLh?sÉóTÛ3å^P sÞ—åÜ›¾#+ÐGÿûÑdØ<¦úêRûø&J–ã Ê.ƹ‚ºÌnŠÑ8¹C6.Uf!î j<°¶‹ÐÙ<\Öi¯b6Z•`|g‰¡l }; Bû.ÕV1 µdSo}²ñ…ºWÄЕâ%ÊÅdG>^ÅýJœQ©8/‹q>â ±i òê¬VÔøV÷uê<ï¨gÐuŸ:õ2¥R? Í ]9¥‹í¨§ qõòO†ºü™:ɶ!/ ÝOä=«õòʤt¹Æ¤꼑þ܇x;Lvy&šÂvk1ŒwÐ9žƒ®kƒõ!Y e‰ümš¬té–ïæÏóå=P¼CeâÌßnJSq~¿€³qÎðQ«#T*^E> òÍÀÜýj)Z‹¦â/°Ë‚®å¡Ž‡ —¸eÞ}‚./Ó\ÑŒûÁ_äµÅ W…TÀ§ùü[šo„3y˜ñ€ª_¢Ö¸Já!œ› • AùÆ…|¾w» ø«|më§ôñþÉ:d½ªl4¢‰ŒwW¶Œãki'°•¿Û+è¶ÃØÏî§"öp»¨XÑ`ÖØ@¶è§ ¤§€[O}Øäé>àOÀ Ôýh£Iý%9#žx…l3° x%¬k ÙÖ…äm¡'ûÏã÷à¬Ø)ôáÔù:Õæ-4í Ò.7öKˆOq†¦:Š5/¡XÑò^(׎×°Ïí¡ä‹ùs1°Ã”©Æ0ÏOéãO…\»ò|þ¥êû©ÀüÖW+¾À~¬bˆ¢Ø1ã]ÐÉìÎíÅØKðéà;‡Ç3éb°ÏyÓê#Á“ák¼,ƒ5´ò‡±¯ÒV•·â¼ÔÚø“8‹Vý@ìù@›q$ÇUÜÔ‡ç'jgsnMœ[X+?VçÿOÀÚyx xñÿv[Œ«€ PwÔaøˆ»çdùW5gÿHt&´3ά¼3'ùé€ù§ Ûº [Í™È œ#t³û;Ñ*u´TËžý¸>XÇÙ§‰¾+„Ú`ù3k€"èp3;ó$°x(D™p=w€_ú{ð#‚uAþìûÀJ ¸'HÏÔR6Þ”÷‘ |‡þ¢ôǾ?~* }gä„é¾!~ö“èyßáù¿ K\€ªqùojãÏ}ãœG?m»´SÞ)å=ZÞeåýYÞ[©ün+V´s¨ž0–g ¼;Ëû«>@ý}£ür·ùô†Ï¶{+;E›¢óaó-¾u^ÅÙ=õ4ú÷ˆ„:Ûä¹ÀßÃJÌ8 m@ï z:|¦…÷Öì±9Ó~iþçž‘ÿ™šBY;ü˜<Œ!!Œ”hÿ\\ììþ—Ïò9£ÛžÓÿ§|øœãb÷ÒÜ.Â_¬¾ŸË·¿wül¾Ý½$Ì·Çôíc/|Ÿ‰Ç7píÖÝÏ…ü¶Ðöœ»û‡}h¿Ž[×[ø¡gj`HÁ™• <„ý"è ÄwBv³å eYvQø=À^È>!u [ØZlnßgÁÿ¼M;¤lKC˜q±xn·ò~®î‡3µ®—þS0 ˆ€…á¹–ßžhûcþ ‘üÎÕ¦§µWvwÀ‹Ò´Ø>|4.#dª§¯(‡–ç€2䎪¿l¸ôóý4Ñhï7z½Yž&Pw?E)©Yû¤"ß#ëßÅûüqêCvŽº&(Í{üüPfÐ`¦±ozÖñ¼â=úàâ=q“¢J5¦ôË:™g…€‰›±“3²ÓVñgòœ<âÆäÞY[ˆ?Bÿ²8H3T±ƒk§,Tø’xŠbÈ.öŠ=!͞ƨNY”Wƒ#‡Q3Ò#À à$ Q•x”ê€uÀnäHí@0FJÄN±~nCùh¤@°Ðh¢x òù2;ÄðQ’EÚ?HcU¹-l¤’?*w m:Zý] í´z¥©Vï ¤}é]´Û@î ¤-YpIçrúÚó:±Ù”Ì¥m%¹¸ôdt¨ÅbÔ¼tD°°7&KÊšXAÀÙ¤ôò椱ª9{À©:Ù“œªŠäTN'KÑ(­œ·R’¢–€óÔbzÒõ¡ý¿rž–§Ó,:°ÙþÁ3èßd°a#;í¯í“ðNkb®½öWOÛ_Hnb“öæ´& Òš8ÛcoÀ ûaËÙ^ûî´Ùö]N¥Ýæ„S½%'Ýþ;çTû½.ðû-iÏH7h!z<j_Úpûèœö"WƒÚ“ƒÆ<ìC×Ù³!ÒÄF6î´÷On’®d¢Ž{í}Ñbo§reÒàý| ™ÙbOš¹Ö<Ý<Ù<Î<Ì<Àœnv˜{š{˜c-1›%ÊÒÑÒÁb±˜,š…[ÈÛdœð¸åïxbMêç<&M¦šÊÛ¸Lyð‡?œY8ÖŽ¿³(á%ò™?¦„J&æû»KšÌÆxÿw‰ß2öªÒÆn÷óóUMŒ&–"@¥hE‚üñâ>b,cÅÚI—®Xëó±s%•Lwø¿™€~t7Õ¯;óã¨ë’ܸܘ᲋ /”‡R÷¹'ÎÝö‰ëéßX2¡ÔÿXOŸ?KfŒž¾ÿù³Ç}|¯òîãÕ’øJ÷±ù"ïx)g7úZÍ(‰WÃŒr$‘f”$Í(‰5*³ÑÊ ašä-lHJ =ÏFJ#„ÏóÊhv°®d4ºÆJ3Þ‹’U]ɼ—4C<+‹n[YGbѪ²èޤ*ë!\.˜¤¹¤IÃ` \ƒ•zç9µÓtÇG.ÕŽ‹ùT;Œ³I Ú B6Ü÷/ùÌÌÿƬ±âÝ•òǧåNïL Ü¿zÉœ8ÿ²éGÃŒwC¿Jí]>½rޤ3ýï:gúg8  •PWJu…³°*½K*=3 ž ¯³¢Ð׸½® ä¼¶nkm« î•ÕÉÊ d[ÛK. .‘êí²­ÙV‰lk»g»j«d|>+[Ú`¡|_Á´ mä‘°Ê}ù]mÕÃÕâ–wsÂ~plEº}þŽÎ|¿ªô¼ô<©Âꔪ(ùóâ*îæa‰ øž©lwræ“›â¼s [ÿÔÔÔÔJ,^ìFZ»8NÉj±h'”ø‹ä!sü9^¿§¼ÐÇät,=¥ÛœÃ9¼*§.g]ΖœÝ9úâÅ>ˆc$NâeIUIuIë’¶$íN2IÅ´Ò½žœ-I_&‰Åˆ&V‹Ç[¨Ú\ Š?’­]\#B5@°9÷bwAi^Uâ¶Ëp3O§Î€Ltú=Ò×€¯–#½ xh”‘.Ò½qs e‹>·ÜtâDVcæÀ¬!M ³‚tÂÔ õ^¤9yYq Üò¢qñf´éËÀ;ÀgÀw€.²D–ª|q0j}5TãfpŸÀÔʤÆ]ËÜÈ09ܵ5n7IÈÇ ÀÔÍÎ{b5‹ C ‘’ÖÈb‹%=gŸ¦m¶ù |1ßãñ¤pf2›pËñ-LºîÔD¬¦ 2›œAjâLh&³ÎÌš.¸IàÃ:×i[ã15±TO”á/Ó·êBïn™x<Î}¥íÔÕñݯø">îìçÝc²3(.#'4;¦[6ë“Ý);{¥¥Ÿ[¿Éö‡•QýâÜQ2c eúg²«ÙÆÌ}\Lë9ªå?Zl/&±tv·ùŠÎg¯òÜsæ ]z~ѧòÒ{é½ô^z/½—ÞKï¥÷Ò{é½ôþ?øÊ‡S𿨋•ÿx†¾x@þÿ¶ý·}_üÏx4JR©&Çç$3ŒpJꧯj|ÅÈÿ…ÉÁÆ”Lž2j¤{âDoïeƒäeÖff*+bëå?8ýkÏI:iœ'ÿâ"YЦÁ¿{YtÎiKw‹?ôAÏç%ÝwtOÊ÷µgרÈ6"\ïÿˆ<ƒI endstream endobj 128 0 obj 7994 endobj 34 0 obj <> endobj 33 0 obj <>stream xœíX l×=3óæÍ@ƒ¨ÅŽehJ°ˆ…‚CLÊ–—θÇuŒ ˜ÕÈÔ¢$"†‚Å’ŠÕ†(ëë×u)B²Pä¦IêV´&m¥$J#‹hÄâßsŸÿ8`‘„¶©ZUžÑ™ûöwç¾{Ïÿax߇ƒÔoÏ1 æêó7>²—ä-k¯÷þ`_¼ª,‰•|â$¡¾»dma{a|¦Ìº¬tEY{½ïDé7ºP/ûî [¨­ºm³_'-÷^N¥*í£€]G¥ñ)ì\4Ú­ÈUË‘ Ù¯Ç±íÂD¹3T+l ”s'SVÛÒ?õÄVö½¨spN¤= »‰ '9iw– { l®?ÛND?ÊMîH¬4ýEØhæÏ¤.ËQålEHê¿;è3f|%õ(p[¢¿U1€c’îëð4uÌ5#vưÜG-ÁµÑ¹¦¿Õ;‰•ŽÝÓñ> ‡9‡úy­Ô1Œ‘:‹ÜÞíºRgeÞp  ‚½üØãï ¯C=c¥Þ[ã^#öy¿G£· ›€¶&¢ÚnA ÷I0¸›rÏ)$eÆM‰ÓÊXk%O¶Ò±Âc¬‡Y?NY“/ÓÖ™”âu¯Åî.Ìp1—Hg Bøˆþ>Ù_A~-RgŒëráJá9Ý„,‰u•Hîš„§Ü1üIÐ69”—‰•†GBúI¾“ƒ~vvÜ`k«±ï2'0œuäVÂKBÄ™d?NÞLÖIôÉ9ØJ>ìçnÃ4ýgŒv«éW×Qä&§M'§]D¾j¡>ÅHQ臛°Í9Ru•j#63„ììSKñ¢ÚŒbu!ÕÈ5¹kݶmbŽc}?æSßîX­þŽ"ÆÇŽsœë‡é½P V¡„y­Ø¹ˆb{>V ‡è Ä9SÐÇIC/Éî k¡ä@áQɃ›ö?È›Gƒ²A/$wHÎ’|a|…¼*¹:ðÉCAN’œiü›9æŒ%7Ð.Â?ÂY’‡…‡Î øèËæ$Ñï}/ 'IœKÜ»C£ ÄM&æÉ¹ÂQÁÙ2Èc¬ówø’œ«¬œí—ÍuòÝ >"?ˆ÷¼#˜áÿ»|Xä ²Fé]¨wàÞB{ezóÍw· «!+¢Cø£ž3r>Þ'ÑŸyuÑ«œ;Û›‡-îx”»ùV®ßLΪÀæÊUþxæ´Øy|(}¦Ÿ¼(èÈU„›Š7O¼‚f÷<Þp°Û݇-z)yî \ñ%ï Nýcyy)ñuñ|räò0pÄŒÉâ™'ÎòÛf÷fÞQ!4©^Xßa«‡Éï‰Ä3±>‘OÄ å±ÄK±uÄG˜·ì>h‘oG»Ùšxß¹Pg§uä°7ÌêIÈù§õÇÖXêpŒëŸ÷2¬ÇŒ>¹f¿k^ªµÛ«1ïòÑ_ÎÒ¼[¼yÏvžAܽÐexås±Š¾±È`šÀëÍ5zã,¿ ³®Y[ÞqmÁwÔ‰ „Ý›Ÿö?šc󛥙ë Úš¹&ì´ Àé‹|ríI]ƒ^÷+⼘¿øý?CxÁ|Ï#ž¸¿nÏèëG‚Îuá㫱õÌùÏœ¿Û`iñWc?ÆE縟2±C_p¾býN•ã’;‘9èkÑ?9MökªÂžé~úîM°lá›v´½%¹Âƒ²ùçùÅÜk§{v`;ªùÜiJ_Îv+ÉæG£mZä—äÄhÔ´X¸@¶Ù jð(08éñ¡=ÓÆNêÓ»§§”¶ëkjZ=¬G:t¸¶ÆN¬©­­½û^m-º®ÿ×k`×ÝuwÝ]w×ýoÝrÙ±màˆ°úüŃËÿ5vÿ߸†˜§û\³ä[¤ýɺüŒ¾lJ½h?ùbÑ´æ=û\(ã›ÃçÎ:jä¤)ÓÆ¥–¥¦šQ°¶ÃýW¹†kÑû‚Ù/˜(ã¬Ã~RÿãÆ…=ÆßÀ#¾inÎþ(;mÕw7øužÔ}ó¼þûÆœ endstream endobj 129 0 obj 2200 endobj 48 0 obj <> endobj 47 0 obj <>stream xœÍ\ \M[Ûß»ÓÙç˜éÜ­Â='2Kf2&š$¤”T$Í4Ï!BÆe¾¢kŠ¢ÈP %Q*3 ÆBâÞ ÷rqßgëx¿oí}*q¹¯;}ßû‹}ö´Ö^ëyþë™Ö³MijP4M7µôô‹ð óuw㯠¹ö4×AƒûV„Çà#ïbÞMKYoÿ¡'oN%uüF«ƒôx›Œq«â}­)g¾Š5tN¿¤ßÐ* ±F¶5zhôÕ¢1Rc¬Æ8I35ü4"4k¬ÐX¯±Yc‡Æƒ™'4Nk\Ò(Ó¸­Q¥Q£ñTã†R$5µéˆä¢ž¢Á¢¢±¢I"{Ñ,Q (\4O´X´B´N´M´[”*:,Ê‹.‹ÊEU¢§¢W"¬©¡ÙD³µ¦¶æ·šúš½5hkšjZi:hºkújiFhÎ×\©¯¹[s_w{Û©=zõ2âëí¦×oèСz³¢õêžè™z†úzèu%'ž~Aþža†zvžžza>žz^¾~žzc'ÙL7ÑB¯»ÅD{= ÏÏ7?=›ðY~¾îz־ž=ô¼CôüÔzî¾a¾¡†z&¡znz¡Ažî¾¤g”»gÿÀ@/È3Äß74”œëù†êy‡¸„yzè…êù¸û…{ðŸ'÷½Âô‚BÉsò„Teêâ¦G¾hcj®nc˜[ÿÝP_òX/Ћ¼éèÎ÷¦áY˜›o@¨^˜gTÿYžz¾¡A~nÑ令ª _¡ ᡾Þ¾n âéíâáç*ÔËSåCÿôõÚ-(È/Z((¼Õð}ß°PO?/ɾþ³ÂCõìÜH1k=[Oïp?·n~àÒŸã›YxH ßNÏàp7¿Ðp7¾‘Þ!žnaž!ÂMSO¿0· ·0 _/¯€À0á¾_à\ÏoÂX2BüLf…J½…£µ»[H`€“›{x˜§} w`€çœqanî¤ÓaÖîä#ês§†»îÚ íÜ==|ýüÜÜ„*Çù»¹“:MÔ?¡uÏl…7Ç©?aO˜ámר3¡&ê§c…Wm…[…s³†»×=ûPt¢ðÞáh¦þæXuÑF/Mitî®~Uý­ñ˜ &ù„D„ûû¹…‡Ù7¾0%u»…Yœ¤þ’µšpê‹9êòêò޾êÇž ð*òÊzªú oz7ªÁ¯qmêÆ6ºã«¾ã¦.í¦¾ WÿÌ*Žs> ¾Û¨Žpž ‡ßnÜç¡T¸ú3a»!Â1°ñ[aЇ4:T—£(*ÞÚ$:ÀÝq˜¹Ó&Ž òtšdìecâ=Ù<ÔÇÖ"Ì×Î2|ö”qsì­"ýÜÆGùÏš:zPOçÁ½ô\†tœnÔ»ÓŒ¡†ú®Ãútž9¼o—y#úu?²·˜Qº/0Øc÷Ó󹇒ž]8y8ùù¥¼ô=¿\>udï¯Wó3S¸’3Y©ÊÒ£ûÞ•ßg§ÕœÍ9P{îÄAŠêMu¢œ¨I”)5”2¤ô)gʆ2£†Q}¨ÎÔdÊœNõ¥ºP¶”ÕêJÙQ–Tª5…G  ºSö”5êA9Pã©ATOj*eM ¦zQŽÔj 5„2 ¦Q©±”Õ‘jK5£FPÚTsЦFR:T JƒEéR-)eLµ£ZQšÔhª=ÕšS&Tª ÅP.Ô·”%¡¦SrJFI©”‚ú†jB¹RzK5¥fRk¨ÅT$åG¹Qk©%TåOÍ¢ÖQqT4@¹Së©¥Ô\*ò 6P˨yTåIm¤–Só©`Ê‹úŽZAÅP!”7µ‰ZI- B)*žZE-¤Â(_ Q±T85›ZM-¢"¨9Tu”J¦vQ¨Têµ:A¦¶P¨ÛÔª˜:N öRIÔ]ª„:CeS©ÝT UA]£ ©*ƒÚNUR¥Tµ•:Dí¡îQeÔY*—J§öSw¨rjuš:B%P‰Ô-ê2u’:Fm¦Rש T•Ií¤ª©ÔE*ŸÊ¢¶Q)Ô}ê&u•:E£ ¨óTõ˜FÔ÷ôj¢Â×Òëèõôz#ý½‰Ž§7Ó[èú{z+½ÞNï wÒ‰ô.z7QõÉôz/B§Òûèýt}€>H¢ ƒ>BgÒYôQú}œÎ¦sèt.}’ΣOѧé|º€>CÒEt1}–>GŸ§/ÐéKôeú }•.¡Ké2ºœ¾F_§oÐ7é[ômº‚®¤ïÐwé{t]Mß§ÐéÄâ ì– m£îÒÝh7z³Fgbe¬Õx(j-N,ƒk:i.Ô¼#Öû‰SÄÏ3™¹#+ñ–\“jI£¥OšÈ›˜4)nòkÓ¾M½šÆ5ÝÚôTÓŸ›6›Ólg³£ÍÍ›û6ßÙüF‹þ-âZœj¹¶åÓVº­†´JmuµUY«ZkµîÛÚ¥utkhÓ¢Íð6Nm.¶¹£e¬5YËOk™¬‹lœ,Rvå›oR¿¹ðÍS6–ÝÄf´•µÜvuÛÃÚݵ]µÓuZêëDèìÖm¯k¨;[w¹î“v~íV¶Ëoߦ}~‡–Ì:øu8Ñ¡ìÛß>’o”ï‘?WЊΊ%ŠT=VÏX/Jo­^aÇ%éÔ²S—N#;×7ÓŸª¦¿_¿¨ó Îó:Ÿí\Ý¥C—¬.g»üÐU»«E׈®]/uóë–Þݦ{@÷3=Œ{<ïٮ稞‹{níÉõŠ105øÎ Çà}ïÔÞØÐÞ°¦Ï€>3úìïó¨¯Yß]ý´úùôKèÿMÿ±ý÷ Ð2 p l ÏÀ7ƒü¥ î0xùà—C&9gÔÄ(dè7C}†®š=ÌuØÅáÔðo‡û ß4bĈƒ#><1ÊǸ‰±…ñyãÊÑ}F»š 19hòvÌš1ÆN»ÁTÏÔËt£é¿ÌôÌLÌÎ›ÓæÌíÌ[X¤Xܵt°œoyÜò§qÑVÍ­®Ž_;>güÿX˜Ðq‚Ë„ò‰á³&µ›´Þ¦¹…M¬Í£É¾“Ó&WÙ¶µÝh[e×În±]õ”S–MyoïdŸæ0Ö!Ý¡bj©s§¾vtw\ãønÚ´i ¦=s’;]pç•Îûߺlž>czÙŒæ3ÖÌ(vÕuÝ;³íÌ ™%n½ÜbÜÎÍúvVȬ;îÝW»?‚´–\ªRJiT+¥?køÞŸ›V…ULKe”Ε\ßDš €@ö¿að&¥¿7gpÂ{ñÏLŠá»JÏg 9<·äVà€*å7¤Œ·‹Å]T¸g îÏ€™*iŽÑ¯¨¤»Ŭ‰^'-Ù¾xûòÝ(íÛ´{ÛÞ[wo;1Ê–:|³9Û>‰Z¨bÔ}X[­-;XN*TíºÇ$²+ÿ**xõ˜»µÿO5§'ydUÔU.ë;MóŸ>FZ#!Í«à *hôHÄÍWìòÓ±#÷yçY¸c¬IÜ‘Oô ´¹s ¾‰W ab†Ìt3EÒ>SnAkÐ>SùCyö¬1ñ J3Ò£ö\SVˆ±ˆÁ68O‚L13° Þ¬j*rîÅàŒ‹Å !$¼©.‰j¸5"Χ-¸q VAÒ³ìó¾öS¶cö½  ¸«@Ì® ÖUÁü*-T wj'ÖjËÞÞi UL:½3óXú‘Ä|TŒjÜ Ó¥2îjÚá37Û¡‚È\ÏCž‡§m3#ýËcjq óÁR’öÅí‰Úù½?rG1~Á‘!QqSÉK–ø! ë R’ƒöÇî•ÊÞîÛ2Ç»òY8'<,<Ô?v’B¢\Ë47‰§~û1Ã૪æâÑܨ¸R—¹„éõÔ†‚G"ØÃ¥³¸[ÿNØ›Öt‚ÐíÉ[ ã¾Á½«G±O‹FᶸÕä‘} m+@ZÅ•µ ¾’J®g%ŒJäëɯqKp2ãS`—Êw«CLãáØì¦¡ãõS)Wræ7%x.çÆ>)ŽÛà“‡è3ñ´„–îýðsp¨VÄiC& )Ü${„c³yNJ8¤"÷2k%-•^ ì’׈”íÈç¨jU®VÜ•gQ õPÕˆßÎz…Uq/ªøa£ìÉ!6ö©ÄQ4ÂÏ~Ò¸±Þú7E¸yFç2Ó¢É׃ž!0G/Ÿï{i/fÉ´E¾óü'MðIzÕ¥HÁ &Õ€:ž+ŒܯH Ùê·Ùž¿$ÂXž,êqpú‘¶ìÅÀÞ‡½L¶}^h)’BûÇ@Ãp0X¡½2E¶s<&HïHd/F10ךýñü0Bœf‡õ0ù.´‚VgïÖô®ËRXAsñ°€Ew—žœŸéûpx~Òª®½ÉGÿкAóêR`v‘!fîâm‰ÐŒäÀìÈýqûWåK×”²_œ»tI«.Y Z‰V®ZIêTÅ]¬¢¹JBCÕ!£²R]åò«TVÎ’;O€¾³ž†ÜVÂ]e4‹=q'lˆ£p_𪹓rêœâNI.ˆ4“ÂB¬€Þx¶|¨&ôÿ7ÇÖØ´ù1Ä}ô‰ø±Ë7äÇPÁsRø>©ºC­èq[8Ä€5ˆA‘5AŽ'(ð!¦ö}{–»£%ÐùvO<[÷ÀÉÞEBså\3‰G¡Í~sBy?,&"dÔÃN ¿qjoq¦§IpWåpö1¢nÞŪ~T´„4"еÛß Ë«E°™Œ¦UÌáÄG6®E«vÊË$QëbWÏEÒQÓ]G+ú›Y”«\ª9—Gµ>V›øîÀã"Ò“‹,D3Å(g{æá쬹¨D ß«ÀåøÌ{ÿZ†k¯ ›ÀAò¸Àyøpçþ µPY[1da<<`¹ŽUªŽÃõ­R­!B?±J5†i I3£—©å®¶ìBYÐÝ#A·væeíÛ»sφ³«¥$²¾kbâVǶ·G³æ8”ÊlžI•C›zYW!âú’òÆ·‹Žû, Õtûa)5(Éìø4E¦kQp!ºŠN¤æ^•Iéâ™á~3£‘'òÛµuÉ÷ËÒ¤ƒ™MÝ+l ªD%{Ë:¹õ*‚VRÎJ‚£&°O Œ±6nco< ïA–U>V|-eð*¶wEÙíCOHt :!ö"aíúùm‡ÏÉßc7ØÎN·»9afäì%®H÷éü\} Ï‚8‹Þ!cì' @O„+Ñ^UáW„®zUªž º(á,&êÈŠkÉ®zmq· i9ºçÐcÐÚ_Qu6&)yê:9Í3Ã3aw„|ÁÖ¥[—eH0ëp‹ÒÉð-ì:÷¯¼ªt=®¿G1|§Å¶€Ý(C÷äñ´Ò’ô€)käõjS¡ÕDkŠÊÉø{ï_Mt&¯1SRÏO”'ÏA^Rµæ¬±.ìb2#l¼“ö«% äòê‡'&ÁÚD Š$Ž©Îpï§Xe…f|çšà¯ â$Æ'9nïÊ« yTúˆCUYO£j)h(ÃúrüX¡ž&Q/áDí_’¹'"a6r•rõè.Ø+ª EøÌ‚*‘rDz¸x(„D2¸m¯ÞX×Ä2%w¦Ü9?àz"‹_ )‚è®mïDù3&ºcÍx8êÆ†Ùº 1sÆb„µ¥8 ¾Å}aÚÏw2î\“'õŸ#ˆN »Áõ,¥¯‘Q·‘€qt6ÂM-®©ô‡tÿ+‰‰kÖ§ÊË%±+¬š‡¤Þ‹â3€JZB¡å«·Zè¾±>Ê ')l¤ÚUÍÈ(ý5‡tºÏ›Hf¯*éݵM$X-·…]ú=ªñÂÚ݇bþ¹vÏC0ÎùÇÐc^ÈVyD¸û…DNµA#ýNŸcA^Cx¼Ú2ÁuŸû)‹ûÞ BеÄÜô¼Ì´+èzbwµ{ Ÿ§3 yN**’Þ¼’÷H¯8¬–«9Fx’ŒØZç\SÞZàNâµJC\ªj¥DÃî)<`x±ƒs"oWúêÑ·´e¯¸ˆ¶Ü.#|J¢gg6pœ[Ö%9'1Ru— ¼b÷‹\v¡å¥ä•IÇðÁ7”ñoé,^.¼L;×qB«çÊM%ñ+ׯJ@Ò§yG®)”-$à¦iÔ©š†ˆRREC ÿR¶gaI•ªl(Ľo_ËrQйOEà@ÀÚ›4“2‚¢áH[˜Îí÷fpwÕH¬Ç$§`­Ú%^ ¾vä æ3™{wÁ gˆ_3D½?'juœXÁ!8D,¨l¥œ·t ‘D\¯™6Iz˜NÂMì]öøÈ½Sçf B)·ÉÜÇÝí&` O¡«œÛ$˜”•ÊN¤ü3&=yÈ—— ÉKgÏ ‰ôë…¤f¹¹ã%¸iåhh²;w@KÎe«ß!ît[0:¤¯2èL ã.L7•9éÀé×Sæ×çWU±€?¡ƒ÷E`@>6ä½ÿý:öõÄkÑKòØÅ+—£eH0oë^\ÔZœÂ¬±u¸‡<4h‘ÿÊ©ÒûÌÆËGöU"é­cÓáä1ÜÜt~ôò9 &†ø¹ ©ÁÕI¿^-H:sN¾Áaoè´%¬IÙH̰`Qà’¹!a¾~³æ9!©•gZAaFêãEÍ–ëR¤Ìãmaqº3x†ê=žÍ½wc`+q^áEähøŽ…fä/ž7˜5\À™Â)8%8ÿ£‹91j­är ™SØÀ£@ Ûb-°00Çã 8QüŒ]˜Úxºø…Úänä8ñÿ´e‡ë}‡*‰¬ävá…Ò‹‡=-åø=ƒ¿¼î1Ž¿ä¾•<µÏïaæaã$÷+rK¶@RY_34=x†µô¦ä#µò‰ÎòõV‰$kbAÀ "ŸåOˆ™1F z‹åcƒl<°O]ñ.¶Vm…MøØ {gª&r~[˜@¨§ÏàvªÇx÷˜P&§ß’S}&BþÂÀî9ŒP=·|‡p§ hYnu\†NZètyÂm$âeon%>.¤Ømÿ¢¿ÚáVXwÑ/Q[p|÷© Ù}ÇMG‚/µ¿‰.ì;}¾ðrÚ=T)Wl#q n†µœ†÷è? ·¤jÌÀæ°áæÝ­)×å%CÃlÛ“j}ðbÚ?ÌÀ›œ ÂzÄ>ob„ŃƒÂ“7­Ûñ]’â 㘙l:ê¶Â~å´ !!^RÙY^¡^í§¸æ_ÍŠ_î«íxT }ßñ‰ˆ RNcUŒƒª­øs4ïÐöB$}vÞªS› ½F¹dÞP `¶LŽÜœeÝï.¡½þË7Ðô ŸãÓÜøÏR¤‚“N’A£Ëm&ÁÒ@¯õX³ã‘( üÍûŸò¾T{ÑðtºÙc öGëè¹4ÉÐKÃ>וG® Âe-)‚'þÛ&^ï¬<òšQ7ôB%ØVò²àiê2‚®¹ 5.ÉÌ<ݬ]Í#"Ì"Ül‡ñ1ë#¶ý*yKýÅKP€N¿Z,3›4ÕS±LŠž¿BÑqï-¤ƒØ6ý'Y :¡ô‡šóÂÜ[”“Êip/qiÈbwp7ÃîØÝ È¡È%/HÉ¿ÈDå´D:—´x ‹Þ/2j›àgBÔí󄯫EI؇…‰ïLðı¯ßé\GÁ7!”¸5O¬žÀ*r Ž q°›°7²“Óy{V4°’Œö6FbѸdïë3ä²×Ã<ÜmF¶Ãmêz ÷Ó`︟š)—½ÀRØÌÞ:éj>ÎÉÕÄÄ)»¤4/û¦BöŸÒ¬9og4d’]¿A“Š««Ï‘!!ް‹ ®°xñXXL ¨¶¤V”Oˆ„E’ÜŽt)Ú‰A$)iûé–œ/Lãßì­j-.c @K\@Nq®µXÝAÛJ¸Hõ8ò\TƒÙíXzÛ(bÇ^;rôRNYâ#,qk¢o»]ò(žÆ;ƒí{và ¬óľ)ÉK.<¡X…MìzuEÐÌ̘R)|ÃÍf«.Zô8q Áçž=9åžBÍ6ôFv„uúoxG&‚])Œ)¥¹håvミ “ŽbcÆ›¿haã‡Çˆ1cñŠñÄÞâÛ ÞbhÝø¢Ii'& ƈ-5dú[°Âûm˜äo훞¢¹[X‹XÓ¸‚2eê¦ÌV7…Û¥)´¨›Í'54a‘r_Mâ=žƒvU"X®ÜÌÚKð7óÌÍfu²S®ïÞ¨”ØáR¼G2cƒgbXÚü¤åÛ—^‘Ž`â°â¶t\,í|îµä̺ŒÍϦ*ãétjòÁà­ Ö÷I•ÂIÉŠ\ÇÕc¤w̘›¸Å&鉊fGìòÊDÐÕcÇoÆKÏáÇì/þüÑ8ä1ß'(84,dñÌedH„pÁoÍÕŸ fß8KVoM=´^zD2iÙl4BÚUÒÐïÕ¤ßsˆ,à{Ü —}a *¼²’GFƤC“¼œ¦O3î’»XгŠ841 ÿÑå²Üë”M*q¡Fj>ËíE”àôé½{ºüàûìÑ#-"£Êazù®r˜Q®…ÊÀµ ºóGmY~,8+MXÃQ£z÷®õ´¶¢âÇ£o÷R˜iç̰2}Æ»é' ‹Nä*8ç¬JATÍU†Su” ÒæË*dÞ±|Ù++~|NÊÊÕeí…²9E…|Ù–ðû\Qæ_¡++D°ðy:cîîl¤ÀÃ%È0j¶ÍB©¹äܾ¨”Ü2Êr.“Ÿ¸2ŸqŠÙšOLd ªγÛ{!y×Qô£”\ç¿5O¾•€ùÞâD:œX.»‹ïHTr0âä0ˆ?åïކ~5"ØÂ­aUkj”Ó&Kü09w˜+µæ]h¢¶ïªÜ'N‡ÉmY·±«½:Gú`]¢óæÜ¡ãèºôG‹+Ææ\vz^)'Ò¬õXÏi}ÛáæU# U^nBRº|WÂŽ­G2.ŽÔšÁ-¡WFñ®«è¼®¬}ÁN,_¼–æ:”*ÃÛiFHÀH'R èâ\ÖÎffØT$ks¶¼(-뇳„^ üˆ@çE/ ­þmrþ Ç=•ÿRNAÿ+«Š2㢘.šê_¾Ÿ¸c4§MtÎÚG¬ª ³éìŒG§_žÑùùÌéÄk8ZèvÄíÈÔ–¨²œã1)Ä3ÖuåXi ³öä†}[’’ŽŸØ[€¤wÏÛÛÍv¶öVô™Š»™i¹÷ÕåüÈ0 VŠ´_&MÒ?)Y=9&ÈgAïùõO »ÒW’\¾[!ÚG${.Sžu²Z„É?É\:Ñnªpprl¤’ãAü)Gm{ݬЂÿybþ„W?ÁPÉnf2V‹_œrÜŠCŸ^.'_/%VÁ:Ûx¯ísÒ-Ê}^¥Ûõé#h÷ÄçÔà} Ùƒ«{žºÖZ»Ûc}ã‘¸× y ³úøºäÍ»3³“‰Q™;}ô´hyŠÐE~Ë'¬""à¡À§{"ˆ%T醵­±Âýî [½$¶úN0Á@ò`d t’ò¬ÜUz¸„朹>ìj‡ùá^(Í[¹7)Ó™µ!Y!OÇe½¥Ìš¤5ñëâãwoOØâQÒ’ø¥?Yëì·Ñ$½|ôT…b/7ˆú-ª¤aÈ“ÇDnTƒ3›+AÙ›·—^ºUº']•B£[¸-îÛR`ÌËp“ï¤ÝúIpûRá!„ŽÕúÐ~¡´Ç±n¸U±šK‡0 GxÎ'u[Ã%8_G|¸´Eε‡Û¤-ßͬšP+«`q•?¥ÀéBæþ wY¸W…ïÁbx\¥21fdkϻ٤m?™89YXúè#ÜáÖ©}ÎYäOº9纇Š÷¸"•y™pæUø©D¶Öð%ë>l’Ç¢5R|N{Ÿ™½B¿l½’~æðé‚”tóÈ&p{Mz–´Ò•Õïü†Á¯…_BXÿ%ò€óã/Ñm…R}ùÖì†Vy5Ø<݃õ_XëÒºxñ®ëBa?%n¯€àBH­ÔJ­Mx -[ÀipÍY Téy4È‘xDÅX,ç¸hNÌ„`¿éÈB*[ÑûêÄ_*/¨¼%߸p]Üú%R™åÔÃWý*ÚCSt¿t0RYŽÊi%‹¢¢‚üÃf‡x.pGÒ žò ÓSž$('l_—ºEz7»~åÁ9+žxöѪh0¹%‚¡mÝúl‰Û²aãš-Hwßö˜°à°(¿à¹’¦+¯‹p¿”—‰toç¦Hž¶$­\ H*"™~ƇîüqñÜÎÁ¸s{ùÃþ -òú+ýØ¡–CJ,ªï•–Þ{0®dˆb’æé,wG§Y³œ¦Í:z*ïèÑ<…¬ô<*ç­ÃUjëp•x´ÊõwŠNsª/ ªó_õ/ˆkÆ%n™êÒXîRVêsºâ4 5"n î^ Lf°¾…'À-r nĸ—#Œ…G“#[caÔi<ªF©ÃŒ|0‰¦™Ð QíâÔ‡JDú‚2Ší…{ŠÏ3ÐzŠ/´mtÑ’ì_Ɉ?yÂëÄæp‘ ‹æ™Y¶qE–Rܤz4hCç[wÁP>˜AÓ—. òrp (žz¢ôÄîÌ‚\Ź„v$íJݘ„Ò¥…’~ÏØ'oúñÝ㌪h°']‹çV±ØÜÏÞ~(Ø«žÖpOÁûTrIåàx—漉ŽÀbfKùÖªÙ¹Hw+Ú²|OÌþ;:þ a‚‘;š=Çß? Ò#Ö.\_·113RÕoþ(oG¤‰bÖÏÝ,w}ªã–:?í“æI?-—=>wÄ}‚b®d±OÁ'Y‡Ì‰( eíLÉ?ƒ0­#+ÌóMöšÕ¹{¹„ÔsC;„™sn/÷;'u²ÕŒœ©‰æÄ„éÎO¢ÜjsÐI1Îä@à…²¬YE%Hº×¼ÓÛ1Eþ§ÍÙ-~<‘«kÙŽ4tóÙv @–ÉÆŒË@¹Rav=;+jö^ÞªQzÂ{q5ìsîñ̈^Þ‹­™çðõ\±FCwõèÎÇ ÚÐZ‹À›3fqkÜZ :{@xVлï€ï ¶¬ý™iñÐ!]t`Qú¼=……:¶gm‚wøÄ{!]o4gqÀÜ)…:vg¦D.ôDÞºÈ{‹Gb³“N‘íéÓ{ç^|éf¢Cñ)‰:¸7\dÏçºØØ9¹ØÚ8çŸ=™{–˜6Ì[£G"e‘🙖þ á… íaÈÔc–¥{¹ez¢¢{ êJD‡åÃ.Ыæò¡²cЬqe^4CÕ‚¼V Y ,n3y”¥ð ¡cE­ãËéwóy‘õ.†ˆ¬/ûnSOe©2Z+—™;Ïïõ_bz òä²÷eÜ/W]q;ùXÈZkõè„Û›ì7ÏŸ©8pxaá ©Êò²²ºê}59“‘f‡žŠN~ˆLe}ˆCAd÷°’ŸÍYòÈŽ¨¼ „[¿°gÑšU{—/8äD4T› ƒäÌ’‘Ìöñ«¶—èÛG?B·Ú™E=*d¯n¦>A\"á7qÓ‰¶‘>³äÞsæÍBÖRÕájî°¤ìdö²¼ã­l§—/fx}_:Uéœ'7½VÄùÀlÏæ"ªTº°ÞVá·ÃIªÞkHp>Ñί™0[ »«X¼˜9¼¿ŒieIÀU-Y,|¯tc—„Ä.ŒF QÐÆÐÍRÙèínqk"Ú»"?¯Øqҳ̆¤-ßoE›Ñ÷Ë“Ke±g¶,ßÙ>í?_F Ë×0–›ÍšÛÙ™›Ù•••\›Rd&Ø3BàæJ­:~)tëÚ~>¤Ã1¼q•ëRg^A÷bÞº¼Á«ŸýްŸI€®ìò•+V­@ÒùK¾Ûª É¥YiÆÎð2])?Çl<¾-!I'Ï T, ðØ%ž+ÜVÌZ27Îk^dr“Ê l²¼.gü~ßA¹ÌÚoö…ÛoAW'¬'ú&ëãæçä±}ÿÄ­ùåyß%¬ù~ƒàŠ6+§¡P9™Å)f"Èë7ôêZÑ•7¼K²fòü oÞ÷¸Ðà{p?A$ ¸…¸ZÒ±ú×jòƒ 0±¬ÝúîvCJØ]>%ŒëÉÂmCUÉp;ñ(ÉÝb1>ÈùU©Z’€1±Âoóz€{Zv"‘Þª bW{lˆú>2Å+'²Õ¢üKm˜ån³Cí‘-òß½,›ïªs£rßüQ/ê‡Ï÷¤¥2<üâËðìbÍE•‚VgV*âŽrãØÐ_òø!ßt„ÖÃøDRîAÅÎÔøÔ-祦̂a^3íÐä½#"5lß‚ltZú6¯ävAjиír}8ËbolLþ¼±1+Æ€ø‘ž„Ùà…ÜWLÐ$¶iGÜ%RExæx$î]a ˜BGè &0ª^ó3µÄâ­õ/%bÈÚ‚ŽòÆÇ^’R™ø²šÀÃ-ˆ¾ät‰ëtQ[öÚsAìa´ m]yxiR qê}ýí&¦\\!ŸÀô+œúüé…‚{§Ã:o“ËÞelOÜ—Ùî¦Ã‰A†NνWÊ/1(uMÂÆ„-»S"iî¾`7—ИA n+X}d^oRýÊv»ø²¤ÀöL—à™x§ØF6,f`a”øãx–ªËy®‹d’*£î¬~⹆t¿Úˆt¿T˜}¾öû³ÏgfŸexðoýF^{Þ‚‰‰õ©gœ’Íwݼè°|ÌÚ(b¹/ô 3wõ1B¸ ññy‘½þ–?F”:VÊ=‹½ŽŒ-|rTÇ=£ç Ëã 6ú%躺MX²7Rw°{º‡zuü(a­´>$¬ñS±7H‡ $ºWÍwçÿF–Pª çò ¥îqV¼ò’º89ù%WÝN‘3òÇŸÂÝ %n˜•ÿ™ˆ{uVh-3âqc{íOå‡ÎKÙ|÷àl9Í™—‹²¸f¬gŽËᘤ!‹µd)•T¦‡ÝÁï#“¦!¹ô1¯‚L“%˜}6Á´sC‚©¬5ÌûOô–ôwõVëõVz²ˆË­…²]ådƒ1iÄÙÿ à ·äëÜÿ¿˜U/ƒWc@Ôo_càà5æßŸBÞ!‚¼*!*Ž\‚v—ž :£[9̼íJE°‡øxÐŽÉÙé¬XåŽ7nŠÐ½³‡‰NX¾eÕÙU×â¶{%ÝŸ„NHL?j dzT“ËX­ 퀕ìŽt™1U1‡·þÕÁå7JG¬†ÓD|hõo3@Ç MÜÁrr€£·¾3’@4Þð;ÉŸÄï€q‰Z‚äÔ–Uü¹´]™^ ¤}4¤Wðq èÌõ’T†ÞÁö0Z¡êÊÐF*¤YÏlH³ÖiH³¾Ï|.G»Sú +Ó)‘I‹/ñ3ÕùM $$rC’+™u9h÷Òºȱ€=Ó–,E+cþ:<7x~ì ©ñùª1>{¼ýKÿO¡Ô.ÎixÍÉŠar1ø£Š”cØ!FF¥æUJKT[”)l5ó¹Mups³Ÿ6óxþéãÇó r”Wº‚Åñe©þì>§ƒÿ$í!HúXN×{z|í²wš²¬56æ¬>Òi.wÁû3ì«Í-ž jÃï<²·Ãß)>1ôS-øH¾?²Ö?AÖ_RK÷bË!«>Ù„øÙdœõaJRÍ}«¿Î}8ð9èÿó |¤Ô h°Óaz-oØýQ03ì"Lø„³^Ä ˆ/¥Ut™:5~dñpXÖ Ù(=ÝZãÛæ–¤h[0.!Úb)˜0 »'ž€'÷Äú lÒ)Uõ#ü€¥ƒ?ù¸ð2ÎBI +.‰à6…½ïºÿB}@VžÚB­ÉþcØ’¯‚Н3! æ’>ø´üÌþqh|­C[à Z ^û“@4€ ¿U„jhÝø0ÿnxuÀø~ŸÈ‚,ɯyÉ+.xð’_!2™_!Íî?„– 3ø.V(ˆ Ú\Ð8¬^òè´óðáŽÎ?].ñw®Äñ‡ƒëWÁ8ìÁý$,f‰¿%âZãнüi7ØÕ/òÿhiÔxõÒ¨Ng/zÆüfÅU'âá#Ü©7ÿÁê¸ÿþØÛ±~æ:›c0FmHš!Lš]ÚwäÓI3~F!(ÌøHEÝ îh»ˆ8dËy‡ìûgY­°ª‹V¼Ÿ_ ¡’=Ñû–¤£RT”šY¸Æ6%¸í ×Þ¼NEo^”¿xCƒí>ƒ3¹.±ÛöTçÈùÕçÈ “TÄ饮Yý‚óO'JϱÎâJ¨æÓ™þ œF=¬àÂ?bö?†ª}UŸ8„_³º ¾Uþô‘³ùæç‹"ÈU°8ï"7r¦dîø˜Ø±qóWéLoWñˆ†¥¿¬*þ¬ÒÃF3­o÷5æí¼O¦[þ[™;ˆðö#’ÿċ>ïM}‹ÇÔN!hJÿ|‘[öE^sw€ý(Ô¹ó?†:ÿ*:D¿™eSÃcq-ÃcÀç'‘ê@bõ_<ˆ‹øïÔX¹&X/êD®+'bdz¯!þ/;_.FùóçºG †£™ ¬èÒQVø ÊÀè½âo1¯ïÁ´rš;ÊçN®6ãV7¬ñ"húsè´ü,êê0zOpc« nlPeoÍ”Ž¿1ˆx”Ö›ý7ã/¡E çòÿð'Á?ü;mHÜœßĈPçæñC¨ø?»2£Ñïº~ZÏÿ÷’Eü ¤~&ýàk–Œã9ÐåsEW4!„5¶<ØÿÁU¶2=;ðýl3„­øQ'+ø½ýÈë?W¿lÄùÜÕs0õ6]Q#ºWÙ)L¸¸šÙb‘h»ß)sü-ûè<*Üv:MZ+æìã„"Û’БÂl&ùœ¯bVmEß¡¾›Öl“B“Dîf0© ›ñ!*@GçÞ°?pWg\®m¢9„¬f»XøN ·[4^jÍë³2 -B ùÔQåàB KÁ­JJDpD9˜…Þ…ªfSÀP¥UÊpîm¡<ã§%ܸ¾¬ÿuàßâÞªq%ð”ø©˜(•Ð\Z«Š±äbU ×ô‹™üJço•æ'hN¥\ʪæ2³ßšYëá'ÕTü“ªË¡uEº\(“†RWìZºåçM'vWIC™KW._µ"Âqilä¼È¹áË&¦?cà8<Æ»á_bøžy†R#öô‘îf>m7IóKçJgõDx|[¥ƒO‘Ý9Å,x«ÒĪᤪóÀë£p2—u'Ýý¢ìÏ~·îÜÞMkÓ‘n.ÊŒJž}Èe×h4ù¯ ]lcQ°Å9!y¾¾Ó]-‘•ÓÕƒÿuëâÑŠãòŒÒ} ^KÁ‹  î=ÃeQ´»òUƒÙ–Ìžï¿wìHø¬=ÄeÉQ/€~ b'é¸ ÄSŽ70Å¿ˆÁ±÷cν–jŒuÅ8Á ‚Û.bldFÚC„Ê”D’”óÙ ž¢’ù/¾ÈÀN*Æ!ø ‹ÁàÿÄW33¹ w]XüÍû}ØžÓÃÝÇì˜ýô,U-ƒw¦ƒÞ%e0p‰{A!»Úc}ÔÖßÏh´ÉÀÙ²‚”W¡-ûáÿg«™f!ékòø´ .ûe$¿P[[–ññn;²Ñ/•íÙn…’5S¢ü<‘Ôó;É™#§Ë¯%_'@î'#ì–ßÖ³ÁïÆ"ìÆ=ÙFÙxûw>~T‘s|íÚ­‰³·ŸBÅu¡Ì/†8{ü«/ŒIßµ6>[>uNDš…<ù„¿$!áo‡:á¯>Ú]õ†h*ƒ§¼‘0µ~]·ìÕêwÝêW¨á/ÏóÃK GÐ'䈽;5&‡äâª#¹è–ô=„úù ß!‹¬/ö"Ì>¨ÜI>˜Q·í€–°í€¶lþ?·ñ€,V%µûBþ ”pWnÄ'.´™éÉ7kO-L¾ÅÏpÕ„²×Öfm<ºíÞÁ‚;èáïUXÃüù¬À­o@‹àì8Õhݪ +ùÀÍÒ-ë¿[³ùs›‹A{> ܨgúê¬Íz‘ð_cmöÅÛ9ÿ¯Ê‹R›WåZ6â1ÂÈqø0rî¾ÓañF3ØØ8êO^þcB:@r}æXÝLm—º½I¾¹uø‘V„²ç×íß²åBJFºˆ+høNµ$ý`†ÿAój ¦Š'ƒf¬Ÿ©ÀÝ/„å>ÏÝÿ›I¹¬O¼r<3GÉz½awŠãŒí¬H?RÂ!ÛçÊŽ¤uëwÈs$ÑK¬ˆAR¿È]ié‰GÒ6L<×Ï]k3³!»–OïøÃÓHÃðAûÊdŒ>‚Œ#cXK-Ú²¨ÿá"‹Åþªë_”}_çk{wò·2é¡[×J=«î}CÔ€ýtÆÔÏÎLAO?švðJšâ?íb÷²½ÄYþf–çŸy'ÿa¿zï3ÿÛtœúÔÆ7‚Kü»‰ßÀlåÍú5AR´eeu§>™^®Ã§f±2ꈪ%•(ý„¬²Ø>*—/aþ뉻H™öyçøË{è¬þl‘\á5Jíïò¤5ä+ÏÕ«…ÿì+ ë³(øEhU?Íõ»Óœ±øÕ¤/š‰êª$UZ„j¼…ù)Ýd±½¿XxE£´†¿™&°üKâ ~ˆðýÏÊDgÆÔßv½x«7¸­Oúd…Íч/ïW¦JÔÊ Ž–Bÿ¿vçY,ȾD˜¿´±ÞÏ‹ôl&!D˜&ú®¿šêS&d†}±ò¿9Ï£aô²zßåÅ?è»´VÍ|7ükœñ:æ=.¯ìWü½}Bª¥ öjݺ„øO·ªûtÎGÍZAî ¢Uüq«Këƒq#K¹a(UóCék6“ÅÞÆÿþ’|ùÇÓPúñϵVÂþUO„(¿³¥¶ìÞ_Þf•p)v}>x!l¢•ø/Þ©Axh5¯†z4̼ªâ×± 3@¥O¨=û¿Ÿ(:ƒ¸þõÑÛNU Š„•§«EÜbeGö¶‘1îé=±BâzƉßü ·ç‰1 ›<Á t()Ø[tRas“{q©@‚s°#û¸x$n…›M9 ïÄ»¼p½p÷EÃÊõ·nÛø‰Ùô¡Ã?–ÿ#XÅé7,Ê!løUàú}>öÔÐ(Ùè~K‹ÏÆ>ÄÙ ^ÖGÙ^ü?EÙZ_ƒ¶ìË)’•…;öe¬^³ZçˆdÂjO4ZÚYØ—pàKeü'ôîÿEå^€gf÷õ‹aÉu‘@üÕwãòæ™ýpØâ›ÆëC¤­k6ìWGÆ-‹›ŒÂ¤…>÷w'®Ý"Wëß$´óÀ‘íûÏ)NœØs<¾P:„Q/=ŸJxµ Ï+8UÊâ\fÃ~ k½¾¤Aú¥“?4ù­ºîw¿Ñ^”Ù»Ñní¦f{_Úž¼nývÁ]¸b’úG&TÈÊФìý)Òú-+ëÂ$rÿU3Ç»¹‰ļºä[©…–ë¦ÂV!¹ƒ_hç„poyX};7¨Û){}»nɾwDŒÕÜŒ´ÔoAÝš}¡¥EÉEòu®»‚ÄIeµÓ‚¢C=Û!Ϥ€¬IqiKÑ6´Ýž ÒöòÞcfêÁ“;²·¸ÛÞQØExi6ßõv›®/%ý˜ËEðÌç˜ÏÌÃV䥔åÉÇì–ÈÂÆùúûÎlg[à]-—Åñ+ׯY½~õ†Õ¤E²)K"®œ×~Vpâ…Ìe¦?±·a¯îºE3¿?5Ž,>øbÿ7sh£áߟ4@h|M}X÷÷šßëÁÎzI^·–GHŨ_Ê“Òh)ϹÏ.åéÞx)ÏOñú>ƒ§G=1¢þQbÄâÞ*«/› <€ ëIÕyÙÐ_˜Ð?KýþŒ~Aì‡)ýan÷µz| è´?OQ‹’ÏNo fÔ'ûú;4ªÙë³5ë|¨9¶Juï÷ õ—¶¾hÐ7ì‹-+„­±‹¿¼5v÷·Æ¶|FHrý7‹Ð„æò–ÑŸhíºF €/¿}©uMØ•ñlr,Ó› /¾`¹5ô˜X¨»þ`ŸIj?€¿m±ˆ¯°XäKìJã0O(AŒ(±X_•ð%UÌ«jî¿Cú:(–_½CzÙ3ɰßC/Oµ^þK„oaI=6Â’¸]‰0!Ñ:‰©lú YåúæÍljÞ‚¢þoÿÌ– endstream endobj 130 0 obj 15181 endobj 37 0 obj <> endobj 36 0 obj <>stream xœÌ¼xSǶ/¾eYòNN :Â$’BïÐBï½  ¸ÉÛ²-Y¶šÕûXV±\%[r‘{7c0Ð!ô’Ò““rR.9³ísÞd''Üónî—÷ç~ßÃÒÞ³÷ž™=ë·Öú­™5¢`ÁTŒB¡ Û‘œÆN]—“š(˜AŒ¦¯¯RÉEdÕφŸgÐ^Å6–?7Œà¼€y^ŰúF¼‚_}ùzÄ‹¯ÐN¼„í BY)­”SAXPpа ‘A¯š´ hYÐÚ ÍA;‚öE%eåƒ ‚Jƒ*ƒê‚Zƒºƒú‚Î]ºô^ÐGA_ý5èiÐÏÔ`êóÔ‘ÔW¨¯S'R§Sߦ®¡n¢î FS¨BªŠj æQ ¨¥Tµ™ÚIí¡ž¤^¢Þ Þ¥¾Oý˜úWêÏÁ”à‚Á£‚_ ž<-øÍàÅÁ+ƒ·Gï N Î –«ƒÁÖà²àÚàÎà£"ÂwMœ9+9/œ¶L&ÌàÅ%£‡xâ8^Fà”° ž -Y(DÇaɰDA ?‹–•–ÌKÅšGå éü¬° A:ºž†® ª¶¦ ³„q‚䌬0ÔâÖ•«‡ú˜•“hW˜Œ.‡¥' ;ãÓãD·ù絬˜d¾0,‹'Î ´Ë ‹Of¤ÆHP»¨ª Aò`DÂd~âo­O ðcñ©<á`½Qùíýžy똌ŒTÉà³éƒwý³ýä,!/5aÚæä´X‘0,<=-†¶9}~ØÆ°p^¢(5F6„Íÿý†ßÄöÿO«D‚ô@Çy™¢˜T¡(--&ÐëD/&‹',\ÉK͊Ɉd!ñÄ''$ðÓ³ËSÓ¥<~"’t|r\Lê²Xª4qðsc\Œ ¿'&N”Å‹HOLçóRÖŧgÅÄ¡QÈÚ—Ž:ÞóÏÒ5Ï”n|p{/>955&f°Êui1q¨ÎeC_Â_®…Þ¹n¨‰$ÄíÏÔ³j°ˆ®®¼5|°hóàñª6÷˵ßÝÂnc±ãX'V=Æî`—°“XæÆj±'Ø]ìÖ‡½ƒÂ.``ŸRVJÉC>=Ÿb£Ø)Š“R@qQ )E”bJ ¥”RFqS<”rJÅKñQ*)U”jJ ÅO©¥ÔQê) ”FJ¥™Ò‚8A¥ÒAé¤tQQº)‡)G(=”£”^Ê1ÊqJåå$åå4å å,åå<åÊÊEÊ%ÊeÊÊUÊ5ÊuÊ Ê»”›”[”Û”;”»”{”û””‡”G”÷(ïS> <¦<¡|Hùˆ²Q$î=ØqÊÊÇA ƒ®"Ê@§¿CK }AßAï ‰ 9¿„‹ðžËxŽx^ù§Q’¾°ñ… ÓÿÓðòÇ¿xò¥É/ù_^ñòÍñ#ž0Þdˆ_ü9åÏO™;Fâ#cG’¡C?c°÷°ŒŠ=v´æ•}¯¸^ ~uâ«S^]õjæ«e¯~ÈÉiäœäbÜ×¹ÅÜŽ°°°™aa–ת½Vûzðë³}L昛o4½qòÆ.›>öÑØŸÇiÆOŸ3¾küOÞžpc——LÔOzmÒÀäi“Oé˜=µvê“iÓ¦Oœ¾h6cÅÌ”™ªYSgÙf]ž½höWojßü·Æ¾µvή¹³çÞûÃ<Ƽ)óªç'ÍÏ_¶`æ‚o¿ñöû Ç-\²°hѤEK%-úÛâ˜Å…‹?]2yÉý¥5Ë"—‰–Ï]~t…jEËÊa+-+«WE­ž¶úïk*×bkåë¯{ýŽõßl°møËÆè¥›â6=Ú|`ó?¶dm}uëú­}Û–n#íÛ_Û.ÛÁÞQ1;⋪Ä.åî—w×EŽ‹¼¹'fOýÞ){?ŠÝÇÞ—¹ìþú<Œ¶ÅpbnÆnˆýG\cü^Þ+¼©¼÷Ò7%~’Tœ¼.¹þàúƒRä©£SW¤šS;SßM‹Hs¤H{Ÿ‘.Nÿ{Flæ¨Ì¬Ìá—…—³ºD¹¢»ÙrþœÓ#ž(þRÒ"’~&KÓäy¹‹r*’_)·«(*™úE5ÐP4ïh ºP]»>Mÿ¿ —ŒË¦-¦ŸÍbË*Ë10|–wÏ¿;ÿ¡í ­À¾Àþ™Ãï<àü·k¬ëv¡ºhCÑÅu%Y%+-+{³¬Ý½Ü}×é9ó‡§@ñ/…ßÿ“ôËè—ôeZÀ¹Æ,€|q`3K²M§ß®Æe„#ä<\“ãHZ‘‘r@ÄN’ÆêßøAßi¯¶Wpá‹Ä–²þŠ 6öp/Œm#F¢Š/º™áv}âÎTâ2+“N0-$ÙjUœ–-ƒ[Ü!»íZ;¨ù.OË9HcÁ º— ÍÓäi€– x¹š z\-!lXÆ„“`ɲ„6œØJÌG•O뢖o0KòyEà(%—zÖW“Ï)éerIjlN¦J™-Rj@tùªy±Ê®¸H* *ÅõW`(ªtĸ7à‹u·Áq¼AP“–%“‹ä*¯‚S¡rj@.ˆKX4‡|-â,ù'Ûá|9Àt‹ÅŒ@cIÔïT, S®N˜4½ðé‰ÐÏò~(ãC">ÇÌÎä'Hd¹€­Õ8(=Ë=ciŒwí>[e騶Œšø ·o¾Á¹ù&k„*Ûø¦Œ- 9a)у ·è-†Éä¬{ô^8ËUy䯅/Nôµ¼Ì¥’(õµ©Üä|ãCÅnS®z¯TÖÜã÷}ñ.’ªàú(à#¨¾M…?þÄܱ5^´àáɇo}ØúéÙw¸õ ]å¯*Ó* fƒQÃÕ)Ì: Á…e¹Õµ>¯ÿèþÖ-ä$2ŒGΘrzÇ—wÏ4Þ¿À”0Ñï¥ô à&^F?®/Ö, Ð+seäXòmÖV8^å7z@ Ô¸]gœ¸›ôÈBÎÊÔû~"ݬ„˜ƒñ É%ç¥ vªˆºCöJ]5ež’2.œ —^'ç;%6³_mXg@÷øÝ!« 4Á…±°ˆÁ'Ï7T.eï¿ûKþèÏÛtòÓõBM#×Éè}¦jêšÖ(×KÌF“Ê(·˜,F‹ñµœ•:Fž³+°=‰¶œbP m~»>O¬b]8LóЉaÄy’9pP¶3G¾^ÇìćÆÇZâj ŸU~ÁnÇ…Æ¥ø¬a€xb»¾e|¯ [ép&Ä>€Ï·+[E•Üœªœâ]•·<õÅMu8ã˺겖®Q_­†›î‡2ÄD¤2#6©4R€«µ®¢Ò&8¼qk¿ð½wF쬪D=2+Ò3f§ d…EŸ»û9¥í–¸ãNŽ$ç[ÉI+»¢¯Þ8ÒôÝ ®j·Y²pFI†GRÓ}òГÆnr¼Él0—‰A"NNC.ž,¬í|Üñk79uõíu‹pj™Ÿ÷¿Ì<«Í7yv< +Y›É$i„H¶ÎˆðÔí‘ååæéóâ­¹…Èúœ Õó]Vgž­þ{L‡UM]ΆR¶›Ü& )¶Yl–zS‰Ù¸Œ}ëÇä9z­\¢R@N…‰Á©?¾wäég\iéÌÙÛÒæ6IÝp2៎Áaßç;~¹îøœˆ($±€ÌUÄL¯ÉÆ@ëg¿g‰ Ì*:V—Wâð‹hÉדHVÆxá_µO¡Œ¶ 7‰) ‰’º|¥ž‡Þ»ÜE¹±*€x8 .„³è]¹~oÊ‚mÜúïò]Xò,V¶9Ƙ—g€Ãx`¶ÓD4èFÈ4Wd‚m`ÿ­èM1[÷¦îxzNYeK ­¿Ë­½qþxŸ àâÏUMñ5*üR˜+¶¦ÊÃÚN—YË š¸u68É÷Ó}ð»;ÍI¾AÎ$ç““œÞþðÖƒC×ßá|8ÙòéÝ'î+•e¥ŠSÓ¸ I<É[ÙøØF!~DÒÒ÷‘ã* ¾#Åž »¾úTÉ=ôvKèÂïh¹„5ä4\(ÎOÙ &‹ÙÉ9‘ÚùHoщâ;ÚðþI3ñf xJ,{J%øýÓ˜sÁ̸·—›¶•Èçp2ìó ãá~˜³‹8NøÚÄ¿‘£®9È|Ô·m*‰E‘ãÖOåîX¸)~Àçî»±¿ôÁ‰>æž}ÿbǤ®ý ƒ„C€T*‰ôbtd ƒ'üÒ!ð9ð·Æg¿¹uˆãpIJ®æt¸a+2qeÎ.äúûMÂ㉵ÁB@b1dðš5[·,Hð}â"‰½Òs‹`CòÊáÚSİJä;¡žJŒ&·3¥ô]˜Wòóly68¸ËZN—GÉŽæ¸cYä[äFrÊÊÎý—om‡ŒO¹³È£Š8™v½)¯>dU?Îlög$Ï[C¾¾&œ›)ÊP ž,jè½{R¯^ã666—×£W‡dœxÔŨùëÄšw©­Dó3úìy¢°ƒ;b[©uºòóòóí\›#ϸOâÉΖI²’[3Ž|zó¯pã!Îmx‡)tGÄèõpfû­³/qt&‹Ùdà5fÐ!÷-«¬ª(¯lO¨Û³'^•ÈI‹ÏÙ—6ŸNbgí°¥BX~¤ÂqHçt¥‰h_¶b?ùüÀ"–d‹N?¨ùfwÈF—!´€bkaaÛ)ÁªÑû͇Ààºçpc_{ýðþõÒSä+2Wnc:|ÅÎ:Ð :ÔÞ\¿¤( DõYûd¦Jãµ›ÕÒæeØ]e3ñ¤9€jÿðzõ¿ÐÏ  Ò'$ƒH†kuƒôÓr ΑDmÈÌŒÎa'Hר—|»°°º¨¨·ænÉWsaG«¹ÑR :óêôEj»ÁªAIÍ ƒÈk`Ý€r‰7G£Ÿad+AŠ%Ér 沕E64~pf«b‹Â"·H¹>3rUld³Çz)pØÈ“p±çðÑûÍgë=ÀìF»º@Z`ð¼ÞSÞØ(ö¥geÈ32¹±1q[eq¹‰¬S0Íd]®Ð˜—+ÙÒj{>p¼²D-É@¶†»€ì ¸B2¶~âƒ;;K+G€3Íáä …2þA¤™›é&`°jå yHA©3OÝU™v.“»5N’„@Q ¬È°ïÃW_Ûÿ=ñä/ï=2¥†s (Ó Êð²*‰Õ ,ùœs©ÅpÆŸÿåý‡n“WïåöÑ?“ÈÏ™yÀj±Zò-…&·á§ƒí騺ˆmq‹ßŽê¸Ríð¸+8%žîæôðOp1šÙ^!ŒJR'sE±©¢d€óDu½_œ{ï*©5¹áF¿ª™’7h<`“ŒùÀÞQx¶Nxü=œà,Žžü-É~{f슷9ã¦n%‡!‹æ7¬9ãÏ®TQÏx[£]Q(guø: ;Ôë(/JO«ÛÁpÓ¢«º¼¤Ôß&/bmß+^Кm[R¾«$Ê¥GlÎ Àt¨ëßÉ|ïø¶)¯E‘ã7L´D˾ êâÓ¯ŽÃ‰3Dƒ ö›fJ?;=ƒŒ~U_¬G‘Ï3¬ëW°»C¶åKŠ@(È/sT^‚BV»¹ÒR‰ î´¸ŒeZ§Ñt™Y©OõX÷¡Bbß?Ód!šÙco©ã`Ã…mŠMz€®E,¥ÏÌB@CäÅGL©B®ìË;G{Ékƒã˜9älš›^àvØ A(7z 8#UWé1¹G?¹pú~Gö‘¨ó\^¯¬ÔâÍ>_ëɆ„E…7ñŠri¹tm®Ö˜ t@mÛÑ“¹U6zùÞèµ)¾èînçnOàãûÓRìH=ô•ŒókØB•òR  Z"Ö(U2dÙu.W¡û²ç$·þ«Š» ïʨ_¿r9v¾@ì0Ø·)âu[tl¹?$ ¿¼RGµEL¹†o±˜rõ"rô€ /]pZIK×Å“n\jEÁK‰Ra4)Œ2î2N±G— ”ìL¬öDkíÇ¿ß! ¥C®èŠ›y ?Ç#>9 šY<Í¥mMÍõ(léÁ¿\v‚…쎌ޭ·[ u‡¨€Ò Ôe q+ò$$D“;dsΚAa~‰«õ,ä±®à‹äœ@'‹‰/Ù*q6üñ!Þ² v“/ËTy6aÚ’v¢¿Ù© Ø +¨ý»û'1å6©PªÎl5P拜‘îè‚X¤©‰ä2ŠÌXS¿ªw/÷Äî;ƒOÀ튇Ã-,÷YwñU"eWb¶f“[ $@¤O-­0i•J‘ˆ§Ü*b.¿‹ÓCÆ£'ÜžÞKµ×ÀUp&£aŸ;Ó™m?Pnb!w¢:n¢ÀãÄRæÛôºó¬öÃvšò z“E«çÄïÞ™¢huz4$`Î3áwé+È:³Æb2iØš4mÐâ"Ÿ¬öhsÝ——9 çž2™ °5ú‚â€(ó¹ŸÀhOè¶z ¦Fx)à )LÑiÕ*©T®Ö¶ÎÂü2gäç;­¸5$Ïú ¼g²Žç˜âM(˜=…¬ Ò­I¦ÏÙK®bɶéSAžàÎi8ÚÞðä'›8ÆÌÈÉJK©È®÷WUÕÕgù3>[ÒJ 4#ý€ôOàˇ2æID³ ñÊ,zn¶Æ HâùY8ãK”bO=fÙê‰eü ¸.MI®G\..•;µ½{J2A4¾tû¶åó6Þúª ¯ ÏÉɱ&“BÄaUE…^¤jeF¿æ¨´V߈\BÈÇCÚլΙŸsg~®)ÇñËÝ7ÚB§RPl]7Èf¼ðnXŽèuA€^ý¼®8½ ΠìC1ÙA? wý25â&ý²ßcwÈ–•Ôg^Õy šX°ƒ¾žTÉvý|npäâÔ<‡µ²Ës¾Àq®pŸÚÝK0-~? eì&b&ïZ/ÏEš¬3:ŠTÜæ>‚'iËèáätlßrœÑ3eËžÝ)£•šÂ2°"¡ÿ—É®HÔ…ëØ¹!ÈI¸ ³]ƒ,Šiurù:K²R— $xb¹¸õÖ©Ó0†pøa²Õ gìN+—4ôVy¿¹Áä°çÕY ÕN^qxñkù m³YÖx«Ö…ï©i{×^ämm8õ)œÁª'o[3¬&'`€ÂÂÚæ¼<›Ýf‡¯À¹÷ápoU¦  v­[ÎqËÈèä2”œ›Ÿ²[‹ÌùzƒÉ¬5p3:gº©zªºÉf̸¤2(G#O€|®Ê(44Ú¬4âT(†/25*ô§L‰Ë%WœEÎüb»—›—ŸgϳÂÉÄýÿ¯Nf²èM.ùê@ ƒ؉žœ¦“­õ__ Ð Õñ½^b:2HOàî;¡Œ"1år½A§MKU º½Ãéí†KzáRn~ažÕêÒå³6ëL&Õ^m;ß=M#7³VuÄ^¹y¸¾ô 7g‘I„ÈÔð‹•u]5Ÿßå0JÈ·ámf‹¹R’ÀÜHòùÕË„ÉR>À“²êžîøñð%n×ùÞ¦®@\%Þþ?!£½2 ÿÍ2z¡\ Ä@,Ž>NÆ’k±Å‚lÐRZx9€7½,ä¬Îjò‘/8àaUЉçÒSë.®Ê Ì{ü2ÿ˜¨P £[Šƒ¯6|¯pGĬMä”×Pp°³¬¯ÖûÎï:‚-ÃÖ[ÉCQ—spޱÐêrx>Ö%$žad|uli³ù\NZŽDØz ÎW;NU¾àb¹<'Ó+kh,v]ìãÖ6ùj»Ï7/°Jv—Èš@ðWŸÿ,`'ý“øÕ8çµr_j¥Vm2¦'fKå-G¡ÝævTso@¬[QÙm‚ÚdqŽN.äìI‰Ý»š ª¹_vTà­Y5É›W!¦:sòLÖíÊlã<9[Vâ/ÑÉUY3I7k¾I­ØŒ×ì²ö–“g?¼p¶ÔNL“BÛH*¸æ:ÃÛwâÖñ}GP _äR« f¥AÂÝFJ5 F1P³ÓJeþÞ#ÍwOqìÎÁ©Î*â¥ã‚ò!õ‡2ß1;L@4&¥^dÖ™uƒYÇ"_0ÓŒ!YÒÎÂÉp\gÞÜÓ·vÕ®X2h%ç$ wÖöÀ%;+R“¨_«Åa<éc®=¸sÝî°­›¸ ¼èìh€§Ê‹ª.4|Ó}—{äAODZÀËÝ!pÿÌ `q“Œ~ÚP¤CžH¦(2É-Á¬8bœ¥*-9mG@Ô _e.Ô9÷¸V³È¥ä÷ˆIúN`eƒN$­ôU²f£ËäÒ«lââé—Jþ¡€ØC³Óûöмtx–x¯öD¡«£˜=üç)’Nø\sJ7ÌóÂÍ#ÀcøÂ-âù®PÆ\â ÁÊ-L1 V’–²{Wêb°ߨ¹·¯»ÇßÓÆa<‰v´ñ{GÿõCÄ·ÿ ç’¯CÒþä›È DÛà›ä}ëDÉ‘¿p•õ‹’ö(×#±„‡Á%p |ކsá È$‡“ã¶Ö%ÄsÅbR€l¹¢¬Öžç²:¹W¡¶šÎ¿6Yk.Ë2'èIZøøíO5&)ä“ sié'‡ÚŠ›OrlfÙþÈõ›ÂÙ+6Gf.”âðXÿ«ÌKí{æ-LKãs33c¥<€oL8ñÉÝú÷áV×4–´¦‰óûà;fš 3•_#¨kòW74fúÓ±0kÄi8æ4…àA/s ,ÇОҋNÓ&Ó߃I´Íô·É$9ò™“×éªÚ×ôrÌÐáW¨4™v‰þ&ÓàÈgNžÒgÀHfà>ô| ÞÀ,åË}”À'³oÀ€%Ò;)¤ŽŠCþô3u¨ŸõM5¨ŸÔOÆ»…a¦ )iÕ†@q“ &•ûO‚× GJt‡N R¢þa^Êáš{TBOÌ”ªOT‘û+™.ݸdb…쨌ô(° $§5$ú2¼Ò“ «É>Ö¢ŠÌvÕS™‰•A¾Ø–v2ë’’-šAk¥û>½“ßâìô²ßih½n‚G‚6ò¹ÏÏB5뢰2ɺ¬ÌÌ"·,bnê×ÐSÓÚ]Vátåu<Šü„é0ÜØîáƒ6˜·sßkÚ‰7½0uþt`Y$jßvç¸šÔæúJo­G_$öpä¥DÙAmUíÉÖAÈ>†T |R©mHëáj¢ï¿5¤uý!uð^xD…éŸÇ$g’SH1©$YWfs¸»¬±›ûÝÝp€oàpÖÖ¯&qtéÌÓ ûÞ&GÅ‘óÃÇryëb“÷<"¥ïßN½'¿à¶]él<2È^],nq7Á$Ôædxþ«÷afM(Cyª Â| ¡ûO$þÖ‘ÈûGºÊ››¸§Ï5=÷ñëq‡ÖrŠR˜M‰6¦,Þ»›+òsߎͩî=Vÿ¸å·¶«®¢ ÀϘqôÈ=ÄkA 8”E7+·8Ý• p2ˆÄÈÈ—Ÿ ¿~â˜ÿX·³¯þ>8 JÌn£NÀ’ïÕ–™kÁQPíì®Âu§ÈÿN§õÒ¿'ú™N‘E8I[@Òæ'fUwþí1ä^¶ÙÌz'Ç­pkuHÑß÷4÷BK‰Éý+˜$ ìON}m/¹š%^.nvæ–ä".Tî-Á*ÑRõ¾¬Q`GsΦü"¯H^ÚA™£Ö}g,õUþ |¨•UÄ{®züõ•{àB–ï‘¿þ’;àNÔ^ ñ©šy;d`ÜN ÿ4th'¥´u!ý-ëgz)ÇG¦2}Ova¥ËV^PõX‹Çn["Ôv¶Íœof`±pÊgJÌ@kV™ÙòsÖª¼2%Èa½YmœK™­^ˆÞ³¿Br|ÏI⛦à/pÚû0øÝípS(#–¨…?2Å!&Du—ñ7.I9žú‘ð‡KõµÕ8CÞÚTÑÚ2êÔCÛ¦®›CÓäÉò39yú®*bñEmˆIµq×;Nvœ*òœ¸çtôÙqOC:0ÂÀl#­sZ¢£â£¥‘_¾ãÜÛ—o}×Á}ð˜il°xø¤²»‡Ãˆo*‘ÆíW¤¥ò¹R¹Ù| iSÝéרO%ÌkýK‘WîŸ _¸G]£#™yëˆ<:9*xè 0Ö÷‰ê;ø·¨ÄËFf+"ÜÂít¸ý=Ÿkêר_¯¼;#‰§–¥qv§g$óWøt¬ö«‡ë/üÖé]«²Mb½‚+ŒØ¿qÝ*2ÌbI! éƒ,Ú3áMb-óÉÑ£çþ7õ.Íuæ´2‡œ:êEÊ a&RâU™$….UŽP—1YºD2 d¸ÅÒuR_4o?¹•½0“¿IfR±`08ÚÒøÓ1¸šUq§²úŠ'¾TQ êAuÑɪ–¾»EÇ*GÓɾù¿Àð‰šIØ¡”v á}­!æ‘ÛÐÿ€½Õußu€WÞËø8”ñ.2=W˜­G[}Ý?Õ–“x€ÏáGËgÉqYÈ)Pbñ«qƇ³›w,µ‰¹Â¬¸}éq(dÎ*L«äûdN1ÀÓe¹Þ¡ì[çúŠksí{>·ùG×6âù!¨•a½­Í7FÝÙrúíÕ›â6ä 1ì 1ëÙä fâ÷ÊËàk_¨‡o…Ô¦GM½Wo(ÊXäHòùÝëbÆdnTmKÀâ⥕«K£ËRÛÖ¡A퀛¯YvÀ³ÌÌx©2dƒl»Ô5ë˜Ä±ì©Ùû6œNaù;=ÅÀ|æÓ½åúdM}G¯8¸ò)q´rxºó œt7”ñ¦ÂåLg}éÙ†Ž[çØþ¥·\Än=1kþ¶ýÒÊ$ÕUž2¯Óì0sô%f0ã µå‡OÔ§FìŬ_É™7E)’N@ã%ŸÇäg ùüª¬†ÚššÚza5ÿ/>ë2…ˆ„zäÂá0b -–>ðÖÀŠœµ4XFßC®¦=¢…+ißÑÉ9W™d’ÏÁ[4ý—ƒÑïRëɵLøÄN\锺kÅ—Á]pN{%÷‚ô†¼mÿ{b«eAÙ0ŒdrNd}ZÌæ ^NÿD3³Ì‚ÌäØÄÙ¼yé›Ô© O.•úÛ¼ÍK9ðyϧmp.^#¦<£öZaSY.ª=Ø©)Ô»ô™™õ€M&£Ú¿½m-×—žš™¡Ò°wîáE9nÌ7Ú~ßÙ+UaÁç7çìÛ’¼#ÀG¡ŒhbqŽ™F!_Ø¥h„ìi[¶M@"Œ¨8Ð,(S–êkõ{ÉWXô^Ȧ1|»ØGß§›.Ü“²¶oå‰v£îéó´ùðUb4«ÊR¬J0˜Ö÷LV_×ë¯TVJJ9âR™=)'ŒafT)ºâ»Ýzªõd]åÉ2|øÏ+µMÂÀ½yˆ…2&ü¼;0—N£+€Äš•3Jl©ûlÙ£É8r É#å$û›ñpdE]žµ…ËH² @ÇhøWúU¸@æx› ÚÊ'Çv¸ÄU[È|±:‘ÓËyì“0ü’é‘©L“Å6K-&“Èkf]ƒR‰-v¦Ú@Žl%ý ÌqV» |€ý5ýhP¸’ì²¼\»éŒ’tò3{‰"UÈÏ$äÆ|Êž ðyøÆuøÖ÷¹]-=í]8|pŸ€œåÜÀ<þ·?|K…3ÿ+ÄÀ¨‘ÿŠLÄöÿkq“s\ÿ÷€!ãªáŠH6)½Pˆ ×u‚vïÐÍPÆE„1õrѸxrg9Qy@š*I‘(„—l¿&–8ólÀþkb‰(±9³ç³w¿…›º‡K¦Ó‹ì&Ñ(ËYÉ&§Š,œ_‘SßÕV÷à,Gæ2è z³‰~03[ p½Ánw6×;á®Óo/suXm,›;ωZ`„òÀhQ[ØŒéÆŒ sÆhr½áiY—·±¦£Ás྽Úd1\½Î¬j\à‘V×x<5‡¢ë·lß!ŒOâÄDåĦŽÅߤëRnK_)ºÝT#ºasýPÊ8N„ÁÛLg7|‘Þ ³«NŸÕ HaOµ'95Õ¯)-­íá5îˆˆÌØÃãF®ÏÞ‘CÒç¤kbhFÑqE ìñéq<fgkeéñN.cÇž+¹ÇG_}­5—T.–Z—ž#Òñ;D­¬=ô©Ãí‡A8£†|‰´0•Éü¬4€ Ån_mey“ÏeÌn@»LLª†ÙÈÁÝïPa9òúã&MŸÙqðo¿ûËÇãZù:Óg)”4°+s}"O¡Ò³äåu^ùæ´1€TÂÞC[( ²Z¨ÐÙ¿‹±Äö#Ξéé9}f_Ïnrp{CZb?—ȯoomhhåÿyX`Zl›‡þSaðT¾‘¨,€»è¸¸4A¡Wõ îBÙÄŸê´<“J4'™ UlxBLwcõûï Äìß%–æ6‚Šƒ›Wø-1í8ŒA*o7ÛLf$|Çh1Zäz €mJk®g´Úr„ùÒÑ(ÆÄÇDGeǦMÀgÐõ)´O銭ª£ø ¹1•dg¬4iõ*J!ÉÕ!ú!×@n¹AÐ+ñˆr~ù­ïá¶nλð2ÍÙÄ´{Û฾k·»Ò§R™‘Å1r Z“èѪË×ÛtV½Åd1±É7Õ{Ñ)øßnúÀÞ¿/§@ìsºª7ªV3ú߃{®Ö6>„4æÖíq™¦}ÂÖk•Ö"G÷oÇÊ;jºë|Í ?œZ›,ÙÅ©¼´Ò,Ž–µÉŠ’hEÎâ2vïh?~åh|éCŽQfVƒ\ddWÙ}ùòý#7Îrbò(¼Ã¬µ”ç ļµƒ±bQ– U–H½®´v:á8×<2â’{˜ Ÿ–·´vx½UÅU¯*V·ï_.à* bCú`LK¦µ~ØBœ»Tßd¦K[j/°vm…$3S,OΖڊҸR~·¬ÊPØïöµõJ©Ôê,f5÷È5>üg¹¸öÖk¡ÔßëK«ÏÞ†Ûªî>BKNûw"fðæ±r'ز Ó+•ÀÇMG/>¹åú'˜¤ #R+42]»FúœÓõYlAAc\Ï,kéÕ8 hp1=p6™×Á¬¦.—³éŸù¿…û¯ù¿é{Ö’42T£6êåRåa³SÞ—þõ`pM‘ýÊ`°,äšÖnôD\&ÓYd]Gƒséùꬷiä¼Á³ùôŒéÒÝ|ñF#Û(£Á7]š'G±_¬UQü ÒQ]óÿ5ä.ý#ÀmQ„÷%¡a¶Òá’ŸŠv(f{eîµÖ¨×q È7çJÀ6ÅTÇžŽwá¤+OCßÃvÄnuüÜíi¼•ál’>-'lÆßýéãó=WäåB¡Lž£µìJŽCaÕ-ž–!‰ÞÍo8}ª²ûê-Î㯊*ËÿŠ3.–ÀpfºPÁ¯Ö×WU5ÔgU šCb‰îEva 9›y &xnu|ëï`++^Ð ­Ζ#Àgì’Vh ÌE¯s»ýµ²’T¹Æ¬Îâ&ÈÕæhK᱂ŠúÞŠ:{)(ÇëåîŒ4iN‚ñ7)Ç&ÎS"2—e–h÷Gç©­ e"—:?K¦ÈÈtËêŠ ¬./·Óí¶Še"U# ª·Ê¬CîTLÍ~Ý$ׯiö r†õUDGÔ×SÀMøÍ *±“˜Á$GÐËákÎfwcIUyI%À‹]z­ÑE×H#ÕãÙ’Ê*·¶+©>*.!'!¿G¼KLã$…®K£Á`z<ùµr¬z¿4“­–ËÔÈw)5N—Íj·9¹—Õ È —‹â~|SFïG׿ƒoUrºáYNZz¶= B1yúžY[>^¡“j³ç çsW$*÷ÝnÓ$kRLj6’d)ÈÆ<⦓-Uf…K£Òª4JöÁÉТµ£Ø™_bG`´!~™‡Àø.,ÿ¶¯øh h']¦€‹T¸a3C$@Qž,ð545T¶r…ôH^N 8€ï:}òX·ÿD믨„Í„ŠÙH'q8QáV9_È‘ËÅJ‡ºD=…¥^¸ÝÕJ,aŠçæD'$–î´j‘¨1U—ŒgÒÅ@nK+æÚOi+ºTùˆþñ%2¡Ð+©+)µVsJÊlƒ¶Žœãƒzôú Ê7\žk¿Ø}¾é<ïJ(ã' Z‰×™R§Ø† ²mïöµQÕ;{wrï¿Ù],iì1 [8 R•ìñ:l¶"'×[â,•x­ÄÍOÊÎNÚ|!êþ'7ÞyØ¥öí¼Á±æœæRÀ¾yìĽCòC™M\òE8IêÕøŸ}¢µé‡ñãÒ®Ô`Ôk´\¹B¯B>5³B\Ûäõµœ8´ä­Í»–ð$õmæ0žªx f3htî>¼½4 $ã¼´ƒIÛÂàÈ[í õmƒ >±—˜êÍñÜÇʘB,%N0“é;H:•§3ãhr,9‰œEN/ID¡C™¬DÛ¨Þ@†²ZéáÃcvØkô%p¡öÜÉ›W| îƒZm“¢RÒ .-ÆIéÀ$¦¸BS jÁW=0øÚÍÚúVO3°"ïh·àõJfE¶K’Àò”ñû×'ìä  0 »pêFbqÿDf"|ýõ™Oi ô¯ÉE´£ô_±¼öwMìp˜_†—e‰õþšú_Ù ºÏ\¡œ»{oPE?2û"¿þ¶;½Sq°{AgIgÝ·YÇú&]w¸¨ô²A¯²=ãÐ×ß²ö›8™W_¼°£@‚*:}ò׬ȽßNäÇ)y`/D'ÔÇàpl`>ººfþœõkÌ_wãÃÇׯ=æ"–¥ìŽõ“k²ªF€ÇD&¢YÍÄgO™‹¶ðå<€Hm=î³·ØÝ\[q­ÚzØv·¾«îH£¿ q­î4ÿîˆɦ5FTŸ4¦açh’‰3‡|cîÅMON´yúNpžýÕ­Y=£/ƒ Mwïâäø€ÙV•—¬Ü–½’+Ùš›œ†3¢â32$GÇf¶žý¶â—ßåVVÕûΘ1òÓÿ¤¢­³»ªÆ_ê 5r!/3::…›)Vçg¢0zXÀùÿ<9ÿ¼pþ?¿DÿEN°Éiœ‰ÔI‡¯þÇchmˆxû_ðQÚP‰À~!},Ø,Ú‘µlñî”úì:qîŒYy@—¥Ú¿†t 0*õ2Ó>£!›'ÐaT¿‘vžNFýÝÈoµûÔyê<`'Ùr çøÉTyùpñ«ô˜Ó~ߎ“|Ÿ™ž¯°)‹³½ÊÐ .ÕÝï8T×XWr8€­ƒƒ+nSÿ»·_âÓÅ•ý£‘Ȯò›ð•cß eüfäàC=½àûáöSóÈ—“éÚÆYAÞN#GgØØ*]¾=ªÚ¸ö‚ü"àÄ}Ò²,¡\–™Ð(è}ïÝà«mH%wÀ7Žß=Ø]•é»Ãv,_ 0šÔj‡Ñká2¾9cö'­Öˆ¤Gæ$ Ä™×hN«Õnµq…Öà«åî¬L‰8y¥cGùÚZ9'N5?7ÁQáѤjI±Ìžj È4Ã}íð‡fJÿu¸ˆ¹„¤Dd“žFO’¹¼Å%ÇÎÃXnýŸ&6לkr=Æw; bf¨ äl û"¸š ì½€ çÕ)WéÔ¢àzÌÍp*m TN/ ìæµæ"-¥Ù˜–0@à±önQª…m‰[Ü!;*²ÿU/Þ±Ù ‹‹JqNßC.V&è ›õla¹çѾøúàWSȯg§=dïŒ`¨ˆ1ýÁLÕA…*…¹R{Z)ÎXêáe:E£wt~Îb¼ž^Øä.«P­;-Â*µ¿ÂP<úhn/½Ž„þ#\NÄ0—nݲlÉ…-÷î^¼xûÁÖ ‹ŸV;þ‡–Ä`”ç-œÕ“Z¤^˜ìâfúUXÁ“ýo1Íf]š¡:'.Í6-º!ãØñºŠǹ¹I&5á²bu…¿¬èÌqŽ®Pþ™MlµZ¥¶½‰ÅØm±X€e´ÙœŸŒh^>7¿Ìæó\k†8›Q2VÊ,2È‘»NíÈŒ$¦ç¦Lr½Þ»O õ„n0¯?A!¦ï1ÉÓtÕn<ÐàSl5Ÿ0‚©Ìb‰/£%Þ¥vh¼Ÿï¸ ¡¼0ólâunNW]ƒ¿®ÈÅ>u¼£”á6“ͨŠ·­ãdfiuá3XpŽæ¿¯Ãd×z4åCõü~5¿íønƒ›˜C›¹{¹ç|af¿°¨§öK®«¥Àï¹ _Ì*=NŽ™s®ø½ôåídkÂVÅÞ¿¾AîJpeÿ²U|„ªw(»ŸÃlÜ“¸lñí†K8Ÿ R½™Uüy8z«›{¼~—ÏÕØÏví­–&iÿH&ʼnÃØïÏ“tÃ`/üÎû}7œùêv†Jø¡Ž™¾5Ið™»/Ã`H=~ñ³‹­ü­…\÷»tàÒ(lÆ<–ÁšR˜aOEa>sÖ|òy’þþr8¢Ýo+ëã–Úò­Ö¢²,r>±˜In%'“SÉp2N&'Ãp¸NF›`$9•ìàæÅ0áL8‚|…\DÎ&G¢ï©ätrd ;΃#á«p:÷×}U#À·!çÒ·¡ŒwÿßÚ]Ř@vÂ[pÖµ_£ö~Õ ‡5Âo›FÀ]—ù×COû£àxæú#XLC§š,VÄÐàBzÊë´Ëô†ÿ@n/J˜[ÈÍ4’I‡› ÿoÓ6ëˆ0ëkË]Èw×UŠÒöG¥Ž—p5!µÀ Š8ƒèV×$íµ31n¯Ja/s¤E ‡àR…B.ðçöBìÁÕ/ü:o®›«qYòÒKVãéƒÚj_ç¨Ã±Íûã²x9œ]­„uëèpTðà÷ÊÑ_üíßî~ÊÿCiúÿæ4ýðßÒô/&Âð‡'Â÷qÃhïàVîÇTø€¸ÂìÚU¹³pµÙÂ’6ñ=Mk¯’ãÈ·Èɭݳ¯À¥pÏ—‚ë›ïp¿ïI©›לP¾¿$í–ú¥­Ùä‹Í|ÚO“Ùò=nÿnâ¯[¾ÛOßmøäس[¾K+ž‹ÆPr'”ÑùoÎ,&³ØùÇ3‹/¬[þ(¶çÂnè`’»ÉÈc{án‰ô<òØ122pwïEGè•ïÝûoÙx?è_ùûAìÿôOv\ 6ÿnãh$î\£ë¯Q ÄÆ4Vñ×Ó‡~æðŽ ¦u…2|ÿOýÖG`ÿÁïÏH n¨{à`¿üÈÅÿö·@Îý{ äâ¿þ#,“ðü |é¿åaÿ™þSé®V#F€–ä'´¼‡4¯JõoV½åªgtO£ú?P¾W±:xè­Žü¿²#…t^ÿ]µøwèüÖþÕ¿‹Ñÿi•$¶þ^Ûƒ„ª­¾]iF—]A×á´3T˜Iè˜Ç €hœÔ†€höp9|³,d¯•Æ¿í ©N,”yÒZ·xÄ€_vÑsÊ„µ©ÝáY'}ÿ_uWÖÔ•ö¥›;.Õá6@tLh§ÇZmµjÕÑ™vh«-nmUÀ ØZDE@¶†-NÀQ– T(ˆŽ‚hÔ–¢J]êÒiÅ¶ÎØEkýô{o<8ßwïM€ †1ÁÌŸ<pÏ9ï¾ýÞ²jÔ@_Qó¦¿N€S” ž8XâýNغ╌Ðüh-7‹Å }Àö½æ.ø$&§$¯ðrѹP%^¾ìßàáµ$ÐÃO¬ÈØZYÐö9(„r•/×Ô/ŒáwÍ(dÉáŠd#áIëâ|üðìexŽ?ž>)Á/Î]Á‡ô¯‚úâ ‹8Ü 1 <áÈõFÀíÇÓ›HÎH¯Ðtå©.Z q…ro:kÞŒ,äjJG9Ø¡-WÏÿ¬#Ì– rˆ èXÅg¥[Ýza];ñ)‡A´‘;-Á š]ãÓ&½;¹oµ*zKîzsÕ*ûw]»ÙÜ›¤ý†î†©t’­ý, ¦>û,=º ÖW9 :XUçiº‚Y^^³fŸzûÒ7§Nþãk¯S³Ý|¢Ñgá‰ï¢w%MÍÍ MŸˆõVß™mÐ'Æì«ìËìûÃX4@_Ù&bè{Þ¬f×ÃÎpŸe‘gØÏZ{†r |lÞ©³‘K™ î4ˆ[Û xŽmz±[ª;`)Ct‹âç\z®Ã6I‚¿Ðgp÷È~ݽQ½Ý=ÝtÔ AúÁ˜«.´²µSIÀ¨6 ÈLm…©=2]l.±›)¦”Ë ±ø-¨3ëÃèÜ]›Ì0+ÕñXÙœrë䃧¥¡gª€Ãû!§ˆ©. ®±P1‹’¸,^¿ØKÝÓÒÔ°ä0æ`2?»à‰Ä)ˆÈÚ™Ÿ½ £Ãý2mË*Ë?!>3x0ÑØFqŠßÕf’áæAk-|%ÐB©Žq€ˆÓŽP÷ÒøäÕˆÄC… xâ»+Û Pµð¸Ï¡ùk×lŽEIââÖæ%¹í®ýhG "T¬ ’Ì[ ÆBì‹)ïån,<.<4HÌiëI ¼þêdKbkó±žö1%Ú1BµfE^¥ÇÑÒ¢åŽÝaÙ#Q³[²Ž"wp«²|‰Št.–…àŒxçuÛáyúNéÙŽÿ$=ÛÞ'=k>Cò°™‘½¬&{n¯Ã|K]½”1"6•9FA+{ H™Ûô3qNÆ×@uð™P! Nïg.3O½·à3·Òä’´ýè úâAh¸w ÍEuyžz7qÎw¼„ʼnË)Gµ¨ŽÅ‰‹Ê]–õƉ“£`9(°„ugÌ»±/qíÁƒïktN5Μ~9ïJ¹@Eœ€º™V˜Ÿž?æ6úúï×îÄlwÓcW’ý`W¦¹=sDû à°N<à —Å7ÔÀÜ}w†{®ÔÇt ýš` á[—¯`V¸2¤l¿Z¹=#[Üó¦¯tM Iؽ\¼()’Á¹±%ÊO|§Féù¢ôB”‡rQ¾2WY\´´2L‹´¨±\{2-.=%ÔÂUE‘µu»¶Ø/ÊT‡FÅ%Ç aLâÖ­(#k'›ÖeçE‡·ÂpvÒ‡q2èï DÀ¸’ž|Páá}»‘éiN}{OºÀ§XWï+VMؤÿr/¤…ýôx²Ÿ†PŽ3Ùkå¼§—QÚS9€¬ç¨cçú Âl.<¯žë'Ãh§؃q‘Ìæ]µû*e[Ç@]¶­ö*”¹eæ(³P™‘–©¥H‘žž•*m’Ç(‚ädT?SÉHkJ¢ÔtyêæÉ¸ÖM/—°ÐÕÜü§¡öÇ1‘¢ËË¢Úß^+×þ¼Œj£°ý”ù·$á{Žc¾–bDz·ü«~ÂC›‹ž’MçûìUìòá}³ïÅ•úTÜŸg\Ü×@S™ÍP)³Ñ2S‘‘&ß g„uƒ<:-,•Œªàg+ÕJuâ°n¤]Ìf ²*Ñ8ì°U›¾Š>nŠãºETb"zä&ŽlÏV.gE” Ám#¤L +†ÂÙ«@»Ñ¿3õ¸Œ,'háØQgè´+¥Ò4žªîÔFPë8㚇ÊäU¤àŒkB4k\ÃãÌ×J~–RÁÈëf! yìòJ…ÐÉØË|‚¦aÁÚ5›7mEÅ&ÄöIЬ“Ì A£›!,²@—»j¤$v¥†ÑM¦’ÛzMÐvƒ1Ús¸tÚ/w,t¥nÍè”Ù`¾§[Gte½X%Qfe%1ÇHIÈ¢$ÀV>R¾\¯NØ®»;?Ý£NÎÙHŒ›ó,èõ©4CJUû¸2jÔ$&ú›iqÍÌŽ¿¤ÿÔw®Âz;A¼‰ß˺pÂåæpÂ,Á w1…ðPœpФÿDo3uÂîu2lß6·QæÜÀ7ÊÔl£ sÜ2qš4T›ê?¯¿o+*/_w¥&@>ý¼@ nÞù"[ª–ÏSO¡¨ôØÔH²ÐB /ŠEo–ÉØ rF<ó¿-Ûœ<;#ü4ù6žIúAïóÚy´<*5„\ÊþtYJàg¿CÛšv6îö]°"ô=$œ±ô< ÍE9Êíbx†¨¨çáY„ªtKQV1 ËÙŸŸ¼È"^ÁØ3¹ ÚÏ8B¢n„ ‰¨F ëú’šïñ)"ïpQc¢ãSZ†O  ¯jø>Œ™A$ýê«‚\^„Ó<,㳿àËþÂ_»rø¨.ÜÐ<ËÇSñIü"œäá‘DEú®¨¼`g0–°y¥œù3W ß_•°ý³0>Wýs øÍ$Ž­ÂŒUT1VQç‡G‚“. ÞÞÐ-@1|TQô,¹‹H€™¼ÎŸ ˆë\åx:>q x‰µ3×K1É0ý?ðƒ;<ý×®üf®{8Ñ*æ{ eitÄ!Ë…¾Ià*Ý<œyÿ÷XC/‡EËyOÒ‰ •pó 44°ûVоuü_Ý+‚†’ u-"o4ÇÓÖ+Âä¾â·›Vç{# Z(‘„¼…Þ"ݯL»ÝrlWcè“öZ˸Y$,eâáñø…UI‘ï‰@Û9Yƒ‡Æ-Þà·ÁïÃUˆ|oÍÑ+@¶þøMÕiP…X•ŠÐ–TÆUkIÓÜæ`‰à.œ€g+G4\_X1äájOÈ æâÑ<ìé ãÉ‹ÍÁ'a$ª[qs½DÄðć.ŸàCÅ‹è'x^öÆÿǃP|V€§ÀY˜Í0Ÿdn{ˆvzK/ß |WGÞߊçÓ#ðôÙ¥Þ?5ðŒrþ56-2O¡@k¿ñÖ‹#ÍÆ{/`ˆí_Ü’õÚ|qwÈÀV_Ü–=d÷E7A:Æ\ŒÒ€£1©b«®Þ£žÂ~¡QYÍfá¶6ó)ü—Sߺ@ ¨Å‘>Å|MÊ·u}ü÷ µ9š:Qèú„PDzwOóÆêg~…«Ã‹÷VªKöµ‰+nß³£é[¨u3ÒÉ|¾UZ±>5Õb›}‹x÷¿Å "Yæ‰0×ÄíìtUFçâûa– jÙ±ç‰çÃæ~ð¸Uõ:Ž4œ?äü%æÎ2X+ ÆË9é¹c˜]¢ß1ïE2SW/ûîÌ£¾Ò÷Þù)ÙŠm©ï½ì¦NÊSådä"á.̓®òÝ=®ÄC…ËCi¶»4cš` *æŸGœ)í#¨Ê^¬ÓM%öXþ Gliù=é 㯠õm¿Å‘ý2#p<çw¾ðÇ€O'° ˜ž£Bª1ý†%„ÌT\ò“졉”0…òZQ‘´p¢[wý”úqˆE¨6ö³vè\7ß(ÌXU]$ã*Îjq„±œE5ÇRXÂ`Q%BÈ%}Í`À¦âjGîvq>ß,ûñ»ݺ?®]¨r¥>y¼ÝnÆPmYŸ‰}«õÿ¹m‘m²Ûpý;180< úžójÆñ ŠÅ‡¿)8Ejž;wªòssYîˆ+®éY=( Iq0˜…Ô°_Ñ[új0·Ãâëf‡ì—½Àİr×jm®8Èn×f{$­·_›rÇ®ô3vÏRSî²Dw &M™É­ÕWEД)µÇ±1ãÕ1Œl“÷îñÐhäµ ŠnÜM›@"LŽè¬·8:¶:“tFÜWZômƒ6‘ØH›ÀPú¤#}·KïBc¦OÃ+‚AaÆJ§_ÁðçG„$G3®ÁâýþÚ\ƒ5¡Å»·©ŠÕ%b»Ý¼ÕYcÛ=Æ…ØôßtËLÈæ ô-á7Íõ öƒòh/ežæÜ˜~oo7†d]m³³!]Ç(;IØQîôÓ–çR {éHW#ÏE›5òx2úÑ(ía“l®£Y/Ù ¬{qõ.kÁËÆñø÷Œâ{NšÛÁpú•ö1av ã5ÑôHM¬Vr'˜wÁ•ZBŽ‚Åód,þwB’:wûxr/æÂô ,0!wg•õïì_ _YTb5®wW»ÿm»b÷o½jÝ÷Vê¾ûJ÷mØ'˜îç÷NǸí)j´í2 8² Î-6Ø'Œ³:Ÿ²L½3qÍOq·¥eÀârUyva($X¶­5U? +Þs ¿RÛ,ÎR©²TYd¿<ú$\ÍÇ%ÁV2'§KÙuéŒ>õlaÌ­§QQZº3‰¤®Ç„Ë¥a£õqÕGG{§\«ËT9Õåâò’ü¢=dÝ(‰ ~`µzWŽ•m{+Ã͇Æ–"å…ÃàÞ˜Û²‚9뫞I3’³™W¥£7&mÚ8z©énƒÒìÜÒfª3˜;f×;ú=c»uÏØñà;‡u—ØÙ Ú³ƒhýmj" ýwJ #\ŽÂ_ º°÷DyeÊBªTUBNLŽ\ƒÈÝ…••QÅÂCbC6Šß_ùÁBéq«Ý´œ–៨ðØÌ„E¥ªL”Èy ÑqIçŠÿŒò˜`ºùÝÏÉú.vóšzCïæ0Üc÷»pït˜~M0‹(¿­Ì@H)ÌNË”§¤¥'¥ˆVyÏóY—š”ÌæºÓ‘B™Fž'^ÇåŠÄô´´DabpR J"7KËí-¿~JŸíë%•J‘01%g›)™[|WyWj’ÿ>‹bý$6¥=ÑÔú ›‚©á?˜CS뇛 trá÷_´H[é™Q&ݲ(Æ@(}p`e:Á[0ÝHR"5ôðÓ%C/ +Q>dÈÿugÀë endstream endobj 131 0 obj 21387 endobj 31 0 obj <> endobj 30 0 obj <>stream xœÕ}\Iûÿ†°{kWâjÀ3ÁÞ{ïÁŠ‚Št)¡÷„ÞDP±"D銊 Ø{¯¨g;Ûõôn6Nî}ÿ³ (zzí÷?ç…Í–Ù™§~Ÿgž™ðu>ÁãñºèI\|$2G«!3Ý]lõ­]=½%Ü•ál7û­ÛtЩwOß-$» R~nÇŠÚÝ ",Nã[úd§o©%¾%+:¦jø±x^.oï ªj­Ô5-µ>jCÔF«MR›¡¦«¶PÍPÍDÍVÍC-@mµZœÚ&µdµ µ<µµ}jUjµjçÕ®ªÕ©=P{ªö“TûߊßÏð¿å÷äåOäOçëò ùÆ|;¾”ïÏ坿Çñ7òÓø9ü|þn~%¿–’ÿ€ÿÿ-ÿ¿ê”z;õÎêÝÔ{¨÷S¡>N}–ºžú"uu{uWu™z€z˜z¼z’zŽzAÿeF <ËÝÃßËÑÞA¦=b„ ÚÖþÚõW´gK¤ŽönÚ}ñÄÅÝÃUâ&ªm(‘hË$ÚvŽ.íYú‹ç.ÒÕh™¶®ÄMâe墽ØÔF{£ÄM* mçî¥í¢ú¢mãîfë(stw“Õž!Õ¶Ò–zHlñC?‰wa°¶‡ÄËÕQ*ÅÇÚŽRm{/+7™ÄV[æ®íèfãâm˽Ÿ·sw“i{x¹ãë®ø nj±»T&µñrôiã7.ž=GÕG™ƒ•Œ{¯Ô_Öv·ÃwÚºÛxs£yMfåè&Õ–IüdÜ{¬%Ú¶ŽR+ü^Ü”‡—£² ÞRG7ûÆ·Öö’Ø[yÙºH¤Êv9ª4ŽO»É¨­<<\ü•Ϻ+ïzÿ~G™Tâb7t‘£«µ·TÛÐ ?¶@›“Ií¹2+üt³ œús¼Óñörçú*ñô¶r‘z»ºZqµ÷’XÉ$^Ê“³%.2++/戭£›»LyÞÅ=@âf™k‹uÆe†µnÔ^ù¹ÀÆÊËÝÍÄÊÆ[&Yænïî&qžkë.³²Á—-°qÇ/Q›¼?«Û䬡òAC‰­£‹‹••²É¹®V6¸Íª?ÒúkÊ;çª^± 3ÄÞ°I;:ÊnÌP]¥¼Õ@yj‘òXçýËmê¯5>ºHyßRå§Žê³T6¹ii“cÕ­ªwÍora¶ò‚¾ƒ·– oW+oÙ²¦_fã¶­dºÊAê«Þ´@E8Õç&mI”mÙ*?U—%ïa«lÈEù¬DuÑEy§}“\š¶¦êl“3Žª3Vª§­Tß¼U” K•Ÿï_ê¦:Û¤ oŽ nÊ»5=ÝtÌ^ʧ¼U¯‘)ïõR~º7½KÖäq¯&Çîªç‚ؼ`†¿›ÍŠ…3ÜmÍò˜èÏö´[¬ãe¿dŽÔÁ@Wæh¨çí´t®ó²y¾.VËçû¹ZM3Ðtì m³qƒ{˜ÒÓbÂÐ^–‡õ^9ixŸÀÉ#úMÙ/xê¨þ!ÓFÈx~¢¢0óÅɃEY?œ®,Î~}¦ª4ç×s‡wç²çköì_¨-Ë{wñȾèÁÑý»+Ïvü@A !z&„>1›˜@ %z¦ÄbB‡˜H #zKˆ9Ä$b8ч0 t‰D_ÂÐ#Fýˆ¥Ä\bÑŸXFÌ#FˆåÄ|b 10"c‰AÄ b!1“G &Œ‰EÄ,b<уèB´!&]‰¶˜B‰v„1•Ð$Ú|b¡Et Ô‰éD7¢#A3ˆo‰NE˜Ý ✂&,1Ñ™hEXÚC´&VñDáK¸VÄZbáG¸ÖÄ:"’ð'Üb=Eî„-‘@¬& BBl ¢‰ “°#6kˆ`‹°'61D!%ˆÍD,JÈGa„7áDÄá„áLì"ʈ,"¸Oì NyÄ¢ˆØJ<$ng‰£Ä>"ŸÈ!2‰:â¨ïÂ~ãúí÷¤ìߺÿªƒÌ`:`뀲ãnø|Ú ÝA¿n=xè`›ÁɃO ¡‡ôrlhŸ¡×‡þ6L2¼ÍðGt¡3bˈ½#é‘Å£rF·=|tÀ˜…cv==®ï¸eãvŒ{0~ÁøL(ðóÄÀ‰‡'žtxòÈÉÛ&£)K¦ ©k§žœ6wÚÁ郧ÏX<£læø™7gÍœ5kÏì(5C‹:pÎQݹºt_ëÍÓóŸ»h^ûy+ç=˜ÇÎ7ž¿eAî cM^©?TßG_¾xÎbïÅw–´Y2lÉ^¾Á(Cƒ*CÆò¥!K —þ²l²›ËÖ®˜ºÂ~Å~ã@“Q&RhZfF™y˜=6Ï6h1Ê¢Ä2ØòèJþJƒ•¬zcþ«µµu¥Èf§­À6HÒK’+¹f7Ön½}/û ûÓf—XÇÇãN>N…Î&ÎÁÎç\R]W»¾sïvÛ]Û=Òc’ÇAÏ~ži^”—‘×>é`i¤ô¿2©ìš·ÜÕž…vbï¤ñXFîÊ ö»+ÉFS¹°‰^Síåv `'¸- Å·åÁ~ÌvÔ„C¨rWÍ ƒðøëˆÏn´„‚Ca1Ùž­Fî/§ñc l ƒŒÝíÙî$JÝP”Ä‘–ösBWƒø0‘ ñ×lŽMšûÁî„[ö¥ddŸ…ïäB®‹iì¨î–¦Áކ» Jவo%$ԦΣ¤àâÝ”êCç»Ìñ0 ‰ Žöë¡sÜÅ›ð?ëRã·ƒíšuKœ±Ìcþ2‘`øö»\ßdP¾‚ê<{ñÙïáfmVÜ&°ì Øã²KRjž¢†€ÎF ëX¡V`00Þn’ïPl]ë{ @ütc/Ô¢‘å2ÛÉc õÝ /V'Ï:(Þq¼$§€ìÐDŸAñ¡q¶t{ù0&×Á„ˆfirÍ¢Ð|6†‘hû ÿ Ó > gQp ŒÿÅ“P“ÿZýsQ]`û_$Tü—„=)8Œ£½;…6(Žú²GIäªbwIÈþw¾‹ãfÛüÿØIƒ €ý{Ã]¯îvw¨—àbÖ‘šÊƒù—ÀqPë[ºb-xv£ªìÌE-°;h·g®C±qÊ @£[Ô#´)‚H8ž:•ë·Ò+Ì#ÀOìíåihÁ+€Î3{àΡNåy›yE¸ûˆ1( 5t{v €$<I{óL1’"’„ñzˆÎs‡ìR* ’$Ê¥à}x³6a LåX3‚=Àô#,O6]àÒŒ¡QûûS ÷Þ9)ª8ÿ< aÇq7Pw‘7RgNî6Ÿm¼\j%v14wÁÔ·-¿ 7Þ~/nlŽNS1~@,&*rjSKÑVYU¶.М&˜M7™í6L ‘Æ… oÎWgWÙ±LM¡¥Ò˜ˆ±Ë˯ÀvסÚ=q#‡=a&ï°–$šD!ta¼ÀÂ> Ë%(“„UJÅÝ+?Ê)]O ñ[ÑRv+Ù €ùl\ªH#aîìÌ®‡q§ðå;Yf편-` xÏûhê ½¼ïDÑìQ–¨@ F¿§ÁyP뜶_„zQnÃf ô@ãš·ws•_W\;UTªA™_ºc¢ï:?€¥”…È- ÎÄäy9ÀúbÁ³œ®iShÌﱜF€Eéú{Ý/M83a4‡½ºz†®‹ÍÅ/ÃÔ±˜ƒ˜:c–;”_€× Úq½ºu[׳6Š#þ%èÃl-OØ JÁ€ ÷bûò%Y3Á0ÉÅÌd¾ž9Öº~4êø`–áv¯Î@~­‰(_‰¥—)  $%µ›ÀƵ;Ä0âƒ<¨Mù·'¦dåïIÝŠ@^@¢û† ø0àL×9)ìÄ“{b‚+Ê)Ô‰d[Q 7…TyX®´wŠVëÆJ±ê¤6!7;“œ-’û3¨#èk:¡ÿ”afH oh4 òÎ(ý@tëI9l`kêiÿŠæ‹üPgæå‰¹Hm²Ç¨•úbcSÝwÁÈ»µãÑþ“⪠çŠo`-Qjª²l~×Í.°‹ øn÷ÕW—*ƒ”mΚrÍ¡R*CñŠy…{ »QOË-‡Oöìí¸X¼rº‰ûhð!•¾ 30`’ï ˼9@s<˜d¹lºñlסœ"u¸4ñ× GóŽ—‹ôQÇ]8FK¢¢ÞLM‘%æâtĽ̡ü"ìtCÉEø›âÑÏ~xÃc§°9ÌxjkuB^rR6ÐÜ ÖÇæ®Éx+´ŠˆóÀr+ß¡Áó„Ó(ß¡äMj¨Bkþ«GÞ¥”ª#1Sݹ!§â!ÃB˜È@}ê68–U}´æhÑ}p–UXï²ßa½EÛ¡“õŠ1ºË2ÌèN¡TM±³™[˜mXêà¸(íl£ÑãÁJxž¯©•3ã¬Û^ÅêìzO·WõULµg5ñà´ ûAz3sî!Óï¦*»Û-lŽÝ¾f'ì)\·Dƒù`¾•ÙLZ ù+©¤þ÷oUFÀ¾Ca¯®‚gln˼Ç)ë‹æ40]²|î’ÙvH ¤‘ÚµI¯NíI=~F83xÞb‹™@SðÊÄ.#O‡ÍAo*&46 ¬’I™o±ÿþU§œ ïJ.ì Û°µBÁ3´³7s¤Øtj?­×H#ç}a‡ë¼+nAŠå3aîß=e v ¡.Rƒ<ìƒ:ö7ë7^4m„Rªi•T«AËÇ·ž]œøì‰ìá:fÈÄS3½B#fÿEX†oç>àdøÒé",ÿœœ‹øœ™/+6¬h`Á~ŽWTx⪒ð?*šozÏÒFo¬q€Ý`mØ£ÜVY·»å-ô÷Ój‘Æd=ÉJÑJ‰»0†e¶Ün{ ¯Nû&FÈ´œWÊ9¸lLòoÚ›I£îÔš Ø(,òÌö{í–U„Ÿ4œ ‰»°ó ÛÝã³Åƒv¬HÞ Ò4ó‹Ò«E‚“µ¾ÎQ±Ñ1â÷¸ƒsìp8½8k­ì²v¤Ü©>|hVäx˜p ÃçcÐq{IõèÙ†î –‹ŽÁ,R…¥20a 8‡<C­`}Î)?ÃdÚËÀéÔÑþv¡kB"ìÅ‚W~s"í<µ@h|x‚ GQ ¹!›WoIš !nsüfì°3a‡õEÙZ Ô3×(¥:''%+›<Þ½'ûô|2p·G®s¾MÒ@+Ú½§õ#v$ö×$œL™Q©AI!€puñ÷õts 5æÔˆ8wÕ³Áç³ß2He9áD*Ä:ØËÃÓÂb±n}À¬¿\ÎyR\+>xíBé}ðµÚ8†"*. ;©4Ô@¼hê€xƃ'ˆ¦ 7E¥¨aC…øpö³sù·¯‰"GßSØÆÈÒØùÏðKûñÙ‘ØÊL¡vÁ>œwvA}È9œ=¹Hé ûk‚c‚AˆæÒ=.W ²ÖnÜ!Jû)8fVMYÐæäõñ[×¥ˆOÁ ònræäN¯×;³zÅæü>÷]9(mÎ0Õk VÞþ3±$FÀˆ€}» ®Ê­ØuLÂŽø$FCbè4jà4©±ÈÀÄa:˜ ÆWYÂ6ÒŸ|±>>ñÏó5ÓÒÓ³ì5ܨàèú¸Mq›D¨/µÆ76ƒåiæÅN-/úü°³xVtìüފܫูôpŸ4ÄË ®IõØVªuæÈž'÷+Ü–­Žˆ©„ç æHÇkð;F}ÇñS…]QKP‰Ê¨c0§E ¤.ÁïêA;‹C<ùliø [ÂT]˜hd4h{æT&a’eŠ/Á:îÒ$EÛh¿à¯9é˜Ñ£k5¹gjDAº$&%rƒêrÎpóš/d¾’²?G:‡ºÍ`½VŠøÂ¤è­±©RàHÉö‡´J±8v°[ØW tPYƒ;ª†¼(Ä(^)Ç6%¢Roš¨¬n`MþÒÖpCéO¡ ±++æ¯aÞ*oáž…¿©:Ù ¶¥Pç©Ûh‡f hM¢Q’";²f½â5˜/ï‡í©ˆðal3hN±È¯NŽOZ»Mü–àHÜWáéí¼5ýà 8èÑÝœƒ'EGËól¿‡o*ÚûÖØP®#ß(ŠÃ–:¸.š¶ù›ã¶¬Mo»Éµ4kµwŒ7ðÑxy1luîÒöûD•ùEÇ·ÝÀÜ*bT™ý½ LáÆÜ‡Bãí±?C½¿A£íW³í¹“%œd÷¦àD¶ãzEGò=ᚢ‰ÉåàØTØKöì*¸Èf¥0A)Q‰ [™ ñOÃj,Óë¶Ç'oÕyþE²Tç“­: ÜQv¥Rjw¥ô¡ŒWŸ`oßp±o³Â—DMWÙ»x/—8-ú@²]’'Íö) ߎÊÌ58|XVGjðø¨õa4"QèÊøO05×´©WJAEIÁÙ-âªÛÖnŽß·.NsKüÚ¸­šT½»°}U€ò,ØÜás<È÷(æÂæIœÎs1 e‡Âßá.ìB¿¡«àU²%éb‡Á\†ÃTMÆýBãVÀqÜ!öŽ©(årv€“£ÉÜaûwíÞÇ©rCØŸ‹Sg5áM§^J.ßw¬[i¶Ì!46<&L<ý\1ùJyÙi Y’îk´&X< =«÷& yØì`obT1Bw™—ÁRQp•iþB0˜y-žG †§Ü!›G6ì<¹;5qW[k3–ïó:Q;Æ$pçæÜí¡»Ük™…¸n%kQ9‡ÜgbÁÅ5rït]‰ùÞÍ®Uܺ@9Gh¬,ÞŠòµl9‰FRH¦Ø·–ÝÇ=Ľ©ÃÙÃë‡ÉöïlP÷{eiîMºÇ¦ÝÓ/aç—lѳ®‚~òv=ã±Ø·Ê#Õ+e:g’á\Çé@ŸžtÄðNmmöÁJ‘à;óäé‘nwÁƒªË]Þy|ÎzŸ°¨™sÀ^Ô ñXu…ÚöÑÖGb€º€±…O\˜÷Äjú¸‘tcWèmá×¥a 0„œƒ:½}¿/ùåÔñ#Øv9·à²ûñ{-ÒÁ °ÐSg¥¡Å’Å6V€–&¥'ÅoH)Ãoa)è‡B2»crÜ °öZ"1^¹ÄÈÉÐ6ù¯a¨õ`µ*ÌiÓ¡ú[lÞìý1#äŒÜ˜Q(ÔW!&¡•QX’ºÐÇò–ôÕŸ6q¹Cöîõqã6‰qpí‹=XÝ¿nlûêÑþºc¢½G³®‚‹4TÓ»ˆxf’P3Q ìOÂJ±Ê±xDzeÌè!•+>¯r~ŸÙsHE^B­ì³!MÎÂ7Ý·Øn¶ÙK¹ëKkà F4…Œÿ3†„ÑTúK‘Š™ Iª~ ›°$õQ†]0LǃPgË Ä6õô‹9Ç©=fYy¢å£ÍЀÚÓ¨õ­i°Ýƒº=—«ENì¸.Óoœîidæ/1¥œŠß˜¿ãRÉΣà ÈôßdN£žhSYà°b¨þÔ™+Júæ5LÀ;áiw´å±Ï`9ƒæS»á\µ¡lþ3òBmI8›GÂ6øþ3Ÿsøa*_ù݃¼NÍ”{¨<{’‹ù&qäQ¹—_)d„@C'¡Õ4޲«¡á-ØöƒãN)*Þ¸‘æ &ìË{û2.¨/ù€ ѵ·]j(„jÛNM…jy°»‹„ð]ì¹ç™,"ÏS¿ÁSädÅãžVz±²{!3S¿Cbêûô㨆b­Aï©øê«,²þ†Uu,ìÒUð‚ e»0…i©‰ÛRJK2*ÁAúÉÄÓ¨êƒÚõBVnw­°{yú{ºÒ‚·v–Þ‹—j!Þ½9PóÞ¼êQõ¡‚ëà8!+^TB ^ ÅQwm‰ÛÊù+tV8î,?]]y^,xkˆŠ˜Ú"çc N^fSXñÝÉs·¸ÚÀn<öø‚AÙ”êFÂlÜ]7Ö nåÁ8QQØ$"†<‚ CÂØå£“˜³ìM˜ÉLd§¨…6*¦PÂÁsõ1TMÖŸ4§=˜¢1˜-2nôo¯À ÌšÀØHN»ºà7¨ö¸æÍ ÑÉ_÷Á¶£aÇ)wP[„Æ#‹•."Îê½9R”|ðˆ8Ì4Ì)Ô]º|¥+Fµ‚·fÎùkÁº¸õb85ÄQ“½ÁÀùS&‰ÏL\ «_«Ã¨â?ŒÁЄ‹l5œþ~Ƀ"gæ;¸’|MG+É·wŒEëPêLþÊަ®Àdj6šAönrŒZSÞýÈŸ©…h09“€›ÊV°•8ʜƿV^áò¦}.òØŠiŒâG*hÉþH©úq]«hÖ5ÈgSšÉÛ®`lr ýþ» –Iø»ÜE©°û2¬Ì#a¯éYËùìjf]FÜVìê«ü÷;ïðÈtÜj¸~kP— [f´Ú!\â«9ÅÆd ˜†×@¾»9r Ò-7ùì8¤6€ q©4êBEyÅ0ðŒ>¤Ce=…¨Œ·Gö'îN×¼±÷ð#ðð)“ä¹§;n[š²š ‹‹£2<%8²‰ˆñ£Ñ˜ÙŒõ6ŸlP S‹v¤&mN\—³GÔ±è6³;03¸†vÖóƒ8Ýd1þ°–ud8Ü8‘ÚT•Ÿwlóæ‘‘ó ‚GËOØ”Z½?¯Éulëæ|ÆbÈn®OR)ó'ä "Á°yKQk«a4ô¥Q‡+Ó`kH?=ÛÔŠö>)…3Á+v˜yK¢Rg*v:­X(CZƒÅîýmÚܵàЕЫ ZœUš—Z„£¬wí|‚“Šä>8ÿ8ûe÷ÑU0M¾†³YØ6ܠ؃Ø0+¼Wa$ˆˆváØú··ð›{óOŽû `öæ»I–›˜.³vÎ+©®¬¬ .°ãÐÖ¯x»dö³ÜýgØN¶á€  VíiÔd°ÔØo„²®²òô±t(Mù[K&R…iÁÒ¨˜5AblIÁý5!±!!Zú»­‰nRé?“”Wð¦m›ãצˆ÷B# Ö&ÇoÛ¬rCÒ}6…&¬Š÷Zwuc~Þ¶+eÐH¸¹bóæ@—PJ'À“·fÝEšë‰Ú±ËѼ°+*‡|ø ’*ã΃/Ø`¦—"XÉ ’“C)›qV¢öÀw¨P‰åi6˜“ÝÓ°1¡a'>û†mÅ„¹:ºLÀ̯Éß™‘‘_’~”Ó—V Gm{ÕvI±)^!2–ÉB]¼ç˜ÙÍÓi¤~Mv¼¹/åÜSQ‰> GSCàèãÕn¹ª©hµŒùMškáì4Mlö>–W¹C ;B=Æ¥GìÛé’ÜœÒüÔ@/kw{#Q{X tÜ0…'QÈ»á:nÔ‡a[î?ž\Î(ü•ÞŽõ§S\{ùG<ß=ë¶ÖñØ8XƯ ’o’à“j²Wè›"Ýè &妞é[TbÕ¶äR¶E¦´¦ûg®*u öPæ UN¼/ë;òp,„¥h$4g’ÎmÚraïñâ’i¹»v§5à°ìÍ.‡¼eÉóÁ80Ûu¹íJo¿q4ü–JyTyè «KíWøFù„ù‰ƒ<#" m‡Ìµ5ŒœFC¥Íí*Pê ƒ€f†2Œ&Pè­bŽjMÂRÊ๎ ¯Rh ¤´€‚ñð(YO/¸ì6±£gk.×~…¸D¦üäõf)Æý¨ Ô/i& Ð §¡oíç;›Ní…ÝÆV„]AZÄà¾`ÉËÂ0MÒÆí6KqçvÁ¾\ ؘ2 MÓ¸°S¸ä\9œ{„©0ºæñ ÀŽàת»?ÜzZ Ž…UÉ* ñ£Ðª¼ïRp³ÖxVîn¨èi2~àÔa¦\F•‹—eZ"~a™9ɾd‹™uÞqþÀLôm±ÈXg¾Ã4° Xnw+¤]0Ñ1™ ÜÚñxÿÉJåÁ°Ïo§7 9CÆí¸©5Î,P “vJ]ý>V×ÇÎMzÈ©ë]>y‰ƒxWà#} ûJuw$j;Ò µÂjÝ_°t eu™ÒЭ^8BÃV¤~¢ôœå©y9 Ak¥kS çR~cFEêJLt4uµ±¸LÚ?û‚ç¶È”è¬hï^ÂsTúkØ*á‡;Ű½&Ò¢¤‹=ݬÃéyëûmÁ¹ \ɺS\™œžž”ƒÃûwA˜=SùˆV&å07FËõ¸Œò!UFù*£|[•Cr¦Â°Íˆ;`g³}n·!`¬õ̉ㆢX"0Ìx¡ {œßŸqâˆH`º˜dCTó?Q‚8$®fl$>Ë=|ùé_/¥Ý(<%®xp¦ü¦~wêŠ÷Ô‡Åͨ`Ûf̨†·?AK¿ù‘¡rZå:ìÔë†à¾|Ðg³”hÓtåÌ 6Ÿy ÉIÙݾjî…³„ãàθa{øì5£ÂéP«« €5eqÅÔšäèm…a»c7€$úhuÕÉS»\®a±á"Ø•Z›—RhHëœ@Zu½LD¦. €!ðXï—¾ˆÖ§B—’)l{\hб1 ¯°2=oC È™Ñåa´ 2´2mMn·J°wë™,‡¾Nö H×zbôg»É<øwsÁÑóÝ ÚͲ#à2Æœ 1‰4l‡ÁƒÉuûOC‡ ¼ƒሇXD¹¥† ˜DÂjkÏ,K=ÌÜ$~‹=£Êüö™êìÊQ^IêIp˜¾f\>A¢Ëeº¯œf1o™ƒlǾ›ågj¸ˆ‡ý¾ª®Š*Tòámy³d™‘õN×½Çj-sÝi%7fR“Bü½¼¤¾ÁIÛ³s2sÅXd•CN3tΟûÚÀùÞø¦i.Ê—4ÏÑ¡õ“lØþ VÃI¾i<¶¿Ü’QÜú]JÞ§Ø[r)‰Qgó©Xö;.¼€ƒ_‰…—   l‹%ÅmIÈÃÿPï§gºÙ—fÍ‹¾¿¹‹sѶ©`Ðñ±°qr p YÐb&ÐG™ 4PeeË%Îú`!=ñ˜éOk²¯_í˜Öþ€mä]¨þVøá²:/7ÏþÅmˆ_4·¬]·5fé³ r¡Òo(Ão«Ùå´„cò¨âÁùphÝY›·®Mš9ÛC|¥®¾wÙ†L3±ëŠ#Þù‘å@óû{ÏKÓm‚Bc¢Åe§0U‚|ÒünAí[p÷©qªjÖéÕAaÝ™:ا®« Š÷”û0ŠÛ¿òÅÖÉ©Ç 5f¨^µñ¥Þ~Á¨r–8` S”#uZimcéà™µ³¼¬l¿ú+F`}Èh|óaîæÏ”7Na ëovl¸™en1_t#gllÞðäêð £8Cy÷"Ù3õžvô‰Ã'xìeø–Óf˜ßr`é£ cá’;Õ½åÒü¡ËöåŒ&êK…(%HO•'×ãÒȉ'¸9È-‡¹cÕ4 —vÿ`…s §å1 Ò ú ~ä% þ û5~ãfEWÂŽkôUNHÃÓð)<7"T×z–…½‹·½Ì6x°¤U‹ï.ï xÐV¶Î+D‚ÇV²ÔbΤˆQW*Ò3&ãóÑ–BâÑ•]Ç+EE{Òƒ ,h—SîÁíé‰9´àtv^ÒÞƒZà O‘éN¤~Ih¼Ë'¤ÓEù¹ûD‚K{2|$Ñ 26RŒV¢*Æ-%<d€Âí¹¥iP0M(¨-òÙ,ÕNþÞfÞtc¦cÄ+°Ö®žFìVÌì‘ó¹ ^ƒï÷Ÿ¸]q²à5¸Š¢òCóžÜ:–ña™í¢Œ™Ý¸j&ýɦ œû±ÀaƒS’ëÐ)ÂB’5d[3q‘`5X$–ö®³Œ¬Gà’Mû×0±[Àz° ”'É,ÛuäÀ®jPvnwãø fc ö#§Q½.ú‘œB]ÆúÇI€{ƒräÔî‚ó^ò`&,bzr騷JÔÒï'èüïÞKèô’ÏÆ°ÙŒ×v»­ÀX„:ú-º)¯{j²£•ÏR`¬ ¼×úo”™*¬™óüVºÿþR Y2fŸ.¼wAÿFñ´pH¤®Ù™ùäºpÙE9¢LU±ƒñ,ƒ%³W8U]=rô 7¹ÐÜÉ[q¾¨ª™/ªJÂ&¿¹/R– dé€é`†‡¹…c¹^îdЧ‘ª£iÔáÞ4¨uçfîâ–çÜ®áh«ÁÇœ¥-‰¸¤*cmPëæÞÅ€s}W‹Mí¢9Sû.Zi÷r9ÒŠ1oP¿üxr y‹š9€ *ï}•'ŸÎùóZj0ð4^f°Èy˜ œž÷rõ@……ð' êÉ‘§(¤÷û#²þÛ~ÜjDK©ÕZê’2‹ eirã6v<ì…Úpõ%÷!‚¯™dêz©Ó“渚ݠ¿E}³ 5á1lû8¶B¦h — ªÅ åÅð ;9 Ornz²¢U¿E¾C^ž4DÉMJ÷A ¨ÕÒž+m¼Åùìùj&`¥ƒ÷ @›y¤‹7Z}³Ú?6„Ò ÷Y¾}áäÝ$‘²Ê´Åî7¹/?ÿvþÄÈÚ˽½¯ÜºÝ»}…ê~zÆÎ®ãË…ì,&>%n#ØHß\thè4=§E¦¢•Ë<&€éô€‹~‚Ôƒ3owˆ†Qþ†6®€^êRpòà¶ÚìRqÞÞ’ô€®Î”.K!±±(IÑ*4 ;ÊÎp6&WvË«à,Ôc4qà,jÿÒõ@Fhš‡V íÞo`¸.€óà qó‚·Ë°-Ž¿¦êMÐÆÊ‹?оÛã›öìêÛ[°êŠx™g³^v(`ëÌ$R5±ÁÀ‘¶qr²±óÛ¶+¬‹ß(N­ Œ]…9¤{Ðöä]¿øs~p¦Ûv‘à—Š¼¬ÒZÇÍ 'ö_nÑÇWôÚzd{*–øÜíR G÷屫A\´˜½ç6 Y.)0æ7M ¹¢ÄÀY$ÔáBžçTê3ò”®b_µáD²ynu¼B“¬£œÑ ÷Çï‹aî`Z®œüâ_ªˆh§~>! D /~†‹Ó‚Óð {Ã/ü!û+SêQ$ɲ–¤û&8 çj±b±ž¤€qí½éPüæAÙíc¢Ãw<OìlruùáY™på¾^QëVÇÇÄk î˜çÆÄ9&ë K¥ Ñ9þ£¬…e+IÈ M& äF¤gúo–Œ¤g÷"•nJöy§†çrP•Xµ7ï𾇸²Ñ†b+Jª4Öƒœl±äê?UróÏÖƒ´C؀ϱá›È.fÐÄô…LŸ±¯Pg4 u>7ƒ_!æõwø4Á¹Øzt~ÔTX{$Ðv~7¹)’n¾>BùЫ¯Y$! §±šAó;p—gê̶e”)†²GS¹9Æ“pßß´¦b4&j# l\`qWå{UË,2?^fQû5Ë,zn¿K :Ã\¸ò#/NÿïÜ’/£û«êª4@¥ 쵪3M%¨5D‹’z4ìŸÕcÄŸ–Õ‰D›ü…Y¥†’4N²ŒÍÕ_­Kh+:@›¦"÷©B;˜‡e½QNþÂR ˆ…¼IKØ«Âmw Q÷{•:øÓËI?¬|õK]WÁ/dá9æ Uœ&ŠY ¼%"W»iˆ¸¨u!ôkj}zDš°I3.‘ÄOl½¼6=E d„%¹'ÒyØ™¼‚Š3ZÇvΡjˆbùU70™ _S{’#¤~‘Òˆ0qX” k1zÆ~Øÿ?ì_ï‡ì‡ç4óÃó±6FÚ}T~x¾Ê« ïg5©ÁR®žx[ŸÑ3ÿnÃê‰ÅÍWOtÒ½Ó³qõDu‘ÅåÚÕê‰Nõ«'BÎcJ)P.Œé*¸ùw.hχW›§Gì׸çÔC>,“1qTeôÕÌòª҂ʌK_ºªqÖàƒåUË,Q.¯fëÕº¦†o*Ž4-ÌVæïè÷ù;é†,3±«Ñï‚Èý@óI}þ.04&:Hü÷Öm¢VX;š†Ë-+ÇuN7>Žüþ‚’ìàt¤…XòVpêœæî“Ïv“ÏdÆëêŽaÎÝûÎß¿§{aœ8nsp©±­±™MYEåž=•âF_ÁaìËþ¼Ãh£MÐüaÎ?µn ÚbÙlâ°š,&jЈ(N#~ü—V :¢Aì¤æ0àï”Àœ~, õ¢xYÅÍÉwï†CÍóÊŸ‹_T «Ž}¹ 7öåkâü7r¾\}›}D¼g·¥ÀÊJ:óå…*_ž•Áùrú_ž¾e7‹ `èÈÕ:´fW|²ÎÏå€OËÕù™#GFᇯµ!Y¿Zä²8‰k)±ó·Ž RX暺c•È]VBö¿ }Ððó2„‡àR‡^'{ˆ[¸5>gf¢çäg—¬ÍE'ÉiÊdƒo8ƒJÁÕLÌñù-®aÃåaU üWÊên–÷9sµ–ÔÁ¢+Ž>P‡a% Ød•pp²SÔK‘•-§„™©õ€:1²ÜK¸%*m5v¦‚oÏ€cå%7éÿS1žÍIq ŽóË×ÏÂøp)~ReÒª¿tM­@;ãݰ¬YÇ?°fÚ-Y³æÒZž<¨ìú•2ÛáÛó £,¿YÍS2¯þTJæä¦dE»!AðO ÐðègK+e¶¡ÿ²×7d}Î:rËZÛª–µ¾Ä‚ÉÙÇMP[µ°õhVÍÑš£…ͶÎÅÖn•Û6]€rng*¸õ­CÖ·ûˆ½Ö·6(•+qrY'LJpy²@{¼ÑëàÈà&4iXZ ù¬¦Œ³ãà·oÊà$ºÙzó_ïæ'qûaøšèØH@‡¬Ú˜¼eíöuéâ{¬—ò›…ž„,0²ÑšfnY¥›ð¥Tñeø€»„ÆþÇåj0Çs5Y¿ÀrF§ªÑŒ£Ð6SÆÖÎÞÖ=Ý'owIqÉNŸt7ñøŸ´“à“;ö4œl˜T?¯Ì6}8³.ÐÖÿpÞöƒ@ð/Oדm&LÿêR{ 9o4õM“çÊÜÝ×&Ï{Ë7ãÏbx‘½Ä,D{ÉçÔ÷ìr%56öšB ßgžÏ+y÷7dž§5ŽOÕgÀ¨fó¿ÿÛ ÿ .–Ÿ&üWÅ'ƒ“ž¡ËŸÜt€‡å§q4ªÉÞ§eH®{6›ùþk¦Fþ¾uÀpÑ%-KÞžOÍŽÿ/K 7'€-Aƒ$žàpè{×|öŸuÍp<ý7Ø?-Ä0‚â)ÂI3PFYòÐgüÏ5ýP_ÿ½ÃßÝÓ?vΣ¬kY¾ëÕA•uûاWþAq½r\UMÆ4U‘ÚUäØ?¥"Çÿ´—ï²ÁMûtüƒiŸþ-Mû¼×«ãJÌÿï Þ]8Æþ<ÐoÌÃýq¼*оñùÔܧ·` å;[¨ê‚e¨¨q7Š!gÐÈÏìFácÞ°űuìFa”föçv£øÚ-•Ð|¸°¥ê´ÿ7~Ù×´ØÓ¯ÜÊ Ñpþ§FÜö¼pávÊ]x'àeÆV—¼JÅén4I³Ø9ïšù-°nx˜» ޶r ·ÆÚi_ù”†s©Ò Ü^oë2Ö¥nÌ¥a$µ_Gí}r´ò4ØŠü™\…Œpa}Òl€zÔ©ÿ 46¥ð+ÎP«ÜcÂV»q\òîuÿ¢nÏo‡Lqã*A¨Žñs˜1]ðbÁPƒ„9T6—H°¡žá?ØÑpßfR՟$JW%ÕÍ©¡øÒR~kÏcK¶4ÇN—1 )”¥ !© ÉSÌbiíEg™!ð,ô…gŸ£³øþÝò‘ïú0èàïyHÕFãfnqzsvSDÁ_ßÍþpöëÔ- pðk³`mád¶ÃÔ|5ÙjKùÓúí¶~õv[¿f»­‡ŸÚnK „³á¥/é8'jaPÝWYäØò¶›‚éÐ}ÅH‘:yžŠ²p°·\n.¼‘pþüæ[é?¿ÚüN€÷›%LQpý~ÂêòK>{Mg|"¥Ñž€–ø'íÌØœ•±Sœ±s[òñ·ŽÊøQ915ú²é…V?Ì„Cò3×n®Yùy¹¸:GÚôû㬌µ ;E “Y?1™g½Ø|‚M‡ê'”Zª!Xù)º…mDú_@6Õ[¿Œvm4ƒá¦þ:•ëKIãYª•i~ÿÖY‚0…pɧGùÅ»Xýû¸á ;ƒAªoCú¥1‘Xß×=±£¨ïí øRƼ‰»–qòàɃ{€{­smãp€k\$xþ¾}16{_2ºß>?º…;–¶/트ºtœ0«YîÑέŕD¶AÁÊJ„÷x¦Þ&5b÷£-b÷Óÿv?û§±ûpH³ÑlÇêõ÷iÝÇeC ï4”£„9Îå=­ûúig)ü¹I±²²0…}£‚ŒëîkÀŒ°Ì›ßÞ…‚ÞãF„»QŒ-o~[Ç®ÂNbéî'dù!YQ™`ÙØÄäý‚³£Þ»š‰IH}ÁÊÿÈN€p&›Ú,у=Ç»ŽØküÈoÆöÔc+S`@›p»ž™¿¡P´å°”ûê` é°mÇþÊÓ'ò uÞ—ð ¨Äªñ—'®'¢ÕPö¥uÃê­w‹&òśȷÙD¾hÉD¢cŠ3 ¶ÝÒÁ΢Á¶o¹•¦´í:KsB>¸¥xDî5V,éc4РŸ×)Ë ßp©ÿJ/k`CWº?Ü‘¿af®t•÷O ) HÜYyäø­|ñnþïlb|—5ù°fñAÑβmZæÎ×íýAÅfSi¹øg<–¶˜œúWvM‡;®9lå à'ø)kŸ~ÈOY‹üôúëü„!s…Ûg@ÚW2v\‹y /ÝKökùñf¹比v¦<¥‰kþw4\O|Â)ÅS_\¦hõÙˆAÕ(Gc.ìø,•1Ïû®­Uy6Áì–9ΙûùMÈÅ—ü/àºK½+°t‘ZkÚäWà4ís«J÷>9$nØR»9K¾nNAØÏÐòïÛ2Žú„_üw'¦µ&¦[X@ÿ÷—š7”7·ø¦«À¯éÓUªX ñÇÿZ-äÖñüaó^êêþµ¹èËš†;ð -0¼Ùrƒ¬<­ûÛŠBûÀéÍï¦:ý5û+ ÂLZdÿoŠ`^Ë>¥Þd_Pæë€ªèíïúÍ6Û–š õóˆ¯ë>.épåÖï¦)y’öÿEi\a³Ò¸ÆzÁŠóêieŸ|7„`åþ"Hã=Õ&š/oj¡K•°ÏÈTÒyRŸJ:§¬¼ÒSmU<çãŸ`ùÔ^×0­*nJ­guÿÄ‚ +lªR1ŸŸ×g„?ì¼`:tÆg>‡PÞ'Â5ùÙ‰Ç_ö5yðǟ̃w„œÊdBur.•P^X\¾qóá´(=½°)¾ƒ8¡æì‡|óÇlB½? ž8Ü2 ’M DòÏPÀI–>šÎ¨v@¡ü“w”–9R.¾\³§<§†n‘Aÿ¥>ÇåÖ—;< 5Rã×çŠÆy8ƒôŠJ×ûÜ~+»DÛØ=ŸÿÁø€#ïÅgÆÓQð!y.·Mô|x¦‰z_¥†Ú[#Ú¨ÜåZêZ°© C,׈ձA@Ó%09·¼¸êL¹¸aS0ÏúŸ.x.ë%ú¯0Ncí›ûå$ÅûB¡—?»Õéq‹cúåŸÓãfcºM ØÞ¶Ë—/Ô2ªðx”—¿Û€GºÊg ÐtLÊ«ØwàQ…ø‹7²Çú«g}EÊíŸùòÞ*qøú‚”³T_ S Oã¾=͉›öaÙñŽ”F{ã¾ù'åV•ª+õ\v¼×báÿ7sö°Û­iÆW¿ðí‹)ÐÝ|šçùá9˜×|íuµ*ù1=e_HO¿¿ž¶ôÄ‘ì*ÅÔÏ9U UuCw`—Çýkõ¬Ï|ñ^{ÿ kF_j9ÅRŸhú¾¿ÏákÞ'äLJVüøÇ4þª5‰ÏíÎö—ö Îû`;U¿_×ý=UÎвÙ^5låï=R:…~\óË ´O±Ý?ÃŒ¿L¥Ÿ®tÝl׆u³-0^RJ”?¶´»Å[Ò¡üêé‚ßÓ1W”ŽéþžŽkSħ•tDŠÈÏ‘‘{'ë¤"¤vK„Ü^õ BšcB¦güJ¢-¨5MpÐ?±N :ÃÒ&)ËdKÒà”4ÓL ’­aŸ6LjÛ– þÎ9¦Ú endstream endobj 132 0 obj 16368 endobj 19 0 obj <> endobj 18 0 obj <>stream xœÔ½@GÚ>¾BH»)v0ŽDÇ=ŽkÜ{·±M1Řދ †*º‰Þ{¯î½÷–b;½çœä2K†|ÿÿ,8Žïâ8ÉÝå¾ïÇ’¶ÍîÎ<Ïû>ï;Å,ÂM°X¬ç­}=%oìº1Ûsi3=Ù€~™V ¦•?Îå¼LX”°ÇÑ‚ç‰Ò— ¢ÔÌh2uìÅÉÜ/LætO  ðei¬Vk˜õ“×à3sƒY –¬5Øl°ÃÀÊÀÞÀÅÀÏ Ì Ú Õ@c 5(5¨1h6è648jpÊàšÁƒûŸ|eðÁOl6û6ŸmÆ~•=½½†½‰½ƒmÏvf°åì(v<;•­a²«Ø ì6v/ûûûû:ûmö'ìïØ?r Ÿ7äN2|Åpšá†‹ Wn5Üihmèbh(1TF&fê  Û§ÛìÙ;cÖ¬ÙëEbyˆ¯·Ô|ÞÒ¥KÍÝäæ˜oð”øz™OÅ?Â<Dâ@Ï és+OOs©§¹—o€§ùú]–ö[wn6Ÿ¾y§ùfÏ Ï×sËP·_ws _wÏ ‰ç s/QˆyÀ؆¹»(ÈÃWê+ ’Ì1_+1w5—ˆ=Ý}ñEž2wO1s`¶¹Ø3$ÐW"Á¿Í}%æÞ!®AROs©ÈÜ7È= Ôƒ¹=Þï% ’š‹CDøx >‚‹²I¤÷_±ÔßÑræ±g”ú¸J™ûJ|ñas‘>ÓCäʼͣcRWß ‰¹ÔS&eîãæiîá+¸Êñ}qQâßÑG•øyÿr÷Ùæ!žÞ®!ž’Ñr™ZùåýÌ{kW±8@>z­hô¬G÷÷•J<¼æìô t •˜ÂÐ|§h©¹…ùOïÐ×_ù¥½þµÜ"bžØ38Ô5@èÊ<®wˆ§«Ô3dtçÏ©«Ø5DŠÛÅÃ×Ë+H$Ý Rxyã&öðuw Xë‚ õý´pw 9¸º‡J=mDÞ¢ Oÿ­"©«;~}©…»ßdì·Ã£½›Ûk5z¡•»§‡o@€«ëh‘[]Ýq™kǾ$í=sëØ-lp³x[=VÎÆÑÇX;vtýè©{Fwíý½ñÑÍÝûåÒ£çY~n»çú±K;Éú±ßîc§ŽÝkûc6ŒØå„±à*µy|c.ÛUºyô%wÝÉb¬âÆ6ü+Ës´,ÑO߱Þ^Âc´ €Ñk=ÇŒžéýX —6ö°íñÛã:vµëØVèØ—b´`Éè§âÑMƒÆö>VF(Ó A£7z|÷ãï2zUèØm¤£ç†Œ~Š?KúØå!ý]GD®ÅZy»ÝŽu ‘‡ýÎõbO‡]‚½,7†xïÞ$ñÙ³Yêkµ%ÔÏzk˜¿Í¶ðWÛí²@·½kÍt|k–ù¾Å³_qZòÆ«û—ÎyÍyÙ›S\–Ï}=bż©Ê•ó§©V-˜¹zጲÏNö7•~j ¹â‹3ƒ-•εUýýüÁöjúÂ᎚á‹G:k¼t´»Ý?ÖSÿÁñÞ†OOô5ÄÄ«„±‹Ø@,%毎„%±‘XF¼IL!v›ˆåÄ\âub±™˜GL%¬ˆ-Ä|baMl%Ó b±˜AØÛ‰EÄLb/aA¼EÌ"ìˆÄ:b11›°'vë‰%Ä+ÄDâ9baLñ,áB¤1D8@¸éD,!# 7"ƒˆ#äDáNdñ„‚D‘@Db“Љ„’&¼ˆl"‰P!„7‘C$‘„„ð!r‰"о ¢‰PÂH%ÔDáOÔDQJÜ#jˆ3D-ÑG4ùÄûÄMâqŒè&ˆ*¢œx›¸@&zˆF¢Œø€¸E\!޽D+QLÜ&.G -ÑDTï—ˆãD?ÑBÔwˆËD q€h# =qƒ8K ]DqŸ¸Jœ"‰vBG¼G\#N‰¢ˆ¨&î׉óÄq‚8Dœ$Þ%>d¢•Šy:+ƒ•ÉÊbiXÙ¬V.+•Ï*`²´¬"V1«„¥céY¥¬2V9«‚UɪbUc÷_˪cÕ³X¬&V3«…ÕÊjcµ³:X¬.V7«‡Õ‹B?k€5Èb`dbfaecg`dbfaecg]`]d]b]f]a]e]c]gÝ`ÝdÝbÝfÝa½Íz‡õ.ë=Ö]Ö=Ö}Ö ¬=psÛý¬e¬FCƒö3ìFö7†Ë û9s8Å\#n÷;r%ÙG- ž¡ž‰~ö¹gýž[ûÜ•ç×<sÜŽq7Ç{?ý´NMX5¡åÅ)/¿Ø`ô¼QÇsä=xiÎK—øÓùÝ×Lü›±…ñM“ZÓW'q'ͤŸtlÒÉI÷Ìž7Ûn–aÖ;yùä]“Ó&·¼<ùåÅ/W½ÜýòAàšpžPca~Çœ~eÝ«ÜW'½ºäÕôWO¼öúk_;?ÅhŠõ”‹¯?÷ºåëySSO-úý´Øé§‡Í˜4£kfôÌ£3še1ë«Ù†³¯¿a2ç¥9¯ÍišóÕ›sÞ¬š»tîóÎóšæ‡-Ø´àØ‚÷’ Í,Z³h×"ñ¢ûo¾•½ØfqÅâCKÞXrpÉÅ¥ã—v,›¼ÌbÙ¡å/-ïZ!^9qåü•WVY­ž²z÷êº5ÓÖ¬YóáÚ²uëŸYï²þî†Ò¯nÌÚd¶©nÓO›Ã7·nqßre«ÍÖ÷¶mÝöýöW¶§Y¼hѱcýŽ›;gî<¼kͮ˖‰»ÍwgìynO‰ÕD«fk/ëlfÚ$Ûî°ýhoúÞÓvNv‡ìãLŽ8.p<¹oʾöïÚÿù~äœâ<âò±k¶Û·oÜ-=O#ÏÏ»^3½¬¼‚½ ÷oo•ϳ¾F¾Å~†~:¿¯üeþ·ôûƒV‹Æ‰öˆŽŠóƒWׇì–L—œ–ZI? M {)¬+|~øY¨ì¶$a ¤P g<„‚îÒ§ô,ZDÛò‘™’ÛP‘˜Ÿ'œ‰j ³â  @ž)(ÑjºÓ(-rS‘U‰ÅÑÙ ÈE)&é±ÚÀû"o 4J©…"P*Sx“¦Î”i @IÃÃ%~ !]ŽÂ)‡…p=» !/·"ÝßhéIGXgï wÙEô«ü¬ôÜÔ<@Õä(„(•{¢Uv‰”úhI» e>h¡`9Ð[–ߨÁŠ€­BäI‹H…=s’‡–tȌʃ”“Ÿ9]ë Ø¾Yp‡ŒKsûF[Gà;Zª¯ÒœZ¸Å¦_…sù޽%{5wûÛüöÈ•wZ ¢½r…Y¡Ù¢y)0­*Ó•ÝØ¿ØÁ.ÜÛMhï,Ú VPhâ9ÝÛQTß"¨®ÐU× F›jØ·“ÅðL>Š‘q'Å)PF˃¼ L\Oì¼'ée¦@¯ÍnL­I5Ñ¡#2ò\R‰ò+$„,´ÐÍC6ó_IH´KÄMªÒ‘»3äÙ hµ•­}ð98ÝäsdÞèPâËÔ¶  Ñ‡hüæçè%a¤ˆ÷Ä,ô2âìß¼ÆÃ«¢#L(:qW÷çý§¯˜²‚"úY\Ú}~— ¿Tóá´ƒœ"Rž’ ’å›×'¤Ï’ iŽ õv…i™š²Õš£v¢¹¤gƒ8Ï?;9ÃìUôÒ…Ðàh›¾¿I¸„,C¥Ž–‡‡¨ƒµÄúmøä ^¿yhpŸ­A­n˜­gÁ> +¹"÷`Jq,uBTŒ½†ÂLÐt]_v¸Ó k ë=lmN3^ÿHqëêÛJ ÕA%‚¢à|u1 Êu%å-ÎU»vØŠ‚…ÁαÞ)Ë©¥þï¢ \°.:j=ãn ´äÒô辨ýª³¯³§¿ô86 £H>õž|h Œàc QËåÊå"¯3Éd 2ù ¹õ D0˜—D3ÖdÌ«2°ØºJÁ ø:ù(Væ/Ãw3U—Eéé9úÈ2#p.½lÌ› / üD8™ÍMNމKÁRÏ4¨Ó¢3)^qvhhF°ÙŠ=vë­Üï9 û5‡K@€©³¿ÈÎ7  L&«Œ)Ê–s»“ò“òcµ1YRàB¡·Hÿâõhñ4È…;?«ù¸gPÐ3xºú"8 eíÞu¢"qåNªœ ½9¡Üx™\Ô "]®Ù¯uÊÞŸzYÓËŒê5G-…6}á À}_lîh¦ 3 NäϤÆÃzõAúù#Ðì-îÁll½y—¦b󛂣׸˜ø˜8µ§µ‹cD"Å»—0 $¥&§'S¼K‡Ðaîâ:—ƒm‘ya! u(0õRVŸÂv’wïo\| ÜâÏi›õpÜ£ÓÞÂwù®gôí›Ö%žùi©9À´bÔž)I°^½‰ñj-¹536—©_Hòh;ÆK¥"Q™´¦¶¼¬¶FZ„}Þ!UK¨žF¾z£ÚûPõ7cÞdÚ {û0n¢4:Z«Ç‹Ù¯±ÐË+ÛßÌ8+ü‚|ä®`/XÞc -¯zt«ôÌ‰Ì j‹½ÓºùGàx{”[‡|8e\ž….5¿Pk†M|¢.—¤lëˆí0ƒä‡w¾}×ú2¹"|õ¸k8Léj;ÝÛ%ónÔûYbîŽÊ8Ø[u¬À£ØÐ">–¯àj^Þ- Ö¤õ2òV\^ôÏ>Jµ’¡u½Ž\“…Ñu…‚nð(Úû¤#LtõëRíh8q|ž^V¬*4:}nºËT‹dˆŸÀuŠÆÚ~擼Fy:)_ ì)EQ‚J- ˆ ”‡S—W ï ©*r ©P œ(”I®°»ÖÚ^T]-èîæ,!yÉCú–¼…¦¸•QPÓ°áh#÷F[ùShC;ñÒ-¥ž‘–rcd¦jÓ´©¹À´šþª‹Õ¸Z5Ã$‰oEG/aª©WG.ÍP`'Og&!”ÉË‘UÁ‡«8#§¸ñh§‚[Yå:hˆÍ3ö²c1-.‹däښȨÅIcaðÒôF-0õ}­°à.I ÉÈ{c¡'®l•ž^¡gÑÁŒò*¹ IZ5u²:Q=囼sâ “ Auò4Íé”Ù)ɶdºo |u˜¤Å§Ç¥Çfɳb³@Ðh[áKðºIíÅ,M]:5f4—hY7°fó1]p-R¹‘ŽÂ‘0,ö“’Ö3 RK†§º§aaÓl -HhŽv¥'¦%¥%¥'™f«ÓãA%)a–뜠s=€Þ€¶&µÕWΟî«Í6Õf¦a–­E.*n{J^"PØ•* ›ãMè%dbšgTPìîÓÀØQ•ÝCëX=€?õ°iHçóÁƒü¢wsqõ(eäíø¢P0 «YlÒã<#ÅŽÛÖ€ À¡BÜ/oˆkeâ‘k£~›p V¼ñÀë(tŽDkßY WAÖæ‹í‚Š®œ>p‹qiª6úÿÓ±à2ÜDõô\ËË{‡I-tÈÈwÇ®q'÷G…«â³+ãêæˆ"¬WÄ¡R±kgàqHœº _dÔ‡íu·—’lŠË  Œ—D‹ç¡“ÅPªè˜‚²7ÉÌVeaÇ”]_…C­8“Qt¡WF|0Հ̜¢ÏmRÒ•ž©Ç· Gí$ëÎ]6ŽùYܼÔüT7äªp@LU¤Enãh-i‘• ŽPôg¸5ö*<Õ›£¨c{ŽÓ&Fº÷àôw˜øwçy¾B• ÄlŠ+ìBlA&Ô*+B[\t–€zc­ƒ…T^^Qª/ËHÉLÑ“sR²†ªn(묲ì$ÑœŠXÏÐp•/ð£xv=Χz:Kžð öf–„uš5á—onÇЛ8VHˆ ‹’¨D1a€ò5u 3°£élãz¨Ñ}xœž5¼ƒÉ¸Ê¸G’J¢Dĉ£Ñ´¶ š?ö»[´¦@W˜ËdòR ™Œ€NF&ªºçÔ‘>-†ÐÇïäå ¤›Že ²éyÃÆüü”\ê’óc±$ •ZÛ¡h‘ t%¡¥•Áf~äÏ®+jH5Õ¢ùJ².97“+**4$ !>J®Ò›ˆºäM hêR1žÜ•9d(Ьß÷šb‚¸hi ›:Î/ÉT _×’¢¨Ì‚,¶@/¼_ø™għŃxS Kôc„†ÛŒ—².ß…Ìÿlý*¿ =›I„VåD8 Qƒ*¥U FUˆ–´MSæv 6“ -;W£©,ï.nTO™Ve8HŒŽÞÃxe©–Ü“ª,§)˜IÖu7–ôêX‰x‰y“`Olìî8|’HK§¦E–€vSèFÂg=N®Úm¼ÛF ?æ[mœHµÄ‚ºAÆ¥ÙÉ|£­•L¢n Ÿ;Ã:†À†o ¯ä'¤¹*űû"Mƒ™—•š4€êȉqŽ‘÷üÞ†& | ¾°ú³i;w{;„ l Ûû[ÞZ‰Æ#¶ãö¥{÷—W Æÿ¸a {?.a°ç ãHÀ؃°ø`µ½ˆ>1A&ð³ä̘²”tÓ˜ÒxÈ幇ìée䱔ܘ¦åKMÌQ3šB?W’8š¶*+ÔHǧ$ËÈ ZyëÐf¤‰çz9\8²œ£åÞƒ…¹5ûuóråRã|CÕŸmôï†iz¸»ÞÜ…ã®Ðã:Œyw‡7\ã¯ô±‹Ü‚åÛ*4N€ë>mùìØ áàà…êk€Âby"z͘f1skp¤¶^“š™š%<5œM\µgh§2ϘºŸ__[Û€ÕØò¦Y´; öôW÷6 x³Zƒ̾¾Ù—¢×àKhrFo¡7Ñ^d ¢éÐýòPAÏ—BÞ4´’^ʯIÖJ’=’–ÁûdÞA¡b@yI.jjÖ44ë+’G_+}ì ޾̆[é·ùÐŽ[2ÒÒ5mšÄh”aê„0`Š<¹ˆ…Ô)É $›&d$e7tÄEv éuh˜NÍÚ¹fe¸BS(ð/—æbó¤Š ñì—ܸ{µúÀ°¯·ô¸ ®Êú쇜{ö”£gK™;OѳàÆÓ6üTEZX|P¤¯iœ,9Ñ4áþçØ½´îD:‡ÅyZ«á,ì§8¯ŠBn¨h=æ†ÇÎ l>ƒoÈ®Ñk…¥Eõ9ÍL0{ èá¾ó,(:φi°D[¡‰ÏC1Þ…DP¼KÿtìÕTúažƒ%9”ý´‰s‘‹äÛ˜^¢X=}í:‹¶Áœár-Ñ´âØî‹%G€) ä"‡‘O9ç¸ÐgøU.'^ñÑ7íÆ<—÷Ð+ü ½§ÀIjȧ}¿Dê+à•ú—ËZ²4©©YžKš€T³ì¬øX‘——WbÌô •Ýp¿—æaך MÊj|ýÂ÷Is–æ­äìÊbRˆ0ѬäJ%e¡u åeuu’Ê@á/ Ín²›pC„@ïáÈ;ä>ÙX¤ðþ´ PEFÛax|¸¹ñ:]²¾‰cMØM“ü¯5w‹Ô»ëONC¬e[ænÓ}ÿ¦€÷!"–†lž4óÎfÈÏß:ÿí-ßA4î#| ÿÚÞ o`EmÛ¿Ûj»ãïŸ-ë:Þ/àݼşܻ¥Ž÷vž¹Øí¼ihÿOAB‰I h ía¦°Ûa.ߦœÁŽi6½&³àAz=_ÓQt3ç$¨5-“•H%2¹4B;£xžMŸøGÆÓ¾Ãõ¬Oà[Û.øêbÚq+ÍâìÂ_#,¦9¡º›6¬aOØ'Bùаàˆîâàw7OÁ šQpé›ðÄGÏÍŸŠÌÐø«Ë q¤«¨óÀ -Fls4;˜‚'à0„'ÆDLj$^‘Þ€Zíx>w¬èdi•°X_™W ¨÷{¡¸1Ò£qk¾ø ?0$8 ¨2¤¶¾ª²¶>¸*P8ꀡÝ8é܆ž?¬àOãêá$Î÷Gfrëà~Înn ÚÏA¦ÜúÑfãYkhÀ C“8ˆ²þë‡8ǹ0€'áãÌF=³Áâ"ÜÍgΛÄ-Åe2©³‡XÌ'h$ÉžqÑØ¼¦B6 N¦ý|þú™æìÀ$Ù‚ù1J\xöõïš ÷›^I'ñ!›ô­qÑ.Î¥ÎøZq¢¿`_q¸;pûŠ|:¼jEeÊ+îj&ßHµí—|O)ÑDîI¯®è»IÔ¦÷Éëùõù-µ5ºN0šb[¢ô!b=w™‚)ä]u¯kñ[Ú:‡¿ähx%èGšš.RÍèKþ§»KÅ`ØêíµRÉ€‹Þø|NÏílÎ<°ßþ`e×ìÙÛ\QÞT/Õ{ÇÇ¥¤Ä â’¶öTl|VvcMËáVæEÃÈ6ÂU…é¼åLçKMÝ'Ñ9Ó9ɯLÖúÎ>ÿLç6ú6Ÿ'~RË«ª†ªXà Xð.á[W…—Ïn+ODô @¬FôL¿U«óÉqpt·4?Ò)ÇQÐu.| ’‚ùw{y"OgóE‹œ€Ч²ïã°áz¤>®æ75@ŸÊŠºx=&9 ©’Ê–.ýÅê!sïpm[S½Y&HKÉJ(ŒÌO¨Å¶]:<]Ϻw ¿E«ø›JBë˜lü ¼'«Z£»¡×U÷F·o”Õ]*¡òÈ­)ÁñAò ¹Òì¡Ð&l”K·„_+‘€MÂ۪ȭF^#¯Ž?ŸÂ¸5ff£š•Y­hü—ƒf"g+9ë*¼¢g=¸Ï†=L¿Í–¹™Ÿ™—‘‘V¢)ÎÀ¡oiŽÒ_Èô8ûÅJ#b”1ª$WFÆÖjÉ©¹`€¢¿$±Ž<¸÷ ý^ƒøäâ8ïP 0æv¤WñQ@w(¡P ‹Øfû[V—ü8ß¿ØPY\S_Z^Ð ©+VC+mÞ¼È3Û¿zÀ3ô•vÀbÓÙçöüý“•çox‘ÛÎ 7; ŽuÕ]Qæ™ø»‡b³eöÖ;ê9QÙZ¸ªÏ¤¢SŸ?”ELÊãžQ·^j ¾©¯¯ÉÛÁÊÇe©³€§Û´Žq›­m´Üç.wÔF˳·ÎÖw¿3fߘiçÙTüóÛ°W¥OÁçÏÃIçYt==‘?’º•Nå¢I†c?˜ú»I—_gÁS÷Ù´¾ÌÌôÚ³k°X.\7|øiûMpÛô›e·^³Þêî%ð÷Uú+6”&˜t|ÕÒp PwíY¼ÒiÎâùB´ íæDÑ“˜.úÒw¬oÚÙ§7þ³ûýÅ÷jÒ0UÅpÕOä͸Þ1(}Œ¡4qxÿ’¼,¬¡†Îb]È ÙšpY0X2º½&4p“œŠ&ϧVeÕ–Ô–hÛ™~ ¥Ë%åJ·èåå* ¥£¢QIpÖ–Ô‡PªQóéL¨àœÇÂ_ëIz ²Áû¬j¡?>ikïx^5æ]‚oÀ÷ø'@yrEÌéÐö=‹÷l[+×Tx Kf`‰RæÓzùÖªÎ~agÕqpˆèª/“å;ë(Þ½Ký•­‡'½³ýè›öÎ oA XºK›hÒy­·ñ  Îõ:[x+½CB„"åf c4© 0 0 ×:{9mXè3mÔ*ñZg|ðz§cUèAÿü"“ågDÍâ’ Ñ7Á7àû‚w«Oל®k¹z¿lÜy> 7»5<ÊöPD€0–©È™ß/×ìN Ìiûa“ªöâüzP JŠc>ÜW׋­y}ißY\‚eìð[=ÜXÇÎýPÿ &Á%ü¼ Å­ý}G(,m,h -²EZîÓlYn¨77îXâ^Z_Q\\QŸ¯,F&ä€lª¡¯nðä€í§Hk‰µ@´]æ vHq6ÍÝÆè'ÿ ŸõSHeÐC¿<í,½Roo¯ºeÌû”€ü×éÝÎ\tad7g;lBËIÞßnÁå¸hËY>ŠãÂ8øçaíÁU÷Ùmh#ÿú@]Ukß•÷›G{XàK^_.xà6\¶·!*Âäm‹jŸš5[òVƒiàµÈ%â"‹@ïõ»G•tž>ö NÍüý#¼”¨”HeºW'jjÔ× 4Å^‰º"ˆëïKì„I<ÜÅ÷ ô/—ÔÕUTÖÕJ˜Œã?w,Oá;p×›ooÙ_°sÌMF¯!g í¶*{a‰OQx—çl$4äÞÔi¯¾È XÝÚB3ø*t>§<'Ê›z·6Êe;¿i[˜O!«eؘìvÓõ»Bšù¾g£Ž€(hõ.|é’9õ0]®pÙ°?D* •†V×”—UWKËEÌP”1¢B›vö±'põ‘c}Œ«c~ÆËþÄÙÌ”Ãþ¶ñ ™ ™¦Iiñ™±š˜ÓÀª šäLEiXI< ð‘•nµ>ÂÛœ¨2Qb¼I|ÜšÙ.;pÍ'd$fe¤¥ffŽíh½v†‰èb®m×ÓsêB°kÅ1¡§Ñ7ù>\g4ÃóÉD¦ªÌЄY¯ 3›b›ZwaIˆ6²5ÌÍ4iâB‡WW¡M.6k­…5Íuºê¦Ë‘Ù&{×x‡X¦S’ó7ØcR⡬Te‰®ªY\稢ùèk¾C¯¬\¥¾ønq~r\‰`üãâ[áVXÐØbplÔõ1oö𺄵Â2 lM“§R¼wÒ“€Êl Xlí°ÝÊ Óë ¢nñIË!û‹âë ”¦–§v¤L+Å׷ܸ‚#áÚÍö°HF’MœS¢rA+“¡€¼ôá9+¨RÆMòJPF+•aÞê€z Fsy¥9éG¸ÐTFäϧF^™Äß´ßòÜ#àM†v—°w©ÎÝhÏü×ß|Í>ÿ$¨@ljO€O½ÿ?ܪhQõ%‡°B˜Ú¨ÖC‡J£‹wᮻƼsõô"þEt“ ¶GGZ%c- Ö’V‘…àß½O~‘™d+DÅL&:fGÂÃÙÑà,µ$(åi‡(ÞìÄto_œsP’»š×Í=éõ™Å…Ýíu½ è"+|uâf C©¶¸¬Ë¾fÕêÝÁÞÂ@·h¯øåÔ&ÆùÆÖˆß+i½°¶ÚTÝ»‡ü’~†^äÆ^Lj-ÔÍN¶–(|R©¶Ùª:@Õ––Õ²êX‹ž[=½&I“e Í÷C‚«GÓÒ@âRâ“beQ©J@Ùx:yVK:›ËµýB^ؾ‹ªn³Ð[ÚÐZZQÖŠ©ôä´Ä„Ø„h5ví>J'à|²·UWÀñ©™ 9¥Æ¤Ž#Q6ŠäWÔªcc㣢#…¼j…**>ÜL¢Ð–U”4b~Ÿ¡8jdkpö56\€×Ü»ßZ~ÊòîûçÏÞ½³ëÈ[Â?þ@£Í«§Y~Y”0¢6¦´S½5µÝ úèœ&hÜÄÌ'[,G¾Íþý6VÝÎGôö9²¿×Z˜êËo® ôö òò ªki©«mŽÿQ‰<€q2ö_û„`ÞŸø‡ö!fZœt=¹ÚèÒ]h‰óeýÿ:ÏûãCT1ê8urPòÃüf–*ôQðh‰Þ'ƒ2b/“ùô×’6ê\pQ— i±)щQñ¦²UB Hête&ÅÛ—' Ê’˜íN‘G ‹Ú#qµ ?›ˆ,r¿+ê)Ë—x"]AL¹™d¤e2ݰËF€wq-;qGìq8È }T8^€â:8¡VRaÞ/…/ó† 8‡ï¸ÑC¼¸/½¢.¬=¡!åkŒdn4ä;žŠµ€(z¿/ÅKoô Ìw0›»ÉiGP±¬º¦HW›"L)æä‘€ô”ô„êúò.Pt1U¶23 Ešla²ÈÛÜÙÕ ì2Ý6°ÿâPSñыަ½MmaÇÌúAgQKCu…®¦úÅëF?äï,¯¯Ôê¥Pòmþ^^í'k*à¸Á;‡ù™T¶‡A¹WÚÂQ'ìßüv NºÁþj:_“ž“šLÛ´ê`q˜Â7,"=G$TÔF•'6Ó[ »ý«lÔñ)Éjaå9ŽCCV ûk«¡¢ª»‰+pwÅÑ«pOù-æÃ˜·ú}vØ–ïÌ· "f7@åx׉ˢ²ÂõúÜiˆ³ò€å…¦š‚ÚZa__íU,î Sò“J¢K’ªÀ!P_ØÚ="øiªI?÷Ôð›übyALa\©:#QˆÜ1u£¯´¦ëýž/Ö 2Óó²²3(ÞÉ{ðct•?kÎkæ+íºxÿ6c¯ûtïæ‹øÍU^v¯nºÙ_R×~¡éƒž~aA¡>§„q5Ì%¯¬8´ëÒÝ;.Éñ[+½÷>¼¤ópý‡ÂÒj}~9“tK‚Nƒ,˜nè@' ކJ:¸¸ã£Ø£cÁÄ{l¸nãï`Æá*·0=—I:r{ZD VÎ×àÚ´ö&©)äÀeh*÷hÑz©®ú@ž©í•’u¥Q2u‚"F!D†HŒž…Á±E EL˜¾$»ŸI„'ÊȾ¤âˆ#Ó?GkMÐw¸œ«QqV£uîä/}üLÖŸïÜgÞTŒ~:ƒç|YZSŠLõ‘ù¡Ê˜¹\€¦¡éDMüÍcXö  :¸Q¿ÿ>iøáì6Üûùªer‹µv;$6Àxx—K›}NHê“˧ßëP”„D($ª¬(­B˜¯ÊŒ±”ÿ¾@Ç]އ.ô©8"¨9«ÈJí1ëÉÁÚÊŸåàÃô¶26,B3øðÀç >ª¾Ty |Õœ¤MêŠÐÇé UVTRY©Ð…FÉbÃ…nŠˆDïp8³B7”­Ë,¹T…´L"‘†JÔ™ L ·Ë”¤Øú¦*2܊óå™Ñ84QȃEEÊšüÜôœ a‡¶8£)=uz¤u`@åæô<˜K¡T Ýt[=Œ«e ð«+lz=‹Œ¸øôúÔ¼¬3º³:}^^aV ò³â’’’â… 1I1 ž’—Dè+Kõ•mžuû\]¤žÁO+…cÄk”9WÀln²2zKJb¼U‚­©­Q#J¼Ç–Q1Yšô´Œ 0+/]r¨2Ua¨X& vo ê?ÒÞxµQP¹øí ¸#µ û˜;åç¹z<¿‚ÿÃ_iÃq&oæ ˆ'õuÂòÖ!N¹Ê–ƒÝõ£nψ,òñ~RƼ,=ÊGÙP¾Ž,Sc·F——”ÖW ¸žbàO¹4øuv6•jü ¼ <4 N——Äd*iXd”,"OY%„sfr~nåBzΨÐi6XhYˆ$ô—ËÜ`rÜ`²'7XQFsz꨽µâ|û”¾éÊt×¢pMøèÉŠààbyy^If¶NØY\’Ñ” lCÂíãd  ¦$e¡•ee¹ Åq:AøPb%8Ô’¢MìRèbKòU^\RYQ, Oˆ“ ]#”I¾Ià«Ü®úæÀÖè¾ÔÏ›’Š’:1õ ùÿG|²B‰á8:Æxz)Ì,…ê2˜^jE…KŽF4æýž/ò/ ]>px÷€½ 9áŪZPiÚÕT{ ©F%OJJJHDD©#@¢—W7èôG­»Ö-±²_o£|{«@ŠA(Þ[ì6¯ÜÇ/žu®ôÔ>ß@[/_üÚ™š,AQ¡¦Ra%â©4Àê¤óí÷¸y@V·æœ€7<æñëÁ!ÿ>§&_¦|ü¼<=ËOîø6E•ƒ:ª½¶¦]ðOÃêé­ô߃»±| $™~8\ãω&;å;•z ‹ÄÊ&ñ:dnÒÊ=_hŽ(OhÆÁï‹ï¡p@5 iFTDæ”Qþ»øµÖyÎ`;…(çMk|¥ùu!‚°¾øXÔqp‰ú¬ÿô•ú2upõ(º^ÅÀ¹1üß—‹ÆOAã¾åørá´œsšû3öLŸfôÆÃtø"<óÄD7$ÏÂ#gYÇ.Âþ‹ìPHð‡ì¿øªKÔÙLûA{A{ÍW3L†f}QÛ›ÛLÁ º1¨û‹¯LfÌò¨öÌw¦ÀO½?hÖ&öŽ_Íròަ`_¾W­+7Â:þs›—¾µm˲¥[/¾w÷ü…»L¬® ~¨IŒÀGÆ<Ùðrø:ßv‰#ð>zy]p_LkâûÔp“NÅÖJëEíŽåöÀø„»YÙu×ïöÀEáàä´¬¦xIÈôÞl8îbgõÅ6Ïns]‹ø´Ùm0ØyÔˆ+ìå_ë\‚fy½èy‹Í+ÜîÕ ëK˜ L·Üƒ&ðSß«î<¨¾F7+¡˜Ä:ág_ù£r|Ô Ñ_„Ë9;¸ˆi†&.÷-?“Ü~ø¥2™ŽIé>{þøyc^/Œ~‰ü§f8§Œ»:+jtÀÕ'$OöpȯW‡ŠH4m‡5š¸¬|O¿¿°QR{&™BÇ~« ç[iþ¢ÿb­RØ[[ZRPœÕ‘ŽµÐ–Ñ™¿ýv‡ ׆k‡ùÕF§îÂïïû ×öµ»|`5:5éuº<×ÔuðXÓÞ…ËݶŠ’cA ˆÎI(O¡x•$õlBf“Þ Ýï*‹Í.K$—%—Ë‹Ci°,LìÒxì›;÷!ëhè{“п&(og>~¯ë¯NúdëÉ×6ÛÛ ¼böƒÔè¬Y i¯cbb#úÕ¯y©ÃÇFÃá‘Sáä¹äÊ â“¢ã£QòˆÌÄogT´K<3Œ:’¼J] é’’´ ¬âxÇíšC&pšÍ[£T»âÉ&<¥ŒÖcÁñndŽ@­ænKLÂø:ÙªÕò¼ˆ e¦ÛX„œè•¨T+#Â|b,…ØPÁ-ËÎÖ Þç© \U0—9€Bøp¼ÊAWGÓ˜µGÕGŒxÑðȰ_á%J Ë’åHòMxkò¥!Y¡föÀÛ[¹ªåæÕkËA>(LÔÆ•G›ð¢Ã;µ‰•fG@m]éMÜ‚ßÒ{0¦ÖÑ^ü5–»Ö®>¹ëÆõS§®Þ²<¹j4ós? “‹oþº«¤Aªû­®(Ñý‰³ÇÃZZÐâ#pÆîä»W˜!òåôN>ŽïÕ€ŠNΪB’<ëÓ°q‡“ÈCQ¨*)Òæ¤1A€ %3%dPyåùeåJ± œë'–R¼œÈè˜ððIîu¢ÎºšÂºFA–~T5— 5åå2âƒØ¤¸Ø8ElTR$ ÂúŠªRíåJÆÓ=‡YyôW|xö0Só¿táþýÏwáÒI]0„_/¾º£Óó˜•iFB~d*ûŠ·«¾&e¤€øœòzmIkOmKe( 22âÃäa Ab¼X‡Ÿ4)Ù„É6Ä'RgùŸ-ðŸ¦kf~ oóÚsÈ÷‡8hù£1ýâŸgb†pŸ4—f“ðÍ9ƒ$zs>®|ÒÄN¦r3NÞÂЫžÍ­ Û ¶ß:Õ*ˆ›j§‘èD•>²~pôÈÿ;“÷}Xù‰Æ<ñÕ'Õë/É>žøŸëÿ ¹Áß¹?ã™ÿt‹NUuAŽ~§ÐÅG¾¼EO9¦k àîð•ìÔ‚½çp$e8tæÃ3-–9ÂâË\ IÐĤûzdûa a2zqßY Ç»]\.,¾ÉA‹èµ|d‡f£Y£af£ÙÐ ÿ™ gCkh…fÁ7ÑaŠ+oODæh1ZŠ&"š‹æ!c(€Kà h 'ÃEž4¾Žz‹dÈ_9q$åIGÖ1GxôÍð?˜ùŽQégŽÁõ7­ß‡/ó~vƒÓøÖ0o9#Çn™wù£#$zñáÇ1ƒ›9=ðÛ_’sè ~yz~Ze\QŒiµ²0Pnb±›,:£(T /Œb´n86ÙþõòƒýÞñÛƒÚv— ytO}qyͤ>ÇÖ];<Ä›½•ò†]A+0m*“z‡n”üª? ÖnåBáè÷?Œy_{Ý=ôuÕ]cÿWÞ«~gØsîï {ÞøhØ3ïYô€~ïçViQíGllž¯òOì*wÓ®µë8âv~þÍ)h2ýlœp¨·¤¹Uxä`Ógà p9âjÀ™Ð^y…ÝàÇ&~u³ííê|ò¶f™ºJÆ4©úýLѸíœVòï˜&#Òyój¯ŠÎP¡èPÄeþ:pæ²à±A¢àëåï}ùµã;Ƽú¿`œè¶ÇƉ¦üã8Ñm¿7N”÷Zø£5z FÂ,†»öŽÐÚC{ükÙ3¿ #þ…ÿàýŽŽœ}|7äÁeO‰ÿêùôjÚíi±é)xí<‹ÞvžMûàà<¬gú·q͇z#Þ¡ÿ©ø¶/·°X¾âÌöÛïœ=ýö;g– } Ø[îÚç°ÛjßЉýCÇ„ü­Óãnü¿æqç¢3pן¤ÿA…ßxš·´zsGÞ½¿` Þ„xèðT­ö_eÎƱ=fIƒÁ’ü|ÍŒLûSÔáMw€M4°{ĥˣ©¯{ £x†è~%©¨ß‘TþIRçaÀؤ‚º‰têù‘T.Á懓 ž‡ ™\ð3zmÿcè…+oü–Uøo@q1vŸ&XF±‹!ó@ó5Ìî1æ]ûËÌ›ŽîÓ·þ8Ò˜ìG}Ô=¾øIõwð"¹‘?¯bûGÖ?™óhýd»Ä™„w{øh* çòÂês³;><ûô¥P N%CþC£üAßÙÐ×ÿ`ÁC°ü¬?Ÿ°á „|…F“ 8ˆçÞ¿wêdy'4=cÛ½ÒÝ'J*„ÉÔ²§J•IÙ@uY+–U¾®¶ö6Âæ)Ìz´tÔhõ çþ]&Ì€nÿøègÎØþeœ¹Á˜ûß’ÿíU¨Ð7ŸÊ߇KT½Ë4ÔÃeªªÿ­eª6ýÆ2U £ËTñ&Ì~ðïšä_84ô0ÌÅŸ“³†§þÁ I;–«\wÓGÝ—>ňÿíÄ£¬0ú·÷º%wzˆ7û*åuÝúÂ&`ÚR&ðÝ$y¤•0ÁæaSrsìÃc& àž?ªÓ1ég;öWpÉmƒçÿè1KÙ;à`dëXc«2±aò:÷©+.$«“KR*.Ût¢?Áy ²§]F ˹)缫¡æ¢mü*¦ N9ýêLÿ‹ {ݼó4aùæhp8Ðã¢~¦Ã@ zÞ0æM„Fòy_§äh@¶ä€oúN¾#/1[óí÷—|+çþ±…åÐÖÐD¸\â5ÿ ¡äÓ†ÔF-zhÙêuš¯7ªøÚ~`̤×áØeú€+qw—:j¯ó1!<±`Äœ¡É2µUœ{‚3£œ‹ƒkëµUjj" "‡’s[ëìZ¤ÀÐUÓqšâíÛ‘V.0kå…ÝT6) ‹ŠS*T­ëcÒ·jȆχÏ1óåì!›M×C1«¾­$Ì„ƒ¿õ0²à‰Óç~^`ÆAÏúö_Ö2ôÔ¸ÿaž‘~WWhü 2|%øRÿ1¿gñ»é½ ¹0öéqÏÿmüî<-$ü?³ÈZ=ìþ´$ä!fØ¡w˜¹ý|§ôh ¨¢à¤*=kÍ‘’­d*+->TˆrI UÇ»$QhõKñ0¹ø‡«ñLüU·TõïtKåý^·Ô¦_º¥(´žöÚ뱯ÐÜ?½0jp½N‡Ü{_ÃÆ\ûoZ€éÓ íŸÈo³Ç’‰ ˜ä§þKy%ÞÜ‘UÐê‡æÿ·Äô¡—?i0ülíod6ìðÄü².Ü«7Ê[wêÓ–ÄÍû—ÄÝô󒸺?²$îyâóŽý›Œäú×ÿažyð“gÐIªz(ë<ƒVµLotéScÞB8ƒžôÿwwíAM]i\*¹¹UБÛÈŠ³„eÕºêh­îª»e¥­3¾»¸** EäiE´hx^ŒAyID6ò¨ÄKQÉd«b«ÅǰØÖ÷îèúZëwã vϽÉÔH„@wüÏî9ç÷ïu~ß÷‰äêôêÝ¥ÅW¿ªú]CŸ (Yš½>#8íS2 ì¢`“às">Tºm;DÇ˾ÀÇô´00`OÐHô6ý;D†£?‘>DØÁE"%–þÿ‹¡cS·‘¾ìÿ5ÅhÊÝwa0}…®ÿRõ5Y. òøÄ߃žHϽ.$8ÅGh‘’GgÐ;Ù –ކ<d›Á¯/¬ê/ „8ípÑ ¢‚Þ»%Û‹TÜA¦(ˆ¬šüü/i²#hoš^On†™ áŠ4šfÛ‚Ìœ)Ê$`"|+@!’Ÿ(MLL MÄ?ö綃t!­ÊÊ:&#£„h*ªÃ¹N€ì7Ê”â-YëH´CH{Çn_€ÍQ!ô•Çîam“{²aÊš67aäè&¶qrlã´+ÑP°Õ®=b³´Þ"ØGÔÓ‡%û6å|ž‘áE±0C {@@Œ.%è&´BB kˆàë¢Ãÿ#+á©@ÿÉ’æÎš` l9þ(†œ¡OÚ¤ g¨\‹oЬu˜‚˜U°H· ÿ™¸Øƒð¸ ª«mèÛ}à3,8ÕEÊtM>83½’–à-ž" w9íCûm ôñ ›G/ Ñ[×ÿðSCý±‹ÎÇ®ï‚Kg-FoÃx4vu¨4r‘3Ôê&‹¶ 1Þ~  Œ ¢É%A'¯Áàóÿ¹V^ªËiz'Ë¡>›¤xÂu7ŸàŠæžGc‰ê{Ê…h¨UÌ…Äl¶Óܹ0–ð™xz] @Åy´ï/ŽÆòá?ü +˜Ahó–`–£Ÿ°]¡)p¦Ãi˜ŒêðvÿÎØÎÁûÏg ¡­»Ñ'Œ=šöAÑòûÕùUgzïÅ´˜ù¹[ìíWú³WŸiÄ6HߣݑÒÖþ¢Û´SÄX ׺uzz½²%˜õ±ßW9RË-˜ˆ”Ä;Ìsx>5 -ƒ=fuµé1cu•9l2ÿ€fhîóŒ…%Ȝ՗6F°å¹÷–­_ý6ÿ8 CHÈöØk°ûÓáƒò¿íÜUæ¸>*Œåê&–ÖV:[NÊ;iŒ·€¹¶T¶O°ØN·Û9<¶cÛ°•¢;:ïnaËWšô¶UÚ1F¶Š1um)b{À³!oŒŠ>Äáb÷§’t#u­fS?w3Q8d˜ÊNÖêßk:îá7 yxã%P#Ê €¸óCs—Ÿ‰€ A$A %á‰xÓ#ùM—X¾ëË’ŽÛ.–&”$LávpüØ5GPš’'n!9kÑ_CÈ_U3.ÝQýuóPm>Ëð·e(Ak7ê7Õ½gÔQ[‡b¡À”‹Û_ô TbWÜ(|Vœ,ˆÚÏ~Ïå´±ÂR~*Ç(ot¤ê{r*å‚>IQâ‚^š¦ª ‚•§`säÉË,ygBž(éíV[s™UÍí¹¨“,l ÔlÈïìíBüP͉q_UHÛêÆhÕ¼ØêљӉÑpm9Ð&kTÌï±Dx½‘DŒëD"æéÙ¢R¤D…æY^ý}{tÔῪGì<»7J~îų–`Ð7ž½¢ob˜"ãÌt›Žz"°“ÉÔ ¯7A/Iñ…—¤xVL –â-L õT;wJË) I‡JN˜þÝ<‰íÑ÷³r¨¤ />6OAöÑ`UøF[cü’ö=è‚ VÉFyÖ®œoªv°‹•ö·jnrã±3úÙ¬§ÚÇY;$au'bÔëêvšM£Ui6h|ÈgE^ê’fAšWÎÛp>Í‹¾gŽv]:…} Nìñæ{?4wÁ&XÃo9‰U¿ì?‡†¬úíGcü¨$ðy1ÁL«k…ÊÆÆ¨ñ}h˜m¶-ô­l|tѺoÝ÷Ô;ðn“9Fm¢Ûj I€hŒÂÒtV-ìå)ì3Œ°”,ý±_(·¡oÁf¼…{Ø;Bo™<ÆIF0™üÏò™`×0Û‘}ìun"SpªuÔs—÷Y21‘r¿ýC·j•o«{­ÞSU|w´&,ê¼*K7äëг^1_yW.ÃJå÷ô®ìÂŒæ›è­¨ð뺉ÞANK@ðµy£¹ªÇùë žš‹¹/gÇ®BgÿuÑ =nõoµúp ‚ r ‹³ ŽkN”æ'_J6oîÊÍyÁú¶ÜœàÛ¡aÛÆNë¿Ä×;*‘¤š$Òxi‚”š,KÆv¹©‰iJßÓ5•E§Êœ·eFnÜÊ:ok£œƒ ûIM¥k‰S•Ê“ôWÝ = ˜xö*&ßÁ>ãW­§;L6ÑaÊ´l²Þ} Ž™5lÒ12TàãØ„½ŒM`WØ„5”Miý‹Yžó-½:rcZÂ%‡z¢¤ÆV³’íä°ÝCÀ!Wp3\’Í ÆSK„rÐÍÁÊt;»›{íì øö®‰ endstream endobj 133 0 obj 20198 endobj 16 0 obj <> endobj 15 0 obj <>stream xœÌ}xGúþʲ´›@±²ÁÆ 9„b:Bï½Ó‹mÜ-Ûr“-ɶÜd¹—qï].’‹Ü n`zo!„šJKBBH¿Ì:ãüþÿY8.9rw¹»'²´;;»;ßû~ßûM ‡0ægȉ¯X>u…ÔÇý9ƒ1ç0£Œ˜Ñ\´}ùKø/;x£ «RÞ+Œp(Q9š ošŒ¢Ž¾6Š¿ñÕQ¼Žá„¾,•SÍéæ0œ#žÑ0£‘F"£IF3æ-3Zcde´Íh‘£‘Ä(Ð(ÒeiŒªöí7:jtÊè}£›F·Œ>7úÚ裮w÷uîHî›Ü ÜYÜ¥ÜÕ\+î®×›«äª¸±\ÀÍäpµ\=·…ÛÅ=Â=ŽÀ½Âý€û9÷n¿±±ñcc3c ãñÆSŒç/2^g¼Éx»±£±±Ì8Ä8Ò8Î8˸ÌXoÜj¹sÛ'OY)õ‘I<<oÏŸ?ßÂ%ÄâÑ‹Ub¹ÄÃÏb<þ$ö‘úûŠýÓ,¶‹Å O±…»ÄGl±ró›õÖk-,×Zï´X+öËœ},¶ºøH\-¬$®b?¹x¢…»Tfá3øÃÂUêç&QH¤~òiËåÎr±«_$VºŠýÙS,üÅ2_‰\Ž¿[Hä2g?…ØÍB!µø¹úº±·ÇÇÝ¥~ ™Ÿ÷ÅgpU[¤r…ÜU&ñWXà;nYµfðžÎ ö¾r >m!uÇ%ݤ®ìÛ<9§p–øÉ-b¥‚½‹ØÂM"÷÷qÁ÷ÅUùË$†G”Kü<þz÷)2±‡³ÌÍG,7Ô˶Ê_ßÏâ©·vö÷÷ 1\+5”zr‰B.öqŸf-ñu ”[l“ú:ûYXKç[XYl»I}ÿþÄ_ÍõÏpu LÊ>°8 ÐÙGèëëÌ>­‡Lì¬Ë W‰}ÎþÎ26‹›ÄÝÝOª0÷‘†Šý<°…Ý$®Î>Ë]d¸Rç•«³Lêgëì¨ï”zHýÄÞëݤ gWüö +W)¾ÉàwÛ'G×>ut»áÂí®ø}|œ U®÷uvÅu.ü#tn›¡äúÁ[ìÄVñØþT=« ±|ðìJCÑm†Cֆ﫟ÜÜõѹ¿^jm(·Ãð¹zðž+/}ªÐާ¾»¼×ƧN¬2œØì臡èëã¨ØùôU¸ngÅZÃKn¼“Õ`à þð~ª.±¡.7çdð´øÉK¸*ò1\+<éc(éñT >O×6ø°O‘ q¼ÚyðWààŸPCÅrÃgè“›ú }ªŽ@Ö ~†û=}øéw–® ¼ÂPVfø”>]JñÔå²§¾K¯#"×jyˆŸëžM+B¥n6Ö+ýŶ›W¸oY-óغFî¹m­B²}] ×ŽõAÞ;7û8ïÚ¨ôuÙ½ìIvs&[ì;åMûySÇ8ÌŸö–ã‚écζèíñá‹gNˆX2ËRµtöÄŠ/Oõ6V~uzSÕƒ³šµßŸëkÕýå¡¶jæâ‘öšþwvÔþréXgº}¼K÷Dwýý“= 1•CØ›‰UÄ|bñaGl!V ˆéÄXb+±†XHÌ ÆÛˆµÄÛÄxb;±Ž˜IL vë‰Y„%±“Ø@Ì&&»ˆÄ;Ä$b7aEÌ!&{ˆMÄ b.1…°!¬‰•Ä<âMâ b±ˆA %8Äb”x…0"–fÄ0‚K,%F¯ÆÄ2œNðˆåÄ(â5‚Oì%F&IØBB@P„!"^'^" ‚&^&œˆT"š&|g"ˆ!”„/áB¤±DáG¸DJH 7"“ˆ'ÂBLd D8@¸ÙD"AÈ"‡H"T„œð$r‰d"’Pj"ð"Rˆ("ˆð&ôDQE”·ˆâ,QKôMD>q‡¸Nœ'ŽD=¡#*‰‰‹Ä¢‹h *ˆ»Ä â2q”è&Zˆâ&ñ.qŒ(" -ñq‰8AôÍDññQJ$Z‰BC\#Îû‰}Dq›xŸ8M Úˆ2ââ q†8D´ÅD5ñ)q•¸@ô'‰ÃÄ)âcâ…œËÓ8éœ N&'‹“ÍÉáärò8ùœN!§ˆSÌ)á”rÊ8N9§‚SÉ©âh9:ûk8µœ:ŽžSÏià4rš8ÍœN+§ÓÎéàìãtrº°:èáôröspú89‡8‡9G8G9Ç8Ç9'8'9§8§9g8g9ç8ç989ïr.qÞã\æ¼Ï¹Â¹Ê¹Æ¹Î¹Á¹Éù€ó!ç#ÎÇœO8Ÿrnqnsaéͽ‹8ȱâ1nÔÆqk¸ŸáÀ¯ã™ó”¼¯ù2þû¤))%?¦ÖPu/~)ï¥^n2wHÅÐ7‡f¿bñJå+·‡ÍváÕÕ¯Ö 1Üyxñpøšâµ»&ËLN˜0‚TÁg¯Ëéáô‘7F½Q=ÂoÄYÓjÓKf«Ì$f>fÑfõfGÎé2ò¡9ÏÜÚ<Àüþ(ãQÞ£ÂGµŽ:=Úntáè_„{DKEQŸ…±Åu‹oRoú¾Y;†c9¦bÌ—oÍz«ñ-8v騤q&ã&+÷éxÿ s'xM€–Y÷NÌ™xq’p’~ÒñÉêÉ'§ÜòÃÔ˜©SNóœ>|zÑô;3,g¬{åLzfÒ̪™‡gÞœµuÖ÷³‰Ù£f—Ï>óÎÖ9&sç„ÏùznàÜ„¹gæí™wt3?`~ï÷…¯-<ºð“E‹~^Ü·ø«%+–œZrkiâ²ÕË_[^¶ü‡+g¯ì^e¾J·zúêè5Fk®ù¿µk?Zç¶îÊú„õ]ÞØµñG¬¬j7ÍßÔf½ÂúþæÄÍßoñÞÊÙºõá¶Âí‚í{¶×î°Ýqv§óNÍ.á.ŸÝ£v'ï±°ñ¶5µí±Ûh÷™ÝÏ{ý÷~`ßí°Êá¡c‰#tJuºíœè2Ëe¯K¥Ëy—‡®¾®u®×\ÿâ–.ŽrÙÝËc¨‡Çž+<ÿŸ¤Ý+ËÛÆ[ë3ÚçCßh߯ý²¤nÒý“LÈfˎɧÊT¸+NZÞ ’ý¼;øWå©«ë¡aadØð±á™Ã#N«–ª¾ŽœY¡ž¨VßÚ½&º#fmLt,/¶.N÷Sü¦øû ‹Î%Æ% “ôÉ»“¿nàJÊš”žÔÙ©Mi+ÓŠaÚ°þé@+Ó÷Z“Ûpο ¦ýø^‹ƒ}<½]Ü·‡,”µ² SÄøàZaÁtJ‹¾—‘ï&”†=Ô€’d€=*õŠhJ°EÆ\#‡õ»-\Öå¸]Ãé_­¥øn ¬Ü¾ŒäL¥©”dÝâi‘ávÑf2è¨%·¤+ò€dk˵™Â@~ãâ|‚TQžIñ@•‘DÉà r ªé/aÂw(7ŒIDÎǙۀC¸Œ‚q¦Ñd9¿3)?È:):Z¶í0] 7d›ÂümjqŠiJ““•‰™‰™Ñi {b‰3Šö›†ì µ ðV³è˜ìœš’&JÉHÉéT­\#q÷Û·{o¬Í//–WjÚ›¾„™7MKöåæêÓ¨aÌaPŘ\ô¨29 EPE#ÝГ}¨ír~WlNp¦P/ œc¢¢)9Œ«"Ý3"‹@ 5$HÏÊÍÍ¡7*+ªò+Í›Jü·‹P< ÜUa’\8²ŠtK‹Êû(˜NÞÞutþf{éwá0fKÄEÆL[àM.3rhwç€@ÍÞqŽú¡þì¡â¢u¦(#7€sŠm©¢PûtUmgÖퟅFMxEÂÏ,áðÇôWOˆXËiú‡c›­êŸG£4?'9¤%·'åGã& RíÝ¥ð–yN‚“LUš¤ Êó³›Sñ—” ŒoddsbA”ÞÚ¢.S´øºËU6qØÎiZÒ:38hA…¦þê·­M¿Csò•9ØVf 44Ú3)¨“UÉØÐ÷µ¤$%¼Àî}´6›~¹wáP]ÙÕ,³a¿¬Ú~¾–óù>¦Nçö/`þBd’`{Dä²X|å--¹87*\¦k¼_Tt%?U‰öø ½ŒeÊøWâŠU`75 %ÁfUäâ|JKÎÏT–«ãEÂŒÏyÕüAjÔ3¿ÔÉ´&wál8ÎGB¸l„`R1nA‘Œ¼”Pöˆ`OxäŠJà%ƒ×H¸_ƒ¼ne‡§^äY')Z]D | ÕØÙq}äÓŽ£…Bkt›®ã ¼~èÛ‰Œ&¹Ø,p -é1)ÆÍEmBÏ{õNSÇxIÑ«‰"lePÏLÕp˜yp6-åG{Ç„„y;z©ÊØ <ÝIÆ¢1<_û•®Z$#Õ€¥©Œ˜&zf1‹‘ ðm8 Ó_ ,Ç Qè­¯ÆÂ~ð#†¬Åä-Jñ¡O”í@óдàÝ[·„ãáªÒCgðCŽ8Xɼ| ®­2ÐÎe!¿PÑ=ÚŒ3Yg²M+Iû4UF)ó>ò–“ãsb=…6’N=¾Åö€BFó-Ð8‘ ºnùÓá†â¾^aâ)ÄE…Fª‚Aê@@í’‚HWŸ<Ñ —‹  ÔöÑp`1œÃíßÌ"Ó_Æ¿_ü€2ÂS悸h“) ÓÓâs0‹Ð&ä<ª¢(»C¨MáiÑ]Ù˜¤Sj$p#ºeŠ&`…Z=Ÿµû·ØîÙQ¹ØîЊ„ÛṢʲ¼Æ 3|×M 5“»]ÌÊ®% eoí!ãk@IøþmÔ€ ¶…G`¿'ƒÁZrINH »ñ¤ ›Ù>ÐÁ«anóÁñ‚‚ó¹Þ2òjlYXE¡¬‡Tîï©›d5·œBoÙä-·UúEzÅIÁz`ÕäwÈïpÄûà[ ºžƒFphogˆ¸SØéVéÕ´”ÒB•??ÂS­V‚hž˜»¥Ê.Ï·®šˆ¦!'ä' ñÐõòÉ’–£¢úŠ MwëŸsyP•:«Ž2/Ç~ê6úh9B°ö)?•Ëú©$¸ÄDÛa<¿%‡:RP\NZ§…jÀE ¾Iîß«Su ø#†hÙWˆ»ÅC±ÕG$0Oµ§AVNq~¦¢2¿P‡ª6£h¸tË6/¿ÊÖpÊïÃÍ-p¶žÃŒ‡¯Ñ®¶>!N8*ù•5…ÔÇ4$\¢`?îÓð^ïV¯6{ÍüZ¯ÍµDãÑø'Ãᨿ^„ŠàR: -m?j@YX¶O†2Ušº‡ 'YÎ6õce×? ÆÑ|ÿ© ×½^ùüðÉ€ZÎg^íçñŠÊÉ ä«á.=´LÊOiLiI0ù•gÆÜÀ•”)úM ö?c1£û×ÒHŒ›×¹!Wܼ +þËüé„&ÂÉÈ^”ìEC£sè\Äy2B$"7aã9@Ÿ³‚/ "YÖÄü؈ýÉ'¸ésኂ”¯?§£,xkv2x‰„>p,Ž®ÐYÀ×P˜à FÉÈsqeá˜MØÌ©¤+5ùmïôZÓ(¬ÞU¸ÌS‚ßñvØÛ)6ÊAUÐ-2¼J®… Ž0ãê1cÇã;bÆZÁ¯&Ñ`SLô†HJp@5U¤}Nth§˜/ÂÉÅÛ÷túÚ3ôÆô1ø}G_Ÿ 9½MÅí¢cÆQî²  6ùœÇNüþ½³íÕÞv¢að6Ž|£» žsЏ—™wht›NêHûx»ôUäêÔÈ|pž‚ït͆ÃÈ£EM¥y±‘ ‰±qQÂèð5ˆ¢|tòÆ­¶åä–Ž¹ëvËý…ž±.àj›#–hÂíö)~‹¬Þ‹à1š§4¦u•~¤ï: nPšrûVt/è–‘ïņÕÔ›TÁ{ãAT’šÕw´ä¢\üÊW(Á&¸²$¿á“GDXEŠBy°Wì*@=F l4x,,™Ï°¸Êüçß¡^Ž™â)c>&Û¡OÊ÷Y,õð³wß¶PYñãIÈnùˆ¢tðó~8â»y "…‚ádkAÎ!8÷€™i…Z>ë·«b4&GXƒ]‚~,;·bi—§®á¥vŒÁ[VEZ§G€3ÜJªélÈΉ Ë–ùEëÕ¢«i ftKöÚˆý×í²šÉ¥ƒCïTCŸÃÑzpw M¡¹û#&ÄŒ¡£7HÁWD±£4ÓÕ ™»~ФÀ«R*ª—©zƒù»ŠÁnàRrNA ¾V[E{É\Fn½&&pÁÝCßÜØÔ3N¸¿08«¦®¦¢]ÔÜ ´™3Á{D·®²ãðHÐY'­¡– ì¢WÔGt¡^ö;,gÙWv•gåÕTŠ“‰{L4Ý[&ž6Mé±×.¤ùþ—e-½˜@ehUoÍ_‰Ùï‡^¢½£Ã•`/p(•4*Ë¢ŠBZ>Ò5i:{NŸo¸ ¾¦ ²„‘ vŒ“Ðä6C?÷ÄFa‡}}ðui¹c¾²Rqlû§ÞwÁiЙ}­šBßô·ÓÐøŠyì2ÈcÊr t?_‚|Ñ }‚‹-̇,.Îñ-\„³Úâ .dp@KNOÉG)A~ŸÔâ^ˆA …ŸËø!ˆïé9°li)È=øÅÉPO½°B–ç_hEUa(˜E42ó8©ßBá.¼? á¸@2.<.>Ĩ԰ ¯îÊò‚ÅaAÀLª.iÁ#_’àÞàJ®Áé&]p:؟܇n¬?ÁìŠÎ‰Æ4ø“Ø{56KLé™YZ)Áw«™Ÿi'OOg‡¯®®Æ†®NI“Vp›ŒÔ+5&9˜qpÈÁPÑEUéç³ÎdaU옊]t'½œìKÈNjÆBÑË+H-5w ×Á/Ð9Ù“Í&Š䬾ݟj*î;!Ä @Žzæ/3ÂùØŽcíXÀÚÑAÎ?8X#¤»Â^JUVnFZVf®0·8=äRuþUÞî2™Ç–._:\} FXVŸÝ Nb/ë_M;I°‰ë½º;›;;=Y³‘Ï ¸e¸ a&|‰ËÕêwØüª_KÎÎTç‚ëSEÂWÙ— !T-? Úó¾æ'"{^-¿9Ô‡§cÿa6˜®Ýg+â= MH„!OûAK.ÍP‚CC*/¾š†›ûù~|y8Ž«lÖ¢aÖâœ'ä7y}BXlÈJ´ÁttŒ-KÊ™f (7K›š ²S²S¨§rûÔ”Þ Å.8·?`ªãÃÙŒEYWv¶>ÍÌàÕú©*–\&—­ßKÁÏKÊMNK®JÌ‹*¢V£×Ñë¦ÌJ´YN6&†±Á×¹…‡x%2eoV|&è¥ Ÿ¬¬ú ,‘eE‚3'MÆ%TU¤ħEç£]°ÜôÛŸt¥g1£±ö?ÐÏÑr>†³àµ.n?—9Kƒ“…ÅçØ4Á_FތӃlš€,·¯ACÆ9œ„£„ð Ú3+Š ó±Q÷§â¢ŸcÐÆæ«°·CøÜÄrÛÓŽû=Ï…\WÁ{-Ý­ºëà>ÛŽ“ú´Ø…Q˜®˜#™c4x¿°è‹ïŸdäG‰šìÊ“›”2ÿ‚²ì´Ìœ|a~QZ6(¢Ú%Mnî^±KC›B¨‹hnÇ”´¸z¾Å ÚA#õïfÑ\ÎoIÈ‹ ©r÷Yî)‰êH̺|)¶ä€âÜŒÖ4l"•œlKHI.[Ÿ©4]‹–ÊÏE—Ç–ÅšIßS׃\,»&“ÉI]|z\õzh9ð²i¾Ï~Îò*ùp:3®¸%;[‡35ÖDZÖ<ȺH68m“ó›‹C€»Á`î¡Á’GóJ +ÃB÷¸Eñ0(D£áh¬³ßstTTbbbr<Î!csŠE°ütéa4 ñ–îYæR%ëh¯©j,Œ+ˆ,Fç&bìQå5ÅMBÁý:kÑ  ñ° v—9ùb™ìDY÷:œ;Þ£é;*ÌÛS¡<:¾¸µ³í>NûûGÊåTÝ~bß¾ËE†Œ³ nÌ­ì;HdüËñE±À„%F†:!úØa(»òA‘¨,ÊkMÍ)El·Ë=Ù›£Ýs˜Vó¡’ù´êLaÁ¡,3ƒ_d9x‡MŸsµ´,E¡*B'˜a¦p ÜÕ¬ý:×°OF–$&g$7'Ä€`ããƒ|‘Ÿ)ô"Áå¢â«ƒ »”PúXàì \3èyU¸‡¬Ö (¸LžÍöë¨"â½Ø<ÁöëÜc{#€†™y­¬¢Ã2bÓcó°:Sš~MÊ*5yú ³*´HNæ$g'§Êäì8£B¥ÞqqáÊ𠸬„ÌÄtï}&ù…™ ¯KÈŒ×øÂב©Ÿ»¿WtÄöåÁ¡îIØê‹±ÎHÈE H·¯µ'5-+;+§Ì¯D–]é•«‘,]}Ø’q8ï»ú¸ïè +tç ëãü8./òqÄT*ðX6bªÙˆÉjžÌⲂ\JðQqyIV‰y[‘b³Aõ¸¨U.Á3 ¤ÁÂláŠ\P­Eò-†¢ÎêH1[4ºŠtKUç³ac°Ëo›X±q·Ð÷¬g•°öþâͬ>‹¨gÆaõûÄsÙî>»X}†£»+5ðc>ùÁ±—æ°>`Íîÿ'Bá’ˆkçêæ.Úf\Ò©)nÔý:œª }7ltö×ï û%<\ì×À]Î/¶Ê 2þ‘Ä¢(àTIáñÈ=0E¼UŸPrÌ@UQNWZ*–˜™,"ÏËÈŽ$Mtž¼i²)zFC"¾8)›-Y›ŸsˆíEî•‘ûâr£Kl¡çÀ7¦5|hÍÀ¥< à½Ì7í•å Ø]ÿ2GÙ©^˜­Öm&à 8äójïÁ\æ Æì ÏõŽÀIéíµ{‡÷"°œÚÐas¸sMææ§Y-¾}æßß|h—àÌ}Ú†ÜÑB4Ù£=pš %Wö|-R5Íw·‰\‡“ß•h8WÀmp(ÎŽÀÐ ½ŠÆ¾¹Ér½LU¢ÏLÉJÉ]€¼U|Á„UžtmR‘<É-É!Ô:È%ÐÉWæ (EÃá#¥5 mëubN3±PÀ?Þä‰L õüN(àañ: =ü*¶#®+Âìžôð6°žÚîè¸]áŸ_ç*tª÷-ÀõÈ)*X˜ Â(I™¢¶¶¢²6?1G]. nO(ŠïÎÊ0­ ÏŽÕHëm‹UÕ€ª)¯¨iPîL9¤‡§{”°MlèOÅ2üG.<‚(z!ß%:·SÔoBžÈË?&<Û€T¿¾ U8]JTUÃÿ놀˜ 1…Ëxõ¯¢‘™rSàÒÝÈxÉd …–xÐÿü8 ¾²â&â{&¨|…-pÂ'ÁñuŠBmôÅÊhz9Ò×V’[% mˆºîƒ3™Ç³2²3 Ó nù‹@·ÞÅùá].}4r›…SNñ](ƇÏâƒi8L)5ý3±<”ô|ÙoË›Æt‡Åp4‡ `sÈÙ|G$ãiùeçªÊâ8ëÊG{šy_±5ÄiBà,H½;Bàt­£!u±ï¸M]réÝlãåe#”Û×ywfd‚”L¡À)s1Õ¤çvÚÇ¨ÞææÞcõ‹÷Æ(¼q žˆá9+ª¼±Xçå²ÓÚãð½£yúö“¬Š†K!…‘À…íl—€(˜€ñ:‹KºNÈ=*¨Vi­»8@ꔿ±|ž056]™HÁ#oè¡YÁù¿9oU>W˜›œ„‘p³,®hÛAJ³¥ð¥l}lÇÓk}ö“îH´!á'ÀÅœgc^2¶‹l›Ý÷÷¶¶âc­øaŸèhÿZúm>RÿjËûÌÀ¢¯î»¸Ì2&†o’{k$y‹ ¨ë;“öñq>¡;¼}vá°9³o ¹ŽBéäòB×noH¥š¢äÇ’ª¸3‰”åÑoÈ‹ÚJêõ õ%ÝàØÞPëÙî«™ÔGAoòrX«cí Qý¡CA(Ø ¶øzYERÛ™Eôær¿Ðöëtg‹YŠ@+üؽ˅j¶ÿ˜Zg³¼C­éØ{ª¯¡¡¯Ç·Þ)>$Ç ““@ Ô19ùmû®b¹j`;´„‹1uïœ_÷í38T!$FçVÆä›góóSyÏ,~nv”ÚÍÀúý/Óÿ¿oH Äš~³ŒÂ™ØÎäÂ4ì&7€õŽ.+½wNó(äò%6¢¤`Á`÷N‚“-|wÀ[bGû«ýÂ"€²Qž„–"BÂÉe'öÐlB„X;DôÀ¢åA(imÒÄiL˜éð%¸£a„ «?•¡h„a†£WçÞñaW¦A/:r¬ñSp“zϾ{µP¿‡®«ðqqU9ImD¾;<ýÜåªiîhü¼á€HÛ\Q¬ÔF†¤ÅüxŸè³Ü߸€ LŸ J`Wæ¯È–™# ¡¡èõ…‡·_?uX¢]´ïLñ±”{å ùÉ… ´åì+EßýJ˜å Ö¶ô ètœþåÄåĦ$g&•Gg«@ ° Üà±ËÏÙ_é |ApUj}ZOæCåzmy1Ð…he~ÿgùœŸâBZBÛ|¯êÀº€®¨‡ÉT>¹¨Ø_e¸”ŸÊuS5_jªtàSÃïë:ý‡%¸ÈÌd×Xï IP˜;ØA¡µ$X(Ÿt+¨BV±¡% åæHú9@cßÿñð× $çÍ5(é*F§»‡Ùð ´äÂ÷Ø@—8¼2'-;--µ:W›U(m^à^ÑM‚ùÁ¡–8/e†T‘3RC‹À йÈjÞ0ò:óeš(›iìw9Ðe„@Å\eæÒròdlV<ð®!^[W¢ÉÐËô/m=]à,uuýþñhè2ëIŽùÞík„hÌêV`*5öƒÐøêÝé…‚²õ§š›ëAkAUiqAA±¶£Xgœêª–31•mÿèõ¼âêÎê.ÓÒÚü¬Nœö‘Õ€2£¯!ã ïzg7©L€›_R,Ó9uû‡@K™öh=‡}IïºÔ :¨&Myýέë\‚6¡ØÓûz p—{AIßí·Å˜¹øó]HÝå0Ì[ô@Ê,&…(ãÁ/lSB3fäs`3ÅedЃ–óýVFÆšÌÇ>}Úך.‚ëf?/¹Ž»`O¡›[°DºŒªáëÏ´Ô] AYá‘”-Ű£r‡·ížÅžÎh<šA)˜Ù¬Ãcjá,àܯ!ó[*ÛÚÕútgd°±;-Gn@åeGEŠ=—ãÐýhÁ@›íFƒ¥> C©Hò^J{V}ycyq Û»Œñs¹¢êVùœòÀ*¶¿ÿ>Ö,)÷.wËz;ÿ ¬Ú,£Fàܪ€/ƒ§Ëü1Õ¦¤™ (ç}ІÿL&-ÀÿXçÑǼû‘ ÔÀñË „àÖ FC·žn¨<¨³m®Vë==§øŠBÉOüB›%”à’Þ¯ÔÁnäJ±ýf¹2¯ÞKèÖæ[ŒE±Ø_.ÙyÚã ¸šb=>¾'¼Ó¯ITšïZJ nk+«=9ò¶õÁq–ËlÆî`cvÿVËñ¸ðdÿz“—4ÈÍeÎt{4 ÌÐÎÜ¿´ge§ëÃ-T ¹­Y¦ êö=ñ€£~Wsª¼«JwŠMøKàÊ»ÁwMjfþåÏzŠx§¶ìpìèönØ9Ÿ£¢ÀVe¹];5ðÒ€7z:~;Àïq¼“-²MB­ÙiRÈÕ ÊÊMwNb‰ ú§Ñ^¾¾^î5~M-µ5M;ulë?f/tÀýèc0ÊüC„‡·?8ACG8—N"¸ 9%1-!Í,2/*#PqñqÑÁÕN7‹ ÂóÊÕÑ‘‰ [WyîATlzBvvVZa1;Øqq³†Y®—j°ss„À”YÎÜ¢]q’ñ*Ö ™òðÔ sdfiÞZ]a½ÏITRÕ¶3mç÷B3ž 6¾,?©Ì¼ ´ä6–UiÊ÷…”šJ\¤áN@sý«?†¡¦ù…q¥€j«Öµ¶(««DhºAöDï'¨ï.Ô–†È…‰$ÖñõþMÌMr¶ïm l€ÓG|~‘`wëÏ÷Zäëáçìe¾P["rÚD0üK\wBUÂÏü$ ±H¤`*©)ÈÜwù´:¤VØPì]¸ˆÒAûüx¾ $cÚ®4•9rD"4¹!ã}¯lu¸!¿ AÛ_&°J­lJ9`άÀÅ< ' &$x……Ê£Á:àZî¿_¾/ìsð9ýÏBc8¬¹:*¸PX”V²¸þÒÜ3*__‰g­oSó T.d‡Ž0Ðy‡þ‘¯ËŽ ¡£$pU«<Ö¥ªŠØ9£Èщž€z“~Jo*ª.¨¨Ìk”৺ªÈðääÄäDQ¼:I ")o]`kkµ¶éøÚ&d´b{ˆ‡»ÐÕ5|oÒLj›ãqt›œ¢Ô{ãpõ ¸ú uh3ôÌBôZÝw=pìyØXgêA“oáë#‘ÌëÌK4âó•·‚!—ÍÂ*µ 5ÅáRŒ¬$Ç$±Î¿˜íÓÕt]ÚÚ5ÍÆQ¥ðÙyúmoš,ÏšZ¸á!¿ibzXª{p†*5Pkܽ7ï¬÷9ÖÝXÖÙ äÛ©‰è4oõ%åúr}n[Ö”‚¾Sº øÿL§ââžtØÊ“ “Ë(Èá <0Êdt„mP0–¨^ Mm}…¦±º4F^)ü 󦦕sÀ×ß<äÂùX͵Ú4wÞ™MŸÜ9sêö'Vg抂Œ[ò}&ÌTùº{¨êï}_ßÊRŸiÜ_ÚÏì'.즷ÚÚnßÜkwòäþÞ“'ìl%ÛÑõÕRoÿ/Ÿ]½¾ºFÏöØ©ØX¹Îü÷œ$Þ~ã…Ž=‰MçøãÁßïØÉ÷Hà¡•&Æ$›°™"K,ÍfÌ_”ä^ß•.Ù;Ùz°;X"ööP9$Îx¾Åá= »h$<Ãÿ¾¼á¢®8F•—+ŒS'Å€X–žŸ€)·0RÓo‰ƒ–·ãÀ¦_·ðNð™ý[xìÄÙ­ï±sŠfÔûb¼À±Ø¥ôφ¯ÓnvžJ[@-€¤¨f‘àL|]h“ïië–å`7‡»{P‚œ±¸p½ù˜%»VºUËöµW–7—%䨊Dѹ‰ ‹ÒTµ«Pl.$íìê­póñŽÔêñó'«ffò«6µ¶¾gþ8Zò3JÐ0ð¦7-—…Çâ É=XÛ{Fßp·7a _.m?Ô[ì=MèÅJBä×q£ƒÍîs!5™Î‹ÉKËNÉfµ%Aá¡i9 Q\j˜{³ª:¾˜}Ø×x´ËK·C“œ)ª9Çsæc»‡ÔÀÎu ×—µ›€p¥®î!\­=ó®ÒŽ,½Å\êßEÛñ÷l´õ_<€2KZP®ÌÔ˜éoÁ¡­WZZŠkjDµ7Á%Ÿœ—¤ÑF&–ƒvИßV7`úë[¦ûùï÷O¦3@zRnl^lZrV¢.*3 H( ëñ½B«ºïœtG¢PpêVÿ t„~ó퉈?§oçÖæ¢j¨«§æ xºæÖ½QXæE7j=ím‚Öú9‹^²0?6Å«ì>Xý‰¾GTVSVX¨×è±Ó& Î;}Ûo´5±ut÷ê¸êÖ½A¨¬cOк¿ÖáZÙÓWý1®CSk¨;¸þ3¬2~›IüÌ4i¡¨ïf¼ˆÁ” ßà2»`7݇¸$ « ªJrÓÌtÈ9€<—X¼Adbd¼ A¡¦áµáõáÕ‘Uf»¾SôbP^’y*•Ò¡#dGbeD™|e›ZÚÀáü¼ Þ6dnÍmI°64|;äù©–œ—VÞ¥@ó>d~‘LÏã=¡g§Wp_l`ží9a´ô1>s·^“ *ÍtÊR?eh´2Tx½ýœ3lŒ}3gèQ˜è§}Éö˜Kƒ1Vn3¶ûº€5Ô„×áóÁ©O»üêÝIJqpFd‰R˜¯J‹Q”\æ±ËgÿLJrÎ «z²«@5Ȉ)H.4\ ‡‰´»Aöô´µuïwo1ô6ºØ ÑH:ŽMý¤r«OšTO HMJKH÷Ú|!õtkRvb»RQ˜P (}™¦¾!¸Ü'"2!2@äï§VõÖ¤çƒbª)Hãé¨pO‹ÉVº`×¾Ñ#=2M\&+T¥‡c4(•oM`]InZVÔ¢ÉMÛ—ž8/Næí£Ž !5.-V·¡tRê‚ 4Ö”m¢éu?iaT×qÀgðý{Ü«ŒK7¾j`RÒÚw`¦Vgg§¥¦edвsÓ²@U¨ññ THìš}ÿåò]¸ V˜Ý“ZYƒpŽÚƒ†}ÆÿºâÀ¾ü¼Ø˜¤¤„ÄxaLd|PS2mPM]Uuc¯‹Þz—C “—Pâ¼#t<…†òŸ jÞ3 j2cé¯?äõ‘“ò`Ú&' o¢ræJž yï} ~æH'ö0Ë/qÀ§\8³žNˆKJЉr±Qá|šÚÛ-9Ý·¿¶G+ ,ŒOJNŽI0 ŽR'âfs ¬ì(H/Ë®¥å¦¤¥d„~2† ß+Uæ*Y@P°,8/¢6DÇÌâ=6p#¦ƒRÕé^E~¡™a€ò ö•–Õ¤èDûÊrSÛR“6¨%Îk;Öæ»§Zy¦F¥:iüóÃ2"% ’új‚ëŠJ2 kE5…YE€*å'ïL²Uù'ªA8å]X__U¥/L(ˆ¬*&”&÷¶$$î ÑF&äcÔhÊjõ!¥¾¡ª•Tä¢T%J@ÊÙžúÞŒÌÔt ¸´¤ôø ¿Ö“àDk2¾P©ÌK(báVVW\櫊HPËDNÊÈD÷„”ÞôÒÊCù5é ÒË«¼}½#Ò"ó„{ÒÃRv±þ™V2I•0³Ò\óº Çßr¿Î&„ë˜Yô"G§Eëª%ðMÄ·¯Q䄳½ò]ž^…EéééyYÂÊÂlËu¾:OO©Ô}ÇE‡O¾ºtäÚiÇòCÂ#)ÕY81þªª¬Pß<èckT¾m¬ï\ÓãÙ©ŽÆš5º(uB\ltŒ0$":DPþzßÚF½¾áðºžÅ³7í\jWðñJ¡JA×}þ¬|°ý)‰BîëTpØZ(øn󡨢æ‘õ•UzáßÍgœ™Úž¿y¼g©o–˜:é-d±H»õÔvÑRô:¯—ö§f¥>¦°…?@‹ýOY!oÔF'k@¨¡àºÒCgJC „y[锽)¾@J¡‰Á»¶z—v« i×Ýþô6>2¶DÆßð¶óá0´Š÷&ÂíÛÏuvÃ`| ’§¤ ›+ö1,û˜sú.ÌºË €Cè[<ìhQw³.Вס{0Ñôĉ‰uÍy- × ôD5øw>|hºõØäÉ®Z\{`f<¢\e“˜nÝþpb€›ÚØ›½yž:1×ÀLúò±ÍËVmݼfÕö“W¯;qÙ0!¢Î×0Áy;æ1¾ G„÷σ¯Ñ»ýÃíÁàv"r¨4²§1 —b”Í>'·ë—à«¶{6yî2: pÿ¹%4=ÞQØØ.„Kê"™ Ô¿O¡ ¸œ>B^®lÙ×^â³,M¢R‚Rd” #3zz°‹ývå ¸N*é9ÚWæ>™í˜}  ÿŒÕP[÷8½ Wñ¦óÛ踭bJ· kmÿa-ë9_ö}É…=ý"ºï×›p©–••’ì22’Û’sM[I†![É”\Ж™q Ó,ä¥ä±£À‡I4i59³~Ã)OQ]ˆ.ö`…> Ådrp‰KXk&ƒ+É©Œ?½¬Zrüä´ëJj5ù½ùØïè ne6cI7À±yGþnhæÉÐËáÈ&EU¿ Æä VªoÀÑcàøå{wh`å‹â6沯¼ºµ¯Ümª¥J±-Y(!’Šã‹")V§È·=™F¸îNHÉŒFeEHêÔÅ ¥Àì§O¿€üá]^z‘·^R¼ ê@^E޳²»UWÞºoäÝ9½òÎ ¶}VÖ+ÚáÁ&fœ=BPˬ‚ÇhdE‚åáa+(Ás–ì€<?ÆW²Gâéê¼E9P›Ãò:E0„ƱڀR4|0ç•":* ½ÅN“¬*Ì<òÅ©PÏay@®¼`#¥…ö¿ ä_H(g×çDE+½““âã‘dÀÌTh…x1Ñnq”` º‚Z-šº;3"T›üô‚<Í·p‹iE; ß¼,ÔÉÒéºéwÓD°L‡YŸ^SV¦ ;±SY«2¨cÊ´qóã ¥½òåÄWyD¨ü$¤Èó\KMË ¤òÌ óMÀÃ-äl¾l¾UŒŒ^²Ñjé¢3›>¸yúÌ6Yb è“C—Ší#ùlHåpÿTì¢Îyï³S¾!h]Ìf:..99)9˜Å$¦ç‰à ²Ï¶~ñâ=~ö²âp]¦°<31+&[—‰“4*¿,·B(8Ý\î.r%‘¹§› ØPnuþ]­µùµMÂ,ßBu=¨šœ*-%¸„èF:"Dƒ¡RURÙ¨­ê+2$xgÞçÀOû_£Ñ'+á'üÇ£=Æv¿þ'Æv™ÄJBc츠)Éi‰é‰fùêœø,@eedæh¤]6'D%ê¢ðŠÜ‚Ü‚ôôã—›Ž‚r*+!=&&&A.Ä­€‘CÅ¢y/\KZú‰çÔòâk a/ _½Î;M¢W—òàKÏZ`ˆ5Î[ž5ùÑÚöwk qcj¯³R¾£'ÔÊO¾ çûÞ:õiÊ‘Ÿ¶#KV.ÕzìSGA‡F×Q¢ËÒfdƒö“ÇÐÃ>³Ñ[žjtÿß6ú3úôþÑ%øqþ;ý^ G*AN%d*¿:Ä—?øž¡.s™ ˜C{oðبÅç!ò»Î~p¬Aj]**{Ÿrã2Â2] 2Üq€ÎZˆ†£aŸ,…#êjÒs[D©Y)”eäe§ä_5EKÌÇ=h šö"8½ ·C8 NNÐMÓÑnÑnc8¾ŠÌÑ"´G34MÂÁd\ÃW¡9œ&ú›…Ò.pŽ+¤GÆ>YN‘ó¬ånÿ¦å‚—HfÜ vÓõGGj>¸Éfxo¿ \þ•í5Øøå´û# Óÿ›Ž‡þ‰´¶¥¬@¨6ÜÝUd"Š"?=ðiôÞ:Ò 'Na‘™š ¡¯.&Ý/Í?Z¥JÊ«-è4$n_ºs  ÙF#L'¿´h ÊšFt«[·ÁÎ×ÚCØ?v` v“nö3áåìle¶¾3›|ÿåŽ |Á÷häh4ކ+y¿ê‚u³øp†±áïS“q«/„¢ H«Øél^/8;YÿB³“¯#+æ—î5hKh«ùërÄæ2Ýá¢s)Û–”hP§ÈsÆèLƒDÈâÁXÌÇ|yp×Ũ“A‡D²Óòzë¾/zMmëÞ¶·ÑÙZgšÙËú¢ÛC:}ÌÐK[öûðþ²”>®Ù¦¡yÊÝ[”y*QX]\/øŠ‚ ÊŽœ>5û“F4Ò«Ï=þÏϽü‡æ€^yæP%šÊÌѶ¼åX„¢•hå™Mp%\W¢UgΠUƒß7ÁgV!ü}Ó&Þ??Nƒ3'ñû­õîc’/û¼ÏÝå0³ïr™À,èbÇugóÿ·Vˆ£³Ÿ?·kæñÚñÛ¬öz²~¼ú¯?ùÇÖ ¨åpîß©¼áÿ@åQ«òÑéÛ]möÛÁñeû>&ÔâŸgÔqõ¢Ô âÙœZ@ìbR_° ý?;9­f"Öÿ,gS0eŸƒ´ÿ_Ñ0LØç=+]Ú+ࢊŸYég|øõ-h~™ ]™<º'Ñ…BÙ$pMNvH¤Bà²RÒ!-9´S?µå’ܰRýæâ b@}”ÇÒkýÚ·~lz¸¼ºì§N:¶¬¢|hH7ó;4;·+¼ÝDžüøý¿GÍüf5»þ©…Ô^;ùúWçß,¤Öüƒ…Ô›=[üDÆÏXE=Lj½C éPŠþ®‹æŸ[Òãöïo‹ah‚I2l.ñã}.,UÑ—rè{φ”šþÑm&Æ¡7§Á!j‘û¼ßŽq¸‡E¦åÈž?ÆñŸæäEÌÉç¹é:ˆîÄŒ|f/ˈ—1ŸÝË3–ß ½š±˜†N\¸«Ü…VV Ýxóã³g>úÐêìB‘‡ñÑ^Û­[ìí¶í°?pâDÏc¢'¡«¨!hˆa8|„àÖ;Æ LÑû8ÁúCbô_dÑüÛÏ…ËŸ¼×A!ü=Qô¦Í0L›g#l4—!m’ ig8ÇEÊý?ÄÁO xÀ`UZ¿”Â=ͨ‹†¾¬ïþ4^ ŒÑ Fów Šú Êø7 ê"¸ 7>YB€-!xë.|ëÉä6pžfRî¦+þ;€ n?Çb2n‘>_ ¢–ÍÍöÂY>†Š®‚+2zqÞõ°ÿ¥í#0ìâ»zaÛ£ñùã<ªÙÅÆŸ£HþãÝP’ Q7 #;’²êeuQí Tê[+<ôaûÁ> Éíj£ªÈèøøäX@†”ëØ^U8õÎÝ;p*®‚S¹L#ÓXuÍ"aüˆvõðpunòÜ×ÞÜÒÞîÑì"˜eìâé‰yìkkiÅÇš\DO&u}õ“ºÒ™í¿;½æo¿‚fØü{`ûSðýö‡ÏCÿ¥ÍºÐfXü;Í÷ÏÐp>xÀ…:¸ŸÞ’¢Î=üLM¢yxAdfjFjjJifqz Š³TR mTQ…Á0á?°³L!ãÿ{ÿ‡§&¢ÆÏ~ø¿‡aœ‰4?Q ‚¿ÿð9ºî¿…ßo0~Ÿ×†ÁP&_còÁf¢aô~ÿ68õ™ƒ“÷'zjp2üíˆé˜Ñÿ{@31 ž7¿ì~za4c<;©þ„ÿ%Œþg£qûó-þq¾õïaο&}÷¯æ_ÿ5ºLÃtyv“a²Ä°Ù.Ì6ð%òîA óÞo' ˜ÿq |˜Fdù×Üù þý;Gú4/œ<_„bvÝëcóçSª3ê™ôˆO×!Í&r(’ ö¾Ø†t?¡uÌÇ/Þ·ËÒíQÁS”ûFøÏþ!Êöhäp´ÿ—á?ÈÏGiÜêHÃ,E¯ü›(j‰øÐït‡õyÜù´”%ãéÿTÇ„`ÆÀLø¢øݸ0šÙø¬‰ÏÿŽŒÇü2þYUÿ—wÝÏ {æSý+»œ'>{ö8“(¯…¡}‡û`Šžs“ 7‹Û#é´øÎÛp4¸NÖ:A"½6npØ V€½ŸD ÔüÚ>ÎO.™ ¤Ì”\ Î7ÝÉ/„K:n^ÇDï¨qÔøäJ²vQeP®ä'øE††‚X›¾«.$Ó¼ æm¶›¨t ˆÚA9ó¥6¼ üd¶cð±)‘”˜=6ì—ð~‹*E¥ y&×Âã÷Ùÿw@z¿ÝÃoeÊ|ªò.ú¿Y•üüžÒÒ&@õ 3|à”œl›@)à®JÒ&=9»k’yg%]À‡áA "H¶ùÛ"°ˆ͹9]i” »½L¢ÉhÎÓ÷ñˆ/P*ȺdmH‘…¢H°#&Ê‘½Ø¬’tHÍe7p$ c¦?sS &ÝÅQ&G™~{ŒûÝ;pÝoGÃr>$AMPÙXJÇ‚óyø0bÀÅLáõ“ü#ÐÀ÷šï†(@¡øÐþļßí9[ 7c&ß›š™_5œÌ7˜oø¨±¥ýú %ŒÜ:à€«Šîƒïƒe8àg˜ü÷ÇþôÑšÊÌv@}qôm4Yž˜à)Ú¶Ï£ÐØçP[;éz°žBœ»3!çÜqÝá‰Kmp€£)¸½'¡·ýâü—ÿÿê®Æ)ªëŠC˜ýˆEËìs :‘ÝmSG"µM™1‰6NˆM $“Ä4È4ˆHBÈ(‚«Aà-áËÈÈ®´?!ú°iCÜ6èŒ V͈±:!3ç­šÞûÞ¾ýHÞ[ö»¿àÝ{Îy¿óõ»ç„ÂÀÄCÚ}È?{kzBz⮌dZ½-õÂ0ø ÞþK}NÚ)RY8`ãfPÀ÷dDЦ›H«l¹¶¡9*Ðɵ°_‹Ô ´i-h•I‘Ww0¨€“7Ñ~|9möǨöW%¼Ä.@±ì}Ч•h+ú^{Q-‚|Ð@,DñE/Àè.m›Vß{üÑ*tÿd zX´åáÆ'¾îüA˹kØ«í1õ5\-×u8uïð?Ì®ªƒrªGs=P}Gïù€ê¡Ç< ú3½È€ê{DTSJ?XEžßØÇƒ°$Ž+V0ÁÔÖi¬`ÉhÑQ„M­@«Ø¥ÚñŽúªúRòùçãSwÇÿ©>­µ¤”6–„‹i#­®(7Ü•úê“/ëfÅÛ °fJ÷ ÐÆ¡ë. éu¿Õ’wg†#Yü³³„7k»M•ÍÇu|DÓï¯n)碌Ô`QÍbãï_t?ýñÑÎúøçdЯ‘Gpƒü#¸é“;®ÁG"ó"¬kP¢¹ÂZDxN¹LC¹+å.æ”Û‹¾Dw|®Ü†{~b×4ñ×Ì.á,mÀŒSMÑØíÑíwƒ©{’­ýª´€¾I_ÞÑþ`«Tÿ>Î(”3Ì(Ž®É;whçoBìý#ê;'#Ì«=¥ì2iJ!ö‹Ö#œÛ1ްÊ÷µnmƒÔ´;êV¥ÄÞ¢Ó¦xÊ}¼øhY•FyÙÖýn‚µuÁ·íÁT¿·É5‘¨Úça'œ°kmþDæl^ ·Pš×ûš±ó-˜ì“é|ç¤T!QV \§ìµ‘‚' tNõ äŒ&á9Ùš“x±ãÔÉŽ¶ô†WŽäÑ…GBó óéBZm8TQyúÔÙO;‰q8£¦MÀx(à>´tbƒ<¬ÃÁõWöñwP ³’•_¬‚E%e´±\—ž|ø-z¯›Ð91³¶Ý\ZnzW×óª3=ÇBDÌ1ï¬ÔÎqø7/ÿq&`L^èŠe·qˆ=缡uÛ¡Ä•×im ÄaœR‰àT´ŠºE*ÀiKÝÖÛÎ×põ6ê¿8Y|Rl¡+ßr¹mqm¸0Óo¸üSVÃåŠxÃE‹Øì?p>Qº@ û2Z8å­éŸòÛ)NùΞҜ£9jj4ù僙’2ΦÕÉ»Íu¦ês™®¿¦´èL3a*ŠnxÄá¾Å'ì/êümÌ˶©M+A¶ä¨–Xƒî¹–ªÜ¬¼}t–:NÒ’^ï܇µ'ZKtƒeŠ™Ñ¬Pµô0Î9f•¡8ˆ—v83¹óÄB3{óz:dÏë¹"o^O6HûÔ%<Õ7ñíº"æó»ÁT¤ÏÕ€ý™É5òºð6:ò°­5eÝë]  }%×Cbrm®gÃÊ–ùm±F{Ü‹ò½†!.‹홉ýDk²M/˜ —}¦õ2§DõNþyZõÚ›|É7î ÇpÀ!³æ"9Òì&r‹ÍP¶½]u€Nâ}ëA~««©N]‚8¨†XUwC[cyÅá}U¡¦=Õ†zZ}¶¾¡YGEt¤4ni瞨í¡Á¯¥ 6aŒ[âxÍCq4zfÕAcìvW¹‚Û‡#Ýøs‹™ ÙÙànQ|«*÷PeÖwíXÁKÜ*8373#]÷óz•7å áª8¯w6&` §¤f·¸±"!Øk RÖ`¯ã¢Ý~|çpg¹t»ùÊÄÉB™‘¯€‚´fH}†òtÈ›êE?ŸÜ!/áá4ÁE¶Á W¦ùš\“Û3~ÓÌ&šáE³²qèÖØúÚÀ…~~ÿR; ä endstream endobj 134 0 obj 19707 endobj 13 0 obj <> endobj 12 0 obj <>stream xœÍ}\Çû÷.Çí­ Ë¹¨wgE±&VDÄB *Ø@¤WiR¤‰2Ø@Å "M° RìØ `‰b×XcbñY’ÿ;{‡#Æ´_ÞÏ…soËìÌS¿Ï3ÏLhJ]¢iº¹¹«÷× OgÇ^#ý¼]„S½ù¶4ßNo/Â#ðéó?Œ·§ÆnyÖŒ—5¥ÒÛõnÕŽ-hÙŽѼ8«e+´³‚N¢wÑ?ѯéJ555 5©šL­«Z/µþjCÔ†«™ªU³R³SóT T›¯¶Dm…Z¼Ú&µdµLµ½jùjÅj§Õ.ª]U»©v_í‰Úkµ÷"5+Òq¢¶"]Q?‘¾h¸h¬h’È^ä- …Šæ‹–ˆbED‰¢TÑNÑ~Q±è˜èŒ¨TtSôDôBÄ‹þOQo¦ÞZ]G]¡®§ÞW}¨úu3u+uu7uõ@õ0õ¥êqê‰êiÝ&OšÚ½Gž£üüÃ<Ý=‚ßèëë+œÂÕWÆ®žî¾Š®ä`Ž«·Ÿ¿«oPo…•««"ÈÃUáæéíªe9aúèñfŠnfã'+Ì\}]½‚¼=c=]}]»+ÜüÞª g?_Ï O?ßÀÞŠ GE ¿«³'yÈ5ÔÙÕ_¸ÐSáïàãHŽž ÷Gß WEŸÂÓ×Ù;ØEx=9ïæç¤ðð#×}ÈÒÔ¿À @çOÿ yãcSUƒ<ƒ„÷z’Ë ?7r§‹Ÿs°0šškAŽž¾Š ×Ð á=N® Ï@oÇ0ò^Ò”€§² Áž¾îµoï©puw pñv T¶+P¥v|Š:£vô÷÷S>ë§¼«æýžA®Þn½Ç{ú8*¬Écc‚(Ö;SË¢¿Æ4“à?¡“®³ƒ½ƒ}|…º¸:¹(O»z9ú;V¸xº¹ùú)Ï{û…»úº®ºñá@uW~uv ðóµqtrìçîçë:k´‹_£3qÐXg?òÕ±MÍY³:g­”Z9»ºxz{;:*›íãèLÚ¡ú'°úÚ$å£U¯˜L8ánU§e7F¨®ŽRÞ:Iyj¼òؤæåÎÕ×j¯¼ÏZùm¢zç(Õ£un²®s쬺Uõ®1u.+/Xzûqöñv š\÷‡1iÛ1ÈL9HK՛ƪ§ú1«N[®Ê¶\”ßžªË®5ƒpQ6ä­|ÖUuÑ[y§{¼ë¶¦êl3žª3Žª§U¿‚Uÿ„+T~‡×¼ÔWu¶NÁ|•/ö­{ºî˜”O«^¤¼7@ùíW÷® :Ô9öS=GQÔº±#Â|§îç2}ü(WKãÙnLÜ'šzL2 ò´2ö²=gÖd‹oÇ)cB}œ¦ g;°‡bÆ žì÷ê8S¿w'û!}:;ôí1ô›®s ¿ÕÖ¯Û<£þÝ“8]´{ûó3Å{R~*‘ºK]¥ÎRG¨\j3•NÝ£¾£.R‡¨SÔQê4u‡zD#j#Kü÷Jz½š^CÇÑñôZz½žN 7ÐéMôfz ½•N$~Lo§SèT:N§3èt&Eï$ž7½‡ÞKgÓ9ô>:—Σ÷Óùôº€.¤‹èbú }ˆ>L¡ÒÇèãt }‚>IŸ¢OÓgè³ô9ú<}¾H—Òet9}‰¾L_¡¯ÒßÑ×èët}ƒ¾IߢoÓwè»ô=ú>ý€JàawGÂÐ4ê=„¢³Õº¨YªmP{#ê('ÚIÜÿ,õu꿉lj3Å]f /‘HæIv°ÝÙ–oäÚh[£õ6ÞÝø‡&M›tibÑ$²IISµ¦úM'5½ÝŒn6¨™O³ï4úhx7·o^Üü§ÍZÄ´Øß¢ Åù¿µìÑÒºep+µV𭯵òmu¿H§KgIWK3ZlíÞ:…ëÌ¥k6Öì­9AóC6}ÚÄ´9 ¥£5TëhÑÎÒþ^§½Ž©N¹Î³¶ƒÚZ·ÍiףݤvËÛ=jŸÑþ¥¬‹l†l·ì„|µ¼L¢X®¸ªxÑ¡i‡YÖv¤;öîhßqvÇÝ":ýÒ¹ygEçA³»8w ˩.OººvÍÓU×m¯;[º5ê6 Û¬nIÝÎt×ìþm÷ z ½³z{÷¸Ð3¢gVÏ+½ä½õŠí­Ó»¢Oï>Ö}ûŽï›Þ÷ÿ¾YóÍão¹oÝ¿ÝÖ¯Y?—~7úìÔè;`Õ@z ÏÀŠAúƒâwœ6ø¡þtý³Cô‡¤|c°À rèZC±¡¡‹áo‡å+5Ò2fôÝpëák†?Ñ{ÄÌÿ72w$?jî¨Õ£ˌߙD™\7u2M1baÞÌ|¢y¤ùƒÑÍG÷]8ºÒ¢‡Å‹ÝcF‰sb숱þcóÆþ2.z|ãñù–î–±–7&¬ž(›h3ñ»I³'°jkµÔº½õë-Öxòöɦ´Ÿb7åòÔNS½¦^žÖkZô´ÓgO¿b3Ìæ’íÛ9¶gèÎØn§°gwf¦îÌq3ÛSöí+68¼vŒqé´Ïéçç—F.Ù®2××»nýÜæ¹q×us¿ã1Ìc›ÇÈÒàAKþv@Oá•>ÖûÕ‡_-ñF£Ò %ZÂÖ$è™DóËA—+ƺbèÍàÕ•>b<„Á ¿úˆ¡sÈé¹Ð’Ó˜ç#Öàb¿·•-ÈS2>›ÃêUíq¾½÷fÀ®ê”8F-™æêb³`Qìê0YGɶ脘-hÚ—²nßæ-Û·Ÿ‡€J©–ÐÁ$¾74ñMj…@ö h#-8GZ¬Ê&?+$ÒŠóûËNgz‘áäÌoh2º KFÚø[:ˤƒoHHO‚@ /AL©ñ‰ð„[ZýnⶈÅzuÀc±é³NÐÚ<¹ Ü9ÖaÂLüü'#ÖØáü»Ã늷ì”oÎÌÚœ‹N tÿÍÆ¬Fe”TiB†6ˆg9†J1É`¼·†ÅblÊ@þ ‡W‰Ä0’9¬^#SBÑïTOr“Q’{ó8hSuA z püqÕЫôÁs$¸uUÖâ+Ä8èWrUàaÅDò§- 5ô :ãæÐ¹ôÝM¸ÍÜC%›dÈÎ8‹N¢+.'ô‹Y)¥0cÿYt(à¨Ó^‡ìi› É o0 ‡[r0ˆ)Ïö<ÅÍ×TŽ1¸¥:˜1ÒwWs¼Æwõ)ÇfŒñJ ñx{ꃱV08 —б˜·1N—ÀV(% ‡:d†8Bj8ÆrX¿+¦± 6})ƒß #`L·÷ØP‹Å\Å!Ó]§š 7švéíÛ׮˕ 5‚'䯒²­Ûºk‚‚ÐEc3RÍÉ0¸î¸42yÄÞ©òì©=/¢RT”ºç(‹ó͸ËE¦»Ûš™˜Ø–¿|U|é’¼†m°”PžÛ9ˆàíÅx(ƒåøî×ÄØ€¥UäÜvГ(忚[P(<¯©dŽ^Õbïç «{ ¬ácæA+>Z+5©r?‡[zn^®wžÕwßäašôÖ ·ÆºxžR¬Ky44{kå¸+Õ{”ÞäÖìè.ÿä‡ydÈ7‡Ä‡®ua I°oŒ$$y jh6‚f)~!¿÷0»-‹ýÊ š?‚ ¾|ÝýÜý°ùn d†l}=-Yhì§"Š©©‰mÙë×Åå„(D;ÞCÇgÐü=Íoƒ9\lZâбE‡æå¸¿èJÙ÷>=±:GüÐzA³å¿dɱŒ wp ˜†œÑ¬-!™ó’–¦,?Ì®xÆ­½³'ï,ÑäáI~BÖÌYéÆV›™@hIó׈©*À-ùFLU£ª@19*€–U¬„gù@±Feb´æW«èÈwˆ®SÆuAƒ<Ç™[˜¸uA¤C˜Îî|ÁôœÙ¯ŸÑÏèήseçJ÷ý‚Þ"`ÜÞX\S>dgGÄÆâÖ4¿¡‹¿Å݇tÅMq3ƒ×¤û½n½†fr•6)»$p÷yQ…&ä0 B—Òž:Y–õ’>uï—ËmN™¦buBr]¯ê5Gk+qÉP<÷·ŠÅò8Äw#2xšž)¬f¬õ’öÚÈ÷N+õ<ÊС»N±xî ^)Â"³Ž*¹ýÈ"x@l`ÿgÏßÑ×®_äÓ¸ÁG™Œ„i ›c–'ÈÞIf¯ðˆ Elï™ö}åF½¯W™ƒ‚7¿+QŠ<,&&ïz ë£36p`ɀ΃çÐ º¾…{PZžS'÷*$·²=†pó0PjM­ÙQù‰0(åàà#@ŸoF¸—B|Æ~ò¯œ mÒY« viv±Î•H'ÜÉË»³i]Lt¢ :JÅ.EËÐdåè3’•öýE¢¤âãw*íWqh‹øž¤…ÁÇóvã[÷À-±ú«ƒö¹œÄSGä#%63M¦x$ç-á.L¬ãfß½>ù§Ãï}ôÃUÊù㼆P÷Ò‘‘ºÝ§™mWúâMáå2ùg$®²×[îàé¬WèzïúvLùØ2ý]P'¤ï5ÖlŒ©kg•æt>ODð®×[t •l:¹‡}0äúm1Þ «8£!#ƒæ{-ž…´qÓZ¡›º¸å‚ÉÁör¥cƒ¢ºT ¨z…Põ 9÷¡æZ•Ýü—¼5:‘PÄZ«¼·˜~å¸ ¡Hû¦Xä¾Þ;qŽ<1tKÔ‘p0˜ªµgAÂÌz¹„X¸ûÆ%„Éæ®_²~Ér7³ 7þ~ &ý>±9wgîΔCè(ºäQ`¼ ›ÖrIX’ÙÌIKwÚÄÊj|ðG{<…t¡”¨1éžà‚Ï8—™² x³,!lU$ò`ñ]¥#F¥aÅnYÞi37ÍD¦hºŸË’TF•x®–0©Z$s•Ðös0œ¹1{ü´0fž<&…¡ÈlUp¢ Ò™  Q›ÐÎe0kÙºÞ¹wvæBÐÉ£{½vÛm&‚QÕV%Àߪ“–GKòÑÖe[çn»6y"…~ás#"C–: VÅpHz0û£¹¶åÛq˜%Â,sZ<ÛÝÞzöDBÚfý!=ü¦â9H˜ë»K¾-l}øW:0aćj<ÇÆä.7Ü ÷Á!x6ñÇ`ú‹‹{î”È·ö?fˆîý¿<£ËUþ03„.ĉu1í]Žï3 Ÿf¥®ŒO•½D._³±nQë‹åPDp d²ßV‰<무õ‚"1•>꤉–äˆ(g4%v»)½:Á1è,âæWq¨tî÷\›cCv;ˆGuÕDZø„5tó“¿ yší‡&h·rëÛeRþ¥2âÖâ¾ïÂx¢.@ôÉÄÓ¸mš3ÉŠmÞÛÐQíã÷TQKbW.”auIFôžåIˆý~ïÞ‡òÊó5DRʯ@HÂpâO8þ5žD¿n“˳«^ :&кÚÓ‹À³«”<M0Ã[MÏg‹q7ÓUr܈— Ç0±*[¬¼Iõ4éš-ÜåøNÄ- Úa")9ŽÃ`O‡G0ĸŸ /´æ_«°E–ЭXÁ1FIúÍtìÕkæþ‡2>ŠàŒ( ÒOžxÐþ¨mÅì‡è!ªH;Z|ð@òIt‡å£T榕Bß ­ì•XûúL˜Q*»„õFIÑÖùÎû]KBÊ ‡»ß¯€vr~/QÅDÕàøJMè% ® £_¥1„×c…p4@8êÂ@O2HèÌ<à[Þ®j)®C,A.b)ËÔGÚ` íEü¶-\ÀöÅ›P G% 6¼wÅ]Æá–Q2hËÄ•lßJºt,=Ì=,*bî"yèB„LX-ÔR„MµFzÈnƒkªÖ¬¢ÐbtO;xù­\¸!‚…ž 6nˆ³ñ ßÔÜýÉI'dÅk³ã֬د]‹Ð;hÂJ!RéÁà~U…x _(C ‰ZêÂ;ÁúFs×nÀ"|MLP0¾Æ÷ƒÖbçà«b¸ª’I­D¤r` ÛÙꃄ#0ÆÛ°9NÃPæ) }‚‡ GšÕ‰cäXNè3\õ×Fºçtx¦ôâÞÜÓE;üd¸Jy¦Þo¾•äݘ³˜2³ ´r”Í>=ûõµÆš³,ÂMŽcñÃïZüèRôººñÒN¿«Zg›; õEv˜1<ã|½B¯r^_¸våîùÀ¯ÛçÒ¸‹vš¡¡hbØ$/;ÖËÞÑϱ>¡‰™ ÅgÊoÀ.1ÏÙé2vÚls7y ŸG¨/b§»~sãõ %°†¦¢w‚åy+»ÈÊé\Usfl•\ ­˜M{v&æ#örþ´ƒí§™Œ÷Ì:-Àê¸Åƒ@F¸ÔóçŸ vèòÍ+Üf†Ç|o'ùvè&†BdUN'ØæŠ´ø<μ×I‡ÒJ{Ì7ÿè=Á—0í.vf%˜ÞlJTöžñ¦Òó  Mœtvéo`é¬^é êLuo7 ÑY©¾2ð ×*¾€[\µ=,Íí°Eæ0Ôrq0v4 Š0‡°Æ&£½“òFçrô¶Ã¿@oh7è¬1Ñ%ÜÎ^¾òBk27œÏÍ)A(%lëL¶;¶â.ìŸfhdg=nŒýÑk7»@Hu{a1_Mh°€&">pØ,plA>MÈ9O®Y†šü™D¯œÉ™30ïWoqiµ•>#„©‰—Ãþ ã`7s~ãl:ôÅ=—½‚®• ö¬`Ä «RõÏCWw}-Afþæ³V’¼ÕëÓ·åfmÌF7Xh/xõͰ©Ò‹8ìÆäá³äÕûᬸŠQ'gº*ýÈG:ƒ:!ôV<ƒƒ¥à¥]@ýWO\CçÈç0Ä@Æ,QDwhFþ%–à'¾¯É¥lX·~ÝŽô-ù¨QÛ¸ Öê1«›e8œ÷”IßêÛ{N¤ƒuÞö†îÐíí3йçyLÿ€LúÖ`îl¾«õd{—ñãì÷?–ŸsN.}»ïæÊóíF˜ÙÏ43s(¸tå@a©X€3´¥á0<çp*n ©¤ƒ¾¼$ðd"˜ ˆŠ k2¹˜—árbbR4?=GXÈ'’€ñ†$¤c°~•¡˜ÈHà(ÜQÁG’k ‰ÀæµE9 Ï­ÄôSÐ@OPyÎþ+Ùç’ß“½ ¿3ëèÌë&¹ zé¨×w#üÑ…V{w¯Ûœ,ß°6~íö4·u5j㙾?Zö˜ŸÈ•íŸ2ØÐ~ê˜1·oßÉ=rV^‡Ãà%°¸šEüQþz½¤¡ë,.—¸ã·Œ3v¿c„chòR—É‚^b _~Ã솑⎌')î\ç7éö’ñÁ½ÄzÝ*”¸^Âe’‡Þ*O ©¯‰å$ÒÅM¹ªŸLùŸ•ü@èÇîl®í¿¥Vv¹"ØØI)ÖàTé-´¶šß.»Z"~#¿”àþ–†7q«8ö˜Ùd ææ‰HlŠEåÆÐ֛Ş«uÞyÑ—XÜ&ŠA#3-Kœsü³ç^Âv,{'9¾fÿÆ]ÛŽíÙy P ÷ÉgÁNrxñÇåãYÜÕ˜³ÚŽ Ãi™Ç׳eø&Wžá‰l €÷²Šô†'Ø $‚wi+‚™¼'- $Ë¥í(YÇJ<—Ïš2ËžšÄbZòéØÅ¨m|cõZ^ ðv}5 pðFZ¥g„,f9Lp²í‹p{„[nùv×äýæå®wQ:—uàt§´ˆ­‹xèyܱÌ4{0$±ú^´#d‹ÛFŸxC-†.2XèáèäŒÜ_bøÞÈÌE׈“¸{ÝŽÍù™)¹$VøÐ,$iÞ úrî 0xÙ ½„a/ß _m¤I &r]ëëêÞÕýêÞo‡Üî,ï¦^”ã6c¦‹«Ý ל‚œœ"9ßù=WE0’¸‚áåÄuJÝDãJå£]«ýù㣮5 Sg¼¬ô{I߆F"¸DÔш5m¢¾»KCHèÌv>³¬³*&ÅŬ_¦½}A|r&A‰DÿðÄ+²ë/ÝÏ›Êaª] Nžpm}r*ºÊ’ß¹·dɲ¥ý¥ù4Þ—«ŠÄ£Å¸™„ÄbIªZA¾h«0. ÃDñ‘äFPTNï- 4Òk ¶·D iY~+ÐÄ®iO$ª.¦m¤üv¾·ôu‘O°#1sµÉÈGWØgÆg ý‘½Ü6ºgxÉÖ.X»`ÝüËW-]³ˆ•ÞÇÆ;O饃5Ÿ€Že…[ÏÜ–Z‰aƒ›CïÜ´Û+®k¯–¬—à_'sÐÍpw õFÚ“§ž8½kóŽô­riÅ0禟[RÙŒ”¤Ý{·Íqóñu–iÀ.Á}¢["0'ô4ømÀ-GˆiFœŸÅ÷áªBq>”ÁÍÔ«@K>Œ¯µÐì¾VÈwe¶æ$'ý|š?Þ{ ýH$¸×CÜëèõ– E± d ³¹™]xþlŽƒ±a€7î‹E2ÜTßmìb܆åçšÏ¿VÆymE{Ûò–dÅôÙ¾V Y;Éî;R’v¦oØ…N°@ô©F î¸B<ÌuæÊá“wä@ä!?)± –M`V=e–Åú¡Å± Vi­_´å²à&¹3íä(™Q·lf÷ú9&ò029àÚüá ‚ÐH–üvŽ ÷–¹UËCîBŽ„Ñbh&!̶c‘„o…ÛTµÂJi¨VÌVPAœX#Áy•ƒ\⢵1)KŠæe:¡©ì8û™ãG»ç\]&Ãí˜XÜñÙ·Ð… …?=Ù]÷cûäÒûóÒ .è@ã~×pû!f~Se~ólÑXv>hJbsV&Æmݵ31±%;=';¹–Ï,ª’…Ð\öÉ$x„-–!Ü áÞÅXä7ûŠéNÝ Ð%&h70¿€Ko%Ü¢ùqÇÅøÇ,‹^´(,"*ÍA‘kf'NÚ¯¸ev¼Á~¶KõØLlZ쪕ññ[7¯MAÛЖÅÛÃO8j¥…¥,Ú…n¡¼â5/TùÍ®|4¦Áô2¡ƒˆƒ‡.Æ­?½ÿÙÅôè íºü@¤ÂÜg‚ƒÌË~žmŒ>9µ‚Yv»øìEÄž.˜n1s~è[ùP³ ™+8`]Çe‘€»=°4d«f0Ò¸¼9ÖgpB•©7†lü ±ß|'Á^Àrxã D\M$r…PICÀ"QL%ôBÐÛd˜üfu™_°ÓnÁ…è"ÜÕ30¡<àeÕ&û"Ï‘ðÒq"XÇœq$¸‡gÔÉ™®X˜•ø˜>›ŸÔjèñÝ…D@èáNN¿ð¸:?{¡,çgô=õ{fwîÑK­©ƒûˆ¥§ÌMR{¶í¨L¬6uS&Öº§<>b@O­Ãvb>ŒßÅmrŽ·A3XÜÇ +Ö˜j³5Ó[æXÂ…î_xg¡ïÍ×Т¤(Ô%[&Œ– Òe5TFpX k€š0…ñQ»~" võì'Í/ëMrغŠ1#yým×oŸ‘ 6W ÅÝ"(á͸¢Å©~Ʊ Ã,‚ýîãæ+Øûö$¸Ë\Ã.GxȽ b»x-&«Ý_MY¬ÃÌèg·˜µ_ÉMÞì{=C/wœ>¶‘8£¹„Ôk“±Ä˜¶V&` 4X©.$óGÈÕ[вjÖTFº²ÈÖe˘¶Ø7Çßà`-p?Q–“tö \ê6ŸGx)‘®ÄzG9ßiîÁ“ÛÁø ô„^—_¿?¶'xÚyÒ^¨Ûº–ºÇjÔRú(Ä7D‚4%  ”ùíkвã»V׉¸ŽQaá‚Ï¥¼ðâáBö[zû«òß‚jÙ˜|"AÔ*:¸‚´4”o“îÈ™%›o ßx0:%±GórNd¦G…%ɶ…Ň­±‹] ZÌÒS‹vÍÝá~Ùp_'%[‡;βs󛄬}|pÁPÖÒú# Úì²zN€š8Û}Фã]µ$§Çç 4”²¬x>+]<ÿPò²ô¶QnBÉ.' µœCfEy¡p²rv+uYç²(6¼­/ Y<Öç~iV!:‰’¢7ÌOcAƒ•†M7 ËÀ¹ŒF÷ ç=|Ï8|ÌŽ1¸ïÎuo¡èpÆâ勳~µ ç»ÊÍÔ 3ÇZz;Μé½ÿ왬ý ùï‹ïÓˆ|‰`håznš³óôé¹Î‡æå<ì’;]n«¾}khPPhhp`hâö퉉)$êŸ[ ¢ S”"XZ‹^‰.|öø#KŸ¿ IRrÔTàèm>¿6Y„竦1¤?}#Á „X²••ö\•Á¯âïÞ 2PLðY ˆ±ºr«ˆïU“Þ•3 '7ßÅÞ×¹ ­!Ys·/M¢©ß˜Ø‡V£c‹ÏËv{9à$±|ãÑ”p'/Vºv—ë„-†mqw4lìrÜ‚…6LܱԤsˆ=‘îQ?C…©°iÖ¨;Ûõ˜··Ïî¼zV&56ÛÉýa[h†^”e½g¥»ªŸçô]fŽšá›š——žz4NV—¹:aÕ–uÚÐá·ævöþóèÊvŒ"˜\숆ÑD0Psr‡ÄµëV&!í¬¤È9Aa³üã¶O‘‡N½¼cɤ}·p×é¾é3æÎ_¾t®|Ç9BйÁ ¿†Â7nB‡› Â×%áKý+C8}só!CJÍïÞ.+½yoôÅArõÜ,o×YÂ_Ö¾œY9rxt“«ü+_dxýJ$îSå¢|N¿t4yîâ­úϹº||Žßúªû#áü3̓ó\Õ¹Nü¹j÷ÖÿÔÑS4¸ þm üÌáö XÃ/bÜV˜XÃrˆu{LÎÉ&@—)¸ ùÆD>À:žÂBGUWHÎ}š2¬vÏÊånŘ`]ñ%JA·ö—0ñä‰d½ƒ…Eð”C‹ç[:öío±¸Ý›^ÐíAiæ©|Ù®ŠcïSË™UClÇ™#Öræ¡  ‰§Šå·Ê¶Dßg±â8÷ÑIòG  îÛ tD|Æa3"ã ÂfĈ›Uþ4ÓíG±?Ñ?A7r?ñ\AnÎÄå%\IÙ“‹´7£uÑ;æ%DËaCð*oÔM„;.˜ …ezМ±¬j:op¸ŸÒŽ@k6b‰VVDú’è *Üš™¹{÷¶cîŸâ[iAûÚ¤w‰@¬i<ñò¹ÄÈò+gñPII®âþŸptSp{xÞa=¡æ0¿SÑvâq·G)+ãÒeE’°e¡ËC;%hóîÃ);î ÎBph…õM@OpŽ™$ü¬!Ä–ßVÿ:DîbÉõÀjÂØ¨Òö Qð&ýH¿ºC‡B|QÎûðyÜòƒ‹ÓÂ3¼‹,võ ÍúÒõ^çµ%X¾&jetj+}fu¦¸è´€z¯ dkWÏÔïªÜBLýfj9ûpô!ør`€»Š‘t}ôú‘I°î.;~þJm™á-å\?oÀÁ)¬W%•X‰¿•Ü*ãuüF" "p•1‹ ‡SQH@ߑʜ³È.(ÄÙ¡€ä%X«…ŒÑ‰I×®8qM¦,QSvÿ1Á•?Áã? ïî64@Êàà+7îÂá»7¯ÐèÆË§üÀ"þ ?Š‹Î[”šæY`:š¸ŸV†ßâN¸ão 9¨_=ÿnµ¼³ÔÊÓgbMœŽ?û!¿äòÑ“×Ë{ûãáäã†]a8 Nà FÄîz9FØM3Šƒ¡Ð˱ÛýŽãöБÜeíAŸé\ ¢íjX ôö‚Zé£/ìHunTæ|6𫬠IzvímºÚ ŸyηxÞFúŽ@•YÜfæxÌŽ9ȉõ˜àî²­ ZÖ‡‰í[2õböÇŠ†"^¥#ú,“Â…™Ý°:´‘¶ã+m¸i»ûO]´rÉʘXméO3Ò¢W¸m4Ÿ¡u0pã¢ô{­ýn…9Á™ÞéÚ.›BVÍFÈ~žK ÑL·a«±ØüñI0ô%qÖcaˆ 4Ç=ÞÈìpWqм£îts#£é¥oß*½.¯y¿RoœYÐ^ç3 OÈÖŒŸûy²Ýæõù V~€48ÜZøÜ­…æîÝí>µW?©ÎÀ†ÖC˜£`wæ›×G«·ápÍUˆrù&Ü0Þ{TÀ~É?TØŒ[ÂÕb­Ú2ç;*÷VSìœR·Ø¹ä‹ÅÎnH¤­Á\çÙ?ðŠ­ë{ÅiÊ+¾WÜ Û‚bQ1è Âtò¿¦!ú|Â×¥,þ‘Òšªaà\Oªª "XËÇ¿!€Ð…`–ˆ¯Í·ºýPp6ÐúG0ø4nˆ .rO™ý‰s=åá’˜…hùدˆLbßncæÆ/‹C‰ÑÐzyÜÔ”ƒ)Ûv£Cìõ™F2Ueù#qê@½•ožçä1ÏVL`à?ãT°£~_|6ʤÏofª*å uª”~ÐÀšf¶¾–žòÚúd3¡>ùUu}ò?TVNúûÝ'Ñ(ö?tXÖmk=Á ‚ñbž?X-…Ll¸©¯ß䃼7D$eÌ=‚N CÂz€zË@‡ùt=Á ëÝ@&w˜¸v}MgvØ,ÿÙqÛ§ÉC§žž³{qmÇvî¼åKçýC‚‹õˆàÖ âTb{çSÓÙBÛßG!C€§ òû™¸æ-/=&çh$|‹ ¤r$7ÈÌlðà2Ó;÷ËJïß5+,«^œël;ÝÙeú ç¼¢ƒ¹¹å5†¶Úu_ ÌÑ¿et¥ƒq ØÁ‘ÿ}1#Êð]]»þ?¨®Ç1¼Å'^ðŸ£g‚ýžÕU1]AÏ]à˳º²%}‡Õ?ôþ<¦¬'^Wˆ¯k%}ýg„LÊ‚¹¯qp«¯œz¬%±a¿wpë–¯W:8vQR’ÒÁeí_-8¸ÛÐÜ„Š#c¡â(å-W5‹HÔ,†·VÇÆ`Œ›`còiBŽÈ ä&ãND¦ ò¹øÿß•\")u•JNêÇ  %Ì&û+2Cß-˜Üã ×½nÁ8«U¹<Eð”#ŽTžZ|úxù®·(ôÞëgër›Sæ©X",ºÀç†0¢ z·ˆuGPÆ”‘æše¿i2@CçŽó¶ŸíêaAnnû©Œ]®c=þœ¤i¸ðôgÇ?CömØù½ú 4{.‚›Â}–ÌÆ-kââ׬Y¼9+ùÖñä,tš}0¹XO×jZŸh´8v‘ì)‡V°Éi99ÛgFFt-3œä=„…suDìj- ŒPà©¿&jÒnÄ_ülñp°Ûïàà¿oÄôÑüŒ?ú“k¶ÎüŽ‘§•v¦zWé…†—qIÄýuiñÖEQߺÔÀ\†¾Wügå¯9ßNý«/‘Ç”Ú(](Äø!úý?¢×Jiý`ó…2¨þ‹‚ÚßN70§üQø®ÔÑäûÿš JÛáöD>kÄÅTMU‹©^%Õ]N¥P.§j{ÿtÿ.¤Ä1Oî¼oÚ}Ò™áдÚ)ÂÖß-¬ú-u#È÷ú'ø@‰|§\®6D|s‚|-Vû6ôÙ¯X“˜8¶ÎétÕD^ê’rº Ò" £E^²jeYý)ñº H×gNÄ )ñûûçpHá?+l~'l¿jÔúÛ·dnû«@ÿ6 JógKœMìßX‰{}^«E¶:â U¨^Gz¥ï:4XË÷ûPÄRÈŸú¯2Àݲø¨¿ÊÔý©ú1ïZUÌûïˆ>Á¶g”µ¹l' Ý8ñaŽt0–4”bù–÷‡Ÿ+)ùêm°?X|¶ÿxé»+,ùl·¾vSü ˜74®6ᬬŒ K“>K– —¹@3ñfؤ©Yvæwío¢}hwüÍ4ºK ý:#Kd{xöF3©ebìÃ,_GŸuhcìú›YX̤³«˜”§ÅgQÊ ?7½8­QG7™ Üuìæ†X[†¼ç3E¡ùäµ"R¨T©”ß ¡ýs°x›žiZ9Ú7ªhCh_¥ñœá§iÞ…7büæ ?·— ÂoÀ[1n_5ã ¼aîã7ÂŒÙÂ'4Ÿu›«ŠìËG2•íÕ«„e$¸ég–“TÚöWiRHóU•K¸ªpÆ y¯pZ /ª¦jáUw¯B(ióLʈ޶$áåÚ‚ä;l ½xùÒ˜˜9Ó–, ‰ ^*ìñœ|‚ç“0e#óeÌIíÍ&3Ÿö§*ô¿°¤¡Ò§ºF!^³ÒŽÁ„è|23¶ê5ýÈSý«"ÉçÍÍ‚Ÿó ¸ˆF!ù¦èMå·\üªSikWîEÚEh_XŠçîÛ†£Èoy`”¥éQ¿„)ȹDxzÚÍð3G,¦ï|íl^E¾,»l´AoY˜EÐ÷š9ca˜³ ŽT ä"¿]ìéà?ÔÎ~2b­¼Ž|ìÅoåg;¥’ ©àãRh~„s±øÉª š‰!š`_Fy¨M1{Ît/±ÀÄ87GÆ 7#ìÂM]"‰Ù±N¢a{å\nƒ­«X â³ Xó¬à @øë/qïãý?tápë_wàɼw¹Õë‡BXRµz~0þtÖàxÅŸOê¶æΊ‰² n¨È£ÎÎ %…*4´ÛHŸü»ûƒHµ5Ë¿\€¢4s @=Dè–1ÃÄŠïøt7-é„Wük«—Jb§ûØE±v’Ë+ŸFwØ·’?a)ÛÃýz .<ï0ô¯M÷ë>Ú/`þ° º,lùÄN ز{wÒÞ‚ƒò“gÚ²moÑæC¨œ­Nç6œÞ}B¬OòÊâ Ãlý=-rJö+œ›²(uY:ÚRV¦Ç±ŸL®T¨,«;Ð7¤ÖI ,ê§•JVK'ßÑiõ><îéTýRaFèË“öÅÞÄ´ÖxÇD¡Ùµ€Ôö$èßÛD]Õ|bCcú/v ?¢^P®LYÕtÂàA1é< â`êÚ7t'xGÙiLKÕ[Û’º·ëp×{ÃÀ(Ìñ÷"ÿøäéòЩgæìª7Iº`ù²¹u*]j¬€•^ø¯Piß#üÂ/Z‡j-y|“>óÉ왚N*¬º®o@ÿ…Y±îðÃÇz>åÌ6èªS+9Q– ´w°7ˆÛÊ÷øPJÔ#'°G…z´kQ!×_GX«1}v t wô‘¯ÒgŸËý í;õÖ0üçÝåëÅû8òð‡æIÊ’÷L»Ç srw@SYËÃnw’“W®I“I"¢ç,Ÿ‡X·ÙÛ2ówÈ«ÈÏýX>£V ±‚9ù—¦Õ†à<ðÿÊâ—>*û¦4(JÛF«ŒJ©÷¿oV¤«ñ¸ªó º?•2¨ìþ9ìL\^äa¸S[¢àûXT£+×C?»ihkyÌã‡ô¤qÂÚ„èå¡ÄnÙ{ðÀ¡òL9^%¨“A}uŠÔÉŠùQؼò_ÝÍÏ—·ù´bè?”úa ËÏQùk·>„=¼qC ÞzÐàËe¨Z`T[‡úÏïÙ¹T6 P¤†ðA€@ü6Ò9ÿCòK£{Wù6¨0_Ï[ØÓ@þ[_V¦–ÿuÙøX™RG_â` ØZ¹ñ£úW5ˆ û ˜%[ Íj8ªœòõþ”ïê;Ug†›ª -¾T"ÖÏ‘‘X>mË›ù§¥y$ži‚i´¨odaÚãìì,f€‹‹²Œåóô¤•k” ¹¢• ¹cY”sàrŽ\`®äs¤°û×îš%]ý¤Aêü³;qf4à5þGó"—>Îv}f‘á?S—5ûc}ßgßð¿«²©»‹b~EµøC¨xô‡_ÌÔðøFùŒŠm>Crj÷—¶Ñ.«?ÉU-*›*ˆÐÇ¿‚ X†u0ÿ'ú©ôó«6#$¶K·ê§/¯½úÇò>«´S«7³+«“[QV·‘^ûv„–vƒóp¨¡WOŸ¼•€m…—ÖŸ;y}JXC•0>S¦ò¯Ö¨hÙ×–¨ÔnùWTZXwÃlþ;‰Ç1»T³Òà/psàJ‹Rî‘[ƒ‚vºÔò"VŒÆÚæ’Mxp}¼T.op·ÇËõ*­jÇÿ„¯ÿâÐ[æ;×½˜p臺²!äÝêôQ:á¨ð£Aç^“R<ê5âõ¿É*VÀHÔÍ%1‡’3 ײ…ãåÓ,‘>ÛY¹×éçt¹î¸Vcî hCÈ ö{”J óH|PTyö=ùÛö”}'?y6aëÆÃ¬@~{W%ù½¶„fÎÛ¦$ÿ';%¸¿èWŸÏÐ3cëÊu{åÆ6³ÐLÖ²f58.ãs•¼;§ä]¢ßÆêmÀá00"I"Po°ÿÊÈ»2]@\'©6ú¨uŒôþp{€ßMJX—E Kв…1 Ð\¹j~\øº¥ëQ2+-G; Žå°uöÊ­AaOnÖæ*þ«¼‘¢”w©c¼ në§ê²oßöUšIÞU30jQtd”Ÿr ²Q‡ÖLÒ>*Ê)¸šÍ~Ý&À_=ï6Џ½ú¥:ÿå,âA¾mÝÞ|ÄíÚö—G#í‹{Ay{ÿwÿ—ÄAÔ[|vT•3Rå ‰vvV‘Iˆ›þ§„"f­SÕ°†íµª>âPÝEiƒ„nžüꕜCº~íÆ7ÿ•»•~>$¯Ž)?6®ò:ÊL©û·/¾@ó†D÷ØöW«I|¾´MÊߨܺ|²âQÕ¿W7ké[ñÕ|T×._ç9åëU.|Šjƒ?µÕº´oß¾ABÖŽyíŸó™$àŸYHRþq©Ñg8¥rµÙaj¨âñ'©²¬ZÜ0YªÅø£8Tãëºäéüò´þ…0æ¾,Áuýµr!DÅ_¬/µ½%&h;Ÿ†I¶ÛhÜ:4Æk›6…ëš6£¨ÿ¸´ endstream endobj 135 0 obj 15288 endobj 49 0 obj <> endobj 136 0 obj <> endobj 32 0 obj <> endobj 137 0 obj <> endobj 35 0 obj <> endobj 38 0 obj <> endobj 138 0 obj <> endobj 14 0 obj <> endobj 139 0 obj <> endobj 76 0 obj <> endobj 17 0 obj <> endobj 140 0 obj <> endobj 20 0 obj <> endobj 141 0 obj <> endobj 2 0 obj <>endobj xref 0 142 0000000000 65535 f 0000060769 00000 n 0000318773 00000 n 0000060620 00000 n 0000058246 00000 n 0000000015 00000 n 0000004379 00000 n 0000071770 00000 n 0000071622 00000 n 0000060817 00000 n 0000062502 00000 n 0000060899 00000 n 0000295326 00000 n 0000295107 00000 n 0000314654 00000 n 0000275290 00000 n 0000275075 00000 n 0000316077 00000 n 0000254767 00000 n 0000254551 00000 n 0000317400 00000 n 0000071474 00000 n 0000071506 00000 n 0000071536 00000 n 0000071568 00000 n 0000058457 00000 n 0000004399 00000 n 0000015131 00000 n 0000073520 00000 n 0000071917 00000 n 0000238073 00000 n 0000237845 00000 n 0000311974 00000 n 0000198317 00000 n 0000198115 00000 n 0000313254 00000 n 0000216348 00000 n 0000216129 00000 n 0000313400 00000 n 0000082492 00000 n 0000082524 00000 n 0000082556 00000 n 0000058652 00000 n 0000015153 00000 n 0000019156 00000 n 0000084246 00000 n 0000082643 00000 n 0000200838 00000 n 0000200624 00000 n 0000310724 00000 n 0000093218 00000 n 0000093250 00000 n 0000093282 00000 n 0000058847 00000 n 0000019177 00000 n 0000025340 00000 n 0000094961 00000 n 0000093358 00000 n 0000103933 00000 n 0000103965 00000 n 0000103997 00000 n 0000059042 00000 n 0000025361 00000 n 0000030290 00000 n 0000105676 00000 n 0000104073 00000 n 0000114648 00000 n 0000114680 00000 n 0000114712 00000 n 0000059237 00000 n 0000030311 00000 n 0000035311 00000 n 0000116391 00000 n 0000114788 00000 n 0000190013 00000 n 0000189808 00000 n 0000315931 00000 n 0000125363 00000 n 0000125395 00000 n 0000125427 00000 n 0000059432 00000 n 0000035332 00000 n 0000038246 00000 n 0000127117 00000 n 0000125514 00000 n 0000136089 00000 n 0000136121 00000 n 0000136153 00000 n 0000059627 00000 n 0000038267 00000 n 0000042835 00000 n 0000137821 00000 n 0000136218 00000 n 0000146793 00000 n 0000146825 00000 n 0000146857 00000 n 0000059822 00000 n 0000042856 00000 n 0000047856 00000 n 0000148537 00000 n 0000146933 00000 n 0000157510 00000 n 0000157545 00000 n 0000157578 00000 n 0000060020 00000 n 0000047877 00000 n 0000051706 00000 n 0000159259 00000 n 0000157655 00000 n 0000168233 00000 n 0000168268 00000 n 0000168303 00000 n 0000060220 00000 n 0000051728 00000 n 0000056068 00000 n 0000169984 00000 n 0000168380 00000 n 0000178958 00000 n 0000178993 00000 n 0000179028 00000 n 0000060420 00000 n 0000056090 00000 n 0000058224 00000 n 0000180698 00000 n 0000179094 00000 n 0000189672 00000 n 0000189707 00000 n 0000189742 00000 n 0000198093 00000 n 0000200602 00000 n 0000216106 00000 n 0000237822 00000 n 0000254528 00000 n 0000275052 00000 n 0000295084 00000 n 0000310701 00000 n 0000311898 00000 n 0000313162 00000 n 0000314571 00000 n 0000315832 00000 n 0000317253 00000 n 0000318572 00000 n trailer << /Size 142 /Root 1 0 R /Info 2 0 R >> startxref 318999 %%EOF Node-path: powersupply/itest/Bilt/trunk/libMagnet_V130/Modifications Be549 V420.pdf Node-kind: file Node-action: add Prop-content-length: 36 Text-content-length: 66687 Text-content-md5: e62fc3c05137a574cfb918f5b682397b Content-length: 66723 K 14 svn:executable V 1 * PROPS-END %PDF-1.3 %Çì¢ 8 0 obj <> stream xœí]˒ݶ­lïWp;Îpð"z“Šl/;‰-)öÆU®ñèáÇH–GÄßäOÈä/²ÕÞH€}@‚÷ޑǪë)KbO³Ñè¬XÍEÅúŸðË'»wçwuõøùÎÿ¢Óöïïw¼úv§ZQ7•PFÕ¼­x£DÅUº~¸{´Œ«è×Bµ*þµY*^ëüËþ×ó—¬ÝÀ¢Ò­…*a쟚·]nÙ>¿ËYõá»Ïv¬V©’?«!ô{K×Ô²ÿo ÿûòIuç~OÕòÁj&ªû,®ë4s¢â=³Ukxݘêþ“Ý;{÷þw;KBIÙcܰ{燤k¦…âôÀ¸J{з=HÔ­æéQ‘µd\ò,Òeij­„Ptá@J «záH)Áe¾=ÀçSÊgEÞ»*¡ô¸¤Ç¾3Bd‘z¤ Ç3`ç"Ë}­¢¯= Œ?¤<C{Œ³6UÃÊ‹wzP[ &ŒÎ·ØæEê² FbøÜõPk¡›©é5A ŒšÙ9í²ìAÁ[šÑYšÁÏg±Ž-tÕjë°*ö—–É&5e„Nµ"µhf¶Ó)ÎMê.Êp•GòfŒÁë©Õbt3ï.²Á'¥e çzƨM ÿ”‚žÓ+Ê—7ƒFK¦R3°Ú”*5ƒ¤(ÈÛA§„ìò-zCè´0yR‚‚Õ”:Í r®¨œóyÐ ¿x+ø" Y3ÆÏÓÔÆ%µËsú"§Úæ”Ö9e˜É`—gBZh×Tg\ôùFÿ‹Oñ3!L0ƒ úúcj?ÀE@çAΩ ¬îWŸÙ$§ÿéÓ…ð¯¢Á¦3& yÚ‡vj*ûyá+€&¤2Íþ¯Ù©lÝpi§Â²6ÆdŠìÖ%#$3–Lù9¡ƒò»¢‘§ žåô¦òò/Ë;/ip¬90=òq!Ã<÷†ñ®Ís|&J·?pê°SÃ÷ûKÑ PæÝnìÅÚø¨µµq€w/­€ª»ƒdøôÉœÑûsÐ)HöÊxRláÝu€x&±7W*ÊÅ@DX€üà¿g–õš'î·lIPñÿ“2”@{ço¿5• Ùe9Ÿ Âp½ ž²É+ÈìËTM9Ý{wNy©ñÞ“„²Á­lZ|ýTdƒ€ Ú;?ØdJËÃ)§iËžÉZcÿÒåÉZ„Bl¾à¸Rf[˜q9#"ÿÛ.glÊ+%“cÛƒ¸‘íB|Þ”Wö úId4~‚1o!‹Œ"h.‹LÍ`û*³œ *û0R-Og9Råó˜/ AeT€$€§å«±É¾ò¡Ý’Z`™£• ªÛÆúˆÖÞÙ__ 0=- íySƒÉÂ¨Š ; ¡ðuÖ$@~e$|Fû˜«.Y•ÕLvÑ  ¬ XÆ ‘oÆ0¶óu+Òš¢”BñšmH)&ôSJqJ)neJñ‡"“}’xó3]ÄÜŠ²ê&‹Þþ"h¸;èÐKÊ}~†KõVøö«"ÙƒÁꈄ²¥¨Ü®Œ”yÏD¿ó|¶ægÅÀ)Ö¬Ó1ÒA:æâäKŸ¯èºÏ2§|$Ÿe#ÐQ´/~9P˜aì‰0¶•ø$`Ü™tÖuuË˜í³”µPÞÚÝH«y«híˆ6óö•0‘›–­ºpjå€ÔÂRäò”Èù=ßk#Z“‚:&Ì‚¸òÉꊜ7ĸµrî1ÕŠæ`=VRPX]vë÷ß-&ßJë-Éw„~[³„½'L`Æ ø<Êæ{³z)ÁÊ‹åAbu» Ì{]Eõ¯¯þjÿÿΟӓ¦ß¤ßVOv¼3]¸ÚÝ@†RÑcÿ{e}Mj=Í›xÀD`İÌ ã³Ý– ¯d#L ÓñÉ®"€v {|ÿôÍî‹êiÒ³þã´Ãß÷³mÚOLXp5Û3Ûñˆ‹ðè[Ð Ùp¢¹p²œñ°Ú‰Iî¹$Ÿ R·<à¨Ç=_…çÃÄ8é2ˆUǪ\ë¿á|2ÂêØ…^õQÜã¡:H v‹¼õÆþ`”ic5¨Ž¥zð€Ià åšH½hâc¦‹ý¹ô£QælcýFTJõ1h‘¸XÓÙX“ ?îÐAØ¥òÒc wĸ}M±2Ç9U­o“ÄÌÚÝxé1å¼ö‚ÐþŠ2ðÄåä­’lÔ…Y#h“êï°O5Ý6œ’¿žF6•'øº¤-.Nç[Œiùr6g‚É™¸¢cŸ_Q, ‰WEÚ|}ùeÿí$0®o)¯(Ö—ïh¸ÿÄñ\ÌR›”Õ˼-E ¾¤ÂêðäÆÛ$µÒl”`>ïñ‹à„4Ðq eðZ‘s–=`Ý{ž6’鼦ÊW,Ò§ëé‘N’Á­äµ=õd $“ùÖò¡foã+éðŠÍ/ùÒzIAÀ<€¬"Ôd¤7ùPèͰ×êLÙA¾_ä8ã6;ȉç4Ø>Ø¥ý#2íômïqQ ÒÊ u«´¶ u«½Þ4ÔY©qŽ{ìNƒÝi°;Î`÷‚v9 5‚·"UCÌ(èðh0p懭½F»•ú¤ìììÖ×'#ôÓæ€7´€Hkä l Ö¦À²éÁë­›3Ñç7ÿÅQº'm@"uÍé3is0W!±.0=öõ Ù„áêqÆPÛdrEGÀ?ÆFŒP„‰pz¢ ¯DxŒHLžDŒ3h]})h§rS 1bÎ@B‹Xá1&1bÎ@Â_÷HøÇ˜ÄˆHD8¡<)¤’#™v|¼™/·:\ÿTVœ —ÊýãXÙ³Žµ?t§öão1 20»ÖÎÛá`­º:™£{fœt R{s]îm…Ç‘9¹çV›”Fd-îY‡Êã½ÓPFÆý”£Lp¼ö› :/ŠCT9ÙÒ¤Ú¢*mìÙÁÎÔL–ÄycWäïœ|ÍÌ}'vP5“(ñ¯É[$µÎQ¨öQ'R €C-4vãØdËëßqÌ4s+M£`Óx‚Cã^l©iK£ÒŒ‰\skíË둹ºò{d¯0ìðB¹Å¦Ñnâcf³7T—-·ƒâý…æÂ ,(ž€½l> ò^šp¥j3&¹w-Æ—$‚)([¼¦ä¯ÇLA.L±6ÍG§3tÂ8œáç–O¦»¼üÂ…ƒÑTÌÁ‹9¥ž ÍkaâªÕÑL♟˜D…­_(¡ÌÜ™7ÆÂä-×5¨PfÅáüBA1œ ÕÇsúÓKP½¹ s\€åu6Ø¡ý×åèq ©¨æVÀ9˜Šs*|F±LrÞ¿3!LÝ/(OʸçÞŽ¯WÒ–ó>é%…,(hB5$z=.(û€PLäüˆÒÎ¥ùå¿\²ZŽå}­–åà† Îôš²~QvÍ)VþÖ™X'e;A¬(»¯ªÌ·mäuØ=k» oxÏhÙ÷(À°  üÀ­…GÉX€pÀ׊‚yÑ …àª>ÞÁ„¨ˆ0òf4œ¥ä&·~+VSžlGè§dû”lŸ’íÃR²S²ýM¶Ï¤hkÉÕ¯š).|ˆ'’lÙ¥/{à«ÌåA.»dŒÉe—múPÅŠ:nëü È«ì+EÇ4P›îCæ„N*›²¯MsžS¶–µpÎjYÎà¨Zþôš"3Œ˜­M§ËV–M—0/î²»5ßüõæ •M™ÀÌ×Ýe-;f[8 ·4*¶€ñløxéªñöu¤²Agõrã_mÐYYx+K €õÞDÖ±lÐeYÇ¡öµ=½öE.oí÷pÙ]Ùèä/oõ‹zñŽÜíàîóò³•ë•¥ø²è¯)­½w€Uc05ÈÝ3ZæëûÞ3 רãµÿ²IÙÁ½¦%ÌØÜ0Ê}ïW¦Ò–‚Î^sÆÂùKeXÎDZP„1œ•ߟ76ª©¹î&0˜0ü»£'¡ûs€1‰ILžDŒNº6BMœô} €« Àý[?<•um„HÙ €ñH¦jMÔ¬?ºAÐ ’hjÆM“Ç4l‘;MÏZ?Ƕ*u“ì“'½µžtúșzòMìÃ,]³ZèñÒÙ°ÆgÃâdÃoÒ†¶Ð.¯n¸+• ð«÷èÄpqÖË5¼¸a3ñ0¹êþ%ñÉendstream endobj 9 0 obj 4535 endobj 7 0 obj <> /Contents 8 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 7 0 R ] /Count 1 /Rotate 0>> endobj 1 0 obj <> endobj 6 0 obj <> endobj 11 0 obj [/Indexed /DeviceRGB 255 <000000FF00006B6BD2FFFFFF666666FF66667B7B7B6666C24A4AB96B6B6B4242 B1F30000FF9090B1B1DA888888737373B1A1A1FFB1B1CC6B6B181818FF33337B 7BCC6666B9E33333B9B9B99090D2DADADA8888CCB98888FFC2C2424242E37B7B FFE3E3DA9999FF1818FF7B7BEB2121B1B1EBFF4A4A8080D2C2C2E3A9A9A93333 33F33333D252529090E3DADAF3CCCCEBEB1818FFA1A1999999A1A1DAB99090FF D2D2525252EBA9A98080E3A1A1E3EBEBF3080808FF08087B7BD2FF73737373C2 5A5AB9B1B1B1292929FF4242E34242C2C2C2E3E3E3DADAEBF38888FFF3F3EB90 90FF2929FF8888C2C2EBB1B1F3FF5A5AD2D2D2EB4242E34A4A9999F3CCCCF3A1 A1F3C2C2F37373D2FF6B6B8080806B6BC26666CC5252B94A4AB1FF9999B9B9E3 B1B1E3909090B1A9A9FFB9B9D26B6BCC7373212121FF39398080CCE339399999 D29090DAC28080FFCCCC4A4A4AE38080FFEBEBFF2121FF8080F32121B9B9EBFF 52528888D28080DA393939DA4A4A9999E39090EBE3E3F3DADAFFD2D2EBF31010 FFA9A9A1A1A1A9A9DAB99999FFDADA5A5A5A8888E3A9A9E3A1A1EBF3F3F3EBEB FF101010FF10107B7BDA7373CC5A5AC2CCCCCCEBEBEBB9B9F3B1B1FFD2D2F3CC CCFFA9A9F3C2C2FF6B6BCC5252C2D273739999DAC28888F329298888DA9999EB E3E3FF8888EBA9A9EBF3F3FFD2D2FFF7B796FC949005E770C2F0F4F7B82899EB 94F741F7FC9490F7B84E6D892D05E770C2F118F7B77BF741F7FC949003EE8803 D600F713EE00016FF7A2E3007DF1C2F164000FF8DF0008402004F7A3A0C40000 1F200C000FF8000000C4000CC40000DF0008000000F713E22A001EC4000CDEFD 30C2F18CF7A10E03EE8803D60000000305E00FC2F1A800E44A05E0F8000032F7 B9C59A3DEC000030001DE803B600C2F1E000CD7C00000900CD5C000000FF92D0 05E10005E17003B600C2F20400CD7CC2F21000F56A033238FFFFFFC2F2780010 260000300021F9000028FF92D0601232FF94D0FF92A005E100F432F805E100C2 F22C66E8880000006021D3FF92D0F432F805E100C2F26C66E94B00000060D91D>]endobj 10 0 obj <>stream xœí} Oi–¶s1Ónó!H ‚Âf0IX&|&\‡5Ù| .FÁËe@_˜ F€Âm#I‡ÉÆÍF ¼?tÏ9ï¥Þ*@fâäö‚ Æ—AçbSHôïÝœiñ×­ôÆ |E ã‹`c±ªw ~~^±Iäo*ô%1Œ/+óŒÕû'6+6Áö³ò3ßBÁxo¨xÌïŸh‘¿B_ƒÁøhÙXœ{2PÜ]ï÷û»Aø¹«ÁøFp3¸Ÿ u‡zçªxƒñm`3Ä¡ýÅÐB¡¹3…¾ ƒñ…н±ØTõ$„xRÅÓúŒoþ`0^UÕ47×gî3ßî÷nãKñÅ•_ }) ãËâ—¿ßߢ©½×Â`0 ˆë}…¾ƒQT³ø3ß(n3ûŒoÑB_ƒÁ( b· } £0ˆ²ñg0¾MDÙø3ß&˜ü Æ7ŠëìûŒooXúŒoi&?ƒñ­àæó ¿_/äã®ü­µ_ð‚~ëë…¾ã7Ÿ·øWz—:7®|×ùžÔëFþÉ|_ôÒÎÇZÏwTè‹`0þA1S/‰òW6®t^¹Ò Mþëyä_?ðùþ—?× —Âäg0.‰ûÀxã †zõn,Zm;{­Ñ÷ïÿ[È¿ñù²L~ãÒ~'(Ÿ¯P °”?=4NÍ=óù’¨¶]¸Nî–ŠkI2ùŒKÂOt¯j©ðw^¿¡üѨ1©¿•ˆbë»V€ë´aý\^ +?ƒqiÜDÅ‚G3”ñ9¿Yï›üA2ß—ÌØö?˜Ïd“Ù$\+?ƒñˆåïÓÑXçw6å¯Öä§:!YhåÏmõ3@~V~ãó0°Ñ¹!Ž&déO+4:(^S…6‹;Tþ7…¸VDi&›Aîù³>îçg0. g°Sµl!@“äÔÂ/Ò}‚ü€ú@ÿd6+²V~㲘Yê\zNGcADgç†$ÿmÝÑ×*óý¬(ùÔögüÙ üŒÏÅÍÅ`pf—‚ ý@AþÃh4-ϱ+a ~D~¬øù²lûŒÏBïÒâRh³Â_ BÀ Èo ?)¿¦~mf¹ŸM²íg0>þÅx|1¾ø!þ!aø$òGÑ}¨üY‹ý…·ýÄþ$Û~ã³P¬ÿP¯Š ,Å—üףј>¥Õ&üÙB“?+J~äüïòZŒlܯB4‰†ô_ôÓL~cX¿™óg}ÉÆ|ãÚèëöð~*mwwyxïã×p:üëÙY8ŽÐgÚÏú_{jFTüPù“IV~ã3ðóœDÕñ c|Ï|¾?(É—ìÅæøº½©ðþ~d?Lã^ ¯6œÏeÀéò*œFàùRûíkÎó¦J!ßÇFôïÉRw]l\øc0.ŒÇOû逹/GõËQ}IÓö'³è¼3™Tþ—­½ìÚOõS¤û€×ÀíÝÿ>ïçOV‡VOV"«4æá“?^:,ÃÔ¸`þ¸èë“I¿;ãâ(Ö?é}ÒÛ;ÛÜ\SÕDLíóŠQ}¶j?xnâþxžòçºà>)ŒJt&ú¯6ä\|xHpÿ%Š?6éýáKöSvFùýã2é—}D8bò3—¿7ê õÂz‚ìŸû'£Øgé½:H’éGÔ8¾ho>±OÔßGþ*âõONVON]~ûס“!|t?ŒÊOQƒØIì›ç"ùÉ÷Ó ¿lR;òñãRh …B+ÐBž„zç~3 ýF²o R(¿Ãö¯ãß—ôO¡‚£éôzƒ¾çgþ£C#'CC@þW-å—ÒI$Ì€AäÏ’ñÏR¹ß¢>+?ƒqÜX‘Qèý-–Óoúœ@Ê÷3™yÛ×ìu%ÒôƒòHÈW¥ò¯"ÅÚ:424´{‚äÔ틤63¾ùµðgù…+ö2Œ‹âþ€ÄÊÊñÿ/­7¶™õ¾,ÖÝl9n^Ⱦþyð°HãWQ×ÑÞíæì¿ündhw„„ÿääDÿ0±¬? ?|á²uvƒ~Ó÷[®„•ŸÁ¸8~(¦FüýÿÆ›NÛïÓõ>‡ò¿ÝGîKáO…SaUëá‚ ŒüjûáW#€¡]Š (þ»ïÎPýQù÷¥ö'ö­Ó…ògÇůÓ0ëêXùŒ‹ãfw1Bñ`eÓxÓÅô'E_ßxÖ$s‚È¿¿Of=œŠDVwÏ^*ú½GvGFliÿè±DP_†½³U•õ§(–XÒß  ~Ö0V~ãsð˜È?V,B¿ÅxÓ-çÝüY[Á¯Qr;ùQ¶w‰æ¹_¥ðCÊOLkþð[úÓ‰ ÿOê¯Ã`üçUo_"ѧËj–Ä_¬èa]+?ƒqq<öuwûíÊŸWíOf{¨ânöóß½Šäߗ‰h½>¢Z?æûCÄSú‡FýÉõ[oìb¹ÈIääe¿êÓ0®ËýjjU‹`åg0.·€äÿ@…ñ^žîõ³Rû Û?Ü¿ M°×zg;ù‡PÞIù²ÞÙCê¿Bã?tbô…_î6ŒöŸ:û¦ˆúBû1Ð"ž¬ü ÆgÀß]è®Gþ#û7'´›å>_6LÿÞÕ« I}ª÷åŒ÷ND±ì=ÁzãT ?ÕûOÞ}âÅjî ågÅg0.çâ›þz’ÿâ çZ åÙÏ¿Qgâ*¥ü²à×`¾Òä¦b?°ý­¥ð¹·Èþ·ôŽóý„é´˜‡œØ×ƒ¦Ÿ'ô0Ÿ¿±¼¿ ù³¦ïÏŸÏ?ÂÒ/¹i6ß;¥þ!)ü#µÞQÊ/»úWëg££Ín£€ Èr¿˜Ù“dåg0>é3Ù_ßíF~£“?ébûß_¥”_VüÃ~¥ò á7ëýôRÒÿDŒðÇ©½‘ðnÿiUc|Øö3Ÿ‹XßðþŸ-úÍ8O±­á—Í_Ìc„_Ò?’Ûß=#é—"ÿÖHúÿ›Ê}¤üb€¿œÜüO¥vïæ\/7#†øeiF?Oèa0.ëÑ´wÂoÙŸ¯üz4 ÖûòÉß|ÕÈù#‘HûIûnûî¶³wgTî“Å~hVfŸÃ”_)ÿÍ ¾4-(Ùop+ŒÓ¼½€/“ŸÁ¸q±®–– „fÿŒó,Û~.ä§^þ„®ö›Ëøà„>Tþ!9Êgä­Áè¿êœ_ð%åËñ½)ç„~‚ZɇÆösÎÏ`\bîîf ÂbÿŒó´‘¿áêUQï¾GçÍÓ}ò“!1ÆG)¿9ÌÇÈù‡TÒ/föÐJ@ûûgy—lüàjšóN`0‡\¤s`ÐßüY‹û.ýüS ´ýªÚŸ@ÛNÚ/çõœ¨‚ñß\ÐkïJùMåˆ~`üö^C„îê˰ò3—…Z¤³bsSð_°¿þ†óDSùÝ ~ V¹’~þ”X¿/,øIåG¡·­æ·÷VŒÔ·ôÐËy8Ù­”?Ë9?ƒqY(î?ž©ûÏU~Ëõ»ÙþI³Ú/&öÐ^±Ž‡˜²«¤ß¾”gî?‡dÊ¿z"‚)D(?.äçø­ŒZÊGäülûŒ ã0z]ùgff*Èúûgœ§ZÕ~*÷çð›Õ~k”ϼ´ý‘°š×£êýNò{½§ÿI¿Ö}±–Ìùû Ǩ}]ìϰò3—BßmuWŽŸgfn û+Ðø»“ß>³'o„_s¾ò‹¥|(é²ÿ<ò{ñž# ü/UüHøi^ŸsÔÀ¸X»;ÃÕ~ã’°îÁûóù'>Jþlþ:E??P_Tûç§§kÐöâpÎõœ¿;‘®^ÌçO!õ÷‰œíùÊß®gõ‘úæÊ{©ˆUïK$–moÊÛu‰A>¬ü ÆE¡ïŸ®æÆïåüëæb^Ùd&ï뎤í—+ùØjt¹ß£»wz:<üÓÙÙªÉâZ¾“ï†ï´/ù›‘KyHåŸü¤ÿ\ƒ!q]õñ#€ø7ˆûçVû¬•2if ꃜu ñ“S{‘ý~ãûXÆ;ûixô•}a®W¿þôŽº÷iBϪ¹’O¿Èùé ¯:rþ.P~ZFL(¿ìyàî~ãÓPm¸þDz§]ÿ„ë¿ucJ/®Ü]:utw»+c¸ûVáûåœÞýˆõVƒ^»ŸîÌ1¢~{ÿðoâ^]«ÏDÂäÏÙ®¥±Tß±'‰~¤±}ª6yð·øWa0¾ÜÖwáõz®æ›ÂŸ?¯Ù6+í=Xt›²ÎÈIòÓHŸÈ~*%Ù¿&‡í…Qßi!ÏœúÈ«= Ÿ`Ý‘{]?Ú~rýÖÚÝ„F½x¯yûàäßè†ÁøÊÑ­¶Rþ_**Ôð^Êøëýÿ7ï>›ôc;ÊïkãŒvs˜ÎÇ 7Œö¾”ÔÇÁ{â†\Æ*^'CrmO9£'<šÃ?ï5¤tOÖûS{ÚEO_FŒñÑø[þó0_/Ž>ïÍŠMIý‰s¦ôz3ö™=”rÛoו벆øÒŒ~q“nû}ºWmkôâÊž«òîÜrdßnûnX ðÙÜ/áè7œ”Â/”_oÓã«EµYïÚcÓsúüÝ3y¨±I?òÍ·mÎÍ‘îí£Ûõí«™}4Ä_êÿÉIÎøDîäÄä¾ÝgõóEð wíWâmÜÇ‘ý>¾cƒqA˜äÿ¹¥E®å1¡–ñšÉûÀ¤©üú>½öþþvYò»º/²~âp8bQ(n/Üë„_Ýw>¢—ñÀé¼h$rÎk—Âï3oÒËýý Æ'!jÿ—‰–‰½ŠW½¿¾Û…ü9Û=»ô}zí'Í'(ë$ôr>á”pþ’ú«Î¹w«Öd¾°^ÄCÌé‘ý|ùƒZ³êf]jØnÜßÏ`| ¢FOß ÿ6Å}¼oOÞžŽå<|IºQ¯“ü¹°ãK¦ù}b–®S÷»V¾§¤ÂÒò§h= ü®¿æ}Ä»7žµ:ú4Ú?÷ß„Áø&`*ÿ¦céÞn—›vÞ›Ê/´?›qŽá?KÐðþ«2éW{åb~n#ýÞ™sø#j6_Šfó%ö#®“&3bÙn›i½ü¿ƒñ á¶EþÇzÝîz¡ûn·ëäžÔ÷ɂ޸º£ÒËôòNÝ)¹œW$üSÎõRŽ„á§•»ÂF­…?õNy±Ž‡-áQ> ƧÀPþ›@yâ=4y«¾üu"r]û‘üI`¿Ë Úá”è—Py?!Ü;÷bFOÔŠ½ÒóGhh_äìü¹“ìp°i?“ŸÁøD«£êf-HzÁüzy—î7åÕd²–öÌ¿vP:ÚŽºäO…çwï~däýéðÙ‰òü4¶/uÒ_°aªÖ”ýÄñòƒß?ŸÁ`bzxïc}{nIý±âWå>>::ZoþØŒýWk¯ÖÄj>Ÿ|Qê§á½Â\^Î'žÎ`0ƒQq·¯÷—n…1BqñÀÀÊïŸÁ`üCã ø~q´9f˜Ügò3_/¢Ñè!î×kæ÷WZ }y ãï…ê¨XÊç9¾˜hOªÜ…˜ü ÆW‹¾¨ä7t/–¢~Áäg0¾^û¯{½cHxE|IýÞ¹‰B_ƒÁø»!Åš_Eh%´‚¬³/˜êí›cåg0¾b ‚ôGBÈþf>P¸ÏÊÏ`|ÕÀ¬ÿ@wÚˆø`ø‘úMMþB_ƒÁø{¥ÿ7ú^¤}¯Ð|ä~0(ˆÇk  Ø`D‡öí×­ØÚ·Û[U;/$`4 ‡ý1íÙ÷hýÿÄÿm1¸ º¿|'€þz«îá`90>FB=»S‚ìóîÌvô:hØp%FŠ’ÙXÚOe-#¯C;à-¸³0ˆ~¿£Ž–¯ë0Ïi[hÃìÂû¢Òƒ!¡­r– ±J¢}Y]ú‚­…E”Q<ž‹åü–æ›Òo ì™MÐ<½G> }®öŸ>85èoñœ8ß¼ö Ù­h¿$‡‡ØÐ¬K7 Žá@÷©MXE÷#hÃJûG%ñiwËlŠñ¸5yKcRøIý~;é—÷‘ößOM‚ðO~?e6EðÈ{`?6ê#í[‘îÛí†%  6¤=vÏZ%ÿéÙ >0_qý˜žk„-˜·”ŸœB#n©šFxn´¸ßˆÜo´´ß&þëkmD×Ú ŽDÄGšÙáàGhHtr?RC¼/ŦP|—dÇnÄthÁ}â|¾ê)U„—ÜïÁ嬀ö¸¨º‚,nÂøp‡/ðöZ´è…XçÒ"ÿÅÅ¥xü7,ûýWÓ"ÙýÅÅà´ ù©Âm«{8‹‘òw$?p\áNݬ`{Ñ2à¡é‚ž:.£W]ûï -ðUvà7¥á é“uóœ’_Í=ôõÓ 1V½;++ñ¯áÃø±jØÅ.B}—(3viÒ~öôþÁyÚo×} þÞšMøÅ4gü›=pŠ?i¿Hš…ðÛÄŸ( •²¥ûÃnÀÝ~up«ßˆyªßO´¿µ,èkR‡bÿÔÔ䔡ü¦P1`Usaý¿ßކ͖´£êߤð‹½]÷Qõå^„€VKôÿÏ5ØTN`—}|Týy¢;<”ú7ZÍzì'í·YýÒ5°é>„‚kZ÷1àëT@(ÿÔý§OÇŸ"åi/--5%ßd$  ‚~´ÿúÔ”ð‹-ké?ŸêÿúǽKAäz$þŽþöaì>¼ ;ƒ6ò— ¦nÕŸ1⸠‘gyžö*ëLò×S…š;•m·­c«Þh¥çE>ùÓm•Èö¨`;üNG”XN¢m–ªJ ñ³fÁàSèoùý\^[ÚEûÅÞ]û ö›ªoj¿®4ÛËk¦ò?²ë¾Ò~Cù×µÝ?’H?,µ_‰¿Cûï’ðdXÖz/›¤~¿aü%ó—…ç—Ú?)ÔßÔ} (÷ úÀý)Ãú;tÉßÞJÛ¶!üZ÷Û¡µ¶Ãó±6Rú•ë—–_ÿXk¿|¨ÂÀ<ÑÞR~“þ û5]`ìÊoñ^»WíWºÄ¿&ŒÿS²ü:ï?Ê/Ô_˜~|HÖKá—q€èýC)Ñ^k¿f¿”~8øAZ±vµd~’¨/´ö —Ÿ•¼'êÓß²šüõÀsäz0ø¯ÿGûýñ½Øè„f#êô½Ù鯄ò{ªù%ëbH¢K ò÷É¿Ùu\uü-²ÇŠ®ÏzòÈß7}{‡¾IüŠ·dzº#`½”D¼úð½@삾ߌ.Å?þ¼"à=öÎ×þ½SS÷Úß,ÙeßEù­ò_3é¾~<Àl)¿®Ú]­ûÃ:ëwhÿ­~Cùïjí_6ó}ñ÷kí—•ïʯ´_Å€×È{tû–÷ÝŸ²åû¢¡÷Ý*”¿µÝ,á[[-ÁoÕOZûI÷üHÿg†æ«ä=¥ü˜üká×A e…€®FWt5v]k¼ÖUÛu­ËUûµî“í¿&…_Š>=¿Mè?E’~ÓúK`©öãš÷ãvíÏëïùAi&©š¢¿ÔþŒÖ~"¾Èõ³Û X ±òG4ÿÑ¿,mtv¯t^±‘ŸJóŽ-¨¬M“Á®ö´íx0 zh7íÑl‘ßëé»;1›'­óp£Eõ‹Ù<òÇ*ËËMò{^D©œ¯È§:–Æ«óP ©óô]LùÍBŸ“úJûEÕ/m¯ùS;GûAùO䷴ߪó­iöËðHª¿¡ÿGÍ–ö7«¼_è¾,õ©@0_i¿æ¿%ýH}þ»†õy¿~Ò}§òkö[¼'íŸt~Ù€1€lD€©ísŠ}ÛDúvÊûÛ-í?&ío•vÍ¿`¾!ýó¸ÕKÅ—ûg¦öÏ+áGç¯6Óù§„ô7Ú­€Úk°á£K‰¿Mû­Œ™MýI÷§ïÔíéSÅþ[ѯÔHdª?Žâ/ÆõÇ•ç_ú„Û·©D⟥[júä--Í‚ßãP'ð|ã xüà*þŸ¢èþ£þËÿÿ°ñ ºïknm"}O“òƒ°W")Óƒ“-$#ïê<1'ùït”‹à±Yzñf]™†(ìÚòÈuJÛeRoYâ xÚðc垎 uõÙ‚€KÏŸ—”ß)þB÷õ]´ß©ûμÿ•tkpdïÌKüåi¿Ðÿõ#;ý…0µßVï7´_øÿ~³âÒ¯u_)¿ ·–ÏÑþ)ËX1à{¡ý´ÕñÚöŸ„[$þöÎ@$;Ðÿeë±ØTõï™,ø¡òߟKñŸ¯12~É|!ùêXûS5–æKÆ+÷/F¨íïß…´wA+hç/»~|o6Jd’þ÷¥FÞ/CÀ¸¦©©û¢Ê/{þ¤ ûb‹¼3¬Tÿ¬ ½Èû…óÏêq×¹•.@ü?ß²qeãÊ•ÎNÜÑ3Ä‚¥ùcuTàv´Z÷»‰ìÚã½#l¬ˆXX$U˜̦¤Ü´ý^ÙùîU¹|ò£“Ç‚ßV>ùÛ:›–Ah:0h¼„ÏâW÷Űᢠûí!À .Í=çGíß;gðO>ý8JþÍkhûÖ_Ëÿš~›ö«´ÝMùlõþa©ûŽa?*Õ¿%^P@‰ÿ¤j’úùÚ?µl)ÿ¤*øOé^?5ö=?Ù}cô=(Û/ˆ/°-+ôLº/©ÿRåüÊjŽçIúíŸÊ/çµù¯‘Ù¾­æ§´^°¿F¿@î×BÂÔ'þ»û±èÿãÁ5£äoÚcèÏ{½·[YúÏH¿/[©æ½Ùß/¸}~=¢¨€LþÅÞÒ~!öº»ÏVðc˜’ïJû´-íÇç´QíÏÙ´_qÝÅø“'x`y¿ÃøËœ_ê>>ÖuÙïÐ…ß>pØÔKû‡UÍßÈûupKÕþßAøûoYù¾Nío˜4h?)Šþ“†ðË1>$ýTó±À>þOdþdÿ[·[e ÀìÓ. ~/)÷©„_Sÿeÿ ÿŠþRþíÊߨò~Êú)é@•üæÍ í>\#×ßEY?…gÚoØ~=ÔGþM²_û\¤ýOu¹ÏðýôœQIáû5ý3Õá×#R~â;²_åüTû3 R¤ü¢»O0ßÇ÷±wEîñ7µÏÒþ:ówjÿš«ö»´WfÞoô£@Ð,¿ììü_äû‚þ„ñu‡ö÷ëš¿‘÷[)¿½Ãó}cدCÿyÿ”îó³úù•ù—%ÿ)ìé{=eËù ío•UÿV™ðËÑ>ªòGy»RûgÇVŸŽç­¿Çbä¯ÕõW£³ÿFÕÝ'Jïßj÷Iþ‰÷Ž´ëý.ôWÂ/ºûóéo9Ô~‹ýV©Ÿ^«:¿òšû2ûÏHÐ#¶¬ä~ÖªøgDÕ¯ÇR~à'ºûðQhž1 ƒÁ`0 ƒÁ`0 ƒÁø\üƒÔ endstream endobj 24 0 obj <> endobj 25 0 obj <> endobj 26 0 obj <> endobj 27 0 obj <> endobj 5 0 obj <>stream xœkhÙDÀ€ endstream endobj 4 0 obj <>stream xœc`Ù endstream endobj 19 0 obj <> endobj 18 0 obj <>stream xœíX l×=3óæÍ@ƒ¨ÅŽehJ°ˆ…‚CLʶ‚K©!î¸Çu0«‘©EID ‹%« QÖׯëR„,d¡ÈM“.Ô­hMÚ”’(@,J ‹Ï}þã€EÚ¦jUyFgîÛßûî=wþ‡à|R¿9Ô˜«ßßøÈZZ’»¼£Þ÷€5qéê²$VòˆS„únñº‚Žþ^#øx²ð¹Üü«~Æk@ÿ%¬/dCü.ÿ¯,Ÿ&+,)[ûü¢–÷X~ˆV\º476Ÿã½a%¹k—;·­|Ö}6&-Ë-y.¦Ì¾¼teYG½ÿdé7ºP/ëîF G¨½º}‹_'-÷^N¥*íc€]G¥ñ ì4Ú­ÈQ+ Ù¯'°í$ÂD¹3“T+m ”s§RVÛÒ?õÄ6ö½ ³Ñ&Òž‚=Äl'ÙiwŠ‘Æ=6ןg'båfw4V™þBl2óçP—¨r¶!$u߃ôY3¾’zä»-Ñߪ‹Ä1ÉF÷õxš: åš;ãXî§Š±W­ˆÞÃYï “È!2œtŒ%ÛyÅ̯²ßÆlïj¼•;†5ÄJ7 ³ÝZôTB©Ñ¼0”ß3Ú¤¦#M'FÛÝä9mÈฑÎUŒr7¾ý¹ÊF†žŽA¹¶‘EýáÞ@õxGoà{Äã ^uº)zRïÆoô·Ðè^B„²Ž²ÁOÂ\çV©KØ£šP© 1—(ÕëQ¥ó°Æ+ÆF,*¹^e,=²PH}‰6~™î¬ò4¶ëíÜû8ªˆjâUgÆzq(ðFP·,"f_çǽiMâÜ©—© 48_úR¬ç×ÈP‡¬¹Áø.¨C”­hëÏsûmÞ0–C÷¹©I[ìF×¹ð¯ã‚@Ö ÖýÙÖµÝ]Ëw}™^:÷&Ü70„zþA5ZoÑ>§ôüBoÂ[?vʲˆtûyô§ï†¨wØK fOñD*Ña}‹D‚ãdoãÿïY/ÙiHwo#Âöˆ{Ûªó†ÙOy¥˜'pg¢^ÀòiË ýbv\ì}/8•H×ÙÖ¯ü"dË~‚qÞ ìÕ§±ÐàŽº6l=³ÜmHWû¢w¼zÚ~>¾ì.A2ý+M;ÝIHvZ£ï«$ e¼Ž$’‰!ª CÝ-œWEŸß‡Þ”6%\:ƒºAœb<Úç.‡¯"Ž{´Ë>ªwôVlž¯ÎÂ×û0Ë{»Ü LelET×Zߨš9b?®Q´ý“¨ìеϯ’óÀÛÄÇ:Çô·z§°Ê±±Ç bú#ÞûÔãçP?¯•:†1ZÇa‰Û·CWê¬Ì»N>T°—¿ {ýäµã¨g¬Ô{pÂkÄ~ï÷hô–c3ÐÞDTÛ-(á> aSŽâ9…¤Ì¸)qZk­äÉVú`"Vzcqœõ0ë'(ëbò%Ú:ƒ2B¼æ ÈÝYN"éŒAÑß§ú0įEʃâŒq].\)<§›)±®É]Sð´“€;†? Ú&›ò2±Êð(P@?És²1À®ÀN¢“ì í5ö]æÆ‚³žÜJxIˆ8SìÇÉ›É:‰>9ÛȇÜ혡ÿŒ±n5ýê: Ý#䴙䴋ÈS-Ô§)êýp3¶;gPªî¢RmÂæƒÝ€ýj^P[P¤Î ¤™£f’#‹±ÎmaÛfÆáÖ`!õ]龎5êï(d|Ôé9'¸~˜þØùj5J˜×Šœ‹(²bpˆ®@œó ú9iè#9Ð=i-–(<*yPx³ÓÞâç™bœ#”33’\+çĬįä€@'#E/æµ.ç)g˜é̉ÞêrÖ7 ÷1·HN’ücrѧóhP6ò…äÉY’/Œ¯W%W~"y(ÈI’32Çœ±äÚEøG8Kò°ðPÀY}Ñœä"ú½Ïã%á$‰s‰{wxtñƒ¸ÉÄ<9W8*8û@ù£kŒuýî_’s•µ‚³ý¢¹N¾ÄGbãñžw³üŸb·‹”>ÓO^tæ*ÂMÅÆ'^F³{¯» ØãîÇV½Œ<÷®ø’wR§±¼¼Œø*Žz>9ò y8jÆdòÌÎçøm³š{3祥Tlè´ÕÃä÷DbZ¬Oä1Hy<ñblñæ-»ZäÛÑn¶&ßw.ÔÙi@¹0ì°zSÇrþý‘5ž:çúç½ÙÖcFŸ³ß5/ÕÚãÕ˜wù‹è/giÞ-Þ¼g‡Ów/t^þL¬¦o,1˜!ðúr¾8ÇoìkÖ–wA[ðõd¢a÷æ'ýæÂüfi&Âú#‚¶f® ;-Èwú#\{J×à —Íý 9/æ/~ÿÏ^0ß3䈀'î¯ÛÏ tŠõ#A׺ð‡ñÕØúFfÿgÎßm°´ø«±ã¢k\ŠOˆH ™Ø¡/8_²~§ÊqÉÌô•蟜&ûUUaÏq¿f]÷&Y¶ðMÚßÈ\áÁÙü³üâaε˽;±Õ|î2%ȯFg‡•‹dó£Ñ6-òKrr4jZ,\ ÛlT5xšôøðÞiã‡&õëÛÛÓNJûõC55‡¬^Ö£G>R[c'ÖÔÖÖÞ}·¶Ý×ÿë5¸ûî¾»ïî»ûþ·n¹ìØ¿¶ pDX þâÁåÿ»ÿo\ ÃÌS‰}®Yò-Òñd]~F_6¥>´Ÿ|±hÚóçN›öõ‘ L3zÊ33&¤–¥¦šQ°vÀýW¹†kÑû‚ÙÏ™(ã¬Á#~RÿãÆÅ½&ÞÀ#¾inÎú0+íÕw7úužÔ}ó¼þÛ®r endstream endobj 28 0 obj 2200 endobj 22 0 obj <> endobj 21 0 obj <>stream xœÔ½@GÚ>¾BH»)v0ŽDÇ=ŽkÜ{·±M1Řދ †*º‰Þ{¯î½÷–b;½çœä2K†|ÿÿ,8Žïâ8ÉÝå¾ïÇ’¶ÍîÎ<Ïû>ï;Å,ÂM°X¬ç­}=%oìº1Ûsi3=Ù€~™V ¦•?Îå¼LX”°ÇÑ‚ç‰Ò— ¢ÔÌh2uìÅÉÜ/LætO  ðei¬Vk˜õ“×à3sƒY –¬5Øl°ÃÀÊÀÞÀÅÀÏ Ì Ú Õ@c 5(5¨1h6è648jpÊàšÁƒûŸ|eðÁOl6û6ŸmÆ~•=½½†½‰½ƒmÏvf°åì(v<;•­a²«Ø ì6v/ûûûû:ûmö'ìïØ?r Ÿ7äN2|Åpšá†‹ Wn5Üihmèbh(1TF&fê  Û§ÛìÙ;cÖ¬ÙëEbyˆ¯·Ô|ÞÒ¥KÍÝäæ˜oð”øz™OÅ?Â<Dâ@Ï és+OOs©§¹—o€§ùú]–ö[wn6Ÿ¾y§ùfÏ Ï×sËP·_ws _wÏ ‰ç s/QˆyÀ؆¹»(ÈÃWê+ ’Ì1_+1w5—ˆ=Ý}ñEž2wO1s`¶¹Ø3$ÐW"Á¿Í}%æÞ!®AROs©ÈÜ7È= Ôƒ¹=Þï% ’š‹CDøx >‚‹²I¤÷_±ÔßÑræ±g”ú¸J™ûJ|ñas‘>ÓCäʼͣcRWß ‰¹ÔS&eîãæiîá+¸Êñ}qQâßÑG•øyÿr÷Ùæ!žÞ®!ž’Ñr™ZùåýÌ{kW±8@>z­hô¬G÷÷•J<¼æìô t •˜ÂÐ|§h©¹…ùOïÐ×_ù¥½þµÜ"bžØ38Ô5@èÊ<®wˆ§«Ô3dtçÏ©«Ø5DŠÛÅÃ×Ë+H$Ý Rxyã&öðuw Xë‚ õý´pw 9¸º‡J=mDÞ¢ Oÿ­"©«;~}©…»ßdì·Ã£½›Ûk5z¡•»§‡o@€«ëh‘[]Ýq™kǾ$í=sëØ-lp³x[=VÎÆÑÇX;vtýè©{Fwíý½ñÑÍÝûåÒ£çY~n»çú±K;Éú±ßîc§ŽÝkûc6ŒØå„±à*µy|c.ÛUºyô%wÝÉb¬âÆ6ü+Ës´,ÑO߱Þ^Âc´ €Ñk=ÇŒžéýX —6ö°íñÛã:vµëØVèØ—b´`Éè§âÑMƒÆö>VF(Ó A£7z|÷ãï2zUèØm¤£ç†Œ~Š?KúØå!ý]GD®ÅZy»ÝŽu ‘‡ýÎõbO‡]‚½,7†xïÞ$ñÙ³Yêkµ%ÔÏzk˜¿Í¶ðWÛí²@·½kÍt|k–ù¾Å³_qZòÆ«û—ÎyÍyÙ›S\–Ï}=bż©Ê•ó§©V-˜¹zጲÏNö7•~j ¹â‹3ƒ-•εUýýüÁöjúÂ᎚á‹G:k¼t´»Ý?ÖSÿÁñÞ†OOô5ÄÄ«„±‹Ø@,%毎„%±‘XF¼IL!v›ˆåÄ\âub±™˜GL%¬ˆ-Ä|baMl%Ó b±˜AØÛ‰EÄLb/aA¼EÌ"ìˆÄ:b11›°'vë‰%Ä+ÄDâ9baLñ,áB¤1D8@¸éD,!# 7"ƒˆ#äDáNdñ„‚D‘@Db“Љ„’&¼ˆl"‰P!„7‘C$‘„„ð!r‰"о ¢‰PÂH%ÔDáOÔDQJÜ#jˆ3D-ÑG4ùÄûÄMâqŒè&ˆ*¢œx›¸@&zˆF¢Œø€¸E\!޽D+QLÜ&.G -ÑDTï—ˆãD?ÑBÔwˆËD q€h# =qƒ8K ]DqŸ¸Jœ"‰vBG¼G\#N‰¢ˆ¨&î׉óÄq‚8Dœ$Þ%>d¢•Šy:+ƒ•ÉÊbiXÙ¬V.+•Ï*`²´¬"V1«„¥céY¥¬2V9«‚UɪbUc÷_˪cÕ³X¬&V3«…ÕÊjcµ³:X¬.V7«‡Õ‹B?k€5Èb`dbfaecg`dbfaecg]`]d]b]f]a]e]c]gÝ`ÝdÝbÝfÝa½Íz‡õ.ë=Ö]Ö=Ö}Ö ¬=psÛý¬e¬FCƒö3ìFö7†Ë û9s8Å\#n÷;r%ÙG- ž¡ž‰~ö¹gýž[ûÜ•ç×<sÜŽq7Ç{?ý´NMX5¡åÅ)/¿Ø`ô¼QÇsä=xiÎK—øÓùÝ×Lü›±…ñM“ZÓW'q'ͤŸtlÒÉI÷Ìž7Ûn–aÖ;yùä]“Ó&·¼<ùåÅ/W½ÜýòAàšpžPca~Çœ~eÝ«ÜW'½ºäÕôWO¼öúk_;?ÅhŠõ”‹¯?÷ºåëySSO-úý´Øé§‡Í˜4£kfôÌ£3še1ë«Ù†³¯¿a2ç¥9¯ÍišóÕ›sÞ¬š»tîóÎóšæ‡-Ø´àØ‚÷’ Í,Z³h×"ñ¢ûo¾•½ØfqÅâCKÞXrpÉÅ¥ã—v,›¼ÌbÙ¡å/-ïZ!^9qåü•WVY­ž²z÷êº5ÓÖ¬YóáÚ²uëŸYï²þî†Ò¯nÌÚd¶©nÓO›Ã7·nqßre«ÍÖ÷¶mÝöýöW¶§Y¼hѱcýŽ›;gî<¼kͮ˖‰»ÍwgìynO‰ÕD«fk/ëlfÚ$Ûî°ýhoúÞÓvNv‡ìãLŽ8.p<¹oʾöïÚÿù~äœâ<âò±k¶Û·oÜ-=O#ÏÏ»^3½¬¼‚½ ÷oo•ϳ¾F¾Å~†~:¿¯üeþ·ôûƒV‹Æ‰öˆŽŠóƒWׇì–L—œ–ZI? M {)¬+|~øY¨ì¶$a ¤P g<„‚îÒ§ô,ZDÛò‘™’ÛP‘˜Ÿ'œ‰j ³â  @ž)(ÑjºÓ(-rS‘U‰ÅÑÙ ÈE)&é±ÚÀû"o 4J©…"P*Sx“¦Î”i @IÃÃ%~ !]ŽÂ)‡…p=» !/·"ÝßhéIGXgï wÙEô«ü¬ôÜÔ<@Õä(„(•{¢Uv‰”úhI» e>h¡`9Ð[–ߨÁŠ€­BäI‹H…=s’‡–tȌʃ”“Ÿ9]ë Ø¾Yp‡ŒKsûF[Gà;Zª¯ÒœZ¸Å¦_…sù޽%{5wûÛüöÈ•wZ ¢½r…Y¡Ù¢y)0­*Ó•ÝØ¿ØÁ.ÜÛMhï,Ú VPhâ9ÝÛQTß"¨®ÐU× F›jØ·“ÅðL>Š‘q'Å)PF˃¼ L\Oì¼'ée¦@¯ÍnL­I5Ñ¡#2ò\R‰ò+$„,´ÐÍC6ó_IH´KÄMªÒ‘»3äÙ hµ•­}ð98ÝäsdÞèPâËÔ¶  Ñ‡hüæçè%a¤ˆ÷Ä,ô2âìß¼ÆÃ«¢#L(:qW÷çý§¯˜²‚"úY\Ú}~— ¿Tóá´ƒœ"Rž’ ’å›×'¤Ï’ iŽ õv…i™š²Õš£v¢¹¤gƒ8Ï?;9ÃìUôÒ…Ðàh›¾¿I¸„,C¥Ž–‡‡¨ƒµÄúmøä ^¿yhpŸ­A­n˜­gÁ> +¹"÷`Jq,uBTŒ½†ÂLÐt]_v¸Ó k ë=lmN3^ÿHqëêÛJ ÕA%‚¢à|u1 Êu%å-ÎU»vØŠ‚…ÁαÞ)Ë©¥þï¢ \°.:j=ãn ´äÒô辨ýª³¯³§¿ô86 £H>õž|h Œàc QËåÊå"¯3Éd 2ù ¹õ D0˜—D3ÖdÌ«2°ØºJÁ ø:ù(Væ/Ãw3U—Eéé9úÈ2#p.½lÌ› / üD8™ÍMNމKÁRÏ4¨Ó¢3)^qvhhF°ÙŠ=vë­Üï9 û5‡K@€©³¿ÈÎ7  L&«Œ)Ê–s»“ò“òcµ1YRàB¡·Hÿâõhñ4È…;?«ù¸gPÐ3xºú"8 eíÞu¢"qåNªœ ½9¡Üx™\Ô "]®Ù¯uÊÞŸzYÓËŒê5G-…6}á À}_lîh¦ 3 NäϤÆÃzõAúù#Ðì-îÁll½y—¦b󛂣׸˜ø˜8µ§µ‹cD"Å»—0 $¥&§'S¼K‡Ðaîâ:—ƒm‘ya! u(0õRVŸÂv’wïo\| ÜâÏi›õpÜ£ÓÞÂwù®gôí›Ö%žùi©9À´bÔž)I°^½‰ñj-¹536—©_Hòh;ÆK¥"Q™´¦¶¼¬¶FZ„}Þ!UK¨žF¾z£ÚûPõ7cÞdÚ {û0n¢4:Z«Ç‹Ù¯±ÐË+ÛßÌ8+ü‚|ä®`/XÞc -¯zt«ôÌ‰Ì j‹½ÓºùGàx{”[‡|8e\ž….5¿Pk†M|¢.—¤lëˆí0ƒä‡w¾}×ú2¹"|õ¸k8Léj;ÝÛ%ónÔûYbîŽÊ8Ø[u¬À£ØÐ">–¯àj^Þ- Ö¤õ2òV\^ôÏ>Jµ’¡u½Ž\“…Ñu…‚nð(Úû¤#LtõëRíh8q|ž^V¬*4:}nºËT‹dˆŸÀuŠÆÚ~擼Fy:)_ ì)EQ‚J- ˆ ”‡S—W ï ©*r ©P œ(”I®°»ÖÚ^T]-èîæ,!yÉCú–¼…¦¸•QPÓ°áh#÷F[ùShC;ñÒ-¥ž‘–rcd¦jÓ´©¹À´šþª‹Õ¸Z5Ã$‰oEG/aª©WG.ÍP`'Og&!”ÉË‘UÁ‡«8#§¸ñh§‚[Yå:hˆÍ3ö²c1-.‹däښȨÅIcaðÒôF-0õ}­°à.I ÉÈ{c¡'®l•ž^¡gÑÁŒò*¹ IZ5u²:Q=囼sâ “ Auò4Íé”Ù)ɶdºo |u˜¤Å§Ç¥Çfɳb³@Ðh[áKðºIíÅ,M]:5f4—hY7°fó1]p-R¹‘ŽÂ‘0,ö“’Ö3 RK†§º§aaÓl -HhŽv¥'¦%¥%¥'™f«ÓãA%)a–뜠s=€Þ€¶&µÕWΟî«Í6Õf¦a–­E.*n{J^"PØ•* ›ãMè%dbšgTPìîÓÀØQ•ÝCëX=€?õ°iHçóÁƒü¢wsqõ(eäíø¢P0 «YlÒã<#ÅŽÛÖ€ À¡BÜ/oˆkeâ‘k£~›p V¼ñÀë(tŽDkßY WAÖæ‹í‚Š®œ>p‹qiª6úÿÓ±à2ÜDõô\ËË{‡I-tÈÈwÇ®q'÷G…«â³+ãêæˆ"¬WÄ¡R±kgàqHœº _dÔ‡íu·—’lŠË  Œ—D‹ç¡“ÅPªè˜‚²7ÉÌVeaÇ”]_…C­8“Qt¡WF|0Հ̜¢ÏmRÒ•ž©Ç· Gí$ëÎ]6ŽùYܼÔüT7äªp@LU¤Enãh-i‘• ŽPôg¸5ö*<Õ›£¨c{ŽÓ&Fº÷àôw˜øwçy¾B• ÄlŠ+ìBlA&Ô*+B[\t–€zc­ƒ…T^^Qª/ËHÉLÑ“sR²†ªn(묲ì$ÑœŠXÏÐp•/ð£xv=Χz:Kžð öf–„uš5á—onÇЛ8VHˆ ‹’¨D1a€ò5u 3°£élãz¨Ñ}xœž5¼ƒÉ¸Ê¸G’J¢Dĉ£Ñ´¶ š?ö»[´¦@W˜ËdòR ™Œ€NF&ªºçÔ‘>-†ÐÇïäå ¤›Že ²éyÃÆüü”\ê’óc±$ •ZÛ¡h‘ t%¡¥•Áf~äÏ®+jH5Õ¢ùJ².97“+**4$ !>J®Ò›ˆºäM hêR1žÜ•9d(Ьß÷šb‚¸hi ›:Î/ÉT _×’¢¨Ì‚,¶@/¼_ø™għŃxS Kôc„†ÛŒ—².ß…Ìÿlý*¿ =›I„VåD8 Qƒ*¥U FUˆ–´MSæv 6“ -;W£©,ï.nTO™Ve8HŒŽÞÃxe©–Ü“ª,§)˜IÖu7–ôêX‰x‰y“`Olìî8|’HK§¦E–€vSèFÂg=N®Úm¼ÛF ?æ[mœHµÄ‚ºAÆ¥ÙÉ|£­•L¢n Ÿ;Ã:†À†o ¯ä'¤¹*űû"Mƒ™—•š4€êȉqŽ‘÷üÞ†& | ¾°ú³i;w{;„ l Ûû[ÞZ‰Æ#¶ãö¥{÷—W Æÿ¸a {?.a°ç ãHÀ؃°ø`µ½ˆ>1A&ð³ä̘²”tÓ˜ÒxÈ幇ìée䱔ܘ¦åKMÌQ3šB?W’8š¶*+ÔHǧ$ËÈ ZyëÐf¤‰çz9\8²œ£åÞƒ…¹5ûuóråRã|CÕŸmôï†iz¸»ÞÜ…ã®Ðã:Œyw‡7\ã¯ô±‹Ü‚åÛ*4N€ë>mùìØ áàà…êk€Âby"z͘f1skp¤¶^“š™š%<5œM\µgh§2ϘºŸ__[Û€ÕØò¦Y´; öôW÷6 x³Zƒ̾¾Ù—¢×àKhrFo¡7Ñ^d ¢éÐýòPAÏ—BÞ4´’^ʯIÖJ’=’–ÁûdÞA¡b@yI.jjÖ44ë+’G_+}ì ޾̆[é·ùÐŽ[2ÒÒ5mšÄh”aê„0`Š<¹ˆ…Ô)É $›&d$e7tÄEv éuh˜NÍÚ¹fe¸BS(ð/—æbó¤Š ñì—ܸ{µúÀ°¯·ô¸ ®Êú쇜{ö”£gK™;OѳàÆÓ6üTEZX|P¤¯iœ,9Ñ4áþçØ½´îD:‡ÅyZ«á,ì§8¯ŠBn¨h=æ†ÇÎ l>ƒoÈ®Ñk…¥Eõ9ÍL0{ èá¾ó,(:φi°D[¡‰ÏC1Þ…DP¼KÿtìÕTúažƒ%9”ý´‰s‘‹äÛ˜^¢X=}í:‹¶Áœár-Ñ´âØî‹%G€) ä"‡‘O9ç¸ÐgøU.'^ñÑ7íÆ<—÷Ð+ü ½§ÀIjȧ}¿Dê+à•ú—ËZ²4©©YžKš€T³ì¬øX‘——WbÌô •Ýp¿—æaך MÊj|ýÂ÷Is–æ­äìÊbRˆ0ѬäJ%e¡u åeuu’Ê@á/ Ín²›pC„@ïáÈ;ä>ÙX¤ðþ´ PEFÛax|¸¹ñ:]²¾‰cMØM“ü¯5w‹Ô»ëONC¬e[ænÓ}ÿ¦€÷!"–†lž4óÎfÈÏß:ÿí-ßA4î#| ÿÚÞ o`EmÛ¿Ûj»ãïŸ-ë:Þ/àݼşܻ¥Ž÷vž¹Øí¼ihÿOAB‰I h ía¦°Ûa.ߦœÁŽi6½&³àAz=_ÓQt3ç$¨5-“•H%2¹4B;£xžMŸøGÆÓ¾Ãõ¬Oà[Û.øêbÚq+ÍâìÂ_#,¦9¡º›6¬aOØ'Bùаàˆîâàw7OÁ šQpé›ðÄGÏÍŸŠÌÐø«Ë q¤«¨óÀ -Fls4;˜‚'à0„'ÆDLj$^‘Þ€Zíx>w¬èdi•°X_™W ¨÷{¡¸1Ò£qk¾ø ?0$8 ¨2¤¶¾ª²¶>¸*P8ꀡÝ8é܆ž?¬àOãêá$Î÷Gfrëà~Înn ÚÏA¦ÜúÑfãYkhÀ C“8ˆ²þë‡8ǹ0€'áãÌF=³Áâ"ÜÍgΛÄ-Åe2©³‡XÌ'h$ÉžqÑØ¼¦B6 N¦ý|þú™æìÀ$Ù‚ù1J\xöõïš ÷›^I'ñ!›ô­qÑ.Î¥ÎøZq¢¿`_q¸;pûŠ|:¼jEeÊ+îj&ßHµí—|O)ÑDîI¯®è»IÔ¦÷Éëùõù-µ5ºN0šb[¢ô!b=w™‚)ä]u¯kñ[Ú:‡¿ähx%èGšš.RÍèKþ§»KÅ`ØêíµRÉ€‹Þø|NÏílÎ<°ßþ`e×ìÙÛ\QÞT/Õ{ÇÇ¥¤Ä â’¶öTl|VvcMËáVæEÃÈ6ÂU…é¼åLçKMÝ'Ñ9Ó9ɯLÖúÎ>ÿLç6ú6Ÿ'~RË«ª†ªXà Xð.á[W…—Ïn+ODô @¬FôL¿U«óÉqpt·4?Ò)ÇQÐu.| ’‚ùw{y"OgóE‹œ€Ч²ïã°áz¤>®æ75@ŸÊŠºx=&9 ©’Ê–.ýÅê!sïpm[S½Y&HKÉJ(ŒÌO¨Å¶]:<]Ϻw ¿E«ø›JBë˜lü ¼'«Z£»¡×U÷F·o”Õ]*¡òÈ­)ÁñAò ¹Òì¡Ð&l”K·„_+‘€MÂ۪ȭF^#¯Ž?ŸÂ¸5ff£š•Y­hü—ƒf"g+9ë*¼¢g=¸Ï†=L¿Í–¹™Ÿ™—‘‘V¢)ÎÀ¡oiŽÒ_Èô8ûÅJ#b”1ª$WFÆÖjÉ©¹`€¢¿$±Ž<¸÷ ý^ƒøäâ8ïP 0æv¤WñQ@w(¡P ‹Øfû[V—ü8ß¿ØPY\S_Z^Ð ©+VC+mÞ¼È3Û¿zÀ3ô•vÀbÓÙçöüý“•çox‘ÛÎ 7; ŽuÕ]Qæ™ø»‡b³eöÖ;ê9QÙZ¸ªÏ¤¢SŸ?”ELÊãžQ·^j ¾©¯¯ÉÛÁÊÇe©³€§Û´Žq›­m´Üç.wÔF˳·ÎÖw¿3fߘiçÙTüóÛ°W¥OÁçÏÃIçYt==‘?’º•Nå¢I†c?˜ú»I—_gÁS÷Ù´¾ÌÌôÚ³k°X.\7|øiûMpÛô›e·^³Þêî%ð÷Uú+6”&˜t|ÕÒp PwíY¼ÒiÎâùB´ íæDÑ“˜.úÒw¬oÚÙ§7þ³ûýÅ÷jÒ0UÅpÕOä͸Þ1(}Œ¡4qxÿ’¼,¬¡†Îb]È ÙšpY0X2º½&4p“œŠ&ϧVeÕ–Ô–hÛ™~ ¥Ë%åJ·èåå* ¥£¢QIpÖ–Ô‡PªQóéL¨àœÇÂ_ëIz ²Áû¬j¡?>ikïx^5æ]‚oÀ÷ø'@yrEÌéÐö=‹÷l[+×Tx Kf`‰RæÓzùÖªÎ~agÕqpˆèª/“å;ë(Þ½Ký•­‡'½³ýè›öÎ oA XºK›hÒy­·ñ  Îõ:[x+½CB„"åf c4© 0 0 ×:{9mXè3mÔ*ñZg|ðz§cUèAÿü"“ågDÍâ’ Ñ7Á7àû‚w«Oל®k¹z¿lÜy> 7»5<ÊöPD€0–©È™ß/×ìN Ìiûa“ªöâüzP JŠc>ÜW׋­y}ißY\‚eìð[=ÜXÇÎýPÿ &Á%ü¼ Å­ý}G(,m,h -²EZîÓlYn¨77îXâ^Z_Q\\QŸ¯,F&ä€lª¡¯nðä€í§Hk‰µ@´]æ vHq6ÍÝÆè'ÿ ŸõSHeÐC¿<í,½Roo¯ºeÌû”€ü×éÝÎ\tad7g;lBËIÞßnÁå¸hËY>ŠãÂ8øçaíÁU÷Ùmh#ÿú@]Ukß•÷›G{XàK^_.xà6\¶·!*Âäm‹jŸš5[òVƒiàµÈ%â"‹@ïõ»G•tž>ö NÍüý#¼”¨”HeºW'jjÔ× 4Å^‰º"ˆëïKì„I<ÜÅ÷ ô/—ÔÕUTÖÕJ˜Œã?w,Oá;p×›ooÙ_°sÌMF¯!g í¶*{a‰OQx—çl$4äÞÔi¯¾È XÝÚB3ø*t>§<'Ê›z·6Êe;¿i[˜O!«eؘìvÓõ»Bšù¾g£Ž€(hõ.|é’9õ0]®pÙ°?D* •†V×”—UWKËEÌP”1¢B›vö±'põ‘c}Œ«c~ÆËþÄÙÌ”Ãþ¶ñ ™ ™¦Iiñ™±š˜ÓÀª šäLEiXI< ð‘•nµ>ÂÛœ¨2Qb¼I|ÜšÙ.;pÍ'd$fe¤¥ffŽíh½v†‰èb®m×ÓsêB°kÅ1¡§Ñ7ù>\g4ÃóÉD¦ªÌЄY¯ 3›b›ZwaIˆ6²5ÌÍ4iâB‡WW¡M.6k­…5Íuºê¦Ë‘Ù&{×x‡X¦S’ó7ØcR⡬Te‰®ªY\稢ùèk¾C¯¬\¥¾ønq~r\‰`üãâ[áVXÐØbplÔõ1oö𺄵Â2 lM“§R¼wÒ“€Êl Xlí°ÝÊ Óë ¢nñIË!û‹âë ”¦–§v¤L+Å׷ܸ‚#áÚÍö°HF’MœS¢rA+“¡€¼ôá9+¨RÆMòJPF+•aÞê€z Fsy¥9éG¸ÐTFäϧF^™Äß´ßòÜ#àM†v—°w©ÎÝhÏü×ß|Í>ÿ$¨@ljO€O½ÿ?ܪhQõ%‡°B˜Ú¨ÖC‡J£‹wᮻƼsõô"þEt“ ¶GGZ%c- Ö’V‘…àß½O~‘™d+DÅL&:fGÂÃÙÑà,µ$(åi‡(ÞìÄto_œsP’»š×Í=éõ™Å…Ýíu½ è"+|uâf C©¶¸¬Ë¾fÕêÝÁÞÂ@·h¯øåÔ&ÆùÆÖˆß+i½°¶ÚTÝ»‡ü’~†^äÆ^Lj-ÔÍN¶–(|R©¶Ùª:@Õ––Õ²êX‹ž[=½&I“e Í÷C‚«GÓÒ@âRâ“beQ©J@Ùx:yVK:›ËµýB^ؾ‹ªn³Ð[ÚÐZZQÖŠ©ôä´Ä„Ø„h5ví>J'à|²·UWÀñ©™ 9¥Æ¤Ž#Q6ŠäWÔªcc㣢#…¼j…**>ÜL¢Ð–U”4b~Ÿ¡8jdkpö56\€×Ü»ßZ~ÊòîûçÏÞ½³ëÈ[Â?þ@£Í«§Y~Y”0¢6¦´S½5µÝ úèœ&hÜÄÌ'[,G¾Íþý6VÝÎGôö9²¿×Z˜êËo® ôö òò ªki©«mŽÿQ‰<€q2ö_û„`ÞŸø‡ö!fZœt=¹ÚèÒ]h‰óeýÿ:ÏûãCT1ê8urPòÃüf–*ôQðh‰Þ'ƒ2b/“ùô×’6ê\pQ— i±)щQñ¦²UB Hête&ÅÛ—' Ê’˜íN‘G ‹Ú#qµ ?›ˆ,r¿+ê)Ë—x"]AL¹™d¤e2ݰËF€wq-;qGìq8È }T8^€â:8¡VRaÞ/…/ó† 8‡ï¸ÑC¼¸/½¢.¬=¡!åkŒdn4ä;žŠµ€(z¿/ÅKoô Ìw0›»ÉiGP±¬º¦HW›"L)æä‘€ô”ô„êúò.Pt1U¶23 Ešla²ÈÛÜÙÕ ì2Ý6°ÿâPSñыަ½MmaÇÌúAgQKCu…®¦úÅëF?äï,¯¯Ôê¥Pòmþ^^í'k*à¸Á;‡ù™T¶‡A¹WÚÂQ'ìßüv NºÁþj:_“ž“šLÛ´ê`q˜Â7,"=G$TÔF•'6Ó[ »ý«lÔñ)Éjaå9ŽCCV ûk«¡¢ª»‰+pwÅÑ«pOù-æÃ˜·ú}vØ–ïÌ· "f7@åx׉ˢ²ÂõúÜiˆ³ò€å…¦š‚ÚZa__íU,î Sò“J¢K’ªÀ!P_ØÚ="øiªI?÷Ôð›übyALa\©:#QˆÜ1u£¯´¦ëýž/Ö 2Óó²²3(ÞÉ{ðct•?kÎkæ+íºxÿ6c¯ûtïæ‹øÍU^v¯nºÙ_R×~¡éƒž~aA¡>§„q5Ì%¯¬8´ëÒÝ;.Éñ[+½÷>¼¤ópý‡ÂÒj}~9“tK‚Nƒ,˜nè@' ކJ:¸¸ã£Ø£cÁÄ{l¸nãï`Æá*·0=—I:r{ZD VÎ×àÚ´ö&©)äÀeh*÷hÑz©®ú@ž©í•’u¥Q2u‚"F!D†HŒž…Á±E EL˜¾$»ŸI„'ÊȾ¤âˆ#Ó?GkMÐw¸œ«QqV£uîä/}üLÖŸïÜgÞTŒ~:ƒç|YZSŠLõ‘ù¡Ê˜¹\€¦¡éDMüÍcXö  :¸Q¿ÿ>iøáì6Üûùªer‹µv;$6Àxx—K›}NHê“˧ßëP”„D($ª¬(­B˜¯ÊŒ±”ÿ¾@Ç]އ.ô©8"¨9«ÈJí1ëÉÁÚÊŸåàÃô¶26,B3øðÀç >ª¾Ty |Õœ¤MêŠÐÇé UVTRY©Ð…FÉbÃ…nŠˆDïp8³B7”­Ë,¹T…´L"‘†JÔ™ L ·Ë”¤Øú¦*2܊óå™Ñ84QȃEEÊšüÜôœ a‡¶8£)=uz¤u`@åæô<˜K¡T Ýt[=Œ«e ð«+lz=‹Œ¸øôúÔ¼¬3º³:}^^aV ò³â’’’â… 1I1 ž’—Dè+Kõ•mžuû\]¤žÁO+…cÄk”9WÀln²2zKJb¼U‚­©­Q#J¼Ç–Q1Yšô´Œ 0+/]r¨2Ua¨X& vo ê?ÒÞxµQP¹øí ¸#µ û˜;åç¹z<¿‚ÿÃ_iÃq&oæ ˆ'õuÂòÖ!N¹Ê–ƒÝõ£nψ,òñ~RƼ,=ÊGÙP¾Ž,Sc·F——”ÖW ¸žbàO¹4øuv6•jü ¼ <4 N——Äd*iXd”,"OY%„sfr~nåBzΨÐi6XhYˆ$ô—ËÜ`rÜ`²'7XQFsz꨽µâ|û”¾éÊt×¢pMøèÉŠààbyy^If¶NØY\’Ñ” lCÂíãd  ¦$e¡•ee¹ Åq:AøPb%8Ô’¢MìRèbKòU^\RYQ, Oˆ“ ]#”I¾Ià«Ü®úæÀÖè¾ÔÏ›’Š’:1õ ùÿG|²B‰á8:Æxz)Ì,…ê2˜^jE…KŽF4æýž/ò/ ]>px÷€½ 9áŪZPiÚÕT{ ©F%OJJJHDD©#@¢—W7èôG­»Ö-±²_o£|{«@ŠA(Þ[ì6¯ÜÇ/žu®ôÔ>ß@[/_üÚ™š,AQ¡¦Ra%â©4Àê¤óí÷¸y@V·æœ€7<æñëÁ!ÿ>§&_¦|ü¼<=ËOîø6E•ƒ:ª½¶¦]ðOÃêé­ô߃»±| $™~8\ãω&;å;•z ‹ÄÊ&ñ:dnÒÊ=_hŽ(OhÆÁï‹ï¡p@5 iFTDæ”Qþ»øµÖyÎ`;…(çMk|¥ùu!‚°¾øXÔqp‰ú¬ÿô•ú2upõ(º^ÅÀ¹1üß—‹ÆOAã¾åørá´œsšû3öLŸfôÆÃtø"<óÄD7$ÏÂ#gYÇ.Âþ‹ìPHð‡ì¿øªKÔÙLûA{A{ÍW3L†f}QÛ›ÛLÁ º1¨û‹¯LfÌò¨öÌw¦ÀO½?hÖ&öŽ_Íròަ`_¾W­+7Â:þs›—¾µm˲¥[/¾w÷ü…»L¬® ~¨IŒÀGÆ<Ùðrø:ßv‰#ð>zy]p_LkâûÔp“NÅÖJëEíŽåöÀø„»YÙu×ïöÀEáàä´¬¦xIÈôÞl8îbgõÅ6Ïns]‹ø´Ùm0ØyÔˆ+ìå_ë\‚fy½èy‹Í+ÜîÕ ëK˜ L·Üƒ&ðSß«î<¨¾F7+¡˜Ä:ág_ù£r|Ô Ñ_„Ë9;¸ˆi†&.÷-?“Ü~ø¥2™ŽIé>{þøyc^/Œ~‰ü§f8§Œ»:+jtÀÕ'$OöpȯW‡ŠH4m‡5š¸¬|O¿¿°QR{&™BÇ~« ç[iþ¢ÿb­RØ[[ZRPœÕ‘ŽµÐ–Ñ™¿ýv‡ ׆k‡ùÕF§îÂïïû ×öµ»|`5:5éuº<×ÔuðXÓÞ…ËݶŠ’cA ˆÎI(O¡x•$õlBf“Þ Ýï*‹Í.K$—%—Ë‹Ci°,LìÒxì›;÷!ëhè{“п&(og>~¯ë¯NúdëÉ×6ÛÛ ¼böƒÔè¬Y i¯cbb#úÕ¯y©ÃÇFÃá‘Sáä¹äÊ â“¢ã£QòˆÌÄogT´K<3Œ:’¼J] é’’´ ¬âxÇíšC&pšÍ[£T»âÉ&<¥ŒÖcÁñndŽ@­ænKLÂø:ÙªÕò¼ˆ e¦ÛX„œè•¨T+#Â|b,…ØPÁ-ËÎÖ Þç© \U0—9€Bøp¼ÊAWGÓ˜µGÕGŒxÑðȰ_á%J Ë’åHòMxkò¥!Y¡föÀÛ[¹ªåæÕkËA>(LÔÆ•G›ð¢Ã;µ‰•fG@m]éMÜ‚ßÒ{0¦ÖÑ^ü5–»Ö®>¹ëÆõS§®Þ²<¹j4ós? “‹oþº«¤Aªû­®(Ñý‰³ÇÃZZÐâ#pÆîä»W˜!òåôN>ŽïÕ€ŠNΪB’<ëÓ°q‡“ÈCQ¨*)Òæ¤1A€ %3%dPyåùeåJ± œë'–R¼œÈè˜ððIîu¢ÎºšÂºFA–~T5— 5åå2âƒØ¤¸Ø8ElTR$ ÂúŠªRíåJÆÓ=‡YyôW|xö0Só¿táþýÏwáÒI]0„_/¾º£Óó˜•iFB~d*ûŠ·«¾&e¤€øœòzmIkOmKe( 22âÃäa Ab¼X‡Ÿ4)Ù„É6Ä'RgùŸ-ðŸ¦kf~ oóÚsÈ÷‡8hù£1ýâŸgb†pŸ4—f“ðÍ9ƒ$zs>®|ÒÄN¦r3NÞÂЫžÍ­ Û ¶ß:Õ*ˆ›j§‘èD•>²~pôÈÿ;“÷}Xù‰Æ<ñÕ'Õë/É>žøŸëÿ ¹Áß¹?ã™ÿt‹NUuAŽ~§ÐÅG¾¼EO9¦k àîð•ìÔ‚½çp$e8tæÃ3-–9ÂâË\ IÐĤûzdûa a2zqßY Ç»]\.,¾ÉA‹èµ|d‡f£Y£af£ÙÐ ÿ™ gCkh…fÁ7ÑaŠ+oODæh1ZŠ&"š‹æ!c(€Kà h 'ÃEž4¾Žz‹dÈ_9q$åIGÖ1GxôÍð?˜ùŽQégŽÁõ7­ß‡/ó~vƒÓøÖ0o9#Çn™wù£#$zñáÇ1ƒ›9=ðÛ_’sè ~yz~Ze\QŒiµ²0Pnb±›,:£(T /Œb´n86ÙþõòƒýÞñÛƒÚv— ytO}qyͤ>ÇÖ];<Ä›½•ò†]A+0m*“z‡n”üª? ÖnåBáè÷?Œy_{Ý=ôuÕ]cÿWÞ«~gØsîï {ÞøhØ3ïYô€~ïçViQíGllž¯òOì*wÓ®µë8âv~þÍ)h2ýlœp¨·¤¹Uxä`Ógà p9âjÀ™Ð^y…ÝàÇ&~u³ííê|ò¶f™ºJÆ4©úýLѸíœVòï˜&#Òyój¯ŠÎP¡èPÄeþ:pæ²à±A¢àëåï}ùµã;Ƽú¿`œè¶ÇƉ¦üã8Ñm¿7N”÷Zø£5z FÂ,†»öŽÐÚC{ükÙ3¿ #þ…ÿàýŽŽœ}|7äÁeO‰ÿêùôjÚíi±é)xí<‹ÞvžMûàà<¬gú·q͇z#Þ¡ÿ©ø¶/·°X¾âÌöÛïœ=ýö;g– } Ø[îÚç°ÛjßЉýCÇ„ü­Óãnü¿æqç¢3pן¤ÿA…ßxš·´zsGÞ½¿` Þ„xèðT­ö_eÎƱ=fIƒÁ’ü|ÍŒLûSÔáMw€M4°{ĥˣ©¯{ £x†è~%©¨ß‘TþIRçaÀؤ‚º‰têù‘T.Á懓 ž‡ ™\ð3zmÿcè…+oü–Uøo@q1vŸ&XF±‹!ó@ó5Ìî1æ]ûËÌ›ŽîÓ·þ8Ò˜ìG}Ô=¾øIõwð"¹‘?¯bûGÖ?™óhýd»Ä™„w{øh* çòÂês³;><ûô¥P N%CþC£üAßÙÐ×ÿ`ÁC°ü¬?Ÿ°á „|…F“ 8ˆçÞ¿wêdy'4=cÛ½ÒÝ'J*„ÉÔ²§J•IÙ@uY+–U¾®¶ö6Âæ)Ìz´tÔhõ çþ]&Ì€nÿøègÎØþeœ¹Á˜ûß’ÿíU¨Ð7ŸÊ߇KT½Ë4ÔÃeªªÿ­eª6ýÆ2U £ËTñ&Ì~ðïšä_84ô0ÌÅŸ“³†§þÁ I;–«\wÓGÝ—>ňÿíÄ£¬0ú·÷º%wzˆ7û*åuÝúÂ&`ÚR&ðÝ$y¤•0ÁæaSrsìÃc& àž?ªÓ1ég;öWpÉmƒçÿè1KÙ;à`dëXc«2±aò:÷©+.$«“KR*.Ût¢?Áy ²§]F ˹)缫¡æ¢mü*¦ N9ýêLÿ‹ {ݼó4aùæhp8Ðã¢~¦Ã@ zÞ0æM„Fòy_§äh@¶ä€oúN¾#/1[óí÷—|+çþ±…åÐÖÐD¸\â5ÿ ¡äÓ†ÔF-zhÙêuš¯7ªøÚ~`̤×áØeú€+qw—:j¯ó1!<±`Äœ¡É2µUœ{‚3£œ‹ƒkëµUjj" "‡’s[ëìZ¤ÀÐUÓqšâíÛ‘V.0kå…ÝT6) ‹ŠS*T­ëcÒ·jȆχÏ1óåì!›M×C1«¾­$Ì„ƒ¿õ0²à‰Óç~^`ÆAÏúö_Ö2ôÔ¸ÿaž‘~WWhü 2|%øRÿ1¿gñ»é½ ¹0öéqÏÿmüî<-$ü?³ÈZ=ìþ´$ä!fØ¡w˜¹ý|§ôh ¨¢à¤*=kÍ‘’­d*+->TˆrI UÇ»$QhõKñ0¹ø‡«ñLüU·TõïtKåý^·Ô¦_º¥(´žöÚ뱯ÐÜ?½0jp½N‡Ü{_ÃÆ\ûoZ€éÓ íŸÈo³Ç’‰ ˜ä§þKy%ÞÜ‘UÐê‡æÿ·Äô¡—?i0ülíod6ìðÄü².Ü«7Ê[wêÓ–ÄÍû—ÄÝô󒸺?²$îyâóŽý›Œäú×ÿažyð“gÐIªz(ë<ƒVµLotéScÞB8ƒžôÿwwíAM]i\*¹¹UБÛÈŠ³„eÕºêh­îª»e¥­3¾»¸** EäiE´hx^ŒAyID6ò¨ÄKQÉd«b«ÅǰØÖ÷îèúZëwã vϽÉÔH„@wüÏî9ç÷ïu~ß÷‰äêôêÝ¥ÅW¿ªú]CŸ (Yš½>#8íS2 ì¢`“às">Tºm;DÇ˾ÀÇô´00`OÐHô6ý;D†£?‘>DØÁE"%–þÿ‹¡cS·‘¾ìÿ5ÅhÊÝwa0}…®ÿRõ5Y. òøÄ߃žHϽ.$8ÅGh‘’GgÐ;Ù –ކ<d›Á¯/¬ê/ „8ípÑ ¢‚Þ»%Û‹TÜA¦(ˆ¬šüü/i²#hoš^On†™ áŠ4šfÛ‚Ìœ)Ê$`"|+@!’Ÿ(MLL MÄ?ö綃t!­ÊÊ:&#£„h*ªÃ¹N€ì7Ê”â-YëH´CH{Çn_€ÍQ!ô•Çîam“{²aÊš67aäè&¶qrlã´+ÑP°Õ®=b³´Þ"ØGÔÓ‡%û6å|ž‘áE±0C {@@Œ.%è&´BB kˆàë¢Ãÿ#+á©@ÿÉ’æÎš` l9þ(†œ¡OÚ¤ g¨\‹oЬu˜‚˜U°H· ÿ™¸Øƒð¸ ª«mèÛ}à3,8ÕEÊtM>83½’–à-ž" w9íCûm ôñ ›G/ Ñ[×ÿðSCý±‹ÎÇ®ï‚Kg-FoÃx4vu¨4r‘3Ôê&‹¶ 1Þ~  Œ ¢É%A'¯Áàóÿ¹V^ªËiz'Ë¡>›¤xÂu7ŸàŠæžGc‰ê{Ê…h¨UÌ…Äl¶Óܹ0–ð™xz] @Åy´ï/ŽÆòá?ü +˜Ahó–`–£Ÿ°]¡)p¦Ãi˜ŒêðvÿÎØÎÁûÏg ¡­»Ñ'Œ=šöAÑòûÕùUgzïÅ´˜ù¹[ìíWú³WŸiÄ6HߣݑÒÖþ¢Û´SÄX ׺uzz½²%˜õ±ßW9RË-˜ˆ”Ä;Ìsx>5 -ƒ=fuµé1cu•9l2ÿ€fhîóŒ…%Ȝ՗6F°å¹÷–­_ý6ÿ8 CHÈöØk°ûÓáƒò¿íÜUæ¸>*Œåê&–ÖV:[NÊ;iŒ·€¹¶T¶O°ØN·Û9<¶cÛ°•¢;:ïnaËWšô¶UÚ1F¶Š1um)b{À³!oŒŠ>Äáb÷§’t#u­fS?w3Q8d˜ÊNÖêßk:îá7 yxã%P#Ê €¸óCs—Ÿ‰€ A$A %á‰xÓ#ùM—X¾ëË’ŽÛ.–&”$LávpüØ5GPš’'n!9kÑ_CÈ_U3.ÝQýuóPm>Ëð·e(Ak7ê7Õ½gÔQ[‡b¡À”‹Û_ô TbWÜ(|Vœ,ˆÚÏ~Ïå´±ÂR~*Ç(ot¤ê{r*å‚>IQâ‚^š¦ª ‚•§`säÉË,ygBž(éíV[s™UÍí¹¨“,l ÔlÈïìíBüP͉q_UHÛêÆhÕ¼ØêљӉÑpm9Ð&kTÌï±Dx½‘DŒëD"æéÙ¢R¤D…æY^ý}{tÔῪGì<»7J~îų–`Ð7ž½¢ob˜"ãÌt›Žz"°“ÉÔ ¯7A/Iñ…—¤xVL –â-L õT;wJË) I‡JN˜þÝ<‰íÑ÷³r¨¤ />6OAöÑ`UøF[cü’ö=è‚ VÉFyÖ®œoªv°‹•ö·jnrã±3úÙ¬§ÚÇY;$au'bÔëêvšM£Ui6h|ÈgE^ê’fAšWÎÛp>Í‹¾gŽv]:…} Nìñæ{?4wÁ&XÃo9‰U¿ì?‡†¬úíGcü¨$ðy1ÁL«k…ÊÆÆ¨ñ}h˜m¶-ô­l|tѺoÝ÷Ô;ðn“9Fm¢Ûj I€hŒÂÒtV-ìå)ì3Œ°”,ý±_(·¡oÁf¼…{Ø;Bo™<ÆIF0™üÏò™`×0Û‘}ìun"SpªuÔs—÷Y21‘r¿ýC·j•o«{­ÞSU|w´&,ê¼*K7äëг^1_yW.ÃJå÷ô®ìÂŒæ›è­¨ð뺉ÞANK@ðµy£¹ªÇùë žš‹¹/gÇ®BgÿuÑ =nõoµúp ‚ r ‹³ ŽkN”æ'_J6oîÊÍyÁú¶ÜœàÛ¡aÛÆNë¿Ä×;*‘¤š$Òxi‚”š,KÆv¹©‰iJßÓ5•E§Êœ·eFnÜÊ:ok£œƒ ûIM¥k‰S•Ê“ôWÝ = ˜xö*&ßÁ>ãW­§;L6ÑaÊ´l²Þ} Ž™5lÒ12TàãØ„½ŒM`WØ„5”Miý‹Yžó-½:rcZÂ%‡z¢¤ÆV³’íä°ÝCÀ!Wp3\’Í ÆSK„rÐÍÁÊt;»›{íì øö®‰ endstream endobj 29 0 obj 20198 endobj 16 0 obj <> endobj 15 0 obj <>stream xœÌ}xGúþʲ´›@±²ÁÆ 9„b:Bï½Ó‹mÜ-Ûr“-ɶÜd¹—qï].’‹Ü n`zo!„šJKBBH¿Ì:ãüþÿY8.9rw¹»'²´;;»;ßû~ßûM ‡0ægȉ¯X>u…ÔÇý9ƒ1ç0£Œ˜Ñ\´}ùKø/;x£ «RÞ+Œp(Q9š ošŒ¢Ž¾6Š¿ñÕQ¼Žá„¾,•SÍéæ0œ#žÑ0£‘F"£IF3æ-3Zcde´Íh‘£‘Ä(Ð(ÒeiŒªöí7:jtÊè}£›F·Œ>7úÚ裮w÷uîHî›Ü ÜYÜ¥ÜÕ\+î®×›«äª¸±\ÀÍäpµ\=·…ÛÅ=Â=ŽÀ½Âý€û9÷n¿±±ñcc3c ãñÆSŒç/2^g¼Éx»±£±±Ì8Ä8Ò8Î8˸ÌXoÜj¹sÛ'OY)õ‘I<<oÏŸ?ßÂ%ÄâÑ‹Ub¹ÄÃÏb<þ$ö‘úûŠýÓ,¶‹Å O±…»ÄGl±ró›õÖk-,×Zï´X+öËœ},¶ºøH\-¬$®b?¹x¢…»Tfá3øÃÂUêç&QH¤~òiËåÎr±«_$VºŠýÙS,üÅ2_‰\Ž¿[Hä2g?…ØÍB!µø¹úº±·ÇÇÝ¥~ ™Ÿ÷ÅgpU[¤r…ÜU&ñWXà;nYµfðžÎ ö¾r >m!uÇ%ݤ®ìÛ<9§p–øÉ-b¥‚½‹ØÂM"÷÷qÁ÷ÅUùË$†G”Kü<þz÷)2±‡³ÌÍG,7Ô˶Ê_ßÏâ©·vö÷÷ 1\+5”zr‰B.öqŸf-ñu ”[l“ú:ûYXKç[XYl»I}ÿþÄ_ÍõÏpu LÊ>°8 ÐÙGèëëÌ>­‡Lì¬Ë W‰}ÎþÎ26‹›ÄÝÝOª0÷‘†Šý<°…Ý$®Î>Ë]d¸Rç•«³Lêgëì¨ï”zHýÄÞëݤ gWüö +W)¾ÉàwÛ'G×>ut»áÂí®ø}|œ U®÷uvÅu.ü#tn›¡äúÁ[ìÄVñØþT=« ±|ðìJCÑm†Cֆ﫟ÜÜõѹ¿^jm(·Ãð¹zðž+/}ªÐާ¾»¼×ƧN¬2œØì臡èëã¨ØùôU¸ngÅZÃKn¼“Õ`à þð~ª.±¡.7çdð´øÉK¸*ò1\+<éc(éñT >O×6ø°O‘ q¼ÚyðWààŸPCÅrÃgè“›ú }ªŽ@Ö ~†û=}øéw–® ¼ÂPVfø”>]JñÔå²§¾K¯#"×jyˆŸëžM+B¥n6Ö+ýŶ›W¸oY-óغFî¹m­B²}] ×ŽõAÞ;7û8ïÚ¨ôuÙ½ìIvs&[ì;åMûySÇ8ÌŸö–ã‚écζèíñá‹gNˆX2ËRµtöÄŠ/Oõ6V~uzSÕƒ³šµßŸëkÕýå¡¶jæâ‘öšþwvÔþréXgº}¼K÷Dwýý“= 1•CØ›‰UÄ|bñaGl!V ˆéÄXb+±†XHÌ ÆÛˆµÄÛÄxb;±Ž˜IL vë‰Y„%±“Ø@Ì&&»ˆÄ;Ä$b7aEÌ!&{ˆMÄ b.1…°!¬‰•Ä<âMâ b±ˆA %8Äb”x…0"–fÄ0‚K,%F¯ÆÄ2œNðˆåÄ(â5‚Oì%F&IØBB@P„!"^'^" ‚&^&œˆT"š&|g"ˆ!”„/áB¤±DáG¸DJH 7"“ˆ'ÂBLd D8@¸ÙD"AÈ"‡H"T„œð$r‰d"’Pj"ð"Rˆ("ˆð&ôDQE”·ˆâ,QKôMD>q‡¸Nœ'ŽD=¡#*‰‰‹Ä¢‹h *ˆ»Ä â2q”è&Zˆâ&ñ.qŒ(" -ñq‰8AôÍDññQJ$Z‰BC\#Îû‰}Dq›xŸ8M Úˆ2ââ q†8D´ÅD5ñ)q•¸@ô'‰ÃÄ)âcâ…œËÓ8éœ N&'‹“ÍÉáärò8ùœN!§ˆSÌ)á”rÊ8N9§‚SÉ©âh9:ûk8µœ:ŽžSÏià4rš8ÍœN+§ÓÎéàìãtrº°:èáôröspú89‡8‡9G8G9Ç8Ç9'8'9§8§9g8g9ç8ç989ïr.qÞã\æ¼Ï¹Â¹Ê¹Æ¹Î¹Á¹Éù€ó!ç#ÎÇœO8Ÿrnqnsaéͽ‹8ȱâ1nÔÆqk¸ŸáÀ¯ã™ó”¼¯ù2þû¤))%?¦ÖPu/~)ï¥^n2wHÅÐ7‡f¿bñJå+·‡ÍváÕÕ¯Ö 1Üyxñpøšâµ»&ËLN˜0‚TÁg¯Ëéáô‘7F½Q=ÂoÄYÓjÓKf«Ì$f>fÑfõfGÎé2ò¡9ÏÜÚ<Àüþ(ãQÞ£ÂGµŽ:=Úntáè_„{DKEQŸ…±Åu‹oRoú¾Y;†c9¦bÌ—oÍz«ñ-8v騤q&ã&+÷éxÿ s'xM€–Y÷NÌ™xq’p’~ÒñÉêÉ'§ÜòÃÔ˜©SNóœ>|zÑô;3,g¬{åLzfÒ̪™‡gÞœµuÖ÷³‰Ù£f—Ï>óÎÖ9&sç„ÏùznàÜ„¹gæí™wt3?`~ï÷…¯-<ºð“E‹~^Ü·ø«%+–œZrkiâ²ÕË_[^¶ü‡+g¯ì^e¾J·zúêè5Fk®ù¿µk?Zç¶îÊú„õ]ÞØµñG¬¬j7ÍßÔf½ÂúþæÄÍßoñÞÊÙºõá¶Âí‚í{¶×î°Ýqv§óNÍ.á.ŸÝ£v'ï±°ñ¶5µí±Ûh÷™ÝÏ{ý÷~`ßí°Êá¡c‰#tJuºíœè2Ëe¯K¥Ëy—‡®¾®u®×\ÿâ–.ŽrÙÝËc¨‡Çž+<ÿŸ¤Ý+ËÛÆ[ë3ÚçCßh߯ý²¤nÒý“LÈfˎɧÊT¸+NZÞ ’ý¼;øWå©«ë¡aadØð±á™Ã#N«–ª¾ŽœY¡ž¨VßÚ½&º#fmLt,/¶.N÷Sü¦øû ‹Î%Æ% “ôÉ»“¿nàJÊš”žÔÙ©Mi+ÓŠaÚ°þé@+Ó÷Z“Ûpο ¦ýø^‹ƒ}<½]Ü·‡,”µ² SÄøàZaÁtJ‹¾—‘ï&”†=Ô€’d€=*õŠhJ°EÆ\#‡õ»-\Öå¸]Ãé_­¥øn ¬Ü¾ŒäL¥©”dÝâi‘ávÑf2è¨%·¤+ò€dk˵™Â@~ãâ|‚TQžIñ@•‘DÉà r ªé/aÂw(7ŒIDÎǙۀC¸Œ‚q¦Ñd9¿3)?È:):Z¶í0] 7d›ÂümjqŠiJ““•‰™‰™Ñi {b‰3Šö›†ì µ ðV³è˜ìœš’&JÉHÉéT­\#q÷Û·{o¬Í//–WjÚ›¾„™7MKöåæêÓ¨aÌaPŘ\ô¨29 EPE#ÝГ}¨ír~WlNp¦P/ œc¢¢)9Œ«"Ý3"‹@ 5$HÏÊÍÍ¡7*+ªò+Í›Jü·‹P< ÜUa’\8²ŠtK‹Êû(˜NÞÞutþf{éwá0fKÄEÆL[àM.3rhwç€@ÍÞqŽú¡þì¡â¢u¦(#7€sŠm©¢PûtUmgÖퟅFMxEÂÏ,áðÇôWOˆXËiú‡c›­êŸG£4?'9¤%·'åGã& RíÝ¥ð–yN‚“LUš¤ Êó³›Sñ—” ŒoddsbA”ÞÚ¢.S´øºËU6qØÎiZÒ:38hA…¦þê·­M¿Csò•9ØVf 44Ú3)¨“UÉØÐ÷µ¤$%¼Àî}´6›~¹wáP]ÙÕ,³a¿¬Ú~¾–óù>¦Nçö/`þBd’`{Dä²X|å--¹87*\¦k¼_Tt%?U‰öø ½ŒeÊøWâŠU`75 %ÁfUäâ|JKÎÏT–«ãEÂŒÏyÕüAjÔ3¿ÔÉ´&wál8ÎGB¸l„`R1nA‘Œ¼”Pöˆ`OxäŠJà%ƒ×H¸_ƒ¼ne‡§^äY')Z]D | ÕØÙq}äÓŽ£…Bkt›®ã ¼~èÛ‰Œ&¹Ø,p -é1)ÆÍEmBÏ{õNSÇxIÑ«‰"lePÏLÕp˜yp6-åG{Ç„„y;z©ÊØ <ÝIÆ¢1<_û•®Z$#Õ€¥©Œ˜&zf1‹‘ ðm8 Ó_ ,Ç Qè­¯ÆÂ~ð#†¬Åä-Jñ¡O”í@óдàÝ[·„ãáªÒCgðCŽ8Xɼ| ®­2ÐÎe!¿PÑ=ÚŒ3Yg²M+Iû4UF)ó>ò–“ãsb=…6’N=¾Åö€BFó-Ð8‘ ºnùÓá†â¾^aâ)ÄE…Fª‚Aê@@í’‚HWŸ<Ñ —‹  ÔöÑp`1œÃíßÌ"Ó_Æ¿_ü€2ÂS悸h“) ÓÓâs0‹Ð&ä<ª¢(»C¨MáiÑ]Ù˜¤Sj$p#ºeŠ&`…Z=Ÿµû·ØîÙQ¹ØîЊ„ÛṢʲ¼Æ 3|×M 5“»]ÌÊ®% eoí!ãk@IøþmÔ€ ¶…G`¿'ƒÁZrINH »ñ¤ ›Ù>ÐÁ«anóÁñ‚‚ó¹Þ2òjlYXE¡¬‡Tîï©›d5·œBoÙä-·UúEzÅIÁz`ÕäwÈïpÄûà[ ºžƒFphogˆ¸SØéVéÕ´”ÒB•??ÂS­V‚hž˜»¥Ê.Ï·®šˆ¦!'ä' ñÐõòÉ’–£¢úŠ MwëŸsyP•:«Ž2/Ç~ê6úh9B°ö)?•Ëú©$¸ÄDÛa<¿%‡:RP\NZ§…jÀE ¾Iîß«Su ø#†hÙWˆ»ÅC±ÕG$0Oµ§AVNq~¦¢2¿P‡ª6£h¸tË6/¿ÊÖpÊïÃÍ-p¶žÃŒ‡¯Ñ®¶>!N8*ù•5…ÔÇ4$\¢`?îÓð^ïV¯6{ÍüZ¯ÍµDãÑø'Ãᨿ^„ŠàR: -m?j@YX¶O†2Ušº‡ 'YÎ6õce×? ÆÑ|ÿ© ×½^ùüðÉ€ZÎg^íçñŠÊÉ ä«á.=´LÊOiLiI0ù•gÆÜÀ•”)úM ö?c1£û×ÒHŒ›×¹!Wܼ +þËüé„&ÂÉÈ^”ìEC£sè\Äy2B$"7aã9@Ÿ³‚/ "YÖÄü؈ýÉ'¸ésኂ”¯?§£,xkv2x‰„>p,Ž®ÐYÀ×P˜à FÉÈsqeá˜MØÌ©¤+5ùmïôZÓ(¬ÞU¸ÌS‚ßñvØÛ)6ÊAUÐ-2¼J®… Ž0ãê1cÇã;bÆZÁ¯&Ñ`SLô†HJp@5U¤}Nth§˜/ÂÉÅÛ÷túÚ3ôÆô1ø}G_Ÿ 9½MÅí¢cÆQî²  6ùœÇNüþ½³íÕÞv¢að6Ž|£» žsЏ—™wht›NêHûx»ôUäêÔÈ|pž‚ït͆ÃÈ£EM¥y±‘ ‰±qQÂèð5ˆ¢|tòÆ­¶åä–Ž¹ëvËý…ž±.àj›#–hÂíö)~‹¬Þ‹à1š§4¦u•~¤ï: nPšrûVt/è–‘ïņÕÔ›TÁ{ãAT’šÕw´ä¢\üÊW(Á&¸²$¿á“GDXEŠBy°Wì*@=F l4x,,™Ï°¸Êüçß¡^Ž™â)c>&Û¡OÊ÷Y,õð³wß¶PYñãIÈnùˆ¢tðó~8â»y "…‚ádkAÎ!8÷€™i…Z>ë·«b4&GXƒ]‚~,;·bi—§®á¥vŒÁ[VEZ§G€3ÜJªélÈΉ Ë–ùEëÕ¢«i ftKöÚˆý×í²šÉ¥ƒCïTCŸÃÑzpw M¡¹û#&ÄŒ¡£7HÁWD±£4ÓÕ ™»~ФÀ«R*ª—©zƒù»ŠÁnàRrNA ¾V[E{É\Fn½&&pÁÝCßÜØÔ3N¸¿08«¦®¦¢]ÔÜ ´™3Á{D·®²ãðHÐY'­¡– ì¢WÔGt¡^ö;,gÙWv•gåÕTŠ“‰{L4Ý[&ž6Mé±×.¤ùþ—e-½˜@ehUoÍ_‰Ùï‡^¢½£Ã•`/p(•4*Ë¢ŠBZ>Ò5i:{NŸo¸ ¾¦ ²„‘ vŒ“Ðä6C?÷ÄFa‡}}ðui¹c¾²Rqlû§ÞwÁiЙ}­šBßô·ÓÐøŠyì2ÈcÊr t?_‚|Ñ }‚‹-̇,.Îñ-\„³Úâ .dp@KNOÉG)A~ŸÔâ^ˆA …ŸËø!ˆïé9°li)È=øÅÉPO½°B–ç_hEUa(˜E42ó8©ßBá.¼? á¸@2.<.>Ĩ԰ ¯îÊò‚ÅaAÀLª.iÁ#_’àÞàJ®Áé&]p:؟܇n¬?ÁìŠÎ‰Æ4ø“Ø{56KLé™YZ)Áw«™Ÿi'OOg‡¯®®Æ†®NI“Vp›ŒÔ+5&9˜qpÈÁPÑEUéç³ÎdaU옊]t'½œìKÈNjÆBÑË+H-5w ×Á/Ð9Ù“Í&Š䬾ݟj*î;!Ä @Žzæ/3ÂùØŽcíXÀÚÑAÎ?8X#¤»Â^JUVnFZVf®0·8=äRuþUÞî2™Ç–._:\} FXVŸÝ Nb/ë_M;I°‰ë½º;›;;=Y³‘Ï ¸e¸ a&|‰ËÕêwØüª_KÎÎTç‚ëSEÂWÙ— !T-? Úó¾æ'"{^-¿9Ô‡§cÿa6˜®Ýg+â= MH„!OûAK.ÍP‚CC*/¾š†›ûù~|y8Ž«lÖ¢aÖâœ'ä7y}BXlÈJ´ÁttŒ-KÊ™f (7K›š ²S²S¨§rûÔ”Þ Å.8·?`ªãÃÙŒEYWv¶>ÍÌàÕú©*–\&—­ßKÁÏKÊMNK®JÌ‹*¢V£×Ñë¦ÌJ´YN6&†±Á×¹…‡x%2eoV|&è¥ Ÿ¬¬ú ,‘eE‚3'MÆ%TU¤ħEç£]°ÜôÛŸt¥g1£±ö?ÐÏÑr>†³àµ.n?—9Kƒ“…ÅçØ4Á_FތӃlš€,·¯ACÆ9œ„£„ð Ú3+Š ó±Q÷§â¢ŸcÐÆæ«°·CøÜÄrÛÓŽû=Ï…\WÁ{-Ý­ºëà>ÛŽ“ú´Ø…Q˜®˜#™c4x¿°è‹ïŸdäG‰šìÊ“›”2ÿ‚²ì´Ìœ|a~QZ6(¢Ú%Mnî^±KC›B¨‹hnÇ”´¸z¾Å ÚA#õïfÑ\ÎoIÈ‹ ©r÷Yî)‰êH̺|)¶ä€âÜŒÖ4l"•œlKHI.[Ÿ©4]‹–ÊÏE—Ç–ÅšIßS׃\,»&“ÉI]|z\õzh9ð²i¾Ï~Îò*ùp:3®¸%;[‡35ÖDZÖ<ȺH68m“ó›‹C€»Á`î¡Á’GóJ +ÃB÷¸Eñ0(D£áh¬³ßstTTbbbr<Î!csŠE°ütéa4 ñ–îYæR%ëh¯©j,Œ+ˆ,Fç&bìQå5ÅMBÁý:kÑ  ñ° v—9ùb™ìDY÷:œ;Þ£é;*ÌÛS¡<:¾¸µ³í>NûûGÊåTÝ~bß¾ËE†Œ³ nÌ­ì;HdüËñE±À„%F†:!úØa(»òA‘¨,ÊkMÍ)El·Ë=Ù›£Ýs˜Vó¡’ù´êLaÁ¡,3ƒ_d9x‡MŸsµ´,E¡*B'˜a¦p ÜÕ¬ý:×°OF–$&g$7'Ä€`ããƒ|‘Ÿ)ô"Áå¢â«ƒ »”PúXàì \3èyU¸‡¬Ö (¸LžÍöë¨"â½Ø<ÁöëÜc{#€†™y­¬¢Ã2bÓcó°:Sš~MÊ*5yú ³*´HNæ$g'§Êäì8£B¥ÞqqáÊ𠸬„ÌÄtï}&ù…™ ¯KÈŒ×øÂב©Ÿ»¿WtÄöåÁ¡îIØê‹±ÎHÈE H·¯µ'5-+;+§Ì¯D–]é•«‘,]}Ø’q8ï»ú¸ïè +tç ëãü8./òqÄT*ðX6bªÙˆÉjžÌⲂ\JðQqyIV‰y[‘b³Aõ¸¨U.Á3 ¤ÁÂláŠ\P­Eò-†¢ÎêH1[4ºŠtKUç³ac°Ëo›X±q·Ð÷¬g•°öþâͬ>‹¨gÆaõûÄsÙî>»X}†£»+5ðc>ùÁ±—æ°>`Íîÿ'Bá’ˆkçêæ.Úf\Ò©)nÔý:œª }7ltö×ï û%<\ì×À]Î/¶Ê 2þ‘Ä¢(àTIáñÈ=0E¼UŸPrÌ@UQNWZ*–˜™,"ÏËÈŽ$Mtž¼i²)zFC"¾8)›-Y›ŸsˆíEî•‘ûâr£Kl¡çÀ7¦5|hÍÀ¥< à½Ì7í•å Ø]ÿ2GÙ©^˜­Öm&à 8äójïÁ\æ Æì ÏõŽÀIéíµ{‡÷"°œÚÐas¸sMææ§Y-¾}æßß|h—àÌ}Ú†ÜÑB4Ù£=pš %Wö|-R5Íw·‰\‡“ß•h8WÀmp(ÎŽÀÐ ½ŠÆ¾¹Ér½LU¢ÏLÉJÉ]€¼U|Á„UžtmR‘<É-É!Ô:È%ÐÉWæ (EÃá#¥5 mëubN3±PÀ?Þä‰L õüN(àañ: =ü*¶#®+Âìžôð6°žÚîè¸]áŸ_ç*tª÷-ÀõÈ)*X˜ Â(I™¢¶¶¢²6?1G]. nO(ŠïÎÊ0­ ÏŽÕHëm‹UÕ€ª)¯¨iPîL9¤‡§{”°MlèOÅ2üG.<‚(z!ß%:·SÔoBžÈË?&<Û€T¿¾ U8]JTUÃÿ놀˜ 1…Ëxõ¯¢‘™rSàÒÝÈxÉd …–xÐÿü8 ¾²â&â{&¨|…-pÂ'ÁñuŠBmôÅÊhz9Ò×V’[% mˆºîƒ3™Ç³2²3 Ó nù‹@·ÞÅùá].}4r›…SNñ](ƇÏâƒi8L)5ý3±<”ô|ÙoË›Æt‡Åp4‡ `sÈÙ|G$ãiùeçªÊâ8ëÊG{šy_±5ÄiBà,H½;Bàt­£!u±ï¸M]réÝlãåe#”Û×ywfd‚”L¡À)s1Õ¤çvÚÇ¨ÞææÞcõ‹÷Æ(¼q žˆá9+ª¼±Xçå²ÓÚãð½£yúö“¬Š†K!…‘À…íl—€(˜€ñ:‹KºNÈ=*¨Vi­»8@ꔿ±|ž056]™HÁ#oè¡YÁù¿9oU>W˜›œ„‘p³,®hÛAJ³¥ð¥l}lÇÓk}ö“îH´!á'ÀÅœgc^2¶‹l›Ý÷÷¶¶âc­øaŸèhÿZúm>RÿjËûÌÀ¢¯î»¸Ì2&†o’{k$y‹ ¨ë;“öñq>¡;¼}vá°9³o ¹ŽBéäòB×noH¥š¢äÇ’ª¸3‰”åÑoÈ‹ÚJêõ õ%ÝàØÞPëÙî«™ÔGAoòrX«cí Qý¡CA(Ø ¶øzYERÛ™Eôær¿Ðöëtg‹YŠ@+üؽ˅j¶ÿ˜Zg³¼C­éØ{ª¯¡¡¯Ç·Þ)>$Ç ““@ Ô19ùmû®b¹j`;´„‹1uïœ_÷í38T!$FçVÆä›góóSyÏ,~nv”ÚÍÀúý/Óÿ¿oH Äš~³ŒÂ™ØÎäÂ4ì&7€õŽ.+½wNó(äò%6¢¤`Á`÷N‚“-|wÀ[bGû«ýÂ"€²Qž„–"BÂÉe'öÐlB„X;DôÀ¢åA(imÒÄiL˜éð%¸£a„ «?•¡h„a†£WçÞñaW¦A/:r¬ñSp“zϾ{µP¿‡®«ðqqU9ImD¾;<ýÜåªiîhü¼á€HÛ\Q¬ÔF†¤ÅüxŸè³Ü߸€ LŸ J`Wæ¯È–™# ¡¡èõ…‡·_?uX¢]´ïLñ±”{å ùÉ… ´åì+EßýJ˜å Ö¶ô ètœþåÄåĦ$g&•Gg«@ ° Üà±ËÏÙ_é |ApUj}ZOæCåzmy1Ð…he~ÿgùœŸâBZBÛ|¯êÀº€®¨‡ÉT>¹¨Ø_e¸”ŸÊuS5_jªtàSÃïë:ý‡%¸ÈÌd×Xï IP˜;ØA¡µ$X(Ÿt+¨BV±¡% åæHú9@cßÿñð× $çÍ5(é*F§»‡Ùð ´äÂ÷Ø@—8¼2'-;--µ:W›U(m^à^ÑM‚ùÁ¡–8/e†T‘3RC‹À йÈjÞ0ò:óeš(›iìw9Ðe„@Å\eæÒròdlV<ð®!^[W¢ÉÐËô/m=]à,uuýþñhè2ëIŽùÞík„hÌêV`*5öƒÐøêÝé…‚²õ§š›ëAkAUiqAA±¶£Xgœêª–31•mÿèõ¼âêÎê.ÓÒÚü¬Nœö‘Õ€2£¯!ã ïzg7©L€›_R,Ó9uû‡@K™öh=‡}IïºÔ :¨&Myýέë\‚6¡ØÓûz p—{AIßí·Å˜¹øó]HÝå0Ì[ô@Ê,&…(ãÁ/lSB3fäs`3ÅedЃ–óýVFÆšÌÇ>}Úך.‚ëf?/¹Ž»`O¡›[°DºŒªáëÏ´Ô] AYá‘”-Ű£r‡·ížÅžÎh<šA)˜Ù¬Ãcjá,àܯ!ó[*ÛÚÕútgd°±;-Gn@åeGEŠ=—ãÐýhÁ@›íFƒ¥> C©Hò^J{V}ycyq Û»Œñs¹¢êVùœòÀ*¶¿ÿ>Ö,)÷.wËz;ÿ ¬Ú,£Fàܪ€/ƒ§Ëü1Õ¦¤™ (ç}ІÿL&-ÀÿXçÑǼû‘ ÔÀñË „àÖ FC·žn¨<¨³m®Vë==§øŠBÉOüB›%”à’Þ¯ÔÁnäJ±ýf¹2¯ÞKèÖæ[ŒE±Ø_.ÙyÚã ¸šb=>¾'¼Ó¯ITšïZJ nk+«=9ò¶õÁq–ËlÆî`cvÿVËñ¸ðdÿz“—4ÈÍeÎt{4 ÌÐÎÜ¿´ge§ëÃ-T ¹­Y¦ êö=ñ€£~Wsª¼«JwŠMøKàÊ»ÁwMjfþåÏzŠx§¶ìpìèönØ9Ÿ£¢ÀVe¹];5ðÒ€7z:~;Àïq¼“-²MB­ÙiRÈÕ ÊÊMwNb‰ ú§Ñ^¾¾^î5~M-µ5M;ulë?f/tÀýèc0ÊüC„‡·?8ACG8—N"¸ 9%1-!Í,2/*#PqñqÑÁÕN7‹ ÂóÊÕÑ‘‰ [WyîATlzBvvVZa1;Øqq³†Y®—j°ss„À”YÎÜ¢]q’ñ*Ö ™òðÔ sdfiÞZ]a½ÏITRÕ¶3mç÷B3ž 6¾,?©Ì¼ ´ä6–UiÊ÷…”šJ\¤áN@sý«?†¡¦ù…q¥€j«Öµ¶(««DhºAöDï'¨ï.Ô–†È…‰$ÖñõþMÌMr¶ïm l€ÓG|~‘`wëÏ÷Zäëáçìe¾P["rÚD0üK\wBUÂÏü$ ±H¤`*©)ÈÜwù´:¤VØPì]¸ˆÒAûüx¾ $cÚ®4•9rD"4¹!ã}¯lu¸!¿ AÛ_&°J­lJ9`άÀÅ< ' &$x……Ê£Á:àZî¿_¾/ìsð9ýÏBc8¬¹:*¸PX”V²¸þÒÜ3*__‰g­oSó T.d‡Ž0Ðy‡þ‘¯ËŽ ¡£$pU«<Ö¥ªŠØ9£Èщž€z“~Jo*ª.¨¨Ìk”৺ªÈðääÄäDQ¼:I ")o]`kkµ¶éøÚ&d´b{ˆ‡»ÐÕ5|oÒLj›ãqt›œ¢Ô{ãpõ ¸ú uh3ôÌBôZÝw=pìyØXgêA“oáë#‘ÌëÌK4âó•·‚!—ÍÂ*µ 5ÅáRŒ¬$Ç$±Î¿˜íÓÕt]ÚÚ5ÍÆQ¥ðÙyúmoš,ÏšZ¸á!¿ibzXª{p†*5Pkܽ7ï¬÷9ÖÝXÖÙ äÛ©‰è4oõ%åúr}n[Ö”‚¾Sº øÿL§ââžtØÊ“ “Ë(Èá <0Êdt„mP0–¨^ Mm}…¦±º4F^)ü 󦦕sÀ×ß<äÂùX͵Ú4wÞ™MŸÜ9sêö'Vg抂Œ[ò}&ÌTùº{¨êï}_ßÊRŸiÜ_ÚÏì'.즷ÚÚnßÜkwòäþÞ“'ìl%ÛÑõÕRoÿ/Ÿ]½¾ºFÏöØ©ØX¹Îü÷œ$Þ~ã…Ž=‰MçøãÁßïØÉ÷Hà¡•&Æ$›°™"K,ÍfÌ_”ä^ß•.Ù;Ùz°;X"ööP9$Îx¾Åá= »h$<Ãÿ¾¼á¢®8F•—+ŒS'Å€X–žŸ€)·0RÓo‰ƒ–·ãÀ¦_·ðNð™ý[xìÄÙ­ï±sŠfÔûb¼À±Ø¥ôφ¯ÓnvžJ[@-€¤¨f‘àL|]h“ïië–å`7‡»{P‚œ±¸p½ù˜%»VºUËöµW–7—%䨊Dѹ‰ ‹ÒTµ«Pl.$íìê­póñŽÔêñó'«ffò«6µ¶¾gþ8Zò3JÐ0ð¦7-—…Çâ É=XÛ{Fßp·7a _.m?Ô[ì=MèÅJBä×q£ƒÍîs!5™Î‹ÉKËNÉfµ%Aá¡i9 Q\j˜{³ª:¾˜}Ø×x´ËK·C“œ)ª9Çsæc»‡ÔÀÎu ×—µ›€p¥®î!\­=ó®ÒŽ,½Å\êßEÛñ÷l´õ_<€2KZP®ÌÔ˜éoÁ¡­WZZŠkjDµ7Á%Ÿœ—¤ÑF&–ƒvИßV7`úë[¦ûùï÷O¦3@zRnl^lZrV¢.*3 H( ëñ½B«ºïœtG¢PpêVÿ t„~ó퉈?§oçÖæ¢j¨«§æ xºæÖ½QXæE7j=ím‚Öú9‹^²0?6Å«ì>Xý‰¾GTVSVX¨×è±Ó& Î;}Ûo´5±ut÷ê¸êÖ½A¨¬cOк¿ÖáZÙÓWý1®CSk¨;¸þ3¬2~›IüÌ4i¡¨ïf¼ˆÁ” ßà2»`7݇¸$ « ªJrÓÌtÈ9€<—X¼Adbd¼ A¡¦áµáõáÕ‘Uf»¾SôbP^’y*•Ò¡#dGbeD™|e›ZÚÀáü¼ Þ6dnÍmI°64|;äù©–œ—VÞ¥@ó>d~‘LÏã=¡g§Wp_l`ží9a´ô1>s·^“ *ÍtÊR?eh´2Tx½ýœ3lŒ}3gèQ˜è§}Éö˜Kƒ1Vn3¶ûº€5Ô„×áóÁ©O»üêÝIJqpFd‰R˜¯J‹Q”\æ±ËgÿLJrÎ «z²«@5Ȉ)H.4\ ‡‰´»Aöô´µuïwo1ô6ºØ ÑH:ŽMý¤r«OšTO HMJKH÷Ú|!õtkRvb»RQ˜P (}™¦¾!¸Ü'"2!2@äï§VõÖ¤çƒbª)Hãé¨pO‹ÉVº`×¾Ñ#=2M\&+T¥‡c4(•oM`]InZVÔ¢ÉMÛ—ž8/Næí£Ž !5.-V·¡tRê‚ 4Ö”m¢éu?iaT×qÀgðý{Ü«ŒK7¾j`RÒÚw`¦Vgg§¥¦edвsÓ²@U¨ññ THìš}ÿåò]¸ V˜Ý“ZYƒpŽÚƒ†}ÆÿºâÀ¾ü¼Ø˜¤¤„ÄxaLd|PS2mPM]Uuc¯‹Þz—C “—Pâ¼#t<…†òŸ jÞ3 j2cé¯?äõ‘“ò`Ú&' o¢ræJž yï} ~æH'ö0Ë/qÀ§\8³žNˆKJЉr±Qá|šÚÛ-9Ý·¿¶G+ ,ŒOJNŽI0 ŽR'âfs ¬ì(H/Ë®¥å¦¤¥d„~2† ß+Uæ*Y@P°,8/¢6DÇÌâ=6p#¦ƒRÕé^E~¡™a€ò ö•–Õ¤èDûÊrSÛR“6¨%Îk;Öæ»§Zy¦F¥:iüóÃ2"% ’új‚ëŠJ2 kE5…YE€*å'ïL²Uù'ªA8å]X__U¥/L(ˆ¬*&”&÷¶$$î ÑF&äcÔhÊjõ!¥¾¡ª•Tä¢T%J@ÊÙžúÞŒÌÔt ¸´¤ôø ¿Ö“àDk2¾P©ÌK(báVVW\櫊HPËDNÊÈD÷„”ÞôÒÊCù5é ÒË«¼}½#Ò"ó„{ÒÃRv±þ™V2I•0³Ò\óº Çßr¿Î&„ë˜Yô"G§Eëª%ðMÄ·¯Q䄳½ò]ž^…EéééyYÂÊÂlËu¾:OO©Ô}ÇE‡O¾ºtäÚiÇòCÂ#)ÕY81þªª¬Pß<èckT¾m¬ï\ÓãÙ©ŽÆš5º(uB\ltŒ0$":DPþzßÚF½¾áðºžÅ³7í\jWðñJ¡JA×}þ¬|°ý)‰BîëTpØZ(øn󡨢æ‘õ•UzáßÍgœ™Úž¿y¼g©o–˜:é-d±H»õÔvÑRô:¯—ö§f¥>¦°…?@‹ýOY!oÔF'k@¨¡àºÒCgJC „y[锽)¾@J¡‰Á»¶z—v« i×Ýþô6>2¶DÆßð¶óá0´Š÷&ÂíÛÏuvÃ`| ’§¤ ›+ö1,û˜sú.ÌºË €Cè[<ìhQw³.Вס{0Ñôĉ‰uÍy- × ôD5øw>|hºõØäÉ®Z\{`f<¢\e“˜nÝþpb€›ÚØ›½yž:1×ÀLúò±ÍËVmݼfÕö“W¯;qÙ0!¢Î×0Áy;æ1¾ G„÷σ¯Ñ»ýÃíÁàv"r¨4²§1 —b”Í>'·ë—à«¶{6yî2: pÿ¹%4=ÞQØØ.„Kê"™ Ô¿O¡ ¸œ>B^®lÙ×^â³,M¢R‚Rd” #3zz°‹ývå ¸N*é9ÚWæ>™í˜}  ÿŒÕP[÷8½ Wñ¦óÛ踭bJ· kmÿa-ë9_ö}É…=ý"ºï×›p©–••’ì22’Û’sM[I†![É”\Ж™q Ó,ä¥ä±£À‡I4i59³~Ã)OQ]ˆ.ö`…> Ådrp‰KXk&ƒ+É©Œ?½¬Zrüä´ëJj5ù½ùØïè ne6cI7À±yGþnhæÉÐËáÈ&EU¿ Æä VªoÀÑcàøå{wh`å‹â6沯¼ºµ¯Ümª¥J±-Y(!’Šã‹")V§È·=™F¸îNHÉŒFeEHêÔÅ ¥Àì§O¿€üá]^z‘·^R¼ ê@^E޳²»UWÞºoäÝ9½òÎ ¶}VÖ+ÚáÁ&fœ=BPˬ‚ÇhdE‚åáa+(Ás–ì€<?ÆW²Gâéê¼E9P›Ãò:E0„ƱڀR4|0ç•":* ½ÅN“¬*Ì<òÅ©PÏay@®¼`#¥…ö¿ ä_H(g×çDE+½““âã‘dÀÌTh…x1Ñnq”` º‚Z-šº;3"T›üô‚<Í·p‹iE; ß¼,ÔÉÒéºéwÓD°L‡YŸ^SV¦ ;±SY«2¨cÊ´qóã ¥½òåÄWyD¨ü$¤Èó\KMË ¤òÌ óMÀÃ-äl¾l¾UŒŒ^²Ñjé¢3›>¸yúÌ6Yb è“C—Ší#ùlHåpÿTì¢Îyï³S¾!h]Ìf:..99)9˜Å$¦ç‰à ²Ï¶~ñâ=~ö²âp]¦°<31+&[—‰“4*¿,·B(8Ý\î.r%‘¹§› ØPnuþ]­µùµMÂ,ßBu=¨šœ*-%¸„èF:"Dƒ¡RURÙ¨­ê+2$xgÞçÀOû_£Ñ'+á'üÇ£=Æv¿þ'Æv™ÄJBc츠)Éi‰é‰fùêœø,@eedæh¤]6'D%ê¢ðŠÜ‚Ü‚ôôã—›Ž‚r*+!=&&&A.Ä­€‘CÅ¢y/\KZú‰çÔòâk a/ _½Î;M¢W—òàKÏZ`ˆ5Î[ž5ùÑÚöwk qcj¯³R¾£'ÔÊO¾ çûÞ:õiÊ‘Ÿ¶#KV.ÕzìSGA‡F×Q¢ËÒfdƒö“ÇÐÃ>³Ñ[žjtÿß6ú3úôþÑ%øqþ;ý^ G*AN%d*¿:Ä—?øž¡.s™ ˜C{oðبÅç!ò»Î~p¬Aj]**{Ÿrã2Â2] 2Üq€ÎZˆ†£aŸ,…#êjÒs[D©Y)”eäe§ä_5EKÌÇ=h šö"8½ ·C8 NNÐMÓÑnÑnc8¾ŠÌÑ"´G34MÂÁd\ÃW¡9œ&ú›…Ò.pŽ+¤GÆ>YN‘ó¬ånÿ¦å‚—HfÜ vÓõGGj>¸Éfxo¿ \þ•í5Øøå´û# Óÿ›Ž‡þ‰´¶¥¬@¨6ÜÝUd"Š"?=ðiôÞ:Ò 'Na‘™š ¡¯.&Ý/Í?Z¥JÊ«-è4$n_ºs  ÙF#L'¿´h ÊšFt«[·ÁÎ×ÚCØ?v` v“nö3áåìle¶¾3›|ÿåŽ |Á÷häh4ކ+y¿ê‚u³øp†±áïS“q«/„¢ H«Øél^/8;YÿB³“¯#+æ—î5hKh«ùërÄæ2Ýá¢s)Û–”hP§ÈsÆèLƒDÈâÁXÌÇ|yp×Ũ“A‡D²Óòzë¾/zMmëÞ¶·ÑÙZgšÙËú¢ÛC:}ÌÐK[öûðþ²”>®Ù¦¡yÊÝ[”y*QX]\/øŠ‚ ÊŽœ>5û“F4Ò«Ï=þÏϽü‡æ€^yæP%šÊÌѶ¼åX„¢•hå™Mp%\W¢UgΠUƒß7ÁgV!ü}Ó&Þ??Nƒ3'ñû­õîc’/û¼ÏÝå0³ïr™À,èbÇugóÿ·Vˆ£³Ÿ?·kæñÚñÛ¬öz²~¼ú¯?ùÇÖ ¨åpîß©¼áÿ@åQ«òÑéÛ]möÛÁñeû>&ÔâŸgÔqõ¢Ô âÙœZ@ìbR_° ý?;9­f"Öÿ,gS0eŸƒ´ÿ_Ñ0LØç=+]Ú+ࢊŸYég|øõ-h~™ ]™<º'Ñ…BÙ$pMNvH¤Bà²RÒ!-9´S?µå’ܰRýæâ b@}”ÇÒkýÚ·~lz¸¼ºì§N:¶¬¢|hH7ó;4;·+¼ÝDžüøý¿GÍüf5»þ©…Ô^;ùúWçß,¤Öüƒ…Ô›=[üDÆÏXE=Lj½C éPŠþ®‹æŸ[Òãöïo‹ah‚I2l.ñã}.,UÑ—rè{φ”šþÑm&Æ¡7§Á!j‘û¼ßŽq¸‡E¦åÈž?ÆñŸæäEÌÉç¹é:ˆîÄŒ|f/ˈ—1ŸÝË3–ß ½š±˜†N\¸«Ü…VV Ýxóã³g>úÐêìB‘‡ñÑ^Û­[ìí¶í°?pâDÏc¢'¡«¨!hˆa8|„àÖ;Æ LÑû8ÁúCbô_dÑüÛÏ…ËŸ¼×A!ü=Qô¦Í0L›g#l4—!m’ ig8ÇEÊý?ÄÁO xÀ`UZ¿”Â=ͨ‹†¾¬ïþ4^ ŒÑ Fów Šú Êø7 ê"¸ 7>YB€-!xë.|ëÉä6pžfRî¦+þ;€ n?Çb2n‘>_ ¢–ÍÍöÂY>†Š®‚+2zqÞõ°ÿ¥í#0ìâ»zaÛ£ñùã<ªÙÅÆŸ£HþãÝP’ Q7 #;’²êeuQí Tê[+<ôaûÁ> Éíj£ªÈèøøäX@†”ëØ^U8õÎÝ;p*®‚S¹L#ÓXuÍ"aüˆvõðpunòÜ×ÞÜÒÞîÑì"˜eìâé‰yìkkiÅÇš\DO&u}õ“ºÒ™í¿;½æo¿‚fØü{`ûSðýö‡ÏCÿ¥ÍºÐfXü;Í÷ÏÐp>xÀ…:¸ŸÞ’¢Î=üLM¢yxAdfjFjjJifqz Š³TR mTQ…Á0á?°³L!ãÿ{ÿ‡§&¢ÆÏ~ø¿‡aœ‰4?Q ‚¿ÿð9ºî¿…ßo0~Ÿ×†ÁP&_còÁf¢aô~ÿ68õ™ƒ“÷'zjp2üíˆé˜Ñÿ{@31 ž7¿ì~za4c<;©þ„ÿ%Œþg£qûó-þq¾õïaο&}÷¯æ_ÿ5ºLÃtyv“a²Ä°Ù.Ì6ð%òîA óÞo' ˜ÿq |˜Fdù×Üù þý;Gú4/œ<_„bvÝëcóçSª3ê™ôˆO×!Í&r(’ ö¾Ø†t?¡uÌÇ/Þ·ËÒíQÁS”ûFøÏþ!Êöhäp´ÿ—á?ÈÏGiÜêHÃ,E¯ü›(j‰øÐït‡õyÜù´”%ãéÿTÇ„`ÆÀLø¢øݸ0šÙø¬‰ÏÿŽŒÇü2þYUÿ—wÝÏ {æSý+»œ'>{ö8“(¯…¡}‡û`Šžs“ 7‹Û#é´øÎÛp4¸NÖ:A"½6npØ V€½ŸD ÔüÚ>ÎO.™ ¤Ì”\ Î7ÝÉ/„K:n^ÇDï¨qÔøäJ²vQeP®ä'øE††‚X›¾«.$Ó¼ æm¶›¨t ˆÚA9ó¥6¼ üd¶cð±)‘”˜=6ì—ð~‹*E¥ y&×Âã÷Ùÿw@z¿ÝÃoeÊ|ªò.ú¿Y•üüžÒÒ&@õ 3|à”œl›@)à®JÒ&=9»k’yg%]À‡áA "H¶ùÛ"°ˆ͹9]i” »½L¢ÉhÎÓ÷ñˆ/P*ȺdmH‘…¢H°#&Ê‘½Ø¬’tHÍe7p$ c¦?sS &ÝÅQ&G™~{ŒûÝ;pÝoGÃr>$AMPÙXJÇ‚óyø0bÀÅLáõ“ü#ÐÀ÷šï†(@¡øÐþļßí9[ 7c&ß›š™_5œÌ7˜oø¨±¥ýú %ŒÜ:à€«Šîƒïƒe8àg˜ü÷ÇþôÑšÊÌv@}qôm4Yž˜à)Ú¶Ï£ÐØçP[;éz°žBœ»3!çÜqÝá‰Kmp€£)¸½'¡·ýâü—ÿÿê®Æ)ªëŠC˜ýˆEËìs :‘ÝmSG"µM™1‰6NˆM $“Ä4È4ˆHBÈ(‚«Aà-áËÈÈ®´?!ú°iCÜ6èŒ V͈±:!3ç­šÞûÞ¾ýHÞ[ö»¿àÝ{Îy¿óõ»ç„ÂÀÄCÚ}È?{kzBz⮌dZ½-õÂ0ø ÞþK}NÚ)RY8`ãfPÀ÷dDЦ›H«l¹¶¡9*Ðɵ°_‹Ô ´i-h•I‘Ww0¨€“7Ñ~|9möǨöW%¼Ä.@±ì}Ч•h+ú^{Q-‚|Ð@,DñE/Àè.m›Vß{üÑ*tÿd zX´åáÆ'¾îüA˹kØ«í1õ5\-×u8uïð?Ì®ªƒrªGs=P}Gïù€ê¡Ç< ú3½È€ê{DTSJ?XEžßØÇƒ°$Ž+V0ÁÔÖi¬`ÉhÑQ„M­@«Ø¥ÚñŽúªúRòùçãSwÇÿ©>­µ¤”6–„‹i#­®(7Ü•úê“/ëfÅÛ °fJ÷ ÐÆ¡ë. éu¿Õ’wg†#Yü³³„7k»M•ÍÇu|DÓï¯n)碌Ô`QÍbãï_t?ýñÑÎúøçdЯ‘Gpƒü#¸é“;®ÁG"ó"¬kP¢¹ÂZDxN¹LC¹+å.æ”Û‹¾Dw|®Ü†{~b×4ñ×Ì.á,mÀŒSMÑØíÑíwƒ©{’­ýª´€¾I_ÞÑþ`«Tÿ>Î(”3Ì(Ž®É;whçoBìý#ê;'#Ì«=¥ì2iJ!ö‹Ö#œÛ1ްÊ÷µnmƒÔ´;êV¥ÄÞ¢Ó¦xÊ}¼øhY•FyÙÖýn‚µuÁ·íÁT¿·É5‘¨Úça'œ°kmþDæl^ ·Pš×ûš±ó-˜ì“é|ç¤T!QV \§ìµ‘‚' tNõ äŒ&á9Ùš“x±ãÔÉŽ¶ô†WŽäÑ…GBó óéBZm8TQyúÔÙO;‰q8£¦MÀx(à>´tbƒ<¬ÃÁõWöñwP ³’•_¬‚E%e´±\—ž|ø-z¯›Ð91³¶Ý\ZnzW×óª3=ÇBDÌ1ï¬ÔÎqø7/ÿq&`L^èŠe·qˆ=缡uÛ¡Ä•×im ÄaœR‰àT´ŠºE*ÀiKÝÖÛÎ×põ6ê¿8Y|Rl¡+ßr¹mqm¸0Óo¸üSVÃåŠxÃE‹Øì?p>Qº@ û2Z8å­éŸòÛ)NùΞҜ£9jj4ù僙’2ΦÕÉ»Íu¦ês™®¿¦´èL3a*ŠnxÄá¾Å'ì/êümÌ˶©M+A¶ä¨–Xƒî¹–ªÜ¬¼}t–:NÒ’^ï܇µ'ZKtƒeŠ™Ñ¬Pµô0Î9f•¡8ˆ—v83¹óÄB3{óz:dÏë¹"o^O6HûÔ%<Õ7ñíº"æó»ÁT¤ÏÕ€ý™É5òºð6:ò°­5eÝë]  }%×Cbrm®gÃÊ–ùm±F{Ü‹ò½†!.‹홉ýDk²M/˜ —}¦õ2§DõNþyZõÚ›|É7î ÇpÀ!³æ"9Òì&r‹ÍP¶½]u€Nâ}ëA~««©N]‚8¨†XUwC[cyÅá}U¡¦=Õ†zZ}¶¾¡YGEt¤4ni瞨í¡Á¯¥ 6aŒ[âxÍCq4zfÕAcìvW¹‚Û‡#Ýøs‹™ ÙÙànQ|«*÷PeÖwíXÁKÜ*8373#]÷óz•7å áª8¯w6&` §¤f·¸±"!Øk RÖ`¯ã¢Ý~|çpg¹t»ùÊÄÉB™‘¯€‚´fH}†òtÈ›êE?ŸÜ!/áá4ÁE¶Á W¦ùš\“Û3~ÓÌ&šáE³²qèÖØúÚÀ…~~ÿR; ä endstream endobj 30 0 obj 19707 endobj 13 0 obj <> endobj 12 0 obj <>stream xœU{XWŸ2™RE‘"–d¬•ÊCªõTY…ò”®|kH&Éh^›­|ìV/¸« ÐBIAQ®„ET|‚ÚúùµJ[uëºZlk»k©gÒKw÷Nð«í¿ûÇ|ß{Îýs~¿sî•Q¾>”L& JZ039)=27åóNA«“h5é$K¤8\&¾ì#†Êq>÷ÓºŸÒ¡TfUÏ@Q5€Úû²Ÿcˆ'*@„Aâƒû±Jd.ÙG²oGÏù}NxddÔ[V[¡]0ܸ¸¸8.·{fá’x‡`°pad‘Ï›¬63oqFs³xžsyN/˜xî­™ÙóÓg¤r£SgÌáRy oט¸ì¼\“ å2-oqðáœÞjçLý?œÖjÑ NÁjqDs NÃ9l¼V ‡ø-o“ Qœ·›‡ƒ¬9ÁÁì‹“×qN+'X´¦<žìë­'g³[‰ÝL,*Ûêp:´vÁæäHÄ줔þFSŠëˆ™³ê‰§ÎªÍ“ªùÅæÔçä œRœ\žÓ ›ISHâ(›]ð¦ç,†çÑ£8;oÐØu&ÞáÅ•Xy^÷«ª56›©Ð{Öêõú%¾àtð&}ô Áœ›çàfiȱLNRö7;Ï%úÿD£(*Ä¢ÍJ´êx}¶ÁáL𹹏è×ÇŽ{cüŠšI%QÑÔH*›J¦R¨Tj•FͦæPT•HÅPA”Œ ¡Qƒ©jH½D±ÔpÒJ”/q~úT–!+•}ëó¶O±ÏUù[ò³òÿúŽôâû‰ï7ŠTE†â¸âºâkz]B÷(e 4ø‹€\b4¼hq AÀÁRà†¹ ºÙ>7ùíVv_<Òzõ\ýòé*|ìüG /¦_ÅÊĶ™ZU`ìgJ±Ý ø2‚ «á![Áã?ÇÃ'Ž3qJÏH˜CÞ¶BCèÂd«mb’–]ì=¹óXU£º²¾¡²E{m•IŒ¿çSäò$»^É-B&ñ Cû.) ‚V¼¤è»3ÎWâ—úºq°Ø­ÀΟÍÄêïÑ#€·É¤¦¨Wñ xuh`ï ¸Mÿ©<ì>ìÞw}Œ®ëÎÆcÅëmûZχ ööܦeîy•ñ$õÏhˆÀ,ÄÐnËœ¹zKŠÇÐ8ÀRéÀÞÍ˳fðËÕ8•&,þŠØAh€±ÅqaX†“qÊ¿0oBìALýÇ«‹±‚í>‘2",'yÚÔy]Ožœìº¥ö½É7ÁåÅZ/Q©–Ãå´±cÑž4’Žã˜Äš„¦µ;ç²p]AG÷hg°Ÿ8½v4åÕð…©ÉÉ ;¿ûþXW—Zé)¼ÒƒžÊÄ!Ÿ-.GA;PÇÆk› '|‚eôõ(ì‹Óq£0>îü±AUôªe:û<¤E+ªVÖ¯uýq÷–“LI[vçÀÁóèj\å²V¬Üž¿MÏøÃ=ÒLz¾î•Ý’(¸,Ö±±íô¾ò÷êÊ+·n)Wõ*ÿPb,.@Lô’¥cÕS£oõ¥'¦ÝUú{^G.ØDT³B€¤;ì”tχ fÒrïk a±_à(5¾éZd}‰/§üÂmœ– 7N–¸Ã–½ýôy¹[ ÃäbéåX¥æââ}Y¤Â—"qžŒ§ÜǾ0ìBsõ'§Ô‰ÊŒK’çk®WáQt±¦ÒÒd>d<·ê.b æÑ T‹§•x;¦Ø®S‰¯…ÏKKL_|åñ¿Û®]õÒ >Ð >²jp¶$V‰èÃnz|'E†NJÁrÃ.Su¾ºº jéU09'øÀúòõ(Y®[™a°ì(/T½³kó®Íû‰7ýgì÷,ˆE7ÑÙÊ–Æ–ÆÝ'P;ê2Iú'Ÿ Ö••¢¦¾ÑuüÊGŽÅ*B¹óGø±GÖÙßsul<Œ"2*%ºIO:¢ùªa϶Ò=ªÇÊ5[6n-BŒ~îcj8JæˆZ·½t“³ZÂ椩§=f_@V^ŸþI”\ÚÇ@»|¦Áa8ljØ ‚áôŽ3µt"¦co¡¡pÃêw6ª ŠJY?«(˜+Ì™"Ðâ ~­aÅÑ‚cè:]wü$²n+ªXÍ@ãÁ̾©]œ´È²§¥µÆõq¹êX™{Çö’ÊÒaÞΑRGÁ6Y#i<¾¯ OÛ¤5lýÙ¬ð¦;vƒ¼—Ô O$Öxæ³}ƒèÌ>µ†Ðïh¬>„˜k‡æMŒ]:/y†Ðpö]©ùKðàG1 "­õÃd*Fû]d\gÊU×Âh´Ixª&Œ “7C» ˾š þè!êln½î¾P󞬺³¢}É­ä–I¤=^‰…Gã°{¯Á¦¿î¬¬QW”•–ÕÖ1x8Ÿ6e°·õ]ÕñmöjëÜØø¥9Ó§kOÞ¾Órê¼Z¤A‘Ãrcq“n?hXã’γ„Ź?›WhÈõ˜ž•/îz¦–N³Îcd§¢Œ˲sgŒE8ဪ7>šÓšÖÉßEÝèBÃás-®¯#Z}_8­¹šâŽ%9+|›Ðþ•Uú÷Ì¥ñD·)'YWkÌN-Ò#kõª¦5õo¢Gènéíû+ÕïnA I‘¼~'Þ ®aûÖ m~´2/&qö'÷ôŠ{[,$ô•ÁpX,)T,n§?h®qýp =hê@ß0:æ>ǯMœ€#6£ÅëURKîn»x¾yYR¼Ý„Çb¹ ˆÓgnÂC1Ÿ~^ýè¿ ½q`†.ö8*Ûº{óѵõ¹(‡ÉZºdFº¡ùÆŸTøeº¿Òó †Èoÿ ª»†ŽÉS~yùàÞ#—BÀoüMúfª5G«²×.D™Ì:R7o«ÞñAECcõAÄœi²“r ±êu´·zFîþ²ŽMÓpËûRØÜxÑeܧJ¼gÑgþÎZÑí‚x×ÂZüü`Ä‹àW6`ŒØ9` EýÉ}êI endstream endobj 31 0 obj 2316 endobj 23 0 obj <> endobj 32 0 obj <> endobj 14 0 obj <> endobj 17 0 obj <> endobj 33 0 obj <> endobj 20 0 obj <> endobj 2 0 obj <>endobj xref 0 34 0000000000 65535 f 0000004919 00000 n 0000065715 00000 n 0000004851 00000 n 0000015931 00000 n 0000015783 00000 n 0000004967 00000 n 0000004640 00000 n 0000000015 00000 n 0000004620 00000 n 0000006652 00000 n 0000005049 00000 n 0000059459 00000 n 0000059137 00000 n 0000063166 00000 n 0000039322 00000 n 0000039107 00000 n 0000064334 00000 n 0000016280 00000 n 0000016078 00000 n 0000065569 00000 n 0000018801 00000 n 0000018585 00000 n 0000061882 00000 n 0000015624 00000 n 0000015656 00000 n 0000015686 00000 n 0000015718 00000 n 0000018564 00000 n 0000039085 00000 n 0000059115 00000 n 0000061861 00000 n 0000063053 00000 n 0000065509 00000 n trailer << /Size 34 /Root 1 0 R /Info 2 0 R >> startxref 65928 %%EOF Node-path: powersupply/itest/Bilt/trunk/libMagnet_V130/TestClass Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 121539 Text-content-md5: 5faee0e50d052d212b0ccc315306cd1b Content-length: 121549 PROPS-END ELF’4 ™4 (44€4€444€€ ” ” ” $ $м”¼$¼$ààHHH PåtdädääääôôQåtd/lib/ld-linux.so.2GNU ;!`;<>É Ò¬KãÀ!ýô ˜ CxIk¶ÈÖÚ™Ÿò?¾v©ò¶ÍW  ò £' gðre—Æ8z½=&ºŒ…¸º2 Óœëz|»aª<•òPV.òë"±"³òÿ+3›ú#NgÆ’IZoÅj¦ú29™h¯jûªŸÆ~E¢!!N‚écFù*D &,!›ìÙ·|‘SÐ&Œ ¬‘üZü‘+libstdc++.so.6__gmon_start___Jv_RegisterClasses_Znwj__cxa_free_exception_ZNSt19basic_ostringstreamIcSt11char_traitsIcESaIcEE3strERKSs_ZNSsC1ERKSs_ZSt20__throw_length_errorPKc_ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6__ZNKSs5c_strEv__cxa_rethrow_ZSt4cout__cxa_allocate_exception_ZNSaIcED1Ev_ZNSsC1Ev_ZNKSs6substrEjj_ZSt4endsIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6__ZNSolsEb_ZNSolsEd_ZNSolsEi_ZNSolsEj_ZNKSt19basic_ostringstreamIcSt11char_traitsIcESaIcEE3strEv_ZNSsaSERKSs__cxa_begin_catch_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc_ZNSsC1EPKcRKSaIcE_ZNKSs13find_first_ofEPKcj_ZSt17__throw_bad_allocv_ZNSt8ios_base4InitC1Ev__cxa_throw_ZNSsD1Ev_ZStlsIcSt11char_traitsIcESaIcEERSt13basic_ostreamIT_T0_ES7_RKSbIS4_S5_T1_E_ZNKSs6lengthEv_ZNSt19basic_ostringstreamIcSt11char_traitsIcESaIcEEC1ESt13_Ios_Openmode_ZNSt19basic_ostringstreamIcSt11char_traitsIcESaIcEED1Ev_ZdlPv__cxa_end_catch_ZNKSs13find_first_ofEcj_ZNSt8ios_base4InitD1Ev_ZSt9terminatev_ZNSolsEPFRSoS_E__gxx_personality_v0_ZNSaIcEC1Ev__cxa_call_unexpected_ZTVN10__cxxabiv117__class_type_infoElibm.so.6libgcc_s.so.1_Unwind_Resumelibc.so.6_IO_stdin_usedsocketstrcpyhtonsconnectselect__cxa_atexit__errno_locationreadinet_addratofatoiclosestrchrsleepfcntlstrerror__libc_start_mainwriteGCC_3.0CXXABI_1.3GLIBCXX_3.4GLIBC_2.1.3GLIBC_2.0t P&y >0Ó¯kFt)’Q‘si ]ii iœ%  &;Ð&>¬%°%´%¸%¼%À%Ä%È%Ì% Ð% Ô% Ø% Ü%à%ä%è%ì%ð%ô%ø%ü%&&& &&&&& &$& (&!,&"0&#4&$8&%<&&@&'D&(H&)L&*P&+T&,X&-\&.`&/d&0h&1l&2p&3t&4x&=|&5€&6„&?ˆ&7Œ&8&9”&:˜&@U‰åƒìèèŒègKÉÃÿ5¤%ÿ%¨%ÿ%¬%héàÿÿÿÿ%°%héÐÿÿÿÿ%´%héÀÿÿÿÿ%¸%hé°ÿÿÿÿ%¼%h é ÿÿÿÿ%À%h(éÿÿÿÿ%Ä%h0é€ÿÿÿÿ%È%h8épÿÿÿÿ%Ì%h@é`ÿÿÿÿ%Ð%hHéPÿÿÿÿ%Ô%hPé@ÿÿÿÿ%Ø%hXé0ÿÿÿÿ%Ü%h`é ÿÿÿÿ%à%hhéÿÿÿÿ%ä%hpéÿÿÿÿ%è%hxéðþÿÿÿ%ì%h€éàþÿÿÿ%ð%hˆéÐþÿÿÿ%ô%héÀþÿÿÿ%ø%h˜é°þÿÿÿ%ü%h é þÿÿÿ%&h¨éþÿÿÿ%&h°é€þÿÿÿ%&h¸épþÿÿÿ% &hÀé`þÿÿÿ%&hÈéPþÿÿÿ%&hÐé@þÿÿÿ%&hØé0þÿÿÿ%&hàé þÿÿÿ% &hèéþÿÿÿ%$&hðéþÿÿÿ%(&høéðýÿÿÿ%,&héàýÿÿÿ%0&héÐýÿÿÿ%4&héÀýÿÿÿ%8&hé°ýÿÿÿ%<&h é ýÿÿÿ%@&h(éýÿÿÿ%D&h0é€ýÿÿÿ%H&h8épýÿÿÿ%L&h@é`ýÿÿÿ%P&hHéPýÿÿÿ%T&hPé@ýÿÿÿ%X&hXé0ýÿÿÿ%\&h`é ýÿÿÿ%`&hhéýÿÿÿ%d&hpéýÿÿÿ%h&hxéðüÿÿÿ%l&h€éàüÿÿÿ%p&hˆéÐüÿÿÿ%t&héÀüÿÿÿ%x&h˜é°üÿÿÿ%|&h é üÿÿÿ%€&h¨éüÿÿÿ%„&h°é€üÿÿÿ%ˆ&h¸épüÿÿÿ%Œ&hÀé`üÿÿÿ%&hÈéPüÿÿÿ%”&hÐé@üÿÿÿ%˜&hØé0üÿÿ1í^‰áƒäðPTRh Ùh0ÙQVhV“è+ýÿÿôU‰åSƒìè[Ã`“‹“üÿÿÿ…ÒtèvüÿÿX[ÉÃU‰åSƒì€=`'u?¸´$-°$ÁøXÿ¡\'9Ãv´&ƒÀ£\'ÿ…°$¡\'9ÃwèÆ`'ƒÄ[]Ãt&¼'U‰åƒì¡¸$…Àt¸…Àt Ç$¸$ÿÐÉÃU‰åƒì‰Eü‰Uøƒ}üu1}øÿÿu(Ç$h'è!üÿÿÇD$ðÙÇD$Ç$B“è•ûÿÿÉÃU‰åƒìºÿÿ¸è¥ÿÿÿÉÃU‰åƒìÇ$h'èXüÿÿÉÃL$ƒäðÿqüU‰åVSQì,ÇEÈEŒ‰$èž…lÿÿÿ‰$è…Lÿÿÿ‰$è‚…´þÿÿ‰$è¤ÇD$øÙÇ$Ð&èüÿÿÇD$|‘‰$èpýÿÿÇd'Ç$0èŠüÿÿ‰…ìüÿÿÇD$ÇD$Ú‹…ìüÿÿ‰$èâ‹•ìüÿÿ‰d'¡d'‰$èñ‰D$Ç$Ð&èûÿÿ‰…ðüÿÿë7‰…àüÿÿ‰•äüÿÿ‹µäüÿÿ‹àüÿÿ‹…ìüÿÿ‰$èúÿÿ‰àüÿÿ‰µäüÿÿéº ÇD$|‘‹•ðüÿÿ‰$è¸üÿÿ¡d'ÇD$‰$èÿ!ÙèÝ\$‰$èá¡d'ÇD$‰$èÜ!ÝÜÝ\$‰$èðà¡d'ÇD$‰$èµ!ÙîÝ\$‰$èÍà¡d'ÇD$‰$èÜðÇ$è üÿÿ¡d'‰$貉…ôüÿÿÇD$,ÚÇ$Ð&è“úÿÿ‹•ôüÿÿ‰T$‰$èQùÿÿÇD$|‘‰$èáûÿÿ¡d'ÇD$‰$è(!‰ÂEŒ‰D$‰$è?g¡d'ÇD$‰$è!‰Â…lÿÿÿ‰D$‰$èg‹d'…´þÿÿ‰D$‰$è|ª¡d'ÇD$‰$è ð¡d'‰…øüÿÿƒ½øüÿÿt‹•øüÿÿ‰$èµ÷‹…øüÿÿ‰$èåøÿÿÇD$4ÚÇ$Ð&è±ùÿÿÇD$|‘‰$èûÿÿ‹UŒ‰•üüÿÿÇD$XÚÇ$Ð&è„ùÿÿ‹•üüÿÿ‰T$‰$èBøÿÿÇD$|‘‰$èÒúÿÿ‹E‰…ýÿÿÇD$aÚÇ$Ð&èEùÿÿ‹•ýÿÿ‰T$‰$èøÿÿÇD$|‘‰$è“úÿÿ‹E”‰…ýÿÿÇD$,ÚÇ$Ð&èùÿÿ‹•ýÿÿ‰T$‰$èÄ÷ÿÿÇD$|‘‰$èTúÿÿÇD$hÚÇ$Ð&èÐøÿÿUŒƒÂ ‰T$‰$è¾ùÿÿÇD$|‘‰$èúÿÿÝEœÝýÿÿÇD$oÚÇ$Ð&è‘øÿÿÝ…ýÿÿÝ\$‰$è÷ÿÿÇD$|‘‰$èßùÿÿÝE¤ÝýÿÿÇD$~ÚÇ$Ð&èRøÿÿÝ…ýÿÿÝ\$‰$èàöÿÿÇD$|‘‰$è ùÿÿÇD$ÚÇ$Ð&èøÿÿÇD$|‘‰$è|ùÿÿ‹…lÿÿÿ‰…ýÿÿÇD$XÚÇ$Ð&èì÷ÿÿ‹•ýÿÿ‰T$‰$èªöÿÿÇD$|‘‰$è:ùÿÿ‹…pÿÿÿ‰… ýÿÿÇD$aÚÇ$Ð&èª÷ÿÿ‹• ýÿÿ‰T$‰$èhöÿÿÇD$|‘‰$èøøÿÿ‹…tÿÿÿ‰…$ýÿÿÇD$,ÚÇ$Ð&èh÷ÿÿ‹•$ýÿÿ‰T$‰$è&öÿÿÇD$|‘‰$è¶øÿÿÇD$hÚÇ$Ð&è2÷ÿÿ•lÿÿÿƒÂ ‰T$‰$èøÿÿÇD$|‘‰$è}øÿÿÝ…|ÿÿÿÝ(ýÿÿÇD$oÚÇ$Ð&èíöÿÿÝ…(ýÿÿÝ\$‰$è{õÿÿÇD$|‘‰$è;øÿÿÝE„Ý0ýÿÿÇD$~ÚÇ$Ð&è®öÿÿÝ…0ýÿÿÝ\$‰$è<õÿÿÇD$|‘‰$èü÷ÿÿÇD$´ÚÇ$Ð&èxöÿÿÇD$|‘‰$èØ÷ÿÿ‹…´þÿÿ‰…8ýÿÿÇD$XÚÇ$Ð&èHöÿÿ‹•8ýÿÿ‰T$‰$èõÿÿÇD$|‘‰$è–÷ÿÿ‹…¸þÿÿ‰…<ýÿÿÇD$,ÚÇ$Ð&èöÿÿ‹•<ýÿÿ‰T$‰$èÄôÿÿÇD$|‘‰$èT÷ÿÿÇD$ÜÚÇ$Ð&èÐõÿÿÇD$|‘‰$è0÷ÿÿ‹…Àþÿÿ‰…@ýÿÿÇD$aÚÇ$Ð&è õÿÿ‹•@ýÿÿ‰T$‰$è^ôÿÿÇD$|‘‰$èîöÿÿ‹…Äþÿÿ‰…DýÿÿÇD$,ÚÇ$Ð&è^õÿÿ‹•Dýÿÿ‰T$‰$èôÿÿÇD$|‘‰$è¬öÿÿÇD$hÚÇ$Ð&è(õÿÿ•´þÿÿƒÂ‰T$‰$èöÿÿÇD$|‘‰$èsöÿÿÝ…ÌþÿÿÝHýÿÿÇD$oÚÇ$Ð&èãôÿÿÝ…HýÿÿÝ\$‰$èqóÿÿÇD$|‘‰$è1öÿÿÝ…ÔþÿÿÝPýÿÿÇD$~ÚÇ$Ð&è¡ôÿÿÝ…PýÿÿÝ\$‰$è/óÿÿÇD$|‘‰$èïõÿÿÇD$ÚÇ$Ð&èkôÿÿÇD$|‘‰$èËõÿÿ‹…àþÿÿ‰…XýÿÿÇD$aÚÇ$Ð&è;ôÿÿ‹•Xýÿÿ‰T$‰$èùòÿÿÇD$|‘‰$è‰õÿÿ‹…äþÿÿ‰…\ýÿÿÇD$,ÚÇ$Ð&èùóÿÿ‹•\ýÿÿ‰T$‰$è·òÿÿÇD$|‘‰$èGõÿÿÇD$hÚÇ$Ð&èÃóÿÿ•´þÿÿƒÂ4‰T$‰$è®ôÿÿÇD$|‘‰$èõÿÿÝ…ìþÿÿÝ`ýÿÿÇD$oÚÇ$Ð&è~óÿÿÝ…`ýÿÿÝ\$‰$è òÿÿÇD$|‘‰$èÌôÿÿÝ…ôþÿÿÝhýÿÿÇD$~ÚÇ$Ð&è<óÿÿÝ…hýÿÿÝ\$‰$èÊñÿÿÇD$|‘‰$èŠôÿÿÇD$ÚÇ$Ð&èóÿÿÇD$|‘‰$èfôÿÿ‹…ÿÿÿ‰…pýÿÿÇD$aÚÇ$Ð&èÖòÿÿ‹•pýÿÿ‰T$‰$è”ñÿÿÇD$|‘‰$è$ôÿÿ‹…ÿÿÿ‰…týÿÿÇD$,ÚÇ$Ð&è”òÿÿ‹•týÿÿ‰T$‰$èRñÿÿÇD$|‘‰$èâóÿÿÇD$hÚÇ$Ð&è^òÿÿ•´þÿÿƒÂT‰T$‰$èIóÿÿÇD$|‘‰$è©óÿÿÝ… ÿÿÿÝxýÿÿÇD$oÚÇ$Ð&èòÿÿÝ…xýÿÿÝ\$‰$è§ðÿÿÇD$|‘‰$ègóÿÿÝ…ÿÿÿÝ€ýÿÿÇD$~ÚÇ$Ð&è×ñÿÿÝ…€ýÿÿÝ\$‰$èeðÿÿÇD$|‘‰$è%óÿÿ餉…àüÿÿ‰•äüÿÿƒ½äüÿÿtéõ‹…àüÿÿ‰$èHóÿÿ‰EÌÇEÐéü‹EЋŨ‰D$‰$莋@‰…ˆýÿÿ‹EЋŨ‰D$‰$èpƒÀ ‰…Œýÿÿ‹EЋŨ‰D$‰$èRƒÀ‰…ýÿÿ‹EЋŨ‰D$‰$è4ƒÀ‰D$Ç$Ð&è÷ñÿÿÇD$Û‰$èçðÿÿ‹•ýÿÿ‰T$‰$èÕñÿÿÇD$Û‰$èÅðÿÿ‹•Œýÿÿ‰T$‰$è³ñÿÿÇD$Û‰$è£ðÿÿ‹•ˆýÿÿ‰T$‰$èaïÿÿÇD$|‘‰$èññÿÿƒEЋ]ЋẼÀ‰$èÔ9Ã’À„À…æþÿÿ¡d'‰…”ýÿÿƒ½”ýÿÿt‹•”ýÿÿ‰$èî‹…”ýÿÿ‰$èOïÿÿèªñÿÿ뉅àüÿÿ‹àüÿÿè—ñÿÿ‰àüÿÿékÇD$ÛÇ$Ð&èøïÿÿÇD$|‘‰$èXñÿÿÇ$0è|ðÿÿ‰…˜ýÿÿÇD$ÇD$Ú‹•˜ýÿÿ‰$èÔ‹…˜ýÿÿ£d'Ç$èñðÿÿë7‰…àüÿÿ‰•äüÿÿ‹µäüÿÿ‹àüÿÿ‹•˜ýÿÿ‰$è™îÿÿ‰àüÿÿ‰µäüÿÿéâ¡d'ÇD$‰$è‰$蟴¡d'ÇD$‰$èLåÇEÔé4¡d'‰$èa‰D$Ç$Ð&è ïÿÿÇD$|‘‰$èmðÿÿ¡d'‰$è(‰D$Ç$Ð&è°íÿÿÇD$|‘‰$è@ðÿÿ¡d'ÇD$‰$臉ÂEŒ‰D$‰$èž[Ç$èîïÿÿ¡d'ÇD$‰$èUÙèÝ\$‰$èmÔ¡d'ÇD$‰$è2‰ÂE¬‰D$‰$èg+‹Eĉ…œýÿÿÝE¼Ý ýÿÿÝE´Ý¨ýÿÿ‹E°‰…°ýÿÿ‹U¬‰•´ýÿÿÇD$(ÛÇ$Ð&èîÿÿÇD$:Û‰$èîÿÿ‹•´ýÿÿ‰T$‰$èrîÿÿÇD$|‘‰$èRïÿÿÇD$EÛ‰$èÒíÿÿ‹•°ýÿÿ‰T$‰$è@îÿÿÇD$|‘‰$è ïÿÿÇD$QÛ‰$è íÿÿÝ…¨ýÿÿÝ\$‰$è.ìÿÿÇD$|‘‰$èîîÿÿÇD$VÛ‰$èníÿÿÝ… ýÿÿÝ\$‰$èüëÿÿÇD$|‘‰$è¼îÿÿÇD$_Û‰$è<íÿÿ‹•œýÿÿ‰T$‰$èªíÿÿÇD$|‘‰$èŠîÿÿÇD$(Û‰$è íÿÿÇD$|‘‰$èjîÿÿƒEÔƒ}Ô ŽÂýÿÿ¡d'ÇD$‰$èíâÇ$èîÿÿ¡d'‰…¸ýÿÿƒ½¸ýÿÿ„Å‹•¸ýÿÿ‰$è‡ê‹…¸ýÿÿ‰$è·ëÿÿ餉…àüÿÿ‰•äüÿÿƒ½äüÿÿté× ‹•àüÿÿ‰$è*îÿÿ‰EØÇEÜéü‹EÜ‹U؃‰D$‰$èp‹@‰…¼ýÿÿ‹EÜ‹U؃‰D$‰$èRƒÀ ‰…Àýÿÿ‹EÜ‹U؃‰D$‰$è4ƒÀ‰…Äýÿÿ‹EÜ‹U؃‰D$‰$èƒÀ‰D$Ç$Ð&èÙìÿÿÇD$Û‰$èÉëÿÿ‹•Äýÿÿ‰T$‰$è·ìÿÿÇD$Û‰$è§ëÿÿ‹•Àýÿÿ‰T$‰$è•ìÿÿÇD$Û‰$è…ëÿÿ‹•¼ýÿÿ‰T$‰$èCêÿÿÇD$|‘‰$èÓìÿÿƒEÜ‹]Ü‹E؃À‰$è¶ 9Ã’À„À…æþÿÿ¡d'‰…Èýÿÿƒ½Èýÿÿt‹•Èýÿÿ‰$èé‹…Èýÿÿ‰$è1êÿÿèŒìÿÿ뉅àüÿÿ‹àüÿÿèyìÿÿ‰àüÿÿéM ÇD$hÛÇ$Ð&èÚêÿÿÇD$|‘‰$è:ìÿÿÇD$ÇD$Ú…ÿÿÿ‰$èÈ…ÿÿÿ‰$膌‰…ÌýÿÿÇD$ŒÛÇ$Ð&è„êÿÿ‹•Ìýÿÿ‰T$‰$èrêÿÿÇD$|‘‰$èÒëÿÿ…Lþÿÿ‰$èÔ ÇD$…ÿÿÿ‰$è ÝÜÝ\$‰$èÐÇD$…ÿÿÿ‰$è,àÇ$èZëÿÿ…Lþÿÿ‰D$…ÿÿÿ‰$èdš‹…Pþÿÿƒøu&…ÿÿÿ‰$èØ…Lþÿÿ‰D$…ÿÿÿ‰$è3š‹…Pþÿÿ…ÀuÇD$…ÿÿÿ‰$è·ßÇ$èåêÿÿ…Lþÿÿ‰D$…ÿÿÿ‰$èï™ÇD$…ÿÿÿ‰$è}ßÇ$è«êÿÿÝ…dþÿÿÝÐýÿÿÇD$–ÛÇ$Ð&è;éÿÿÝ…ÐýÿÿÝ\$‰$èÉçÿÿÇD$|‘‰$è‰êÿÿ…Lþÿÿ‰$è‡ ë4‰…àüÿÿ‰•äüÿÿ‹µäüÿÿ‹àüÿÿ…Lþÿÿ‰$è_ ‰àüÿÿ‰µäüÿÿë…ÿÿÿ‰$è©æé¨‰…àüÿÿ‰•äüÿÿ‹µäüÿÿ‹àüÿÿ…ÿÿÿ‰$è~æ‰àüÿÿ‰µäüÿÿë ‰…àüÿÿ‰•äüÿÿƒ½äüÿÿtéÓ‹…àüÿÿ‰$è&êÿÿ‰EàÇEäéü‹Eä‹UàƒÂ‰D$‰$èl ‹@‰…Üýÿÿ‹Eä‹UàƒÂ‰D$‰$èN ƒÀ ‰…àýÿÿ‹Eä‹UàƒÂ‰D$‰$è0 ƒÀ‰…äýÿÿ‹Eä‹UàƒÂ‰D$‰$è ƒÀ‰D$Ç$Ð&èÕèÿÿÇD$Û‰$èÅçÿÿ‹•äýÿÿ‰T$‰$è³èÿÿÇD$Û‰$è£çÿÿ‹•àýÿÿ‰T$‰$è‘èÿÿÇD$Û‰$èçÿÿ‹•Üýÿÿ‰T$‰$è?æÿÿÇD$|‘‰$èÏèÿÿƒEä‹]ä‹EàƒÀ‰$è² 9Ã’À„À…æþÿÿè¸èÿÿ뉅àüÿÿ‹àüÿÿè¥èÿÿ‰àüÿÿéyÇD$¤ÛÇ$Ð&èçÿÿÇD$|‘‰$èfèÿÿÇD$ÇD$Ú…ÿÿÿ‰$èôÿ…Lþÿÿ‰$èJ ÇD$…ÿÿÿ‰$è€ ÝÜÝ\$‰$è”ÌÇD$…ÿÿÿ‰$è¢ÜÇ$èÐçÿÿ…Lþÿÿ‰D$…ÿÿÿ‰$èÚ–‹…Pþÿÿƒøu&…ÿÿÿ‰$èÕ…Lþÿÿ‰D$…ÿÿÿ‰$è©–‹…Pþÿÿ…ÀuÇD$…ÿÿÿ‰$è-ÜÇD$…ÿÿÿ‰$èÍ ‰$èAAÝèýÿÿÇD$ÈÛÇ$Ð&èßåÿÿÝ…èýÿÿÝ\$‰$èmäÿÿÇD$|‘‰$è-çÿÿÝ…dþÿÿÝðýÿÿÇD$×ÛÇ$Ð&èåÿÿÝ…ðýÿÿÝ\$‰$è+äÿÿÇD$|‘‰$èëæÿÿÝ…lþÿÿÝøýÿÿÇD$èÛÇ$Ð&è[åÿÿÝ…øýÿÿÝ\$‰$èéãÿÿÇD$|‘‰$è©æÿÿÇD$…ÿÿÿ‰$èï ÇD$‰$è³ÇD$…ÿÿÿ‰$èÉ ÝÜÝ\$‰$è ÂÇ$è/æÿÿ…Lþÿÿ‰D$…ÿÿÿ‰$è9•‹…Pþÿÿƒøu&…ÿÿÿ‰$èrÓ…Lþÿÿ‰D$…ÿÿÿ‰$è•‹…Pþÿÿ…ÀuÇD$…ÿÿÿ‰$èŒÚÇD$…ÿÿÿ‰$è, ‰$è ?ÝþÿÿÇD$ÈÛÇ$Ð&è>äÿÿÝ…þÿÿÝ\$‰$èÌâÿÿÇD$|‘‰$èŒåÿÿÝ…dþÿÿÝþÿÿÇD$×ÛÇ$Ð&èüãÿÿÝ…þÿÿÝ\$‰$èŠâÿÿÇD$|‘‰$èJåÿÿÝ…lþÿÿÝþÿÿÇD$èÛÇ$Ð&èºãÿÿÝ…þÿÿÝ\$‰$èHâÿÿÇD$|‘‰$èåÿÿÇD$…ÿÿÿ‰$èN ÙîÝ\$‰$è”ÀÇD$…ÿÿÿ‰$è* ÇD$‰$èP±ÇD$…ÿÿÿ‰$è ÝÜÝ\$‰$èFÀÇ$èjäÿÿ…Lþÿÿ‰D$…ÿÿÿ‰$èt“‹…Pþÿÿƒøu&…ÿÿÿ‰$è­Ñ…Lþÿÿ‰D$…ÿÿÿ‰$èC“‹…Pþÿÿ…ÀuÇD$…ÿÿÿ‰$èÇØÇD$…ÿÿÿ‰$èg ‰$èÛ=ÝþÿÿÇD$ÈÛÇ$Ð&èyâÿÿÝ…þÿÿÝ\$‰$èáÿÿÇD$|‘‰$èÇãÿÿÝ…dþÿÿÝ þÿÿÇD$×ÛÇ$Ð&è7âÿÿÝ… þÿÿÝ\$‰$èÅàÿÿÇD$|‘‰$è…ãÿÿÝ…lþÿÿÝ(þÿÿÇD$èÛÇ$Ð&èõáÿÿÝ…(þÿÿÝ\$‰$èƒàÿÿÇD$|‘‰$èCãÿÿÇD$…ÿÿÿ‰$èÓ×…Lþÿÿ‰$è+ë4‰…àüÿÿ‰•äüÿÿ‹µäüÿÿ‹àüÿÿ…Lþÿÿ‰$è‰àüÿÿ‰µäüÿÿë…ÿÿÿ‰$èMß饉…àüÿÿ‰•äüÿÿ‹µäüÿÿ‹àüÿÿ…ÿÿÿ‰$è"߉àüÿÿ‰µäüÿÿë ‰…àüÿÿ‰•äüÿÿƒ½äüÿÿtéw‹…àüÿÿ‰$èÊâÿÿ‰EèÇEìéü‹Eì‹UèƒÂ‰D$‰$è‹@‰…0þÿÿ‹Eì‹UèƒÂ‰D$‰$èòƒÀ ‰…4þÿÿ‹Eì‹UèƒÂ‰D$‰$èÔƒÀ‰…8þÿÿ‹Eì‹UèƒÂ‰D$‰$趃À‰D$Ç$Ð&èyáÿÿÇD$Û‰$èiàÿÿ‹•8þÿÿ‰T$‰$èWáÿÿÇD$Û‰$èGàÿÿ‹•4þÿÿ‰T$‰$è5áÿÿÇD$Û‰$è%àÿÿ‹•0þÿÿ‰T$‰$èãÞÿÿÇD$|‘‰$èsáÿÿƒEì‹]ì‹EèƒÀ‰$èV9Ã’À„À…æþÿÿè\áÿÿ뉅àüÿÿ‹àüÿÿèIáÿÿ‰àüÿÿë Ç…<þÿÿ…´þÿÿ‰$è%ë"‰…àüÿÿ‹àüÿÿ…´þÿÿ‰$è ‰àüÿÿë…Lÿÿÿ‰$èÝë"‰…àüÿÿ‹àüÿÿ…Lÿÿÿ‰$èÁ‰àüÿÿë…lÿÿÿ‰$è«ë"‰…àüÿÿ‹àüÿÿ…lÿÿÿ‰$è‰àüÿÿëEŒ‰$è|‹…<þÿÿ‰…èüÿÿë+‰…àüÿÿ‹àüÿÿEŒ‰$èW‰àüÿÿ‹•àüÿÿ‰$èÝàÿÿ‹…èüÿÿÄ,Y[^]aüÃU‰å‹E‹@(]ÃU‰å‹E‹@,]ÃU‰åƒì‹EƒÀ ‰$èLÝÿÿÉÃU‰åƒì‹EƒÀ ‰$è–ÞÿÿÉÃU‰åƒì‹EƒÀ…Àt(‹EƒÀƒÀ`‰Eü‹EƒÀ;Eütƒmü ‹Eü‰$è´ÿÿÿëäÉÃU‰å‹E‹]ÃU‰å‹E ‹‹E‰]ÃU‰åSƒì$‹]‹E ‹‰EøEø‰D$‰$èÏÿÿÿ‰ØƒÄ$[]ÂU‰åSƒì$‹]‹E ‹@‰EøEø‰D$‰$è¢ÿÿÿ‰ØƒÄ$[]ÂU‰å‹E]ÃU‰åSƒì‹E‰$èæÿÿÿ‹‰Ã‹E ‰$è×ÿÿÿ‹‰Ú)‰ÐÁøiÀ«ªªªƒÄ[]ÃU‰åƒì(Uì‹E‰D$‰$èPÿÿÿƒì‹Eì‰EøUè‹E‰D$‰$èaÿÿÿƒì‹Eè‰EüEø‰D$Eü‰$èzÿÿÿÉÃU‰å‹E ‹‹E‰]ÃU‰åSƒì‹]‹E ‰D$‰$è×ÿÿÿ‰ØƒÄ[]ÂU‰åSƒì$‹]‹E ‹‹E‹‰Â‰ÐÀÐÁà‰EøEø‰D$‰$è˜ÿÿÿ‰ØƒÄ$[]ÂU‰åƒì(‹E ‰EøUì‹E‰D$‰$è€ÿÿÿƒì‹Eì‰EüUèEø‰D$Eü‰D$‰$è‚ÿÿÿƒì‹Eè‰EôEô‰$è8þÿÿÉÃU‰åƒì(‹EƒÀ‰Eì‹Uì‰UðÇEôë‹Eð‰$è§ýÿÿƒEð ƒmôƒ}ôÿuçëL‰Eè‹Uè‰Uüƒ}ìt,¸+EôÁà‹Uì‰Uø‹Eø9Eìtƒmø ‹Uø‰$ètýÿÿëç‹Eü‰Eè‹Uè‰$èûÝÿÿÉÃU‰åƒì‹U‹E‰B ‹U‹E‰B‹U‹E ‰B‹E‹@ ƒà„Àt ÇEüëÇEü‹E‹@À‹Uü‹E‰ÉÃU‰åƒì‹U‹E‰B ‹U‹E‰B‹U‹E ‰B‹E‹@ ƒà„Àt ÇEüëÇEü‹E‹@À‹Uü‹E‰ÉÃU‰åƒì‰Eü‰Uøƒ}üu1}øÿÿu(Ç$l'èÚÿÿÇD$ðÙÇD$Ç$Ö´èÚÿÿÉÃU‰åƒìºÿÿ¸è¥ÿÿÿÉÃU‰åƒìÇ$l'èÄÚÿÿÉÃU‰åSƒìD‹EˆEØÇEðÇEôÇEøEç‰$è…ÜÿÿEç‰D$‹E‰D$Eà‰$èÜÚÿÿEç‰$èÁÛÿÿé‰EÔ‹]ÔEç‰$è«Ûÿÿ‰]Ô‹EÔ‰$èmÜÿÿ‹Uô‹Eø)ЋUôMè‰D$ ‰T$Eà‰D$‰ $è(ÛÿÿƒìEè‰D$‹E ‰$èSÜÿÿEè‰$è8Úÿÿë‰EÔ‹]ÔEè‰$è%Úÿÿ‰]Ô鸋EøƒÀ‰EôƒEðƒE ‹Eô¾U؉D$‰T$Eà‰$è¢Ùÿÿ‰Eøƒ}øÿ•À„À…cÿÿÿEà‰$è•Ùÿÿ‰Â‹Eô‰Ñ)Á‰È‹UôMì‰D$ ‰T$Eà‰D$‰ $è}ÚÿÿƒìEì‰D$‹E ‰$è¨ÛÿÿEì‰$èÙÿÿë‰EÔ‹]ÔEì‰$èzÙÿÿ‰]ÔëEà‰$èjÙÿÿë‰EÔ‹]ÔEà‰$èWÙÿÿ‰]Ô‹EÔ‰$è9Ûÿÿ‹]üÉÃU‰åSìƒ} x ƒ} ŽbÇD$…$ÿÿÿ‰$èôÚÿÿ‹E‹@(‰…ÿÿÿÇD$ Ü…$ÿÿÿ‰$èâØÿÿ‹•ÿÿÿ‰T$‰$è ×ÿÿÇD$ü‘‰$è0ÚÿÿEï‰$è…ÚÿÿEï‰D$ÇD$JÜEè‰$èÛØÿÿUð…$ÿÿÿ‰D$‰$èØÿÿƒìEû‰$èHÚÿÿEû‰D$ÇD$_ÜEô‰$èžØÿÿÇD$ÿÿÿÿÇD$Eè‰D$ Eð‰D$Eô‰D$E؉$èÐEô‰$è3Øÿÿ뉅ÿÿÿ‹ÿÿÿEô‰$èØÿÿ‰ÿÿÿëEû‰$è'ÙÿÿEð‰$èü×ÿÿë6‰…ÿÿÿ‹ÿÿÿEû‰$èÙÿÿ‰ÿÿÿ‹ÿÿÿEð‰$èÌ×ÿÿ‰ÿÿÿëEè‰$è¹×ÿÿ뉅ÿÿÿ‹ÿÿÿEè‰$è ×ÿÿ‰ÿÿÿë:Eï‰$è­ØÿÿÇ$è‘Øÿÿ‰…ÿÿÿ‹•ÿÿÿE؉D$‰$èD뉅ÿÿÿ‹ÿÿÿEï‰$èmØÿÿ‰ÿÿÿëUÇD$­ÇD$Ää‹…ÿÿÿ‰$èwØÿÿ‰…ÿÿÿƒúÿtë èe×ÿÿ‰…ÿÿÿ‹ÿÿÿE؉$èäô‰ÿÿÿ뉅ÿÿÿ‹ÿÿÿ…$ÿÿÿ‰$èÜ×ÿÿ‰ÿÿÿ‹•ÿÿÿ‰$è¸Øÿÿ‹U ‹E‹D‹]üÉÃU‰åƒìXEè‰EÀ‹UÀ‰UÄÇEÈë‹Eĉ$è2ÕÿÿƒEămȃ}ÈÿuçÇD$,Eè‰D$‹E‰$èxûÿÿëL‰E¼‹U¼‰U؃}Àt,¸+EÈÁà‹UÀ‰UЋEÐ9EÀtƒmЋUЉ$è/Öÿÿëç‹E؉E¼‹U¼‰$è Øÿÿ‹E ‹U‰Eè‰$è ÕÿÿƒÀ‰$è~Öÿÿ‰Eüƒ}ü~‹Uüƒê‰ÐÁèÐÑø‰EÌë‹Uüƒê‰ÐÁèÐÑø‰EÌ‹E ‹ỦPEèƒÀ‰$è¸Ôÿÿ‰$è0Öÿÿ‰Â‹E ‰P‹U ƒÂ EèƒÀ‰D$‰$è ×ÿÿEèƒÀ ‰$è‚Ôÿÿ‰$èÖÿÿ‹E ÝXEèƒÀ‰$èfÔÿÿ‰$èþÕÿÿ‹E ÝXEèƒÀ‰EÔë<‰E¼‹E¼‰EÜEèƒÀ‰EÔEè;EÔtƒmÔ‹UÔ‰$è$Õÿÿëç‹E܉E¼‹U¼‰$è×ÿÿEè;EÔtƒmÔ‹EÔ‰$èúÔÿÿëçÉÃU‰åìˆEð‰EŒ‹UŒ‰UÇE”ë‹E‰$èmÓÿÿƒEƒm”ƒ}”ÿuçU؉U˜‹E˜‰EœÇE ë_‰Eˆ‹Uˆ‰UÀƒ}Œt,¸+E”Áà‹UŒ‰U°‹E°9EŒtƒm°‹U°‰$èqÔÿÿëç‹EÀ‰Eˆ‹Uˆ‰$èNÖÿÿ‹Eœ‰$èóÒÿÿƒEœƒm ƒ} ÿuçÇD$;Eð‰D$‹E‰$è9ùÿÿëF‰Eˆ‹Uˆ‰Uă}˜t,¸+E Áà‹U˜‰U´‹E´9E˜tƒm´‹U´‰$èðÓÿÿëç‹EĉEˆé=Eð‰$èØÒÿÿ‰ÂÇD$,E؉D$‰$èÍøÿÿ‹U ‹E‰E؃À‰$è©Òÿÿ‰$è!ÔÿÿPÿ‹E ‰P‹U ƒÂ‰U¤EðƒÀ‰$èÒÿÿ‰Â‹E‰D$‹E¤‰D$‰$è±üÿÿ‹U ƒÂ(‰U¨EðƒÀ‰$èRÒÿÿ‰Â‹E‰D$‹E¨‰D$‰$è‚üÿÿ‹U ƒÂH‰U¬EðƒÀ ‰$è#Òÿÿ‰Â‹E‰D$‹E¬‰D$‰$èSüÿÿE؃À‰E¸ë3‰Eˆ‹Uˆ‰UÈE؃À‰E¸EØ;E¸tƒm¸‹E¸‰$è×Òÿÿëç‹UȉUˆë'EØ;E¸tƒm¸‹E¸‰$è¶ÒÿÿëçEðƒÀ‰E¼ë<‰Eˆ‹Uˆ‰UÌEðƒÀ‰E¼Eð;E¼tƒm¼‹E¼‰$è€Òÿÿëç‹ỦUˆ‹Eˆ‰$è]ÔÿÿEð;E¼tƒm¼‹U¼‰$èVÒÿÿëçÉÃU‰åWSì ‹E¶€†ƒð„À„›ÇD$…ÿÿÿ‰$èüÓÿÿÇD$|Ü…ÿÿÿ‰$èöÑÿÿÇD$ªÜ‰$èæÑÿÿ‰Â‹E ‰D$‰$èÕÒÿÿÇD$ü‘‰$è5Óÿÿè@Ðÿÿ‹‰…ÿÿÿUð…ÿÿÿ‰D$‰$è#ÑÿÿƒìEð‰$è¥Ðÿÿ‹•ÿÿÿ‰T$ÇD$ÇD$ ¬Ü‰D$ÇD$ÁÜEà‰$èæþEð‰$èiÑÿÿë"‰…üþÿÿ‹üþÿÿEð‰$èPÑÿÿ‰üþÿÿé†Ç$èIÒÿÿ‰…ÿÿÿ‹•ÿÿÿEà‰D$‰$èüúÇD$­ÇD$Ä䋽ÿÿÿ‰<$èPÒÿÿ‰…üþÿÿ‰•ÿÿÿƒ½ÿÿÿÿtë è4Ñÿÿ‰…üþÿÿ‹üþÿÿEà‰$è³î‰üþÿÿ뉅üþÿÿ‹üþÿÿ…ÿÿÿ‰$è«Ñÿÿ‰üþÿÿ‹…üþÿÿ‰$è‡Òÿÿ‹E ‰$èŒÏÿÿ¹ÿÿÿÿ‰…øþÿÿ¸ü‹½øþÿÿò®‰È÷ÐXÿ‹E ‰$èaÏÿÿ‰Â‹E‹‰\$‰T$‰$èªÏÿÿƒøÿ”À„À„ÒÇD$…ÿÿÿ‰$èÒÿÿè‘Îÿÿ‹‰$èçÎÿÿ‰… ÿÿÿÇD$|Ü…ÿÿÿ‰$èëÏÿÿÇD$ªÜ‰$èÛÏÿÿ‰Â‹E ‰D$‰$èÊÐÿÿÇD$Û܉$èºÏÿÿ‹• ÿÿÿ‰T$‰$è¨ÏÿÿÇD$ü‘‰$èÑÿÿèÎÿÿ‹‰…ÿÿÿUô…ÿÿÿ‰D$‰$èöÎÿÿƒìEô‰$èxÎÿÿ‹½ÿÿÿ‰|$ÇD$ÇD$ ¬Ü‰D$ÇD$ßÜEЉ$è¹üEô‰$è<Ïÿÿë"‰…üþÿÿ‹üþÿÿEô‰$è#Ïÿÿ‰üþÿÿé†Ç$èÐÿÿ‰…ÿÿÿ‹•ÿÿÿEЉD$‰$èÏøÇD$­ÇD$Ää‹…ÿÿÿ‰$è#Ðÿÿ‰…üþÿÿ‰•ÿÿÿƒ½ÿÿÿÿtë èÏÿÿ‰…üþÿÿ‹üþÿÿEЉ$è†ì‰üþÿÿ뉅üþÿÿ‹üþÿÿ…ÿÿÿ‰$è~Ïÿÿ‰üþÿÿ‹•üþÿÿ‰$èZÐÿÿeø[_]ÃU‰åWSì‹E¶€†ƒð„À„›ÇD$…Hþÿÿ‰$è ÐÿÿÇD$|Ü…Hþÿÿ‰$èÎÿÿÇD$ªÜ‰$èöÍÿÿ‰Â‹E ‰D$‰$èåÎÿÿÇD$ü‘‰$èEÏÿÿèPÌÿÿ‹‰…þÿÿUÔ…Hþÿÿ‰D$‰$è3ÍÿÿƒìEÔ‰$èµÌÿÿ‹•þÿÿ‰T$ÇD$ÇD$ ñ܉D$ÇD$ÁÜE¼‰$èöúEÔ‰$èyÍÿÿë"‰…þÿÿ‹þÿÿEÔ‰$è`Íÿÿ‰þÿÿé†Ç$èYÎÿÿ‰… þÿÿ‹• þÿÿE¼‰D$‰$è ÷ÇD$­ÇD$Ä䋽 þÿÿ‰<$è`Îÿÿ‰…þÿÿ‰•þÿÿƒ½þÿÿÿtë èDÍÿÿ‰…þÿÿ‹þÿÿE¼‰$èÃê‰þÿÿ뉅þÿÿ‹þÿÿ…Hþÿÿ‰$è»Íÿÿ‰þÿÿ‹…þÿÿ‰$è—Îÿÿ‹EÆ@‹E ‰$è•Ëÿÿ¹ÿÿÿÿ‰…þÿÿ¸ü‹½þÿÿò®‰È÷ÐXÿ‹E ‰$èjËÿÿ‰Â‹E‹‰\$‰T$‰$è³Ëÿÿƒøÿ”À„À„ÒÇD$…Hþÿÿ‰$èÎÿÿèšÊÿÿ‹‰$èðÊÿÿ‰…$þÿÿÇD$|Ü…Hþÿÿ‰$èôËÿÿÇD$ªÜ‰$èäËÿÿ‰Â‹E ‰D$‰$èÓÌÿÿÇD$Û܉$èÃËÿÿ‹•$þÿÿ‰T$‰$è±ËÿÿÇD$ü‘‰$èÍÿÿèÊÿÿ‹‰…(þÿÿUØ…Hþÿÿ‰D$‰$èÿÊÿÿƒìE؉$èÊÿÿ‹½(þÿÿ‰|$ÇD$ÇD$ ñ܉D$ÇD$ßÜE¬‰$èÂøE؉$èEËÿÿë"‰…þÿÿ‹þÿÿE؉$è,Ëÿÿ‰þÿÿé†Ç$è%Ìÿÿ‰…,þÿÿ‹•,þÿÿE¬‰D$‰$èØôÇD$­ÇD$Ää‹…,þÿÿ‰$è,Ìÿÿ‰…þÿÿ‰•þÿÿƒ½þÿÿÿtë èËÿÿ‰…þÿÿ‹þÿÿE¬‰$èè‰þÿÿ뉅þÿÿ‹þÿÿ…Hþÿÿ‰$è‡Ëÿÿ‰þÿÿ‹•þÿÿ‰$ècÌÿÿÇEÌ ÇEи¹ ½üþÿÿüó«‰Mð‰}ô‹E‹‰ÂÁê‹E‹ƒà«„•üþÿÿẺD$ÇD$ ÇD$…üþÿÿ‰D$Ç$èÅÊÿÿ‰Eèƒ}èžÀ„À„¿ÇD$ÿÿÿÿÇD$ÇD$ ñÜÇD$ÝÇD$*ÝEœ‰$è2÷Ç$èÄÊÿÿ‰…0þÿÿ‹•0þÿÿEœ‰D$‰$èwóÇD$­ÇD$Ä䋽0þÿÿ‰<$èËÊÿÿ‰…þÿÿ‰•þÿÿƒ½þÿÿÿtë è¯Éÿÿ‰…þÿÿ‹þÿÿEœ‰$è.ç‰þÿÿ‹…þÿÿ‰$è$Ëÿÿ‹UƒÂ‹E‹ÇD$‚‰T$‰$èõÈÿÿƒøÿ”À„À„ÒÇD$…Hþÿÿ‰$èÑÊÿÿè\Çÿÿ‹‰$è²Çÿÿ‰…4þÿÿÇD$|Ü…Hþÿÿ‰$è¶ÈÿÿÇD$ªÜ‰$è¦Èÿÿ‰Â‹E ‰D$‰$è•ÉÿÿÇD$Û܉$è…Èÿÿ‹•4þÿÿ‰T$‰$èsÈÿÿÇD$ü‘‰$èÓÉÿÿèÞÆÿÿ‹‰…8þÿÿUÜ…Hþÿÿ‰D$‰$èÁÇÿÿƒìE܉$èCÇÿÿ‹½8þÿÿ‰|$ÇD$ÇD$ ñ܉D$ÇD$ßÜEŒ‰$è„õE܉$èÈÿÿë"‰…þÿÿ‹þÿÿE܉$èîÇÿÿ‰þÿÿé†Ç$èçÈÿÿ‰…<þÿÿ‹•<þÿÿEŒ‰D$‰$èšñÇD$­ÇD$Ää‹…<þÿÿ‰$èîÈÿÿ‰…þÿÿ‰•þÿÿƒ½þÿÿÿtë èÒÇÿÿ‰…þÿÿ‹þÿÿEŒ‰$èQå‰þÿÿ뉅þÿÿ‹þÿÿ…Hþÿÿ‰$èIÈÿÿ‰þÿÿ‹•þÿÿ‰$è%Éÿÿ‹E¶@„Àt‹E¶@< …´ÇD$…Hþÿÿ‰$èåÈÿÿÇD$|Ü…Hþÿÿ‰$è߯ÿÿÇD$ªÜ‰$èÏÆÿÿ‰Â‹E ‰D$‰$è¾ÇÿÿÇD$ªÜ‰$è®ÆÿÿÇD$ü‘‰$èÈÿÿèÅÿÿ‹‰…@þÿÿUà…Hþÿÿ‰D$‰$èüÅÿÿƒìEà‰$è~Åÿÿ‹½@þÿÿ‰|$ÇD$ÇD$ ñ܉D$ÇD$ßÜ…|ÿÿÿ‰$è¼óEà‰$è?Æÿÿë"‰…þÿÿ‹þÿÿEà‰$è&Æÿÿ‰þÿÿéŒÇ$èÇÿÿ‰…Dþÿÿ‹•Dþÿÿ…|ÿÿÿ‰D$‰$èÏïÇD$­ÇD$Ää‹…Dþÿÿ‰$è#Çÿÿ‰…þÿÿ‰•þÿÿƒ½þÿÿÿtë èÆÿÿ‰…þÿÿ‹þÿÿ…|ÿÿÿ‰$èƒã‰þÿÿ뉅þÿÿ‹þÿÿ…Hþÿÿ‰$è{Æÿÿ‰þÿÿ‹•þÿÿ‰$èWÇÿÿ‹EƒÀÇD$ ‰$èqÄÿÿ‰Eäƒ}ä•À„Àt‹E䯋EƒÀeø[_]ÃU‰åVSìðÇD$…<ÿÿÿ‰$èïÆÿÿ‹E ‰D$…<ÿÿÿ‰$èêÅÿÿÇD$|‘‰$èJÆÿÿUð…<ÿÿÿ‰D$‰$èEÄÿÿƒì‹UEð‰D$‰$è^öÿÿ‰…0ÿÿÿEð‰$è¯Äÿÿë1‰…$ÿÿÿ‰•(ÿÿÿ‹µ(ÿÿÿ‹$ÿÿÿEð‰$èŠÄÿÿ‰$ÿÿÿ‰µ(ÿÿÿë…<ÿÿÿ‰$ènÅÿÿ鉅$ÿÿÿ‰•(ÿÿÿƒ½(ÿÿÿtéÜ‹…$ÿÿÿ‰$èñÅÿÿ‰EôÇD$ÿÿÿÿÇD$ÇD$ 7ÝÇD$ÝÇD$KÝ‹Eô‰$èåêÇ$èÅÿÿ‰…4ÿÿÿ‹•4ÿÿÿ‹Eô‰D$‰$èÂíÇD$­ÇD$Ää‹…4ÿÿÿ‰$èÅÿÿ‰…$ÿÿÿ‰•(ÿÿÿƒ½(ÿÿÿÿtëèúÃÿÿ‰…$ÿÿÿ‰•(ÿÿÿ‹µ(ÿÿÿ‹$ÿÿÿèýÄÿÿ‰$ÿÿÿ‰µ(ÿÿÿë ‰…$ÿÿÿ‰•(ÿÿÿ‹µ(ÿÿÿ‹$ÿÿÿ…<ÿÿÿ‰$èYÄÿÿ‰$ÿÿÿ‰µ(ÿÿÿë‹…0ÿÿÿ‰…,ÿÿÿë1‰…$ÿÿÿ‰•(ÿÿÿƒ½(ÿÿÿþt‹…$ÿÿÿ‰$è Åÿÿ‹…$ÿÿÿ‰$èLÃÿÿ‹…,ÿÿÿeø[^]ÃU‰åVSìÇD$…Ôþÿÿ‰$è½Äÿÿ‹E‹‰…”þÿÿÇD$]Ý…Ôþÿÿ‰$è¬Âÿÿ‹•”þÿÿ‰T$‰$èjÁÿÿÇD$`݉$èŠÂÿÿUœ…Ôþÿÿ‰D$‰$èõÁÿÿƒì‹E‹PEœ‰D$‰$è=ýÿÿ‰EàEœ‰$è_Âÿÿë4‰…Œþÿÿ‰•þÿÿ‹µþÿÿ‹ŒþÿÿEœ‰$è:Âÿÿ‰Œþÿÿ‰µþÿÿéþE£‰$èÞÃÿÿE£‰D$‹Eà‰D$E˜‰$è5ÂÿÿE£‰$èÃÿÿÇEäÇEèÿÿÿÿÇEì髉…Œþÿÿ‰•þÿÿ‹µþÿÿ‹ŒþÿÿE£‰$èÝÂÿÿ‰Œþÿÿ‰µþÿÿéƒEè‹Eä‰Eð‹E艅ˆþÿÿƒ½ˆþÿÿ„¼ƒ½ˆþÿÿƒ½ˆþÿÿt$é3ƒ½ˆþÿÿ„ƒ½ˆþÿÿ„—é‹Uì‹Eð)ЋUìM¤‰D$ ‰T$E˜‰D$‰ $èÂÿÿƒìE¤‰$è#Àÿÿ‰$è›Áÿÿ‰Â‹E ‰E¤‰$è Áÿÿ鉅Œþÿÿ‰•þÿÿ‹µþÿÿ‹ŒþÿÿE¤‰$èáÀÿÿ‰Œþÿÿ‰µþÿÿéa‹Uì‹Eð)ЋUìM¨‰D$ ‰T$E˜‰D$‰ $è{ÁÿÿƒìE¨‰$è¿ÿÿ‰$èÁÿÿ‰Â‹E ‰PE¨‰$è‚Àÿÿé;‰…Œþÿÿ‰•þÿÿ‹µþÿÿ‹ŒþÿÿE¨‰$èZÀÿÿ‰Œþÿÿ‰µþÿÿéÚ‹Uì‹Eð)ЋUìM¬‰D$ ‰T$E˜‰D$‰ $èôÀÿÿƒìE¬‰$è¿ÿÿ‰$è®Àÿÿ‹E ÝXE¬‰$èý¿ÿÿ鶉…Œþÿÿ‰•þÿÿ‹µþÿÿ‹ŒþÿÿE¬‰$èÕ¿ÿÿ‰Œþÿÿ‰µþÿÿéU‹Uì‹Eð)ЋUìM°‰D$ ‰T$E˜‰D$‰ $èoÀÿÿƒìE°‰$葾ÿÿ‰$è)Àÿÿ‹E ÝXE°‰$èx¿ÿÿë4‰…Œþÿÿ‰•þÿÿ‹µþÿÿ‹ŒþÿÿE°‰$èS¿ÿÿ‰Œþÿÿ‰µþÿÿéÓ‹EäƒÀ‰EìƒEä‹Eä‰D$ÇD$iÝE˜‰$èÁÿÿ‰Eäƒ}äÿ•À„À…]ýÿÿ‹Uì‹Eð)ЋUìM´‰D$ ‰T$E˜‰D$‰ $è´¿ÿÿƒìE´‰$èÖ½ÿÿ‰$èN¿ÿÿ‰Â‹E ‰PE´‰$軾ÿÿë1‰…Œþÿÿ‰•þÿÿ‹µþÿÿ‹ŒþÿÿE´‰$è–¾ÿÿ‰Œþÿÿ‰µþÿÿëE˜‰$è}¾ÿÿë1‰…Œþÿÿ‰•þÿÿ‹µþÿÿ‹ŒþÿÿE˜‰$èX¾ÿÿ‰Œþÿÿ‰µþÿÿë…Ôþÿÿ‰$è<¿ÿÿéĉ…Œþÿÿ‰•þÿÿ‹µþÿÿ‹Œþÿÿ…Ôþÿÿ‰$è¿ÿÿ‰Œþÿÿ‰µþÿÿë ‰…Œþÿÿ‰•þÿÿƒ½þÿÿt锋•Œþÿÿ‰$è‹¿ÿÿ‰EôÇD$…Ôþÿÿ‰$袿ÿÿ‹E‹‰…˜þÿÿ‹E‹@…Àt/‹E‹@ƒøu Ç… þÿÿkÝë Ç… þÿÿmÝ‹… þÿÿ‰…œþÿÿë Ç…œþÿÿoÝ‹•œþÿÿ‰•¤þÿÿ‹E‹@ ‰…¨þÿÿÇD$ Ü…Ôþÿÿ‰$è6½ÿÿ‹•¨þÿÿ‰T$‰$èô»ÿÿÇD$q݉$è½ÿÿ‹•¤þÿÿ‰T$‰$è½ÿÿÇD$x݉$èò¼ÿÿ‹•˜þÿÿ‰T$‰$è°»ÿÿÇD${݉$èмÿÿÇD$ü‘‰$è0¾ÿÿE¿‰$è…¾ÿÿE¿‰D$ÇD$}ÝE¸‰$èÛ¼ÿÿUÀ…Ôþÿÿ‰D$‰$è¼ÿÿƒìEˉ$èH¾ÿÿEˉD$ÇD$•ÝEĉ$èž¼ÿÿÇD$ÿÿÿÿÇD$E¸‰D$ EÀ‰D$EĉD$‹Eô‰$è´àEĉ$è3¼ÿÿë1‰…Œþÿÿ‰•þÿÿ‹µþÿÿ‹ŒþÿÿEĉ$è¼ÿÿ‰Œþÿÿ‰µþÿÿë$Eˉ$è½ÿÿEÀ‰$èê»ÿÿëT‰…Œþÿÿ‰•þÿÿ‹µþÿÿ‹ŒþÿÿEˉ$èå¼ÿÿ‰Œþÿÿ‰µþÿÿ‹µþÿÿ‹ŒþÿÿEÀ‰$袻ÿÿ‰Œþÿÿ‰µþÿÿëE¸‰$艻ÿÿë1‰…Œþÿÿ‰•þÿÿ‹µþÿÿ‹ŒþÿÿE¸‰$èd»ÿÿ‰Œþÿÿ‰µþÿÿë@E¿‰$èk¼ÿÿÇ$èO¼ÿÿ‰…¬þÿÿ‹•¬þÿÿ‹Eô‰D$‰$èåë1‰…Œþÿÿ‰•þÿÿ‹µþÿÿ‹ŒþÿÿE¿‰$è¼ÿÿ‰Œþÿÿ‰µþÿÿëFÇD$­ÇD$Ää‹…¬þÿÿ‰$è#¼ÿÿ‰…Œþÿÿ‰•þÿÿƒ½þÿÿÿtëè»ÿÿ‰…Œþÿÿ‰•þÿÿ‹µþÿÿ‹Œþÿÿ…Ôþÿÿ‰$è‘»ÿÿ‰Œþÿÿ‰µþÿÿë ‰…Œþÿÿ‰•þÿÿ‹µþÿÿ‹ŒþÿÿèÖ»ÿÿ‰Œþÿÿ‰µþÿÿ齋•Œþÿÿ‰$è÷»ÿÿÇD$…Ôþÿÿ‰$è¼ÿÿ‹E‹‰…°þÿÿ‹E‹@…Àt/‹E‹@ƒøu Ç…¸þÿÿkÝë Ç…¸þÿÿmÝ‹…¸þÿÿ‰…´þÿÿë Ç…´þÿÿoÝ‹•´þÿÿ‰•¼þÿÿ‹E‹@ ‰…ÀþÿÿÇD$°Ý…Ôþÿÿ‰$襹ÿÿ‹•Àþÿÿ‰T$‰$èc¸ÿÿÇD$q݉$胹ÿÿ‹•¼þÿÿ‰T$‰$èq¹ÿÿÇD$x݉$èa¹ÿÿ‹•°þÿÿ‰T$‰$è¸ÿÿÇD${݉$è?¹ÿÿÇD$ü‘‰$蟺ÿÿEÓ‰$èôºÿÿEÓ‰D$ÇD$}ÝẺ$èJ¹ÿÿUÔ…Ôþÿÿ‰D$‰$èu¸ÿÿƒìE߉$è·ºÿÿE߉D$ÇD$ÓÝE؉$è ¹ÿÿÇD$ÿÿÿÿÇD$ẺD$ EÔ‰D$E؉D$Eˆ‰$è?äE؉$袸ÿÿë1‰…Œþÿÿ‰•þÿÿ‹µþÿÿ‹ŒþÿÿE؉$è}¸ÿÿ‰Œþÿÿ‰µþÿÿë$E߉$脹ÿÿEÔ‰$èY¸ÿÿëT‰…Œþÿÿ‰•þÿÿ‹µþÿÿ‹ŒþÿÿE߉$èT¹ÿÿ‰Œþÿÿ‰µþÿÿ‹µþÿÿ‹ŒþÿÿEÔ‰$è¸ÿÿ‰Œþÿÿ‰µþÿÿëẺ$èø·ÿÿë1‰…Œþÿÿ‰•þÿÿ‹µþÿÿ‹ŒþÿÿẺ$èÓ·ÿÿ‰Œþÿÿ‰µþÿÿë@EÓ‰$èÚ¸ÿÿÇ$辸ÿÿ‰…Äþÿÿ‹•ÄþÿÿEˆ‰D$‰$èqáë1‰…Œþÿÿ‰•þÿÿ‹µþÿÿ‹ŒþÿÿEÓ‰$莸ÿÿ‰Œþÿÿ‰µþÿÿëwÇD$­ÇD$Ää‹…Äþÿÿ‰$è’¸ÿÿ‰…Œþÿÿ‰•þÿÿƒ½þÿÿÿtëèv·ÿÿ‰…Œþÿÿ‰•þÿÿ‹µþÿÿ‹ŒþÿÿEˆ‰$èéÔ‰Œþÿÿ‰µþÿÿë ‰…Œþÿÿ‰•þÿÿ‹µþÿÿ‹Œþÿÿ…Ôþÿÿ‰$èÏ·ÿÿ‰Œþÿÿ‰µþÿÿë ‰…Œþÿÿ‰•þÿÿ‹µþÿÿ‹Œþÿÿè¸ÿÿ‰Œþÿÿ‰µþÿÿƒ½þÿÿþt‹•Œþÿÿ‰$èq¸ÿÿ‹…Œþÿÿ‰$è³¶ÿÿeø[^]ÃU‰åVSì`ÇD$…ÿÿÿ‰$è+¸ÿÿ‹E‹‰…ÀþÿÿÇD$]Ý…ÿÿÿ‰$è¶ÿÿ‹•Àþÿÿ‰T$‰$èØ´ÿÿÇD$á݉$èøµÿÿUÄ…ÿÿÿ‰D$‰$ècµÿÿƒì‹E‹PEĉD$‰$è«ðÿÿ‰EðEĉ$è͵ÿÿë1‰…´þÿÿ‰•¸þÿÿ‹µ¸þÿÿ‹´þÿÿEĉ$訵ÿÿ‰´þÿÿ‰µ¸þÿÿë%‹Eð‰…Äþÿÿ…ÿÿÿ‰$胶ÿÿë4‰…´þÿÿ‰•¸þÿÿ‹µ¸þÿÿ‹´þÿÿ…ÿÿÿ‰$è[¶ÿÿ‰´þÿÿ‰µ¸þÿÿë‹•Äþÿÿ‰•¼þÿÿ鉅´þÿÿ‰•¸þÿÿƒ½¸þÿÿt锋…´þÿÿ‰$èĶÿÿ‰EôÇD$…ÿÿÿ‰$èÛ¶ÿÿ‹E‹‰…Èþÿÿ‹E‹@…Àt/‹E‹@ƒøu Ç…ÐþÿÿkÝë Ç…ÐþÿÿmÝ‹•Ðþÿÿ‰•Ìþÿÿë Ç…ÌþÿÿoÝ‹…Ìþÿÿ‰…Ôþÿÿ‹E‹@ ‰…ØþÿÿÇD$ Ü…ÿÿÿ‰$èo´ÿÿ‹•Øþÿÿ‰T$‰$è-³ÿÿÇD$q݉$èM´ÿÿ‹•Ôþÿÿ‰T$‰$è;´ÿÿÇD$x݉$è+´ÿÿ‹•Èþÿÿ‰T$‰$èé²ÿÿÇD${݉$è ´ÿÿÇD$ü‘‰$èiµÿÿEω$è¾µÿÿEωD$ÇD$ñÝEȉ$è´ÿÿUÐ…ÿÿÿ‰D$‰$è?³ÿÿƒìEÛ‰$èµÿÿEÛ‰D$ÇD$ÞEÔ‰$è׳ÿÿÇD$ÿÿÿÿÇD$EȉD$ EЉD$EÔ‰D$‹Eô‰$èí×EÔ‰$èl³ÿÿë1‰…´þÿÿ‰•¸þÿÿ‹µ¸þÿÿ‹´þÿÿEÔ‰$èG³ÿÿ‰´þÿÿ‰µ¸þÿÿë$EÛ‰$èN´ÿÿEЉ$è#³ÿÿëT‰…´þÿÿ‰•¸þÿÿ‹µ¸þÿÿ‹´þÿÿEÛ‰$è´ÿÿ‰´þÿÿ‰µ¸þÿÿ‹µ¸þÿÿ‹´þÿÿEЉ$èÛ²ÿÿ‰´þÿÿ‰µ¸þÿÿëEȉ$è²ÿÿë1‰…´þÿÿ‰•¸þÿÿ‹µ¸þÿÿ‹´þÿÿEȉ$è²ÿÿ‰´þÿÿ‰µ¸þÿÿë@Eω$褳ÿÿÇ$舳ÿÿ‰…Üþÿÿ‹•Üþÿÿ‹Eô‰D$‰$è;Üë1‰…´þÿÿ‰•¸þÿÿ‹µ¸þÿÿ‹´þÿÿEω$èX³ÿÿ‰´þÿÿ‰µ¸þÿÿëFÇD$­ÇD$Ää‹…Üþÿÿ‰$è\³ÿÿ‰…´þÿÿ‰•¸þÿÿƒ½¸þÿÿÿtëè@²ÿÿ‰…´þÿÿ‰•¸þÿÿ‹µ¸þÿÿ‹´þÿÿ…ÿÿÿ‰$èʲÿÿ‰´þÿÿ‰µ¸þÿÿë ‰…´þÿÿ‰•¸þÿÿ‹µ¸þÿÿ‹´þÿÿè³ÿÿ‰´þÿÿ‰µ¸þÿÿ齋•´þÿÿ‰$è0³ÿÿÇD$…ÿÿÿ‰$èJ³ÿÿ‹E‹‰…àþÿÿ‹E‹@…Àt/‹E‹@ƒøu Ç…èþÿÿkÝë Ç…èþÿÿmÝ‹…èþÿÿ‰…äþÿÿë Ç…äþÿÿoÝ‹•äþÿÿ‰•ìþÿÿ‹E‹@ ‰…ðþÿÿÇD$°Ý…ÿÿÿ‰$èÞ°ÿÿ‹•ðþÿÿ‰T$‰$蜯ÿÿÇD$q݉$è¼°ÿÿ‹•ìþÿÿ‰T$‰$誰ÿÿÇD$x݉$èš°ÿÿ‹•àþÿÿ‰T$‰$èX¯ÿÿÇD${݉$èx°ÿÿÇD$ü‘‰$èØ±ÿÿEã‰$è-²ÿÿEã‰D$ÇD$ñÝE܉$胰ÿÿUä…ÿÿÿ‰D$‰$讯ÿÿƒìEï‰$èð±ÿÿEï‰D$ÇD$ÓÝEè‰$èF°ÿÿÇD$ÿÿÿÿÇD$E܉D$ Eä‰D$Eè‰D$E´‰$èxÛEè‰$èÛ¯ÿÿë1‰…´þÿÿ‰•¸þÿÿ‹µ¸þÿÿ‹´þÿÿEè‰$趯ÿÿ‰´þÿÿ‰µ¸þÿÿë$Eï‰$è½°ÿÿEä‰$è’¯ÿÿëT‰…´þÿÿ‰•¸þÿÿ‹µ¸þÿÿ‹´þÿÿEï‰$è°ÿÿ‰´þÿÿ‰µ¸þÿÿ‹µ¸þÿÿ‹´þÿÿEä‰$èJ¯ÿÿ‰´þÿÿ‰µ¸þÿÿëE܉$è1¯ÿÿë1‰…´þÿÿ‰•¸þÿÿ‹µ¸þÿÿ‹´þÿÿE܉$è ¯ÿÿ‰´þÿÿ‰µ¸þÿÿë@Eã‰$è°ÿÿÇ$è÷¯ÿÿ‰…ôþÿÿ‹•ôþÿÿE´‰D$‰$èªØë1‰…´þÿÿ‰•¸þÿÿ‹µ¸þÿÿ‹´þÿÿEã‰$èǯÿÿ‰´þÿÿ‰µ¸þÿÿëwÇD$­ÇD$Ää‹…ôþÿÿ‰$è˯ÿÿ‰…´þÿÿ‰•¸þÿÿƒ½¸þÿÿÿtë诮ÿÿ‰…´þÿÿ‰•¸þÿÿ‹µ¸þÿÿ‹´þÿÿE´‰$è"̉´þÿÿ‰µ¸þÿÿë ‰…´þÿÿ‰•¸þÿÿ‹µ¸þÿÿ‹´þÿÿ…ÿÿÿ‰$è¯ÿÿ‰´þÿÿ‰µ¸þÿÿë ‰…´þÿÿ‰•¸þÿÿ‹µ¸þÿÿ‹´þÿÿèM¯ÿÿ‰´þÿÿ‰µ¸þÿÿƒ½¸þÿÿþt‹•´þÿÿ‰$誯ÿÿ‹…´þÿÿ‰$èì­ÿÿ‹…¼þÿÿeø[^]ÃU‰åVSì`ÇD$…ÿÿÿ‰$è]¯ÿÿ‹E‹‰…ÀþÿÿÇD$]Ý…ÿÿÿ‰$èL­ÿÿ‹•Àþÿÿ‰T$‰$è ¬ÿÿÇD$/Þ‰$è*­ÿÿUÄ…ÿÿÿ‰D$‰$蕬ÿÿƒì‹E‹PEĉD$‰$èÝçÿÿ‰EðEĉ$èÿ¬ÿÿë1‰…´þÿÿ‰•¸þÿÿ‹µ¸þÿÿ‹´þÿÿEĉ$èÚ¬ÿÿ‰´þÿÿ‰µ¸þÿÿë-‹Eð‰$èA­ÿÿ‰…Äþÿÿ…ÿÿÿ‰$è­­ÿÿë4‰…´þÿÿ‰•¸þÿÿ‹µ¸þÿÿ‹´þÿÿ…ÿÿÿ‰$è…­ÿÿ‰´þÿÿ‰µ¸þÿÿë‹…Äþÿÿ‰…¼þÿÿ鉅´þÿÿ‰•¸þÿÿƒ½¸þÿÿt锋•´þÿÿ‰$èî­ÿÿ‰EôÇD$…ÿÿÿ‰$è®ÿÿ‹E‹‰…Èþÿÿ‹E‹@…Àt/‹E‹@ƒøu Ç…ÐþÿÿkÝë Ç…ÐþÿÿmÝ‹…Ðþÿÿ‰…Ìþÿÿë Ç…ÌþÿÿoÝ‹•Ìþÿÿ‰•Ôþÿÿ‹E‹@ ‰…ØþÿÿÇD$ Ü…ÿÿÿ‰$虫ÿÿ‹•Øþÿÿ‰T$‰$èWªÿÿÇD$q݉$èw«ÿÿ‹•Ôþÿÿ‰T$‰$èe«ÿÿÇD$x݉$èU«ÿÿ‹•Èþÿÿ‰T$‰$èªÿÿÇD${݉$è3«ÿÿÇD$ü‘‰$蓬ÿÿEω$èè¬ÿÿEωD$ÇD$;ÞEȉ$è>«ÿÿUÐ…ÿÿÿ‰D$‰$èiªÿÿƒìEÛ‰$諬ÿÿEÛ‰D$ÇD$XÞEÔ‰$è«ÿÿÇD$ÿÿÿÿÇD$EȉD$ EЉD$EÔ‰D$‹Eô‰$èÏEÔ‰$è–ªÿÿë1‰…´þÿÿ‰•¸þÿÿ‹µ¸þÿÿ‹´þÿÿEÔ‰$èqªÿÿ‰´þÿÿ‰µ¸þÿÿë$EÛ‰$èx«ÿÿEЉ$èMªÿÿëT‰…´þÿÿ‰•¸þÿÿ‹µ¸þÿÿ‹´þÿÿEÛ‰$èH«ÿÿ‰´þÿÿ‰µ¸þÿÿ‹µ¸þÿÿ‹´þÿÿEЉ$èªÿÿ‰´þÿÿ‰µ¸þÿÿëEȉ$èì©ÿÿë1‰…´þÿÿ‰•¸þÿÿ‹µ¸þÿÿ‹´þÿÿEȉ$èÇ©ÿÿ‰´þÿÿ‰µ¸þÿÿë@Eω$èΪÿÿÇ$貪ÿÿ‰…Üþÿÿ‹•Üþÿÿ‹Eô‰D$‰$èeÓë1‰…´þÿÿ‰•¸þÿÿ‹µ¸þÿÿ‹´þÿÿEω$肪ÿÿ‰´þÿÿ‰µ¸þÿÿëFÇD$­ÇD$Ää‹…Üþÿÿ‰$膪ÿÿ‰…´þÿÿ‰•¸þÿÿƒ½¸þÿÿÿtëèj©ÿÿ‰…´þÿÿ‰•¸þÿÿ‹µ¸þÿÿ‹´þÿÿ…ÿÿÿ‰$èô©ÿÿ‰´þÿÿ‰µ¸þÿÿë ‰…´þÿÿ‰•¸þÿÿ‹µ¸þÿÿ‹´þÿÿè9ªÿÿ‰´þÿÿ‰µ¸þÿÿ齋•´þÿÿ‰$èZªÿÿÇD$…ÿÿÿ‰$ètªÿÿ‹E‹‰…àþÿÿ‹E‹@…Àt/‹E‹@ƒøu Ç…èþÿÿkÝë Ç…èþÿÿmÝ‹…èþÿÿ‰…äþÿÿë Ç…äþÿÿoÝ‹•äþÿÿ‰•ìþÿÿ‹E‹@ ‰…ðþÿÿÇD$°Ý…ÿÿÿ‰$è¨ÿÿ‹•ðþÿÿ‰T$‰$èÆ¦ÿÿÇD$q݉$èæ§ÿÿ‹•ìþÿÿ‰T$‰$èÔ§ÿÿÇD$x݉$èħÿÿ‹•àþÿÿ‰T$‰$肦ÿÿÇD${݉$袧ÿÿÇD$ü‘‰$è©ÿÿEã‰$èW©ÿÿEã‰D$ÇD$;ÞE܉$è­§ÿÿUä…ÿÿÿ‰D$‰$èØ¦ÿÿƒìEï‰$è©ÿÿEï‰D$ÇD$ÓÝEè‰$èp§ÿÿÇD$ÿÿÿÿÇD$E܉D$ Eä‰D$Eè‰D$E´‰$è¢ÒEè‰$è§ÿÿë1‰…´þÿÿ‰•¸þÿÿ‹µ¸þÿÿ‹´þÿÿEè‰$èà¦ÿÿ‰´þÿÿ‰µ¸þÿÿë$Eï‰$èç§ÿÿEä‰$輦ÿÿëT‰…´þÿÿ‰•¸þÿÿ‹µ¸þÿÿ‹´þÿÿEï‰$è·§ÿÿ‰´þÿÿ‰µ¸þÿÿ‹µ¸þÿÿ‹´þÿÿEä‰$èt¦ÿÿ‰´þÿÿ‰µ¸þÿÿëE܉$è[¦ÿÿë1‰…´þÿÿ‰•¸þÿÿ‹µ¸þÿÿ‹´þÿÿE܉$è6¦ÿÿ‰´þÿÿ‰µ¸þÿÿë@Eã‰$è=§ÿÿÇ$è!§ÿÿ‰…ôþÿÿ‹•ôþÿÿE´‰D$‰$èÔÏë1‰…´þÿÿ‰•¸þÿÿ‹µ¸þÿÿ‹´þÿÿEã‰$èñ¦ÿÿ‰´þÿÿ‰µ¸þÿÿëwÇD$­ÇD$Ää‹…ôþÿÿ‰$èõ¦ÿÿ‰…´þÿÿ‰•¸þÿÿƒ½¸þÿÿÿtëèÙ¥ÿÿ‰…´þÿÿ‰•¸þÿÿ‹µ¸þÿÿ‹´þÿÿE´‰$èLÉ´þÿÿ‰µ¸þÿÿë ‰…´þÿÿ‰•¸þÿÿ‹µ¸þÿÿ‹´þÿÿ…ÿÿÿ‰$è2¦ÿÿ‰´þÿÿ‰µ¸þÿÿë ‰…´þÿÿ‰•¸þÿÿ‹µ¸þÿÿ‹´þÿÿèw¦ÿÿ‰´þÿÿ‰µ¸þÿÿƒ½¸þÿÿþt‹•´þÿÿ‰$èÔ¦ÿÿ‹…´þÿÿ‰$è¥ÿÿ‹…¼þÿÿeø[^]ÃU‰åVSìpÇD$…ÿÿÿ‰$臦ÿÿ‹E‹‰…¼þÿÿÇD$]Ý…ÿÿÿ‰$èv¤ÿÿ‹•¼þÿÿ‰T$‰$è4£ÿÿÇD$wÞ‰$èT¤ÿÿUÄ…ÿÿÿ‰D$‰$è¿£ÿÿƒì‹E‹PEĉD$‰$èßÿÿ‰EðEĉ$è)¤ÿÿë1‰…¨þÿÿ‰•¬þÿÿ‹µ¬þÿÿ‹¨þÿÿEĉ$è¤ÿÿ‰¨þÿÿ‰µ¬þÿÿë-‹Eð‰$苤ÿÿÝÀþÿÿ…ÿÿÿ‰$èפÿÿë4‰…¨þÿÿ‰•¬þÿÿ‹µ¬þÿÿ‹¨þÿÿ…ÿÿÿ‰$诤ÿÿ‰¨þÿÿ‰µ¬þÿÿëÝ…Àþÿÿݰþÿÿ鉅¨þÿÿ‰•¬þÿÿƒ½¬þÿÿt锋…¨þÿÿ‰$è¥ÿÿ‰EôÇD$…ÿÿÿ‰$è/¥ÿÿ‹E‹‰…Èþÿÿ‹E‹@…Àt/‹E‹@ƒøu Ç…ÐþÿÿkÝë Ç…ÐþÿÿmÝ‹•Ðþÿÿ‰•Ìþÿÿë Ç…ÌþÿÿoÝ‹…Ìþÿÿ‰…Ôþÿÿ‹E‹@ ‰…ØþÿÿÇD$ Ü…ÿÿÿ‰$èâÿÿ‹•Øþÿÿ‰T$‰$è¡ÿÿÇD$q݉$è¡¢ÿÿ‹•Ôþÿÿ‰T$‰$è¢ÿÿÇD$x݉$è¢ÿÿ‹•Èþÿÿ‰T$‰$è=¡ÿÿÇD${݉$è]¢ÿÿÇD$ü‘‰$è½£ÿÿEω$è¤ÿÿEωD$ÇD$‚ÞEȉ$èh¢ÿÿUÐ…ÿÿÿ‰D$‰$è“¡ÿÿƒìEÛ‰$èÕ£ÿÿEÛ‰D$ÇD$ ÞEÔ‰$è+¢ÿÿÇD$ÿÿÿÿÇD$EȉD$ EЉD$EÔ‰D$‹Eô‰$èAÆEÔ‰$èÀ¡ÿÿë1‰…¨þÿÿ‰•¬þÿÿ‹µ¬þÿÿ‹¨þÿÿEÔ‰$蛡ÿÿ‰¨þÿÿ‰µ¬þÿÿë$EÛ‰$袢ÿÿEЉ$èw¡ÿÿëT‰…¨þÿÿ‰•¬þÿÿ‹µ¬þÿÿ‹¨þÿÿEÛ‰$èr¢ÿÿ‰¨þÿÿ‰µ¬þÿÿ‹µ¬þÿÿ‹¨þÿÿEЉ$è/¡ÿÿ‰¨þÿÿ‰µ¬þÿÿëEȉ$è¡ÿÿë1‰…¨þÿÿ‰•¬þÿÿ‹µ¬þÿÿ‹¨þÿÿEȉ$èñ ÿÿ‰¨þÿÿ‰µ¬þÿÿë@Eω$èø¡ÿÿÇ$èÜ¡ÿÿ‰…Üþÿÿ‹•Üþÿÿ‹Eô‰D$‰$èÊë1‰…¨þÿÿ‰•¬þÿÿ‹µ¬þÿÿ‹¨þÿÿEω$謡ÿÿ‰¨þÿÿ‰µ¬þÿÿëFÇD$­ÇD$Ää‹…Üþÿÿ‰$è°¡ÿÿ‰…¨þÿÿ‰•¬þÿÿƒ½¬þÿÿÿtëè” ÿÿ‰…¨þÿÿ‰•¬þÿÿ‹µ¬þÿÿ‹¨þÿÿ…ÿÿÿ‰$è¡ÿÿ‰¨þÿÿ‰µ¬þÿÿë ‰…¨þÿÿ‰•¬þÿÿ‹µ¬þÿÿ‹¨þÿÿèc¡ÿÿ‰¨þÿÿ‰µ¬þÿÿ齋•¨þÿÿ‰$è„¡ÿÿÇD$…ÿÿÿ‰$èž¡ÿÿ‹E‹‰…àþÿÿ‹E‹@…Àt/‹E‹@ƒøu Ç…èþÿÿkÝë Ç…èþÿÿmÝ‹…èþÿÿ‰…äþÿÿë Ç…äþÿÿoÝ‹•äþÿÿ‰•ìþÿÿ‹E‹@ ‰…ðþÿÿÇD$°Ý…ÿÿÿ‰$è2Ÿÿÿ‹•ðþÿÿ‰T$‰$èðÿÿÇD$q݉$èŸÿÿ‹•ìþÿÿ‰T$‰$èþžÿÿÇD$x݉$èîžÿÿ‹•àþÿÿ‰T$‰$è¬ÿÿÇD${݉$èÌžÿÿÇD$ü‘‰$è, ÿÿEã‰$è ÿÿEã‰D$ÇD$‚ÞE܉$èמÿÿUä…ÿÿÿ‰D$‰$èžÿÿƒìEï‰$èD ÿÿEï‰D$ÇD$ÓÝEè‰$èšžÿÿÇD$ÿÿÿÿÇD$E܉D$ Eä‰D$Eè‰D$E´‰$èÌÉEè‰$è/žÿÿë1‰…¨þÿÿ‰•¬þÿÿ‹µ¬þÿÿ‹¨þÿÿEè‰$è žÿÿ‰¨þÿÿ‰µ¬þÿÿë$Eï‰$èŸÿÿEä‰$èæÿÿëT‰…¨þÿÿ‰•¬þÿÿ‹µ¬þÿÿ‹¨þÿÿEï‰$èážÿÿ‰¨þÿÿ‰µ¬þÿÿ‹µ¬þÿÿ‹¨þÿÿEä‰$èžÿÿ‰¨þÿÿ‰µ¬þÿÿëE܉$è…ÿÿë1‰…¨þÿÿ‰•¬þÿÿ‹µ¬þÿÿ‹¨þÿÿE܉$è`ÿÿ‰¨þÿÿ‰µ¬þÿÿë@Eã‰$ègžÿÿÇ$èKžÿÿ‰…ôþÿÿ‹•ôþÿÿE´‰D$‰$èþÆë1‰…¨þÿÿ‰•¬þÿÿ‹µ¬þÿÿ‹¨þÿÿEã‰$èžÿÿ‰¨þÿÿ‰µ¬þÿÿëwÇD$­ÇD$Ää‹…ôþÿÿ‰$èžÿÿ‰…¨þÿÿ‰•¬þÿÿƒ½¬þÿÿÿtëèÿÿ‰…¨þÿÿ‰•¬þÿÿ‹µ¬þÿÿ‹¨þÿÿE´‰$èvº‰¨þÿÿ‰µ¬þÿÿë ‰…¨þÿÿ‰•¬þÿÿ‹µ¬þÿÿ‹¨þÿÿ…ÿÿÿ‰$è\ÿÿ‰¨þÿÿ‰µ¬þÿÿë ‰…¨þÿÿ‰•¬þÿÿ‹µ¬þÿÿ‹¨þÿÿè¡ÿÿ‰¨þÿÿ‰µ¬þÿÿƒ½¬þÿÿþt‹•¨þÿÿ‰$èþÿÿ‹…¨þÿÿ‰$è@œÿÿÝ…°þÿÿeø[^]ÃU‰åVSì`ÇD$…ÿÿÿ‰$è±ÿÿ‹E‹‰…ÀþÿÿÇD$]Ý…ÿÿÿ‰$è ›ÿÿ‹•Àþÿÿ‰T$‰$è^šÿÿÇD$ÀÞ‰$è~›ÿÿUÄ…ÿÿÿ‰D$‰$èéšÿÿƒì‹E‹PEĉD$‰$è1Öÿÿ‰EðEĉ$èS›ÿÿë1‰…´þÿÿ‰•¸þÿÿ‹µ¸þÿÿ‹´þÿÿEĉ$è.›ÿÿ‰´þÿÿ‰µ¸þÿÿë-‹Eð‰$è•›ÿÿ‰…Äþÿÿ…ÿÿÿ‰$èœÿÿë4‰…´þÿÿ‰•¸þÿÿ‹µ¸þÿÿ‹´þÿÿ…ÿÿÿ‰$èÙ›ÿÿ‰´þÿÿ‰µ¸þÿÿë‹…Äþÿÿ‰…¼þÿÿ鉅´þÿÿ‰•¸þÿÿƒ½¸þÿÿt锋•´þÿÿ‰$èBœÿÿ‰EôÇD$…ÿÿÿ‰$èYœÿÿ‹E‹‰…Èþÿÿ‹E‹@…Àt/‹E‹@ƒøu Ç…ÐþÿÿkÝë Ç…ÐþÿÿmÝ‹…Ðþÿÿ‰…Ìþÿÿë Ç…ÌþÿÿoÝ‹•Ìþÿÿ‰•Ôþÿÿ‹E‹@ ‰…ØþÿÿÇD$ Ü…ÿÿÿ‰$èí™ÿÿ‹•Øþÿÿ‰T$‰$諘ÿÿÇD$q݉$èË™ÿÿ‹•Ôþÿÿ‰T$‰$è¹™ÿÿÇD$x݉$è©™ÿÿ‹•Èþÿÿ‰T$‰$èg˜ÿÿÇD${݉$臙ÿÿÇD$ü‘‰$èçšÿÿEω$è<›ÿÿEωD$ÇD$ÊÞEȉ$è’™ÿÿUÐ…ÿÿÿ‰D$‰$轘ÿÿƒìEÛ‰$èÿšÿÿEÛ‰D$ÇD$ãÞEÔ‰$èU™ÿÿÇD$ÿÿÿÿÇD$EȉD$ EЉD$EÔ‰D$‹Eô‰$èk½EÔ‰$èê˜ÿÿë1‰…´þÿÿ‰•¸þÿÿ‹µ¸þÿÿ‹´þÿÿEÔ‰$èŘÿÿ‰´þÿÿ‰µ¸þÿÿë$EÛ‰$èÌ™ÿÿEЉ$衘ÿÿëT‰…´þÿÿ‰•¸þÿÿ‹µ¸þÿÿ‹´þÿÿEÛ‰$蜙ÿÿ‰´þÿÿ‰µ¸þÿÿ‹µ¸þÿÿ‹´þÿÿEЉ$èY˜ÿÿ‰´þÿÿ‰µ¸þÿÿëEȉ$è@˜ÿÿë1‰…´þÿÿ‰•¸þÿÿ‹µ¸þÿÿ‹´þÿÿEȉ$è˜ÿÿ‰´þÿÿ‰µ¸þÿÿë@Eω$è"™ÿÿÇ$è™ÿÿ‰…Üþÿÿ‹•Üþÿÿ‹Eô‰D$‰$è¹Áë1‰…´þÿÿ‰•¸þÿÿ‹µ¸þÿÿ‹´þÿÿEω$èÖ˜ÿÿ‰´þÿÿ‰µ¸þÿÿëFÇD$­ÇD$Ää‹…Üþÿÿ‰$èÚ˜ÿÿ‰…´þÿÿ‰•¸þÿÿƒ½¸þÿÿÿtëè¾—ÿÿ‰…´þÿÿ‰•¸þÿÿ‹µ¸þÿÿ‹´þÿÿ…ÿÿÿ‰$èH˜ÿÿ‰´þÿÿ‰µ¸þÿÿë ‰…´þÿÿ‰•¸þÿÿ‹µ¸þÿÿ‹´þÿÿè˜ÿÿ‰´þÿÿ‰µ¸þÿÿ齋•´þÿÿ‰$讘ÿÿÇD$…ÿÿÿ‰$èȘÿÿ‹E‹‰…àþÿÿ‹E‹@…Àt/‹E‹@ƒøu Ç…èþÿÿkÝë Ç…èþÿÿmÝ‹…èþÿÿ‰…äþÿÿë Ç…äþÿÿoÝ‹•äþÿÿ‰•ìþÿÿ‹E‹@ ‰…ðþÿÿÇD$°Ý…ÿÿÿ‰$è\–ÿÿ‹•ðþÿÿ‰T$‰$è•ÿÿÇD$q݉$è:–ÿÿ‹•ìþÿÿ‰T$‰$è(–ÿÿÇD$x݉$è–ÿÿ‹•àþÿÿ‰T$‰$èÖ”ÿÿÇD${݉$èö•ÿÿÇD$ü‘‰$èV—ÿÿEã‰$è«—ÿÿEã‰D$ÇD$ÊÞE܉$è–ÿÿUä…ÿÿÿ‰D$‰$è,•ÿÿƒìEï‰$èn—ÿÿEï‰D$ÇD$ÓÝEè‰$èÄ•ÿÿÇD$ÿÿÿÿÇD$E܉D$ Eä‰D$Eè‰D$E´‰$èöÀEè‰$èY•ÿÿë1‰…´þÿÿ‰•¸þÿÿ‹µ¸þÿÿ‹´þÿÿEè‰$è4•ÿÿ‰´þÿÿ‰µ¸þÿÿë$Eï‰$è;–ÿÿEä‰$è•ÿÿëT‰…´þÿÿ‰•¸þÿÿ‹µ¸þÿÿ‹´þÿÿEï‰$è –ÿÿ‰´þÿÿ‰µ¸þÿÿ‹µ¸þÿÿ‹´þÿÿEä‰$èÈ”ÿÿ‰´þÿÿ‰µ¸þÿÿëE܉$诔ÿÿë1‰…´þÿÿ‰•¸þÿÿ‹µ¸þÿÿ‹´þÿÿE܉$芔ÿÿ‰´þÿÿ‰µ¸þÿÿë@Eã‰$è‘•ÿÿÇ$èu•ÿÿ‰…ôþÿÿ‹•ôþÿÿE´‰D$‰$è(¾ë1‰…´þÿÿ‰•¸þÿÿ‹µ¸þÿÿ‹´þÿÿEã‰$èE•ÿÿ‰´þÿÿ‰µ¸þÿÿëwÇD$­ÇD$Ää‹…ôþÿÿ‰$èI•ÿÿ‰…´þÿÿ‰•¸þÿÿƒ½¸þÿÿÿtëè-”ÿÿ‰…´þÿÿ‰•¸þÿÿ‹µ¸þÿÿ‹´þÿÿE´‰$è ±‰´þÿÿ‰µ¸þÿÿë ‰…´þÿÿ‰•¸þÿÿ‹µ¸þÿÿ‹´þÿÿ…ÿÿÿ‰$膔ÿÿ‰´þÿÿ‰µ¸þÿÿë ‰…´þÿÿ‰•¸þÿÿ‹µ¸þÿÿ‹´þÿÿèË”ÿÿ‰´þÿÿ‰µ¸þÿÿƒ½¸þÿÿþt‹•´þÿÿ‰$è(•ÿÿ‹…´þÿÿ‰$èj“ÿÿ‹…¼þÿÿeø[^]ÃU‰åVSì`ÇD$…ÿÿÿ‰$èÛ”ÿÿ‹E‹‰…ÄþÿÿÇD$]Ý…ÿÿÿ‰$èÊ’ÿÿ‹•Äþÿÿ‰T$‰$舑ÿÿÇD$üÞ‰$訒ÿÿUÄ…ÿÿÿ‰D$‰$è’ÿÿƒì‹E‹PEĉD$‰$è[Íÿÿ‰EðEĉ$è}’ÿÿë1‰…¼þÿÿ‰•Àþÿÿ‹µÀþÿÿ‹¼þÿÿEĉ$èX’ÿÿ‰¼þÿÿ‰µÀþÿÿë;‹E‹@ ‰D$‹E ‰D$‹Eð‰$èv»ÿÿ…ÿÿÿ‰$è “ÿÿéĉ…¼þÿÿ‰•Àþÿÿ‹µÀþÿÿ‹¼þÿÿ…ÿÿÿ‰$èõ’ÿÿ‰¼þÿÿ‰µÀþÿÿë ‰…¼þÿÿ‰•Àþÿÿƒ½Àþÿÿt锋…¼þÿÿ‰$èo“ÿÿ‰EôÇD$…ÿÿÿ‰$膓ÿÿ‹E‹‰…Èþÿÿ‹E‹@…Àt/‹E‹@ƒøu Ç…ÐþÿÿkÝë Ç…ÐþÿÿmÝ‹•Ðþÿÿ‰•Ìþÿÿë Ç…ÌþÿÿoÝ‹…Ìþÿÿ‰…Ôþÿÿ‹E‹@ ‰…ØþÿÿÇD$ Ü…ÿÿÿ‰$è‘ÿÿ‹•Øþÿÿ‰T$‰$èØÿÿÇD$q݉$èøÿÿ‹•Ôþÿÿ‰T$‰$èæÿÿÇD$x݉$èÖÿÿ‹•Èþÿÿ‰T$‰$è”ÿÿÇD${݉$è´ÿÿÇD$ü‘‰$è’ÿÿEω$èi’ÿÿEωD$ÇD$ßEȉ$è¿ÿÿUÐ…ÿÿÿ‰D$‰$èêÿÿƒìEÛ‰$è,’ÿÿEÛ‰D$ÇD$ßEÔ‰$è‚ÿÿÇD$ÿÿÿÿÇD$EȉD$ EЉD$EÔ‰D$‹Eô‰$蘴EÔ‰$èÿÿë1‰…¼þÿÿ‰•Àþÿÿ‹µÀþÿÿ‹¼þÿÿEÔ‰$èòÿÿ‰¼þÿÿ‰µÀþÿÿë$EÛ‰$èùÿÿEЉ$èÎÿÿëT‰…¼þÿÿ‰•Àþÿÿ‹µÀþÿÿ‹¼þÿÿEÛ‰$èÉÿÿ‰¼þÿÿ‰µÀþÿÿ‹µÀþÿÿ‹¼þÿÿEЉ$è†ÿÿ‰¼þÿÿ‰µÀþÿÿëEȉ$èmÿÿë1‰…¼þÿÿ‰•Àþÿÿ‹µÀþÿÿ‹¼þÿÿEȉ$èHÿÿ‰¼þÿÿ‰µÀþÿÿë@Eω$èOÿÿÇ$è3ÿÿ‰…Üþÿÿ‹•Üþÿÿ‹Eô‰D$‰$èæ¸ë1‰…¼þÿÿ‰•Àþÿÿ‹µÀþÿÿ‹¼þÿÿEω$èÿÿ‰¼þÿÿ‰µÀþÿÿëFÇD$­ÇD$Ää‹…Üþÿÿ‰$èÿÿ‰…¼þÿÿ‰•Àþÿÿƒ½ÀþÿÿÿtëèëŽÿÿ‰…¼þÿÿ‰•Àþÿÿ‹µÀþÿÿ‹¼þÿÿ…ÿÿÿ‰$èuÿÿ‰¼þÿÿ‰µÀþÿÿë ‰…¼þÿÿ‰•Àþÿÿ‹µÀþÿÿ‹¼þÿÿèºÿÿ‰¼þÿÿ‰µÀþÿÿ齋•¼þÿÿ‰$èÛÿÿÇD$…ÿÿÿ‰$èõÿÿ‹E‹‰…àþÿÿ‹E‹@…Àt/‹E‹@ƒøu Ç…èþÿÿkÝë Ç…èþÿÿmÝ‹…èþÿÿ‰…äþÿÿë Ç…äþÿÿoÝ‹•äþÿÿ‰•ìþÿÿ‹E‹@ ‰…ðþÿÿÇD$°Ý…ÿÿÿ‰$è‰ÿÿ‹•ðþÿÿ‰T$‰$èGŒÿÿÇD$q݉$ègÿÿ‹•ìþÿÿ‰T$‰$èUÿÿÇD$x݉$èEÿÿ‹•àþÿÿ‰T$‰$èŒÿÿÇD${݉$è#ÿÿÇD$ü‘‰$胎ÿÿEã‰$èØŽÿÿEã‰D$ÇD$ßE܉$è.ÿÿUä…ÿÿÿ‰D$‰$èYŒÿÿƒìEï‰$蛎ÿÿEï‰D$ÇD$ÓÝEè‰$èñŒÿÿÇD$ÿÿÿÿÇD$E܉D$ Eä‰D$Eè‰D$E´‰$è#¸Eè‰$膌ÿÿë1‰…¼þÿÿ‰•Àþÿÿ‹µÀþÿÿ‹¼þÿÿEè‰$èaŒÿÿ‰¼þÿÿ‰µÀþÿÿë$Eï‰$èhÿÿEä‰$è=ŒÿÿëT‰…¼þÿÿ‰•Àþÿÿ‹µÀþÿÿ‹¼þÿÿEï‰$è8ÿÿ‰¼þÿÿ‰µÀþÿÿ‹µÀþÿÿ‹¼þÿÿEä‰$èõ‹ÿÿ‰¼þÿÿ‰µÀþÿÿëE܉$èÜ‹ÿÿë1‰…¼þÿÿ‰•Àþÿÿ‹µÀþÿÿ‹¼þÿÿE܉$è·‹ÿÿ‰¼þÿÿ‰µÀþÿÿë@Eã‰$辌ÿÿÇ$袌ÿÿ‰…ôþÿÿ‹•ôþÿÿE´‰D$‰$èUµë1‰…¼þÿÿ‰•Àþÿÿ‹µÀþÿÿ‹¼þÿÿEã‰$èrŒÿÿ‰¼þÿÿ‰µÀþÿÿëwÇD$­ÇD$Ää‹…ôþÿÿ‰$èvŒÿÿ‰…¼þÿÿ‰•Àþÿÿƒ½ÀþÿÿÿtëèZ‹ÿÿ‰…¼þÿÿ‰•Àþÿÿ‹µÀþÿÿ‹¼þÿÿE´‰$èͨ‰¼þÿÿ‰µÀþÿÿë ‰…¼þÿÿ‰•Àþÿÿ‹µÀþÿÿ‹¼þÿÿ…ÿÿÿ‰$賋ÿÿ‰¼þÿÿ‰µÀþÿÿë ‰…¼þÿÿ‰•Àþÿÿ‹µÀþÿÿ‹¼þÿÿèø‹ÿÿ‰¼þÿÿ‰µÀþÿÿƒ½Àþÿÿþt‹•¼þÿÿ‰$èUŒÿÿ‹…¼þÿÿ‰$è—Šÿÿeø[^]ÃU‰åVSìpÇD$…ÿÿÿ‰$èŒÿÿ‹E‹‰…¼þÿÿÇD$]Ý…ÿÿÿ‰$èþ‰ÿÿ‹•¼þÿÿ‰T$‰$輈ÿÿÇD$5߉$è܉ÿÿUÄ…ÿÿÿ‰D$‰$èG‰ÿÿƒì‹E‹PEĉD$‰$èÄÿÿ‰EðEĉ$豉ÿÿë1‰…¨þÿÿ‰•¬þÿÿ‹µ¬þÿÿ‹¨þÿÿEĉ$茉ÿÿ‰¨þÿÿ‰µ¬þÿÿë-‹Eð‰$èŠÿÿÝÀþÿÿ…ÿÿÿ‰$è_Šÿÿë4‰…¨þÿÿ‰•¬þÿÿ‹µ¬þÿÿ‹¨þÿÿ…ÿÿÿ‰$è7Šÿÿ‰¨þÿÿ‰µ¬þÿÿëÝ…Àþÿÿݰþÿÿ鉅¨þÿÿ‰•¬þÿÿƒ½¬þÿÿt锋…¨þÿÿ‰$è Šÿÿ‰EôÇD$…ÿÿÿ‰$è·Šÿÿ‹E‹‰…Èþÿÿ‹E‹@…Àt/‹E‹@ƒøu Ç…ÐþÿÿkÝë Ç…ÐþÿÿmÝ‹•Ðþÿÿ‰•Ìþÿÿë Ç…ÌþÿÿoÝ‹…Ìþÿÿ‰…Ôþÿÿ‹E‹@ ‰…ØþÿÿÇD$ Ü…ÿÿÿ‰$èKˆÿÿ‹•Øþÿÿ‰T$‰$è ‡ÿÿÇD$q݉$è)ˆÿÿ‹•Ôþÿÿ‰T$‰$èˆÿÿÇD$x݉$èˆÿÿ‹•Èþÿÿ‰T$‰$èņÿÿÇD${݉$èå‡ÿÿÇD$ü‘‰$èE‰ÿÿEω$蚉ÿÿEωD$ÇD$HßEȉ$èð‡ÿÿUÐ…ÿÿÿ‰D$‰$è‡ÿÿƒìEÛ‰$è]‰ÿÿEÛ‰D$ÇD$pßEÔ‰$資ÿÿÇD$ÿÿÿÿÇD$EȉD$ EЉD$EÔ‰D$‹Eô‰$èÉ«EÔ‰$èH‡ÿÿë1‰…¨þÿÿ‰•¬þÿÿ‹µ¬þÿÿ‹¨þÿÿEÔ‰$è#‡ÿÿ‰¨þÿÿ‰µ¬þÿÿë$EÛ‰$è*ˆÿÿEЉ$èÿ†ÿÿëT‰…¨þÿÿ‰•¬þÿÿ‹µ¬þÿÿ‹¨þÿÿEÛ‰$èú‡ÿÿ‰¨þÿÿ‰µ¬þÿÿ‹µ¬þÿÿ‹¨þÿÿEЉ$è·†ÿÿ‰¨þÿÿ‰µ¬þÿÿëEȉ$螆ÿÿë1‰…¨þÿÿ‰•¬þÿÿ‹µ¬þÿÿ‹¨þÿÿEȉ$èy†ÿÿ‰¨þÿÿ‰µ¬þÿÿë@Eω$耇ÿÿÇ$èd‡ÿÿ‰…Üþÿÿ‹•Üþÿÿ‹Eô‰D$‰$è°ë1‰…¨þÿÿ‰•¬þÿÿ‹µ¬þÿÿ‹¨þÿÿEω$è4‡ÿÿ‰¨þÿÿ‰µ¬þÿÿëFÇD$­ÇD$Ää‹…Üþÿÿ‰$è8‡ÿÿ‰…¨þÿÿ‰•¬þÿÿƒ½¬þÿÿÿtëè†ÿÿ‰…¨þÿÿ‰•¬þÿÿ‹µ¬þÿÿ‹¨þÿÿ…ÿÿÿ‰$覆ÿÿ‰¨þÿÿ‰µ¬þÿÿë ‰…¨þÿÿ‰•¬þÿÿ‹µ¬þÿÿ‹¨þÿÿèë†ÿÿ‰¨þÿÿ‰µ¬þÿÿ齋•¨þÿÿ‰$è ‡ÿÿÇD$…ÿÿÿ‰$è&‡ÿÿ‹E‹‰…àþÿÿ‹E‹@…Àt/‹E‹@ƒøu Ç…èþÿÿkÝë Ç…èþÿÿmÝ‹…èþÿÿ‰…äþÿÿë Ç…äþÿÿoÝ‹•äþÿÿ‰•ìþÿÿ‹E‹@ ‰…ðþÿÿÇD$°Ý…ÿÿÿ‰$躄ÿÿ‹•ðþÿÿ‰T$‰$èxƒÿÿÇD$q݉$蘄ÿÿ‹•ìþÿÿ‰T$‰$膄ÿÿÇD$x݉$èv„ÿÿ‹•àþÿÿ‰T$‰$è4ƒÿÿÇD${݉$èT„ÿÿÇD$ü‘‰$è´…ÿÿEã‰$è †ÿÿEã‰D$ÇD$HßE܉$è_„ÿÿUä…ÿÿÿ‰D$‰$芃ÿÿƒìEï‰$èÌ…ÿÿEï‰D$ÇD$ÓÝEè‰$è"„ÿÿÇD$ÿÿÿÿÇD$E܉D$ Eä‰D$Eè‰D$E´‰$èT¯Eè‰$è·ƒÿÿë1‰…¨þÿÿ‰•¬þÿÿ‹µ¬þÿÿ‹¨þÿÿEè‰$è’ƒÿÿ‰¨þÿÿ‰µ¬þÿÿë$Eï‰$虄ÿÿEä‰$ènƒÿÿëT‰…¨þÿÿ‰•¬þÿÿ‹µ¬þÿÿ‹¨þÿÿEï‰$èi„ÿÿ‰¨þÿÿ‰µ¬þÿÿ‹µ¬þÿÿ‹¨þÿÿEä‰$è&ƒÿÿ‰¨þÿÿ‰µ¬þÿÿëE܉$è ƒÿÿë1‰…¨þÿÿ‰•¬þÿÿ‹µ¬þÿÿ‹¨þÿÿE܉$èè‚ÿÿ‰¨þÿÿ‰µ¬þÿÿë@Eã‰$èïƒÿÿÇ$èÓƒÿÿ‰…ôþÿÿ‹•ôþÿÿE´‰D$‰$膬ë1‰…¨þÿÿ‰•¬þÿÿ‹µ¬þÿÿ‹¨þÿÿEã‰$裃ÿÿ‰¨þÿÿ‰µ¬þÿÿëwÇD$­ÇD$Ää‹…ôþÿÿ‰$觃ÿÿ‰…¨þÿÿ‰•¬þÿÿƒ½¬þÿÿÿtëè‹‚ÿÿ‰…¨þÿÿ‰•¬þÿÿ‹µ¬þÿÿ‹¨þÿÿE´‰$èþŸ‰¨þÿÿ‰µ¬þÿÿë ‰…¨þÿÿ‰•¬þÿÿ‹µ¬þÿÿ‹¨þÿÿ…ÿÿÿ‰$èä‚ÿÿ‰¨þÿÿ‰µ¬þÿÿë ‰…¨þÿÿ‰•¬þÿÿ‹µ¬þÿÿ‹¨þÿÿè)ƒÿÿ‰¨þÿÿ‰µ¬þÿÿƒ½¬þÿÿþt‹•¨þÿÿ‰$膃ÿÿ‹…¨þÿÿ‰$èÈÿÿÝ…°þÿÿeø[^]ÃU‰åVSìpÇD$…ÿÿÿ‰$è9ƒÿÿ‹E‹‰…¼þÿÿÇD$]Ý…ÿÿÿ‰$è(ÿÿ‹•¼þÿÿ‰T$‰$èæÿÿÇD$šß‰$èÿÿUÄ…ÿÿÿ‰D$‰$èq€ÿÿƒì‹E‹PEĉD$‰$è¹»ÿÿ‰EðEĉ$èÛ€ÿÿë1‰…¨þÿÿ‰•¬þÿÿ‹µ¬þÿÿ‹¨þÿÿEĉ$è¶€ÿÿ‰¨þÿÿ‰µ¬þÿÿë-‹Eð‰$è=ÿÿÝÀþÿÿ…ÿÿÿ‰$è‰ÿÿë4‰…¨þÿÿ‰•¬þÿÿ‹µ¬þÿÿ‹¨þÿÿ…ÿÿÿ‰$èaÿÿ‰¨þÿÿ‰µ¬þÿÿëÝ…Àþÿÿݰþÿÿ鉅¨þÿÿ‰•¬þÿÿƒ½¬þÿÿt锋…¨þÿÿ‰$èÊÿÿ‰EôÇD$…ÿÿÿ‰$èáÿÿ‹E‹‰…Èþÿÿ‹E‹@…Àt/‹E‹@ƒøu Ç…ÐþÿÿkÝë Ç…ÐþÿÿmÝ‹•Ðþÿÿ‰•Ìþÿÿë Ç…ÌþÿÿoÝ‹…Ìþÿÿ‰…Ôþÿÿ‹E‹@ ‰…ØþÿÿÇD$ Ü…ÿÿÿ‰$èuÿÿ‹•Øþÿÿ‰T$‰$è3~ÿÿÇD$q݉$èSÿÿ‹•Ôþÿÿ‰T$‰$èAÿÿÇD$x݉$è1ÿÿ‹•Èþÿÿ‰T$‰$èï}ÿÿÇD${݉$èÿÿÇD$ü‘‰$èo€ÿÿEω$èÄ€ÿÿEωD$ÇD$¬ßEȉ$èÿÿUÐ…ÿÿÿ‰D$‰$èE~ÿÿƒìEÛ‰$臀ÿÿEÛ‰D$ÇD$ÔßEÔ‰$èÝ~ÿÿÇD$ÿÿÿÿÇD$EȉD$ EЉD$EÔ‰D$‹Eô‰$èó¢EÔ‰$èr~ÿÿë1‰…¨þÿÿ‰•¬þÿÿ‹µ¬þÿÿ‹¨þÿÿEÔ‰$èM~ÿÿ‰¨þÿÿ‰µ¬þÿÿë$EÛ‰$èTÿÿEЉ$è)~ÿÿëT‰…¨þÿÿ‰•¬þÿÿ‹µ¬þÿÿ‹¨þÿÿEÛ‰$è$ÿÿ‰¨þÿÿ‰µ¬þÿÿ‹µ¬þÿÿ‹¨þÿÿEЉ$èá}ÿÿ‰¨þÿÿ‰µ¬þÿÿëEȉ$èÈ}ÿÿë1‰…¨þÿÿ‰•¬þÿÿ‹µ¬þÿÿ‹¨þÿÿEȉ$è£}ÿÿ‰¨þÿÿ‰µ¬þÿÿë@Eω$èª~ÿÿÇ$èŽ~ÿÿ‰…Üþÿÿ‹•Üþÿÿ‹Eô‰D$‰$èA§ë1‰…¨þÿÿ‰•¬þÿÿ‹µ¬þÿÿ‹¨þÿÿEω$è^~ÿÿ‰¨þÿÿ‰µ¬þÿÿëFÇD$­ÇD$Ää‹…Üþÿÿ‰$èb~ÿÿ‰…¨þÿÿ‰•¬þÿÿƒ½¬þÿÿÿtëèF}ÿÿ‰…¨þÿÿ‰•¬þÿÿ‹µ¬þÿÿ‹¨þÿÿ…ÿÿÿ‰$èÐ}ÿÿ‰¨þÿÿ‰µ¬þÿÿë ‰…¨þÿÿ‰•¬þÿÿ‹µ¬þÿÿ‹¨þÿÿè~ÿÿ‰¨þÿÿ‰µ¬þÿÿ齋•¨þÿÿ‰$è6~ÿÿÇD$…ÿÿÿ‰$èP~ÿÿ‹E‹‰…àþÿÿ‹E‹@…Àt/‹E‹@ƒøu Ç…èþÿÿkÝë Ç…èþÿÿmÝ‹…èþÿÿ‰…äþÿÿë Ç…äþÿÿoÝ‹•äþÿÿ‰•ìþÿÿ‹E‹@ ‰…ðþÿÿÇD$°Ý…ÿÿÿ‰$èä{ÿÿ‹•ðþÿÿ‰T$‰$è¢zÿÿÇD$q݉$èÂ{ÿÿ‹•ìþÿÿ‰T$‰$è°{ÿÿÇD$x݉$è {ÿÿ‹•àþÿÿ‰T$‰$è^zÿÿÇD${݉$è~{ÿÿÇD$ü‘‰$èÞ|ÿÿEã‰$è3}ÿÿEã‰D$ÇD$¬ßE܉$è‰{ÿÿUä…ÿÿÿ‰D$‰$è´zÿÿƒìEï‰$èö|ÿÿEï‰D$ÇD$ÓÝEè‰$èL{ÿÿÇD$ÿÿÿÿÇD$E܉D$ Eä‰D$Eè‰D$E´‰$è~¦Eè‰$èázÿÿë1‰…¨þÿÿ‰•¬þÿÿ‹µ¬þÿÿ‹¨þÿÿEè‰$è¼zÿÿ‰¨þÿÿ‰µ¬þÿÿë$Eï‰$èÃ{ÿÿEä‰$è˜zÿÿëT‰…¨þÿÿ‰•¬þÿÿ‹µ¬þÿÿ‹¨þÿÿEï‰$è“{ÿÿ‰¨þÿÿ‰µ¬þÿÿ‹µ¬þÿÿ‹¨þÿÿEä‰$èPzÿÿ‰¨þÿÿ‰µ¬þÿÿëE܉$è7zÿÿë1‰…¨þÿÿ‰•¬þÿÿ‹µ¬þÿÿ‹¨þÿÿE܉$èzÿÿ‰¨þÿÿ‰µ¬þÿÿë@Eã‰$è{ÿÿÇ$èýzÿÿ‰…ôþÿÿ‹•ôþÿÿE´‰D$‰$è°£ë1‰…¨þÿÿ‰•¬þÿÿ‹µ¬þÿÿ‹¨þÿÿEã‰$èÍzÿÿ‰¨þÿÿ‰µ¬þÿÿëwÇD$­ÇD$Ää‹…ôþÿÿ‰$èÑzÿÿ‰…¨þÿÿ‰•¬þÿÿƒ½¬þÿÿÿtëèµyÿÿ‰…¨þÿÿ‰•¬þÿÿ‹µ¬þÿÿ‹¨þÿÿE´‰$è(—‰¨þÿÿ‰µ¬þÿÿë ‰…¨þÿÿ‰•¬þÿÿ‹µ¬þÿÿ‹¨þÿÿ…ÿÿÿ‰$èzÿÿ‰¨þÿÿ‰µ¬þÿÿë ‰…¨þÿÿ‰•¬þÿÿ‹µ¬þÿÿ‹¨þÿÿèSzÿÿ‰¨þÿÿ‰µ¬þÿÿƒ½¬þÿÿþt‹•¨þÿÿ‰$è°zÿÿ‹…¨þÿÿ‰$èòxÿÿÝ…°þÿÿeø[^]ÃU‰åVSìpÇD$…ÿÿÿ‰$èczÿÿ‹E‹‰…¼þÿÿÇD$]Ý…ÿÿÿ‰$èRxÿÿ‹•¼þÿÿ‰T$‰$èwÿÿÇD$þ߉$è0xÿÿUÄ…ÿÿÿ‰D$‰$è›wÿÿƒì‹E‹PEĉD$‰$èã²ÿÿ‰EðEĉ$èxÿÿë1‰…¨þÿÿ‰•¬þÿÿ‹µ¬þÿÿ‹¨þÿÿEĉ$èàwÿÿ‰¨þÿÿ‰µ¬þÿÿë-‹Eð‰$ègxÿÿÝÀþÿÿ…ÿÿÿ‰$è³xÿÿë4‰…¨þÿÿ‰•¬þÿÿ‹µ¬þÿÿ‹¨þÿÿ…ÿÿÿ‰$è‹xÿÿ‰¨þÿÿ‰µ¬þÿÿëÝ…Àþÿÿݰþÿÿ鉅¨þÿÿ‰•¬þÿÿƒ½¬þÿÿt锋…¨þÿÿ‰$èôxÿÿ‰EôÇD$…ÿÿÿ‰$è yÿÿ‹E‹‰…Èþÿÿ‹E‹@…Àt/‹E‹@ƒøu Ç…ÐþÿÿkÝë Ç…ÐþÿÿmÝ‹•Ðþÿÿ‰•Ìþÿÿë Ç…ÌþÿÿoÝ‹…Ìþÿÿ‰…Ôþÿÿ‹E‹@ ‰…ØþÿÿÇD$ Ü…ÿÿÿ‰$èŸvÿÿ‹•Øþÿÿ‰T$‰$è]uÿÿÇD$q݉$è}vÿÿ‹•Ôþÿÿ‰T$‰$èkvÿÿÇD$x݉$è[vÿÿ‹•Èþÿÿ‰T$‰$èuÿÿÇD${݉$è9vÿÿÇD$ü‘‰$è™wÿÿEω$èîwÿÿEωD$ÇD$ àEȉ$èDvÿÿUÐ…ÿÿÿ‰D$‰$èouÿÿƒìEÛ‰$è±wÿÿEÛ‰D$ÇD$0àEÔ‰$èvÿÿÇD$ÿÿÿÿÇD$EȉD$ EЉD$EÔ‰D$‹Eô‰$èšEÔ‰$èœuÿÿë1‰…¨þÿÿ‰•¬þÿÿ‹µ¬þÿÿ‹¨þÿÿEÔ‰$èwuÿÿ‰¨þÿÿ‰µ¬þÿÿë$EÛ‰$è~vÿÿEЉ$èSuÿÿëT‰…¨þÿÿ‰•¬þÿÿ‹µ¬þÿÿ‹¨þÿÿEÛ‰$èNvÿÿ‰¨þÿÿ‰µ¬þÿÿ‹µ¬þÿÿ‹¨þÿÿEЉ$è uÿÿ‰¨þÿÿ‰µ¬þÿÿëEȉ$èòtÿÿë1‰…¨þÿÿ‰•¬þÿÿ‹µ¬þÿÿ‹¨þÿÿEȉ$èÍtÿÿ‰¨þÿÿ‰µ¬þÿÿë@Eω$èÔuÿÿÇ$è¸uÿÿ‰…Üþÿÿ‹•Üþÿÿ‹Eô‰D$‰$èkžë1‰…¨þÿÿ‰•¬þÿÿ‹µ¬þÿÿ‹¨þÿÿEω$èˆuÿÿ‰¨þÿÿ‰µ¬þÿÿëFÇD$­ÇD$Ää‹…Üþÿÿ‰$èŒuÿÿ‰…¨þÿÿ‰•¬þÿÿƒ½¬þÿÿÿtëèptÿÿ‰…¨þÿÿ‰•¬þÿÿ‹µ¬þÿÿ‹¨þÿÿ…ÿÿÿ‰$èútÿÿ‰¨þÿÿ‰µ¬þÿÿë ‰…¨þÿÿ‰•¬þÿÿ‹µ¬þÿÿ‹¨þÿÿè?uÿÿ‰¨þÿÿ‰µ¬þÿÿ齋•¨þÿÿ‰$è`uÿÿÇD$…ÿÿÿ‰$èzuÿÿ‹E‹‰…àþÿÿ‹E‹@…Àt/‹E‹@ƒøu Ç…èþÿÿkÝë Ç…èþÿÿmÝ‹…èþÿÿ‰…äþÿÿë Ç…äþÿÿoÝ‹•äþÿÿ‰•ìþÿÿ‹E‹@ ‰…ðþÿÿÇD$°Ý…ÿÿÿ‰$èsÿÿ‹•ðþÿÿ‰T$‰$èÌqÿÿÇD$q݉$èìrÿÿ‹•ìþÿÿ‰T$‰$èÚrÿÿÇD$x݉$èÊrÿÿ‹•àþÿÿ‰T$‰$èˆqÿÿÇD${݉$è¨rÿÿÇD$ü‘‰$ètÿÿEã‰$è]tÿÿEã‰D$ÇD$ àE܉$è³rÿÿUä…ÿÿÿ‰D$‰$èÞqÿÿƒìEï‰$è tÿÿEï‰D$ÇD$ÓÝEè‰$èvrÿÿÇD$ÿÿÿÿÇD$E܉D$ Eä‰D$Eè‰D$E´‰$è¨Eè‰$è rÿÿë1‰…¨þÿÿ‰•¬þÿÿ‹µ¬þÿÿ‹¨þÿÿEè‰$èæqÿÿ‰¨þÿÿ‰µ¬þÿÿë$Eï‰$èírÿÿEä‰$èÂqÿÿëT‰…¨þÿÿ‰•¬þÿÿ‹µ¬þÿÿ‹¨þÿÿEï‰$è½rÿÿ‰¨þÿÿ‰µ¬þÿÿ‹µ¬þÿÿ‹¨þÿÿEä‰$èzqÿÿ‰¨þÿÿ‰µ¬þÿÿëE܉$èaqÿÿë1‰…¨þÿÿ‰•¬þÿÿ‹µ¬þÿÿ‹¨þÿÿE܉$èÿÿƒì‹UEè‰D$‰$èpÿÿ‰EðEè‰$èä>ÿÿë1‰…<þÿÿ‰•@þÿÿ‹µ@þÿÿ‹<þÿÿEè‰$è¿>ÿÿ‰<þÿÿ‰µ@þÿÿë=‹Eð‰$è&?ÿÿ‰Â‹E‰¼‹E‹€¼…À•À„À…òéH‰…<þÿÿ‰•@þÿÿƒ½@þÿÿtéJ‹•<þÿÿ‰$è@ÿÿ‰EôÇD$ÿÿÿÿÇD$ÇD$ ÌáÇD$ÝÇD$àá‹Eô‰$èüdÇ$è&?ÿÿ‰…Hþÿÿ‹•Hþÿÿ‹Eô‰D$‰$èÙgÇD$­ÇD$Ää‹…Hþÿÿ‰$è-?ÿÿ‰…<þÿÿ‰•@þÿÿƒ½@þÿÿÿtëè>ÿÿ‰…<þÿÿ‰•@þÿÿ‹µ@þÿÿ‹<þÿÿè?ÿÿ‰<þÿÿ‰µ@þÿÿéwÇD$…dþÿÿ‰$è]?ÿÿÇD$,‹Eð‰$èŠ<ÿÿ‰Â‹E‰À‹E‹€ÀP‹E‰À‹E‹€À‹U‡‰D$‰$èŒ=ÿÿ‹U‡‹E‰À‹E‹€À‰…LþÿÿÇD$|Ü…dþÿÿ‰$èå<ÿÿÇD$ªÜ‰$èÕ<ÿÿ‰Â‹E ‰D$‰$èÄ=ÿÿÇD$Û܉$è´<ÿÿ‹•Lþÿÿ‰T$‰$è¢<ÿÿÇD$ü‘‰$è>ÿÿ‹E‹€¼‰…PþÿÿUì…dþÿÿ‰D$‰$èî;ÿÿƒìEì‰$èp;ÿÿ‹•Pþÿÿ‰T$ÇD$ÇD$ Ìá‰D$ÇD$òáẺ$è±iEì‰$è4<ÿÿë4‰…<þÿÿ‰•@þÿÿ‹µ@þÿÿ‹<þÿÿEì‰$è<ÿÿ‰<þÿÿ‰µ@þÿÿéžÇ$è=ÿÿ‰…Tþÿÿ‹•TþÿÿẺD$‰$èµeÇD$­ÇD$Ää‹…Tþÿÿ‰$è =ÿÿ‰…<þÿÿ‰•@þÿÿƒ½@þÿÿÿtëèí;ÿÿ‰…<þÿÿ‰•@þÿÿ‹µ@þÿÿ‹<þÿÿẺ$è`Y‰<þÿÿ‰µ@þÿÿë ‰…<þÿÿ‰•@þÿÿ‹µ@þÿÿ‹<þÿÿ…dþÿÿ‰$èF<ÿÿ‰<þÿÿ‰µ@þÿÿë…ÿÿÿ‰$è*<ÿÿëe‰…<þÿÿ‰•@þÿÿ‹µ@þÿÿ‹<þÿÿ…ÿÿÿ‰$è<ÿÿ‰<þÿÿ‰µ@þÿÿë ‰…<þÿÿ‰•@þÿÿƒ½@þÿÿþt‹•<þÿÿ‰$èÁ<ÿÿ‹…<þÿÿ‰$è;ÿÿeø[^]ÃU‰åVSì`ÇD$…ÿÿÿ‰$è{<ÿÿ‹E‹‰…ÄþÿÿÇD$]Ý…ÿÿÿ‰$èj:ÿÿ‹•Äþÿÿ‰T$‰$è(9ÿÿÇD$â‰$èH:ÿÿUÈ…ÿÿÿ‰D$‰$è³9ÿÿƒì‹E‹PEȉD$‰$èsùÿÿEȉ$è :ÿÿë1‰…¼þÿÿ‰•Àþÿÿ‹µÀþÿÿ‹¼þÿÿEȉ$èû9ÿÿ‰¼þÿÿ‰µÀþÿÿë…ÿÿÿ‰$èß:ÿÿéĉ…¼þÿÿ‰•Àþÿÿ‹µÀþÿÿ‹¼þÿÿ…ÿÿÿ‰$è´:ÿÿ‰¼þÿÿ‰µÀþÿÿë ‰…¼þÿÿ‰•Àþÿÿƒ½Àþÿÿt锋…¼þÿÿ‰$è.;ÿÿ‰EôÇD$…ÿÿÿ‰$èE;ÿÿ‹E‹‰…Èþÿÿ‹E‹@…Àt/‹E‹@ƒøu Ç…ÐþÿÿkÝë Ç…ÐþÿÿmÝ‹•Ðþÿÿ‰•Ìþÿÿë Ç…ÌþÿÿoÝ‹…Ìþÿÿ‰…Ôþÿÿ‹E‹@ ‰…ØþÿÿÇD$ Ü…ÿÿÿ‰$èÙ8ÿÿ‹•Øþÿÿ‰T$‰$è—7ÿÿÇD$q݉$è·8ÿÿ‹•Ôþÿÿ‰T$‰$è¥8ÿÿÇD$x݉$è•8ÿÿ‹•Èþÿÿ‰T$‰$èS7ÿÿÇD${݉$ès8ÿÿÇD$ü‘‰$èÓ9ÿÿEÓ‰$è(:ÿÿEÓ‰D$ÇD$ âẺ$è~8ÿÿUÔ…ÿÿÿ‰D$‰$è©7ÿÿƒìE߉$èë9ÿÿE߉D$ÇD$,âE؉$èA8ÿÿÇD$ÿÿÿÿÇD$ẺD$ EÔ‰D$E؉D$‹Eô‰$èW\E؉$èÖ7ÿÿë1‰…¼þÿÿ‰•Àþÿÿ‹µÀþÿÿ‹¼þÿÿE؉$è±7ÿÿ‰¼þÿÿ‰µÀþÿÿë$E߉$è¸8ÿÿEÔ‰$è7ÿÿëT‰…¼þÿÿ‰•Àþÿÿ‹µÀþÿÿ‹¼þÿÿE߉$èˆ8ÿÿ‰¼þÿÿ‰µÀþÿÿ‹µÀþÿÿ‹¼þÿÿEÔ‰$èE7ÿÿ‰¼þÿÿ‰µÀþÿÿëẺ$è,7ÿÿë1‰…¼þÿÿ‰•Àþÿÿ‹µÀþÿÿ‹¼þÿÿẺ$è7ÿÿ‰¼þÿÿ‰µÀþÿÿë@EÓ‰$è8ÿÿÇ$èò7ÿÿ‰…Üþÿÿ‹•Üþÿÿ‹Eô‰D$‰$è¥`ë1‰…¼þÿÿ‰•Àþÿÿ‹µÀþÿÿ‹¼þÿÿEÓ‰$èÂ7ÿÿ‰¼þÿÿ‰µÀþÿÿëFÇD$­ÇD$Ää‹…Üþÿÿ‰$èÆ7ÿÿ‰…¼þÿÿ‰•Àþÿÿƒ½Àþÿÿÿtëèª6ÿÿ‰…¼þÿÿ‰•Àþÿÿ‹µÀþÿÿ‹¼þÿÿ…ÿÿÿ‰$è47ÿÿ‰¼þÿÿ‰µÀþÿÿë ‰…¼þÿÿ‰•Àþÿÿ‹µÀþÿÿ‹¼þÿÿèy7ÿÿ‰¼þÿÿ‰µÀþÿÿ齋•¼þÿÿ‰$èš7ÿÿÇD$…ÿÿÿ‰$è´7ÿÿ‹E‹‰…àþÿÿ‹E‹@…Àt/‹E‹@ƒøu Ç…èþÿÿkÝë Ç…èþÿÿmÝ‹…èþÿÿ‰…äþÿÿë Ç…äþÿÿoÝ‹•äþÿÿ‰•ìþÿÿ‹E‹@ ‰…ðþÿÿÇD$°Ý…ÿÿÿ‰$èH5ÿÿ‹•ðþÿÿ‰T$‰$è4ÿÿÇD$q݉$è&5ÿÿ‹•ìþÿÿ‰T$‰$è5ÿÿÇD$x݉$è5ÿÿ‹•àþÿÿ‰T$‰$èÂ3ÿÿÇD${݉$èâ4ÿÿÇD$ü‘‰$èB6ÿÿEç‰$è—6ÿÿEç‰D$ÇD$ âEà‰$èí4ÿÿUè…ÿÿÿ‰D$‰$è4ÿÿƒìEó‰$èZ6ÿÿEó‰D$ÇD$ÓÝEì‰$è°4ÿÿÇD$ÿÿÿÿÇD$Eà‰D$ Eè‰D$Eì‰D$E¸‰$èâ_Eì‰$èE4ÿÿë1‰…¼þÿÿ‰•Àþÿÿ‹µÀþÿÿ‹¼þÿÿEì‰$è 4ÿÿ‰¼þÿÿ‰µÀþÿÿë$Eó‰$è'5ÿÿEè‰$èü3ÿÿëT‰…¼þÿÿ‰•Àþÿÿ‹µÀþÿÿ‹¼þÿÿEó‰$è÷4ÿÿ‰¼þÿÿ‰µÀþÿÿ‹µÀþÿÿ‹¼þÿÿEè‰$è´3ÿÿ‰¼þÿÿ‰µÀþÿÿëEà‰$è›3ÿÿë1‰…¼þÿÿ‰•Àþÿÿ‹µÀþÿÿ‹¼þÿÿEà‰$èv3ÿÿ‰¼þÿÿ‰µÀþÿÿë@Eç‰$è}4ÿÿÇ$èa4ÿÿ‰…ôþÿÿ‹•ôþÿÿE¸‰D$‰$è]ë1‰…¼þÿÿ‰•Àþÿÿ‹µÀþÿÿ‹¼þÿÿEç‰$è14ÿÿ‰¼þÿÿ‰µÀþÿÿëwÇD$­ÇD$Ää‹…ôþÿÿ‰$è54ÿÿ‰…¼þÿÿ‰•Àþÿÿƒ½Àþÿÿÿtëè3ÿÿ‰…¼þÿÿ‰•Àþÿÿ‹µÀþÿÿ‹¼þÿÿE¸‰$èŒP‰¼þÿÿ‰µÀþÿÿë ‰…¼þÿÿ‰•Àþÿÿ‹µÀþÿÿ‹¼þÿÿ…ÿÿÿ‰$èr3ÿÿ‰¼þÿÿ‰µÀþÿÿë ‰…¼þÿÿ‰•Àþÿÿ‹µÀþÿÿ‹¼þÿÿè·3ÿÿ‰¼þÿÿ‰µÀþÿÿƒ½Àþÿÿþt‹•¼þÿÿ‰$è4ÿÿ‹…¼þÿÿ‰$èV2ÿÿeø[^]ÃU‰åVSì`‹E ˆ…ôþÿÿÇD$…ÿÿÿ‰$èÄ3ÿÿ¶…ôþÿÿ‰…¼þÿÿ‹E‹‰…ÀþÿÿÇD$]Ý…ÿÿÿ‰$è¦1ÿÿ‹•Àþÿÿ‰T$‰$èd0ÿÿÇD$Qâ‰$è„1ÿÿ‹•¼þÿÿ‰T$‰$è¢1ÿÿUÈ…ÿÿÿ‰D$‰$èÝ0ÿÿƒì‹E‹PEȉD$‰$èðÿÿEȉ$èJ1ÿÿë1‰…´þÿÿ‰•¸þÿÿ‹µ¸þÿÿ‹´þÿÿEȉ$è%1ÿÿ‰´þÿÿ‰µ¸þÿÿë…ÿÿÿ‰$è 2ÿÿéĉ…´þÿÿ‰•¸þÿÿ‹µ¸þÿÿ‹´þÿÿ…ÿÿÿ‰$èÞ1ÿÿ‰´þÿÿ‰µ¸þÿÿë ‰…´þÿÿ‰•¸þÿÿƒ½¸þÿÿt锋…´þÿÿ‰$èX2ÿÿ‰EôÇD$…ÿÿÿ‰$èo2ÿÿ‹E‹‰…Äþÿÿ‹E‹@…Àt/‹E‹@ƒøu Ç…ÌþÿÿkÝë Ç…ÌþÿÿmÝ‹•Ìþÿÿ‰•Èþÿÿë Ç…ÈþÿÿoÝ‹…Èþÿÿ‰…Ðþÿÿ‹E‹@ ‰…ÔþÿÿÇD$ Ü…ÿÿÿ‰$è0ÿÿ‹•Ôþÿÿ‰T$‰$èÁ.ÿÿÇD$q݉$èá/ÿÿ‹•Ðþÿÿ‰T$‰$èÏ/ÿÿÇD$x݉$è¿/ÿÿ‹•Äþÿÿ‰T$‰$è}.ÿÿÇD${݉$è/ÿÿÇD$ü‘‰$èý0ÿÿEÓ‰$èR1ÿÿEÓ‰D$ÇD$[âẺ$è¨/ÿÿUÔ…ÿÿÿ‰D$‰$èÓ.ÿÿƒìE߉$è1ÿÿE߉D$ÇD$tâE؉$èk/ÿÿÇD$ÿÿÿÿÇD$ẺD$ EÔ‰D$E؉D$‹Eô‰$èSE؉$è/ÿÿë1‰…´þÿÿ‰•¸þÿÿ‹µ¸þÿÿ‹´þÿÿE؉$èÛ.ÿÿ‰´þÿÿ‰µ¸þÿÿë$E߉$èâ/ÿÿEÔ‰$è·.ÿÿëT‰…´þÿÿ‰•¸þÿÿ‹µ¸þÿÿ‹´þÿÿE߉$è²/ÿÿ‰´þÿÿ‰µ¸þÿÿ‹µ¸þÿÿ‹´þÿÿEÔ‰$èo.ÿÿ‰´þÿÿ‰µ¸þÿÿëẺ$èV.ÿÿë1‰…´þÿÿ‰•¸þÿÿ‹µ¸þÿÿ‹´þÿÿẺ$è1.ÿÿ‰´þÿÿ‰µ¸þÿÿë@EÓ‰$è8/ÿÿÇ$è/ÿÿ‰…Øþÿÿ‹•Øþÿÿ‹Eô‰D$‰$èÏWë1‰…´þÿÿ‰•¸þÿÿ‹µ¸þÿÿ‹´þÿÿEÓ‰$èì.ÿÿ‰´þÿÿ‰µ¸þÿÿëFÇD$­ÇD$Ää‹…Øþÿÿ‰$èð.ÿÿ‰…´þÿÿ‰•¸þÿÿƒ½¸þÿÿÿtëèÔ-ÿÿ‰…´þÿÿ‰•¸þÿÿ‹µ¸þÿÿ‹´þÿÿ…ÿÿÿ‰$è^.ÿÿ‰´þÿÿ‰µ¸þÿÿë ‰…´þÿÿ‰•¸þÿÿ‹µ¸þÿÿ‹´þÿÿè£.ÿÿ‰´þÿÿ‰µ¸þÿÿ齋•´þÿÿ‰$èÄ.ÿÿÇD$…ÿÿÿ‰$èÞ.ÿÿ‹E‹‰…Üþÿÿ‹E‹@…Àt/‹E‹@ƒøu Ç…äþÿÿkÝë Ç…äþÿÿmÝ‹…äþÿÿ‰…àþÿÿë Ç…àþÿÿoÝ‹•àþÿÿ‰•èþÿÿ‹E‹@ ‰…ìþÿÿÇD$°Ý…ÿÿÿ‰$èr,ÿÿ‹•ìþÿÿ‰T$‰$è0+ÿÿÇD$q݉$èP,ÿÿ‹•èþÿÿ‰T$‰$è>,ÿÿÇD$x݉$è.,ÿÿ‹•Üþÿÿ‰T$‰$èì*ÿÿÇD${݉$è ,ÿÿÇD$ü‘‰$èl-ÿÿEç‰$èÁ-ÿÿEç‰D$ÇD$[âEà‰$è,ÿÿUè…ÿÿÿ‰D$‰$èB+ÿÿƒìEó‰$è„-ÿÿEó‰D$ÇD$ÓÝEì‰$èÚ+ÿÿÇD$ÿÿÿÿÇD$Eà‰D$ Eè‰D$Eì‰D$E¸‰$è WEì‰$èo+ÿÿë1‰…´þÿÿ‰•¸þÿÿ‹µ¸þÿÿ‹´þÿÿEì‰$èJ+ÿÿ‰´þÿÿ‰µ¸þÿÿë$Eó‰$èQ,ÿÿEè‰$è&+ÿÿëT‰…´þÿÿ‰•¸þÿÿ‹µ¸þÿÿ‹´þÿÿEó‰$è!,ÿÿ‰´þÿÿ‰µ¸þÿÿ‹µ¸þÿÿ‹´þÿÿEè‰$èÞ*ÿÿ‰´þÿÿ‰µ¸þÿÿëEà‰$èÅ*ÿÿë1‰…´þÿÿ‰•¸þÿÿ‹µ¸þÿÿ‹´þÿÿEà‰$è *ÿÿ‰´þÿÿ‰µ¸þÿÿë@Eç‰$è§+ÿÿÇ$è‹+ÿÿ‰…ðþÿÿ‹•ðþÿÿE¸‰D$‰$è>Të1‰…´þÿÿ‰•¸þÿÿ‹µ¸þÿÿ‹´þÿÿEç‰$è[+ÿÿ‰´þÿÿ‰µ¸þÿÿëwÇD$­ÇD$Ää‹…ðþÿÿ‰$è_+ÿÿ‰…´þÿÿ‰•¸þÿÿƒ½¸þÿÿÿtëèC*ÿÿ‰…´þÿÿ‰•¸þÿÿ‹µ¸þÿÿ‹´þÿÿE¸‰$è¶G‰´þÿÿ‰µ¸þÿÿë ‰…´þÿÿ‰•¸þÿÿ‹µ¸þÿÿ‹´þÿÿ…ÿÿÿ‰$èœ*ÿÿ‰´þÿÿ‰µ¸þÿÿë ‰…´þÿÿ‰•¸þÿÿ‹µ¸þÿÿ‹´þÿÿèá*ÿÿ‰´þÿÿ‰µ¸þÿÿƒ½¸þÿÿþt‹•´þÿÿ‰$è>+ÿÿ‹…´þÿÿ‰$è€)ÿÿeø[^]ÃU‰åVSì0‹E ˆ…ôþÿÿÇEðë!¶ôþÿÿ‹Uð‹E‹D‰L$‰$èðöÿÿƒEðƒ}ð~Ùéø‰…èþÿÿ‰•äþÿÿƒ½äþÿÿtéÈ‹…èþÿÿ‰$èw*ÿÿ‰EôÇD$…ÿÿÿ‰$èŽ*ÿÿÇD$ Ü…ÿÿÿ‰$èˆ(ÿÿÇD$ü‘‰$èè)ÿÿEω$è=*ÿÿEωD$ÇD$–âEȉ$è“(ÿÿUÐ…ÿÿÿ‰D$‰$è¾'ÿÿƒìEÛ‰$è*ÿÿEÛ‰D$ÇD$±âEÔ‰$èV(ÿÿÇD$ÿÿÿÿÇD$EȉD$ EЉD$EÔ‰D$‹Eô‰$èlLEÔ‰$èë'ÿÿë1‰…èþÿÿ‰•äþÿÿ‹µäþÿÿ‹èþÿÿEÔ‰$èÆ'ÿÿ‰èþÿÿ‰µäþÿÿë$EÛ‰$èÍ(ÿÿEЉ$è¢'ÿÿëT‰…èþÿÿ‰•äþÿÿ‹µäþÿÿ‹èþÿÿEÛ‰$è(ÿÿ‰èþÿÿ‰µäþÿÿ‹µäþÿÿ‹èþÿÿEЉ$èZ'ÿÿ‰èþÿÿ‰µäþÿÿëEȉ$èA'ÿÿë1‰…èþÿÿ‰•äþÿÿ‹µäþÿÿ‹èþÿÿEȉ$è'ÿÿ‰èþÿÿ‰µäþÿÿë@Eω$è#(ÿÿÇ$è(ÿÿ‰…ìþÿÿ‹•ìþÿÿ‹Eô‰D$‰$èºPë1‰…èþÿÿ‰•äþÿÿ‹µäþÿÿ‹èþÿÿEω$è×'ÿÿ‰èþÿÿ‰µäþÿÿëFÇD$­ÇD$Ää‹…ìþÿÿ‰$èÛ'ÿÿ‰…èþÿÿ‰•äþÿÿƒ½äþÿÿÿtëè¿&ÿÿ‰…èþÿÿ‰•äþÿÿ‹µäþÿÿ‹èþÿÿ…ÿÿÿ‰$èI'ÿÿ‰èþÿÿ‰µäþÿÿë ‰…èþÿÿ‰•äþÿÿ‹µäþÿÿ‹èþÿÿèŽ'ÿÿ‰èþÿÿ‰µäþÿÿéñ‹…èþÿÿ‰$è¯'ÿÿÇD$…ÿÿÿ‰$èÉ'ÿÿÇD$°Ý…ÿÿÿ‰$èÃ%ÿÿÇD$ü‘‰$è#'ÿÿEã‰$èx'ÿÿEã‰D$ÇD$–âE܉$èÎ%ÿÿUä…ÿÿÿ‰D$‰$èù$ÿÿƒìEï‰$è;'ÿÿEï‰D$ÇD$ÓÝEè‰$è‘%ÿÿÇD$ÿÿÿÿÇD$E܉D$ Eä‰D$Eè‰D$E¸‰$èÃPEè‰$è&%ÿÿë1‰…èþÿÿ‰•äþÿÿ‹µäþÿÿ‹èþÿÿEè‰$è%ÿÿ‰èþÿÿ‰µäþÿÿë$Eï‰$è&ÿÿEä‰$èÝ$ÿÿëT‰…èþÿÿ‰•äþÿÿ‹µäþÿÿ‹èþÿÿEï‰$èØ%ÿÿ‰èþÿÿ‰µäþÿÿ‹µäþÿÿ‹èþÿÿEä‰$è•$ÿÿ‰èþÿÿ‰µäþÿÿëE܉$è|$ÿÿë1‰…èþÿÿ‰•äþÿÿ‹µäþÿÿ‹èþÿÿE܉$èW$ÿÿ‰èþÿÿ‰µäþÿÿë@Eã‰$è^%ÿÿÇ$èB%ÿÿ‰…ðþÿÿ‹•ðþÿÿE¸‰D$‰$èõMë1‰…èþÿÿ‰•äþÿÿ‹µäþÿÿ‹èþÿÿEã‰$è%ÿÿ‰èþÿÿ‰µäþÿÿëwÇD$­ÇD$Ää‹…ðþÿÿ‰$è%ÿÿ‰…èþÿÿ‰•äþÿÿƒ½äþÿÿÿtëèú#ÿÿ‰…èþÿÿ‰•äþÿÿ‹µäþÿÿ‹èþÿÿE¸‰$èmA‰èþÿÿ‰µäþÿÿë ‰…èþÿÿ‰•äþÿÿ‹µäþÿÿ‹èþÿÿ…ÿÿÿ‰$èS$ÿÿ‰èþÿÿ‰µäþÿÿë ‰…èþÿÿ‰•äþÿÿ‹µäþÿÿ‹èþÿÿè˜$ÿÿ‰èþÿÿ‰µäþÿÿƒ½äþÿÿþt‹…èþÿÿ‰$èõ$ÿÿ‹…èþÿÿ‰$è7#ÿÿeø[^]ÃU‰åVSì`‹E ‰…ðþÿÿ‹E‰…ôþÿÿÇD$…ÿÿÿ‰$è$ÿÿ‹E‹‰…¼þÿÿÇD$]Ý…ÿÿÿ‰$èŒ"ÿÿ‹•¼þÿÿ‰T$‰$èJ!ÿÿÇD$Íâ‰$èj"ÿÿÝ…ðþÿÿÝ\$‰$èø ÿÿUÈ…ÿÿÿ‰D$‰$èÃ!ÿÿƒì‹E‹PEȉD$‰$èƒáÿÿEȉ$è0"ÿÿë1‰…´þÿÿ‰•¸þÿÿ‹µ¸þÿÿ‹´þÿÿEȉ$è "ÿÿ‰´þÿÿ‰µ¸þÿÿë…ÿÿÿ‰$èï"ÿÿéĉ…´þÿÿ‰•¸þÿÿ‹µ¸þÿÿ‹´þÿÿ…ÿÿÿ‰$èÄ"ÿÿ‰´þÿÿ‰µ¸þÿÿë ‰…´þÿÿ‰•¸þÿÿƒ½¸þÿÿt锋…´þÿÿ‰$è>#ÿÿ‰EôÇD$…ÿÿÿ‰$èU#ÿÿ‹E‹‰…Àþÿÿ‹E‹@…Àt/‹E‹@ƒøu Ç…ÈþÿÿkÝë Ç…ÈþÿÿmÝ‹•Èþÿÿ‰•Äþÿÿë Ç…ÄþÿÿoÝ‹…Äþÿÿ‰…Ìþÿÿ‹E‹@ ‰…ÐþÿÿÇD$ Ü…ÿÿÿ‰$èé ÿÿ‹•Ðþÿÿ‰T$‰$è§ÿÿÇD$q݉$èÇ ÿÿ‹•Ìþÿÿ‰T$‰$èµ ÿÿÇD$x݉$è¥ ÿÿ‹•Àþÿÿ‰T$‰$ècÿÿÇD${݉$èƒ ÿÿÇD$ü‘‰$èã!ÿÿEÓ‰$è8"ÿÿEÓ‰D$ÇD$ØâẺ$èŽ ÿÿUÔ…ÿÿÿ‰D$‰$è¹ÿÿƒìE߉$èû!ÿÿE߉D$ÇD$øâE؉$èQ ÿÿÇD$ÿÿÿÿÇD$ẺD$ EÔ‰D$E؉D$‹Eô‰$ègDE؉$èæÿÿë1‰…´þÿÿ‰•¸þÿÿ‹µ¸þÿÿ‹´þÿÿE؉$èÁÿÿ‰´þÿÿ‰µ¸þÿÿë$E߉$èÈ ÿÿEÔ‰$èÿÿëT‰…´þÿÿ‰•¸þÿÿ‹µ¸þÿÿ‹´þÿÿE߉$è˜ ÿÿ‰´þÿÿ‰µ¸þÿÿ‹µ¸þÿÿ‹´þÿÿEÔ‰$èUÿÿ‰´þÿÿ‰µ¸þÿÿëẺ$è<ÿÿë1‰…´þÿÿ‰•¸þÿÿ‹µ¸þÿÿ‹´þÿÿẺ$èÿÿ‰´þÿÿ‰µ¸þÿÿë@EÓ‰$è ÿÿÇ$è ÿÿ‰…Ôþÿÿ‹•Ôþÿÿ‹Eô‰D$‰$èµHë1‰…´þÿÿ‰•¸þÿÿ‹µ¸þÿÿ‹´þÿÿEÓ‰$èÒÿÿ‰´þÿÿ‰µ¸þÿÿëFÇD$­ÇD$Ää‹…Ôþÿÿ‰$èÖÿÿ‰…´þÿÿ‰•¸þÿÿƒ½¸þÿÿÿtëèºÿÿ‰…´þÿÿ‰•¸þÿÿ‹µ¸þÿÿ‹´þÿÿ…ÿÿÿ‰$èDÿÿ‰´þÿÿ‰µ¸þÿÿë ‰…´þÿÿ‰•¸þÿÿ‹µ¸þÿÿ‹´þÿÿè‰ÿÿ‰´þÿÿ‰µ¸þÿÿ齋•´þÿÿ‰$èªÿÿÇD$…ÿÿÿ‰$èÄÿÿ‹E‹‰…Øþÿÿ‹E‹@…Àt/‹E‹@ƒøu Ç…àþÿÿkÝë Ç…àþÿÿmÝ‹…àþÿÿ‰…Üþÿÿë Ç…ÜþÿÿoÝ‹•Üþÿÿ‰•äþÿÿ‹E‹@ ‰…èþÿÿÇD$°Ý…ÿÿÿ‰$èXÿÿ‹•èþÿÿ‰T$‰$èÿÿÇD$q݉$è6ÿÿ‹•äþÿÿ‰T$‰$è$ÿÿÇD$x݉$èÿÿ‹•Øþÿÿ‰T$‰$èÒÿÿÇD${݉$èòÿÿÇD$ü‘‰$èRÿÿEç‰$è§ÿÿEç‰D$ÇD$ØâEà‰$èýÿÿUè…ÿÿÿ‰D$‰$è(ÿÿƒìEó‰$èjÿÿEó‰D$ÇD$ÓÝEì‰$èÀÿÿÇD$ÿÿÿÿÇD$Eà‰D$ Eè‰D$Eì‰D$E¸‰$èòGEì‰$èUÿÿë1‰…´þÿÿ‰•¸þÿÿ‹µ¸þÿÿ‹´þÿÿEì‰$è0ÿÿ‰´þÿÿ‰µ¸þÿÿë$Eó‰$è7ÿÿEè‰$è ÿÿëT‰…´þÿÿ‰•¸þÿÿ‹µ¸þÿÿ‹´þÿÿEó‰$èÿÿ‰´þÿÿ‰µ¸þÿÿ‹µ¸þÿÿ‹´þÿÿEè‰$èÄÿÿ‰´þÿÿ‰µ¸þÿÿëEà‰$è«ÿÿë1‰…´þÿÿ‰•¸þÿÿ‹µ¸þÿÿ‹´þÿÿEà‰$è†ÿÿ‰´þÿÿ‰µ¸þÿÿë@Eç‰$èÿÿÇ$èqÿÿ‰…ìþÿÿ‹•ìþÿÿE¸‰D$‰$è$Eë1‰…´þÿÿ‰•¸þÿÿ‹µ¸þÿÿ‹´þÿÿEç‰$èAÿÿ‰´þÿÿ‰µ¸þÿÿëwÇD$­ÇD$Ää‹…ìþÿÿ‰$èEÿÿ‰…´þÿÿ‰•¸þÿÿƒ½¸þÿÿÿtëè)ÿÿ‰…´þÿÿ‰•¸þÿÿ‹µ¸þÿÿ‹´þÿÿE¸‰$èœ8‰´þÿÿ‰µ¸þÿÿë ‰…´þÿÿ‰•¸þÿÿ‹µ¸þÿÿ‹´þÿÿ…ÿÿÿ‰$è‚ÿÿ‰´þÿÿ‰µ¸þÿÿë ‰…´þÿÿ‰•¸þÿÿ‹µ¸þÿÿ‹´þÿÿèÇÿÿ‰´þÿÿ‰µ¸þÿÿƒ½¸þÿÿþt‹•´þÿÿ‰$è$ÿÿ‹…´þÿÿ‰$èfÿÿeø[^]ÃU‰åVSì`‹E ‰…ðþÿÿ‹E‰…ôþÿÿÇD$…ÿÿÿ‰$èËÿÿ‹E‹‰…¼þÿÿÇD$]Ý…ÿÿÿ‰$èºÿÿ‹•¼þÿÿ‰T$‰$èxÿÿÇD$ã‰$è˜ÿÿÝ…ðþÿÿÝ\$‰$è&ÿÿUÈ…ÿÿÿ‰D$‰$èñÿÿƒì‹E‹PEȉD$‰$è±ØÿÿEȉ$è^ÿÿë1‰…´þÿÿ‰•¸þÿÿ‹µ¸þÿÿ‹´þÿÿEȉ$è9ÿÿ‰´þÿÿ‰µ¸þÿÿë…ÿÿÿ‰$èÿÿéĉ…´þÿÿ‰•¸þÿÿ‹µ¸þÿÿ‹´þÿÿ…ÿÿÿ‰$èòÿÿ‰´þÿÿ‰µ¸þÿÿë ‰…´þÿÿ‰•¸þÿÿƒ½¸þÿÿt锋…´þÿÿ‰$èlÿÿ‰EôÇD$…ÿÿÿ‰$èƒÿÿ‹E‹‰…Àþÿÿ‹E‹@…Àt/‹E‹@ƒøu Ç…ÈþÿÿkÝë Ç…ÈþÿÿmÝ‹•Èþÿÿ‰•Äþÿÿë Ç…ÄþÿÿoÝ‹…Äþÿÿ‰…Ìþÿÿ‹E‹@ ‰…ÐþÿÿÇD$ Ü…ÿÿÿ‰$èÿÿ‹•Ðþÿÿ‰T$‰$èÕÿÿÇD$q݉$èõÿÿ‹•Ìþÿÿ‰T$‰$èãÿÿÇD$x݉$èÓÿÿ‹•Àþÿÿ‰T$‰$è‘ÿÿÇD${݉$è±ÿÿÇD$ü‘‰$èÿÿEÓ‰$èfÿÿEÓ‰D$ÇD$#ãẺ$è¼ÿÿUÔ…ÿÿÿ‰D$‰$èçÿÿƒìE߉$è)ÿÿE߉D$ÇD$@ãE؉$èÿÿÇD$ÿÿÿÿÇD$ẺD$ EÔ‰D$E؉D$‹Eô‰$è•;E؉$èÿÿë1‰…´þÿÿ‰•¸þÿÿ‹µ¸þÿÿ‹´þÿÿE؉$èïÿÿ‰´þÿÿ‰µ¸þÿÿë$E߉$èöÿÿEÔ‰$èËÿÿëT‰…´þÿÿ‰•¸þÿÿ‹µ¸þÿÿ‹´þÿÿE߉$èÆÿÿ‰´þÿÿ‰µ¸þÿÿ‹µ¸þÿÿ‹´þÿÿEÔ‰$èƒÿÿ‰´þÿÿ‰µ¸þÿÿëẺ$èjÿÿë1‰…´þÿÿ‰•¸þÿÿ‹µ¸þÿÿ‹´þÿÿẺ$èEÿÿ‰´þÿÿ‰µ¸þÿÿë@EÓ‰$èLÿÿÇ$è0ÿÿ‰…Ôþÿÿ‹•Ôþÿÿ‹Eô‰D$‰$èã?ë1‰…´þÿÿ‰•¸þÿÿ‹µ¸þÿÿ‹´þÿÿEÓ‰$èÿÿ‰´þÿÿ‰µ¸þÿÿëFÇD$­ÇD$Ää‹…Ôþÿÿ‰$èÿÿ‰…´þÿÿ‰•¸þÿÿƒ½¸þÿÿÿtëèèÿÿ‰…´þÿÿ‰•¸þÿÿ‹µ¸þÿÿ‹´þÿÿ…ÿÿÿ‰$èrÿÿ‰´þÿÿ‰µ¸þÿÿë ‰…´þÿÿ‰•¸þÿÿ‹µ¸þÿÿ‹´þÿÿè·ÿÿ‰´þÿÿ‰µ¸þÿÿ齋•´þÿÿ‰$èØÿÿÇD$…ÿÿÿ‰$èòÿÿ‹E‹‰…Øþÿÿ‹E‹@…Àt/‹E‹@ƒøu Ç…àþÿÿkÝë Ç…àþÿÿmÝ‹…àþÿÿ‰…Üþÿÿë Ç…ÜþÿÿoÝ‹•Üþÿÿ‰•äþÿÿ‹E‹@ ‰…èþÿÿÇD$°Ý…ÿÿÿ‰$è†ÿÿ‹•èþÿÿ‰T$‰$èDÿÿÇD$q݉$èdÿÿ‹•äþÿÿ‰T$‰$èRÿÿÇD$x݉$èBÿÿ‹•Øþÿÿ‰T$‰$èÿÿÇD${݉$è ÿÿÇD$ü‘‰$è€ÿÿEç‰$èÕÿÿEç‰D$ÇD$#ãEà‰$è+ÿÿUè…ÿÿÿ‰D$‰$èVÿÿƒìEó‰$è˜ÿÿEó‰D$ÇD$ÓÝEì‰$èîÿÿÇD$ÿÿÿÿÇD$Eà‰D$ Eè‰D$Eì‰D$E¸‰$è ?Eì‰$èƒÿÿë1‰…´þÿÿ‰•¸þÿÿ‹µ¸þÿÿ‹´þÿÿEì‰$è^ÿÿ‰´þÿÿ‰µ¸þÿÿë$Eó‰$èeÿÿEè‰$è:ÿÿëT‰…´þÿÿ‰•¸þÿÿ‹µ¸þÿÿ‹´þÿÿEó‰$è5ÿÿ‰´þÿÿ‰µ¸þÿÿ‹µ¸þÿÿ‹´þÿÿEè‰$èòÿÿ‰´þÿÿ‰µ¸þÿÿëEà‰$èÙÿÿë1‰…´þÿÿ‰•¸þÿÿ‹µ¸þÿÿ‹´þÿÿEà‰$è´ÿÿ‰´þÿÿ‰µ¸þÿÿë@Eç‰$è»ÿÿÇ$èŸÿÿ‰…ìþÿÿ‹•ìþÿÿE¸‰D$‰$èR<ë1‰…´þÿÿ‰•¸þÿÿ‹µ¸þÿÿ‹´þÿÿEç‰$èoÿÿ‰´þÿÿ‰µ¸þÿÿëwÇD$­ÇD$Ää‹…ìþÿÿ‰$èsÿÿ‰…´þÿÿ‰•¸þÿÿƒ½¸þÿÿÿtëèWÿÿ‰…´þÿÿ‰•¸þÿÿ‹µ¸þÿÿ‹´þÿÿE¸‰$èÊ/‰´þÿÿ‰µ¸þÿÿë ‰…´þÿÿ‰•¸þÿÿ‹µ¸þÿÿ‹´þÿÿ…ÿÿÿ‰$è°ÿÿ‰´þÿÿ‰µ¸þÿÿë ‰…´þÿÿ‰•¸þÿÿ‹µ¸þÿÿ‹´þÿÿèõÿÿ‰´þÿÿ‰µ¸þÿÿƒ½¸þÿÿþt‹•´þÿÿ‰$èRÿÿ‹…´þÿÿ‰$è”ÿÿeø[^]ÃU‰åVSì@ÇD$…ÿÿÿ‰$è ÿÿ‹E‹‰…äþÿÿÇD$sá…ÿÿÿ‰$èúÿÿ‹•äþÿÿ‰T$‰$è¸ÿÿÇD$]ã‰$èØÿÿUÈ…ÿÿÿ‰D$‰$èCÿÿƒì‹E‹PEȉD$‰$èÐÿÿEȉ$è°ÿÿë1‰…Üþÿÿ‰•àþÿÿ‹µàþÿÿ‹ÜþÿÿEȉ$è‹ÿÿ‰Üþÿÿ‰µàþÿÿë…ÿÿÿ‰$èoÿÿéh‰…Üþÿÿ‰•àþÿÿ‹µàþÿÿ‹Üþÿÿ…ÿÿÿ‰$èDÿÿ‰Üþÿÿ‰µàþÿÿë ‰…Üþÿÿ‰•àþÿÿƒ½àþÿÿtéæ‹…Üþÿÿ‰$è¾ÿÿ‰EôÇD$…ÿÿÿ‰$èÕÿÿ‹E‹@(‰…èþÿÿÇD$ Ü…ÿÿÿ‰$èÃÿÿ‹•èþÿÿ‰T$‰$èÿÿÇD$ü‘‰$èÿÿEÓ‰$èfÿÿEÓ‰D$ÇD$iãẺ$è¼ÿÿUÔ…ÿÿÿ‰D$‰$èçÿÿƒìE߉$è)ÿÿE߉D$ÇD$XáE؉$èÿÿÇD$ÿÿÿÿÇD$ẺD$ EÔ‰D$E؉D$‹Eô‰$è•3E؉$èÿÿë1‰…Üþÿÿ‰•àþÿÿ‹µàþÿÿ‹ÜþÿÿE؉$èïÿÿ‰Üþÿÿ‰µàþÿÿë$E߉$èöÿÿEÔ‰$èËÿÿëT‰…Üþÿÿ‰•àþÿÿ‹µàþÿÿ‹ÜþÿÿE߉$èÆÿÿ‰Üþÿÿ‰µàþÿÿ‹µàþÿÿ‹ÜþÿÿEÔ‰$èƒÿÿ‰Üþÿÿ‰µàþÿÿëẺ$èjÿÿë1‰…Üþÿÿ‰•àþÿÿ‹µàþÿÿ‹ÜþÿÿẺ$èEÿÿ‰Üþÿÿ‰µàþÿÿë@EÓ‰$èLÿÿÇ$è0ÿÿ‰…ìþÿÿ‹•ìþÿÿ‹Eô‰D$‰$èã7ë1‰…Üþÿÿ‰•àþÿÿ‹µàþÿÿ‹ÜþÿÿEÓ‰$èÿÿ‰Üþÿÿ‰µàþÿÿëFÇD$­ÇD$Ää‹…ìþÿÿ‰$èÿÿ‰…Üþÿÿ‰•àþÿÿƒ½àþÿÿÿtëèè ÿÿ‰…Üþÿÿ‰•àþÿÿ‹µàþÿÿ‹Üþÿÿ…ÿÿÿ‰$èrÿÿ‰Üþÿÿ‰µàþÿÿë ‰…Üþÿÿ‰•àþÿÿ‹µàþÿÿ‹Üþÿÿè·ÿÿ‰Üþÿÿ‰µàþÿÿé‹•Üþÿÿ‰$èØÿÿÇD$…ÿÿÿ‰$èòÿÿ‹E‹@(‰…ðþÿÿÇD$°Ý…ÿÿÿ‰$èà ÿÿ‹•ðþÿÿ‰T$‰$èž ÿÿÇD$ü‘‰$è.ÿÿEç‰$èƒÿÿEç‰D$ÇD$iãEà‰$èÙ ÿÿUè…ÿÿÿ‰D$‰$è ÿÿƒìEó‰$èFÿÿEó‰D$ÇD$ÓÝEì‰$èœ ÿÿÇD$ÿÿÿÿÇD$Eà‰D$ Eè‰D$Eì‰D$E¸‰$èÎ7Eì‰$è1 ÿÿë1‰…Üþÿÿ‰•àþÿÿ‹µàþÿÿ‹ÜþÿÿEì‰$è ÿÿ‰Üþÿÿ‰µàþÿÿë$Eó‰$è ÿÿEè‰$èè ÿÿëT‰…Üþÿÿ‰•àþÿÿ‹µàþÿÿ‹ÜþÿÿEó‰$èã ÿÿ‰Üþÿÿ‰µàþÿÿ‹µàþÿÿ‹ÜþÿÿEè‰$è  ÿÿ‰Üþÿÿ‰µàþÿÿëEà‰$è‡ ÿÿë1‰…Üþÿÿ‰•àþÿÿ‹µàþÿÿ‹ÜþÿÿEà‰$èb ÿÿ‰Üþÿÿ‰µàþÿÿë@Eç‰$èi ÿÿÇ$èM ÿÿ‰…ôþÿÿ‹•ôþÿÿE¸‰D$‰$è5ë1‰…Üþÿÿ‰•àþÿÿ‹µàþÿÿ‹ÜþÿÿEç‰$è ÿÿ‰Üþÿÿ‰µàþÿÿëwÇD$­ÇD$Ää‹…ôþÿÿ‰$è! ÿÿ‰…Üþÿÿ‰•àþÿÿƒ½àþÿÿÿtëè ÿÿ‰…Üþÿÿ‰•àþÿÿ‹µàþÿÿ‹ÜþÿÿE¸‰$èx(‰Üþÿÿ‰µàþÿÿë ‰…Üþÿÿ‰•àþÿÿ‹µàþÿÿ‹Üþÿÿ…ÿÿÿ‰$è^ ÿÿ‰Üþÿÿ‰µàþÿÿë ‰…Üþÿÿ‰•àþÿÿ‹µàþÿÿ‹Üþÿÿè£ ÿÿ‰Üþÿÿ‰µàþÿÿƒ½àþÿÿþt‹•Üþÿÿ‰$è ÿÿ‹…Üþÿÿ‰$èB ÿÿeø[^]ÃU‰åVSì@‹E ˆ…ôþÿÿÇD$…ÿÿÿ‰$è° ÿÿ¶…ôþÿÿƒÀ‰…Üþÿÿ‹E‹‰…àþÿÿÇD$sá…ÿÿÿ‰$è ÿÿ‹•àþÿÿ‰T$‰$èMÿÿÇD$…ã‰$èm ÿÿ‹•Üþÿÿ‰T$‰$è+ÿÿUÈ…ÿÿÿ‰D$‰$èÆÿÿƒì‹E‹PEȉD$‰$è†ÈÿÿEȉ$è3 ÿÿë1‰…Ôþÿÿ‰•Øþÿÿ‹µØþÿÿ‹ÔþÿÿEȉ$è ÿÿ‰Ôþÿÿ‰µØþÿÿë…ÿÿÿ‰$èò ÿÿéh‰…Ôþÿÿ‰•Øþÿÿ‹µØþÿÿ‹Ôþÿÿ…ÿÿÿ‰$èÇ ÿÿ‰Ôþÿÿ‰µØþÿÿë ‰…Ôþÿÿ‰•Øþÿÿƒ½Øþÿÿtéæ‹…Ôþÿÿ‰$èA ÿÿ‰EôÇD$…ÿÿÿ‰$èX ÿÿ‹E‹@(‰…äþÿÿÇD$ Ü…ÿÿÿ‰$èFÿÿ‹•äþÿÿ‰T$‰$èÿÿÇD$ü‘‰$è” ÿÿEÓ‰$èé ÿÿEÓ‰D$ÇD$ŒãẺ$è?ÿÿUÔ…ÿÿÿ‰D$‰$èjÿÿƒìE߉$è¬ ÿÿE߉D$ÇD$¦ãE؉$èÿÿÇD$ÿÿÿÿÇD$ẺD$ EÔ‰D$E؉D$‹Eô‰$è,E؉$è—ÿÿë1‰…Ôþÿÿ‰•Øþÿÿ‹µØþÿÿ‹ÔþÿÿE؉$èrÿÿ‰Ôþÿÿ‰µØþÿÿë$E߉$èyÿÿEÔ‰$èNÿÿëT‰…Ôþÿÿ‰•Øþÿÿ‹µØþÿÿ‹ÔþÿÿE߉$èIÿÿ‰Ôþÿÿ‰µØþÿÿ‹µØþÿÿ‹ÔþÿÿEÔ‰$èÿÿ‰Ôþÿÿ‰µØþÿÿëẺ$èíÿÿë1‰…Ôþÿÿ‰•Øþÿÿ‹µØþÿÿ‹ÔþÿÿẺ$èÈÿÿ‰Ôþÿÿ‰µØþÿÿë@EÓ‰$èÏÿÿÇ$è³ÿÿ‰…èþÿÿ‹•èþÿÿ‹Eô‰D$‰$èf0ë1‰…Ôþÿÿ‰•Øþÿÿ‹µØþÿÿ‹ÔþÿÿEÓ‰$èƒÿÿ‰Ôþÿÿ‰µØþÿÿëFÇD$­ÇD$Ää‹…èþÿÿ‰$è‡ÿÿ‰…Ôþÿÿ‰•Øþÿÿƒ½Øþÿÿÿtëèkÿÿ‰…Ôþÿÿ‰•Øþÿÿ‹µØþÿÿ‹Ôþÿÿ…ÿÿÿ‰$èõÿÿ‰Ôþÿÿ‰µØþÿÿë ‰…Ôþÿÿ‰•Øþÿÿ‹µØþÿÿ‹Ôþÿÿè:ÿÿ‰Ôþÿÿ‰µØþÿÿé‹•Ôþÿÿ‰$è[ÿÿÇD$…ÿÿÿ‰$èuÿÿ‹E‹@(‰…ìþÿÿÇD$°Ý…ÿÿÿ‰$ècÿÿ‹•ìþÿÿ‰T$‰$è!ÿÿÇD$ü‘‰$è±ÿÿEç‰$èÿÿEç‰D$ÇD$ŒãEà‰$è\ÿÿUè…ÿÿÿ‰D$‰$è‡ÿÿƒìEó‰$èÉÿÿEó‰D$ÇD$ÓÝEì‰$èÿÿÇD$ÿÿÿÿÇD$Eà‰D$ Eè‰D$Eì‰D$E¸‰$èQ0Eì‰$è´ÿÿë1‰…Ôþÿÿ‰•Øþÿÿ‹µØþÿÿ‹ÔþÿÿEì‰$èÿÿ‰Ôþÿÿ‰µØþÿÿë$Eó‰$è–ÿÿEè‰$èkÿÿëT‰…Ôþÿÿ‰•Øþÿÿ‹µØþÿÿ‹ÔþÿÿEó‰$èfÿÿ‰Ôþÿÿ‰µØþÿÿ‹µØþÿÿ‹ÔþÿÿEè‰$è#ÿÿ‰Ôþÿÿ‰µØþÿÿëEà‰$è ÿÿë1‰…Ôþÿÿ‰•Øþÿÿ‹µØþÿÿ‹ÔþÿÿEà‰$èåÿÿ‰Ôþÿÿ‰µØþÿÿë@Eç‰$èìÿÿÇ$èÐÿÿ‰…ðþÿÿ‹•ðþÿÿE¸‰D$‰$èƒ-ë1‰…Ôþÿÿ‰•Øþÿÿ‹µØþÿÿ‹ÔþÿÿEç‰$è ÿÿ‰Ôþÿÿ‰µØþÿÿëwÇD$­ÇD$Ää‹…ðþÿÿ‰$è¤ÿÿ‰…Ôþÿÿ‰•Øþÿÿƒ½Øþÿÿÿtëèˆÿÿ‰…Ôþÿÿ‰•Øþÿÿ‹µØþÿÿ‹ÔþÿÿE¸‰$èû ‰Ôþÿÿ‰µØþÿÿë ‰…Ôþÿÿ‰•Øþÿÿ‹µØþÿÿ‹Ôþÿÿ…ÿÿÿ‰$èáÿÿ‰Ôþÿÿ‰µØþÿÿë ‰…Ôþÿÿ‰•Øþÿÿ‹µØþÿÿ‹Ôþÿÿè&ÿÿ‰Ôþÿÿ‰µØþÿÿƒ½Øþÿÿþt‹•Ôþÿÿ‰$èƒÿÿ‹…Ôþÿÿ‰$èÅÿÿeø[^]ÃU‰åƒì‹E‹‰$èKÿÿ‹EÇÉÃU‰åƒì‹E‹‰$è-ÿÿ‹EÇÉÃU‰åƒì‹E‰$èÑÿÿÿÉÃU‰åƒìÇEüë‹Eü‹U‹D‚‰$èÿÿƒEüƒ}ü~ä‹E‹@‰Eìƒ}ìt‹Eì‰$è§ÿÿÿ‹Eì‰$èîÿÿÉÃU‰åƒìÇEüë‹Eü‹U‹D‚‰$èËÿÿƒEüƒ}ü~ä‹E‹@‰Eìƒ}ìt‹Eì‰$èUÿÿÿ‹Eì‰$èœÿÿÉÃU‰åƒì‹E‰$èÿÿÿÉÃU‰åWìÄ‹EÆ€†‹EÇÇD$ÇD$Ç$èMÿÿ‰Â‹E‰‹E‹ƒøÿ„;‹E‹ÇD$ÇD$‰$è‹ÿÿ‰Eð‹Uð€Î‹E‹‰T$ÇD$‰$èiÿÿfÇEÜ‹E ‰$èÿÿ‰EàÇ$¡èiÿÿf‰EÞUÜ‹E‹ÇD$‰T$‰$èYÿþÿ‰Eìƒ}ìÿ…¥èÿþÿ‹ƒøs…†ÇEÔ ÇEظ¹ ½Tÿÿÿüó«‰Mô‰}ø‹E‹‰ÂÁê‹E‹ƒà«„•TÿÿÿEÔ‰D$ÇD$ …Tÿÿÿ‰D$ÇD$Ç$èÞÿÿ…ÀžÀ„Àt‹E‹‰$èèÿÿë‹E‹‰$èÙÿÿë ‹EÆ€†ÄÄ_]ÃU‰åWìÄ‹EÆ€†‹EÇÇD$ÇD$Ç$è»ÿþÿ‰Â‹E‰‹E‹ƒøÿ„;‹E‹ÇD$ÇD$‰$èùÿÿ‰Eð‹Uð€Î‹E‹‰T$ÇD$‰$è×ÿÿfÇEÜ‹E ‰$èvþþÿ‰EàÇ$¡è×þþÿf‰EÞUÜ‹E‹ÇD$‰T$‰$èÇýþÿ‰Eìƒ}ìÿ…¥èuýþÿ‹ƒøs…†ÇEÔ ÇEظ¹ ½Tÿÿÿüó«‰Mô‰}ø‹E‹‰ÂÁê‹E‹ƒà«„•TÿÿÿEÔ‰D$ÇD$ …Tÿÿÿ‰D$ÇD$Ç$èLÿþÿ…ÀžÀ„Àt‹E‹‰$èVÿþÿë‹E‹‰$èGÿþÿë ‹EÆ€†ÄÄ_]ÃU‰åƒì‹U‹E ‰D$‰$èVþÿÿÉÃU‰åVSìP‹E;E u‹E‰…ÔþÿÿéåÇEèë‹Eè‹U‹D‚‰$è ýþÿƒEèƒ}è~ä‹E‹@‰…Øþÿÿƒ½Øþÿÿt‹•Øþÿÿ‰$èûÿÿ‹…Øþÿÿ‰$èÑüþÿ‹E ‹P(‹E‰P(‹E‹@(ƒà„Àt Ç…Üþÿÿë Ç…Üþÿÿ‹E‹•Üþÿÿ‰‹UƒÂ‹E‰P,‹U ƒÂ‹E‹@,‰T$‰$èÃýþÿ‹EÇ@ÇEìë‹Uì‹EÇDƒEìƒ}ì~èÇ$Äè¼ýþÿ‰…àþÿÿ‹E‹@,‰D$‹…àþÿÿ‰$è¼þÿÿ‹E‹•àþÿÿ‰PÇEð뉅Ìþÿÿ‰•Ðþÿÿ‹µÐþÿÿ‹Ìþÿÿ‹…àþÿÿ‰$èãûþÿ‰Ìþÿÿ‰µÐþÿÿëk‹Uð‰•äþÿÿÇ$è@ýþÿ‰Ã‹E ‹P(‹E ‹H‹Eð‰D$ ‰T$‰L$‰$èÕ ÿÿ‹E‹•äþÿÿ‰\ƒEðƒ}ð~¯‹E‰…Ôþÿÿé4‰…Ìþÿÿ‰•Ðþÿÿƒ½Ðþÿÿtéæ‹•Ìþÿÿ‰$èîýþÿ‰EôÇD$…üþÿÿ‰$èþþÿ‹E‹@(‰…èþÿÿÇD$ Ü…üþÿÿ‰$èóûþÿ‹•èþÿÿ‰T$‰$è±úþÿÇD$ü‘‰$èAýþÿElj$è–ýþÿEljD$ÇD$ÁãEÀ‰$èìûþÿUÈ…üþÿÿ‰D$‰$èûþÿƒìEÓ‰$èYýþÿEÓ‰D$ÇD$ÛãẺ$è¯ûþÿÇD$ÿÿÿÿÇD$EÀ‰D$ EȉD$ẺD$‹Eô‰$èÅẺ$èDûþÿë1‰…Ìþÿÿ‰•Ðþÿÿ‹µÐþÿÿ‹ÌþÿÿẺ$èûþÿ‰Ìþÿÿ‰µÐþÿÿë$EÓ‰$è&üþÿEȉ$èûúþÿëT‰…Ìþÿÿ‰•Ðþÿÿ‹µÐþÿÿ‹ÌþÿÿEÓ‰$èöûþÿ‰Ìþÿÿ‰µÐþÿÿ‹µÐþÿÿ‹ÌþÿÿEȉ$è³úþÿ‰Ìþÿÿ‰µÐþÿÿëEÀ‰$èšúþÿë1‰…Ìþÿÿ‰•Ðþÿÿ‹µÐþÿÿ‹ÌþÿÿEÀ‰$èuúþÿ‰Ìþÿÿ‰µÐþÿÿë@Elj$è|ûþÿÇ$è`ûþÿ‰…ìþÿÿ‹•ìþÿÿ‹Eô‰D$‰$è$ë1‰…Ìþÿÿ‰•Ðþÿÿ‹µÐþÿÿ‹ÌþÿÿElj$è0ûþÿ‰Ìþÿÿ‰µÐþÿÿëFÇD$­ÇD$Ää‹…ìþÿÿ‰$è4ûþÿ‰…Ìþÿÿ‰•Ðþÿÿƒ½Ðþÿÿÿtëèúþÿ‰…Ìþÿÿ‰•Ðþÿÿ‹µÐþÿÿ‹Ìþÿÿ…üþÿÿ‰$è¢úþÿ‰Ìþÿÿ‰µÐþÿÿë ‰…Ìþÿÿ‰•Ðþÿÿ‹µÐþÿÿ‹Ìþÿÿèçúþÿ‰Ìþÿÿ‰µÐþÿÿé‹•Ìþÿÿ‰$èûþÿÇD$…üþÿÿ‰$è"ûþÿ‹E‹@(‰…ðþÿÿÇD$°Ý…üþÿÿ‰$èùþÿ‹•ðþÿÿ‰T$‰$èÎ÷þÿÇD$ü‘‰$è^úþÿEÛ‰$è³úþÿEÛ‰D$ÇD$ÁãEÔ‰$è ùþÿUÜ…üþÿÿ‰D$‰$è4øþÿƒìEç‰$èvúþÿEç‰D$ÇD$ÓÝEà‰$èÌøþÿÇD$ÿÿÿÿÇD$EÔ‰D$ E܉D$Eà‰D$E°‰$èþ#Eà‰$èaøþÿë1‰…Ìþÿÿ‰•Ðþÿÿ‹µÐþÿÿ‹ÌþÿÿEà‰$è<øþÿ‰Ìþÿÿ‰µÐþÿÿë$Eç‰$èCùþÿE܉$èøþÿëT‰…Ìþÿÿ‰•Ðþÿÿ‹µÐþÿÿ‹ÌþÿÿEç‰$èùþÿ‰Ìþÿÿ‰µÐþÿÿ‹µÐþÿÿ‹ÌþÿÿE܉$èÐ÷þÿ‰Ìþÿÿ‰µÐþÿÿëEÔ‰$è·÷þÿë1‰…Ìþÿÿ‰•Ðþÿÿ‹µÐþÿÿ‹ÌþÿÿEÔ‰$è’÷þÿ‰Ìþÿÿ‰µÐþÿÿë@EÛ‰$è™øþÿÇ$è}øþÿ‰…ôþÿÿ‹•ôþÿÿE°‰D$‰$è0!ë1‰…Ìþÿÿ‰•Ðþÿÿ‹µÐþÿÿ‹ÌþÿÿEÛ‰$èMøþÿ‰Ìþÿÿ‰µÐþÿÿëwÇD$­ÇD$Ää‹…ôþÿÿ‰$èQøþÿ‰…Ìþÿÿ‰•Ðþÿÿƒ½Ðþÿÿÿtëè5÷þÿ‰…Ìþÿÿ‰•Ðþÿÿ‹µÐþÿÿ‹ÌþÿÿE°‰$訉Ìþÿÿ‰µÐþÿÿë ‰…Ìþÿÿ‰•Ðþÿÿ‹µÐþÿÿ‹Ìþÿÿ…üþÿÿ‰$èŽ÷þÿ‰Ìþÿÿ‰µÐþÿÿë ‰…Ìþÿÿ‰•Ðþÿÿ‹µÐþÿÿ‹ÌþÿÿèÓ÷þÿ‰Ìþÿÿ‰µÐþÿÿƒ½Ðþÿÿþt‹•Ìþÿÿ‰$è0øþÿ‹…Ìþÿÿ‰$èröþÿ‹…Ôþÿÿeø[^]ÃU‰åVSì@‹EÇ@‹E ‹P(‹E‰P(‹E‹@(ƒà„Àt Ç…Üþÿÿë Ç…Üþÿÿ‹E‹•Üþÿÿ‰‹UƒÂ‹E‰P,‹U ƒÂ‹E‹@,‰T$‰$èöþÿÇEìë‹Uì‹EÇDƒEìƒ}ì~èÇ$Äèöþÿ‰…àþÿÿ‹E‹@,‰D$‹…àþÿÿ‰$è÷ÿÿ‹E‹•àþÿÿ‰PÇEð뉅Ôþÿÿ‰•Øþÿÿ‹µØþÿÿ‹Ôþÿÿ‹…àþÿÿ‰$è;ôþÿ‰Ôþÿÿ‰µØþÿÿëb‹Uð‰•äþÿÿÇ$è˜õþÿ‰Ã‹E ‹P(‹E ‹H‹Eð‰D$ ‰T$‰L$‰$è-ÿÿ‹E‹•äþÿÿ‰\ƒEðƒ}ð~¯é4‰…Ôþÿÿ‰•Øþÿÿƒ½Øþÿÿtéæ‹…Ôþÿÿ‰$èOöþÿ‰EôÇD$…ÿÿÿ‰$èföþÿ‹E‹@(‰…èþÿÿÇD$ Ü…ÿÿÿ‰$èTôþÿ‹•èþÿÿ‰T$‰$èóþÿÇD$ü‘‰$è¢õþÿEˉ$è÷õþÿEˉD$ÇD$øãEĉ$èMôþÿUÌ…ÿÿÿ‰D$‰$èxóþÿƒìE׉$èºõþÿE׉D$ÇD$äEЉ$èôþÿÇD$ÿÿÿÿÇD$EĉD$ ẺD$EЉD$‹Eô‰$è&EЉ$è¥óþÿë1‰…Ôþÿÿ‰•Øþÿÿ‹µØþÿÿ‹ÔþÿÿEЉ$è€óþÿ‰Ôþÿÿ‰µØþÿÿë$E׉$è‡ôþÿẺ$è\óþÿëT‰…Ôþÿÿ‰•Øþÿÿ‹µØþÿÿ‹ÔþÿÿE׉$èWôþÿ‰Ôþÿÿ‰µØþÿÿ‹µØþÿÿ‹ÔþÿÿẺ$èóþÿ‰Ôþÿÿ‰µØþÿÿëEĉ$èûòþÿë1‰…Ôþÿÿ‰•Øþÿÿ‹µØþÿÿ‹ÔþÿÿEĉ$èÖòþÿ‰Ôþÿÿ‰µØþÿÿë@Eˉ$èÝóþÿÇ$èÁóþÿ‰…ìþÿÿ‹•ìþÿÿ‹Eô‰D$‰$ètë1‰…Ôþÿÿ‰•Øþÿÿ‹µØþÿÿ‹ÔþÿÿEˉ$è‘óþÿ‰Ôþÿÿ‰µØþÿÿëFÇD$­ÇD$Ää‹…ìþÿÿ‰$è•óþÿ‰…Ôþÿÿ‰•Øþÿÿƒ½Øþÿÿÿtëèyòþÿ‰…Ôþÿÿ‰•Øþÿÿ‹µØþÿÿ‹Ôþÿÿ…ÿÿÿ‰$èóþÿ‰Ôþÿÿ‰µØþÿÿë ‰…Ôþÿÿ‰•Øþÿÿ‹µØþÿÿ‹ÔþÿÿèHóþÿ‰Ôþÿÿ‰µØþÿÿé‹•Ôþÿÿ‰$èióþÿÇD$…ÿÿÿ‰$èƒóþÿ‹E‹@(‰…ðþÿÿÇD$°Ý…ÿÿÿ‰$èqñþÿ‹•ðþÿÿ‰T$‰$è/ðþÿÇD$ü‘‰$è¿òþÿE߉$èóþÿE߉D$ÇD$øãE؉$èjñþÿUà…ÿÿÿ‰D$‰$è•ðþÿƒìEë‰$è×òþÿEë‰D$ÇD$ÓÝEä‰$è-ñþÿÇD$ÿÿÿÿÇD$E؉D$ Eà‰D$Eä‰D$E´‰$è_Eä‰$èÂðþÿë1‰…Ôþÿÿ‰•Øþÿÿ‹µØþÿÿ‹ÔþÿÿEä‰$èðþÿ‰Ôþÿÿ‰µØþÿÿë$Eë‰$è¤ñþÿEà‰$èyðþÿëT‰…Ôþÿÿ‰•Øþÿÿ‹µØþÿÿ‹ÔþÿÿEë‰$ètñþÿ‰Ôþÿÿ‰µØþÿÿ‹µØþÿÿ‹ÔþÿÿEà‰$è1ðþÿ‰Ôþÿÿ‰µØþÿÿëE؉$èðþÿë1‰…Ôþÿÿ‰•Øþÿÿ‹µØþÿÿ‹ÔþÿÿE؉$èóïþÿ‰Ôþÿÿ‰µØþÿÿë@E߉$èúðþÿÇ$èÞðþÿ‰…ôþÿÿ‹•ôþÿÿE´‰D$‰$è‘ë1‰…Ôþÿÿ‰•Øþÿÿ‹µØþÿÿ‹ÔþÿÿE߉$è®ðþÿ‰Ôþÿÿ‰µØþÿÿëwÇD$­ÇD$Ää‹…ôþÿÿ‰$è²ðþÿ‰…Ôþÿÿ‰•Øþÿÿƒ½Øþÿÿÿtëè–ïþÿ‰…Ôþÿÿ‰•Øþÿÿ‹µØþÿÿ‹ÔþÿÿE´‰$è ‰Ôþÿÿ‰µØþÿÿë ‰…Ôþÿÿ‰•Øþÿÿ‹µØþÿÿ‹Ôþÿÿ…ÿÿÿ‰$èïïþÿ‰Ôþÿÿ‰µØþÿÿë ‰…Ôþÿÿ‰•Øþÿÿ‹µØþÿÿ‹Ôþÿÿè4ðþÿ‰Ôþÿÿ‰µØþÿÿƒ½Øþÿÿþt‹•Ôþÿÿ‰$è‘ðþÿ‹…Ôþÿÿ‰$èÓîþÿeø[^]ÃU‰åVSì@‹EÇ@‹E ‹P(‹E‰P(‹E‹@(ƒà„Àt Ç…Üþÿÿë Ç…Üþÿÿ‹E‹•Üþÿÿ‰‹UƒÂ‹E‰P,‹U ƒÂ‹E‹@,‰T$‰$èyîþÿÇEìë‹Uì‹EÇDƒEìƒ}ì~èÇ$Äè|îþÿ‰…àþÿÿ‹E‹@,‰D$‹…àþÿÿ‰$è|ïÿÿ‹E‹•àþÿÿ‰PÇEð뉅Ôþÿÿ‰•Øþÿÿ‹µØþÿÿ‹Ôþÿÿ‹…àþÿÿ‰$è£ìþÿ‰Ôþÿÿ‰µØþÿÿëb‹Uð‰•äþÿÿÇ$èîþÿ‰Ã‹E ‹P(‹E ‹H‹Eð‰D$ ‰T$‰L$‰$è•ÿÿ‹E‹•äþÿÿ‰\ƒEðƒ}ð~¯é4‰…Ôþÿÿ‰•Øþÿÿƒ½Øþÿÿtéæ‹…Ôþÿÿ‰$è·îþÿ‰EôÇD$…ÿÿÿ‰$èÎîþÿ‹E‹@(‰…èþÿÿÇD$ Ü…ÿÿÿ‰$è¼ìþÿ‹•èþÿÿ‰T$‰$èzëþÿÇD$ü‘‰$è îþÿEˉ$è_îþÿEˉD$ÇD$øãEĉ$èµìþÿUÌ…ÿÿÿ‰D$‰$èàëþÿƒìE׉$è"îþÿE׉D$ÇD$äEЉ$èxìþÿÇD$ÿÿÿÿÇD$EĉD$ ẺD$EЉD$‹Eô‰$èŽEЉ$è ìþÿë1‰…Ôþÿÿ‰•Øþÿÿ‹µØþÿÿ‹ÔþÿÿEЉ$èèëþÿ‰Ôþÿÿ‰µØþÿÿë$E׉$èïìþÿẺ$èÄëþÿëT‰…Ôþÿÿ‰•Øþÿÿ‹µØþÿÿ‹ÔþÿÿE׉$è¿ìþÿ‰Ôþÿÿ‰µØþÿÿ‹µØþÿÿ‹ÔþÿÿẺ$è|ëþÿ‰Ôþÿÿ‰µØþÿÿëEĉ$ècëþÿë1‰…Ôþÿÿ‰•Øþÿÿ‹µØþÿÿ‹ÔþÿÿEĉ$è>ëþÿ‰Ôþÿÿ‰µØþÿÿë@Eˉ$èEìþÿÇ$è)ìþÿ‰…ìþÿÿ‹•ìþÿÿ‹Eô‰D$‰$èÜë1‰…Ôþÿÿ‰•Øþÿÿ‹µØþÿÿ‹ÔþÿÿEˉ$èùëþÿ‰Ôþÿÿ‰µØþÿÿëFÇD$­ÇD$Ää‹…ìþÿÿ‰$èýëþÿ‰…Ôþÿÿ‰•Øþÿÿƒ½Øþÿÿÿtëèáêþÿ‰…Ôþÿÿ‰•Øþÿÿ‹µØþÿÿ‹Ôþÿÿ…ÿÿÿ‰$èkëþÿ‰Ôþÿÿ‰µØþÿÿë ‰…Ôþÿÿ‰•Øþÿÿ‹µØþÿÿ‹Ôþÿÿè°ëþÿ‰Ôþÿÿ‰µØþÿÿé‹•Ôþÿÿ‰$èÑëþÿÇD$…ÿÿÿ‰$èëëþÿ‹E‹@(‰…ðþÿÿÇD$°Ý…ÿÿÿ‰$èÙéþÿ‹•ðþÿÿ‰T$‰$è—èþÿÇD$ü‘‰$è'ëþÿE߉$è|ëþÿE߉D$ÇD$øãE؉$èÒéþÿUà…ÿÿÿ‰D$‰$èýèþÿƒìEë‰$è?ëþÿEë‰D$ÇD$ÓÝEä‰$è•éþÿÇD$ÿÿÿÿÇD$E؉D$ Eà‰D$Eä‰D$E´‰$èÇEä‰$è*éþÿë1‰…Ôþÿÿ‰•Øþÿÿ‹µØþÿÿ‹ÔþÿÿEä‰$èéþÿ‰Ôþÿÿ‰µØþÿÿë$Eë‰$è êþÿEà‰$èáèþÿëT‰…Ôþÿÿ‰•Øþÿÿ‹µØþÿÿ‹ÔþÿÿEë‰$èÜéþÿ‰Ôþÿÿ‰µØþÿÿ‹µØþÿÿ‹ÔþÿÿEà‰$è™èþÿ‰Ôþÿÿ‰µØþÿÿëE؉$è€èþÿë1‰…Ôþÿÿ‰•Øþÿÿ‹µØþÿÿ‹ÔþÿÿE؉$è[èþÿ‰Ôþÿÿ‰µØþÿÿë@E߉$èbéþÿÇ$èFéþÿ‰…ôþÿÿ‹•ôþÿÿE´‰D$‰$èùë1‰…Ôþÿÿ‰•Øþÿÿ‹µØþÿÿ‹ÔþÿÿE߉$èéþÿ‰Ôþÿÿ‰µØþÿÿëwÇD$­ÇD$Ää‹…ôþÿÿ‰$èéþÿ‰…Ôþÿÿ‰•Øþÿÿƒ½Øþÿÿÿtëèþçþÿ‰…Ôþÿÿ‰•Øþÿÿ‹µØþÿÿ‹ÔþÿÿE´‰$èq‰Ôþÿÿ‰µØþÿÿë ‰…Ôþÿÿ‰•Øþÿÿ‹µØþÿÿ‹Ôþÿÿ…ÿÿÿ‰$èWèþÿ‰Ôþÿÿ‰µØþÿÿë ‰…Ôþÿÿ‰•Øþÿÿ‹µØþÿÿ‹Ôþÿÿèœèþÿ‰Ôþÿÿ‰µØþÿÿƒ½Øþÿÿþt‹•Ôþÿÿ‰$èùèþÿ‹…Ôþÿÿ‰$è;çþÿeø[^]ÃU‰åVSƒì@‹EÇ@‹U‹E‰B(‹E‹@(ƒà„Àt ÇEØëÇEØ‹E‹U؉‹UƒÂ‹E‰P,‹E‹P,‹E ‰D$‰$èóæþÿÇEðë‹Uð‹EÇDƒEðƒ}ð~èÇ$Äèöæþÿ‰EÜ‹E‹@,‰D$‹E܉$èüçÿÿ‹E‹U܉PÇEôë[‰EЋ]ЋE܉$è;åþÿ‰]ÐëS‹Uô‰UàÇ$è¤æþÿ‰Ã‹E‹P(‹E‹H‹Eô‰D$ ‰T$‰L$‰$è9 ÿÿ‹E‹Uà‰\ƒEôƒ}ô~µé½‰EЋEЉ$èxçþÿÇ$èÌæþÿ‰Eä‹EäÇD$ÿÿÿÿÇD$ÇD$ øãÇD$+äÇD$Dä‰$èøÇD$­ÇD$Ää‹Uä‰$è»æþÿ‰EЉUÔ‹uÔ‹]ЋEä‰$è„æþÿ‰]ЉuÔë‰EЉUÔ‹uÔ‹]Ðè«æþÿ‰]ЉuÔƒ}Ôÿt ‹UЉ$èçþÿ‹EЉ$èYåþÿƒÄ@[^]ÃU‰åVSƒì@‹EÇ@‹U‹E‰B(‹E‹@(ƒà„Àt ÇEØëÇEØ‹E‹U؉‹UƒÂ‹E‰P,‹E‹P,‹E ‰D$‰$èåþÿÇEðë‹Uð‹EÇDƒEðƒ}ð~èÇ$Äèåþÿ‰EÜ‹E‹@,‰D$‹E܉$èæÿÿ‹E‹U܉PÇEôë[‰EЋ]ЋE܉$èYãþÿ‰]ÐëS‹Uô‰UàÇ$èÂäþÿ‰Ã‹E‹P(‹E‹H‹Eô‰D$ ‰T$‰L$‰$èWÿÿ‹E‹Uà‰\ƒEôƒ}ô~µé½‰EЋEЉ$è–åþÿÇ$èêäþÿ‰Eä‹EäÇD$ÿÿÿÿÇD$ÇD$ øãÇD$+äÇD$Dä‰$èÇD$­ÇD$Ää‹Uä‰$èÙäþÿ‰EЉUÔ‹uÔ‹]ЋEä‰$è¢äþÿ‰]ЉuÔë‰EЉUÔ‹uÔ‹]ÐèÉäþÿ‰]ЉuÔƒ}Ôÿt ‹UЉ$è2åþÿ‹EЉ$èwãþÿƒÄ@[^]ÃU‰åƒì‹U‹E ‰D$‰$è4ãÿÿÉÃU‰åƒì‹E;E u‹E‰Eüëf‹E ƒÀ‹UƒÂ‰D$‰$èöäþÿ‹E ƒÀ‹UƒÂ‰D$‰$èÞäþÿ‹E ƒÀ ‹UƒÂ ‰D$‰$èÆäþÿ‹E ‹P‹E‰P‹E ‹P‹E‰P‹E‰Eü‹EüÉÃU‰åSƒì$¸ä‹U‰‹EƒÀ‰$èã‹EƒÀ‰Eø‹Eø‰$è3ë(‰Eô‹]ô‹EƒÀ‰Eø‹Eø‰$è‰]ô‹Eô‰$è%äþÿ¸„Àt ‹E‰$è1áþÿƒÄ$[]ÃU‰åSƒì$¸ä‹U‰‹EƒÀ‰$èk‹EƒÀ‰Eø‹Eø‰$è»ë(‰Eô‹]ô‹EƒÀ‰Eø‹Eø‰$蟉]ô‹Eô‰$è­ãþÿ¸„Àt ‹E‰$è¹àþÿƒÄ$[]ÃU‰åSƒì$¸ä‹U‰‹EƒÀ‰$èó‹EƒÀ‰Eø‹Eø‰$èCë(‰Eô‹]ô‹EƒÀ‰Eø‹Eø‰$è'‰]ô‹Eô‰$è5ãþÿ¸„Àt ‹E‰$èAàþÿƒÄ$[]ÃU‰åSƒì$¸ ä‹U‰‹EƒÀ ‰$è áþÿ‹EƒÀ‰Eô‹Eô‰$è÷àþÿë‰Eð‹]ð‹EƒÀ‰Eô‹Eô‰$èÛàþÿ‰]ðë‹EƒÀ‰Eø‹Eø‰$èÂàþÿë(‰Eð‹]ð‹EƒÀ‰Eø‹Eø‰$è¦àþÿ‰]ð‹Eð‰$èˆâþÿ¸„Àt ‹E‰$è”ßþÿƒÄ$[]ÃU‰åSƒì$¸ ä‹U‰‹EƒÀ ‰$è_àþÿ‹EƒÀ‰Eô‹Eô‰$èKàþÿë‰Eð‹]ð‹EƒÀ‰Eô‹Eô‰$è/àþÿ‰]ðë‹EƒÀ‰Eø‹Eø‰$èàþÿë(‰Eð‹]ð‹EƒÀ‰Eø‹Eø‰$èúßþÿ‰]ð‹Eð‰$èÜáþÿ¸„Àt ‹E‰$èèÞþÿƒÄ$[]ÃU‰åSƒì$¸ ä‹U‰‹EƒÀ ‰$è³ßþÿ‹EƒÀ‰Eô‹Eô‰$èŸßþÿë‰Eð‹]ð‹EƒÀ‰Eô‹Eô‰$èƒßþÿ‰]ðë‹EƒÀ‰Eø‹Eø‰$èjßþÿë(‰Eð‹]ð‹EƒÀ‰Eø‹Eø‰$èNßþÿ‰]ð‹Eð‰$è0áþÿ¸„Àt ‹E‰$è<ÞþÿƒÄ$[]ÃU‰åSƒìº ä‹E‰‹E ƒÀ‹UƒÂ‰D$‰$èÞþÿ‹E ƒÀ‹UƒÂ‰D$‰$èuÞþÿ‹E ƒÀ ‹UƒÂ ‰D$‰$è]Þþÿ‹E ‹P‹E‰P‹E ‹P‹E‰Pë;‰Eø‹]ø‹EƒÀ‰$èŸÞþÿ‰]øë‰Eø‹]ø‹EƒÀ‰$è†Þþÿ‰]ø‹Eø‰$èhàþÿƒÄ[]ÃU‰åƒì‹UƒÂ‹E ‰D$‰$è? ÉÃU‰åƒì(‹E;E u‹E‰Eìë]‹EƒÀ‰$è ÇEüë(‹U ƒÂ‹Eü‰D$‰$è‰D$‹E‰$è‘ÿÿÿƒEü‹E ƒÀ‰$èIÿÿ;Eü—À„ÀuÀ‹E‰Eì‹EìÉÃU‰åSƒì$ºä‹E‰Eû‰$èp‹UƒÂEû‰D$‰$èOEû‰$èj‹UƒÂ‹E ‰D$‰$è!ë"‰Eè‹]è‹EƒÀ‰$èI‰]è‹Eè‰$èWßþÿƒÄ$[]ÃU‰åSƒì$ºä‹E‰Eû‰$èô‹UƒÂEû‰D$‰$èÓEû‰$èî‹UƒÂ‹E ‰D$‰$è!!ë"‰Eè‹]è‹EƒÀ‰$è͉]è‹Eè‰$èÛÞþÿƒÄ$[]ÃU‰åSƒìº ä‹E‰‹E ƒÀ‹UƒÂ‰D$‰$èKÜþÿ‹E ƒÀ‹UƒÂ‰D$‰$è3Üþÿ‹E ƒÀ ‹UƒÂ ‰D$‰$èÜþÿ‹E ‹P‹E‰P‹E ‹P‹E‰Pë;‰Eø‹]ø‹EƒÀ‰$è]Üþÿ‰]øë‰Eø‹]ø‹EƒÀ‰$èDÜþÿ‰]ø‹Eø‰$è&ÞþÿƒÄ[]ÃU‰åSƒìº ä‹E‰‹UƒÂ‹E ‰D$‰$èšÛþÿ‹UƒÂ‹E‰D$‰$è…Ûþÿ‹UƒÂ ‹E‰D$‰$èpÛþÿ‹U‹E‰B‹U‹E‰Bë;‰Eø‹]ø‹EƒÀ‰$è¸Ûþÿ‰]øë‰Eø‹]ø‹EƒÀ‰$èŸÛþÿ‰]ø‹Eø‰$èÝþÿƒÄ[]ÃU‰åSƒìD‹E‰D$‹E‰D$‹E‰D$ ‹E‰D$‹E ‰D$Eä‰$è%ÿÿÿ‹UƒÂEä‰D$‰$è(Eä‰$è·úÿÿë‰EØ‹]ØEä‰$è¤úÿÿ‰]Ø‹E؉$èÝþÿƒÄD[]ÃU‰åSƒìº ä‹E‰‹UƒÂ‹E ‰D$‰$èxÚþÿ‹UƒÂ‹E‰D$‰$ècÚþÿ‹UƒÂ ‹E‰D$‰$èNÚþÿ‹U‹E‰B‹U‹E‰Bë;‰Eø‹]ø‹EƒÀ‰$è–Úþÿ‰]øë‰Eø‹]ø‹EƒÀ‰$è}Úþÿ‰]ø‹Eø‰$è_ÜþÿƒÄ[]ÃU‰åSƒì$º ä‹E‰Eù‰$è Üþÿ‹UƒÂEù‰D$‹E ‰D$‰$è`ÚþÿEù‰$èEÛþÿEú‰$èÚÛþÿ‹UƒÂEú‰D$‹E‰D$‰$è.Úþÿë‰Eè‹]èEù‰$è Ûþÿ‰]è‹Eè‰$èÍÛþÿEú‰$èòÚþÿEû‰$è‡Ûþÿ‹UƒÂ Eû‰D$‹E‰D$‰$èÛÙþÿë‰Eè‹]èEú‰$è¸Úþÿ‰]èëGEû‰$è¨Úþÿ‹U‹E‰B‹U‹E‰BëG‰Eè‹]èEû‰$èƒÚþÿ‰]è‹]è‹EƒÀ‰$èOÙþÿ‰]è‹]è‹EƒÀ‰$è;Ùþÿ‰]è‹Eè‰$èÛþÿƒÄ$[]ÃU‰åSƒìD‹E‰D$‹E‰D$‹E‰D$ ‹E‰D$‹E ‰D$Eä‰$è‰þÿÿ‹UƒÂEä‰D$‰$èÄEä‰$èSøÿÿë‰EØ‹]ØEä‰$è@øÿÿ‰]Ø‹E؉$è ÚþÿƒÄD[]ÃU‰åSƒì$º ä‹E‰Eù‰$èNÚþÿ‹UƒÂEù‰D$‹E ‰D$‰$è¢ØþÿEù‰$è‡ÙþÿEú‰$èÚþÿ‹UƒÂEú‰D$‹E‰D$‰$èpØþÿë‰Eè‹]èEù‰$èMÙþÿ‰]è‹Eè‰$èÚþÿEú‰$è4ÙþÿEû‰$èÉÙþÿ‹UƒÂ Eû‰D$‹E‰D$‰$èØþÿë‰Eè‹]èEú‰$èúØþÿ‰]èëGEû‰$èêØþÿ‹U‹E‰B‹U‹E‰BëG‰Eè‹]èEû‰$èÅØþÿ‰]è‹]è‹EƒÀ‰$è‘×þÿ‰]è‹]è‹EƒÀ‰$è}×þÿ‰]è‹Eè‰$è_ÙþÿƒÄ$[]ÃU‰åSƒì$º ä‹E‰Eù‰$è Ùþÿ‹UƒÂEù‰D$ÇD$lä‰$è_×þÿEù‰$èDØþÿEú‰$èÙØþÿ‹UƒÂEú‰D$ÇD$lä‰$è,×þÿë‰Eè‹]èEù‰$è Øþÿ‰]è‹Eè‰$èËØþÿEú‰$èð×þÿEû‰$è…Øþÿ‹UƒÂ Eû‰D$ÇD$zä‰$èØÖþÿë‰Eè‹]èEú‰$èµ×þÿ‰]èëIEû‰$è¥×þÿ‹EÇ@‹EÇ@ÿÿÿÿëG‰Eè‹]èEû‰$è~×þÿ‰]è‹]è‹EƒÀ‰$èJÖþÿ‰]è‹]è‹EƒÀ‰$è6Öþÿ‰]è‹Eè‰$èØþÿƒÄ$[]ÃU‰åSƒì4ºä‹E‰Eã‰$è¶Eä‰$è“þÿÿ‹EƒÀUã‰T$ Uä‰T$ÇD$‰$èUEä‰$èNõÿÿë‰EØ‹]ØEä‰$è;õÿÿ‰]Øë(Eã‰$ès‹E ƒÀ‹UƒÂ‰D$‰$è£ëA‰EØ‹]ØEã‰$èH‰]Ø‹E؉$è`×þÿ‰EØ‹]Ø‹EƒÀ‰$è0‰]Ø‹E؉$è>×þÿƒÄ4[]ÃU‰åSƒì4ºä‹E‰Eã‰$èÜEä‰$è¹ýÿÿ‹EƒÀUã‰T$ Uä‰T$ÇD$‰$è{Eä‰$ètôÿÿë‰EØ‹]ØEä‰$èaôÿÿ‰]Øë(Eã‰$虋E ƒÀ‹UƒÂ‰D$‰$èÉëA‰EØ‹]ØEã‰$èn‰]Ø‹E؉$è†Öþÿ‰EØ‹]Ø‹EƒÀ‰$èV‰]Ø‹E؉$èdÖþÿƒÄ4[]ÃU‰åSƒìDºä‹E‰Eã‰$èEä‰$èßüÿÿ‹EƒÀUã‰T$ Uä‰T$ÇD$‰$è¡Eä‰$èšóÿÿë‰EØ‹]ØEä‰$è‡óÿÿ‰]Øë>Eã‰$è¿‹E‰D$‹E‰D$‹E‰D$ ‹E‰D$‹E ‰D$‹E‰$è=øÿÿëA‰EØ‹]ØEã‰$è~‰]Ø‹E؉$è–Õþÿ‰EØ‹]Ø‹EƒÀ‰$èf‰]Ø‹E؉$ètÕþÿƒÄD[]ÃU‰åSƒìDºä‹E‰Eã‰$èEä‰$èïûÿÿ‹EƒÀUã‰T$ Uä‰T$ÇD$‰$è±Eä‰$èªòÿÿë‰EØ‹]ØEä‰$è—òÿÿ‰]Øë>Eã‰$èÏ‹E‰D$‹E‰D$‹E‰D$ ‹E‰D$‹E ‰D$‹E‰$èM÷ÿÿëA‰EØ‹]ØEã‰$莉]Ø‹E؉$è¦Ôþÿ‰EØ‹]Ø‹EƒÀ‰$èv ‰]Ø‹E؉$è„ÔþÿƒÄD[]ÃU‰åSƒìDºä‹E‰Eã‰$è"Eä‰$èÿúÿÿ‹EƒÀUã‰T$ Uä‰T$ÇD$‰$èÁEä‰$èºñÿÿë‰EØ‹]ØEä‰$è§ñÿÿ‰]Øë>Eã‰$èß‹E‰D$‹E‰D$‹E‰D$ ‹E‰D$‹E ‰D$‹E‰$èÁøÿÿëA‰EØ‹]ØEã‰$螉]Ø‹E؉$è¶Óþÿ‰EØ‹]Ø‹EƒÀ‰$è† ‰]Ø‹E؉$è”ÓþÿƒÄD[]ÃU‰åSƒìDºä‹E‰Eã‰$è2Eä‰$èúÿÿ‹EƒÀUã‰T$ Uä‰T$ÇD$‰$èÑEä‰$èÊðÿÿë‰EØ‹]ØEä‰$è·ðÿÿ‰]Øë>Eã‰$èï‹E‰D$‹E‰D$‹E‰D$ ‹E‰D$‹E ‰D$‹E‰$èÑ÷ÿÿëA‰EØ‹]ØEã‰$讉]Ø‹E؉$èÆÒþÿ‰EØ‹]Ø‹EƒÀ‰$è– ‰]Ø‹E؉$è¤ÒþÿƒÄD[]ÃU‰åSƒìTºä‹E‰Eˉ$èBẺ$èùÿÿ‹EƒÀUˉT$ ỦT$ÇD$‰$èáẺ$èÚïÿÿë‰E¸‹]¸Ẻ$èÇïÿÿ‰]¸ëEˉ$èÿEä‰$èÂøÿÿë‰E¸‹]¸Eˉ$èá‰]¸‹E¸‰$èùÑþÿEä‰D$‹E‰$è…ñÿÿEä‰$ènïÿÿë8‰E¸‹]¸Eä‰$è[ïÿÿ‰]¸ë‰E¸‹]¸‹EƒÀ‰$è” ‰]¸‹E¸‰$è¢ÑþÿƒÄT[]ÃU‰åSƒìTºä‹E‰Eˉ$è@Ẻ$èøÿÿ‹EƒÀUˉT$ ỦT$ÇD$‰$èßẺ$èØîÿÿë‰E¸‹]¸Ẻ$èÅîÿÿ‰]¸ëEˉ$èýEä‰$èÀ÷ÿÿë‰E¸‹]¸Eˉ$è߉]¸‹E¸‰$è÷ÐþÿEä‰D$‹E‰$èƒðÿÿEä‰$èlîÿÿë8‰E¸‹]¸Eä‰$èYîÿÿ‰]¸ë‰E¸‹]¸‹EƒÀ‰$è’ ‰]¸‹E¸‰$è ÐþÿƒÄT[]ÃU‰åSƒì$º ä‹E‰Eù‰$èNÐþÿ‹UƒÂEù‰D$ÇD$lä‰$è¡ÎþÿEù‰$è†ÏþÿEú‰$èÐþÿ‹UƒÂEú‰D$ÇD$lä‰$ènÎþÿë‰Eè‹]èEù‰$èKÏþÿ‰]è‹Eè‰$è ÐþÿEú‰$è2ÏþÿEû‰$èÇÏþÿ‹UƒÂ Eû‰D$ÇD$zä‰$èÎþÿë‰Eè‹]èEú‰$è÷Îþÿ‰]èëIEû‰$èçÎþÿ‹EÇ@‹EÇ@ÿÿÿÿëG‰Eè‹]èEû‰$èÀÎþÿ‰]è‹]è‹EƒÀ‰$èŒÍþÿ‰]è‹]è‹EƒÀ‰$èxÍþÿ‰]è‹Eè‰$èZÏþÿƒÄ$[]ÃU‰å‹E ]ÃU‰å]ÃU‰å]ÃU‰åƒì‹E‰$èéÿÿÿÉÃU‰å]ÃU‰åƒì‹E‰$èéÿÿÿÉÃU‰åƒì‹E‰$èÕÿÿÿÉÃU‰å]ÃU‰åƒì‹E ‹U‰D$‰$èâÿÿÿÉÃU‰åƒì‹E ‹U‰D$‰$èÈÿÿÿÉÃU‰åƒì‹E‰$è¡ÿÿÿÉÃU‰å‹E]ÃU‰å‹E‹]ÃU‰åƒì‹U‹E ‰D$‰$è¨ÿÿÿ‹EÇ‹EÇ@‹EÇ@ÉÃU‰åƒì‹U‹E ‰D$‰$è°ÿÿÿÉÃU‰åƒì‹U‹E ‰D$‰$èÎÿÿÿÉÃU‰åSƒì$‹]‹E ‹‹E‹‰Â‰ÐÀÐÁà‰EøEø‰D$‰$è¾íþÿ‰ØƒÄ$[]ÂU‰åƒì(‹E ‰EøUì‹E‰D$‰$è¦íþÿƒì‹Eì‰EüUèEø‰D$Eü‰D$‰$è‚ÿÿÿƒì‹Eè‰EôEô‰$èøþÿÿÉÃU‰åSƒì‹]‹E ƒÀ‰D$‰$è:îþÿ‰ØƒÄ[]ÂU‰åƒì(Uì‹E‰D$‰$è0íþÿƒì‹Eì‰Eô‹E‹@‰EüEü‰D$Eø‰$èüìþÿEô‰D$Eø‰$èZíþÿÉÃU‰å¸ªªª ]ÃU‰å‹E]ÃU‰å‹E‹P‹E‰‹E]ÃU‰å¸ªªª ]ÃU‰åƒì‹E‹‹‹E‰$ÿÒÉÃU‰åƒìë‹E‰$èÕÿÿÿƒE‹E;E uéÉÃU‰åƒì¶EÿˆD$‹E ‰D$‹E‰$è¾ÿÿÿÉÃU‰åƒì‹E ‰D$‹E‰$èÆÿÿÿÉÃU‰åSƒì$‹E‰$è¾ýÿÿ‰D$Eû‰$ègýÿÿ‹E‹P‹E‹Eû‰D$‰T$‰ $è§ÿÿÿEû‰$èýÿÿ‹E‹‹E‰Pë‰Eè‹]èEû‰$èòüÿÿ‰]è‹Eè‰$è ÌþÿƒÄ$[]ÃU‰åƒì‹U ‹E‰Ñ)Á‰ÈÁøiÀ«ªªª‰Eüë‹E‰D$‹E‰$èÎæÿÿƒEƒEƒmüƒ}üÜ‹EÉÃU‰åƒì(ÆEÿ‹E‰D$‹E ‰D$‹E‰$è“ÿÿÿÉÃU‰åWVSƒì‹uE‰$è_þÿÿ‹8E‰$è˜ëþÿ‹E ‰$è‹ëþÿ‹‰|$‰\$‰$è—ÿÿÿ‰EðEð‰D$‰4$è÷ëþÿ‰ðƒÄ[^_]ÂU‰åSƒì$‹]ÆEúÆEûUè‹E‰D$ ‹E‰D$‹E ‰D$‰$èlÿÿÿƒì‹E艉؋]üÉÂU‰åSƒìE ‰$èëþÿ‹E‰$è÷êþÿ‹‹E‰D$‰\$‰$èÿÿÿƒÄ[]ÃU‰åƒì(ÆEþÆEÿ‹E‰D$‹E ‰D$‹E‰$èŸÿÿÿÉÃU‰åSƒì‹E‰$èZýÿÿ‹‹E ‰$èMýÿÿ‹9ÕÀ¶ÀƒÄ[]ÃU‰åƒìëE‰$èýéþÿ‰$èIýÿÿE‰$èýÿÿE ‰D$E‰$è˜ÿÿÿ„ÀuÌÉÃU‰åƒì¶EÿˆD$‹E ‰D$‹E‰$è¢ÿÿÿÉÃU‰åƒì‹E ‰D$‹E‰$èÆÿÿÿÉÃU‰åSƒì‹E‰$èöéþÿ‹‹E ‰$èééþÿ‹9ÕÀ¶ÀƒÄ[]ÃU‰å‹E‹P‹E‰‹E]ÃU‰åƒì‹U ‹E‰Ñ)Á‰ÈÁøiÀ«ªªª‰Eüëƒm ƒm‹E ‰D$‹E‰$è\äÿÿƒmüƒ}üÜ‹EÉÃU‰åƒì(ÆEÿ‹E‰D$‹E ‰D$‹E‰$è“ÿÿÿÉÃU‰åWVSƒì‹uE‰$èõûÿÿ‹8E‰$èèûÿÿ‹E ‰$èÛûÿÿ‹‰|$‰\$‰$è—ÿÿÿ‰EðEð‰D$‰4$èéþÿ‰ðƒÄ[^_]ÂU‰åSƒì$‹]ÆEúÆEûUè‹E‰D$ ‹E‰D$‹E ‰D$‰$èlÿÿÿƒì‹E艉؋]üÉÂU‰åƒì‹E‰$èsûÿÿ;E ’À¶À…À•À„ÀtèüÇþÿ‹U ‰ÐÀÐÁà‰$èèÆþÿÉÃU‰åƒì‹E‰ÂÇD$‹E ‰D$‰$è ÿÿÿÉÃU‰åSƒì‹U‹E‰D$‰$èkùÿÿ‹E ‰D$‹E‰$è±ÿÿÿ‰Â‹E‰‹E‹‹E‰P‹E‹‹U ‰ÐÀÐÁà‹E‰Pë‰Eø‹]ø‹E‰$èôøÿÿ‰]ø‹Eø‰$èªÇþÿƒÄ[]ÃU‰åƒì‹E ‰$è³ÄþÿÉÃU‰åƒìƒ} t‹E‰Â‹E‰D$‹E ‰D$‰$èÅÿÿÿÉÃU‰åƒì‹E‹@‰Â‹E‹‰Ñ)Á‰ÈÁøiÀ«ªªª‰Â‹E‹‰T$‰D$‹E‰$èšÿÿÿ‹E‰$è[øÿÿÉÃU‰åSƒì4‹E‰$èZøÿÿ‰D$Eû‰$èøÿÿ‹E‹P‹E‹Eû‰D$‰T$‰ $èCúÿÿEû‰$è¬÷ÿÿ‹E‰Eè‹Eè‰$è[ÿÿÿë6‰Eä‹]äEû‰$èˆ÷ÿÿ‰]ä‹]ä‹E‰Eè‹Eè‰$è1ÿÿÿ‰]ä‹Eä‰$è‰ÆþÿƒÄ4[]ÃU‰åSƒì$‹E ‰D$Ç$è÷ÿÿ‰Eøƒ}øt:‹E‰D$‹Eø‰$è7åÿÿë&‰Eô‹]ô‹E ‰D$‹Eø‰$èçöÿÿ‰]ô‹Eô‰$è%ÆþÿƒÄ$[]ÃU‰åSƒì$‹E‰D$Ç$è°öÿÿ‰Eøƒ}øt:‹E ‰D$‹Eø‰$èÓäÿÿë&‰Eô‹]ô‹E‰D$‹Eø‰$èƒöÿÿ‰]ô‹Eô‰$èÁÅþÿƒÄ$[]ÃU‰åSƒì$‹E‹U‰ë:E ‰$èTåþÿ‰Ã‹E‰$èGåþÿ‰\$‰$ègÿÿÿE ‰$èdøÿÿ‹U‰$èYøÿÿE‰D$E ‰$èÓúÿÿ„Àu°ë@‰Eè‹Eè‰$è Åþÿ‹U‹‰D$‹E‰$èûÿÿè€Âþÿ‰Eè‹]èè¥Äþÿ‰]è‹Eè‰$èÅþÿ‹EƒÄ$[]ÂU‰åSƒì$‹]Uø¶E÷ˆD$‹E‰D$ ‹E‰D$‹E ‰D$‰$è ÿÿÿƒì‹Eø‰‰Ø‹]üÉÂU‰åSƒì‹]Uø‹E‰D$ ‹E‰D$‹E ‰D$‰$è’ÿÿÿƒì‹Eø‰‰Ø‹]üÉÂU‰åSì„‹E‹P‹E‹@9„í‹E‹@Pè‹E‹H‹E‰T$‰L$‰$èÊýÿÿ‹E‹@P‹E‰P‹E‰D$E´‰$èãÿÿ‹E‹@ƒè‰EÐEЉD$Ẻ$èÅäþÿ‹E‹@ƒè0‰EØE؉D$EÔ‰$è§äþÿU¨‹ẺD$ ‹EÔ‰D$‹E ‰D$‰$èûÿÿƒìE ‰$èwãþÿ‰ÂE´‰D$‰$è¬ÞÿÿE´‰$è7áÿÿé’‰E‹]E´‰$è!áÿÿ‰]‹E‰$èÃþÿ‹E‰$èÞãþÿ‰Eô‹E‰$è@öÿÿ;Eô”À„Àt Ç$Väèâ¿þÿƒ}ôt ‹EôÀ‰E”ëÇE”‹M”‰Mø‹Eø;Eôs‹E‰$èúõÿÿ‰Eø‹U‹Eø‰D$‰$èÇúÿÿ‰EÜE܉D$E°‰$è°ãþÿ‹E°‰E¬‹E‰$è7ôÿÿ‰D$Eã‰$èàóÿÿ‹E‰D$Eä‰$è~ãþÿU¤Eã‰D$‹E°‰D$ ‹E ‰D$‹Eä‰D$‰$è×ýÿÿƒì‹E¤‰E¬Eã‰$èeóÿÿE¬‰$èbõÿÿ‹‹E‰Á‹E‰D$‰T$‰ $èäûÿÿë‰E‹]Eã‰$è-óÿÿ‰]éôE¬‰$è*õÿÿ‹E‰$è…óÿÿ‰D$Eë‰$è.óÿÿ‹EƒÀ‰D$Eì‰$èÉâþÿU Eë‰D$‹E¬‰D$ ‹Eì‰D$‹E ‰D$‰$è"ýÿÿƒì‹E ‰E¬Eë‰$è°òÿÿ‹E‰$èóÿÿ‰D$Eó‰$èÄòÿÿUœ‹E‰D$‰$è ôÿÿƒì‹Eœ‰ÃU˜‹E‰D$‰$èXâþÿƒì‹E˜‰ÂEó‰D$‰\$‰$è{÷ÿÿ鹉E‹]Eë‰$è9òÿÿ‰]ë‰E‹E‰$è Áþÿ‹E‰$è‘òÿÿ‰D$Eò‰$è:òÿÿEò‰D$‹E¬‰D$‹E°‰$è÷ÿÿEò‰$èèñÿÿE°‰$èåóÿÿ‹‹M‹Eø‰D$‰T$‰ $è[ùÿÿè6¾þÿ‰E‹]Eò‰$è¯ñÿÿ‰]ë‰E‹]èEÀþÿ‰]‹M‰ $è·ÀþÿEó‰$è†ñÿÿ‹E‹@‰Â‹E‹‰Ñ)Á‰ÈÁøiÀ«ªªª‰Á‹E‹‹U‰L$‰D$‰$èæøÿÿE°‰$èMóÿÿ‹‹E‰E¬‰$è;óÿÿ‹‹E‰PE°‰$è(óÿÿ‹‹Uø‰ÐÀÐÁà‹E‰Pë‰E‹]Eó‰$èöðÿÿ‰]‹E‰$èÀþÿ‹]üÉÃU‰åƒì‹E‹P‹E‹@9Ât/‹E‹P‹E‰Á‹E ‰D$‰T$‰ $èRùÿÿ‹E‹@P‹E‰Pë0Uü‹E‰D$‰$èòÿÿƒì‹Eü‰Â‹E ‰D$‰T$‹E‰$èûÿÿÉÃU‰åSƒì4‹E‰Eøë)E‰$èÎðÿÿ‰D$‹Eø‰$èIùÿÿE‰$è¬õÿÿƒEøE ‰D$E‰$èfõÿÿ„ÀuÁ‹Eø‰Eèë>‰Eä‹Eä‰$èì¾þÿ‹Eø‰D$‹E‰$è^òÿÿèe¼þÿ‰Eä‹]ä芾þÿ‰]ä‹Eä‰$èü¾þÿ‹EèƒÄ4[]ÃU‰åƒì¶EÿˆD$ ‹E‰D$‹E ‰D$‹E‰$è;ÿÿÿÉÃU‰åƒì‹E‰D$‹E ‰D$‹E‰$è·ÿÿÿÉÃU‰åSƒì4‹U‹E ‰D$‰$èGöÿÿ‰Eø‹E‰$èÏïÿÿ‰D$E÷‰$èxïÿÿE÷‰D$ ‹Eø‰D$‹E‰D$‹E‰$èˆÿÿÿE÷‰$èïÿÿ‹Eø‰EèëV‰Eä‹]äE÷‰$èïÿÿ‰]ä‹Eä‰$èÞ½þÿ‹U‹E ‰D$‹Eø‰D$‰$èuöÿÿèP»þÿ‰Eä‹]äèu½þÿ‰]ä‹Eä‰$èç½þÿ‹EèƒÄ4[]ÃU‰åVSƒÄ€‹E ;E„‹‹E ‰$è'Þþÿ‰Eð‹E‰$è9ðÿÿ;Eð’À„À„UÄ‹E ‰D$‰$èÝþÿƒì‹EĉÃUÀ‹E ‰D$‰$èGÝþÿƒì‹EÀ‰\$ ‰D$‹Eð‰D$‹E‰$è±þÿÿ‰Eô‹E‰$è™îÿÿ‰D$EÚ‰$èBîÿÿ‹E‹P‹E‹EÚ‰D$‰T$‰ $è‚ðÿÿEÚ‰$èëíÿÿ‹E‹@‰Â‹E‹‰Ñ)Á‰ÈÁøiÀ«ªªª‰Á‹E‹‹U‰L$‰D$‰$èKõÿÿ‹U‹Eô‰‹E‹‹Uð‰ÐÀÐÁà‹E‰Pé[‰E‹]EÚ‰$è}íÿÿ‰]‹E‰$蕼þÿ‹E‰$èòÜþÿ;Eð“À„À„åU¼‹E‰D$‰$è2Ýþÿƒì‹E¼‰ÃU¸‹E ‰D$‰$èLÜþÿƒì‹E¸‰ÆU´‹E ‰D$‰$èÜþÿƒì‹E´U°‰\$ ‰t$‰D$‰$èçðÿÿƒì‹E°‰EÔ‹E‰$èUíÿÿ‰D$EÛ‰$èþìÿÿU¬‹E‰D$‰$èFîÿÿƒì‹E¬‰ÂEÛ‰D$‰T$‹EÔ‰$èÌñÿÿEÛ‰$è•ìÿÿé]‰E‹]EÛ‰$èìÿÿ‰]‹M‰ $è—»þÿ‹E‹0‹E‰$èïÛþÿ‰EÜU¨‹E ‰D$‰$èBÛþÿƒì‹E¨‰EàU¤E܉D$Eà‰D$‰$èíÿÿƒì‹E¤‰ÃU ‹E ‰D$‰$èÛþÿƒì‹E ‰t$‰\$‰$èlðÿÿ‹E‰$èeìÿÿ‰D$Eç‰$èìÿÿ‹E‹XUœ‹E ‰D$‰$èêÚþÿƒì‹Eœ‰Æ‹E‰$èCÛþÿ‰EèU˜‹E ‰D$‰$è–Úþÿƒì‹E˜‰EìU”Eè‰D$Eì‰D$‰$èrìÿÿƒì‹E”‰ÂEç‰D$ ‰\$‰t$‰$è½ûÿÿEç‰$èTëÿÿë‰E‹]Eç‰$èAëÿÿ‰]‹E‰$èYºþÿ‹E‹‹Uð‰ÐÀÐÁà‹E‰P‹Eeø[^]ÃU‰åSƒì$‹E‰Eøë‹E‰D$‹Eø‰$èõóÿÿƒm ƒEøƒ} uàë>‰Eè‹Eè‰$èµ¹þÿ‹Eø‰D$‹E‰$è'íÿÿè.·þÿ‰Eè‹]èèS¹þÿ‰]è‹Eè‰$èŹþÿƒÄ$[]ÃU‰åƒì¶EÿˆD$ ‹E‰D$‹E ‰D$‹E‰$ècÿÿÿÉÃU‰åƒì‹E‰D$‹E ‰D$‹E‰$è·ÿÿÿÉÃU‰åSƒì$‹U‹E‰D$‹E ‰D$‰$è0ñÿÿ‹E‰$è—êÿÿ‰D$Eû‰$è@êÿÿ‹E‹Eû‰D$ ‹E‰D$‹E ‰D$‰$è‚ÿÿÿEû‰$èåéÿÿ‹E‹‹U ‰ÐÀÐÁà‹E‰Pë0‰Eè‹]èEû‰$è¸éÿÿ‰]è‹]è‹E‰$ègñÿÿ‰]è‹Eè‰$迸þÿƒÄ$[]ÃU‰å]Ãt&¼'U‰åWVSè^ÃeLƒìèÛ´þÿƒÿÿÿ‰Eðƒÿÿÿ)EðÁ}ð‹Uð…Òt+1ÿ‰Æ¶‹EƒÇ‰D$‹E ‰D$‹E‰$ÿƒÆ9}ðu߃Ä[^_]Ë$ÃU‰åS»¨$ƒì¡¨$ƒøÿt ƒëÿЋƒøÿuôƒÄ[]ÃU‰åSƒìè[ÃÌK耸þÿY[ÉÃ---------------TEST1---------------192.168.150.123STATE :---------------IDATA---------------MAGNET :POLE :FAIL :MEASVOLTAVER :MEASCURRAVER :--------------------------------------------------MAGNET------------------------------MDATA--------------- , ---------------TEST2--------------------------------nbr frame:nbr errsec:rms:average:nbr err:---------------TEST3---------------VERSION: Meas volt: ---------------TEST4---------------current sett: Meas volt aver: Meas curr aver: ð¿333333ó?š™™™™™É?š™™™™™¹?ItestException exception caught on magnetitest::TMagnet::polePole number does not existItestException exception caught while trying "itest::Socket::writeObject constructor failed"->Connection faileditest::Socket::queryCould not read data on peripheralSocket erroritest::TBilt::queryBilt query failed:i;:fdata?,ZYX/Pole (I)itest::TPole::get_fdataFdata could not be readUnknown exception caugth on magnetUnknown error;:lim:fail:str?itest::TPole::get_str_alarmAlarm string could not be read;:lim:fail?itest::TPole::get_num_alarmAlarm number could not be read;:curr:dc?itest::TPole::get_current_DCCurrent value could not be read;:switch?itest::TPole::get_switchSwitch could not be read;:idata?itest::TPole::get_idataIdata could not be read;:meas:volt:aver?itest::TPole::get_measure_voltage_averAverage voltage measure could not be read;:meas:curr:aver?itest::TPole::get_measure_current_averAverage current measure could not be read;:meas:volt?itest::TPole::get_measure_voltageVoltage measure could not be read;:meas:curr?itest::TPole::get_measure_currentCurrent measure could not be read:stat?itest::TPole::get_stateState could not be read:syst:vers?itest::TMagnet::get_bilt_versBilt firware version could not be read:syst:err?itest::TMagnet::clear_all_errAlarm could not be cleared:p;:mdata?itest::TMagnet::get_mdataMdata could not be readitest::TMagnet::get_stateitest::TBilt::writeBilt write failedBilt command failed;:frstitest::TPole::clear_ferrorsfeedback errors could not be cleared;:switch itest::TPole::set_switchSwitch state could not be changeditest::TMagnet::set_switchSwitch could not be changed;:curr:ac itest::TPole::set_current_ACCurrent AC could not be changed;:curr:dc itest::TPole::set_current_DCCurrent could not be changed:stat:clearitest::TMagnet::clear_alarm:stat itest::TMagnet::set_stateState could not be changeditest::TMagnet::operator=Magnet could not be affecteditest::TMagnet::TMagnetMagnet could not be copiedUnknown exception caugthUnknown exceptionvector::_M_insert_auxunknown errorunknownÄä­J­Üä^¯²®N5itest14ItestExceptionE¨&¨äN5itest5ErrorE¨&Ìä;ð}®þÿpF®þÿ^®þÿ°r®þÿð8ÌþÿNÌþÿ0dÌþÿPhÎþÿДÏþÿ ÚÏþÿ@òÏþÿ`Ðþÿ€´Ñþÿ @ÔþÿÀÖþÿà¦Øþÿ–Üþÿ$ÈåþÿHúçþÿlŒôþÿZýþÿ´0ÿÿØÿÿüÜÿÿ ¨ ÿÿD~)ÿÿhT2ÿÿŒ*;ÿÿ°DÿÿÔÐLÿÿø$TÿÿZ[ÿÿ@Êbÿÿd@jÿÿˆâÕDþA…B Hƒ† èëÕÿA…B Hƒ† êóÕÌÿA…B Hƒ† 0ÀüÌA…B Hƒ† TŒÕ\A…B Hƒ† xbÕ A…B Hƒ† œ8ÕäA…B Hƒ† À Õ¨A…B Hƒ† ää(ÏlA…B Hƒ† ´1T0A…B Hƒ† ,95ôA…B Hƒ† P>@p¸A…B Hƒ† t®Gv„A…B Hƒ† ˜$OüHA…B Hƒ† ¼ U­ÜA…B Hƒ† àÎ]Õ  A…B Hƒ† ¤fHd A…B Hƒ† (ìlÑ A…B Hƒ† L¾uÑÔ A…B Hƒ† p~Q˜ A…B Hƒ† ”â…|\ A…B Hƒ†¸^A…B Ø|A…B øšA…B ®RA…B 8ŽRA…B XRŽA…B xfŽ’A…B G‡˜ø’A…B G‡¸Š‘A…B  ؤ‘ A…B Hƒ† ü¸™˜ÜA…B Hƒ† P¡˜˜A…B Hƒ† Dè¨âTA…B Eƒ† hʪâA…B Eƒ†Œ¬¬A…B ¬ȬA…B ÌÖÄA…B ìîÄ!A…B  Å"A…B ,2ÅA…B LLÅ|ÌA…B DƒlÈÅIA…B ŒÆ%A…B  ¬8ÆaA…B Fƒ†‡ÐšÆCA…B DƒðÞÆ:A…B Dƒ Ç)A…B 0 rÇ>A…B P °Ç"A…B p ÒÇA…B  2ÈIA…B ° |È%A…B  Ð ¢ÈaA…B Fƒ†‡ô ÉCA…B Dƒ HÉ>A…B 4 †É$A…B T ªÉ~ØA…B Dƒt °Ê™äA…B Dƒ” J­wñA…B Dƒ´ ­wA…B DƒÔ :®wA…B Dƒô ²®¬!A…B Dƒ ^¯¬6A…B Dƒ4 °¬KA…B DƒT ¶°´`A…B Dƒt JËcvA…B Dƒ” ®Ëc‚A…B Dƒ´ Ì®A…B DƒÔ ÀÌCA…B Dƒô Í;A…B Dƒ @̓¬A…B Gƒ4 ÄÑwA…B T j±A…B t ˆ±xA…B ” <ÒøA…B Dƒ´ ÚÒ)A…B Ô Ó!A…B ô &ÓÈA…B Dƒ  îÓ©0A…B Eƒ†8 ²{[A…B DƒX |²{gA…B Dƒx ˜×utA…B Dƒ˜ Ø)A…B ¸ 8Ø!A…B Ø ZعŒA…B Dƒø ø²´žA…B Dƒ¬³¥´A…B Dƒ8R´|ÉA…B DƒXδ¥ÝA…B DƒxtµAòA…B Dƒ˜¶¶|A…B Dƒ¸2·A#A…B DƒØt¸F@A…B Dƒøº¹Ú]A…B Dƒ”ºÚA…B Dƒ8n»ð¡A…B DƒX^¼ðÃA…B DƒxN½ðåA…B Dƒ˜>¾ðA…B Dƒ¸.¿)A…B DƒØ0ÀVA…B Dƒø2ÁFƒA…B DƒzR| ˆàÿÿA…B 8àÿÿiA…B Cƒ†‡ÿÿ $9€ÿÐÄ#1î:?³:M:a+Æ«áÔíÆú¿ÎÇÏ9ù!ä¹×Ðä˜!¿ì"å"Ï9—#3è'Ó#O´'³$ªí&æ&´'ª'è'œ){À*¹*Ï9ë*3Ä6§+6½+ü É5Â56†6Ä6ø7{œ9•9Ï9È9:ú9³:¬:î:Û:”;}Ääÿÿ6AVp•Šª¼µŠûJŠÕçàŠƒ¤ÿMD+M'Δà©ÑÊ“ŒÊÆàÙ˜¯÷}ÿÿ!PIë—ª¨ë¢ÿÿ'$L“žÍÆö™Òö»Í„ÿQI1GX¨6ëä¯ÒÍî¶vÒzºÕ6˜‘ºÜÿú›ã}ÿ¨¡1GX¨6ëä¯ÒÍî¶}ÙzÁÜ6Ÿ˜Áㆢê¸Ä ç â ƒ © H— zÿ š 6Ý Ö ÿ ¡ Ä ¿ à ¨5îhÍß9¥žÍ슫ö}ÿE6ó1±VÇkƒ|ǽó †Çê冑~}}{Ääÿ¤‹û =<Ç Œ¡šÇ ôžÈƒ Öúðƒ ΃ Ü÷ƒ Õƒ ã†üƒ Úƒ 舃 Þ<ƒ £Å¾ƒ üÇ ½ û · û ³ {Ç Î Ü ã ÷ ‹ – » Í Æ – ÷ ðÜ Õ« ¦Ç Ƚ Ä{‰ ßí ôˆ œ§ ÌÞ ×§  ˆ í æ¼ ·Ø ø}}~}}Ääÿ¼¥°=<댡šëä°ì° è{ü ƒ‘ ˜¬ ÀË ð‚ ûË Ä¬ ¥‘ Šà Ûü ý ò ù {¾ ” ¢ © ½ Ñ Ü “ Œ Ü Õ ½ ¶¢ ›ñ ì ­}}~}}Ääÿ¼¥¸=<󌡚óì¸ô¸ ð{„ ‹™  ´ ÈÓ øŠ ƒÓ Ì´ ­™ ’è ã„ … ú {Æ œ ª ± Å Ù ä ‰ › ” ä Ý Å ¾ª £ù ô• µ}}~}}Ääÿ¼¥¸=<󌡚óì¸ô¸ ð{„ ‹™  ´ ÈÓ øŠ ƒÓ Ì´ ­™ ’è ã„ … ú {Æ œ ª ± Å Ù ä ‰ › ” ä Ý Å ¾ª £ù ô• µ}}~}}Ääÿ¼¥¸=<󌡚óì¸ô¸ ð{„ ‹™  ´ ÈÓ øŠ ƒÓ Ì´ ­™ ’è ã„ … ú {Æ œ ª ± Å Ù ä ‰ › ” ä Ý Å ¾ª £ù ô• µ}}~}}ÄäÿÄ«µ=<Œ¡šé÷µñµ í{ ˆ– ± ÅÐ õ‡ €Ð ɱ ª– å à ‚ ÷ þ {à ™ § ® Â Ö á † ˜ ‘ á Ú Â »§  ö ñ’ ²}}~}}Ääÿ¼¥¸=<󌡚óì¸ô¸ ð{„ ‹™  ´ ÈÓ øŠ ƒÓ Ì´ ­™ ’è ã„ … ú {Æ œ ª ± Å Ù ä ‰ › ” ä Ý Å ¾ª £ù ô• µ}}~}}Ääÿ¼¥¸=<󌡚óì¸ô¸ ð{„ ‹™  ´ ÈÓ øŠ ƒÓ Ì´ ­™ ’è ã„ … ú {Æ œ ª ± Å Ù ä ‰ › ” ä Ý Å ¾ª £ù ô• µ}}~}}Ääÿ¼¥¸=<󌡚óì¸ô¸ ð{„ ‹™  ´ ÈÓ øŠ ƒÓ Ì´ ­™ ’è ã„ … ú {Æ œ ª ± Å Ù ä ‰ › ” ä Ý Å ¾ª £ù ô• µ}}~}}Ääÿ¼¥¸=<󌡚óì¸ô¸ ð{„ ‹™  ´ ÈÓ øŠ ƒÓ Ì´ ­™ ’è ã„ … ú {Æ œ ª ± Å Ù ä ‰ › ” ä Ý Å ¾ª £ù ô• µ}}~}}Ääÿ¼¥²=<팬¥íæ²î² ê{þ …“ š® ÂÍ ò„ ýÍ Æ® §“ Œâ Ýþ ÿ ô û {À – ¤ « ¿ Ó Þ ƒ • Ž Þ × ¿ ¸¤ ó î ¯}}~}}Ääÿ¼£“2*Îo„}ÎÇ“Ïå ñ'± ¸Æ Íá õ€ ¥· °€ ùá ÚÆ ¿• ± ²ù Ô'Å › © ° Ä Ø ã ˆ š “ ã Ü Ä ½ © ¢ ø ó ” ´}}~}}Ääÿ¼¢ú2Æ_|uƼú¶Ì Ø'˜ Ÿ­ ´È Üç Œž —ç àÈ Á­ ¦ü ÷˜ ™à »'¬ ‚  — « ¿ Ê ï  ú Ê Ã « ¤  ‰ ß Ú û ›}}~}}ÄäÿÄ«µ=<Œ¡šé÷µñ‡ “'Ó Úè ïƒ —¢ ÇÙ Ò¢ ›ƒ üè á· ²Ó Ô› ö'ç ½ Ë Ò æ ú … ª ¼ µ … þ æ ß Ë Ä š • ¶ Ö}}~}}Ääÿ¼¥µ=<ðŒ¯¨ðéµñ‡ “'Ó Úè ïƒ —¢ ÇÙ Ò¢ ›ƒ üè á· ²Ó Ô› ö'ç ½ Ë Ò æ ú … ª ¼ µ … þ æ ß Ë Ä š • ¶ Ö}}~}}ÄäÿŒ~Ä 1* k}v ÑÒæøñÒÅW ¬¸ÁÖϸ‘÷¸ÛÖ÷¶ ¾|Ì Ã6† ÿÌ Ü ÿ ú › ‰ Ä â ~}}{Ääÿ¼¥–=<⌞—âØ–Ò– Î{â é÷ þ’ ¦± Öè á± ª’ ‹÷ ðÆ Áâ ã Ø ß {¤ ú ˆ £ ·  ç ù ò  » £ œˆ × Òó “}}~}}Ääÿ¼¥%¾SNŠ´Æ¿Š€¾ú¾ ö{Š ‘Ÿ ¦º ÎÙ þ ‰Ù Òº ³Ÿ ˜î éŠ ‹ € ‡ {Ì ¢ ° · Ë ß ê ¡ š ê ã Ë Ä° ©ÿ ú› »}}~}}Ääÿ¤5I…ý›ÉÐÞåù˜½ÏȘ‘ùòÞ×­ ¨ÉÊó à¿ •£ ª¾ ÒÝ‚”ÝÖ¾ · £ œ ò í Ž ® }~}}Ääÿ¼¥.ºON†°Â»†üºöº ò{† › ¢¶ ÊÕ úŒ …Õ Î¶ ¯› ”ê å† ‡ ü ƒ {È ž ¬ ³ Ç Û æ ‹  – æ ß Ç À¬ ¥û ö— ·}}~}}Ääÿ¼¥.ºON†°Â»†üºöº ò{† › ¢¶ ÊÕ úŒ …Õ Î¶ ¯› ”ê å† ‡ ü ƒ {È ž ¬ ³ Ç Û æ ‹  – æ ß Ç À¬ ¥û ö— ·}}~}}Ääÿ¼¥–=<⌞—âØ–Òè ô'´ »É Ðä øƒ ¨º ³ƒ üä ÝÉ Â˜ “´ µü ×'È ž ¬ ³ Ç Û æ ‹  – æ ß Ç À ¬ ¥ û ö — ·}}~}}Ääÿ¼¥%ÁVN·ÉƒÁý“ Ÿ'ß æô û £® Óå Þ® § ˆô íà ¾ß à§ ‚ 'ó É × Þ ò † ‘ ¶ È Á ‘ Š ò ë × Ð ¦ ¡  â}}~}}Ääÿ´›d¨Ò¥¿ƒÒޤ °'ð ÷… Œ  ´¿ äö ï¿ ¸  ™… þÔ Ïð ñ ¸ “ '„ Ú è ï ƒ — ¢ Ç Ù Ò ¢ › ƒ ü è á · ²Ó ó}}~}}Ääÿ´››Ý¹Ó—Ý™¯ »'û ‚ —« ¿Ê ï úÊ Ã« ¤ ‰ß Úû üà ž ' å ó ú Ž ¢ ­ Ò ä Ý ­ ¦ Ž ‡ ó ì  ½ Þ þ}}~}}Ääÿ´››Ý¹Ó—Ý™¯ »'û ‚ —« ¿Ê ï úÊ Ã« ¤ ‰ß Úû üà ž ' å ó ú Ž ¢ ­ Ò ä Ý ­ ¦ Ž ‡ ó ì  ½ Þ þ}}~}}Ääÿ5#‰ž¡¸Ûžé‰„¨Ë}}Ääÿ5#‰ž¡¸Ûžé‰„¨Ë}}Ääÿÿ:Wqÿÿ&Ysÿÿ :]Žÿÿ 5.Xÿÿ 5.Xÿÿ 5.Xÿÿ5.jcÿÿ5.jcÿÿ5.jcÿÿ$<ŒTs©ÿÿ07Xÿÿ07Xÿ0c€ ŠžÿI>;&¸$ìâ†y訡²œ’ß¼Ð®}ÿ $Vq {ÿQi¡¦º}ÿÿ'‚½ªÄ“¨Â|Ôæ€ÿÿLSpÿÿLSpÿ 1L VjÿÿWƒ®ÿÿ$<ŒTs©ÿÿ!6}Kdšÿÿ0EWPqÿÿ!6}Kdšÿÿ3le¿†¸ô¶ÿÿ0EWPqÿÿ3le¿†¸ô¶ÿÿ4ngˆ»ù»ÿÿ"“FXQ“Œ²­Ïÿÿ"“FXQ“Œ²­Ïÿÿ"©FXQ©¢ÈÃåÿÿ"©FXQ©¢ÈÃåÿÿ"©FXQ©¢ÈÃåÿÿ"©FXQ©¢ÈÃåÿÿ)"†FXQ†Ú ²Ä½Ú÷ÿÿ)"†FXQ†Ú ²Ä½Ú÷ÿÿ4ngˆ»ù»ÿÿÿÿ*“¾´ÿÿÿÿjt‘ $Ž ÈÙõþÿoh´…¤ s  %àDŒ,Œþÿÿo¬‹ÿÿÿoðÿÿo(‹¼$RŽbŽrނޒޢ޲ŽÂŽÒŽâŽòŽ"2BRbr‚’¢²ÂÒâò"2BRbr‚’¢²ÂÒâò‘‘"‘2‘B‘R‘b‘r‘‚‘’‘¢‘²‘‘Ò‘â‘ò‘’GCC: (GNU) 4.1.2 20070502 (Red Hat 4.1.2-12)GCC: (GNU) 4.1.2 20070502 (Red Hat 4.1.2-12)GCC: (GNU) 4.1.2 20070925 (Red Hat 4.1.2-27)GCC: (GNU) 4.1.2 20070925 (Red Hat 4.1.2-27)GCC: (GNU) 4.1.2 20070925 (Red Hat 4.1.2-27)GCC: (GNU) 4.1.2 20070925 (Red Hat 4.1.2-27)GCC: (GNU) 4.1.2 20070925 (Red Hat 4.1.2-27)GCC: (GNU) 4.1.2 20070502 (Red Hat 4.1.2-12).symtab.strtab.shstrtab.interp.note.ABI-tag.gnu.hash.dynsym.dynstr.gnu.version.gnu.version_r.rel.dyn.rel.plt.init.text.fini.rodata.eh_frame_hdr.eh_frame.gcc_except_table.ctors.dtors.jcr.dynamic.got.got.plt.data.bss.comment44#HH 1öÿÿohh<; ¤¤C´…´sKÿÿÿo(‹( ‚Xþÿÿo¬‹¬ €g ,Œ, p DŒD à y$Ž$t<Ž<Ð’¸G…ÈÙÈY‹èÙèYü “ääädô¡ØèØhl«DùDy\½ $ ”İ$°”˸$¸”м$¼”àÙœ%œ•Þ % •üçœ&œ–í & –Ðò –p˜û¼ð8 ¬°*4Hh¤´…(‹¬‹,ŒDŒ $Ž <Ž ’ ÈÙ èÙääØèDù $°$¸$¼$œ% %œ& &4’ ñÿ $*°$8¸$E\'S`'b`’ xÀ’ ñÿ„¬$‘@ùŸ¸$« Ù ÁñÿÏ*“ áä’E h'B“ 'ñÿ7¾´ áx´E l'Ö´ Yñÿg %} $Ž $¡¼$ªœ& µÑÅ"" ö!ò8@̓" ™²®¬ ­Äv×J­w õj± (”²#" Tòk¶.¿ W·fÃ" ê Ù úfÊI" )8Õ Pš d€Ã"  U­ ±’ ¸~Q Ù2ÁF í8Ø!" 6¤fH V °¬ jëÕ Œ&ÓÈ" ü   ;èÙBL³‡" V'j$à " ·ÉC" g2ÈÙ 8ÀÌC" ¦r»eÕÆúz °Ç"" fÀüÌ Œ¸™˜ ¦®R ¼zÁ2  Ø=! º> †Â" o Zع" ¡ …» ø’ Ò Ì®" T ÚÒ)" Ä fŽ’ Û .Ä&"   2< îÄ!" u ’ ÞÆ:"  Ô³R 0 œU ze è¨â ~ ˆ±x   |å ¶Ä" 0 ìÙ? xÂ" G a^ º¹Ú € ¬³¥ Ÿ |²{ Ú È¬ ò 2ÈI" TÌä!gÈ" ³îÓ©" ߘ×u" .œ&;®Gv Y´1T |tµA š<¬ø²´ Ä^ ÙŠ‘ ïH±:" â…| ! &,!S®Ä" ¢HÉ>" Ý$¹Â ö²V" 1°Ê™" Y¶°´ qÞÌ’  —RŽ «òÂнï Þ¾uÑ ˜¶‹ ȱ," DšÆC" ¯¦Â" ÉÇ)" *VJÐ&Œaô±" ±òÓN½ð û"ʪâ 1ðÙ>t¸F R"d´$q¸²>" ¿0Ùi Ïæº¤ ûÃ" =δ¥ \¢Èa" ãÆ%" ²{ Pògä(Ï ƒ+“(Ê" Òn»ð û¨ä!›+#;¤Ä " kg¶’Șä!ÛZùo 0À (œ±+" U± " xR´| «ºÂ" Å­w ãÖÄ" ªÉ~" 9pÙÍ Z± " zÄÑw" ®”ºÚ ÐÒÇ" 5¤‘ O &ñÿ[ü±8" Ù2Í;" ®.Ã7" ï¦5‚± " Ó!" ÿ8Æa" ‡ìÇ/" ã¬Ê1 þú# Õ JšÃ>" ™³Î]Õ ÑØ)" 4²P" 8ÌÄ " q>¾ð ™™ºŒ±" h rÇ>" Š 2·A ¨ ˆä!Å ŒÕ ñ <Ê)" 1!ÎÂ" f!>@p Ž!j¦!p'ñÿ«!É!LÅ|" õ!ìlÑ "ŽR -"95 P":®w n"ØÃV" —"&´R ·"^¼ð à"^¯¬ ô"Ÿ#Æ!#EG#†É$" #d'ˆ# Â" ¹#ÈÅI" $>âÕ 2$|‘Sz$Üä!$P¡˜ §$¢Å$ŒÂ" ß$Ã" % &ñÿ#%=%€Â" F%TÄP" v%¬‘ü—%$Oü ²%N&„²" W&êóÕ u&<Ò" ù&ê´® 'bÕ D'ÔÂ" b'2±" v'2Å" ¥'é½'îÂ" Û'F(®Ëc" 0(¶¶| b(*|(¬¬ ’(±" ¦(BÇ/" )Ää!)™Ù 5)V“­ :)$Ž @)JËc" )| –)ü‘+Þ)|È%" call_gmon_startcrtstuff.c__CTOR_LIST____DTOR_LIST____JCR_LIST__dtor_idx.5845completed.5843__do_global_dtors_auxframe_dummy__CTOR_END____FRAME_END____JCR_END____do_global_ctors_auxTestClass.cpp_GLOBAL__I_Magnet_Z41__static_initialization_and_destruction_0ii_ZSt8__ioinit__tcf_0ClassMagnet.cpp_GLOBAL__I__ZN5itest6SocketC2EPKcException.cpp_GLOBAL_OFFSET_TABLE___init_array_end__init_array_start_DYNAMICdata_start__errno_location@@GLIBC_2.0_ZSt8_DestroyIPN5itest5ErrorEEvT_S3__ZSt20__throw_length_errorPKc@@GLIBCXX_3.4_ZNSolsEd@@GLIBCXX_3.4_ZNSt6vectorIN5itest5ErrorESaIS1_EE13_M_insert_auxEN9__gnu_cxx17__normal_iteratorIPS1_S3_EERKS1__ZN5itest5ErrorD0Ev_ZNSsC1Ev@@GLIBCXX_3.4connect@@GLIBC_2.0_ZN5itest14ItestExceptionD0Ev_ZN5itest14ItestException10push_errorERKNS_5ErrorE_ZNSt6vectorIN5itest5ErrorESaIS1_EE5beginEv_ZNSolsEi@@GLIBCXX_3.4strerror@@GLIBC_2.0_ZN5itest14ItestExceptionC1Ev__cxa_atexit@@GLIBC_2.1.3_ZNSt12_Vector_baseIN5itest5ErrorESaIS1_EEC2ERKS2___libc_csu_fini_ZNSt12_Vector_baseIN5itest5ErrorESaIS1_EED2Ev_ZN5itest5TPole19get_measure_voltageEv_ZN5itest5TBiltD1Ev_ZNSt6vectorIN5itest5ErrorESaIS1_EEC1ERKS2__ZN5itest5TPole13clear_ferrorsEv_start_ZN5itest7TMagnet11clear_alarmEv_ZN5itest5ErrorC2Ev_ZSt24__uninitialized_fill_n_aIPN5itest5ErrorEjS1_S1_EvT_T0_RKT1_SaIT2_E_ZN5itest7TMagnet10set_switchEb_ZN5itest5ErrorD2Ev_ZN5itest5TPole14get_current_DCEv_ZNSt6vectorIN5itest5ErrorESaIS1_EE20_M_allocate_and_copyIN9__gnu_cxx17__normal_iteratorIPKS1_S3_EEEEPS1_jT_SB___gmon_start___Jv_RegisterClasses_ZNKSs5c_strEv@@GLIBCXX_3.4_fp_hw_ZN5itest5mdataC1Ev_ZdlPv@@GLIBCXX_3.4_ZNK9__gnu_cxx17__normal_iteratorIPKN5itest5ErrorESt6vectorIS2_SaIS2_EEEdeEv_ZSt13copy_backwardIN9__gnu_cxx17__normal_iteratorIPN5itest5ErrorESt6vectorIS3_SaIS3_EEEES8_ET0_T_SA_S9_strchr@@GLIBC_2.0_fini_ZSt18uninitialized_copyIN9__gnu_cxx17__normal_iteratorIPN5itest5ErrorESt6vectorIS3_SaIS3_EEEES8_ET0_T_SA_S9_inet_addr@@GLIBC_2.0__cxa_rethrow@@CXXABI_1.3_ZNSt8ios_base4InitC1Ev@@GLIBCXX_3.4write@@GLIBC_2.0_ZSt8_DestroyIN9__gnu_cxx17__normal_iteratorIPN5itest5ErrorESt6vectorIS3_SaIS3_EEEEEvT_S9__ZN5itest5TPole9get_idataEPNS_5idataE_ZN5itest7TMagnetC1ERKS0__ZN5itest7TMagnetD1Ev_ZN5itest6Socket5queryERKSs_ZNKSt19basic_ostringstreamIcSt11char_traitsIcESaIcEE3strEv@@GLIBCXX_3.4__libc_start_main@@GLIBC_2.0_ZN9__gnu_cxx13new_allocatorIN5itest5ErrorEEC2Ev_ZNSt6vectorIN5itest5ErrorESaIS1_EEC1EjRKS1_RKS2__ZNSsC1ERKSs@@GLIBCXX_3.4_ZN5itest6SocketC2EPKc_ZSt24__uninitialized_copy_auxIN9__gnu_cxx17__normal_iteratorIPN5itest5ErrorESt6vectorIS3_SaIS3_EEEES8_ET0_T_SA_S9_12__false_type_ZSt18uninitialized_copyIN9__gnu_cxx17__normal_iteratorIPKN5itest5ErrorESt6vectorIS3_SaIS3_EEEEPS3_ET0_T_SC_SB__ZN5itest6SocketC1EPKc_ZNSt6vectorIN5itest5ErrorESaIS1_EE3endEvhtons@@GLIBC_2.0_ZNKSs13find_first_ofEcj@@GLIBCXX_3.4_ZSt13__destroy_auxIPN5itest5ErrorEEvT_S3_12__false_type_ZNKSs6lengthEv@@GLIBCXX_3.4_ZNSt13__copy_normalILb1ELb0EE6copy_nIN9__gnu_cxx17__normal_iteratorIPKN5itest5ErrorESt6vectorIS5_SaIS5_EEEEPS5_EET0_T_SE_SD__ZN5itest5TPoleC2EPNS_5TBiltEii_ZNSt8ios_base4InitD1Ev@@GLIBCXX_3.4read@@GLIBC_2.0_ZN5itest7TMagnetC1EPKci_ZN5itest14ItestExceptionaSERKS0__ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc@@GLIBCXX_3.4_ZN9__gnu_cxx17__normal_iteratorIPN5itest5ErrorESt6vectorIS2_SaIS2_EEEppEv_IO_stdin_used_ZnwjPv_ZNSsD1Ev@@GLIBCXX_3.4_ZN5itest14ItestExceptionC1ERKS0__ZN5itest5ErrorC1ERKSsS2_S2_ii_ZN5itest14ItestExceptionC2ERKSt6vectorINS_5ErrorESaIS2_EE_ZN5itest5ErroraSERKS0__ZNSt15__copy_backwardILb0ESt26random_access_iterator_tagE6copy_bIPN5itest5ErrorES5_EET0_T_S7_S6__ZTSN5itest5ErrorE_ZN9__gnu_cxx17__normal_iteratorIPKN5itest5ErrorESt6vectorIS2_SaIS2_EEEppEv_ZNSt6vectorIN5itest5ErrorESaIS1_EEaSERKS3__ZSt26__uninitialized_fill_n_auxIPN5itest5ErrorEjS1_EvT_T0_RKT1_12__false_type__data_start_ZN5itest7TMagnet9get_stateEv_ZN5itest7TMagnet13get_bilt_versEv_ZN5itest5ErrorC1EPKcS2_S2_iisocket@@GLIBC_2.0_ZN5itest5ErrorC2ERKS0__ZN5itest6SocketD1Ev_ZN5itest5TBiltC1EPKc_ZN5itest5mdataD1Ev_ZN5itest7TMagnet9set_stateEb_ZTVN10__cxxabiv117__class_type_infoE@@CXXABI_1.3_ZNK9__gnu_cxx17__normal_iteratorIPN5itest5ErrorESt6vectorIS2_SaIS2_EEE4baseEv_ZN9__gnu_cxx13new_allocatorIN5itest5ErrorEE8allocateEjPKv_ZN5itest16parse_fill_idataEPKcPNS_5idataEi_ZNSt6vectorIN5itest5ErrorESaIS1_EEixEj_ZNSt6vectorIN5itest5ErrorESaIS1_EED1Ev_ZN5itest5ErrorC1ERKS0__ZN5itest5TPole9get_fdataEPNS_5fdataE_ZN5itest5TBiltD2Ev_ZNSolsEb@@GLIBCXX_3.4_ZN5itest6Socket5writeERKSs_ZN5itest5TPole14set_current_DCEd_ZN5itest7TMagnet4poleEi_ZNKSt6vectorIN5itest5ErrorESaIS1_EE3endEv_ZSt4copyIN9__gnu_cxx17__normal_iteratorIPKN5itest5ErrorESt6vectorIS3_SaIS3_EEEENS1_IPS3_S8_EEET0_T_SD_SC__ZNSaIN5itest5ErrorEED1Ev_ZSt4copyIN9__gnu_cxx17__normal_iteratorIPKN5itest5ErrorESt6vectorIS3_SaIS3_EEEEPS3_ET0_T_SC_SB__ZNSsC1EPKcRKSaIcE@@GLIBCXX_3.4_ZSt4cout@@GLIBCXX_3.4_ZNK9__gnu_cxx17__normal_iteratorIPKN5itest5ErrorESt6vectorIS2_SaIS2_EEE4baseEv__cxa_call_unexpected@@CXXABI_1.3_ZN5itest14ItestExceptionC1EPKcS2_S2_ii_ZSt9terminatev@@GLIBCXX_3.4_ZN5itest7TMagnetC2EPKci__dso_handle_ZN5itest5ErrorC1Evstrcpy@@GLIBC_2.0__DTOR_END___ZNK9__gnu_cxx17__normal_iteratorIPN5itest5ErrorESt6vectorIS2_SaIS2_EEEplERKi__libc_csu_init_ZN5itest16parse_fill_mdataEPKcPNS_5mdataEi_ZNSt12_Vector_baseIN5itest5ErrorESaIS1_EE19_M_get_Tp_allocatorEv_ZN5itest5ErrorC2ERKSsS2_S2_ii_ZNSt22__copy_backward_normalILb1ELb1EE8copy_b_nIN9__gnu_cxx17__normal_iteratorIPN5itest5ErrorESt6vectorIS5_SaIS5_EEEESA_EET0_T_SC_SB__ZSt10__copy_auxIPKN5itest5ErrorEPS1_ET0_T_S6_S5__ZN5itest14ItestExceptionC1ERKSt6vectorINS_5ErrorESaIS2_EE_ZNSolsEj@@GLIBCXX_3.4_ZN5itest5TPole9get_stateEvatoi@@GLIBC_2.0_ZN9__gnu_cxx13new_allocatorIN5itest5ErrorEE10deallocateEPS2_j_ZN5itest14ItestExceptionC1ERKSsS2_S2_ii_ZTSN5itest14ItestExceptionE_Znwj@@GLIBCXX_3.4atof@@GLIBC_2.0_ZNKSt6vectorIN5itest5ErrorESaIS1_EE8max_sizeEv_ZNSt19basic_ostringstreamIcSt11char_traitsIcESaIcEE3strERKSs@@GLIBCXX_3.4select@@GLIBC_2.0_ZTVN5itest5ErrorE_ZNKSs6substrEjj@@GLIBCXX_3.4close@@GLIBC_2.0_ZN5itest14ItestExceptionC2Ev_ZNKSt6vectorIN5itest5ErrorESaIS1_EE5beginEv_ZN5itest7TMagnet13addrIP_magnetEv_ZN5itest14ItestException10push_errorERKSsS2_S2_ii_ZNSaIN5itest5ErrorEED2Ev_ZN5itest14ItestExceptionD1Ev_ZSt8_DestroyIN5itest5ErrorEEvPT__ZNSt12_Vector_baseIN5itest5ErrorESaIS1_EEC2EjRKS2__ZN5itest5TPole13get_str_alarmEv_ZN5itest7TMagnet10num_magnetEv_ZNSt6vectorIN5itest5ErrorESaIS1_EE9push_backERKS1__ZN5itest14ItestExceptionC2ERKS0__ZSt8_DestroyIN9__gnu_cxx17__normal_iteratorIPN5itest5ErrorESt6vectorIS3_SaIS3_EEEES3_EvT_S9_SaIT0_E_ZN5itest7TMagnetaSERKS0___bss_start_ZN9__gnu_cxxmiIPKN5itest5ErrorES4_St6vectorIS2_SaIS2_EEEENS_17__normal_iteratorIT_T1_E15difference_typeERKSB_RKNS8_IT0_SA_EE_ZStlsIcSt11char_traitsIcESaIcEERSt13basic_ostreamIT_T0_ES7_RKSbIS4_S5_T1_E@@GLIBCXX_3.4_ZSt22__uninitialized_copy_aIN9__gnu_cxx17__normal_iteratorIPN5itest5ErrorESt6vectorIS3_SaIS3_EEEES8_S3_ET0_T_SA_S9_SaIT1_E_ZNSt12_Vector_baseIN5itest5ErrorESaIS1_EE12_Vector_implC1ERKS2__ZNSt19basic_ostringstreamIcSt11char_traitsIcESaIcEED1Ev@@GLIBCXX_3.4_ZNK9__gnu_cxx17__normal_iteratorIPN5itest5ErrorESt6vectorIS2_SaIS2_EEEdeEv_ZSt22__uninitialized_copy_aIN9__gnu_cxx17__normal_iteratorIPKN5itest5ErrorESt6vectorIS3_SaIS3_EEEEPS3_S3_ET0_T_SC_SB_SaIT1_E_ZNSt13__copy_normalILb1ELb1EE6copy_nIN9__gnu_cxx17__normal_iteratorIPKN5itest5ErrorESt6vectorIS5_SaIS5_EEEENS3_IPS5_SA_EEEET0_T_SF_SE__ZN9__gnu_cxxneIPKN5itest5ErrorESt6vectorIS2_SaIS2_EEEEbRKNS_17__normal_iteratorIT_T0_EESD__ZN5itest5TBilt5queryERKSs__cxa_allocate_exception@@CXXABI_1.3_ZN5itest5TPole19get_measure_currentEv_ZNK9__gnu_cxx17__normal_iteratorIPKN5itest5ErrorESt6vectorIS2_SaIS2_EEEplERKi_ZNSaIcED1Ev@@GLIBCXX_3.4_ZN5itest5TPole10set_switchEb_ZSt20uninitialized_fill_nIPN5itest5ErrorEjS1_EvT_T0_RKT1__ZNKSt6vectorIN5itest5ErrorESaIS1_EE4sizeEv_ZNK9__gnu_cxx13new_allocatorIN5itest5ErrorEE8max_sizeEv_ZN5itest14ItestExceptionC2EPKcS2_S2_ii__cxa_free_exception@@CXXABI_1.3_ZN9__gnu_cxx17__normal_iteratorIPKN5itest5ErrorESt6vectorIS2_SaIS2_EEEC1ERKS4_sleep@@GLIBC_2.0_ZSt13__destroy_auxIN9__gnu_cxx17__normal_iteratorIPN5itest5ErrorESt6vectorIS3_SaIS3_EEEEEvT_S9_12__false_type_ZN5itest5ErrorC2EPKcS2_S2_ii_ZTVN5itest14ItestExceptionE_ZN5itest5TPole24get_measure_voltage_averEv_ZNSt12_Vector_baseIN5itest5ErrorESaIS1_EE13_M_deallocateEPS1_j_ZN9__gnu_cxx13new_allocatorIN5itest5ErrorEEC2ERKS3__ZN5itest7TMagnet9get_mdataEPNS_5mdataE__cxa_throw@@CXXABI_1.3_end_ZNSolsEPFRSoS_E@@GLIBCXX_3.4_ZNSt6vectorIN5itest5ErrorESaIS1_EE5clearEv_ZN5itest5TPole14set_current_ACEd_ZN5itest7TMagnetD2Ev_ZN5itest7TMagnet13clear_all_errEv_ZN5itest14ItestExceptionD2Ev_ZNKSt6vectorIN5itest5ErrorESaIS1_EEixEj_ZN5itest5TPoleC1EPNS_5TBiltEii_ZN5itest14ItestExceptionC2ERKSsS2_S2_ii_ZN5itest5ErrorD1Ev__cxa_end_catch@@CXXABI_1.3fcntl@@GLIBC_2.0_ZSt17__throw_bad_allocv@@GLIBCXX_3.4_ZNSt12_Vector_baseIN5itest5ErrorESaIS1_EE11_M_allocateEjMagnet_ZN9__gnu_cxx13new_allocatorIN5itest5ErrorEED2Ev_ZNSt6__copyILb0ESt26random_access_iterator_tagE4copyIPKN5itest5ErrorEPS4_EET0_T_S9_S8__ZN5itest5TPole13get_num_alarmEv_ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_@@GLIBCXX_3.4_ZTIN5itest5ErrorE_ZN5itest7TMagnetC2ERKS0___cxa_begin_catch@@CXXABI_1.3_ZNSaIN5itest5ErrorEEC1Ev_ZNSt12_Vector_baseIN5itest5ErrorESaIS1_EE12_Vector_implD1Ev_edata_ZNSaIcEC1Ev@@GLIBCXX_3.4_ZdlPvS__ZNKSt6vectorIN5itest5ErrorESaIS1_EE8capacityEv__gxx_personality_v0@@CXXABI_1.3_ZN5itest5TBilt5writeERKSs_ZNSt19basic_ostringstreamIcSt11char_traitsIcESaIcEEC1ESt13_Ios_Openmode@@GLIBCXX_3.4_ZN9__gnu_cxx17__normal_iteratorIPN5itest5ErrorESt6vectorIS2_SaIS2_EEEC1ERKS3__ZN5itest5TPole10get_switchEv_ZSt24__uninitialized_copy_auxIN9__gnu_cxx17__normal_iteratorIPKN5itest5ErrorESt6vectorIS3_SaIS3_EEEEPS3_ET0_T_SC_SB_12__false_type_ZN5itest11parse_datasEPKcPSsc_ZN5itest5TPole24get_measure_current_averEv_ZNSaIN5itest5ErrorEEC1ERKS1__ZN5itest5idataD1Ev_ZSt8_DestroyIPN5itest5ErrorES1_EvT_S3_SaIT0_E_Unwind_Resume@@GCC_3.0_ZNSaIN5itest5ErrorEEC2ERKS1__ZNKSs13find_first_ofEPKcj@@GLIBCXX_3.4_ZSt10_ConstructIN5itest5ErrorES1_EvPT_RKT0__ZN5itest14ItestException10push_errorEPKcS2_S2_ii_ZNSsaSERKSs@@GLIBCXX_3.4_ZN5itest5TBiltC2EPKc_ZN5itest5idataC1Ev_ZN9__gnu_cxxneIPN5itest5ErrorESt6vectorIS2_SaIS2_EEEEbRKNS_17__normal_iteratorIT_T0_EESC__ZTIN5itest14ItestExceptionE__i686.get_pc_thunk.bxmain_init_ZN9__gnu_cxx13new_allocatorIN5itest5ErrorEE9constructEPS2_RKS2__ZN5itest6SocketD2Ev_ZSt4endsIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_@@GLIBCXX_3.4_ZSt19__copy_backward_auxIPN5itest5ErrorES2_ET0_T_S4_S3_ Node-path: powersupply/itest/Bilt/trunk/libMagnet_V130/TestClass.cpp Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 8303 Text-content-md5: 1ed1f3ec0572861ad624735263cd0f54 Content-length: 8313 PROPS-END #include #include #include #include "ClassMagnet.h" #include "Exception.h" //g++ -o TestClass TestClass.cpp -L./ -lMagnet using namespace itest; TMagnet *Magnet; void *func1_thread(void *arg); main (int argc, char **argv) { int val=0; struct idata myDataX_Magnet1; struct idata myDataY_Magnet1; struct idata myDataZ_Magnet1; struct mdata mymData_Magnet1; struct fdata myFDataX_Magnet1; try{ std::cout<<"---------------TEST1---------------"<addrIP_magnet()<pole(X).set_current_DC(1); Magnet->pole(Y).set_current_DC(-1); Magnet->pole(Z).set_current_DC(0); Magnet->set_state(1); sleep(2); std::cout<<"STATE :"<get_state()<pole(X).get_idata(&myDataX_Magnet1); Magnet->pole(Y).get_idata(&myDataY_Magnet1); Magnet->get_mdata(&mymData_Magnet1); Magnet->set_state(0); delete Magnet; std::cout<<"---------------IDATA---------------"<pole(X).clear_ferrors(); Magnet->set_state(MAGNET_ON); for(int i=0;i<10;i++) { std::cout<addrIP_magnet()<num_magnet()<pole(X).get_idata(&myDataX_Magnet1); sleep(1); Magnet->pole(X).set_current_DC(1); Magnet->pole(X).get_fdata(&myFDataX_Magnet1); std::cout<<"-----------------"<< "nbr frame:"<set_state(MAGNET_OFF); sleep(2); delete Magnet; } catch(ItestException &e) { for(int i=0;i #include #include namespace BiltCh_ns { //+---------------------------------------------------------------------------- // // method : BiltCh::BiltCh(string &s) // // description : constructor for simulated BiltCh // // in : - cl : Pointer to the DeviceClass object // - s : Device name // //----------------------------------------------------------------------------- BiltCh::BiltCh(Tango::DeviceClass *cl,string &s) :Tango::Device_4Impl(cl,s.c_str()) { init_device(); } BiltCh::BiltCh(Tango::DeviceClass *cl,const char *s) :Tango::Device_4Impl(cl,s) { init_device(); } BiltCh::BiltCh(Tango::DeviceClass *cl,const char *s,const char *d) :Tango::Device_4Impl(cl,s,d) { init_device(); } //+---------------------------------------------------------------------------- // // method : BiltCh::delete_device() // // description : will be called at device destruction or at init command. // //----------------------------------------------------------------------------- void BiltCh::delete_device() { // Delete device allocated objects if ( bilt_obj != NULL ) { delete bilt_obj; } } //+---------------------------------------------------------------------------- // // method : BiltCh::init_device() // // description : will be called at device initialization. // //----------------------------------------------------------------------------- void BiltCh::init_device() { INFO_STREAM << "BiltCh::BiltCh() create device " << device_name << endl; // Initialise variables to default values //-------------------------------------------- get_device_property(); set_state (Tango::UNKNOWN); // open proxy to Bilt power supply try { bilt_obj = new Tango::DeviceProxy(biltName); Tango::DeviceAttribute rattr; Tango::DevState bilt_state; rattr = bilt_obj->read_attribute("State"); rattr >> bilt_state; set_state (bilt_state); bilt_init = true; } catch (Tango::DevFailed &e) { bilt_error = e.errors; bilt_init = false; } } //+---------------------------------------------------------------------------- // // method : BiltCh::get_device_property() // // description : Read the device properties from database. // //----------------------------------------------------------------------------- void BiltCh::get_device_property() { // Initialize your default values here (if not done with POGO). //------------------------------------------------------------------ bilt_obj = NULL; current = 0; voltage = 0; impedance = 0; current_rms = 0; current_average = 0; error_counter = 0; errors_per_sec = 0; frames_per_sec = 0; local_control = false; current_ac = 0; // Read device properties from database.(Automatic code generation) //------------------------------------------------------------------ Tango::DbData dev_prop; dev_prop.push_back(Tango::DbDatum("BiltName")); dev_prop.push_back(Tango::DbDatum("PoleNumber")); // Call database and extract values //-------------------------------------------- if (Tango::Util::instance()->_UseDb==true) get_db_device()->get_property(dev_prop); Tango::DbDatum def_prop, cl_prop; BiltChClass *ds_class = (static_cast(get_device_class())); int i = -1; // Try to initialize BiltName from class property cl_prop = ds_class->get_class_property(dev_prop[++i].name); if (cl_prop.is_empty()==false) cl_prop >> biltName; else { // Try to initialize BiltName from default device value def_prop = ds_class->get_default_device_property(dev_prop[i].name); if (def_prop.is_empty()==false) def_prop >> biltName; } // And try to extract BiltName value from database if (dev_prop[i].is_empty()==false) dev_prop[i] >> biltName; // Try to initialize PoleNumber from class property cl_prop = ds_class->get_class_property(dev_prop[++i].name); if (cl_prop.is_empty()==false) cl_prop >> poleNumber; else { // Try to initialize PoleNumber from default device value def_prop = ds_class->get_default_device_property(dev_prop[i].name); if (def_prop.is_empty()==false) def_prop >> poleNumber; } // And try to extract PoleNumber value from database if (dev_prop[i].is_empty()==false) dev_prop[i] >> poleNumber; // End of Automatic code generation //------------------------------------------------------------------ } //+---------------------------------------------------------------------------- // // method : BiltCh::always_executed_hook() // // description : method always executed before any command is executed // //----------------------------------------------------------------------------- void BiltCh::always_executed_hook() { } //+---------------------------------------------------------------------------- // // method : BiltCh::read_attr_hardware // // description : Hardware acquisition for attributes. // //----------------------------------------------------------------------------- void BiltCh::read_attr_hardware(vector &attr_list) { DEBUG_STREAM << "BiltCh::read_attr_hardware(vector &attr_list) entering... "<< endl; // Add your own code here if ( bilt_init == false ) { TangoSys_MemStream tms; tms << "Device is not correctly initialised! See the device status for more information." << endl; Tango::Except::throw_exception("ReadError", tms.str(), "Bilt::read_attr_hardware"); } } //+---------------------------------------------------------------------------- // // method : BiltCh::read_Current // // description : Extract real attribute values for Current acquisition result. // //----------------------------------------------------------------------------- void BiltCh::read_Current(Tango::Attribute &attr) { DEBUG_STREAM << "BiltCh::read_Current(Tango::Attribute &attr) entering... "<< endl; Tango::DeviceAttribute rattr; vector values; rattr = bilt_obj->read_attribute("Currents"); rattr >> values; Tango::MultiAttribute *attr_list = get_device_attr(); Tango::WAttribute &attr_curr = attr_list->get_w_attr_by_name ("Current"); attr_curr.set_write_value( &(values[POLES + poleNumber]) ); current = values[poleNumber]; attr.set_value (¤t); } //+---------------------------------------------------------------------------- // // method : BiltCh::write_Current // // description : Write Current attribute values to hardware. // //----------------------------------------------------------------------------- void BiltCh::write_Current(Tango::WAttribute &attr) { DEBUG_STREAM << "BiltCh::write_Current(Tango::WAttribute &attr) entering... "<< endl; double set_current; attr.get_write_value(set_current); Tango::DeviceData argin; vector cmd_in; cmd_in.push_back (poleNumber); cmd_in.push_back (set_current); argin << cmd_in; bilt_obj->command_inout("SetPoleCurrent", argin); } //+---------------------------------------------------------------------------- // // method : BiltCh::read_Voltage // // description : Extract real attribute values for Voltage acquisition result. // //----------------------------------------------------------------------------- void BiltCh::read_Voltage(Tango::Attribute &attr) { DEBUG_STREAM << "BiltCh::read_Voltage(Tango::Attribute &attr) entering... "<< endl; Tango::DeviceAttribute rattr; vector values; rattr = bilt_obj->read_attribute("Voltages"); rattr >> values; voltage = values[poleNumber]; attr.set_value (&voltage); } //+---------------------------------------------------------------------------- // // method : BiltCh::read_Impedance // // description : Extract real attribute values for Impedance acquisition result. // //----------------------------------------------------------------------------- void BiltCh::read_Impedance(Tango::Attribute &attr) { DEBUG_STREAM << "BiltCh::read_Impedance(Tango::Attribute &attr) entering... "<< endl; Tango::DeviceAttribute rattr; vector values; rattr = bilt_obj->read_attribute("Impedances"); rattr >> values; impedance = values[poleNumber]; attr.set_value (&impedance); } //+---------------------------------------------------------------------------- // // method : BiltCh::read_SetCurrentRMS // // description : Extract real attribute values for SetCurrentRMS acquisition result. // //----------------------------------------------------------------------------- void BiltCh::read_SetCurrentRMS(Tango::Attribute &attr) { DEBUG_STREAM << "BiltCh::read_SetCurrentRMS(Tango::Attribute &attr) entering... "<< endl; Tango::DeviceAttribute rattr; vector values; rattr = bilt_obj->read_attribute("SetCurrentsRMS"); rattr >> values; current_rms = values[poleNumber]; attr.set_value (¤t_rms); } //+---------------------------------------------------------------------------- // // method : BiltCh::read_SetCurrentAverage // // description : Extract real attribute values for SetCurrentAverage acquisition result. // //----------------------------------------------------------------------------- void BiltCh::read_SetCurrentAverage(Tango::Attribute &attr) { DEBUG_STREAM << "BiltCh::read_SetCurrentAverage(Tango::Attribute &attr) entering... "<< endl; Tango::DeviceAttribute rattr; vector values; rattr = bilt_obj->read_attribute("SetCurrentsAverage"); rattr >> values; current_average = values[poleNumber]; attr.set_value (¤t_average); } //+---------------------------------------------------------------------------- // // method : BiltCh::read_FramesPerSec // // description : Extract real attribute values for FramesPerSec acquisition result. // //----------------------------------------------------------------------------- void BiltCh::read_FramesPerSecond(Tango::Attribute &attr) { DEBUG_STREAM << "BiltCh::read_FramesPerSec(Tango::Attribute &attr) entering... "<< endl; Tango::DeviceAttribute rattr; vector values; rattr = bilt_obj->read_attribute("FramesPerSecond"); rattr >> values; frames_per_sec = values[poleNumber]; attr.set_value (&frames_per_sec); } //+---------------------------------------------------------------------------- // // method : BiltCh::read_ErrorPerSec // // description : Extract real attribute values for ErrorPerSec acquisition result. // //----------------------------------------------------------------------------- void BiltCh::read_ErrorPerSecond(Tango::Attribute &attr) { DEBUG_STREAM << "BiltCh::read_ErrorPerSec(Tango::Attribute &attr) entering... "<< endl; Tango::DeviceAttribute rattr; vector values; rattr = bilt_obj->read_attribute("ErrorsPerSecond"); rattr >> values; errors_per_sec = values[poleNumber]; attr.set_value (&errors_per_sec); } //+---------------------------------------------------------------------------- // // method : BiltCh::read_ErrorCounter // // description : Extract real attribute values for ErrorCounter acquisition result. // //----------------------------------------------------------------------------- void BiltCh::read_ErrorCounter(Tango::Attribute &attr) { DEBUG_STREAM << "BiltCh::read_ErrorCounter(Tango::Attribute &attr) entering... "<< endl; Tango::DeviceAttribute rattr; vector values; rattr = bilt_obj->read_attribute("ErrorCounters"); rattr >> values; error_counter = values[poleNumber]; attr.set_value (&error_counter); } //+---------------------------------------------------------------------------- // // method : BiltCh::read_LocalControl // // description : Extract real attribute values for LocalControl acquisition result. // //----------------------------------------------------------------------------- void BiltCh::read_LocalControl(Tango::Attribute &attr) { DEBUG_STREAM << "BiltCh::read_LocalControl(Tango::Attribute &attr) entering... "<< endl; Tango::DeviceAttribute rattr; vector values; rattr = bilt_obj->read_attribute("LocalControls"); rattr >> values; local_control = values[poleNumber]; attr.set_value (&local_control); } //+---------------------------------------------------------------------------- // // method : BiltCh::write_LocalControl // // description : Write LocalControl attribute values to hardware. // //----------------------------------------------------------------------------- void BiltCh::write_LocalControl(Tango::WAttribute &attr) { DEBUG_STREAM << "BiltCh::write_LocalControl(Tango::WAttribute &attr) entering... "<< endl; bool local_control; attr.get_write_value(local_control); Tango::DeviceData argin; vector cmd_in; cmd_in.push_back (poleNumber); if (local_control == true) cmd_in.push_back (1); else { cmd_in.push_back (0); // set back the AC current setpoint to 0! Tango::DeviceData ac_curr; vector ac_in; ac_in.push_back (poleNumber); ac_in.push_back (0); ac_curr << ac_in; bilt_obj->command_inout("SetPoleAcCurrent", ac_curr); current_ac = 0; } argin << cmd_in; bilt_obj->command_inout("LocalPoleControl", argin); } //+---------------------------------------------------------------------------- // // method : BiltCh::read_SetCurrentAC // // description : Extract real attribute values for SetCurrentAC acquisition result. // //----------------------------------------------------------------------------- void BiltCh::read_SetCurrentAC(Tango::Attribute &attr) { DEBUG_STREAM << "BiltCh::read_SetCurrentAC(Tango::Attribute &attr) entering... "<< endl; if ( local_control == false ) { attr.set_quality (Tango::ATTR_INVALID); } else { attr.set_value (¤t_ac); } } //+---------------------------------------------------------------------------- // // method : BiltCh::write_SetCurrentAC // // description : Write SetCurrentAC attribute values to hardware. // //----------------------------------------------------------------------------- void BiltCh::write_SetCurrentAC(Tango::WAttribute &attr) { DEBUG_STREAM << "BiltCh::write_SetCurrentAC(Tango::WAttribute &attr) entering... "<< endl; if ( local_control == false ) { TangoSys_MemStream tms; tms << "Can set AC current only when local control enabled!" << endl; Tango::Except::throw_exception("WriteError", tms.str(), "Bilt::write_SetCurrentAC"); } double set_current; attr.get_write_value(set_current); Tango::DeviceData argin; vector cmd_in; cmd_in.push_back (poleNumber); cmd_in.push_back (set_current); argin << cmd_in; bilt_obj->command_inout("SetPoleAcCurrent", argin); current_ac = set_current; } //+------------------------------------------------------------------ /** * method: BiltCh::dev_state * * description: method to execute "State" * This command gets the device state (stored in its device_state data member) and returns it to the caller. * * @return State Code * */ //+------------------------------------------------------------------ Tango::DevState BiltCh::dev_state() { Tango::DevState argout = DeviceImpl::dev_state(); DEBUG_STREAM << "BiltCh::dev_state(): entering... !" << endl; // Add your own code to control device here if ( bilt_init == true ) { Tango::DeviceAttribute rattr; Tango::DevState bilt_state; rattr = bilt_obj->read_attribute("State"); rattr >> bilt_state; set_state (bilt_state); } return get_state(); } //+------------------------------------------------------------------ /** * method: BiltCh::dev_status * * description: method to execute "Status" * This command gets the device status (stored in its device_status data member) and returns it to the caller. * * @return Status description * */ //+------------------------------------------------------------------ Tango::ConstDevString BiltCh::dev_status() { //Tango::ConstDevString argout = DeviceImpl::dev_status(); DEBUG_STREAM << "BiltCh::dev_status(): entering... !" << endl; // Add your own code to control device here string bilt_status; if ( bilt_init == true ) { Tango::DeviceAttribute rattr; rattr = bilt_obj->read_attribute("Status"); rattr >> bilt_status; set_status (bilt_status); } else { bilt_status = "Error during initialisation: \n"; for (short i = 0; i //using namespace Tango; /** * @author $Author: meyer $ * @version $Revision: 1.1.1.1 $ */ // Add your own constant definitions here. //----------------------------------------------- // Number of poles per magnet #define POLES 3 namespace BiltCh_ns { /** * Class Description: * The Bilt multi channel power supply has three individual channels. * This class offers an interface to an individual channel of the power supply. */ /* * Device States Description: * Tango::ON : Magnet is ON, all three channels are ON. * Tango::OFF : Magnet is OFF, all three channels are OFF. * Tango::FAULT : Error detected by the BILT magnet. * Tango::ALARM : Alarm detected on one or more channels. * Tango::UNKNOWN : Communication fault */ class BiltCh: public Tango::Device_4Impl { public : // Add your own data members here //----------------------------------------- // Here is the Start of the automatic code generation part //------------------------------------------------------------- /** * @name attributes * Attribute member data. */ //@{ Tango::DevDouble *attr_Current_read; Tango::DevDouble attr_Current_write; Tango::DevDouble *attr_Voltage_read; Tango::DevDouble *attr_Impedance_read; Tango::DevDouble *attr_SetCurrentRMS_read; Tango::DevDouble *attr_SetCurrentAverage_read; Tango::DevULong *attr_FramesPerSecond_read; Tango::DevULong *attr_ErrorPerSecond_read; Tango::DevULong *attr_ErrorCounter_read; Tango::DevBoolean *attr_LocalControl_read; Tango::DevBoolean attr_LocalControl_write; Tango::DevDouble *attr_SetCurrentAC_read; Tango::DevDouble attr_SetCurrentAC_write; //@} /** * @name Device properties * Device properties member data. */ //@{ /** * Name of the Bilt multi channel power supply device * */ string biltName; /** * The number of the channel or Pole of the Bilt power supply [0 -2] */ Tango::DevShort poleNumber; //@} /** * @name Device properties * Device property member data. */ //@{ //@} /**@name Constructors * Miscellaneous constructors */ //@{ /** * Constructs a newly allocated Command object. * * @param cl Class. * @param s Device Name */ BiltCh(Tango::DeviceClass *cl,string &s); /** * Constructs a newly allocated Command object. * * @param cl Class. * @param s Device Name */ BiltCh(Tango::DeviceClass *cl,const char *s); /** * Constructs a newly allocated Command object. * * @param cl Class. * @param s Device name * @param d Device description. */ BiltCh(Tango::DeviceClass *cl,const char *s,const char *d); //@} /**@name Destructor * Only one destructor is defined for this class */ //@{ /** * The object destructor. */ ~BiltCh() {delete_device();}; /** * will be called at device destruction or at init command. */ void delete_device(); //@} /**@name Miscellaneous methods */ //@{ /** * Initialize the device */ virtual void init_device(); /** * Always executed method before execution command method. */ virtual void always_executed_hook(); //@} /** * @name BiltCh methods prototypes */ //@{ /** * Hardware acquisition for attributes. */ virtual void read_attr_hardware(vector &attr_list); /** * Extract real attribute values for Current acquisition result. */ virtual void read_Current(Tango::Attribute &attr); /** * Write Current attribute values to hardware. */ virtual void write_Current(Tango::WAttribute &attr); /** * Extract real attribute values for Voltage acquisition result. */ virtual void read_Voltage(Tango::Attribute &attr); /** * Extract real attribute values for Impedance acquisition result. */ virtual void read_Impedance(Tango::Attribute &attr); /** * Extract real attribute values for SetCurrentRMS acquisition result. */ virtual void read_SetCurrentRMS(Tango::Attribute &attr); /** * Extract real attribute values for SetCurrentAverage acquisition result. */ virtual void read_SetCurrentAverage(Tango::Attribute &attr); /** * Extract real attribute values for FramesPerSecond acquisition result. */ virtual void read_FramesPerSecond(Tango::Attribute &attr); /** * Extract real attribute values for ErrorPerSecond acquisition result. */ virtual void read_ErrorPerSecond(Tango::Attribute &attr); /** * Extract real attribute values for ErrorCounter acquisition result. */ virtual void read_ErrorCounter(Tango::Attribute &attr); /** * Extract real attribute values for LocalControl acquisition result. */ virtual void read_LocalControl(Tango::Attribute &attr); /** * Write LocalControl attribute values to hardware. */ virtual void write_LocalControl(Tango::WAttribute &attr); /** * Extract real attribute values for SetCurrentAC acquisition result. */ virtual void read_SetCurrentAC(Tango::Attribute &attr); /** * Write SetCurrentAC attribute values to hardware. */ virtual void write_SetCurrentAC(Tango::WAttribute &attr); /** * Read/Write allowed for Current attribute. */ virtual bool is_Current_allowed(Tango::AttReqType type); /** * Read/Write allowed for Voltage attribute. */ virtual bool is_Voltage_allowed(Tango::AttReqType type); /** * Read/Write allowed for Impedance attribute. */ virtual bool is_Impedance_allowed(Tango::AttReqType type); /** * Read/Write allowed for SetCurrentRMS attribute. */ virtual bool is_SetCurrentRMS_allowed(Tango::AttReqType type); /** * Read/Write allowed for SetCurrentAverage attribute. */ virtual bool is_SetCurrentAverage_allowed(Tango::AttReqType type); /** * Read/Write allowed for FramesPerSecond attribute. */ virtual bool is_FramesPerSecond_allowed(Tango::AttReqType type); /** * Read/Write allowed for ErrorPerSecond attribute. */ virtual bool is_ErrorPerSecond_allowed(Tango::AttReqType type); /** * Read/Write allowed for ErrorCounter attribute. */ virtual bool is_ErrorCounter_allowed(Tango::AttReqType type); /** * Read/Write allowed for LocalControl attribute. */ virtual bool is_LocalControl_allowed(Tango::AttReqType type); /** * Read/Write allowed for SetCurrentAC attribute. */ virtual bool is_SetCurrentAC_allowed(Tango::AttReqType type); /** * This command gets the device state (stored in its device_state data member) and returns it to the caller. * @return State Code * @exception DevFailed */ virtual Tango::DevState dev_state(); /** * This command gets the device status (stored in its device_status data member) and returns it to the caller. * @return Status description * @exception DevFailed */ virtual Tango::ConstDevString dev_status(); /** * Read the device properties from database */ void get_device_property(); //@} // Here is the end of the automatic code generation part //------------------------------------------------------------- protected : // Add your own data members here //----------------------------------------- Tango::DeviceProxy *bilt_obj; Tango::DevErrorList bilt_error; bool bilt_init; double current; double voltage; double impedance; double current_rms; double current_average; Tango::DevULong error_counter; Tango::DevULong errors_per_sec; Tango::DevULong frames_per_sec; bool local_control; double current_ac; }; } // namespace_ns #endif // _BILTCH_H Node-path: powersupply/itest/BiltCh/trunk/BiltChClass.cpp Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 18591 Text-content-md5: 002f1bc1afcc35200f991a173d1c24ce Content-length: 18601 PROPS-END static const char *ClassId = "$Id: BiltChClass.cpp,v 1.1.1.1 2010-02-10 11:49:21 meyer Exp $"; static const char *TagName = "$Name: not supported by cvs2svn $"; static const char *CvsPath = "$Source: /segfs/tango/cvsroot/cppserver/machine/powersupply/SrSteerers/tango/BiltCh/BiltChClass.cpp,v $"; static const char *SvnPath = "$HeadURL: $"; static const char *HttpServer = "http://www.esrf.fr/computing/cs/tango/tango_doc/ds_doc/"; //+============================================================================= // // file : BiltChClass.cpp // // description : C++ source for the BiltChClass. A singleton // class derived from DeviceClass. It implements the // command list and all properties and methods required // by the BiltCh once per process. // // project : TANGO Device Server // // $Author: meyer $ // // $Revision: 1.1.1.1 $ // // $Log: not supported by cvs2svn $ // // copyleft : European Synchrotron Radiation Facility // BP 220, Grenoble 38043 // FRANCE // //-============================================================================= // // This file is generated by POGO // (Program Obviously used to Generate tango Object) // // (c) - Software Engineering Group - ESRF //============================================================================= #include #include #include //+---------------------------------------------------------------------------- /** * Create BiltChClass singleton and return it in a C function for Python usage */ //+---------------------------------------------------------------------------- extern "C" { #ifdef WIN32 __declspec(dllexport) #endif Tango::DeviceClass *_create_BiltCh_class(const char *name) { return BiltCh_ns::BiltChClass::init(name); } } namespace BiltCh_ns { // //---------------------------------------------------------------- // Initialize pointer for singleton pattern //---------------------------------------------------------------- // BiltChClass *BiltChClass::_instance = NULL; //+---------------------------------------------------------------------------- // // method : BiltChClass::BiltChClass(string &s) // // description : constructor for the BiltChClass // // in : - s : The class name // //----------------------------------------------------------------------------- BiltChClass::BiltChClass(string &s):DeviceClass(s) { cout2 << "Entering BiltChClass constructor" << endl; set_default_property(); get_class_property(); write_class_property(); cout2 << "Leaving BiltChClass constructor" << endl; } //+---------------------------------------------------------------------------- // // method : BiltChClass::~BiltChClass() // // description : destructor for the BiltChClass // //----------------------------------------------------------------------------- BiltChClass::~BiltChClass() { _instance = NULL; } //+---------------------------------------------------------------------------- // // method : BiltChClass::instance // // description : Create the object if not already done. Otherwise, just // return a pointer to the object // // in : - name : The class name // //----------------------------------------------------------------------------- BiltChClass *BiltChClass::init(const char *name) { if (_instance == NULL) { try { string s(name); _instance = new BiltChClass(s); } catch (bad_alloc) { throw; } } return _instance; } BiltChClass *BiltChClass::instance() { if (_instance == NULL) { cerr << "Class is not initialised !!" << endl; exit(-1); } return _instance; } //+---------------------------------------------------------------------------- // // method : BiltChClass::command_factory // // description : Create the command object(s) and store them in the // command list // //----------------------------------------------------------------------------- void BiltChClass::command_factory() { // add polling if any for (unsigned int i=0 ; ilength() ; i++) { cout4 << "Device name : " << (*devlist_ptr)[i].in() << endl; // Create devices and add it into the device list //---------------------------------------------------- device_list.push_back(new BiltCh(this, (*devlist_ptr)[i])); // Export device to the outside world // Check before if database used. //--------------------------------------------- if ((Tango::Util::_UseDb == true) && (Tango::Util::_FileDb == false)) export_device(device_list.back()); else export_device(device_list.back(), (*devlist_ptr)[i]); } // End of Automatic code generation //------------------------------------------------------------- } //+---------------------------------------------------------------------------- // Method: BiltChClass::attribute_factory(vector &att_list) //----------------------------------------------------------------------------- void BiltChClass::attribute_factory(vector &att_list) { // Attribute : Current CurrentAttrib *current = new CurrentAttrib(); Tango::UserDefaultAttrProp current_prop; current_prop.set_label("DC Current"); current_prop.set_unit("A"); current_prop.set_format("%6.4f"); current_prop.set_max_value("1.8"); current_prop.set_min_value("-1.8"); current_prop.set_description("The DC current of the selected pole."); current->set_default_properties(current_prop); att_list.push_back(current); // Attribute : Voltage VoltageAttrib *voltage = new VoltageAttrib(); Tango::UserDefaultAttrProp voltage_prop; voltage_prop.set_label("Voltage"); voltage_prop.set_unit("V"); voltage_prop.set_format("%6.4f"); voltage_prop.set_description("The measured voltage of the selected pole."); voltage->set_default_properties(voltage_prop); att_list.push_back(voltage); // Attribute : Impedance ImpedanceAttrib *impedance = new ImpedanceAttrib(); Tango::UserDefaultAttrProp impedance_prop; impedance_prop.set_label("Impedance"); impedance_prop.set_unit("Ohm"); impedance_prop.set_format("%4.2f"); impedance_prop.set_max_alarm("5.0"); impedance_prop.set_description("Calculated impedance of the selected pole."); impedance->set_default_properties(impedance_prop); att_list.push_back(impedance); // Attribute : SetCurrentRMS SetCurrentRMSAttrib *set_current_rms = new SetCurrentRMSAttrib(); Tango::UserDefaultAttrProp set_current_rms_prop; set_current_rms_prop.set_label("RMS AC current setpoint/s"); set_current_rms_prop.set_unit("A"); set_current_rms_prop.set_format("%6.4f"); set_current_rms_prop.set_description("Statistic when driven by the Libera.\nRMS value of the AC setpoint applied on the DAC during the last second.\nX=sqr( (sum(setAC)*sum(setAC)) / n - ((sum(setAC)/n) *(sum(setAC)/n)) )"); set_current_rms->set_default_properties(set_current_rms_prop); att_list.push_back(set_current_rms); // Attribute : SetCurrentAverage SetCurrentAverageAttrib *set_current_average = new SetCurrentAverageAttrib(); Tango::UserDefaultAttrProp set_current_average_prop; set_current_average_prop.set_label("Average AC current setpoint/s"); set_current_average_prop.set_unit("A"); set_current_average_prop.set_format("%6.4f"); set_current_average_prop.set_description("Statistic when driven by the Libera.\nThe average AC setpoint applied to the DAC during the last second.\nX=SUM(setAC)/n"); set_current_average->set_default_properties(set_current_average_prop); att_list.push_back(set_current_average); // Attribute : FramesPerSecond FramesPerSecondAttrib *frames_per_second = new FramesPerSecondAttrib(); Tango::UserDefaultAttrProp frames_per_second_prop; frames_per_second_prop.set_label("Frames/s"); frames_per_second_prop.set_unit(" "); frames_per_second_prop.set_format("%3d"); frames_per_second_prop.set_description("Statistic when driven by the Libera.\nThe number of setpoints per second."); frames_per_second->set_default_properties(frames_per_second_prop); att_list.push_back(frames_per_second); // Attribute : ErrorPerSecond ErrorPerSecondAttrib *error_per_second = new ErrorPerSecondAttrib(); Tango::UserDefaultAttrProp error_per_second_prop; error_per_second_prop.set_label("Errors/s"); error_per_second_prop.set_unit(" "); error_per_second_prop.set_format("%3d"); error_per_second_prop.set_description("Statistic when driven by the Libera.\nThe number of errors detected per second."); error_per_second->set_default_properties(error_per_second_prop); att_list.push_back(error_per_second); // Attribute : ErrorCounter ErrorCounterAttrib *error_counter = new ErrorCounterAttrib(); Tango::UserDefaultAttrProp error_counter_prop; error_counter_prop.set_label("Error Counter"); error_counter_prop.set_unit(" "); error_counter_prop.set_format("%6d"); error_counter_prop.set_description("Statistic when driven by the Libera.\nThe total number of errors since the last reset."); error_counter->set_default_properties(error_counter_prop); att_list.push_back(error_counter); // Attribute : LocalControl LocalControlAttrib *local_control = new LocalControlAttrib(); Tango::UserDefaultAttrProp local_control_prop; local_control_prop.set_label("Local Control"); local_control_prop.set_unit(" "); local_control_prop.set_description("If true the AC current can be set on the device,\notherwise it is driven by the Libera."); local_control->set_default_properties(local_control_prop); att_list.push_back(local_control); // Attribute : SetCurrentAC SetCurrentACAttrib *set_current_ac = new SetCurrentACAttrib(); Tango::UserDefaultAttrProp set_current_ac_prop; set_current_ac_prop.set_label("AC Current Setpoint"); set_current_ac_prop.set_unit("A"); set_current_ac_prop.set_format("%5.4f"); set_current_ac_prop.set_max_value("0.2"); set_current_ac_prop.set_min_value("-0.2"); set_current_ac_prop.set_description("The AC current setpoint in local mode. If driven by the Libera, the attribute \nattribute value in INVALID."); set_current_ac->set_default_properties(set_current_ac_prop); att_list.push_back(set_current_ac); // End of Automatic code generation //------------------------------------------------------------- } //+---------------------------------------------------------------------------- // // method : BiltChClass::get_class_property() // // description : Read the class properties from database. // //----------------------------------------------------------------------------- void BiltChClass::get_class_property() { // Initialize your default values here (if not done with POGO). //------------------------------------------------------------------ // Read class properties from database.(Automatic code generation) //------------------------------------------------------------------ // Call database and extract values //-------------------------------------------- if (Tango::Util::instance()->_UseDb==true) get_db_class()->get_property(cl_prop); Tango::DbDatum def_prop; int i = -1; // End of Automatic code generation //------------------------------------------------------------------ } //+---------------------------------------------------------------------------- // // method : BiltChClass::set_default_property // // description: Set default property (class and device) for wizard. // For each property, add to wizard property name and description // If default value has been set, add it to wizard property and // store it in a DbDatum. // //----------------------------------------------------------------------------- void BiltChClass::set_default_property() { string prop_name; string prop_desc; string prop_def; vector vect_data; // Set Default Class Properties // Set Default Device Properties prop_name = "BiltName"; prop_desc = "Name of the Bilt multi channel power supply device\n"; prop_def = "none"; vect_data.clear(); vect_data.push_back("none"); if (prop_def.length()>0) { Tango::DbDatum data(prop_name); data << vect_data ; dev_def_prop.push_back(data); add_wiz_dev_prop(prop_name, prop_desc, prop_def); } else add_wiz_dev_prop(prop_name, prop_desc); prop_name = "PoleNumber"; prop_desc = "The number of the channel or Pole of the Bilt power supply [0 -2]"; prop_def = "-1"; vect_data.clear(); vect_data.push_back("-1"); if (prop_def.length()>0) { Tango::DbDatum data(prop_name); data << vect_data ; dev_def_prop.push_back(data); add_wiz_dev_prop(prop_name, prop_desc, prop_def); } else add_wiz_dev_prop(prop_name, prop_desc); } //+---------------------------------------------------------------------------- // // method : BiltChClass::write_class_property // // description : Set class description as property in database // //----------------------------------------------------------------------------- void BiltChClass::write_class_property() { // First time, check if database used //-------------------------------------------- if (Tango::Util::_UseDb == false) return; Tango::DbData data; string classname = get_name(); string header; string::size_type start, end; // Put title Tango::DbDatum title("ProjectTitle"); string str_title("BILT channel interface"); title << str_title; data.push_back(title); // Put Description Tango::DbDatum description("Description"); vector str_desc; str_desc.push_back("The Bilt multi channel power supply has three individual channels."); str_desc.push_back("This class offers an interface to an individual channel of the power supply."); description << str_desc; data.push_back(description); // put cvs or svn location string filename(classname); filename += "Class.cpp"; // Create a string with the class ID to // get the string into the binary string class_id(ClassId); // check for cvs information string src_path(CvsPath); start = src_path.find("/"); if (start!=string::npos) { end = src_path.find(filename); if (end>start) { string strloc = src_path.substr(start, end-start); // Check if specific repository start = strloc.find("/cvsroot/"); if (start!=string::npos && start>0) { string repository = strloc.substr(0, start); if (repository.find("/segfs/")!=string::npos) strloc = "ESRF:" + strloc.substr(start, strloc.length()-start); } Tango::DbDatum cvs_loc("cvs_location"); cvs_loc << strloc; data.push_back(cvs_loc); } } // check for svn information else { string src_path(SvnPath); start = src_path.find("://"); if (start!=string::npos) { end = src_path.find(filename); if (end>start) { header = "$HeadURL: "; start = header.length(); string strloc = src_path.substr(start, (end-start)); Tango::DbDatum svn_loc("svn_location"); svn_loc << strloc; data.push_back(svn_loc); } } } // Get CVS or SVN revision tag // CVS tag string tagname(TagName); header = "$Name: "; start = header.length(); string endstr(" $"); end = tagname.find(endstr); if (end!=string::npos && end>start) { string strtag = tagname.substr(start, end-start); Tango::DbDatum cvs_tag("cvs_tag"); cvs_tag << strtag; data.push_back(cvs_tag); } // SVN tag string svnpath(SvnPath); header = "$HeadURL: "; start = header.length(); end = svnpath.find(endstr); if (end!=string::npos && end>start) { string strloc = svnpath.substr(start, end-start); string tagstr ("/tags/"); start = strloc.find(tagstr); if ( start!=string::npos ) { start = start + tagstr.length(); end = strloc.find(filename); string strtag = strloc.substr(start, end-start-1); Tango::DbDatum svn_tag("svn_tag"); svn_tag << strtag; data.push_back(svn_tag); } } // Get URL location string httpServ(HttpServer); if (httpServ.length()>0) { Tango::DbDatum db_doc_url("doc_url"); db_doc_url << httpServ; data.push_back(db_doc_url); } // Put inheritance Tango::DbDatum inher_datum("InheritedFrom"); vector inheritance; inheritance.push_back("Device_4Impl"); inher_datum << inheritance; data.push_back(inher_datum); // Call database and and values //-------------------------------------------- get_db_class()->put_property(data); } } // namespace Node-path: powersupply/itest/BiltCh/trunk/BiltChClass.h Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 7164 Text-content-md5: 79cc6bb7302186a3cd1ccceb2d3c4e58 Content-length: 7174 PROPS-END //============================================================================= // // file : BiltChClass.h // // description : Include for the BiltChClass root class. // This class is the singleton class for // the BiltCh device class. // It contains all properties and methods which the // BiltCh requires only once e.g. the commands. // // project : TANGO Device Server // // $Author: meyer $ // // $Revision: 1.1.1.1 $ // $Date: 2010-02-10 11:49:21 $ // // SVN only: // $HeadURL: $ // // CVS only: // $Source: /segfs/tango/cvsroot/cppserver/machine/powersupply/SrSteerers/tango/BiltCh/BiltChClass.h,v $ // $Log: not supported by cvs2svn $ // // copyleft : European Synchrotron Radiation Facility // BP 220, Grenoble 38043 // FRANCE // //============================================================================= // // This file is generated by POGO // (Program Obviously used to Generate tango Object) // // (c) - Software Engineering Group - ESRF //============================================================================= #ifndef _BILTCHCLASS_H #define _BILTCHCLASS_H #include #include namespace BiltCh_ns {//===================================== // Define classes for attributes //===================================== class SetCurrentACAttrib: public Tango::Attr { public: SetCurrentACAttrib():Attr("SetCurrentAC", Tango::DEV_DOUBLE, Tango::READ_WRITE) {}; ~SetCurrentACAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_SetCurrentAC(att);} virtual void write(Tango::DeviceImpl *dev,Tango::WAttribute &att) {(static_cast(dev))->write_SetCurrentAC(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_SetCurrentAC_allowed(ty);} }; class LocalControlAttrib: public Tango::Attr { public: LocalControlAttrib():Attr("LocalControl", Tango::DEV_BOOLEAN, Tango::READ_WRITE) {}; ~LocalControlAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_LocalControl(att);} virtual void write(Tango::DeviceImpl *dev,Tango::WAttribute &att) {(static_cast(dev))->write_LocalControl(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_LocalControl_allowed(ty);} }; class ErrorCounterAttrib: public Tango::Attr { public: ErrorCounterAttrib():Attr("ErrorCounter", Tango::DEV_ULONG, Tango::READ) {}; ~ErrorCounterAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_ErrorCounter(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_ErrorCounter_allowed(ty);} }; class ErrorPerSecondAttrib: public Tango::Attr { public: ErrorPerSecondAttrib():Attr("ErrorPerSecond", Tango::DEV_ULONG, Tango::READ) {}; ~ErrorPerSecondAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_ErrorPerSecond(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_ErrorPerSecond_allowed(ty);} }; class FramesPerSecondAttrib: public Tango::Attr { public: FramesPerSecondAttrib():Attr("FramesPerSecond", Tango::DEV_ULONG, Tango::READ) {}; ~FramesPerSecondAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_FramesPerSecond(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_FramesPerSecond_allowed(ty);} }; class SetCurrentAverageAttrib: public Tango::Attr { public: SetCurrentAverageAttrib():Attr("SetCurrentAverage", Tango::DEV_DOUBLE, Tango::READ) {}; ~SetCurrentAverageAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_SetCurrentAverage(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_SetCurrentAverage_allowed(ty);} }; class SetCurrentRMSAttrib: public Tango::Attr { public: SetCurrentRMSAttrib():Attr("SetCurrentRMS", Tango::DEV_DOUBLE, Tango::READ) {}; ~SetCurrentRMSAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_SetCurrentRMS(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_SetCurrentRMS_allowed(ty);} }; class ImpedanceAttrib: public Tango::Attr { public: ImpedanceAttrib():Attr("Impedance", Tango::DEV_DOUBLE, Tango::READ) {}; ~ImpedanceAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_Impedance(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_Impedance_allowed(ty);} }; class VoltageAttrib: public Tango::Attr { public: VoltageAttrib():Attr("Voltage", Tango::DEV_DOUBLE, Tango::READ) {}; ~VoltageAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_Voltage(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_Voltage_allowed(ty);} }; class CurrentAttrib: public Tango::Attr { public: CurrentAttrib():Attr("Current", Tango::DEV_DOUBLE, Tango::READ_WRITE) {}; ~CurrentAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_Current(att);} virtual void write(Tango::DeviceImpl *dev,Tango::WAttribute &att) {(static_cast(dev))->write_Current(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_Current_allowed(ty);} }; //========================================= // Define classes for commands //========================================= // // The BiltChClass singleton definition // class #ifdef _TG_WINDOWS_ __declspec(dllexport) #endif BiltChClass : public Tango::DeviceClass { public: // properties member data // add your own data members here //------------------------------------ public: Tango::DbData cl_prop; Tango::DbData cl_def_prop; Tango::DbData dev_def_prop; // Method prototypes static BiltChClass *init(const char *); static BiltChClass *instance(); ~BiltChClass(); Tango::DbDatum get_class_property(string &); Tango::DbDatum get_default_device_property(string &); Tango::DbDatum get_default_class_property(string &); protected: BiltChClass(string &); static BiltChClass *_instance; void command_factory(); void get_class_property(); void attribute_factory(vector &); void write_class_property(); void set_default_property(); string get_cvstag(); string get_cvsroot(); private: void device_factory(const Tango::DevVarStringArray *); }; } // namespace BiltCh_ns #endif // _BILTCHCLASS_H Node-path: powersupply/itest/BiltCh/trunk/BiltChStateMachine.cpp Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 6020 Text-content-md5: 1e24badcda049a9423119dcdae3cab0a Content-length: 6030 PROPS-END static const char *RcsId = "$Id $"; //+============================================================================= // // file : BiltChStateMachine.cpp // // description : C++ source for the BiltCh and its alowed // methods for commands and attributes // // project : TANGO Device Server // // $Author: meyer $ // // $Revision: 1.1.1.1 $ // $Date: 2010-02-10 11:49:21 $ // // SVN only: // $HeadURL: $ // // CVS only: // $Source: /segfs/tango/cvsroot/cppserver/machine/powersupply/SrSteerers/tango/BiltCh/BiltChStateMachine.cpp,v $ // $Log: not supported by cvs2svn $ // // copyleft : European Synchrotron Radiation Facility // BP 220, Grenoble 38043 // FRANCE // //-============================================================================= // // This file is generated by POGO // (Program Obviously used to Generate tango Object) // // (c) - Software Engineering Group - ESRF //============================================================================= #include #include #include /*==================================================================== * This file contains the methods to allow commands and attributes * read or write execution. * * If you wand to add your own code, add it between * the "End/Re-Start of Generated Code" comments. * * If you want, you can also add your own methods. *==================================================================== */ namespace BiltCh_ns { //================================================= // Attributes Allowed Methods //================================================= //+---------------------------------------------------------------------------- // // method : BiltCh::is_Voltage_allowed // // description : Read/Write allowed for Voltage attribute. // //----------------------------------------------------------------------------- bool BiltCh::is_Voltage_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : BiltCh::is_Impedance_allowed // // description : Read/Write allowed for Impedance attribute. // //----------------------------------------------------------------------------- bool BiltCh::is_Impedance_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : BiltCh::is_SetCurrentRMS_allowed // // description : Read/Write allowed for SetCurrentRMS attribute. // //----------------------------------------------------------------------------- bool BiltCh::is_SetCurrentRMS_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : BiltCh::is_SetCurrentAverage_allowed // // description : Read/Write allowed for SetCurrentAverage attribute. // //----------------------------------------------------------------------------- bool BiltCh::is_SetCurrentAverage_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : BiltCh::is_ErrorCounter_allowed // // description : Read/Write allowed for ErrorCounter attribute. // //----------------------------------------------------------------------------- bool BiltCh::is_ErrorCounter_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : BiltCh::is_LocalControl_allowed // // description : Read/Write allowed for LocalControl attribute. // //----------------------------------------------------------------------------- bool BiltCh::is_LocalControl_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : BiltCh::is_SetCurrentAC_allowed // // description : Read/Write allowed for SetCurrentAC attribute. // //----------------------------------------------------------------------------- bool BiltCh::is_SetCurrentAC_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : BiltCh::is_Current_allowed // // description : Read/Write allowed for Current attribute. // //----------------------------------------------------------------------------- bool BiltCh::is_Current_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : BiltCh::is_FramesPerSecond_allowed // // description : Read/Write allowed for FramesPerSecond attribute. // //----------------------------------------------------------------------------- bool BiltCh::is_FramesPerSecond_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : BiltCh::is_ErrorPerSecond_allowed // // description : Read/Write allowed for ErrorPerSecond attribute. // //----------------------------------------------------------------------------- bool BiltCh::is_ErrorPerSecond_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //================================================= // Commands Allowed Methods //================================================= } // namespace BiltCh_ns Node-path: powersupply/itest/BiltCh/trunk/ClassFactory.cpp Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 1441 Text-content-md5: 925830eb673786ab914965ced0653e90 Content-length: 1451 PROPS-END static const char *RcsId = "$Id: ClassFactory.cpp,v 1.1.1.1 2010-02-10 11:49:21 meyer Exp $"; //+============================================================================= // // file : ClassFactory.cpp // // description : C++ source for the class_factory method of the DServer // device class. This method is responsible for the creation of // all class singleton for a device server. It is called // at device server startup // // project : TANGO Device Server // // $Author: meyer $ // // $Revision: 1.1.1.1 $ // $Date: 2010-02-10 11:49:21 $ // // SVN only: // $HeadURL: $ // // CVS only: // $Source: /segfs/tango/cvsroot/cppserver/machine/powersupply/SrSteerers/tango/BiltCh/ClassFactory.cpp,v $ // $Log: not supported by cvs2svn $ // // copyleft : European Synchrotron Radiation Facility // BP 220, Grenoble 38043 // FRANCE // //-============================================================================= // // This file is generated by POGO // (Program Obviously used to Generate tango Object) // // (c) - Software Engineering Group - ESRF //============================================================================= #include #include /** * Create BiltChClass singleton and store it in DServer object. */ void Tango::DServer::class_factory() { add_class(BiltCh_ns::BiltChClass::init("BiltCh")); } Node-path: powersupply/itest/BiltCh/trunk/Makefile Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 4949 Text-content-md5: e3d75011a40bc585c6f1b5a2450bfc46 Content-length: 4959 PROPS-END #============================================================================= # # file : Makefile # # description : Include for the BiltCh class. # # project : Makefile to generate a Tango server # # $Author: meyer $ # # $Revision: 1.1.1.1 $ # # $Log: not supported by cvs2svn $ # # copyleft : European Synchrotron Radiation Facility # BP 220, Grenoble 38043 # FRANCE # #============================================================================= # This file is generated by POGO # (Program Obviously used to Generate tango Object) # # (c) - Software Engineering Group - ESRF #============================================================================= # CLASS = BiltCh MAJOR_VERS = 1 MINOR_VERS = 0 RELEASE = Release_$(MAJOR_VERS)_$(MINOR_VERS) OS = $(shell /csadmin/common/scripts/get_os) PROCESSOR = $(shell uname -p) #----------------------------------------- # Set default home directories #----------------------------------------- TANGO_HOME = /segfs/tango/release/$(BIN_DIR) CPP_SERVERS = $(TANGO_HOME)/classes ifdef no_debug DEBUG = -O else DEBUG = -g endif ifdef _solaris CC = CC BIN_DIR=$(OS)_CC AR_SL = $(CC) -mt -G VERS_OPT = -h SL_EXT = so endif ifdef linux CC = c++ CC_SHLIB = $(CC) -fPIC $(PROCESSOR)=1 ifdef x86_64 NBITS=_64 endif BIN_DIR=$(OS)$(NBITS) AR_SL = $(CC) -fPIC -shared SL_EXT = so VERS_OPT = -Wl,-soname, endif INCLUDE_DIRS = -I$(TANGO_HOME)/include -I. \ -I$(CPP_SERVERS)/include OBJS_DIR = obj/$(BIN_DIR) LIB_DIRS = -L $(CPP_SERVERS)/lib \ -L $(TANGO_HOME)/lib \ TARGET_LIB = $(CPP_SERVERS)/lib/libtgclasses.a #----------------------------------------- # Set CXXFLAGS and LFLAGS #----------------------------------------- ifdef _solaris CXXFLAGS = $(DEBUG) -mt -D_PTHREADS $(INCLUDE_DIRS) LFLAGS = $(DEBUG) $(LIB_DIRS) \ -ltango \ -llog4tango \ -lomniORB4 \ -lomniDynamic4 \ -lomnithread \ -lCOS4 \ -lpthread \ -lposix4 -lsocket -lnsl endif ifdef linux CXXFLAGS = $(DEBUG) -D_REENTRANT $(INCLUDE_DIRS) LFLAGS = $(DEBUG) $(LIB_DIRS) \ -ltango \ -llog4tango \ -lomniORB4 \ -lomniDynamic4 \ -lomnithread \ -lCOS4 \ -ldl -lpthread endif #----------------------------------------- # Set dependences #----------------------------------------- SVC_OBJS = $(OBJS_DIR)/$(CLASS).o \ $(OBJS_DIR)/$(CLASS)StateMachine.o \ $(OBJS_DIR)/$(CLASS)Class.o \ $(OBJS_DIR)/ClassFactory.o \ $(OBJS_DIR)/main.o SHLIB_OBJS = $(OBJS_DIR)/$(CLASS)Class.so.o \ $(OBJS_DIR)/$(CLASS)StateMachine.so.o \ $(OBJS_DIR)/$(CLASS).so.o SVC_INC = $(CLASS)Class.h \ $(CLASS).h $(OBJS_DIR)/%.o: %.cpp $(SVC_INC) $(CC) $(CXXFLAGS) -c $< -o $(OBJS_DIR)/$*.o $(OBJS_DIR)/%.so.o: %.cpp $(SVC_INC) $(CC_SHLIB) $(CXXFLAGS) -c $< -o $(OBJS_DIR)/$*.so.o #----------------------------------------- # Make Entry #----------------------------------------- all: $(CLASS) $(CLASS): make_obj_dir make_bin_dir $(SVC_OBJS) $(CC) $(SVC_OBJS) -o $(CLASS) $(LFLAGS) @mv $(CLASS) bin/$(BIN_DIR)/$(CLASS) shlib: make_obj_dir make_shlib_dir $(SHLIB_OBJS) $(AR_SL) -o \ shlib/$(BIN_DIR)/$(CLASS).$(SL_EXT).$(MAJOR_VERS).$(MINOR_VERS) \ $(VERS_OPT)$(CLASS).$(SL_EXT).$(MAJOR_VERS) \ $(SHLIB_OBJS) $(LFLAGS) @rm -f shlib/$(BIN_DIR)/$(CLASS).$(SL_EXT) @cd shlib/$(BIN_DIR); \ ln -s $(CLASS).$(SL_EXT).$(MAJOR_VERS).$(MINOR_VERS) $(CLASS).$(SL_EXT) clean: rm -f $(OBJS_DIR)/*.o \ $(OBJS_DIR)/*.so.o \ bin/$(BIN_DIR)/$(CLASS) \ core make_obj_dir: @mkdir -p obj @mkdir -p obj/$(BIN_DIR) make_bin_dir: @mkdir -p bin @mkdir -p bin/$(BIN_DIR) make_shlib_dir: @mkdir -p shlib @mkdir -p shlib/$(BIN_DIR) #----------------------------------------- # Install binary file #----------------------------------------- install: cp bin/$(BIN_DIR)/$(CLASS) $(CPP_SERVERS)/bin #----------------------------------------- # Update class library and header files # recompile without debug mode. #----------------------------------------- lib: clean @make no_debug=1 cp *.h $(CPP_SERVERS)/include ar ruv $(TARGET_LIB) $(OBJS_DIR)/$(CLASS).o ar ruv $(TARGET_LIB) $(OBJS_DIR)/$(CLASS)Class.o ar ruv $(TARGET_LIB) $(OBJS_DIR)/$(CLASS)StateMachine.o ident $(TARGET_LIB) | grep $(CLASS) #------------------------------------------------------ # Tag the CVS/SVN module corresponding to this class # copy cvs_tag or svn_tag to tag: entry #------------------------------------------------------ #svn_tag: # svn copy ../trunk ../tags/$(RELEASE) # svn commit ../tags/$(RELEASE) \ # -m "Tagging the $(RELEASE) of the $(CLASS) project." # #cvs_tag: # @cvstag "$(CLASS)-$(RELEASE)" # @make $(CLASS) # @make show_tag #show_cvs_tag: # @cvstag -d # # Only these make options work with the current Pogo version 5.3.x! tag: @cvstag "$(CLASS)-$(RELEASE)" @make $(CLASS) @make show_tag show_tag: @cvstag -d Node-path: powersupply/itest/BiltCh/trunk/main.cpp Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 2038 Text-content-md5: 708ce7eb5c3ace93859a66212624fda1 Content-length: 2048 PROPS-END static const char *RcsId = "$Id $"; //+============================================================================= // // file : main.cpp // // description : C++ source for a TANGO device server main. // The main rule is to initialise (and create) the Tango // system and to create the DServerClass singleton. // The main should be the same for every Tango device server. // // project : TANGO Device Server // // $Author: meyer $ // // $Revision: 1.1.1.1 $ $ // $Date: 2010-02-10 11:49:21 $ // // SVN only: // $HeadURL: $ // // CVS only: // $Source: /segfs/tango/cvsroot/cppserver/machine/powersupply/SrSteerers/tango/BiltCh/main.cpp,v $ // $Log: not supported by cvs2svn $ // Revision 1.1.1.1 2009/11/04 16:23:02 meyer // Imported using TkCVS // // // copyleft : European Synchrotron Radiation Facility // BP 220, Grenoble 38043 // FRANCE // //-============================================================================= // // This file is generated by POGO // (Program Obviously used to Generate tango Object) // // (c) - Software Engineering Group - ESRF //============================================================================= #include int main(int argc,char *argv[]) { Tango::Util *tg; try { // Initialise the device server //---------------------------------------- tg = Tango::Util::init(argc,argv); // Create the device server singleton // which will create everything //---------------------------------------- tg->server_init(false); // Run the endless loop //---------------------------------------- cout << "Ready to accept request" << endl; tg->server_run(); } catch (bad_alloc) { cout << "Can't allocate memory to store device object !!!" << endl; cout << "Exiting" << endl; } catch (CORBA::Exception &e) { Tango::Except::print_exception(e); cout << "Received a CORBA_Exception" << endl; cout << "Exiting" << endl; } tg->server_cleanup(); return(0); } Node-path: powersupply/itest/BiltCh/trunk/TangoClassID.txt Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 245 Text-content-md5: 3ad79b055e203a76144c6cc5e2c16a43 Content-length: 255 PROPS-END /** * Device Class Identification: * * Class Name : BiltCh * Contact : meyer@esrf.fr * Class Family : Miscellaneous * Platform : Unix Like * Bus : Tango * Manufacturer : itest * Reference : Bilt Module BE548 */ Revision-number: 18 Prop-content-length: 149 Content-length: 149 K 8 svn:date V 27 2010-02-10T11:49:22.000000Z K 7 svn:log V 75 This commit was manufactured by cvs2svn to create tag 'BiltCh-Release_1_0'. PROPS-END Node-path: powersupply/itest/BiltCh/tags/BiltCh-Release_1_0 Node-kind: dir Node-action: add Node-copyfrom-rev: 17 Node-copyfrom-path: powersupply/itest/BiltCh/trunk Revision-number: 19 Prop-content-length: 145 Content-length: 145 K 8 svn:date V 27 2010-02-10T11:49:23.000000Z K 7 svn:log V 71 This commit was manufactured by cvs2svn to create tag 'baseline-1_1_1'. PROPS-END Node-path: powersupply/itest/BiltCh/tags/baseline-1_1_1 Node-kind: dir Node-action: add Node-copyfrom-rev: 17 Node-copyfrom-path: powersupply/itest/BiltCh/trunk Revision-number: 20 Prop-content-length: 253 Content-length: 253 K 10 svn:author V 5 meyer K 8 svn:date V 27 2010-02-10T12:27:31.000000Z K 7 svn:log V 152 Restructured Bilt class. Acquistion is now done by a thread and only the multi channel data gets exported. A single channel class (BiltCh) was created. PROPS-END Node-path: powersupply/itest/Bilt/trunk/AcquisitionThread.cpp Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 5832 Text-content-md5: fcf131b831b3cb61602df8b88ed60955 Content-length: 5842 PROPS-END #include #include namespace Bilt_ns { AcquisitionThread::AcquisitionThread (Bilt *_bilt_ps, omni_mutex &d_m, omni_mutex &bilt_m) : Tango::LogAdapter(_bilt_ps), omni_thread(), data_mutex(d_m), bilt_mutex(bilt_m) { bilt_ps = _bilt_ps; last_update.tv_sec = 0; last_update.tv_usec = 0; updatePeriod = bilt_ps->updatePeriod; // cout << "AcquisitionThread::AcquisitionThread(): go to start thread ...\n"; start_undetached(); } //+------------------------------------------------------------------ /** * method: run_undetached() * * description: * */ //+------------------------------------------------------------------ void *AcquisitionThread::run_undetached(void*) { bool exit; INFO_STREAM << " AcquisitionThread::run_undetached() entering endless loop!" << endl; while (1) { { // copy to local variables omni_mutex_lock l(data_mutex); exit = bilt_ps->exit_thread; } /* exit the calculation thread */ if ( exit == true ) { break; } struct timeval now; gettimeofday (&now, NULL); double delay = (now.tv_sec * 1e6 + now.tv_usec) - (last_update.tv_sec * 1e6 + last_update.tv_usec); // only read new data every updatePeriod ms!! if ( delay < (updatePeriod * 1000) ) { // 20 ms struct timespec sleep_time = {0, SLEEP_NS}; nanosleep(&sleep_time, NULL); continue; } else { INFO_STREAM << "delay = " << delay/1000 << "ms" << endl; last_update = now; } // reset error variables mdata_errors.length(0); fdata_errors.length(0); // read_mdata() try { { // testing mdata.state = -2; mdata.idata[0].state = -2; mdata.idata[1].state = -2; mdata.idata[2].state = -2; mdata.idata[0].meascurr = -2; mdata.idata[1].meascurr = -2; mdata.idata[2].meascurr = -2; omni_mutex_lock l(bilt_mutex); bilt_ps->BILT->get_mdata (&mdata); // testing cout << "mag num = " << mdata.magnet << endl; cout << "mag state = " << mdata.state << endl; cout << "pole 0 = " << mdata.idata[0].state << " : " << mdata.idata[0].meascurr << endl; cout << "pole 1 = " << mdata.idata[1].state << " : " << mdata.idata[1].meascurr << endl; cout << "pole 2 = " << mdata.idata[2].state << " : " << mdata.idata[2].meascurr << endl<< endl; } mdata_errors.length(0); } catch (itest::ItestException &e) { create_tango_error (e, mdata_errors, "Read failure" , "Cannot read the mdata structure", "bilt_ps::read_mdata"); } // read_fdata() try { for (int i=0; iBILT->pole(i).get_fdata (&fdata[i]); } fdata_errors.length(0); } catch (itest::ItestException &e) { create_tango_error (e, fdata_errors, "Read failure" , "Cannot read the mdata structure", "bilt_ps::read_mdata"); } { struct timeval now; gettimeofday (&now, NULL); // copy the read data omni_mutex_lock l(data_mutex); bilt_ps->mdata_errors = mdata_errors; bilt_ps->fdata_errors = fdata_errors; bilt_ps->mdata.magnet = mdata.magnet; bilt_ps->mdata.state = mdata.state; for (int i=0; imdata.idata[i].magnet = mdata.idata[i].magnet; bilt_ps->mdata.idata[i].pole = mdata.idata[i].pole; bilt_ps->mdata.idata[i].state = mdata.idata[i].state; bilt_ps->mdata.idata[i].fail = mdata.idata[i].fail; bilt_ps->mdata.idata[i].measvolt = mdata.idata[i].measvolt; bilt_ps->mdata.idata[i].meascurr = mdata.idata[i].meascurr; bilt_ps->fdata[i].nbrframe_sec = fdata[i].nbrframe_sec; bilt_ps->fdata[i].nbrferr_sec = fdata[i].nbrferr_sec; bilt_ps->fdata[i].rms_ac_sett_sec = fdata[i].rms_ac_sett_sec; bilt_ps->fdata[i].average_sett_sec = fdata[i].average_sett_sec; bilt_ps->fdata[i].nbrferr = fdata[i].nbrferr; } // store time when data was read bilt_ps->data_read_time = now; } } return NULL; } //+------------------------------------------------------------------ /** * method: Bilt::create_tango_error() * * description: convert an itest exception into a tango error * * * in : - &e : Reference to itest exception * - errors : Tango error list to use, to store exception info * - reason : Reason of the local Tango exception to be added to the stack * - desc : Description for the local Tango exception to be added to the stack * - origin : Origin if the local Tango exception to be added to the stack */ //+------------------------------------------------------------------ void AcquisitionThread::create_tango_error (itest::ItestException &e, Tango::DevErrorList &errors, string reason, string desc, string origin) { DEBUG_STREAM << "Bilt::create_tango_exception(): entering... !" << endl; errors.length(e.errors.size() + 1); int i; for(i=0; i #include #include #include #include namespace Bilt_ns { //+---------------------------------------------------------------------------- // // method : Bilt::Bilt(string &s) // // description : constructor for simulated Bilt // // in : - cl : Pointer to the DeviceClass object // - s : Device name // //----------------------------------------------------------------------------- Bilt::Bilt(Tango::DeviceClass *cl,string &s) :Tango::Device_4Impl(cl,s.c_str()) { init_device(); } Bilt::Bilt(Tango::DeviceClass *cl,const char *s) :Tango::Device_4Impl(cl,s) { init_device(); } Bilt::Bilt(Tango::DeviceClass *cl,const char *s,const char *d) :Tango::Device_4Impl(cl,s,d) { init_device(); } //+---------------------------------------------------------------------------- // // method : Bilt::delete_device() // // description : will be called at device destruction or at init command. // //----------------------------------------------------------------------------- void Bilt::delete_device() { // Delete device allocated objects if ( acquisition_thread != NULL ) { data_mutex.lock(); exit_thread = true; data_mutex.unlock(); // join now the thread until it exits int *rv; acquisition_thread->join((void **)&rv); cout << "Bilt::delete_device(): Exit acquisition thread !!!" << endl; } // Delete connection to the power supply delete BILT; BILT = NULL; } //+---------------------------------------------------------------------------- // // method : Bilt::init_device() // // description : will be called at device initialization. // //----------------------------------------------------------------------------- void Bilt::init_device() { INFO_STREAM << "Bilt::Bilt() create device " << device_name << endl; // Initialise variables to default values //-------------------------------------------- get_device_property(); set_state (Tango::OFF); try { BILT = new itest::TMagnet (iPAddress.c_str(), magnetNumber); } catch (itest::ItestException &e) { try { create_tango_exception (e, mdata_errors, "Init failure" , "Cannot initialise ITEST libray objects", "Bilt::init_device"); } catch (Tango::DevFailed &e) { set_state (Tango::UNKNOWN); } } // initialise with the actual current set point values try { for (int i=0; ipole(i).get_current_DC(); } Tango::MultiAttribute *attr_list = get_device_attr(); Tango::WAttribute &attr_curr = attr_list->get_w_attr_by_name ("Currents"); attr_curr.set_write_value(¤ts_dc[0], currents_dc.size()); } catch (itest::ItestException &e) { try { create_tango_exception (e, mdata_errors, "Init failure" , "Cannot read the actual current set point values", "Bilt::init_device"); } catch (Tango::DevFailed &e) { set_state (Tango::UNKNOWN); } } // initialise and start the acquisition thread exit_thread = false; acquisition_thread = new AcquisitionThread(this, data_mutex, bilt_mutex); } //+---------------------------------------------------------------------------- // // method : Bilt::get_device_property() // // description : Read the device properties from database. // //----------------------------------------------------------------------------- void Bilt::get_device_property() { // Initialize your default values here (if not done with POGO). //------------------------------------------------------------------ BILT = NULL; acquisition_thread = NULL; struct timeval now; gettimeofday (&now, NULL); data_set_time = now; data_read_time = now; // intitialise mdada structure for magnet read values mdata.magnet = -1; mdata.state = -1; for (int i=0; i_UseDb==true) get_db_device()->get_property(dev_prop); Tango::DbDatum def_prop, cl_prop; BiltClass *ds_class = (static_cast(get_device_class())); int i = -1; // Try to initialize IPAddress from class property cl_prop = ds_class->get_class_property(dev_prop[++i].name); if (cl_prop.is_empty()==false) cl_prop >> iPAddress; else { // Try to initialize IPAddress from default device value def_prop = ds_class->get_default_device_property(dev_prop[i].name); if (def_prop.is_empty()==false) def_prop >> iPAddress; } // And try to extract IPAddress value from database if (dev_prop[i].is_empty()==false) dev_prop[i] >> iPAddress; // Try to initialize MagnetNumber from class property cl_prop = ds_class->get_class_property(dev_prop[++i].name); if (cl_prop.is_empty()==false) cl_prop >> magnetNumber; else { // Try to initialize MagnetNumber from default device value def_prop = ds_class->get_default_device_property(dev_prop[i].name); if (def_prop.is_empty()==false) def_prop >> magnetNumber; } // And try to extract MagnetNumber value from database if (dev_prop[i].is_empty()==false) dev_prop[i] >> magnetNumber; // Try to initialize UpdatePeriod from class property cl_prop = ds_class->get_class_property(dev_prop[++i].name); if (cl_prop.is_empty()==false) cl_prop >> updatePeriod; else { // Try to initialize UpdatePeriod from default device value def_prop = ds_class->get_default_device_property(dev_prop[i].name); if (def_prop.is_empty()==false) def_prop >> updatePeriod; } // And try to extract UpdatePeriod value from database if (dev_prop[i].is_empty()==false) dev_prop[i] >> updatePeriod; // End of Automatic code generation //------------------------------------------------------------------ } //+---------------------------------------------------------------------------- // // method : Bilt::always_executed_hook() // // description : method always executed before any command is executed // //----------------------------------------------------------------------------- void Bilt::always_executed_hook() { } //+---------------------------------------------------------------------------- // // method : Bilt::read_attr_hardware // // description : Hardware acquisition for attributes. // //----------------------------------------------------------------------------- void Bilt::read_attr_hardware(vector &attr_list) { DEBUG_STREAM << "Bilt::read_attr_hardware(vector &attr_list) entering... "<< endl; // Add your own code here } //+---------------------------------------------------------------------------- // // method : Bilt::read_FramesPerSecond // // description : Extract real attribute values for FramesPerSecond acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_FramesPerSecond(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_FramesPerSecond(Tango::Attribute &attr) entering... "<< endl; omni_mutex_lock l(data_mutex); if ( fdata_errors.length() != 0 ) attr.set_quality(Tango::ATTR_INVALID); else { for (int i=0; ipole(i).get_switch(); } if ( switch_state == 1 ) local_control[i] = false; else local_control[i] = true; } } catch (itest::ItestException &e) { create_tango_exception (e, "Read failure" , "Cannot read the actual switch states", "Bilt::read_LocalControls"); } attr.set_value (&(local_control[0]), POLES); } //+---------------------------------------------------------------------------- // // method : Bilt::read_SetCurrentsRMS // // description : Extract real attribute values for SetCurrentsRMS acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_SetCurrentsRMS(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_SetCurrentsRMS(Tango::Attribute &attr) entering... "<< endl; omni_mutex_lock l(data_mutex); if ( fdata_errors.length() != 0 ) attr.set_quality(Tango::ATTR_INVALID); else { for (int i=0; i CURRENT_LIMIT ) impedances[i] = fabs (mdata.idata[i].measvolt / mdata.idata[i].meascurr); else impedances[i] = nan(""); } attr.set_value (&(impedances[0]), POLES); } } //+---------------------------------------------------------------------------- // // method : Bilt::write_Currents // // description : Write Currents attribute values to hardware. // //----------------------------------------------------------------------------- void Bilt::write_Currents(Tango::WAttribute &attr) { DEBUG_STREAM << "Bilt::write_Currents(Tango::WAttribute &attr) entering... "<< endl; const double *set_currents; // check the correct number of setpoints if ( attr.get_write_value_length() == POLES ) attr.get_write_value(set_currents); else { TangoSys_MemStream tms; tms << "Wrong number of setpoints!" << endl; Tango::Except::throw_exception("WriteError", tms.str(), "Bilt::write_Currents"); } // apply setpoints to the poles try { for (int i=0; ipole(i).set_current_DC (set_currents[i]); } } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot write DC current values", "Bilt::write_Currents"); } // initialise the set time, to be sure that the next // returned read value is newer and contains the changes. struct timeval now; gettimeofday (&now, NULL); data_set_time = now; } //+---------------------------------------------------------------------------- // // method : Bilt::read_Currents // // description : Extract real attribute values for Currents acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_Currents(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_Currents(Tango::Attribute &attr) entering... "<< endl; // wait for the next data acquisition afer a current setpoint change double delay; { omni_mutex_lock l(data_mutex); delay = (data_set_time.tv_sec * 1e6 + data_set_time.tv_usec) - (data_read_time.tv_sec * 1e6 + data_read_time.tv_usec); //cout << "delay = " << delay << endl; } while ( delay > 0 ) { // 20 ms struct timespec sleep_time = {0, SLEEP_NS}; nanosleep(&sleep_time, NULL); omni_mutex_lock l(data_mutex); delay = (data_set_time.tv_sec * 1e6 + data_set_time.tv_usec) - (data_read_time.tv_sec * 1e6 + data_read_time.tv_usec); INFO_STREAM << "read waiting delay = " << delay << endl; } omni_mutex_lock l(data_mutex); if ( mdata_errors.length() != 0 ) attr.set_quality(Tango::ATTR_INVALID); else { for (int i=0; iset_state(1); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot switch on pole", "Bilt::on"); } } //+------------------------------------------------------------------ /** * method: Bilt::off * * description: method to execute "Off" * Turns of power supply * * */ //+------------------------------------------------------------------ void Bilt::off() { DEBUG_STREAM << "Bilt::off(): entering... !" << endl; // Add your own code to control device here try { omni_mutex_lock l(bilt_mutex); BILT->set_state(0); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot switch off pole", "Bilt::off"); } } //+------------------------------------------------------------------ /** * method: Bilt::reset * * description: method to execute "Reset" * Reset faults and alarms * * */ //+------------------------------------------------------------------ void Bilt::reset() { DEBUG_STREAM << "Bilt::reset(): entering... !" << endl; // Add your own code to control device here try { omni_mutex_lock l(bilt_mutex); BILT->clear_all_err(); BILT->clear_alarm(); for (int i=0; ipole(i).clear_ferrors(); } } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot reset pole", "Bilt::reset"); } } //+------------------------------------------------------------------ /** * method: Bilt::set_pole_ac_current * * description: method to execute "SetPoleAcCurrent" * Set the AC current for one Pole. * [0] = pole number, [1] = current * * @param argin * */ //+------------------------------------------------------------------ void Bilt::set_pole_ac_current(const Tango::DevVarDoubleArray *argin) { DEBUG_STREAM << "Bilt::set_pole_ac_current(): entering... !" << endl; // Add your own code to control device here // argin[0] = pole number if ( (*argin)[0] < 0 || (*argin)[0] >= POLES ) { TangoSys_MemStream tms; tms << "The entered Pole number is out of range" << endl; Tango::Except::throw_exception("WriteError", tms.str(), "Bilt::set_pole_ac_current"); } try { omni_mutex_lock l(bilt_mutex); BILT->pole((int)(*argin)[0]).set_current_AC ((*argin)[1]); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot write AC current value", "Bilt::set_pole_ac_current"); } } //+------------------------------------------------------------------ /** * method: Bilt::local_pole_control * * description: method to execute "LocalPoleControl" * Set the AC current for one Pole. * [0] = pole number, [1] = local control true/false * * @param argin * */ //+------------------------------------------------------------------ void Bilt::local_pole_control(const Tango::DevVarShortArray *argin) { DEBUG_STREAM << "Bilt::local_pole_control(): entering... !" << endl; // Add your own code to control device here // argin[0] = pole number if ( (*argin)[0] < 0 || (*argin)[0] >= POLES ) { TangoSys_MemStream tms; tms << "The entered Pole number is out of range" << endl; Tango::Except::throw_exception("WriteError", tms.str(), "Bilt::local_pole_control"); } // argin[1] = true or false (1 or 0 ) if ( (*argin)[1] != 0 && (*argin)[1] != 1 ) { TangoSys_MemStream tms; tms << "Local control can only be choosen as 0 or 1 (false or true)" << endl; Tango::Except::throw_exception("WriteError", tms.str(), "Bilt::local_pole_control"); } try { int switch_state; if ( (*argin)[1] == true ) switch_state = 0; else switch_state = 1; omni_mutex_lock l(bilt_mutex); BILT->pole((*argin)[0]).set_switch (switch_state); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot write switch state", "Bilt::local_pole_control"); } } //+------------------------------------------------------------------ /** * method: Bilt::set_pole_current * * description: method to execute "SetPoleCurrent" * Set the DC current for one Pole. * [0] = pole number, [1] = current * * @param argin * */ //+------------------------------------------------------------------ void Bilt::set_pole_current(const Tango::DevVarDoubleArray *argin) { DEBUG_STREAM << "Bilt::set_pole_current(): entering... !" << endl; // Add your own code to control device here // argin[0] = pole number if ( (*argin)[0] < 0 || (*argin)[0] >= POLES ) { TangoSys_MemStream tms; tms << "The entered Pole number is out of range" << endl; Tango::Except::throw_exception("WriteError", tms.str(), "Bilt::set_pole_current"); } try { omni_mutex_lock l(bilt_mutex); BILT->pole((int)(*argin)[0]).set_current_DC ((*argin)[1]); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot write current value", "Bilt::set_pole_current"); } // make sure that the current set values are correct! try { omni_mutex_lock l(bilt_mutex); for (int i=0; ipole(i).get_current_DC(); } Tango::MultiAttribute *attr_list = get_device_attr(); Tango::WAttribute &attr_curr = attr_list->get_w_attr_by_name ("Currents"); attr_curr.set_write_value(¤ts_dc[0], currents_dc.size()); } catch (itest::ItestException &e) { create_tango_exception (e, "Read failure" , "Cannot read the actual current set point values", "Bilt::set_pole_current"); } } //+------------------------------------------------------------------ /** * method: Bilt::create_tango_exception() * * description: convert an itest exception into a tango exception * * * in : - &e : Reference to itest exception * - reason : Reason of the local Tango exception to be added to the stack * - desc : Description for the local Tango exception to be added to the stack * - origin : Origin if the local Tango exception to be added to the stack */ //+------------------------------------------------------------------ void Bilt::create_tango_exception (itest::ItestException &e, string reason, string desc, string origin) { Tango::DevErrorList errors; create_tango_exception (e, errors, reason, desc, origin); } //+------------------------------------------------------------------ /** * method: Bilt::create_tango_exception() * * description: convert an itest exception into a tango exception * * * in : - &e : Reference to itest exception * - errors : Tango error list to use, to store exception info * - reason : Reason of the local Tango exception to be added to the stack * - desc : Description for the local Tango exception to be added to the stack * - origin : Origin if the local Tango exception to be added to the stack */ //+------------------------------------------------------------------ void Bilt::create_tango_exception (itest::ItestException &e, Tango::DevErrorList &errors, string reason, string desc, string origin) { DEBUG_STREAM << "Bilt::create_tango_exception(): entering... !" << endl; errors.length(e.errors.size() + 1); int i; for(i=0; idevice_status data member) and returns it to the caller. * * @return Status description * */ //+------------------------------------------------------------------ Tango::ConstDevString Bilt::dev_status() { //Tango::ConstDevString argout = DeviceImpl::dev_status(); DEBUG_STREAM << "Bilt::dev_status(): entering... !" << endl; // Add your own code to control device here stringstream status; Tango::DevState state = dev_state(); switch (state) { case Tango::ON: status << "State : ON" << endl; break; case Tango::OFF: status << "State : OFF" << endl; break; case Tango::ALARM: { status << "State : Alarm" << endl; omni_mutex_lock l(data_mutex); for (int i=0; i 10W in 10ms!" << endl; else { if ( mdata.idata[i].fail == "TEMP" ) status << "Fault descr. : Max. temp on semiconductor reached!" << endl; else { if ( mdata.idata[i].fail == "PWSO" ) status << "Fault descr. : Delivered power > 40W in 100ms!" << endl; else { status << "Fault descr. : Unkown fault code!" << endl; } } } } } } } break; } default: { status << "Pole state : Unknown" << endl; status << "Error stack : " << endl; omni_mutex_lock l(data_mutex); for(int i=0; idevice_state data member) and returns it to the caller. * * @return State Code * */ //+------------------------------------------------------------------ Tango::DevState Bilt::dev_state() { Tango::DevState argout = DeviceImpl::dev_state(); DEBUG_STREAM << "Bilt::dev_state(): entering... !" << endl; // Add your own code to control device here int state; omni_mutex_lock l(data_mutex); try { //read_mdata(); state = mdata.state; INFO_STREAM << "magnet state for " << get_name() << " = " << state << endl; } catch (Tango::DevFailed &e) { // do nothing! // Just avoid exceptions when executing state or status! } if ( mdata_errors.length() != 0 ) set_state (Tango::UNKNOWN); else { // set the device state switch (state) { case 0: set_state (Tango::OFF); break; case 1: set_state (Tango::ON); break; case 2: set_state (Tango::ALARM); break; case 3: set_state (Tango::FAULT); break; default: set_state (Tango::UNKNOWN); break; } } // Check for attribute alarms if ( get_state() == Tango::ON && argout == Tango::ALARM ) set_state (Tango::ALARM); return get_state(); } } // namespace Node-path: powersupply/itest/Bilt/trunk/Bilt.h Node-kind: file Node-action: change Text-content-length: 10838 Text-content-md5: d8dc657d14b4d3a42b8fe07063207660 Content-length: 10838 //============================================================================= // // file : Bilt.h // // description : Include for the Bilt class. // // project : BILT multi channel power supply // // $Author: meyer $ // // $Revision: 1.5 $ // $Date: 2010-02-10 12:27:31 $ // // SVN only: // $HeadURL: $ // // CVS only: // $Source: /segfs/tango/cvsroot/cppserver/machine/powersupply/SrSteerers/tango/Bilt/Bilt.h,v $ // $Log: not supported by cvs2svn $ // Revision 1.4 2009/11/27 13:49:26 meyer // Modified structure! The pole is no longer a device. // The device is now a magnet with three poles. // // Revision 1.3 2009/11/26 10:46:58 meyer // Updated for libMagnet_V120 // // Revision 1.2 2009/11/06 12:46:25 meyer // Added impedance attribute and corrected fromatting of attribute values. // // Revision 1.1.1.1 2009/11/04 16:23:02 meyer // Imported using TkCVS // // // copyleft : European Synchrotron Radiation Facility // BP 220, Grenoble 38043 // FRANCE // //============================================================================= // // This file is generated by POGO // (Program Obviously used to Generate tango Object) // // (c) - Software Engineering Group - ESRF //============================================================================= #ifndef _BILT_H #define _BILT_H #include #include #include //using namespace Tango; /** * @author $Author: meyer $ * @version $Revision: 1.5 $ */ // Add your own constant definitions here. //----------------------------------------------- // Number of poles per magnet #define POLES 3 // Current limit for a valid impedeance calculation #define CURRENT_LIMIT 0.005 // define sleep times #define SLEEP_NS 20000000 // 20 ms namespace Bilt_ns { /** * Class Description: * The BILT multi channel power supply will be used with 3 channels for the ESRF fast * feedback systems. * The power supply can be controlled in 2 ways : * By this device server for slow or human control or * by the Libera Beam Position monitors for fast feedback with closed loop control. * The devices are exported as one device per steerer magnet. Every device has three * channels. The channels (poles) cannot be switched on individually but have their * individual set points and measurement values. */ /* * Device States Description: * Tango::ON : Magnet is ON, all three channels are ON. * Tango::OFF : Magnet is OFF, all three channels are OFF. * Tango::FAULT : Error detected by the BILT magnet. * Tango::ALARM : Alarm detected on one or more channels. * Tango::UNKNOWN : Communication fault */ class Bilt: public Tango::Device_4Impl { public : // Add your own data members here //----------------------------------------- // Here is the Start of the automatic code generation part //------------------------------------------------------------- /** * @name attributes * Attribute member data. */ //@{ Tango::DevDouble *attr_Currents_read; Tango::DevDouble attr_Currents_write; Tango::DevDouble *attr_Voltages_read; Tango::DevDouble *attr_Impedances_read; Tango::DevDouble *attr_SetCurrentsRMS_read; Tango::DevDouble *attr_SetCurrentsAverage_read; Tango::DevULong *attr_FramesPerSecond_read; Tango::DevULong *attr_ErrorsPerSecond_read; Tango::DevULong *attr_ErrorCounters_read; Tango::DevBoolean *attr_LocalControls_read; //@} /** * @name Device properties * Device properties member data. */ //@{ /** * IP Address of BILT controller. * Each controller includes several magnets and * each magnet includes 3 power supplies, * for corrections in the X, Y and Z planes. * * */ string iPAddress; /** * Magnet number from 1 to 48 */ Tango::DevShort magnetNumber; /** * The update period for the data reading from the power supply in milli seconds. */ Tango::DevLong updatePeriod; //@} /** * @name Device properties * Device property member data. */ //@{ //@} /**@name Constructors * Miscellaneous constructors */ //@{ /** * Constructs a newly allocated Command object. * * @param cl Class. * @param s Device Name */ Bilt(Tango::DeviceClass *cl,string &s); /** * Constructs a newly allocated Command object. * * @param cl Class. * @param s Device Name */ Bilt(Tango::DeviceClass *cl,const char *s); /** * Constructs a newly allocated Command object. * * @param cl Class. * @param s Device name * @param d Device description. */ Bilt(Tango::DeviceClass *cl,const char *s,const char *d); //@} /**@name Destructor * Only one destructor is defined for this class */ //@{ /** * The object destructor. */ ~Bilt() {delete_device();}; /** * will be called at device destruction or at init command. */ void delete_device(); //@} /**@name Miscellaneous methods */ //@{ /** * Initialize the device */ virtual void init_device(); /** * Always executed method before execution command method. */ virtual void always_executed_hook(); //@} /** * @name Bilt methods prototypes */ //@{ /** * Hardware acquisition for attributes. */ virtual void read_attr_hardware(vector &attr_list); /** * Extract real attribute values for Currents acquisition result. */ virtual void read_Currents(Tango::Attribute &attr); /** * Write Currents attribute values to hardware. */ virtual void write_Currents(Tango::WAttribute &attr); /** * Extract real attribute values for Voltages acquisition result. */ virtual void read_Voltages(Tango::Attribute &attr); /** * Extract real attribute values for Impedances acquisition result. */ virtual void read_Impedances(Tango::Attribute &attr); /** * Extract real attribute values for SetCurrentsRMS acquisition result. */ virtual void read_SetCurrentsRMS(Tango::Attribute &attr); /** * Extract real attribute values for SetCurrentsAverage acquisition result. */ virtual void read_SetCurrentsAverage(Tango::Attribute &attr); /** * Extract real attribute values for FramesPerSecond acquisition result. */ virtual void read_FramesPerSecond(Tango::Attribute &attr); /** * Extract real attribute values for ErrorsPerSecond acquisition result. */ virtual void read_ErrorsPerSecond(Tango::Attribute &attr); /** * Extract real attribute values for ErrorCounters acquisition result. */ virtual void read_ErrorCounters(Tango::Attribute &attr); /** * Extract real attribute values for LocalControls acquisition result. */ virtual void read_LocalControls(Tango::Attribute &attr); /** * Read/Write allowed for Currents attribute. */ virtual bool is_Currents_allowed(Tango::AttReqType type); /** * Read/Write allowed for Voltages attribute. */ virtual bool is_Voltages_allowed(Tango::AttReqType type); /** * Read/Write allowed for Impedances attribute. */ virtual bool is_Impedances_allowed(Tango::AttReqType type); /** * Read/Write allowed for SetCurrentsRMS attribute. */ virtual bool is_SetCurrentsRMS_allowed(Tango::AttReqType type); /** * Read/Write allowed for SetCurrentsAverage attribute. */ virtual bool is_SetCurrentsAverage_allowed(Tango::AttReqType type); /** * Read/Write allowed for FramesPerSecond attribute. */ virtual bool is_FramesPerSecond_allowed(Tango::AttReqType type); /** * Read/Write allowed for ErrorsPerSecond attribute. */ virtual bool is_ErrorsPerSecond_allowed(Tango::AttReqType type); /** * Read/Write allowed for ErrorCounters attribute. */ virtual bool is_ErrorCounters_allowed(Tango::AttReqType type); /** * Read/Write allowed for LocalControls attribute. */ virtual bool is_LocalControls_allowed(Tango::AttReqType type); /** * Execution allowed for On command. */ virtual bool is_On_allowed(const CORBA::Any &any); /** * Execution allowed for Off command. */ virtual bool is_Off_allowed(const CORBA::Any &any); /** * Execution allowed for Reset command. */ virtual bool is_Reset_allowed(const CORBA::Any &any); /** * Execution allowed for SetPoleCurrent command. */ virtual bool is_SetPoleCurrent_allowed(const CORBA::Any &any); /** * Execution allowed for SetPoleAcCurrent command. */ virtual bool is_SetPoleAcCurrent_allowed(const CORBA::Any &any); /** * Execution allowed for LocalPoleControl command. */ virtual bool is_LocalPoleControl_allowed(const CORBA::Any &any); /** * This command gets the device state (stored in its device_state data member) and returns it to the caller. * @return State Code * @exception DevFailed */ virtual Tango::DevState dev_state(); /** * This command gets the device status (stored in its device_status data member) and returns it to the caller. * @return Status description * @exception DevFailed */ virtual Tango::ConstDevString dev_status(); /** * Turns on power supply. * @exception DevFailed */ void on(); /** * Turns of power supply * @exception DevFailed */ void off(); /** * Reset faults and alarms * @exception DevFailed */ void reset(); /** * Set the DC current for one Pole. * [0] = pole number, [1] = current * @param argin * @exception DevFailed */ void set_pole_current(const Tango::DevVarDoubleArray *); /** * Set the AC current for one Pole. * [0] = pole number, [1] = current * @param argin * @exception DevFailed */ void set_pole_ac_current(const Tango::DevVarDoubleArray *); /** * Set the AC current for one Pole. * [0] = pole number, [1] = local control true/false * @param argin * @exception DevFailed */ void local_pole_control(const Tango::DevVarShortArray *); /** * Read the device properties from database */ void get_device_property(); //@} // Here is the end of the automatic code generation part //------------------------------------------------------------- protected : // Add your own data members here //----------------------------------------- friend class AcquisitionThread; AcquisitionThread *acquisition_thread; omni_mutex data_mutex; omni_mutex bilt_mutex; short exit_thread; struct timeval data_set_time; struct timeval data_read_time; void create_tango_exception (itest::ItestException &e, string reason, string desc, string origin); void create_tango_exception (itest::ItestException &e, Tango::DevErrorList &errors, string reason, string desc, string origin); itest::TMagnet *BILT; struct itest::mdata mdata; struct itest::fdata fdata[POLES]; Tango::DevErrorList mdata_errors; Tango::DevErrorList fdata_errors; vector currents_dc; vector currents_ac; vector voltages; vector impedances; vector currents_rms; vector currents_average; vector frames_per_sec; vector errors_per_sec; vector error_counters; bool local_control[3]; }; } // namespace_ns #endif // _BILT_H Node-path: powersupply/itest/Bilt/trunk/BiltClass.cpp Node-kind: file Node-action: change Text-content-length: 24660 Text-content-md5: 573bf9d8f9fe074706c976ae70321bae Content-length: 24660 static const char *ClassId = "$Id: BiltClass.cpp,v 1.7 2010-02-10 12:27:31 meyer Exp $"; static const char *TagName = "$Name: not supported by cvs2svn $"; static const char *CvsPath = "$Source: /segfs/tango/cvsroot/cppserver/machine/powersupply/SrSteerers/tango/Bilt/BiltClass.cpp,v $"; static const char *SvnPath = "$HeadURL: $"; static const char *HttpServer = "http://www.esrf.fr/computing/cs/tango/tango_doc/ds_doc/"; //+============================================================================= // // file : BiltClass.cpp // // description : C++ source for the BiltClass. A singleton // class derived from DeviceClass. It implements the // command list and all properties and methods required // by the Bilt once per process. // // project : TANGO Device Server // // $Author: meyer $ // // $Revision: 1.7 $ // // $Log: not supported by cvs2svn $ // Revision 1.6 2009/12/18 12:02:18 meyer // Changed version number to 2.1 // // Revision 1.5 2009/11/27 13:49:26 meyer // Modified structure! The pole is no longer a device. // The device is now a magnet with three poles. // // Revision 1.4 2009/11/26 10:46:58 meyer // Updated for libMagnet_V120 // // Revision 1.3 2009/11/23 16:46:58 meyer // Corrected state, status and exception handling // // Revision 1.2 2009/11/06 12:46:25 meyer // Added impedance attribute and corrected fromatting of attribute values. // // Revision 1.1.1.1 2009/11/04 16:23:02 meyer // Imported using TkCVS // // // copyleft : European Synchrotron Radiation Facility // BP 220, Grenoble 38043 // FRANCE // //-============================================================================= // // This file is generated by POGO // (Program Obviously used to Generate tango Object) // // (c) - Software Engineering Group - ESRF //============================================================================= #include #include #include //+---------------------------------------------------------------------------- /** * Create BiltClass singleton and return it in a C function for Python usage */ //+---------------------------------------------------------------------------- extern "C" { #ifdef WIN32 __declspec(dllexport) #endif Tango::DeviceClass *_create_Bilt_class(const char *name) { return Bilt_ns::BiltClass::init(name); } } namespace Bilt_ns { //+---------------------------------------------------------------------------- // // method : SetPoleCurrentCmd::execute() // // description : method to trigger the execution of the command. // PLEASE DO NOT MODIFY this method core without pogo // // in : - device : The device on which the command must be executed // - in_any : The command input data // // returns : The command output data (packed in the Any object) // //----------------------------------------------------------------------------- CORBA::Any *SetPoleCurrentCmd::execute(Tango::DeviceImpl *device,const CORBA::Any &in_any) { cout2 << "SetPoleCurrentCmd::execute(): arrived" << endl; const Tango::DevVarDoubleArray *argin; extract(in_any, argin); ((static_cast(device))->set_pole_current(argin)); return new CORBA::Any(); } //+---------------------------------------------------------------------------- // // method : LocalPoleControlCmd::execute() // // description : method to trigger the execution of the command. // PLEASE DO NOT MODIFY this method core without pogo // // in : - device : The device on which the command must be executed // - in_any : The command input data // // returns : The command output data (packed in the Any object) // //----------------------------------------------------------------------------- CORBA::Any *LocalPoleControlCmd::execute(Tango::DeviceImpl *device,const CORBA::Any &in_any) { cout2 << "LocalPoleControlCmd::execute(): arrived" << endl; const Tango::DevVarShortArray *argin; extract(in_any, argin); ((static_cast(device))->local_pole_control(argin)); return new CORBA::Any(); } //+---------------------------------------------------------------------------- // // method : SetPoleAcCurrentCmd::execute() // // description : method to trigger the execution of the command. // PLEASE DO NOT MODIFY this method core without pogo // // in : - device : The device on which the command must be executed // - in_any : The command input data // // returns : The command output data (packed in the Any object) // //----------------------------------------------------------------------------- CORBA::Any *SetPoleAcCurrentCmd::execute(Tango::DeviceImpl *device,const CORBA::Any &in_any) { cout2 << "SetPoleAcCurrentCmd::execute(): arrived" << endl; const Tango::DevVarDoubleArray *argin; extract(in_any, argin); ((static_cast(device))->set_pole_ac_current(argin)); return new CORBA::Any(); } //+---------------------------------------------------------------------------- // // method : OnCmd::execute() // // description : method to trigger the execution of the command. // PLEASE DO NOT MODIFY this method core without pogo // // in : - device : The device on which the command must be executed // - in_any : The command input data // // returns : The command output data (packed in the Any object) // //----------------------------------------------------------------------------- CORBA::Any *OnCmd::execute(Tango::DeviceImpl *device,const CORBA::Any &in_any) { cout2 << "OnCmd::execute(): arrived" << endl; ((static_cast(device))->on()); return new CORBA::Any(); } //+---------------------------------------------------------------------------- // // method : OffCmd::execute() // // description : method to trigger the execution of the command. // PLEASE DO NOT MODIFY this method core without pogo // // in : - device : The device on which the command must be executed // - in_any : The command input data // // returns : The command output data (packed in the Any object) // //----------------------------------------------------------------------------- CORBA::Any *OffCmd::execute(Tango::DeviceImpl *device,const CORBA::Any &in_any) { cout2 << "OffCmd::execute(): arrived" << endl; ((static_cast(device))->off()); return new CORBA::Any(); } //+---------------------------------------------------------------------------- // // method : ResetCmd::execute() // // description : method to trigger the execution of the command. // PLEASE DO NOT MODIFY this method core without pogo // // in : - device : The device on which the command must be executed // - in_any : The command input data // // returns : The command output data (packed in the Any object) // //----------------------------------------------------------------------------- CORBA::Any *ResetCmd::execute(Tango::DeviceImpl *device,const CORBA::Any &in_any) { cout2 << "ResetCmd::execute(): arrived" << endl; ((static_cast(device))->reset()); return new CORBA::Any(); } // //---------------------------------------------------------------- // Initialize pointer for singleton pattern //---------------------------------------------------------------- // BiltClass *BiltClass::_instance = NULL; //+---------------------------------------------------------------------------- // // method : BiltClass::BiltClass(string &s) // // description : constructor for the BiltClass // // in : - s : The class name // //----------------------------------------------------------------------------- BiltClass::BiltClass(string &s):DeviceClass(s) { cout2 << "Entering BiltClass constructor" << endl; set_default_property(); get_class_property(); write_class_property(); cout2 << "Leaving BiltClass constructor" << endl; } //+---------------------------------------------------------------------------- // // method : BiltClass::~BiltClass() // // description : destructor for the BiltClass // //----------------------------------------------------------------------------- BiltClass::~BiltClass() { _instance = NULL; } //+---------------------------------------------------------------------------- // // method : BiltClass::instance // // description : Create the object if not already done. Otherwise, just // return a pointer to the object // // in : - name : The class name // //----------------------------------------------------------------------------- BiltClass *BiltClass::init(const char *name) { if (_instance == NULL) { try { string s(name); _instance = new BiltClass(s); } catch (bad_alloc) { throw; } } return _instance; } BiltClass *BiltClass::instance() { if (_instance == NULL) { cerr << "Class is not initialised !!" << endl; exit(-1); } return _instance; } //+---------------------------------------------------------------------------- // // method : BiltClass::command_factory // // description : Create the command object(s) and store them in the // command list // //----------------------------------------------------------------------------- void BiltClass::command_factory() { command_list.push_back(new OnCmd("On", Tango::DEV_VOID, Tango::DEV_VOID, "", "", Tango::OPERATOR)); command_list.push_back(new OffCmd("Off", Tango::DEV_VOID, Tango::DEV_VOID, "", "", Tango::OPERATOR)); command_list.push_back(new ResetCmd("Reset", Tango::DEV_VOID, Tango::DEV_VOID, "", "", Tango::OPERATOR)); command_list.push_back(new SetPoleCurrentCmd("SetPoleCurrent", Tango::DEVVAR_DOUBLEARRAY, Tango::DEV_VOID, "", "", Tango::OPERATOR)); command_list.push_back(new SetPoleAcCurrentCmd("SetPoleAcCurrent", Tango::DEVVAR_DOUBLEARRAY, Tango::DEV_VOID, "", "", Tango::OPERATOR)); command_list.push_back(new LocalPoleControlCmd("LocalPoleControl", Tango::DEVVAR_SHORTARRAY, Tango::DEV_VOID, "", "", Tango::OPERATOR)); // add polling if any for (unsigned int i=0 ; ilength() ; i++) { cout4 << "Device name : " << (*devlist_ptr)[i].in() << endl; // Create devices and add it into the device list //---------------------------------------------------- device_list.push_back(new Bilt(this, (*devlist_ptr)[i])); // Export device to the outside world // Check before if database used. //--------------------------------------------- if ((Tango::Util::_UseDb == true) && (Tango::Util::_FileDb == false)) export_device(device_list.back()); else export_device(device_list.back(), (*devlist_ptr)[i]); } // End of Automatic code generation //------------------------------------------------------------- } //+---------------------------------------------------------------------------- // Method: BiltClass::attribute_factory(vector &att_list) //----------------------------------------------------------------------------- void BiltClass::attribute_factory(vector &att_list) { // Attribute : Currents CurrentsAttrib *currents = new CurrentsAttrib(); Tango::UserDefaultAttrProp currents_prop; currents_prop.set_label("Currents"); currents_prop.set_unit("A"); currents_prop.set_format("%6.4f"); currents_prop.set_max_value("1.8"); currents_prop.set_min_value("-1.8"); currents_prop.set_description("The measured currents of the three poles."); currents->set_default_properties(currents_prop); att_list.push_back(currents); // Attribute : Voltages VoltagesAttrib *voltages = new VoltagesAttrib(); Tango::UserDefaultAttrProp voltages_prop; voltages_prop.set_label("Voltages"); voltages_prop.set_unit("V"); voltages_prop.set_format("%6.4"); voltages_prop.set_description("The measured voltages of the three poles."); voltages->set_default_properties(voltages_prop); att_list.push_back(voltages); // Attribute : Impedances ImpedancesAttrib *impedances = new ImpedancesAttrib(); Tango::UserDefaultAttrProp impedances_prop; impedances_prop.set_label("Impedances"); impedances_prop.set_unit("Ohm"); impedances_prop.set_format("%4.2f"); impedances_prop.set_max_alarm("5.0"); impedances_prop.set_description("Calculated impedances for the three poles."); impedances->set_default_properties(impedances_prop); att_list.push_back(impedances); // Attribute : SetCurrentsRMS SetCurrentsRMSAttrib *set_currents_rms = new SetCurrentsRMSAttrib(); Tango::UserDefaultAttrProp set_currents_rms_prop; set_currents_rms_prop.set_label("RMS AC current setpoints/s"); set_currents_rms_prop.set_unit("A"); set_currents_rms_prop.set_format("%6.4"); set_currents_rms_prop.set_description("Statistic when driven by the Libera. One RMS value for every pole\nof the magnet.\nRMS value of the AC setpoint applied on the DAC during the last second.\nX=sqr( (sum(setAC)*sum(setAC)) / n - ((sum(setAC)/n) *(sum(setAC)/n)) )"); set_currents_rms->set_default_properties(set_currents_rms_prop); att_list.push_back(set_currents_rms); // Attribute : SetCurrentsAverage SetCurrentsAverageAttrib *set_currents_average = new SetCurrentsAverageAttrib(); Tango::UserDefaultAttrProp set_currents_average_prop; set_currents_average_prop.set_label("Average AC current setpoints/s"); set_currents_average_prop.set_unit("A"); set_currents_average_prop.set_format("%6.4"); set_currents_average_prop.set_description("Statistic when driven by the Libera. One average value for every pole\nof the magnet.\nRMS value of the AC setpoint applied on the DAC during the last second.\nX=sqr( (sum(setAC)*sum(setAC)) / n - ((sum(setAC)/n) *(sum(setAC)/n)) )"); set_currents_average->set_default_properties(set_currents_average_prop); att_list.push_back(set_currents_average); // Attribute : FramesPerSecond FramesPerSecondAttrib *frames_per_second = new FramesPerSecondAttrib(); Tango::UserDefaultAttrProp frames_per_second_prop; frames_per_second_prop.set_label("Frames per second"); frames_per_second_prop.set_display_unit(" "); frames_per_second_prop.set_format("%6d"); frames_per_second->set_default_properties(frames_per_second_prop); att_list.push_back(frames_per_second); // Attribute : ErrorsPerSecond ErrorsPerSecondAttrib *errors_per_second = new ErrorsPerSecondAttrib(); Tango::UserDefaultAttrProp errors_per_second_prop; errors_per_second_prop.set_label("Errors per second"); errors_per_second_prop.set_display_unit(" "); errors_per_second_prop.set_format("%6d"); errors_per_second->set_default_properties(errors_per_second_prop); att_list.push_back(errors_per_second); // Attribute : ErrorCounters ErrorCountersAttrib *error_counters = new ErrorCountersAttrib(); Tango::UserDefaultAttrProp error_counters_prop; error_counters_prop.set_label("Error counters"); error_counters_prop.set_unit(" "); error_counters_prop.set_format("%6d"); error_counters_prop.set_description("Statistic when driven by the Libera.\nThe total number of errors since the last reset for the \nthree poles."); error_counters->set_default_properties(error_counters_prop); att_list.push_back(error_counters); // Attribute : LocalControls LocalControlsAttrib *local_controls = new LocalControlsAttrib(); att_list.push_back(local_controls); // End of Automatic code generation //------------------------------------------------------------- } //+---------------------------------------------------------------------------- // // method : BiltClass::get_class_property() // // description : Read the class properties from database. // //----------------------------------------------------------------------------- void BiltClass::get_class_property() { // Initialize your default values here (if not done with POGO). //------------------------------------------------------------------ // Read class properties from database.(Automatic code generation) //------------------------------------------------------------------ // Call database and extract values //-------------------------------------------- if (Tango::Util::instance()->_UseDb==true) get_db_class()->get_property(cl_prop); Tango::DbDatum def_prop; int i = -1; // End of Automatic code generation //------------------------------------------------------------------ } //+---------------------------------------------------------------------------- // // method : BiltClass::set_default_property // // description: Set default property (class and device) for wizard. // For each property, add to wizard property name and description // If default value has been set, add it to wizard property and // store it in a DbDatum. // //----------------------------------------------------------------------------- void BiltClass::set_default_property() { string prop_name; string prop_desc; string prop_def; vector vect_data; // Set Default Class Properties // Set Default Device Properties prop_name = "IPAddress"; prop_desc = "IP Address of BILT controller.\nEach controller includes several magnets and\neach magnet includes 3 power supplies,\nfor corrections in the X, Y and Z planes.\n\n"; prop_def = "0.0.0.0"; vect_data.clear(); vect_data.push_back("0.0.0.0"); if (prop_def.length()>0) { Tango::DbDatum data(prop_name); data << vect_data ; dev_def_prop.push_back(data); add_wiz_dev_prop(prop_name, prop_desc, prop_def); } else add_wiz_dev_prop(prop_name, prop_desc); prop_name = "MagnetNumber"; prop_desc = "Magnet number from 1 to 48"; prop_def = "0"; vect_data.clear(); vect_data.push_back("0"); if (prop_def.length()>0) { Tango::DbDatum data(prop_name); data << vect_data ; dev_def_prop.push_back(data); add_wiz_dev_prop(prop_name, prop_desc, prop_def); } else add_wiz_dev_prop(prop_name, prop_desc); prop_name = "UpdatePeriod"; prop_desc = "The update period for the data reading from the power supply in milli seconds."; prop_def = "1000"; vect_data.clear(); vect_data.push_back("1000"); if (prop_def.length()>0) { Tango::DbDatum data(prop_name); data << vect_data ; dev_def_prop.push_back(data); add_wiz_dev_prop(prop_name, prop_desc, prop_def); } else add_wiz_dev_prop(prop_name, prop_desc); } //+---------------------------------------------------------------------------- // // method : BiltClass::write_class_property // // description : Set class description as property in database // //----------------------------------------------------------------------------- void BiltClass::write_class_property() { // First time, check if database used //-------------------------------------------- if (Tango::Util::_UseDb == false) return; Tango::DbData data; string classname = get_name(); string header; string::size_type start, end; // Put title Tango::DbDatum title("ProjectTitle"); string str_title("BILT multi channel power supply"); title << str_title; data.push_back(title); // Put Description Tango::DbDatum description("Description"); vector str_desc; str_desc.push_back("The BILT multi channel power supply will be used with 3 channels for the ESRF fast"); str_desc.push_back("feedback systems."); str_desc.push_back("The power supply can be controlled in 2 ways :"); str_desc.push_back("By this device server for slow or human control or"); str_desc.push_back("by the Libera Beam Position monitors for fast feedback with closed loop control."); str_desc.push_back("The devices are exported as one device per steerer magnet. Every device has three"); str_desc.push_back("channels. The channels (poles) cannot be switched on individually but have their"); str_desc.push_back("individual set points and measurement values."); description << str_desc; data.push_back(description); // put cvs or svn location string filename(classname); filename += "Class.cpp"; // Create a string with the class ID to // get the string into the binary string class_id(ClassId); // check for cvs information string src_path(CvsPath); start = src_path.find("/"); if (start!=string::npos) { end = src_path.find(filename); if (end>start) { string strloc = src_path.substr(start, end-start); // Check if specific repository start = strloc.find("/cvsroot/"); if (start!=string::npos && start>0) { string repository = strloc.substr(0, start); if (repository.find("/segfs/")!=string::npos) strloc = "ESRF:" + strloc.substr(start, strloc.length()-start); } Tango::DbDatum cvs_loc("cvs_location"); cvs_loc << strloc; data.push_back(cvs_loc); } } // check for svn information else { string src_path(SvnPath); start = src_path.find("://"); if (start!=string::npos) { end = src_path.find(filename); if (end>start) { header = "$HeadURL: "; start = header.length(); string strloc = src_path.substr(start, (end-start)); Tango::DbDatum svn_loc("svn_location"); svn_loc << strloc; data.push_back(svn_loc); } } } // Get CVS or SVN revision tag // CVS tag string tagname(TagName); header = "$Name: "; start = header.length(); string endstr(" $"); end = tagname.find(endstr); if (end!=string::npos && end>start) { string strtag = tagname.substr(start, end-start); Tango::DbDatum cvs_tag("cvs_tag"); cvs_tag << strtag; data.push_back(cvs_tag); } // SVN tag string svnpath(SvnPath); header = "$HeadURL: "; start = header.length(); end = svnpath.find(endstr); if (end!=string::npos && end>start) { string strloc = svnpath.substr(start, end-start); string tagstr ("/tags/"); start = strloc.find(tagstr); if ( start!=string::npos ) { start = start + tagstr.length(); end = strloc.find(filename); string strtag = strloc.substr(start, end-start-1); Tango::DbDatum svn_tag("svn_tag"); svn_tag << strtag; data.push_back(svn_tag); } } // Get URL location string httpServ(HttpServer); if (httpServ.length()>0) { Tango::DbDatum db_doc_url("doc_url"); db_doc_url << httpServ; data.push_back(db_doc_url); } // Put inheritance Tango::DbDatum inher_datum("InheritedFrom"); vector inheritance; inheritance.push_back("Device_4Impl"); inher_datum << inheritance; data.push_back(inher_datum); // Call database and and values //-------------------------------------------- get_db_class()->put_property(data); } } // namespace Node-path: powersupply/itest/Bilt/trunk/BiltClass.h Node-kind: file Node-action: change Text-content-length: 11152 Text-content-md5: 2683207fd3598c8f4e892235d5c57583 Content-length: 11152 //============================================================================= // // file : BiltClass.h // // description : Include for the BiltClass root class. // This class is the singleton class for // the Bilt device class. // It contains all properties and methods which the // Bilt requires only once e.g. the commands. // // project : TANGO Device Server // // $Author: meyer $ // // $Revision: 1.5 $ // $Date: 2010-02-10 12:27:31 $ // // SVN only: // $HeadURL: $ // // CVS only: // $Source: /segfs/tango/cvsroot/cppserver/machine/powersupply/SrSteerers/tango/Bilt/BiltClass.h,v $ // $Log: not supported by cvs2svn $ // Revision 1.4 2009/11/27 13:49:26 meyer // Modified structure! The pole is no longer a device. // The device is now a magnet with three poles. // // Revision 1.3 2009/11/26 10:46:58 meyer // Updated for libMagnet_V120 // // Revision 1.2 2009/11/06 12:46:25 meyer // Added impedance attribute and corrected fromatting of attribute values. // // Revision 1.1.1.1 2009/11/04 16:23:02 meyer // Imported using TkCVS // // // copyleft : European Synchrotron Radiation Facility // BP 220, Grenoble 38043 // FRANCE // //============================================================================= // // This file is generated by POGO // (Program Obviously used to Generate tango Object) // // (c) - Software Engineering Group - ESRF //============================================================================= #ifndef _BILTCLASS_H #define _BILTCLASS_H #include #include namespace Bilt_ns {//===================================== // Define classes for attributes //===================================== class LocalControlsAttrib: public Tango::SpectrumAttr { public: LocalControlsAttrib():SpectrumAttr("LocalControls", Tango::DEV_BOOLEAN, Tango::READ, 5) {}; ~LocalControlsAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_LocalControls(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_LocalControls_allowed(ty);} }; class ErrorCountersAttrib: public Tango::SpectrumAttr { public: ErrorCountersAttrib():SpectrumAttr("ErrorCounters", Tango::DEV_ULONG, Tango::READ, 3) {}; ~ErrorCountersAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_ErrorCounters(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_ErrorCounters_allowed(ty);} }; class ErrorsPerSecondAttrib: public Tango::SpectrumAttr { public: ErrorsPerSecondAttrib():SpectrumAttr("ErrorsPerSecond", Tango::DEV_ULONG, Tango::READ, 3) {}; ~ErrorsPerSecondAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_ErrorsPerSecond(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_ErrorsPerSecond_allowed(ty);} }; class FramesPerSecondAttrib: public Tango::SpectrumAttr { public: FramesPerSecondAttrib():SpectrumAttr("FramesPerSecond", Tango::DEV_ULONG, Tango::READ, 3) {}; ~FramesPerSecondAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_FramesPerSecond(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_FramesPerSecond_allowed(ty);} }; class SetCurrentsAverageAttrib: public Tango::SpectrumAttr { public: SetCurrentsAverageAttrib():SpectrumAttr("SetCurrentsAverage", Tango::DEV_DOUBLE, Tango::READ, 3) {}; ~SetCurrentsAverageAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_SetCurrentsAverage(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_SetCurrentsAverage_allowed(ty);} }; class SetCurrentsRMSAttrib: public Tango::SpectrumAttr { public: SetCurrentsRMSAttrib():SpectrumAttr("SetCurrentsRMS", Tango::DEV_DOUBLE, Tango::READ, 3) {}; ~SetCurrentsRMSAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_SetCurrentsRMS(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_SetCurrentsRMS_allowed(ty);} }; class ImpedancesAttrib: public Tango::SpectrumAttr { public: ImpedancesAttrib():SpectrumAttr("Impedances", Tango::DEV_DOUBLE, Tango::READ, 3) {}; ~ImpedancesAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_Impedances(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_Impedances_allowed(ty);} }; class VoltagesAttrib: public Tango::SpectrumAttr { public: VoltagesAttrib():SpectrumAttr("Voltages", Tango::DEV_DOUBLE, Tango::READ, 3) {}; ~VoltagesAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_Voltages(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_Voltages_allowed(ty);} }; class CurrentsAttrib: public Tango::SpectrumAttr { public: CurrentsAttrib():SpectrumAttr("Currents", Tango::DEV_DOUBLE, Tango::READ_WRITE, 3) {}; ~CurrentsAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_Currents(att);} virtual void write(Tango::DeviceImpl *dev,Tango::WAttribute &att) {(static_cast(dev))->write_Currents(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_Currents_allowed(ty);} }; //========================================= // Define classes for commands //========================================= class LocalPoleControlCmd : public Tango::Command { public: LocalPoleControlCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out, const char *in_desc, const char *out_desc, Tango::DispLevel level) :Command(name,in,out,in_desc,out_desc, level) {}; LocalPoleControlCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out) :Command(name,in,out) {}; ~LocalPoleControlCmd() {}; virtual CORBA::Any *execute (Tango::DeviceImpl *dev, const CORBA::Any &any); virtual bool is_allowed (Tango::DeviceImpl *dev, const CORBA::Any &any) {return (static_cast(dev))->is_LocalPoleControl_allowed(any);} }; class SetPoleAcCurrentCmd : public Tango::Command { public: SetPoleAcCurrentCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out, const char *in_desc, const char *out_desc, Tango::DispLevel level) :Command(name,in,out,in_desc,out_desc, level) {}; SetPoleAcCurrentCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out) :Command(name,in,out) {}; ~SetPoleAcCurrentCmd() {}; virtual CORBA::Any *execute (Tango::DeviceImpl *dev, const CORBA::Any &any); virtual bool is_allowed (Tango::DeviceImpl *dev, const CORBA::Any &any) {return (static_cast(dev))->is_SetPoleAcCurrent_allowed(any);} }; class SetPoleCurrentCmd : public Tango::Command { public: SetPoleCurrentCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out, const char *in_desc, const char *out_desc, Tango::DispLevel level) :Command(name,in,out,in_desc,out_desc, level) {}; SetPoleCurrentCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out) :Command(name,in,out) {}; ~SetPoleCurrentCmd() {}; virtual CORBA::Any *execute (Tango::DeviceImpl *dev, const CORBA::Any &any); virtual bool is_allowed (Tango::DeviceImpl *dev, const CORBA::Any &any) {return (static_cast(dev))->is_SetPoleCurrent_allowed(any);} }; class ResetCmd : public Tango::Command { public: ResetCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out, const char *in_desc, const char *out_desc, Tango::DispLevel level) :Command(name,in,out,in_desc,out_desc, level) {}; ResetCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out) :Command(name,in,out) {}; ~ResetCmd() {}; virtual CORBA::Any *execute (Tango::DeviceImpl *dev, const CORBA::Any &any); virtual bool is_allowed (Tango::DeviceImpl *dev, const CORBA::Any &any) {return (static_cast(dev))->is_Reset_allowed(any);} }; class OffCmd : public Tango::Command { public: OffCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out, const char *in_desc, const char *out_desc, Tango::DispLevel level) :Command(name,in,out,in_desc,out_desc, level) {}; OffCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out) :Command(name,in,out) {}; ~OffCmd() {}; virtual CORBA::Any *execute (Tango::DeviceImpl *dev, const CORBA::Any &any); virtual bool is_allowed (Tango::DeviceImpl *dev, const CORBA::Any &any) {return (static_cast(dev))->is_Off_allowed(any);} }; class OnCmd : public Tango::Command { public: OnCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out, const char *in_desc, const char *out_desc, Tango::DispLevel level) :Command(name,in,out,in_desc,out_desc, level) {}; OnCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out) :Command(name,in,out) {}; ~OnCmd() {}; virtual CORBA::Any *execute (Tango::DeviceImpl *dev, const CORBA::Any &any); virtual bool is_allowed (Tango::DeviceImpl *dev, const CORBA::Any &any) {return (static_cast(dev))->is_On_allowed(any);} }; // // The BiltClass singleton definition // class #ifdef _TG_WINDOWS_ __declspec(dllexport) #endif BiltClass : public Tango::DeviceClass { public: // properties member data // add your own data members here //------------------------------------ public: Tango::DbData cl_prop; Tango::DbData cl_def_prop; Tango::DbData dev_def_prop; // Method prototypes static BiltClass *init(const char *); static BiltClass *instance(); ~BiltClass(); Tango::DbDatum get_class_property(string &); Tango::DbDatum get_default_device_property(string &); Tango::DbDatum get_default_class_property(string &); protected: BiltClass(string &); static BiltClass *_instance; void command_factory(); void get_class_property(); void attribute_factory(vector &); void write_class_property(); void set_default_property(); string get_cvstag(); string get_cvsroot(); private: void device_factory(const Tango::DevVarStringArray *); }; } // namespace Bilt_ns #endif // _BILTCLASS_H Node-path: powersupply/itest/Bilt/trunk/BiltStateMachine.cpp Node-kind: file Node-action: change Text-content-length: 8623 Text-content-md5: 8fe9a27ec745099259f5d897658962e6 Content-length: 8623 static const char *RcsId = "$Id $"; //+============================================================================= // // file : BiltStateMachine.cpp // // description : C++ source for the Bilt and its alowed // methods for commands and attributes // // project : TANGO Device Server // // $Author: meyer $ // // $Revision: 1.5 $ // $Date: 2010-02-10 12:27:31 $ // // SVN only: // $HeadURL: $ // // CVS only: // $Source: /segfs/tango/cvsroot/cppserver/machine/powersupply/SrSteerers/tango/Bilt/BiltStateMachine.cpp,v $ // $Log: not supported by cvs2svn $ // Revision 1.4 2009/11/27 13:49:26 meyer // Modified structure! The pole is no longer a device. // The device is now a magnet with three poles. // // Revision 1.3 2009/11/26 10:46:58 meyer // Updated for libMagnet_V120 // // Revision 1.2 2009/11/06 12:46:25 meyer // Added impedance attribute and corrected fromatting of attribute values. // // Revision 1.1.1.1 2009/11/04 16:23:02 meyer // Imported using TkCVS // // // copyleft : European Synchrotron Radiation Facility // BP 220, Grenoble 38043 // FRANCE // //-============================================================================= // // This file is generated by POGO // (Program Obviously used to Generate tango Object) // // (c) - Software Engineering Group - ESRF //============================================================================= #include #include #include /*==================================================================== * This file contains the methods to allow commands and attributes * read or write execution. * * If you wand to add your own code, add it between * the "End/Re-Start of Generated Code" comments. * * If you want, you can also add your own methods. *==================================================================== */ namespace Bilt_ns { //================================================= // Attributes Allowed Methods //================================================= //+---------------------------------------------------------------------------- // // method : Bilt::is_Voltages_allowed // // description : Read/Write allowed for Voltages attribute. // //----------------------------------------------------------------------------- bool Bilt::is_Voltages_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_Impedances_allowed // // description : Read/Write allowed for Impedances attribute. // //----------------------------------------------------------------------------- bool Bilt::is_Impedances_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_SetCurrentsRMS_allowed // // description : Read/Write allowed for SetCurrentsRMS attribute. // //----------------------------------------------------------------------------- bool Bilt::is_SetCurrentsRMS_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_SetCurrentsAverage_allowed // // description : Read/Write allowed for SetCurrentsAverage attribute. // //----------------------------------------------------------------------------- bool Bilt::is_SetCurrentsAverage_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_ErrorCounters_allowed // // description : Read/Write allowed for ErrorCounters attribute. // //----------------------------------------------------------------------------- bool Bilt::is_ErrorCounters_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_LocalControls_allowed // // description : Read/Write allowed for LocalControls attribute. // //----------------------------------------------------------------------------- bool Bilt::is_LocalControls_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_Currents_allowed // // description : Read/Write allowed for Currents attribute. // //----------------------------------------------------------------------------- bool Bilt::is_Currents_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_FramesPerSecond_allowed // // description : Read/Write allowed for FramesPerSecond attribute. // //----------------------------------------------------------------------------- bool Bilt::is_FramesPerSecond_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_ErrorsPerSecond_allowed // // description : Read/Write allowed for ErrorsPerSecond attribute. // //----------------------------------------------------------------------------- bool Bilt::is_ErrorsPerSecond_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //================================================= // Commands Allowed Methods //================================================= //+---------------------------------------------------------------------------- // // method : Bilt::is_On_allowed // // description : Execution allowed for On command. // //----------------------------------------------------------------------------- bool Bilt::is_On_allowed(const CORBA::Any &any) { if (get_state() == Tango::ON || get_state() == Tango::FAULT || get_state() == Tango::ALARM || get_state() == Tango::UNKNOWN) { // End of Generated Code // Re-Start of Generated Code return false; } return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_Off_allowed // // description : Execution allowed for Off command. // //----------------------------------------------------------------------------- bool Bilt::is_Off_allowed(const CORBA::Any &any) { if (get_state() == Tango::OFF) { // End of Generated Code // Re-Start of Generated Code return false; } return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_Reset_allowed // // description : Execution allowed for Reset command. // //----------------------------------------------------------------------------- bool Bilt::is_Reset_allowed(const CORBA::Any &any) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_SetPoleAcCurrent_allowed // // description : Execution allowed for SetPoleAcCurrent command. // //----------------------------------------------------------------------------- bool Bilt::is_SetPoleAcCurrent_allowed(const CORBA::Any &any) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_LocalPoleControl_allowed // // description : Execution allowed for LocalPoleControl command. // //----------------------------------------------------------------------------- bool Bilt::is_LocalPoleControl_allowed(const CORBA::Any &any) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_SetPoleCurrent_allowed // // description : Execution allowed for SetPoleCurrent command. // //----------------------------------------------------------------------------- bool Bilt::is_SetPoleCurrent_allowed(const CORBA::Any &any) { // End of Generated Code // Re-Start of Generated Code return true; } } // namespace Bilt_ns Node-path: powersupply/itest/Bilt/trunk/ClassFactory.cpp Node-kind: file Node-action: change Text-content-length: 1572 Text-content-md5: ffa4ad6aee1f50473c21cb8dbae310d1 Content-length: 1572 static const char *RcsId = "$Id: ClassFactory.cpp,v 1.2 2010-02-10 12:27:31 meyer Exp $"; //+============================================================================= // // file : ClassFactory.cpp // // description : C++ source for the class_factory method of the DServer // device class. This method is responsible for the creation of // all class singleton for a device server. It is called // at device server startup // // project : TANGO Device Server // // $Author: meyer $ // // $Revision: 1.2 $ // $Date: 2010-02-10 12:27:31 $ // // SVN only: // $HeadURL: $ // // CVS only: // $Source: /segfs/tango/cvsroot/cppserver/machine/powersupply/SrSteerers/tango/Bilt/ClassFactory.cpp,v $ // $Log: not supported by cvs2svn $ // Revision 1.1.1.1 2009/11/04 16:23:02 meyer // Imported using TkCVS // // // copyleft : European Synchrotron Radiation Facility // BP 220, Grenoble 38043 // FRANCE // //-============================================================================= // // This file is generated by POGO // (Program Obviously used to Generate tango Object) // // (c) - Software Engineering Group - ESRF //============================================================================= #include #include #include /** * Create BiltClass singleton and store it in DServer object. */ void Tango::DServer::class_factory() { add_class(Bilt_ns::BiltClass::init("Bilt")); add_class(BiltCh_ns::BiltChClass::init("BiltCh")); } Node-path: powersupply/itest/Bilt/trunk/Makefile Node-kind: file Node-action: change Text-content-length: 5586 Text-content-md5: b6b14336a5eb215f272c0f9843cf787d Content-length: 5586 #============================================================================= # # file : Makefile # # description : Include for the Bilt class. # # project : Makefile to generate a Tango server # # $Author: meyer $ # # $Revision: 1.6 $ # # $Log: not supported by cvs2svn $ # Revision 1.5 2009/12/18 12:02:18 meyer # Changed version number to 2.1 # # Revision 1.4 2009/12/18 10:19:23 meyer # Using libMagnet version 130 now. # # Revision 1.3 2009/11/27 13:49:26 meyer # Modified structure! The pole is no longer a device. # The device is now a magnet with three poles. # # Revision 1.2 2009/11/26 10:46:58 meyer # Updated for libMagnet_V120 # # Revision 1.1.1.1 2009/11/04 16:23:02 meyer # Imported using TkCVS # # # copyleft : European Synchrotron Radiation Facility # BP 220, Grenoble 38043 # FRANCE # #============================================================================= # This file is generated by POGO # (Program Obviously used to Generate tango Object) # # (c) - Software Engineering Group - ESRF #============================================================================= # CLASS = Bilt MAJOR_VERS = 2 MINOR_VERS = 1 RELEASE = Release_$(MAJOR_VERS)_$(MINOR_VERS) OS = $(shell /csadmin/common/scripts/get_os) PROCESSOR = $(shell uname -p) #----------------------------------------- # Set default home directories #----------------------------------------- TANGO_HOME = /segfs/tango/release/$(BIN_DIR) CPP_SERVERS = $(TANGO_HOME)/classes ifdef no_debug DEBUG = -O else DEBUG = -g endif ifdef _solaris CC = CC BIN_DIR=$(OS)_CC AR_SL = $(CC) -mt -G VERS_OPT = -h SL_EXT = so endif ifdef linux CC = c++ CC_SHLIB = $(CC) -fPIC $(PROCESSOR)=1 ifdef x86_64 NBITS=_64 endif BIN_DIR=$(OS)$(NBITS) AR_SL = $(CC) -fPIC -shared SL_EXT = so VERS_OPT = -Wl,-soname, endif INCLUDE_DIRS = -I$(TANGO_HOME)/include -I. \ -I$(CPP_SERVERS)/include \ -I libMagnet_V130 OBJS_DIR = obj/$(BIN_DIR) LIB_DIRS = -L $(CPP_SERVERS)/lib \ -L $(TANGO_HOME)/lib \ -L libMagnet_V130 TARGET_LIB = $(CPP_SERVERS)/lib/libtgclasses.a #----------------------------------------- # Set CXXFLAGS and LFLAGS #----------------------------------------- ifdef _solaris CXXFLAGS = $(DEBUG) -mt -D_PTHREADS $(INCLUDE_DIRS) LFLAGS = $(DEBUG) $(LIB_DIRS) \ -ltango \ -llog4tango \ -lomniORB4 \ -lomniDynamic4 \ -lomnithread \ -lCOS4 \ -lpthread \ -lposix4 -lsocket -lnsl \ -ltgclasses endif ifdef linux CXXFLAGS = $(DEBUG) -D_REENTRANT $(INCLUDE_DIRS) LFLAGS = $(DEBUG) $(LIB_DIRS) \ -ltango \ -llog4tango \ -lomniORB4 \ -lomniDynamic4 \ -lomnithread \ -lCOS4 \ -ldl -lpthread \ -lMagnet \ -ltgclasses endif #----------------------------------------- # Set dependences #----------------------------------------- SVC_OBJS = $(OBJS_DIR)/$(CLASS).o \ $(OBJS_DIR)/$(CLASS)StateMachine.o \ $(OBJS_DIR)/$(CLASS)Class.o \ $(OBJS_DIR)/AcquisitionThread.o \ $(OBJS_DIR)/ClassFactory.o \ $(OBJS_DIR)/main.o SHLIB_OBJS = $(OBJS_DIR)/$(CLASS)Class.so.o \ $(OBJS_DIR)/$(CLASS)StateMachine.so.o \ $(OBJS_DIR)/$(CLASS).so.o \ $(OBJS_DIR)/AcquisitionThread.o SVC_INC = $(CLASS)Class.h \ $(CLASS).h \ AcquisitionThread.h $(OBJS_DIR)/%.o: %.cpp $(SVC_INC) $(CC) $(CXXFLAGS) -c $< -o $(OBJS_DIR)/$*.o $(OBJS_DIR)/%.so.o: %.cpp $(SVC_INC) $(CC_SHLIB) $(CXXFLAGS) -c $< -o $(OBJS_DIR)/$*.so.o #----------------------------------------- # Make Entry #----------------------------------------- all: $(CLASS) $(CLASS): make_obj_dir make_bin_dir $(SVC_OBJS) $(CC) $(SVC_OBJS) -o $(CLASS) $(LFLAGS) @mv $(CLASS) bin/$(BIN_DIR)/$(CLASS) shlib: make_obj_dir make_shlib_dir $(SHLIB_OBJS) $(AR_SL) -o \ shlib/$(BIN_DIR)/$(CLASS).$(SL_EXT).$(MAJOR_VERS).$(MINOR_VERS) \ $(VERS_OPT)$(CLASS).$(SL_EXT).$(MAJOR_VERS) \ $(SHLIB_OBJS) $(LFLAGS) @rm -f shlib/$(BIN_DIR)/$(CLASS).$(SL_EXT) @cd shlib/$(BIN_DIR); \ ln -s $(CLASS).$(SL_EXT).$(MAJOR_VERS).$(MINOR_VERS) $(CLASS).$(SL_EXT) clean: rm -f $(OBJS_DIR)/*.o \ $(OBJS_DIR)/*.so.o \ bin/$(BIN_DIR)/$(CLASS) \ core make_obj_dir: @mkdir -p obj @mkdir -p obj/$(BIN_DIR) make_bin_dir: @mkdir -p bin @mkdir -p bin/$(BIN_DIR) make_shlib_dir: @mkdir -p shlib @mkdir -p shlib/$(BIN_DIR) #----------------------------------------- # Install binary file #----------------------------------------- install: cp bin/$(BIN_DIR)/$(CLASS) $(CPP_SERVERS)/bin #----------------------------------------- # Update class library and header files # recompile without debug mode. #----------------------------------------- lib: clean @make no_debug=1 cp *.h $(CPP_SERVERS)/include ar ruv $(TARGET_LIB) $(OBJS_DIR)/$(CLASS).o ar ruv $(TARGET_LIB) $(OBJS_DIR)/$(CLASS)Class.o ar ruv $(TARGET_LIB) $(OBJS_DIR)/$(CLASS)StateMachine.o ident $(TARGET_LIB) | grep $(CLASS) #------------------------------------------------------ # Tag the CVS/SVN module corresponding to this class # copy cvs_tag or svn_tag to tag: entry #------------------------------------------------------ #svn_tag: # svn copy ../trunk ../tags/$(RELEASE) # svn commit ../tags/$(RELEASE) \ # -m "Tagging the $(RELEASE) of the $(CLASS) project." # #cvs_tag: # @cvstag "$(CLASS)-$(RELEASE)" # @make $(CLASS) # @make show_tag #show_cvs_tag: # @cvstag -d # # Only these make options work with the current Pogo version 5.3.x! tag: @cvstag "$(CLASS)-$(RELEASE)" @make $(CLASS) @make show_tag show_tag: @cvstag -d Revision-number: 21 Prop-content-length: 147 Content-length: 147 K 8 svn:date V 27 2010-02-10T12:27:32.000000Z K 7 svn:log V 73 This commit was manufactured by cvs2svn to create tag 'Bilt-Release_3_0'. PROPS-END Node-path: powersupply/itest/Bilt/tags/Bilt-Release_3_0 Node-kind: dir Node-action: add Node-copyfrom-rev: 20 Node-copyfrom-path: powersupply/itest/Bilt/trunk Revision-number: 22 Prop-content-length: 112 Content-length: 112 K 10 svn:author V 5 meyer K 8 svn:date V 27 2010-02-10T16:22:15.000000Z K 7 svn:log V 12 Release_3_0 PROPS-END Node-path: powersupply/itest/Bilt/trunk/BiltClass.cpp Node-kind: file Node-action: change Text-content-length: 24868 Text-content-md5: fbcaa39acbc92e491bfbb3dbc8216753 Content-length: 24868 static const char *ClassId = "$Id: BiltClass.cpp,v 1.8 2010-02-10 16:22:15 meyer Exp $"; static const char *TagName = "$Name: not supported by cvs2svn $"; static const char *CvsPath = "$Source: /segfs/tango/cvsroot/cppserver/machine/powersupply/SrSteerers/tango/Bilt/BiltClass.cpp,v $"; static const char *SvnPath = "$HeadURL: $"; static const char *HttpServer = "http://www.esrf.fr/computing/cs/tango/tango_doc/ds_doc/"; //+============================================================================= // // file : BiltClass.cpp // // description : C++ source for the BiltClass. A singleton // class derived from DeviceClass. It implements the // command list and all properties and methods required // by the Bilt once per process. // // project : TANGO Device Server // // $Author: meyer $ // // $Revision: 1.8 $ // // $Log: not supported by cvs2svn $ // Revision 1.7 2010/02/10 12:27:31 meyer // Restructured Bilt class. // Acquistion is now done by a thread and only the multi channel data // gets exported. A single channel class (BiltCh) was created. // // Revision 1.6 2009/12/18 12:02:18 meyer // Changed version number to 2.1 // // Revision 1.5 2009/11/27 13:49:26 meyer // Modified structure! The pole is no longer a device. // The device is now a magnet with three poles. // // Revision 1.4 2009/11/26 10:46:58 meyer // Updated for libMagnet_V120 // // Revision 1.3 2009/11/23 16:46:58 meyer // Corrected state, status and exception handling // // Revision 1.2 2009/11/06 12:46:25 meyer // Added impedance attribute and corrected fromatting of attribute values. // // Revision 1.1.1.1 2009/11/04 16:23:02 meyer // Imported using TkCVS // // // copyleft : European Synchrotron Radiation Facility // BP 220, Grenoble 38043 // FRANCE // //-============================================================================= // // This file is generated by POGO // (Program Obviously used to Generate tango Object) // // (c) - Software Engineering Group - ESRF //============================================================================= #include #include #include //+---------------------------------------------------------------------------- /** * Create BiltClass singleton and return it in a C function for Python usage */ //+---------------------------------------------------------------------------- extern "C" { #ifdef WIN32 __declspec(dllexport) #endif Tango::DeviceClass *_create_Bilt_class(const char *name) { return Bilt_ns::BiltClass::init(name); } } namespace Bilt_ns { //+---------------------------------------------------------------------------- // // method : SetPoleCurrentCmd::execute() // // description : method to trigger the execution of the command. // PLEASE DO NOT MODIFY this method core without pogo // // in : - device : The device on which the command must be executed // - in_any : The command input data // // returns : The command output data (packed in the Any object) // //----------------------------------------------------------------------------- CORBA::Any *SetPoleCurrentCmd::execute(Tango::DeviceImpl *device,const CORBA::Any &in_any) { cout2 << "SetPoleCurrentCmd::execute(): arrived" << endl; const Tango::DevVarDoubleArray *argin; extract(in_any, argin); ((static_cast(device))->set_pole_current(argin)); return new CORBA::Any(); } //+---------------------------------------------------------------------------- // // method : LocalPoleControlCmd::execute() // // description : method to trigger the execution of the command. // PLEASE DO NOT MODIFY this method core without pogo // // in : - device : The device on which the command must be executed // - in_any : The command input data // // returns : The command output data (packed in the Any object) // //----------------------------------------------------------------------------- CORBA::Any *LocalPoleControlCmd::execute(Tango::DeviceImpl *device,const CORBA::Any &in_any) { cout2 << "LocalPoleControlCmd::execute(): arrived" << endl; const Tango::DevVarShortArray *argin; extract(in_any, argin); ((static_cast(device))->local_pole_control(argin)); return new CORBA::Any(); } //+---------------------------------------------------------------------------- // // method : SetPoleAcCurrentCmd::execute() // // description : method to trigger the execution of the command. // PLEASE DO NOT MODIFY this method core without pogo // // in : - device : The device on which the command must be executed // - in_any : The command input data // // returns : The command output data (packed in the Any object) // //----------------------------------------------------------------------------- CORBA::Any *SetPoleAcCurrentCmd::execute(Tango::DeviceImpl *device,const CORBA::Any &in_any) { cout2 << "SetPoleAcCurrentCmd::execute(): arrived" << endl; const Tango::DevVarDoubleArray *argin; extract(in_any, argin); ((static_cast(device))->set_pole_ac_current(argin)); return new CORBA::Any(); } //+---------------------------------------------------------------------------- // // method : OnCmd::execute() // // description : method to trigger the execution of the command. // PLEASE DO NOT MODIFY this method core without pogo // // in : - device : The device on which the command must be executed // - in_any : The command input data // // returns : The command output data (packed in the Any object) // //----------------------------------------------------------------------------- CORBA::Any *OnCmd::execute(Tango::DeviceImpl *device,const CORBA::Any &in_any) { cout2 << "OnCmd::execute(): arrived" << endl; ((static_cast(device))->on()); return new CORBA::Any(); } //+---------------------------------------------------------------------------- // // method : OffCmd::execute() // // description : method to trigger the execution of the command. // PLEASE DO NOT MODIFY this method core without pogo // // in : - device : The device on which the command must be executed // - in_any : The command input data // // returns : The command output data (packed in the Any object) // //----------------------------------------------------------------------------- CORBA::Any *OffCmd::execute(Tango::DeviceImpl *device,const CORBA::Any &in_any) { cout2 << "OffCmd::execute(): arrived" << endl; ((static_cast(device))->off()); return new CORBA::Any(); } //+---------------------------------------------------------------------------- // // method : ResetCmd::execute() // // description : method to trigger the execution of the command. // PLEASE DO NOT MODIFY this method core without pogo // // in : - device : The device on which the command must be executed // - in_any : The command input data // // returns : The command output data (packed in the Any object) // //----------------------------------------------------------------------------- CORBA::Any *ResetCmd::execute(Tango::DeviceImpl *device,const CORBA::Any &in_any) { cout2 << "ResetCmd::execute(): arrived" << endl; ((static_cast(device))->reset()); return new CORBA::Any(); } // //---------------------------------------------------------------- // Initialize pointer for singleton pattern //---------------------------------------------------------------- // BiltClass *BiltClass::_instance = NULL; //+---------------------------------------------------------------------------- // // method : BiltClass::BiltClass(string &s) // // description : constructor for the BiltClass // // in : - s : The class name // //----------------------------------------------------------------------------- BiltClass::BiltClass(string &s):DeviceClass(s) { cout2 << "Entering BiltClass constructor" << endl; set_default_property(); get_class_property(); write_class_property(); cout2 << "Leaving BiltClass constructor" << endl; } //+---------------------------------------------------------------------------- // // method : BiltClass::~BiltClass() // // description : destructor for the BiltClass // //----------------------------------------------------------------------------- BiltClass::~BiltClass() { _instance = NULL; } //+---------------------------------------------------------------------------- // // method : BiltClass::instance // // description : Create the object if not already done. Otherwise, just // return a pointer to the object // // in : - name : The class name // //----------------------------------------------------------------------------- BiltClass *BiltClass::init(const char *name) { if (_instance == NULL) { try { string s(name); _instance = new BiltClass(s); } catch (bad_alloc) { throw; } } return _instance; } BiltClass *BiltClass::instance() { if (_instance == NULL) { cerr << "Class is not initialised !!" << endl; exit(-1); } return _instance; } //+---------------------------------------------------------------------------- // // method : BiltClass::command_factory // // description : Create the command object(s) and store them in the // command list // //----------------------------------------------------------------------------- void BiltClass::command_factory() { command_list.push_back(new OnCmd("On", Tango::DEV_VOID, Tango::DEV_VOID, "", "", Tango::OPERATOR)); command_list.push_back(new OffCmd("Off", Tango::DEV_VOID, Tango::DEV_VOID, "", "", Tango::OPERATOR)); command_list.push_back(new ResetCmd("Reset", Tango::DEV_VOID, Tango::DEV_VOID, "", "", Tango::OPERATOR)); command_list.push_back(new SetPoleCurrentCmd("SetPoleCurrent", Tango::DEVVAR_DOUBLEARRAY, Tango::DEV_VOID, "", "", Tango::OPERATOR)); command_list.push_back(new SetPoleAcCurrentCmd("SetPoleAcCurrent", Tango::DEVVAR_DOUBLEARRAY, Tango::DEV_VOID, "", "", Tango::OPERATOR)); command_list.push_back(new LocalPoleControlCmd("LocalPoleControl", Tango::DEVVAR_SHORTARRAY, Tango::DEV_VOID, "", "", Tango::OPERATOR)); // add polling if any for (unsigned int i=0 ; ilength() ; i++) { cout4 << "Device name : " << (*devlist_ptr)[i].in() << endl; // Create devices and add it into the device list //---------------------------------------------------- device_list.push_back(new Bilt(this, (*devlist_ptr)[i])); // Export device to the outside world // Check before if database used. //--------------------------------------------- if ((Tango::Util::_UseDb == true) && (Tango::Util::_FileDb == false)) export_device(device_list.back()); else export_device(device_list.back(), (*devlist_ptr)[i]); } // End of Automatic code generation //------------------------------------------------------------- } //+---------------------------------------------------------------------------- // Method: BiltClass::attribute_factory(vector &att_list) //----------------------------------------------------------------------------- void BiltClass::attribute_factory(vector &att_list) { // Attribute : Currents CurrentsAttrib *currents = new CurrentsAttrib(); Tango::UserDefaultAttrProp currents_prop; currents_prop.set_label("Currents"); currents_prop.set_unit("A"); currents_prop.set_format("%6.4f"); currents_prop.set_max_value("1.8"); currents_prop.set_min_value("-1.8"); currents_prop.set_description("The measured currents of the three poles."); currents->set_default_properties(currents_prop); att_list.push_back(currents); // Attribute : Voltages VoltagesAttrib *voltages = new VoltagesAttrib(); Tango::UserDefaultAttrProp voltages_prop; voltages_prop.set_label("Voltages"); voltages_prop.set_unit("V"); voltages_prop.set_format("%6.4"); voltages_prop.set_description("The measured voltages of the three poles."); voltages->set_default_properties(voltages_prop); att_list.push_back(voltages); // Attribute : Impedances ImpedancesAttrib *impedances = new ImpedancesAttrib(); Tango::UserDefaultAttrProp impedances_prop; impedances_prop.set_label("Impedances"); impedances_prop.set_unit("Ohm"); impedances_prop.set_format("%4.2f"); impedances_prop.set_max_alarm("5.0"); impedances_prop.set_description("Calculated impedances for the three poles."); impedances->set_default_properties(impedances_prop); att_list.push_back(impedances); // Attribute : SetCurrentsRMS SetCurrentsRMSAttrib *set_currents_rms = new SetCurrentsRMSAttrib(); Tango::UserDefaultAttrProp set_currents_rms_prop; set_currents_rms_prop.set_label("RMS AC current setpoints/s"); set_currents_rms_prop.set_unit("A"); set_currents_rms_prop.set_format("%6.4"); set_currents_rms_prop.set_description("Statistic when driven by the Libera. One RMS value for every pole\nof the magnet.\nRMS value of the AC setpoint applied on the DAC during the last second.\nX=sqr( (sum(setAC)*sum(setAC)) / n - ((sum(setAC)/n) *(sum(setAC)/n)) )"); set_currents_rms->set_default_properties(set_currents_rms_prop); att_list.push_back(set_currents_rms); // Attribute : SetCurrentsAverage SetCurrentsAverageAttrib *set_currents_average = new SetCurrentsAverageAttrib(); Tango::UserDefaultAttrProp set_currents_average_prop; set_currents_average_prop.set_label("Average AC current setpoints/s"); set_currents_average_prop.set_unit("A"); set_currents_average_prop.set_format("%6.4"); set_currents_average_prop.set_description("Statistic when driven by the Libera. One average value for every pole\nof the magnet.\nRMS value of the AC setpoint applied on the DAC during the last second.\nX=sqr( (sum(setAC)*sum(setAC)) / n - ((sum(setAC)/n) *(sum(setAC)/n)) )"); set_currents_average->set_default_properties(set_currents_average_prop); att_list.push_back(set_currents_average); // Attribute : FramesPerSecond FramesPerSecondAttrib *frames_per_second = new FramesPerSecondAttrib(); Tango::UserDefaultAttrProp frames_per_second_prop; frames_per_second_prop.set_label("Frames per second"); frames_per_second_prop.set_display_unit(" "); frames_per_second_prop.set_format("%6d"); frames_per_second->set_default_properties(frames_per_second_prop); att_list.push_back(frames_per_second); // Attribute : ErrorsPerSecond ErrorsPerSecondAttrib *errors_per_second = new ErrorsPerSecondAttrib(); Tango::UserDefaultAttrProp errors_per_second_prop; errors_per_second_prop.set_label("Errors per second"); errors_per_second_prop.set_display_unit(" "); errors_per_second_prop.set_format("%6d"); errors_per_second->set_default_properties(errors_per_second_prop); att_list.push_back(errors_per_second); // Attribute : ErrorCounters ErrorCountersAttrib *error_counters = new ErrorCountersAttrib(); Tango::UserDefaultAttrProp error_counters_prop; error_counters_prop.set_label("Error counters"); error_counters_prop.set_unit(" "); error_counters_prop.set_format("%6d"); error_counters_prop.set_description("Statistic when driven by the Libera.\nThe total number of errors since the last reset for the \nthree poles."); error_counters->set_default_properties(error_counters_prop); att_list.push_back(error_counters); // Attribute : LocalControls LocalControlsAttrib *local_controls = new LocalControlsAttrib(); att_list.push_back(local_controls); // End of Automatic code generation //------------------------------------------------------------- } //+---------------------------------------------------------------------------- // // method : BiltClass::get_class_property() // // description : Read the class properties from database. // //----------------------------------------------------------------------------- void BiltClass::get_class_property() { // Initialize your default values here (if not done with POGO). //------------------------------------------------------------------ // Read class properties from database.(Automatic code generation) //------------------------------------------------------------------ // Call database and extract values //-------------------------------------------- if (Tango::Util::instance()->_UseDb==true) get_db_class()->get_property(cl_prop); Tango::DbDatum def_prop; int i = -1; // End of Automatic code generation //------------------------------------------------------------------ } //+---------------------------------------------------------------------------- // // method : BiltClass::set_default_property // // description: Set default property (class and device) for wizard. // For each property, add to wizard property name and description // If default value has been set, add it to wizard property and // store it in a DbDatum. // //----------------------------------------------------------------------------- void BiltClass::set_default_property() { string prop_name; string prop_desc; string prop_def; vector vect_data; // Set Default Class Properties // Set Default Device Properties prop_name = "IPAddress"; prop_desc = "IP Address of BILT controller.\nEach controller includes several magnets and\neach magnet includes 3 power supplies,\nfor corrections in the X, Y and Z planes.\n\n"; prop_def = "0.0.0.0"; vect_data.clear(); vect_data.push_back("0.0.0.0"); if (prop_def.length()>0) { Tango::DbDatum data(prop_name); data << vect_data ; dev_def_prop.push_back(data); add_wiz_dev_prop(prop_name, prop_desc, prop_def); } else add_wiz_dev_prop(prop_name, prop_desc); prop_name = "MagnetNumber"; prop_desc = "Magnet number from 1 to 48"; prop_def = "0"; vect_data.clear(); vect_data.push_back("0"); if (prop_def.length()>0) { Tango::DbDatum data(prop_name); data << vect_data ; dev_def_prop.push_back(data); add_wiz_dev_prop(prop_name, prop_desc, prop_def); } else add_wiz_dev_prop(prop_name, prop_desc); prop_name = "UpdatePeriod"; prop_desc = "The update period for the data reading from the power supply in milli seconds."; prop_def = "1000"; vect_data.clear(); vect_data.push_back("1000"); if (prop_def.length()>0) { Tango::DbDatum data(prop_name); data << vect_data ; dev_def_prop.push_back(data); add_wiz_dev_prop(prop_name, prop_desc, prop_def); } else add_wiz_dev_prop(prop_name, prop_desc); } //+---------------------------------------------------------------------------- // // method : BiltClass::write_class_property // // description : Set class description as property in database // //----------------------------------------------------------------------------- void BiltClass::write_class_property() { // First time, check if database used //-------------------------------------------- if (Tango::Util::_UseDb == false) return; Tango::DbData data; string classname = get_name(); string header; string::size_type start, end; // Put title Tango::DbDatum title("ProjectTitle"); string str_title("BILT multi channel power supply"); title << str_title; data.push_back(title); // Put Description Tango::DbDatum description("Description"); vector str_desc; str_desc.push_back("The BILT multi channel power supply will be used with 3 channels for the ESRF fast"); str_desc.push_back("feedback systems."); str_desc.push_back("The power supply can be controlled in 2 ways :"); str_desc.push_back("By this device server for slow or human control or"); str_desc.push_back("by the Libera Beam Position monitors for fast feedback with closed loop control."); str_desc.push_back("The devices are exported as one device per steerer magnet. Every device has three"); str_desc.push_back("channels. The channels (poles) cannot be switched on individually but have their"); str_desc.push_back("individual set points and measurement values."); description << str_desc; data.push_back(description); // put cvs or svn location string filename(classname); filename += "Class.cpp"; // Create a string with the class ID to // get the string into the binary string class_id(ClassId); // check for cvs information string src_path(CvsPath); start = src_path.find("/"); if (start!=string::npos) { end = src_path.find(filename); if (end>start) { string strloc = src_path.substr(start, end-start); // Check if specific repository start = strloc.find("/cvsroot/"); if (start!=string::npos && start>0) { string repository = strloc.substr(0, start); if (repository.find("/segfs/")!=string::npos) strloc = "ESRF:" + strloc.substr(start, strloc.length()-start); } Tango::DbDatum cvs_loc("cvs_location"); cvs_loc << strloc; data.push_back(cvs_loc); } } // check for svn information else { string src_path(SvnPath); start = src_path.find("://"); if (start!=string::npos) { end = src_path.find(filename); if (end>start) { header = "$HeadURL: "; start = header.length(); string strloc = src_path.substr(start, (end-start)); Tango::DbDatum svn_loc("svn_location"); svn_loc << strloc; data.push_back(svn_loc); } } } // Get CVS or SVN revision tag // CVS tag string tagname(TagName); header = "$Name: "; start = header.length(); string endstr(" $"); end = tagname.find(endstr); if (end!=string::npos && end>start) { string strtag = tagname.substr(start, end-start); Tango::DbDatum cvs_tag("cvs_tag"); cvs_tag << strtag; data.push_back(cvs_tag); } // SVN tag string svnpath(SvnPath); header = "$HeadURL: "; start = header.length(); end = svnpath.find(endstr); if (end!=string::npos && end>start) { string strloc = svnpath.substr(start, end-start); string tagstr ("/tags/"); start = strloc.find(tagstr); if ( start!=string::npos ) { start = start + tagstr.length(); end = strloc.find(filename); string strtag = strloc.substr(start, end-start-1); Tango::DbDatum svn_tag("svn_tag"); svn_tag << strtag; data.push_back(svn_tag); } } // Get URL location string httpServ(HttpServer); if (httpServ.length()>0) { Tango::DbDatum db_doc_url("doc_url"); db_doc_url << httpServ; data.push_back(db_doc_url); } // Put inheritance Tango::DbDatum inher_datum("InheritedFrom"); vector inheritance; inheritance.push_back("Device_4Impl"); inher_datum << inheritance; data.push_back(inher_datum); // Call database and and values //-------------------------------------------- get_db_class()->put_property(data); } } // namespace Node-path: powersupply/itest/Bilt/trunk/Makefile Node-kind: file Node-action: change Text-content-length: 5789 Text-content-md5: b290ef2c6e64531687e19019da6b6776 Content-length: 5789 #============================================================================= # # file : Makefile # # description : Include for the Bilt class. # # project : Makefile to generate a Tango server # # $Author: meyer $ # # $Revision: 1.7 $ # # $Log: not supported by cvs2svn $ # Revision 1.6 2010/02/10 12:27:31 meyer # Restructured Bilt class. # Acquistion is now done by a thread and only the multi channel data # gets exported. A single channel class (BiltCh) was created. # # Revision 1.5 2009/12/18 12:02:18 meyer # Changed version number to 2.1 # # Revision 1.4 2009/12/18 10:19:23 meyer # Using libMagnet version 130 now. # # Revision 1.3 2009/11/27 13:49:26 meyer # Modified structure! The pole is no longer a device. # The device is now a magnet with three poles. # # Revision 1.2 2009/11/26 10:46:58 meyer # Updated for libMagnet_V120 # # Revision 1.1.1.1 2009/11/04 16:23:02 meyer # Imported using TkCVS # # # copyleft : European Synchrotron Radiation Facility # BP 220, Grenoble 38043 # FRANCE # #============================================================================= # This file is generated by POGO # (Program Obviously used to Generate tango Object) # # (c) - Software Engineering Group - ESRF #============================================================================= # CLASS = Bilt MAJOR_VERS = 3 MINOR_VERS = 0 RELEASE = Release_$(MAJOR_VERS)_$(MINOR_VERS) OS = $(shell /csadmin/common/scripts/get_os) PROCESSOR = $(shell uname -p) #----------------------------------------- # Set default home directories #----------------------------------------- TANGO_HOME = /segfs/tango/release/$(BIN_DIR) CPP_SERVERS = $(TANGO_HOME)/classes ifdef no_debug DEBUG = -O else DEBUG = -g endif ifdef _solaris CC = CC BIN_DIR=$(OS)_CC AR_SL = $(CC) -mt -G VERS_OPT = -h SL_EXT = so endif ifdef linux CC = c++ CC_SHLIB = $(CC) -fPIC $(PROCESSOR)=1 ifdef x86_64 NBITS=_64 endif BIN_DIR=$(OS)$(NBITS) AR_SL = $(CC) -fPIC -shared SL_EXT = so VERS_OPT = -Wl,-soname, endif INCLUDE_DIRS = -I$(TANGO_HOME)/include -I. \ -I$(CPP_SERVERS)/include \ -I libMagnet_V130 OBJS_DIR = obj/$(BIN_DIR) LIB_DIRS = -L $(CPP_SERVERS)/lib \ -L $(TANGO_HOME)/lib \ -L libMagnet_V130 TARGET_LIB = $(CPP_SERVERS)/lib/libtgclasses.a #----------------------------------------- # Set CXXFLAGS and LFLAGS #----------------------------------------- ifdef _solaris CXXFLAGS = $(DEBUG) -mt -D_PTHREADS $(INCLUDE_DIRS) LFLAGS = $(DEBUG) $(LIB_DIRS) \ -ltango \ -llog4tango \ -lomniORB4 \ -lomniDynamic4 \ -lomnithread \ -lCOS4 \ -lpthread \ -lposix4 -lsocket -lnsl \ -ltgclasses endif ifdef linux CXXFLAGS = $(DEBUG) -D_REENTRANT $(INCLUDE_DIRS) LFLAGS = $(DEBUG) $(LIB_DIRS) \ -ltango \ -llog4tango \ -lomniORB4 \ -lomniDynamic4 \ -lomnithread \ -lCOS4 \ -ldl -lpthread \ -lMagnet \ -ltgclasses endif #----------------------------------------- # Set dependences #----------------------------------------- SVC_OBJS = $(OBJS_DIR)/$(CLASS).o \ $(OBJS_DIR)/$(CLASS)StateMachine.o \ $(OBJS_DIR)/$(CLASS)Class.o \ $(OBJS_DIR)/AcquisitionThread.o \ $(OBJS_DIR)/ClassFactory.o \ $(OBJS_DIR)/main.o SHLIB_OBJS = $(OBJS_DIR)/$(CLASS)Class.so.o \ $(OBJS_DIR)/$(CLASS)StateMachine.so.o \ $(OBJS_DIR)/$(CLASS).so.o \ $(OBJS_DIR)/AcquisitionThread.o SVC_INC = $(CLASS)Class.h \ $(CLASS).h \ AcquisitionThread.h $(OBJS_DIR)/%.o: %.cpp $(SVC_INC) $(CC) $(CXXFLAGS) -c $< -o $(OBJS_DIR)/$*.o $(OBJS_DIR)/%.so.o: %.cpp $(SVC_INC) $(CC_SHLIB) $(CXXFLAGS) -c $< -o $(OBJS_DIR)/$*.so.o #----------------------------------------- # Make Entry #----------------------------------------- all: $(CLASS) $(CLASS): make_obj_dir make_bin_dir $(SVC_OBJS) $(CC) $(SVC_OBJS) -o $(CLASS) $(LFLAGS) @mv $(CLASS) bin/$(BIN_DIR)/$(CLASS) shlib: make_obj_dir make_shlib_dir $(SHLIB_OBJS) $(AR_SL) -o \ shlib/$(BIN_DIR)/$(CLASS).$(SL_EXT).$(MAJOR_VERS).$(MINOR_VERS) \ $(VERS_OPT)$(CLASS).$(SL_EXT).$(MAJOR_VERS) \ $(SHLIB_OBJS) $(LFLAGS) @rm -f shlib/$(BIN_DIR)/$(CLASS).$(SL_EXT) @cd shlib/$(BIN_DIR); \ ln -s $(CLASS).$(SL_EXT).$(MAJOR_VERS).$(MINOR_VERS) $(CLASS).$(SL_EXT) clean: rm -f $(OBJS_DIR)/*.o \ $(OBJS_DIR)/*.so.o \ bin/$(BIN_DIR)/$(CLASS) \ core make_obj_dir: @mkdir -p obj @mkdir -p obj/$(BIN_DIR) make_bin_dir: @mkdir -p bin @mkdir -p bin/$(BIN_DIR) make_shlib_dir: @mkdir -p shlib @mkdir -p shlib/$(BIN_DIR) #----------------------------------------- # Install binary file #----------------------------------------- install: cp bin/$(BIN_DIR)/$(CLASS) $(CPP_SERVERS)/bin #----------------------------------------- # Update class library and header files # recompile without debug mode. #----------------------------------------- lib: clean @make no_debug=1 cp *.h $(CPP_SERVERS)/include ar ruv $(TARGET_LIB) $(OBJS_DIR)/$(CLASS).o ar ruv $(TARGET_LIB) $(OBJS_DIR)/$(CLASS)Class.o ar ruv $(TARGET_LIB) $(OBJS_DIR)/$(CLASS)StateMachine.o ident $(TARGET_LIB) | grep $(CLASS) #------------------------------------------------------ # Tag the CVS/SVN module corresponding to this class # copy cvs_tag or svn_tag to tag: entry #------------------------------------------------------ #svn_tag: # svn copy ../trunk ../tags/$(RELEASE) # svn commit ../tags/$(RELEASE) \ # -m "Tagging the $(RELEASE) of the $(CLASS) project." # #cvs_tag: # @cvstag "$(CLASS)-$(RELEASE)" # @make $(CLASS) # @make show_tag #show_cvs_tag: # @cvstag -d # # Only these make options work with the current Pogo version 5.3.x! tag: @cvstag "$(CLASS)-$(RELEASE)" @make $(CLASS) @make show_tag show_tag: @cvstag -d Revision-number: 23 Prop-content-length: 112 Content-length: 112 K 10 svn:author V 5 meyer K 8 svn:date V 27 2010-02-10T16:22:40.000000Z K 7 svn:log V 12 Release_1_0 PROPS-END Node-path: powersupply/itest/BiltCh/trunk/BiltChClass.cpp Node-kind: file Node-action: change Text-content-length: 18658 Text-content-md5: c5c5dc7d54437adb3ca755a2a06dc79e Content-length: 18658 static const char *ClassId = "$Id: BiltChClass.cpp,v 1.2 2010-02-10 16:22:40 meyer Exp $"; static const char *TagName = "$Name: not supported by cvs2svn $"; static const char *CvsPath = "$Source: /segfs/tango/cvsroot/cppserver/machine/powersupply/SrSteerers/tango/BiltCh/BiltChClass.cpp,v $"; static const char *SvnPath = "$HeadURL: $"; static const char *HttpServer = "http://www.esrf.fr/computing/cs/tango/tango_doc/ds_doc/"; //+============================================================================= // // file : BiltChClass.cpp // // description : C++ source for the BiltChClass. A singleton // class derived from DeviceClass. It implements the // command list and all properties and methods required // by the BiltCh once per process. // // project : TANGO Device Server // // $Author: meyer $ // // $Revision: 1.2 $ // // $Log: not supported by cvs2svn $ // Revision 1.1.1.1 2010-02-10 11:49:21 meyer // Imported using TkCVS // // // copyleft : European Synchrotron Radiation Facility // BP 220, Grenoble 38043 // FRANCE // //-============================================================================= // // This file is generated by POGO // (Program Obviously used to Generate tango Object) // // (c) - Software Engineering Group - ESRF //============================================================================= #include #include #include //+---------------------------------------------------------------------------- /** * Create BiltChClass singleton and return it in a C function for Python usage */ //+---------------------------------------------------------------------------- extern "C" { #ifdef WIN32 __declspec(dllexport) #endif Tango::DeviceClass *_create_BiltCh_class(const char *name) { return BiltCh_ns::BiltChClass::init(name); } } namespace BiltCh_ns { // //---------------------------------------------------------------- // Initialize pointer for singleton pattern //---------------------------------------------------------------- // BiltChClass *BiltChClass::_instance = NULL; //+---------------------------------------------------------------------------- // // method : BiltChClass::BiltChClass(string &s) // // description : constructor for the BiltChClass // // in : - s : The class name // //----------------------------------------------------------------------------- BiltChClass::BiltChClass(string &s):DeviceClass(s) { cout2 << "Entering BiltChClass constructor" << endl; set_default_property(); get_class_property(); write_class_property(); cout2 << "Leaving BiltChClass constructor" << endl; } //+---------------------------------------------------------------------------- // // method : BiltChClass::~BiltChClass() // // description : destructor for the BiltChClass // //----------------------------------------------------------------------------- BiltChClass::~BiltChClass() { _instance = NULL; } //+---------------------------------------------------------------------------- // // method : BiltChClass::instance // // description : Create the object if not already done. Otherwise, just // return a pointer to the object // // in : - name : The class name // //----------------------------------------------------------------------------- BiltChClass *BiltChClass::init(const char *name) { if (_instance == NULL) { try { string s(name); _instance = new BiltChClass(s); } catch (bad_alloc) { throw; } } return _instance; } BiltChClass *BiltChClass::instance() { if (_instance == NULL) { cerr << "Class is not initialised !!" << endl; exit(-1); } return _instance; } //+---------------------------------------------------------------------------- // // method : BiltChClass::command_factory // // description : Create the command object(s) and store them in the // command list // //----------------------------------------------------------------------------- void BiltChClass::command_factory() { // add polling if any for (unsigned int i=0 ; ilength() ; i++) { cout4 << "Device name : " << (*devlist_ptr)[i].in() << endl; // Create devices and add it into the device list //---------------------------------------------------- device_list.push_back(new BiltCh(this, (*devlist_ptr)[i])); // Export device to the outside world // Check before if database used. //--------------------------------------------- if ((Tango::Util::_UseDb == true) && (Tango::Util::_FileDb == false)) export_device(device_list.back()); else export_device(device_list.back(), (*devlist_ptr)[i]); } // End of Automatic code generation //------------------------------------------------------------- } //+---------------------------------------------------------------------------- // Method: BiltChClass::attribute_factory(vector &att_list) //----------------------------------------------------------------------------- void BiltChClass::attribute_factory(vector &att_list) { // Attribute : Current CurrentAttrib *current = new CurrentAttrib(); Tango::UserDefaultAttrProp current_prop; current_prop.set_label("DC Current"); current_prop.set_unit("A"); current_prop.set_format("%6.4f"); current_prop.set_max_value("1.8"); current_prop.set_min_value("-1.8"); current_prop.set_description("The DC current of the selected pole."); current->set_default_properties(current_prop); att_list.push_back(current); // Attribute : Voltage VoltageAttrib *voltage = new VoltageAttrib(); Tango::UserDefaultAttrProp voltage_prop; voltage_prop.set_label("Voltage"); voltage_prop.set_unit("V"); voltage_prop.set_format("%6.4f"); voltage_prop.set_description("The measured voltage of the selected pole."); voltage->set_default_properties(voltage_prop); att_list.push_back(voltage); // Attribute : Impedance ImpedanceAttrib *impedance = new ImpedanceAttrib(); Tango::UserDefaultAttrProp impedance_prop; impedance_prop.set_label("Impedance"); impedance_prop.set_unit("Ohm"); impedance_prop.set_format("%4.2f"); impedance_prop.set_max_alarm("5.0"); impedance_prop.set_description("Calculated impedance of the selected pole."); impedance->set_default_properties(impedance_prop); att_list.push_back(impedance); // Attribute : SetCurrentRMS SetCurrentRMSAttrib *set_current_rms = new SetCurrentRMSAttrib(); Tango::UserDefaultAttrProp set_current_rms_prop; set_current_rms_prop.set_label("RMS AC current setpoint/s"); set_current_rms_prop.set_unit("A"); set_current_rms_prop.set_format("%6.4f"); set_current_rms_prop.set_description("Statistic when driven by the Libera.\nRMS value of the AC setpoint applied on the DAC during the last second.\nX=sqr( (sum(setAC)*sum(setAC)) / n - ((sum(setAC)/n) *(sum(setAC)/n)) )"); set_current_rms->set_default_properties(set_current_rms_prop); att_list.push_back(set_current_rms); // Attribute : SetCurrentAverage SetCurrentAverageAttrib *set_current_average = new SetCurrentAverageAttrib(); Tango::UserDefaultAttrProp set_current_average_prop; set_current_average_prop.set_label("Average AC current setpoint/s"); set_current_average_prop.set_unit("A"); set_current_average_prop.set_format("%6.4f"); set_current_average_prop.set_description("Statistic when driven by the Libera.\nThe average AC setpoint applied to the DAC during the last second.\nX=SUM(setAC)/n"); set_current_average->set_default_properties(set_current_average_prop); att_list.push_back(set_current_average); // Attribute : FramesPerSecond FramesPerSecondAttrib *frames_per_second = new FramesPerSecondAttrib(); Tango::UserDefaultAttrProp frames_per_second_prop; frames_per_second_prop.set_label("Frames/s"); frames_per_second_prop.set_unit(" "); frames_per_second_prop.set_format("%3d"); frames_per_second_prop.set_description("Statistic when driven by the Libera.\nThe number of setpoints per second."); frames_per_second->set_default_properties(frames_per_second_prop); att_list.push_back(frames_per_second); // Attribute : ErrorPerSecond ErrorPerSecondAttrib *error_per_second = new ErrorPerSecondAttrib(); Tango::UserDefaultAttrProp error_per_second_prop; error_per_second_prop.set_label("Errors/s"); error_per_second_prop.set_unit(" "); error_per_second_prop.set_format("%3d"); error_per_second_prop.set_description("Statistic when driven by the Libera.\nThe number of errors detected per second."); error_per_second->set_default_properties(error_per_second_prop); att_list.push_back(error_per_second); // Attribute : ErrorCounter ErrorCounterAttrib *error_counter = new ErrorCounterAttrib(); Tango::UserDefaultAttrProp error_counter_prop; error_counter_prop.set_label("Error Counter"); error_counter_prop.set_unit(" "); error_counter_prop.set_format("%6d"); error_counter_prop.set_description("Statistic when driven by the Libera.\nThe total number of errors since the last reset."); error_counter->set_default_properties(error_counter_prop); att_list.push_back(error_counter); // Attribute : LocalControl LocalControlAttrib *local_control = new LocalControlAttrib(); Tango::UserDefaultAttrProp local_control_prop; local_control_prop.set_label("Local Control"); local_control_prop.set_unit(" "); local_control_prop.set_description("If true the AC current can be set on the device,\notherwise it is driven by the Libera."); local_control->set_default_properties(local_control_prop); att_list.push_back(local_control); // Attribute : SetCurrentAC SetCurrentACAttrib *set_current_ac = new SetCurrentACAttrib(); Tango::UserDefaultAttrProp set_current_ac_prop; set_current_ac_prop.set_label("AC Current Setpoint"); set_current_ac_prop.set_unit("A"); set_current_ac_prop.set_format("%5.4f"); set_current_ac_prop.set_max_value("0.2"); set_current_ac_prop.set_min_value("-0.2"); set_current_ac_prop.set_description("The AC current setpoint in local mode. If driven by the Libera, the attribute \nattribute value in INVALID."); set_current_ac->set_default_properties(set_current_ac_prop); att_list.push_back(set_current_ac); // End of Automatic code generation //------------------------------------------------------------- } //+---------------------------------------------------------------------------- // // method : BiltChClass::get_class_property() // // description : Read the class properties from database. // //----------------------------------------------------------------------------- void BiltChClass::get_class_property() { // Initialize your default values here (if not done with POGO). //------------------------------------------------------------------ // Read class properties from database.(Automatic code generation) //------------------------------------------------------------------ // Call database and extract values //-------------------------------------------- if (Tango::Util::instance()->_UseDb==true) get_db_class()->get_property(cl_prop); Tango::DbDatum def_prop; int i = -1; // End of Automatic code generation //------------------------------------------------------------------ } //+---------------------------------------------------------------------------- // // method : BiltChClass::set_default_property // // description: Set default property (class and device) for wizard. // For each property, add to wizard property name and description // If default value has been set, add it to wizard property and // store it in a DbDatum. // //----------------------------------------------------------------------------- void BiltChClass::set_default_property() { string prop_name; string prop_desc; string prop_def; vector vect_data; // Set Default Class Properties // Set Default Device Properties prop_name = "BiltName"; prop_desc = "Name of the Bilt multi channel power supply device\n"; prop_def = "none"; vect_data.clear(); vect_data.push_back("none"); if (prop_def.length()>0) { Tango::DbDatum data(prop_name); data << vect_data ; dev_def_prop.push_back(data); add_wiz_dev_prop(prop_name, prop_desc, prop_def); } else add_wiz_dev_prop(prop_name, prop_desc); prop_name = "PoleNumber"; prop_desc = "The number of the channel or Pole of the Bilt power supply [0 -2]"; prop_def = "-1"; vect_data.clear(); vect_data.push_back("-1"); if (prop_def.length()>0) { Tango::DbDatum data(prop_name); data << vect_data ; dev_def_prop.push_back(data); add_wiz_dev_prop(prop_name, prop_desc, prop_def); } else add_wiz_dev_prop(prop_name, prop_desc); } //+---------------------------------------------------------------------------- // // method : BiltChClass::write_class_property // // description : Set class description as property in database // //----------------------------------------------------------------------------- void BiltChClass::write_class_property() { // First time, check if database used //-------------------------------------------- if (Tango::Util::_UseDb == false) return; Tango::DbData data; string classname = get_name(); string header; string::size_type start, end; // Put title Tango::DbDatum title("ProjectTitle"); string str_title("BILT channel interface"); title << str_title; data.push_back(title); // Put Description Tango::DbDatum description("Description"); vector str_desc; str_desc.push_back("The Bilt multi channel power supply has three individual channels."); str_desc.push_back("This class offers an interface to an individual channel of the power supply."); description << str_desc; data.push_back(description); // put cvs or svn location string filename(classname); filename += "Class.cpp"; // Create a string with the class ID to // get the string into the binary string class_id(ClassId); // check for cvs information string src_path(CvsPath); start = src_path.find("/"); if (start!=string::npos) { end = src_path.find(filename); if (end>start) { string strloc = src_path.substr(start, end-start); // Check if specific repository start = strloc.find("/cvsroot/"); if (start!=string::npos && start>0) { string repository = strloc.substr(0, start); if (repository.find("/segfs/")!=string::npos) strloc = "ESRF:" + strloc.substr(start, strloc.length()-start); } Tango::DbDatum cvs_loc("cvs_location"); cvs_loc << strloc; data.push_back(cvs_loc); } } // check for svn information else { string src_path(SvnPath); start = src_path.find("://"); if (start!=string::npos) { end = src_path.find(filename); if (end>start) { header = "$HeadURL: "; start = header.length(); string strloc = src_path.substr(start, (end-start)); Tango::DbDatum svn_loc("svn_location"); svn_loc << strloc; data.push_back(svn_loc); } } } // Get CVS or SVN revision tag // CVS tag string tagname(TagName); header = "$Name: "; start = header.length(); string endstr(" $"); end = tagname.find(endstr); if (end!=string::npos && end>start) { string strtag = tagname.substr(start, end-start); Tango::DbDatum cvs_tag("cvs_tag"); cvs_tag << strtag; data.push_back(cvs_tag); } // SVN tag string svnpath(SvnPath); header = "$HeadURL: "; start = header.length(); end = svnpath.find(endstr); if (end!=string::npos && end>start) { string strloc = svnpath.substr(start, end-start); string tagstr ("/tags/"); start = strloc.find(tagstr); if ( start!=string::npos ) { start = start + tagstr.length(); end = strloc.find(filename); string strtag = strloc.substr(start, end-start-1); Tango::DbDatum svn_tag("svn_tag"); svn_tag << strtag; data.push_back(svn_tag); } } // Get URL location string httpServ(HttpServer); if (httpServ.length()>0) { Tango::DbDatum db_doc_url("doc_url"); db_doc_url << httpServ; data.push_back(db_doc_url); } // Put inheritance Tango::DbDatum inher_datum("InheritedFrom"); vector inheritance; inheritance.push_back("Device_4Impl"); inher_datum << inheritance; data.push_back(inher_datum); // Call database and and values //-------------------------------------------- get_db_class()->put_property(data); } } // namespace Revision-number: 24 Prop-content-length: 173 Content-length: 173 K 10 svn:author V 5 meyer K 8 svn:date V 27 2010-02-11T16:35:27.000000Z K 7 svn:log V 73 Currents settings understand NaN values. Deleted StePoleCurrent command. PROPS-END Node-path: powersupply/itest/Bilt/trunk/Bilt.cpp Node-kind: file Node-action: change Text-content-length: 32170 Text-content-md5: b16934bad406d7855d892802d364461b Content-length: 32170 static const char *RcsId = "$Id: Bilt.cpp,v 1.9 2010-02-11 16:35:27 meyer Exp $"; //+============================================================================= // // file : Bilt.cpp // // description : C++ source for the Bilt and its commands. // The class is derived from Device. It represents the // CORBA servant object which will be accessed from the // network. All commands which can be executed on the // Bilt are implemented in this file. // // project : TANGO Device Server // // $Author: meyer $ // // $Revision: 1.9 $ // // $Revision: 1.9 $ // $Date: 2010-02-11 16:35:27 $ // // SVN only: // $HeadURL: $ // // CVS only: // $Source: /segfs/tango/cvsroot/cppserver/machine/powersupply/SrSteerers/tango/Bilt/Bilt.cpp,v $ // $Log: not supported by cvs2svn $ // Revision 1.8 2010/02/10 12:27:31 meyer // Restructured Bilt class. // Acquistion is now done by a thread and only the multi channel data // gets exported. A single channel class (BiltCh) was created. // // Revision 1.7 2009/12/18 12:01:40 meyer // Corrected alarm handling in dev_state() // // Revision 1.6 2009/11/27 13:49:26 meyer // Modified structure! The pole is no longer a device. // The device is now a magnet with three poles. // // Revision 1.5 2009/11/26 10:46:58 meyer // Updated for libMagnet_V120 // // Revision 1.4 2009/11/24 09:21:46 meyer // Absolut value for impedance // // Revision 1.3 2009/11/23 16:46:58 meyer // Corrected state, status and exception handling // // Revision 1.2 2009/11/06 12:46:25 meyer // Added impedance attribute and corrected fromatting of attribute values. // // Revision 1.1.1.1 2009/11/04 16:23:02 meyer // Imported using TkCVS // // // copyleft : European Synchrotron Radiation Facility // BP 220, Grenoble 38043 // FRANCE // //-============================================================================= // // This file is generated by POGO // (Program Obviously used to Generate tango Object) // // (c) - Software Engineering Group - ESRF //============================================================================= //=================================================================== // // The following table gives the correspondence // between commands and method name. // // Command name | Method name // ---------------------------------------- // State | dev_state() // Status | dev_status() // On | on() // Off | off() // Reset | reset() // SetPoleAcCurrent | set_pole_ac_current() // LocalPoleControl | local_pole_control() // //=================================================================== #include #include #include #include #include namespace Bilt_ns { //+---------------------------------------------------------------------------- // // method : Bilt::Bilt(string &s) // // description : constructor for simulated Bilt // // in : - cl : Pointer to the DeviceClass object // - s : Device name // //----------------------------------------------------------------------------- Bilt::Bilt(Tango::DeviceClass *cl,string &s) :Tango::Device_4Impl(cl,s.c_str()) { init_device(); } Bilt::Bilt(Tango::DeviceClass *cl,const char *s) :Tango::Device_4Impl(cl,s) { init_device(); } Bilt::Bilt(Tango::DeviceClass *cl,const char *s,const char *d) :Tango::Device_4Impl(cl,s,d) { init_device(); } //+---------------------------------------------------------------------------- // // method : Bilt::delete_device() // // description : will be called at device destruction or at init command. // //----------------------------------------------------------------------------- void Bilt::delete_device() { // Delete device allocated objects if ( acquisition_thread != NULL ) { data_mutex.lock(); exit_thread = true; data_mutex.unlock(); // join now the thread until it exits int *rv; acquisition_thread->join((void **)&rv); cout << "Bilt::delete_device(): Exit acquisition thread !!!" << endl; } // Delete connection to the power supply delete BILT; BILT = NULL; } //+---------------------------------------------------------------------------- // // method : Bilt::init_device() // // description : will be called at device initialization. // //----------------------------------------------------------------------------- void Bilt::init_device() { INFO_STREAM << "Bilt::Bilt() create device " << device_name << endl; // Initialise variables to default values //-------------------------------------------- get_device_property(); set_state (Tango::OFF); try { BILT = new itest::TMagnet (iPAddress.c_str(), magnetNumber); } catch (itest::ItestException &e) { try { create_tango_exception (e, mdata_errors, "Init failure" , "Cannot initialise ITEST libray objects", "Bilt::init_device"); } catch (Tango::DevFailed &e) { set_state (Tango::UNKNOWN); } } // initialise with the actual current set point values try { for (int i=0; ipole(i).get_current_DC(); } Tango::MultiAttribute *attr_list = get_device_attr(); Tango::WAttribute &attr_curr = attr_list->get_w_attr_by_name ("Currents"); attr_curr.set_write_value(¤ts_dc[0], currents_dc.size()); } catch (itest::ItestException &e) { try { create_tango_exception (e, mdata_errors, "Init failure" , "Cannot read the actual current set point values", "Bilt::init_device"); } catch (Tango::DevFailed &e) { set_state (Tango::UNKNOWN); } } // initialise and start the acquisition thread exit_thread = false; acquisition_thread = new AcquisitionThread(this, data_mutex, bilt_mutex); } //+---------------------------------------------------------------------------- // // method : Bilt::get_device_property() // // description : Read the device properties from database. // //----------------------------------------------------------------------------- void Bilt::get_device_property() { // Initialize your default values here (if not done with POGO). //------------------------------------------------------------------ BILT = NULL; acquisition_thread = NULL; struct timeval now; gettimeofday (&now, NULL); data_set_time = now; data_read_time = now; // intitialise mdada structure for magnet read values mdata.magnet = -1; mdata.state = -1; for (int i=0; i_UseDb==true) get_db_device()->get_property(dev_prop); Tango::DbDatum def_prop, cl_prop; BiltClass *ds_class = (static_cast(get_device_class())); int i = -1; // Try to initialize IPAddress from class property cl_prop = ds_class->get_class_property(dev_prop[++i].name); if (cl_prop.is_empty()==false) cl_prop >> iPAddress; else { // Try to initialize IPAddress from default device value def_prop = ds_class->get_default_device_property(dev_prop[i].name); if (def_prop.is_empty()==false) def_prop >> iPAddress; } // And try to extract IPAddress value from database if (dev_prop[i].is_empty()==false) dev_prop[i] >> iPAddress; // Try to initialize MagnetNumber from class property cl_prop = ds_class->get_class_property(dev_prop[++i].name); if (cl_prop.is_empty()==false) cl_prop >> magnetNumber; else { // Try to initialize MagnetNumber from default device value def_prop = ds_class->get_default_device_property(dev_prop[i].name); if (def_prop.is_empty()==false) def_prop >> magnetNumber; } // And try to extract MagnetNumber value from database if (dev_prop[i].is_empty()==false) dev_prop[i] >> magnetNumber; // Try to initialize UpdatePeriod from class property cl_prop = ds_class->get_class_property(dev_prop[++i].name); if (cl_prop.is_empty()==false) cl_prop >> updatePeriod; else { // Try to initialize UpdatePeriod from default device value def_prop = ds_class->get_default_device_property(dev_prop[i].name); if (def_prop.is_empty()==false) def_prop >> updatePeriod; } // And try to extract UpdatePeriod value from database if (dev_prop[i].is_empty()==false) dev_prop[i] >> updatePeriod; // End of Automatic code generation //------------------------------------------------------------------ } //+---------------------------------------------------------------------------- // // method : Bilt::always_executed_hook() // // description : method always executed before any command is executed // //----------------------------------------------------------------------------- void Bilt::always_executed_hook() { } //+---------------------------------------------------------------------------- // // method : Bilt::read_attr_hardware // // description : Hardware acquisition for attributes. // //----------------------------------------------------------------------------- void Bilt::read_attr_hardware(vector &attr_list) { DEBUG_STREAM << "Bilt::read_attr_hardware(vector &attr_list) entering... "<< endl; // Add your own code here } //+---------------------------------------------------------------------------- // // method : Bilt::read_FramesPerSecond // // description : Extract real attribute values for FramesPerSecond acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_FramesPerSecond(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_FramesPerSecond(Tango::Attribute &attr) entering... "<< endl; omni_mutex_lock l(data_mutex); if ( fdata_errors.length() != 0 ) attr.set_quality(Tango::ATTR_INVALID); else { for (int i=0; ipole(i).get_switch(); } if ( switch_state == 1 ) local_control[i] = false; else local_control[i] = true; } } catch (itest::ItestException &e) { create_tango_exception (e, "Read failure" , "Cannot read the actual switch states", "Bilt::read_LocalControls"); } attr.set_value (&(local_control[0]), POLES); } //+---------------------------------------------------------------------------- // // method : Bilt::read_SetCurrentsRMS // // description : Extract real attribute values for SetCurrentsRMS acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_SetCurrentsRMS(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_SetCurrentsRMS(Tango::Attribute &attr) entering... "<< endl; omni_mutex_lock l(data_mutex); if ( fdata_errors.length() != 0 ) attr.set_quality(Tango::ATTR_INVALID); else { for (int i=0; i CURRENT_LIMIT ) impedances[i] = fabs (mdata.idata[i].measvolt / mdata.idata[i].meascurr); else impedances[i] = nan(""); } attr.set_value (&(impedances[0]), POLES); } } //+---------------------------------------------------------------------------- // // method : Bilt::write_Currents // // description : Write Currents attribute values to hardware. // //----------------------------------------------------------------------------- void Bilt::write_Currents(Tango::WAttribute &attr) { DEBUG_STREAM << "Bilt::write_Currents(Tango::WAttribute &attr) entering... "<< endl; const double *set_currents; // check the correct number of setpoints if ( attr.get_write_value_length() == POLES ) attr.get_write_value(set_currents); else { TangoSys_MemStream tms; tms << "Wrong number of setpoints!" << endl; Tango::Except::throw_exception("WriteError", tms.str(), "Bilt::write_Currents"); } // apply setpoints to the poles try { for (int i=0; ipole(i).set_current_DC (set_currents[i]); } } } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot write DC current values", "Bilt::write_Currents"); } // initialise the set time, to be sure that the next // returned read value is newer and contains the changes. struct timeval now; gettimeofday (&now, NULL); data_set_time = now; } //+---------------------------------------------------------------------------- // // method : Bilt::read_Currents // // description : Extract real attribute values for Currents acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_Currents(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_Currents(Tango::Attribute &attr) entering... "<< endl; // wait for the next data acquisition afer a current setpoint change double delay; { omni_mutex_lock l(data_mutex); delay = (data_set_time.tv_sec * 1e6 + data_set_time.tv_usec) - (data_read_time.tv_sec * 1e6 + data_read_time.tv_usec); //cout << "delay = " << delay << endl; } while ( delay > 0 ) { // 20 ms struct timespec sleep_time = {0, SLEEP_NS}; nanosleep(&sleep_time, NULL); omni_mutex_lock l(data_mutex); delay = (data_set_time.tv_sec * 1e6 + data_set_time.tv_usec) - (data_read_time.tv_sec * 1e6 + data_read_time.tv_usec); INFO_STREAM << "read waiting delay = " << delay << endl; } omni_mutex_lock l(data_mutex); if ( mdata_errors.length() != 0 ) attr.set_quality(Tango::ATTR_INVALID); else { for (int i=0; iset_state(1); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot switch on pole", "Bilt::on"); } } //+------------------------------------------------------------------ /** * method: Bilt::off * * description: method to execute "Off" * Turns of power supply * * */ //+------------------------------------------------------------------ void Bilt::off() { DEBUG_STREAM << "Bilt::off(): entering... !" << endl; // Add your own code to control device here try { omni_mutex_lock l(bilt_mutex); BILT->set_state(0); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot switch off pole", "Bilt::off"); } } //+------------------------------------------------------------------ /** * method: Bilt::reset * * description: method to execute "Reset" * Reset faults and alarms * * */ //+------------------------------------------------------------------ void Bilt::reset() { DEBUG_STREAM << "Bilt::reset(): entering... !" << endl; // Add your own code to control device here try { omni_mutex_lock l(bilt_mutex); BILT->clear_all_err(); BILT->clear_alarm(); for (int i=0; ipole(i).clear_ferrors(); } } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot reset pole", "Bilt::reset"); } } //+------------------------------------------------------------------ /** * method: Bilt::set_pole_ac_current * * description: method to execute "SetPoleAcCurrent" * Set the AC current for one Pole. * [0] = pole number, [1] = current * * @param argin * */ //+------------------------------------------------------------------ void Bilt::set_pole_ac_current(const Tango::DevVarDoubleArray *argin) { DEBUG_STREAM << "Bilt::set_pole_ac_current(): entering... !" << endl; // Add your own code to control device here // argin[0] = pole number if ( (*argin)[0] < 0 || (*argin)[0] >= POLES ) { TangoSys_MemStream tms; tms << "The entered Pole number is out of range" << endl; Tango::Except::throw_exception("WriteError", tms.str(), "Bilt::set_pole_ac_current"); } try { omni_mutex_lock l(bilt_mutex); BILT->pole((int)(*argin)[0]).set_current_AC ((*argin)[1]); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot write AC current value", "Bilt::set_pole_ac_current"); } } //+------------------------------------------------------------------ /** * method: Bilt::local_pole_control * * description: method to execute "LocalPoleControl" * Set the AC current for one Pole. * [0] = pole number, [1] = local control true/false * * @param argin * */ //+------------------------------------------------------------------ void Bilt::local_pole_control(const Tango::DevVarShortArray *argin) { DEBUG_STREAM << "Bilt::local_pole_control(): entering... !" << endl; // Add your own code to control device here // argin[0] = pole number if ( (*argin)[0] < 0 || (*argin)[0] >= POLES ) { TangoSys_MemStream tms; tms << "The entered Pole number is out of range" << endl; Tango::Except::throw_exception("WriteError", tms.str(), "Bilt::local_pole_control"); } // argin[1] = true or false (1 or 0 ) if ( (*argin)[1] != 0 && (*argin)[1] != 1 ) { TangoSys_MemStream tms; tms << "Local control can only be choosen as 0 or 1 (false or true)" << endl; Tango::Except::throw_exception("WriteError", tms.str(), "Bilt::local_pole_control"); } try { int switch_state; if ( (*argin)[1] == true ) switch_state = 0; else switch_state = 1; omni_mutex_lock l(bilt_mutex); BILT->pole((*argin)[0]).set_switch (switch_state); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot write switch state", "Bilt::local_pole_control"); } } //+------------------------------------------------------------------ /** * method: Bilt::set_pole_current * * description: method to execute "SetPoleCurrent" * Set the DC current for one Pole. * [0] = pole number, [1] = current * * @param argin * */ //+------------------------------------------------------------------ /* void Bilt::set_pole_current(const Tango::DevVarDoubleArray *argin) { DEBUG_STREAM << "Bilt::set_pole_current(): entering... !" << endl; // Add your own code to control device here // argin[0] = pole number if ( (*argin)[0] < 0 || (*argin)[0] >= POLES ) { TangoSys_MemStream tms; tms << "The entered Pole number is out of range" << endl; Tango::Except::throw_exception("WriteError", tms.str(), "Bilt::set_pole_current"); } try { omni_mutex_lock l(bilt_mutex); BILT->pole((int)(*argin)[0]).set_current_DC ((*argin)[1]); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot write current value", "Bilt::set_pole_current"); } // make sure that the current set values are correct! try { omni_mutex_lock l(bilt_mutex); for (int i=0; ipole(i).get_current_DC(); } Tango::MultiAttribute *attr_list = get_device_attr(); Tango::WAttribute &attr_curr = attr_list->get_w_attr_by_name ("Currents"); attr_curr.set_write_value(¤ts_dc[0], currents_dc.size()); } catch (itest::ItestException &e) { create_tango_exception (e, "Read failure" , "Cannot read the actual current set point values", "Bilt::set_pole_current"); } } */ //+------------------------------------------------------------------ /** * method: Bilt::create_tango_exception() * * description: convert an itest exception into a tango exception * * * in : - &e : Reference to itest exception * - reason : Reason of the local Tango exception to be added to the stack * - desc : Description for the local Tango exception to be added to the stack * - origin : Origin if the local Tango exception to be added to the stack */ //+------------------------------------------------------------------ void Bilt::create_tango_exception (itest::ItestException &e, string reason, string desc, string origin) { Tango::DevErrorList errors; create_tango_exception (e, errors, reason, desc, origin); } //+------------------------------------------------------------------ /** * method: Bilt::create_tango_exception() * * description: convert an itest exception into a tango exception * * * in : - &e : Reference to itest exception * - errors : Tango error list to use, to store exception info * - reason : Reason of the local Tango exception to be added to the stack * - desc : Description for the local Tango exception to be added to the stack * - origin : Origin if the local Tango exception to be added to the stack */ //+------------------------------------------------------------------ void Bilt::create_tango_exception (itest::ItestException &e, Tango::DevErrorList &errors, string reason, string desc, string origin) { DEBUG_STREAM << "Bilt::create_tango_exception(): entering... !" << endl; errors.length(e.errors.size() + 1); int i; for(i=0; idevice_status data member) and returns it to the caller. * * @return Status description * */ //+------------------------------------------------------------------ Tango::ConstDevString Bilt::dev_status() { //Tango::ConstDevString argout = DeviceImpl::dev_status(); DEBUG_STREAM << "Bilt::dev_status(): entering... !" << endl; // Add your own code to control device here stringstream status; Tango::DevState state = dev_state(); switch (state) { case Tango::ON: status << "State : ON" << endl; break; case Tango::OFF: status << "State : OFF" << endl; break; case Tango::ALARM: { status << "State : Alarm" << endl; omni_mutex_lock l(data_mutex); for (int i=0; i 10W in 10ms!" << endl; else { if ( mdata.idata[i].fail == "TEMP" ) status << "Fault descr. : Max. temp on semiconductor reached!" << endl; else { if ( mdata.idata[i].fail == "PWSO" ) status << "Fault descr. : Delivered power > 40W in 100ms!" << endl; else { status << "Fault descr. : Unkown fault code!" << endl; } } } } } } } break; } default: { status << "Pole state : Unknown" << endl; status << "Error stack : " << endl; omni_mutex_lock l(data_mutex); for(int i=0; idevice_state data member) and returns it to the caller. * * @return State Code * */ //+------------------------------------------------------------------ Tango::DevState Bilt::dev_state() { Tango::DevState argout = DeviceImpl::dev_state(); DEBUG_STREAM << "Bilt::dev_state(): entering... !" << endl; // Add your own code to control device here int state; omni_mutex_lock l(data_mutex); try { //read_mdata(); state = mdata.state; INFO_STREAM << "magnet state for " << get_name() << " = " << state << endl; } catch (Tango::DevFailed &e) { // do nothing! // Just avoid exceptions when executing state or status! } if ( mdata_errors.length() != 0 ) set_state (Tango::UNKNOWN); else { // set the device state switch (state) { case 0: set_state (Tango::OFF); break; case 1: set_state (Tango::ON); break; case 2: set_state (Tango::ALARM); break; case 3: set_state (Tango::FAULT); break; default: set_state (Tango::UNKNOWN); break; } } // Check for attribute alarms if ( get_state() == Tango::ON && argout == Tango::ALARM ) set_state (Tango::ALARM); return get_state(); } } // namespace Node-path: powersupply/itest/Bilt/trunk/Bilt.h Node-kind: file Node-action: change Text-content-length: 10746 Text-content-md5: a991bc69f7f59a0b377e99deae64058c Content-length: 10746 //============================================================================= // // file : Bilt.h // // description : Include for the Bilt class. // // project : BILT multi channel power supply // // $Author: meyer $ // // $Revision: 1.6 $ // $Date: 2010-02-11 16:35:27 $ // // SVN only: // $HeadURL: $ // // CVS only: // $Source: /segfs/tango/cvsroot/cppserver/machine/powersupply/SrSteerers/tango/Bilt/Bilt.h,v $ // $Log: not supported by cvs2svn $ // Revision 1.5 2010/02/10 12:27:31 meyer // Restructured Bilt class. // Acquistion is now done by a thread and only the multi channel data // gets exported. A single channel class (BiltCh) was created. // // Revision 1.4 2009/11/27 13:49:26 meyer // Modified structure! The pole is no longer a device. // The device is now a magnet with three poles. // // Revision 1.3 2009/11/26 10:46:58 meyer // Updated for libMagnet_V120 // // Revision 1.2 2009/11/06 12:46:25 meyer // Added impedance attribute and corrected fromatting of attribute values. // // Revision 1.1.1.1 2009/11/04 16:23:02 meyer // Imported using TkCVS // // // copyleft : European Synchrotron Radiation Facility // BP 220, Grenoble 38043 // FRANCE // //============================================================================= // // This file is generated by POGO // (Program Obviously used to Generate tango Object) // // (c) - Software Engineering Group - ESRF //============================================================================= #ifndef _BILT_H #define _BILT_H #include #include #include //using namespace Tango; /** * @author $Author: meyer $ * @version $Revision: 1.6 $ */ // Add your own constant definitions here. //----------------------------------------------- // Number of poles per magnet #define POLES 3 // Current limit for a valid impedeance calculation #define CURRENT_LIMIT 0.005 // define sleep times #define SLEEP_NS 20000000 // 20 ms namespace Bilt_ns { /** * Class Description: * The BILT multi channel power supply will be used with 3 channels for the ESRF fast * feedback systems. * The power supply can be controlled in 2 ways : * By this device server for slow or human control or * by the Libera Beam Position monitors for fast feedback with closed loop control. * The devices are exported as one device per steerer magnet. Every device has three * channels. The channels (poles) cannot be switched on individually but have their * individual set points and measurement values. */ /* * Device States Description: * Tango::ON : Magnet is ON, all three channels are ON. * Tango::OFF : Magnet is OFF, all three channels are OFF. * Tango::FAULT : Error detected by the BILT magnet. * Tango::ALARM : Alarm detected on one or more channels. * Tango::UNKNOWN : Communication fault */ class Bilt: public Tango::Device_4Impl { public : // Add your own data members here //----------------------------------------- // Here is the Start of the automatic code generation part //------------------------------------------------------------- /** * @name attributes * Attribute member data. */ //@{ Tango::DevDouble *attr_Currents_read; Tango::DevDouble attr_Currents_write; Tango::DevDouble *attr_Voltages_read; Tango::DevDouble *attr_Impedances_read; Tango::DevDouble *attr_SetCurrentsRMS_read; Tango::DevDouble *attr_SetCurrentsAverage_read; Tango::DevULong *attr_FramesPerSecond_read; Tango::DevULong *attr_ErrorsPerSecond_read; Tango::DevULong *attr_ErrorCounters_read; Tango::DevBoolean *attr_LocalControls_read; //@} /** * @name Device properties * Device properties member data. */ //@{ /** * IP Address of BILT controller. * Each controller includes several magnets and * each magnet includes 3 power supplies, * for corrections in the X, Y and Z planes. * * */ string iPAddress; /** * Magnet number from 1 to 48 */ Tango::DevShort magnetNumber; /** * The update period for the data reading from the power supply in milli seconds. */ Tango::DevLong updatePeriod; //@} /** * @name Device properties * Device property member data. */ //@{ //@} /**@name Constructors * Miscellaneous constructors */ //@{ /** * Constructs a newly allocated Command object. * * @param cl Class. * @param s Device Name */ Bilt(Tango::DeviceClass *cl,string &s); /** * Constructs a newly allocated Command object. * * @param cl Class. * @param s Device Name */ Bilt(Tango::DeviceClass *cl,const char *s); /** * Constructs a newly allocated Command object. * * @param cl Class. * @param s Device name * @param d Device description. */ Bilt(Tango::DeviceClass *cl,const char *s,const char *d); //@} /**@name Destructor * Only one destructor is defined for this class */ //@{ /** * The object destructor. */ ~Bilt() {delete_device();}; /** * will be called at device destruction or at init command. */ void delete_device(); //@} /**@name Miscellaneous methods */ //@{ /** * Initialize the device */ virtual void init_device(); /** * Always executed method before execution command method. */ virtual void always_executed_hook(); //@} /** * @name Bilt methods prototypes */ //@{ /** * Hardware acquisition for attributes. */ virtual void read_attr_hardware(vector &attr_list); /** * Extract real attribute values for Currents acquisition result. */ virtual void read_Currents(Tango::Attribute &attr); /** * Write Currents attribute values to hardware. */ virtual void write_Currents(Tango::WAttribute &attr); /** * Extract real attribute values for Voltages acquisition result. */ virtual void read_Voltages(Tango::Attribute &attr); /** * Extract real attribute values for Impedances acquisition result. */ virtual void read_Impedances(Tango::Attribute &attr); /** * Extract real attribute values for SetCurrentsRMS acquisition result. */ virtual void read_SetCurrentsRMS(Tango::Attribute &attr); /** * Extract real attribute values for SetCurrentsAverage acquisition result. */ virtual void read_SetCurrentsAverage(Tango::Attribute &attr); /** * Extract real attribute values for FramesPerSecond acquisition result. */ virtual void read_FramesPerSecond(Tango::Attribute &attr); /** * Extract real attribute values for ErrorsPerSecond acquisition result. */ virtual void read_ErrorsPerSecond(Tango::Attribute &attr); /** * Extract real attribute values for ErrorCounters acquisition result. */ virtual void read_ErrorCounters(Tango::Attribute &attr); /** * Extract real attribute values for LocalControls acquisition result. */ virtual void read_LocalControls(Tango::Attribute &attr); /** * Read/Write allowed for Currents attribute. */ virtual bool is_Currents_allowed(Tango::AttReqType type); /** * Read/Write allowed for Voltages attribute. */ virtual bool is_Voltages_allowed(Tango::AttReqType type); /** * Read/Write allowed for Impedances attribute. */ virtual bool is_Impedances_allowed(Tango::AttReqType type); /** * Read/Write allowed for SetCurrentsRMS attribute. */ virtual bool is_SetCurrentsRMS_allowed(Tango::AttReqType type); /** * Read/Write allowed for SetCurrentsAverage attribute. */ virtual bool is_SetCurrentsAverage_allowed(Tango::AttReqType type); /** * Read/Write allowed for FramesPerSecond attribute. */ virtual bool is_FramesPerSecond_allowed(Tango::AttReqType type); /** * Read/Write allowed for ErrorsPerSecond attribute. */ virtual bool is_ErrorsPerSecond_allowed(Tango::AttReqType type); /** * Read/Write allowed for ErrorCounters attribute. */ virtual bool is_ErrorCounters_allowed(Tango::AttReqType type); /** * Read/Write allowed for LocalControls attribute. */ virtual bool is_LocalControls_allowed(Tango::AttReqType type); /** * Execution allowed for On command. */ virtual bool is_On_allowed(const CORBA::Any &any); /** * Execution allowed for Off command. */ virtual bool is_Off_allowed(const CORBA::Any &any); /** * Execution allowed for Reset command. */ virtual bool is_Reset_allowed(const CORBA::Any &any); /** * Execution allowed for SetPoleAcCurrent command. */ virtual bool is_SetPoleAcCurrent_allowed(const CORBA::Any &any); /** * Execution allowed for LocalPoleControl command. */ virtual bool is_LocalPoleControl_allowed(const CORBA::Any &any); /** * This command gets the device state (stored in its device_state data member) and returns it to the caller. * @return State Code * @exception DevFailed */ virtual Tango::DevState dev_state(); /** * This command gets the device status (stored in its device_status data member) and returns it to the caller. * @return Status description * @exception DevFailed */ virtual Tango::ConstDevString dev_status(); /** * Turns on power supply. * @exception DevFailed */ void on(); /** * Turns of power supply * @exception DevFailed */ void off(); /** * Reset faults and alarms * @exception DevFailed */ void reset(); /** * Set the AC current for one Pole. * [0] = pole number, [1] = current * @param argin * @exception DevFailed */ void set_pole_ac_current(const Tango::DevVarDoubleArray *); /** * Set the AC current for one Pole. * [0] = pole number, [1] = local control true/false * @param argin * @exception DevFailed */ void local_pole_control(const Tango::DevVarShortArray *); /** * Read the device properties from database */ void get_device_property(); //@} // Here is the end of the automatic code generation part //------------------------------------------------------------- protected : // Add your own data members here //----------------------------------------- friend class AcquisitionThread; AcquisitionThread *acquisition_thread; omni_mutex data_mutex; omni_mutex bilt_mutex; short exit_thread; struct timeval data_set_time; struct timeval data_read_time; void create_tango_exception (itest::ItestException &e, string reason, string desc, string origin); void create_tango_exception (itest::ItestException &e, Tango::DevErrorList &errors, string reason, string desc, string origin); itest::TMagnet *BILT; struct itest::mdata mdata; struct itest::fdata fdata[POLES]; Tango::DevErrorList mdata_errors; Tango::DevErrorList fdata_errors; vector currents_dc; vector currents_ac; vector voltages; vector impedances; vector currents_rms; vector currents_average; vector frames_per_sec; vector errors_per_sec; vector error_counters; bool local_control[3]; }; } // namespace_ns #endif // _BILT_H Node-path: powersupply/itest/Bilt/trunk/BiltClass.cpp Node-kind: file Node-action: change Text-content-length: 24074 Text-content-md5: 64632f3c21551c4865ba308a9d9981e7 Content-length: 24074 static const char *ClassId = "$Id: BiltClass.cpp,v 1.9 2010-02-11 16:35:27 meyer Exp $"; static const char *TagName = "$Name: not supported by cvs2svn $"; static const char *CvsPath = "$Source: /segfs/tango/cvsroot/cppserver/machine/powersupply/SrSteerers/tango/Bilt/BiltClass.cpp,v $"; static const char *SvnPath = "$HeadURL: $"; static const char *HttpServer = "http://www.esrf.fr/computing/cs/tango/tango_doc/ds_doc/"; //+============================================================================= // // file : BiltClass.cpp // // description : C++ source for the BiltClass. A singleton // class derived from DeviceClass. It implements the // command list and all properties and methods required // by the Bilt once per process. // // project : TANGO Device Server // // $Author: meyer $ // // $Revision: 1.9 $ // // $Log: not supported by cvs2svn $ // Revision 1.8 2010/02/10 16:22:15 meyer // Release_3_0 // // Revision 1.7 2010/02/10 12:27:31 meyer // Restructured Bilt class. // Acquistion is now done by a thread and only the multi channel data // gets exported. A single channel class (BiltCh) was created. // // Revision 1.6 2009/12/18 12:02:18 meyer // Changed version number to 2.1 // // Revision 1.5 2009/11/27 13:49:26 meyer // Modified structure! The pole is no longer a device. // The device is now a magnet with three poles. // // Revision 1.4 2009/11/26 10:46:58 meyer // Updated for libMagnet_V120 // // Revision 1.3 2009/11/23 16:46:58 meyer // Corrected state, status and exception handling // // Revision 1.2 2009/11/06 12:46:25 meyer // Added impedance attribute and corrected fromatting of attribute values. // // Revision 1.1.1.1 2009/11/04 16:23:02 meyer // Imported using TkCVS // // // copyleft : European Synchrotron Radiation Facility // BP 220, Grenoble 38043 // FRANCE // //-============================================================================= // // This file is generated by POGO // (Program Obviously used to Generate tango Object) // // (c) - Software Engineering Group - ESRF //============================================================================= #include #include #include //+---------------------------------------------------------------------------- /** * Create BiltClass singleton and return it in a C function for Python usage */ //+---------------------------------------------------------------------------- extern "C" { #ifdef WIN32 __declspec(dllexport) #endif Tango::DeviceClass *_create_Bilt_class(const char *name) { return Bilt_ns::BiltClass::init(name); } } namespace Bilt_ns { //+---------------------------------------------------------------------------- // // method : LocalPoleControlCmd::execute() // // description : method to trigger the execution of the command. // PLEASE DO NOT MODIFY this method core without pogo // // in : - device : The device on which the command must be executed // - in_any : The command input data // // returns : The command output data (packed in the Any object) // //----------------------------------------------------------------------------- CORBA::Any *LocalPoleControlCmd::execute(Tango::DeviceImpl *device,const CORBA::Any &in_any) { cout2 << "LocalPoleControlCmd::execute(): arrived" << endl; const Tango::DevVarShortArray *argin; extract(in_any, argin); ((static_cast(device))->local_pole_control(argin)); return new CORBA::Any(); } //+---------------------------------------------------------------------------- // // method : SetPoleAcCurrentCmd::execute() // // description : method to trigger the execution of the command. // PLEASE DO NOT MODIFY this method core without pogo // // in : - device : The device on which the command must be executed // - in_any : The command input data // // returns : The command output data (packed in the Any object) // //----------------------------------------------------------------------------- CORBA::Any *SetPoleAcCurrentCmd::execute(Tango::DeviceImpl *device,const CORBA::Any &in_any) { cout2 << "SetPoleAcCurrentCmd::execute(): arrived" << endl; const Tango::DevVarDoubleArray *argin; extract(in_any, argin); ((static_cast(device))->set_pole_ac_current(argin)); return new CORBA::Any(); } //+---------------------------------------------------------------------------- // // method : OnCmd::execute() // // description : method to trigger the execution of the command. // PLEASE DO NOT MODIFY this method core without pogo // // in : - device : The device on which the command must be executed // - in_any : The command input data // // returns : The command output data (packed in the Any object) // //----------------------------------------------------------------------------- CORBA::Any *OnCmd::execute(Tango::DeviceImpl *device,const CORBA::Any &in_any) { cout2 << "OnCmd::execute(): arrived" << endl; ((static_cast(device))->on()); return new CORBA::Any(); } //+---------------------------------------------------------------------------- // // method : OffCmd::execute() // // description : method to trigger the execution of the command. // PLEASE DO NOT MODIFY this method core without pogo // // in : - device : The device on which the command must be executed // - in_any : The command input data // // returns : The command output data (packed in the Any object) // //----------------------------------------------------------------------------- CORBA::Any *OffCmd::execute(Tango::DeviceImpl *device,const CORBA::Any &in_any) { cout2 << "OffCmd::execute(): arrived" << endl; ((static_cast(device))->off()); return new CORBA::Any(); } //+---------------------------------------------------------------------------- // // method : ResetCmd::execute() // // description : method to trigger the execution of the command. // PLEASE DO NOT MODIFY this method core without pogo // // in : - device : The device on which the command must be executed // - in_any : The command input data // // returns : The command output data (packed in the Any object) // //----------------------------------------------------------------------------- CORBA::Any *ResetCmd::execute(Tango::DeviceImpl *device,const CORBA::Any &in_any) { cout2 << "ResetCmd::execute(): arrived" << endl; ((static_cast(device))->reset()); return new CORBA::Any(); } // //---------------------------------------------------------------- // Initialize pointer for singleton pattern //---------------------------------------------------------------- // BiltClass *BiltClass::_instance = NULL; //+---------------------------------------------------------------------------- // // method : BiltClass::BiltClass(string &s) // // description : constructor for the BiltClass // // in : - s : The class name // //----------------------------------------------------------------------------- BiltClass::BiltClass(string &s):DeviceClass(s) { cout2 << "Entering BiltClass constructor" << endl; set_default_property(); get_class_property(); write_class_property(); cout2 << "Leaving BiltClass constructor" << endl; } //+---------------------------------------------------------------------------- // // method : BiltClass::~BiltClass() // // description : destructor for the BiltClass // //----------------------------------------------------------------------------- BiltClass::~BiltClass() { _instance = NULL; } //+---------------------------------------------------------------------------- // // method : BiltClass::instance // // description : Create the object if not already done. Otherwise, just // return a pointer to the object // // in : - name : The class name // //----------------------------------------------------------------------------- BiltClass *BiltClass::init(const char *name) { if (_instance == NULL) { try { string s(name); _instance = new BiltClass(s); } catch (bad_alloc) { throw; } } return _instance; } BiltClass *BiltClass::instance() { if (_instance == NULL) { cerr << "Class is not initialised !!" << endl; exit(-1); } return _instance; } //+---------------------------------------------------------------------------- // // method : BiltClass::command_factory // // description : Create the command object(s) and store them in the // command list // //----------------------------------------------------------------------------- void BiltClass::command_factory() { command_list.push_back(new OnCmd("On", Tango::DEV_VOID, Tango::DEV_VOID, "", "", Tango::OPERATOR)); command_list.push_back(new OffCmd("Off", Tango::DEV_VOID, Tango::DEV_VOID, "", "", Tango::OPERATOR)); command_list.push_back(new ResetCmd("Reset", Tango::DEV_VOID, Tango::DEV_VOID, "", "", Tango::OPERATOR)); command_list.push_back(new SetPoleAcCurrentCmd("SetPoleAcCurrent", Tango::DEVVAR_DOUBLEARRAY, Tango::DEV_VOID, "", "", Tango::OPERATOR)); command_list.push_back(new LocalPoleControlCmd("LocalPoleControl", Tango::DEVVAR_SHORTARRAY, Tango::DEV_VOID, "", "", Tango::OPERATOR)); // add polling if any for (unsigned int i=0 ; ilength() ; i++) { cout4 << "Device name : " << (*devlist_ptr)[i].in() << endl; // Create devices and add it into the device list //---------------------------------------------------- device_list.push_back(new Bilt(this, (*devlist_ptr)[i])); // Export device to the outside world // Check before if database used. //--------------------------------------------- if ((Tango::Util::_UseDb == true) && (Tango::Util::_FileDb == false)) export_device(device_list.back()); else export_device(device_list.back(), (*devlist_ptr)[i]); } // End of Automatic code generation //------------------------------------------------------------- } //+---------------------------------------------------------------------------- // Method: BiltClass::attribute_factory(vector &att_list) //----------------------------------------------------------------------------- void BiltClass::attribute_factory(vector &att_list) { // Attribute : Currents CurrentsAttrib *currents = new CurrentsAttrib(); Tango::UserDefaultAttrProp currents_prop; currents_prop.set_label("Currents"); currents_prop.set_unit("A"); currents_prop.set_format("%6.4f"); currents_prop.set_max_value("1.8"); currents_prop.set_min_value("-1.8"); currents_prop.set_description("The measured currents of the three poles.\nWhen writing a spectrum of current setpoints,\na NAN value will exclude the channel. All other values\nwill be applied."); currents->set_default_properties(currents_prop); att_list.push_back(currents); // Attribute : Voltages VoltagesAttrib *voltages = new VoltagesAttrib(); Tango::UserDefaultAttrProp voltages_prop; voltages_prop.set_label("Voltages"); voltages_prop.set_unit("V"); voltages_prop.set_format("%6.4"); voltages_prop.set_description("The measured voltages of the three poles."); voltages->set_default_properties(voltages_prop); att_list.push_back(voltages); // Attribute : Impedances ImpedancesAttrib *impedances = new ImpedancesAttrib(); Tango::UserDefaultAttrProp impedances_prop; impedances_prop.set_label("Impedances"); impedances_prop.set_unit("Ohm"); impedances_prop.set_format("%4.2f"); impedances_prop.set_max_alarm("5.0"); impedances_prop.set_description("Calculated impedances for the three poles."); impedances->set_default_properties(impedances_prop); att_list.push_back(impedances); // Attribute : SetCurrentsRMS SetCurrentsRMSAttrib *set_currents_rms = new SetCurrentsRMSAttrib(); Tango::UserDefaultAttrProp set_currents_rms_prop; set_currents_rms_prop.set_label("RMS AC current setpoints/s"); set_currents_rms_prop.set_unit("A"); set_currents_rms_prop.set_format("%6.4"); set_currents_rms_prop.set_description("Statistic when driven by the Libera. One RMS value for every pole\nof the magnet.\nRMS value of the AC setpoint applied on the DAC during the last second.\nX=sqr( (sum(setAC)*sum(setAC)) / n - ((sum(setAC)/n) *(sum(setAC)/n)) )"); set_currents_rms->set_default_properties(set_currents_rms_prop); att_list.push_back(set_currents_rms); // Attribute : SetCurrentsAverage SetCurrentsAverageAttrib *set_currents_average = new SetCurrentsAverageAttrib(); Tango::UserDefaultAttrProp set_currents_average_prop; set_currents_average_prop.set_label("Average AC current setpoints/s"); set_currents_average_prop.set_unit("A"); set_currents_average_prop.set_format("%6.4"); set_currents_average_prop.set_description("Statistic when driven by the Libera. One average value for every pole\nof the magnet.\nRMS value of the AC setpoint applied on the DAC during the last second.\nX=sqr( (sum(setAC)*sum(setAC)) / n - ((sum(setAC)/n) *(sum(setAC)/n)) )"); set_currents_average->set_default_properties(set_currents_average_prop); att_list.push_back(set_currents_average); // Attribute : FramesPerSecond FramesPerSecondAttrib *frames_per_second = new FramesPerSecondAttrib(); Tango::UserDefaultAttrProp frames_per_second_prop; frames_per_second_prop.set_label("Frames per second"); frames_per_second_prop.set_display_unit(" "); frames_per_second_prop.set_format("%6d"); frames_per_second->set_default_properties(frames_per_second_prop); att_list.push_back(frames_per_second); // Attribute : ErrorsPerSecond ErrorsPerSecondAttrib *errors_per_second = new ErrorsPerSecondAttrib(); Tango::UserDefaultAttrProp errors_per_second_prop; errors_per_second_prop.set_label("Errors per second"); errors_per_second_prop.set_display_unit(" "); errors_per_second_prop.set_format("%6d"); errors_per_second->set_default_properties(errors_per_second_prop); att_list.push_back(errors_per_second); // Attribute : ErrorCounters ErrorCountersAttrib *error_counters = new ErrorCountersAttrib(); Tango::UserDefaultAttrProp error_counters_prop; error_counters_prop.set_label("Error counters"); error_counters_prop.set_unit(" "); error_counters_prop.set_format("%6d"); error_counters_prop.set_description("Statistic when driven by the Libera.\nThe total number of errors since the last reset for the \nthree poles."); error_counters->set_default_properties(error_counters_prop); att_list.push_back(error_counters); // Attribute : LocalControls LocalControlsAttrib *local_controls = new LocalControlsAttrib(); att_list.push_back(local_controls); // End of Automatic code generation //------------------------------------------------------------- } //+---------------------------------------------------------------------------- // // method : BiltClass::get_class_property() // // description : Read the class properties from database. // //----------------------------------------------------------------------------- void BiltClass::get_class_property() { // Initialize your default values here (if not done with POGO). //------------------------------------------------------------------ // Read class properties from database.(Automatic code generation) //------------------------------------------------------------------ // Call database and extract values //-------------------------------------------- if (Tango::Util::instance()->_UseDb==true) get_db_class()->get_property(cl_prop); Tango::DbDatum def_prop; int i = -1; // End of Automatic code generation //------------------------------------------------------------------ } //+---------------------------------------------------------------------------- // // method : BiltClass::set_default_property // // description: Set default property (class and device) for wizard. // For each property, add to wizard property name and description // If default value has been set, add it to wizard property and // store it in a DbDatum. // //----------------------------------------------------------------------------- void BiltClass::set_default_property() { string prop_name; string prop_desc; string prop_def; vector vect_data; // Set Default Class Properties // Set Default Device Properties prop_name = "IPAddress"; prop_desc = "IP Address of BILT controller.\nEach controller includes several magnets and\neach magnet includes 3 power supplies,\nfor corrections in the X, Y and Z planes.\n\n"; prop_def = "0.0.0.0"; vect_data.clear(); vect_data.push_back("0.0.0.0"); if (prop_def.length()>0) { Tango::DbDatum data(prop_name); data << vect_data ; dev_def_prop.push_back(data); add_wiz_dev_prop(prop_name, prop_desc, prop_def); } else add_wiz_dev_prop(prop_name, prop_desc); prop_name = "MagnetNumber"; prop_desc = "Magnet number from 1 to 48"; prop_def = "0"; vect_data.clear(); vect_data.push_back("0"); if (prop_def.length()>0) { Tango::DbDatum data(prop_name); data << vect_data ; dev_def_prop.push_back(data); add_wiz_dev_prop(prop_name, prop_desc, prop_def); } else add_wiz_dev_prop(prop_name, prop_desc); prop_name = "UpdatePeriod"; prop_desc = "The update period for the data reading from the power supply in milli seconds."; prop_def = "1000"; vect_data.clear(); vect_data.push_back("1000"); if (prop_def.length()>0) { Tango::DbDatum data(prop_name); data << vect_data ; dev_def_prop.push_back(data); add_wiz_dev_prop(prop_name, prop_desc, prop_def); } else add_wiz_dev_prop(prop_name, prop_desc); } //+---------------------------------------------------------------------------- // // method : BiltClass::write_class_property // // description : Set class description as property in database // //----------------------------------------------------------------------------- void BiltClass::write_class_property() { // First time, check if database used //-------------------------------------------- if (Tango::Util::_UseDb == false) return; Tango::DbData data; string classname = get_name(); string header; string::size_type start, end; // Put title Tango::DbDatum title("ProjectTitle"); string str_title("BILT multi channel power supply"); title << str_title; data.push_back(title); // Put Description Tango::DbDatum description("Description"); vector str_desc; str_desc.push_back("The BILT multi channel power supply will be used with 3 channels for the ESRF fast"); str_desc.push_back("feedback systems."); str_desc.push_back("The power supply can be controlled in 2 ways :"); str_desc.push_back("By this device server for slow or human control or"); str_desc.push_back("by the Libera Beam Position monitors for fast feedback with closed loop control."); str_desc.push_back("The devices are exported as one device per steerer magnet. Every device has three"); str_desc.push_back("channels. The channels (poles) cannot be switched on individually but have their"); str_desc.push_back("individual set points and measurement values."); description << str_desc; data.push_back(description); // put cvs or svn location string filename(classname); filename += "Class.cpp"; // Create a string with the class ID to // get the string into the binary string class_id(ClassId); // check for cvs information string src_path(CvsPath); start = src_path.find("/"); if (start!=string::npos) { end = src_path.find(filename); if (end>start) { string strloc = src_path.substr(start, end-start); // Check if specific repository start = strloc.find("/cvsroot/"); if (start!=string::npos && start>0) { string repository = strloc.substr(0, start); if (repository.find("/segfs/")!=string::npos) strloc = "ESRF:" + strloc.substr(start, strloc.length()-start); } Tango::DbDatum cvs_loc("cvs_location"); cvs_loc << strloc; data.push_back(cvs_loc); } } // check for svn information else { string src_path(SvnPath); start = src_path.find("://"); if (start!=string::npos) { end = src_path.find(filename); if (end>start) { header = "$HeadURL: "; start = header.length(); string strloc = src_path.substr(start, (end-start)); Tango::DbDatum svn_loc("svn_location"); svn_loc << strloc; data.push_back(svn_loc); } } } // Get CVS or SVN revision tag // CVS tag string tagname(TagName); header = "$Name: "; start = header.length(); string endstr(" $"); end = tagname.find(endstr); if (end!=string::npos && end>start) { string strtag = tagname.substr(start, end-start); Tango::DbDatum cvs_tag("cvs_tag"); cvs_tag << strtag; data.push_back(cvs_tag); } // SVN tag string svnpath(SvnPath); header = "$HeadURL: "; start = header.length(); end = svnpath.find(endstr); if (end!=string::npos && end>start) { string strloc = svnpath.substr(start, end-start); string tagstr ("/tags/"); start = strloc.find(tagstr); if ( start!=string::npos ) { start = start + tagstr.length(); end = strloc.find(filename); string strtag = strloc.substr(start, end-start-1); Tango::DbDatum svn_tag("svn_tag"); svn_tag << strtag; data.push_back(svn_tag); } } // Get URL location string httpServ(HttpServer); if (httpServ.length()>0) { Tango::DbDatum db_doc_url("doc_url"); db_doc_url << httpServ; data.push_back(db_doc_url); } // Put inheritance Tango::DbDatum inher_datum("InheritedFrom"); vector inheritance; inheritance.push_back("Device_4Impl"); inher_datum << inheritance; data.push_back(inher_datum); // Call database and and values //-------------------------------------------- get_db_class()->put_property(data); } } // namespace Node-path: powersupply/itest/Bilt/trunk/BiltClass.h Node-kind: file Node-action: change Text-content-length: 10651 Text-content-md5: 9b91678326c61b71831e7153e19500b4 Content-length: 10651 //============================================================================= // // file : BiltClass.h // // description : Include for the BiltClass root class. // This class is the singleton class for // the Bilt device class. // It contains all properties and methods which the // Bilt requires only once e.g. the commands. // // project : TANGO Device Server // // $Author: meyer $ // // $Revision: 1.6 $ // $Date: 2010-02-11 16:35:27 $ // // SVN only: // $HeadURL: $ // // CVS only: // $Source: /segfs/tango/cvsroot/cppserver/machine/powersupply/SrSteerers/tango/Bilt/BiltClass.h,v $ // $Log: not supported by cvs2svn $ // Revision 1.5 2010/02/10 12:27:31 meyer // Restructured Bilt class. // Acquistion is now done by a thread and only the multi channel data // gets exported. A single channel class (BiltCh) was created. // // Revision 1.4 2009/11/27 13:49:26 meyer // Modified structure! The pole is no longer a device. // The device is now a magnet with three poles. // // Revision 1.3 2009/11/26 10:46:58 meyer // Updated for libMagnet_V120 // // Revision 1.2 2009/11/06 12:46:25 meyer // Added impedance attribute and corrected fromatting of attribute values. // // Revision 1.1.1.1 2009/11/04 16:23:02 meyer // Imported using TkCVS // // // copyleft : European Synchrotron Radiation Facility // BP 220, Grenoble 38043 // FRANCE // //============================================================================= // // This file is generated by POGO // (Program Obviously used to Generate tango Object) // // (c) - Software Engineering Group - ESRF //============================================================================= #ifndef _BILTCLASS_H #define _BILTCLASS_H #include #include namespace Bilt_ns {//===================================== // Define classes for attributes //===================================== class LocalControlsAttrib: public Tango::SpectrumAttr { public: LocalControlsAttrib():SpectrumAttr("LocalControls", Tango::DEV_BOOLEAN, Tango::READ, 5) {}; ~LocalControlsAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_LocalControls(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_LocalControls_allowed(ty);} }; class ErrorCountersAttrib: public Tango::SpectrumAttr { public: ErrorCountersAttrib():SpectrumAttr("ErrorCounters", Tango::DEV_ULONG, Tango::READ, 3) {}; ~ErrorCountersAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_ErrorCounters(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_ErrorCounters_allowed(ty);} }; class ErrorsPerSecondAttrib: public Tango::SpectrumAttr { public: ErrorsPerSecondAttrib():SpectrumAttr("ErrorsPerSecond", Tango::DEV_ULONG, Tango::READ, 3) {}; ~ErrorsPerSecondAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_ErrorsPerSecond(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_ErrorsPerSecond_allowed(ty);} }; class FramesPerSecondAttrib: public Tango::SpectrumAttr { public: FramesPerSecondAttrib():SpectrumAttr("FramesPerSecond", Tango::DEV_ULONG, Tango::READ, 3) {}; ~FramesPerSecondAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_FramesPerSecond(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_FramesPerSecond_allowed(ty);} }; class SetCurrentsAverageAttrib: public Tango::SpectrumAttr { public: SetCurrentsAverageAttrib():SpectrumAttr("SetCurrentsAverage", Tango::DEV_DOUBLE, Tango::READ, 3) {}; ~SetCurrentsAverageAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_SetCurrentsAverage(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_SetCurrentsAverage_allowed(ty);} }; class SetCurrentsRMSAttrib: public Tango::SpectrumAttr { public: SetCurrentsRMSAttrib():SpectrumAttr("SetCurrentsRMS", Tango::DEV_DOUBLE, Tango::READ, 3) {}; ~SetCurrentsRMSAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_SetCurrentsRMS(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_SetCurrentsRMS_allowed(ty);} }; class ImpedancesAttrib: public Tango::SpectrumAttr { public: ImpedancesAttrib():SpectrumAttr("Impedances", Tango::DEV_DOUBLE, Tango::READ, 3) {}; ~ImpedancesAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_Impedances(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_Impedances_allowed(ty);} }; class VoltagesAttrib: public Tango::SpectrumAttr { public: VoltagesAttrib():SpectrumAttr("Voltages", Tango::DEV_DOUBLE, Tango::READ, 3) {}; ~VoltagesAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_Voltages(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_Voltages_allowed(ty);} }; class CurrentsAttrib: public Tango::SpectrumAttr { public: CurrentsAttrib():SpectrumAttr("Currents", Tango::DEV_DOUBLE, Tango::READ_WRITE, 3) {}; ~CurrentsAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_Currents(att);} virtual void write(Tango::DeviceImpl *dev,Tango::WAttribute &att) {(static_cast(dev))->write_Currents(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_Currents_allowed(ty);} }; //========================================= // Define classes for commands //========================================= class LocalPoleControlCmd : public Tango::Command { public: LocalPoleControlCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out, const char *in_desc, const char *out_desc, Tango::DispLevel level) :Command(name,in,out,in_desc,out_desc, level) {}; LocalPoleControlCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out) :Command(name,in,out) {}; ~LocalPoleControlCmd() {}; virtual CORBA::Any *execute (Tango::DeviceImpl *dev, const CORBA::Any &any); virtual bool is_allowed (Tango::DeviceImpl *dev, const CORBA::Any &any) {return (static_cast(dev))->is_LocalPoleControl_allowed(any);} }; class SetPoleAcCurrentCmd : public Tango::Command { public: SetPoleAcCurrentCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out, const char *in_desc, const char *out_desc, Tango::DispLevel level) :Command(name,in,out,in_desc,out_desc, level) {}; SetPoleAcCurrentCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out) :Command(name,in,out) {}; ~SetPoleAcCurrentCmd() {}; virtual CORBA::Any *execute (Tango::DeviceImpl *dev, const CORBA::Any &any); virtual bool is_allowed (Tango::DeviceImpl *dev, const CORBA::Any &any) {return (static_cast(dev))->is_SetPoleAcCurrent_allowed(any);} }; class ResetCmd : public Tango::Command { public: ResetCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out, const char *in_desc, const char *out_desc, Tango::DispLevel level) :Command(name,in,out,in_desc,out_desc, level) {}; ResetCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out) :Command(name,in,out) {}; ~ResetCmd() {}; virtual CORBA::Any *execute (Tango::DeviceImpl *dev, const CORBA::Any &any); virtual bool is_allowed (Tango::DeviceImpl *dev, const CORBA::Any &any) {return (static_cast(dev))->is_Reset_allowed(any);} }; class OffCmd : public Tango::Command { public: OffCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out, const char *in_desc, const char *out_desc, Tango::DispLevel level) :Command(name,in,out,in_desc,out_desc, level) {}; OffCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out) :Command(name,in,out) {}; ~OffCmd() {}; virtual CORBA::Any *execute (Tango::DeviceImpl *dev, const CORBA::Any &any); virtual bool is_allowed (Tango::DeviceImpl *dev, const CORBA::Any &any) {return (static_cast(dev))->is_Off_allowed(any);} }; class OnCmd : public Tango::Command { public: OnCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out, const char *in_desc, const char *out_desc, Tango::DispLevel level) :Command(name,in,out,in_desc,out_desc, level) {}; OnCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out) :Command(name,in,out) {}; ~OnCmd() {}; virtual CORBA::Any *execute (Tango::DeviceImpl *dev, const CORBA::Any &any); virtual bool is_allowed (Tango::DeviceImpl *dev, const CORBA::Any &any) {return (static_cast(dev))->is_On_allowed(any);} }; // // The BiltClass singleton definition // class #ifdef _TG_WINDOWS_ __declspec(dllexport) #endif BiltClass : public Tango::DeviceClass { public: // properties member data // add your own data members here //------------------------------------ public: Tango::DbData cl_prop; Tango::DbData cl_def_prop; Tango::DbData dev_def_prop; // Method prototypes static BiltClass *init(const char *); static BiltClass *instance(); ~BiltClass(); Tango::DbDatum get_class_property(string &); Tango::DbDatum get_default_device_property(string &); Tango::DbDatum get_default_class_property(string &); protected: BiltClass(string &); static BiltClass *_instance; void command_factory(); void get_class_property(); void attribute_factory(vector &); void write_class_property(); void set_default_property(); string get_cvstag(); string get_cvsroot(); private: void device_factory(const Tango::DevVarStringArray *); }; } // namespace Bilt_ns #endif // _BILTCLASS_H Node-path: powersupply/itest/Bilt/trunk/BiltStateMachine.cpp Node-kind: file Node-action: change Text-content-length: 8413 Text-content-md5: ca34a02585ac227865f6db48b1ac49ed Content-length: 8413 static const char *RcsId = "$Id $"; //+============================================================================= // // file : BiltStateMachine.cpp // // description : C++ source for the Bilt and its alowed // methods for commands and attributes // // project : TANGO Device Server // // $Author: meyer $ // // $Revision: 1.6 $ // $Date: 2010-02-11 16:35:27 $ // // SVN only: // $HeadURL: $ // // CVS only: // $Source: /segfs/tango/cvsroot/cppserver/machine/powersupply/SrSteerers/tango/Bilt/BiltStateMachine.cpp,v $ // $Log: not supported by cvs2svn $ // Revision 1.5 2010/02/10 12:27:31 meyer // Restructured Bilt class. // Acquistion is now done by a thread and only the multi channel data // gets exported. A single channel class (BiltCh) was created. // // Revision 1.4 2009/11/27 13:49:26 meyer // Modified structure! The pole is no longer a device. // The device is now a magnet with three poles. // // Revision 1.3 2009/11/26 10:46:58 meyer // Updated for libMagnet_V120 // // Revision 1.2 2009/11/06 12:46:25 meyer // Added impedance attribute and corrected fromatting of attribute values. // // Revision 1.1.1.1 2009/11/04 16:23:02 meyer // Imported using TkCVS // // // copyleft : European Synchrotron Radiation Facility // BP 220, Grenoble 38043 // FRANCE // //-============================================================================= // // This file is generated by POGO // (Program Obviously used to Generate tango Object) // // (c) - Software Engineering Group - ESRF //============================================================================= #include #include #include /*==================================================================== * This file contains the methods to allow commands and attributes * read or write execution. * * If you wand to add your own code, add it between * the "End/Re-Start of Generated Code" comments. * * If you want, you can also add your own methods. *==================================================================== */ namespace Bilt_ns { //================================================= // Attributes Allowed Methods //================================================= //+---------------------------------------------------------------------------- // // method : Bilt::is_Voltages_allowed // // description : Read/Write allowed for Voltages attribute. // //----------------------------------------------------------------------------- bool Bilt::is_Voltages_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_Impedances_allowed // // description : Read/Write allowed for Impedances attribute. // //----------------------------------------------------------------------------- bool Bilt::is_Impedances_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_SetCurrentsRMS_allowed // // description : Read/Write allowed for SetCurrentsRMS attribute. // //----------------------------------------------------------------------------- bool Bilt::is_SetCurrentsRMS_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_SetCurrentsAverage_allowed // // description : Read/Write allowed for SetCurrentsAverage attribute. // //----------------------------------------------------------------------------- bool Bilt::is_SetCurrentsAverage_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_ErrorCounters_allowed // // description : Read/Write allowed for ErrorCounters attribute. // //----------------------------------------------------------------------------- bool Bilt::is_ErrorCounters_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_LocalControls_allowed // // description : Read/Write allowed for LocalControls attribute. // //----------------------------------------------------------------------------- bool Bilt::is_LocalControls_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_Currents_allowed // // description : Read/Write allowed for Currents attribute. // //----------------------------------------------------------------------------- bool Bilt::is_Currents_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_FramesPerSecond_allowed // // description : Read/Write allowed for FramesPerSecond attribute. // //----------------------------------------------------------------------------- bool Bilt::is_FramesPerSecond_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_ErrorsPerSecond_allowed // // description : Read/Write allowed for ErrorsPerSecond attribute. // //----------------------------------------------------------------------------- bool Bilt::is_ErrorsPerSecond_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //================================================= // Commands Allowed Methods //================================================= //+---------------------------------------------------------------------------- // // method : Bilt::is_On_allowed // // description : Execution allowed for On command. // //----------------------------------------------------------------------------- bool Bilt::is_On_allowed(const CORBA::Any &any) { if (get_state() == Tango::ON || get_state() == Tango::FAULT || get_state() == Tango::ALARM || get_state() == Tango::UNKNOWN) { // End of Generated Code // Re-Start of Generated Code return false; } return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_Off_allowed // // description : Execution allowed for Off command. // //----------------------------------------------------------------------------- bool Bilt::is_Off_allowed(const CORBA::Any &any) { if (get_state() == Tango::OFF) { // End of Generated Code // Re-Start of Generated Code return false; } return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_Reset_allowed // // description : Execution allowed for Reset command. // //----------------------------------------------------------------------------- bool Bilt::is_Reset_allowed(const CORBA::Any &any) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_SetPoleAcCurrent_allowed // // description : Execution allowed for SetPoleAcCurrent command. // //----------------------------------------------------------------------------- bool Bilt::is_SetPoleAcCurrent_allowed(const CORBA::Any &any) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_LocalPoleControl_allowed // // description : Execution allowed for LocalPoleControl command. // //----------------------------------------------------------------------------- bool Bilt::is_LocalPoleControl_allowed(const CORBA::Any &any) { // End of Generated Code // Re-Start of Generated Code return true; } } // namespace Bilt_ns Node-path: powersupply/itest/Bilt/trunk/Makefile Node-kind: file Node-action: change Text-content-length: 5842 Text-content-md5: 64b64f59f04dffe2dd4bceac66c30634 Content-length: 5842 #============================================================================= # # file : Makefile # # description : Include for the Bilt class. # # project : Makefile to generate a Tango server # # $Author: meyer $ # # $Revision: 1.8 $ # # $Log: not supported by cvs2svn $ # Revision 1.7 2010/02/10 16:22:15 meyer # Release_3_0 # # Revision 1.6 2010/02/10 12:27:31 meyer # Restructured Bilt class. # Acquistion is now done by a thread and only the multi channel data # gets exported. A single channel class (BiltCh) was created. # # Revision 1.5 2009/12/18 12:02:18 meyer # Changed version number to 2.1 # # Revision 1.4 2009/12/18 10:19:23 meyer # Using libMagnet version 130 now. # # Revision 1.3 2009/11/27 13:49:26 meyer # Modified structure! The pole is no longer a device. # The device is now a magnet with three poles. # # Revision 1.2 2009/11/26 10:46:58 meyer # Updated for libMagnet_V120 # # Revision 1.1.1.1 2009/11/04 16:23:02 meyer # Imported using TkCVS # # # copyleft : European Synchrotron Radiation Facility # BP 220, Grenoble 38043 # FRANCE # #============================================================================= # This file is generated by POGO # (Program Obviously used to Generate tango Object) # # (c) - Software Engineering Group - ESRF #============================================================================= # CLASS = Bilt MAJOR_VERS = 3 MINOR_VERS = 0 RELEASE = Release_$(MAJOR_VERS)_$(MINOR_VERS) OS = $(shell /csadmin/common/scripts/get_os) PROCESSOR = $(shell uname -p) #----------------------------------------- # Set default home directories #----------------------------------------- TANGO_HOME = /segfs/tango/release/$(BIN_DIR) CPP_SERVERS = $(TANGO_HOME)/classes ifdef no_debug DEBUG = -O else DEBUG = -g endif ifdef _solaris CC = CC BIN_DIR=$(OS)_CC AR_SL = $(CC) -mt -G VERS_OPT = -h SL_EXT = so endif ifdef linux CC = c++ CC_SHLIB = $(CC) -fPIC $(PROCESSOR)=1 ifdef x86_64 NBITS=_64 endif BIN_DIR=$(OS)$(NBITS) AR_SL = $(CC) -fPIC -shared SL_EXT = so VERS_OPT = -Wl,-soname, endif INCLUDE_DIRS = -I$(TANGO_HOME)/include -I. \ -I$(CPP_SERVERS)/include \ -I libMagnet_V130 OBJS_DIR = obj/$(BIN_DIR) LIB_DIRS = -L $(CPP_SERVERS)/lib \ -L $(TANGO_HOME)/lib \ -L libMagnet_V130 TARGET_LIB = $(CPP_SERVERS)/lib/libtgclasses.a #----------------------------------------- # Set CXXFLAGS and LFLAGS #----------------------------------------- ifdef _solaris CXXFLAGS = $(DEBUG) -mt -D_PTHREADS $(INCLUDE_DIRS) LFLAGS = $(DEBUG) $(LIB_DIRS) \ -ltango \ -llog4tango \ -lomniORB4 \ -lomniDynamic4 \ -lomnithread \ -lCOS4 \ -lpthread \ -lposix4 -lsocket -lnsl \ -ltgclasses endif ifdef linux CXXFLAGS = -g -D_REENTRANT $(INCLUDE_DIRS) LFLAGS = $(DEBUG) $(LIB_DIRS) \ -ltango \ -llog4tango \ -lomniORB4 \ -lomniDynamic4 \ -lomnithread \ -lCOS4 \ -ldl -lpthread \ -lMagnet \ -ltgclasses endif #----------------------------------------- # Set dependences #----------------------------------------- SVC_OBJS = $(OBJS_DIR)/$(CLASS).o \ $(OBJS_DIR)/$(CLASS)StateMachine.o \ $(OBJS_DIR)/$(CLASS)Class.o \ $(OBJS_DIR)/AcquisitionThread.o \ $(OBJS_DIR)/ClassFactory.o \ $(OBJS_DIR)/main.o SHLIB_OBJS = $(OBJS_DIR)/$(CLASS)Class.so.o \ $(OBJS_DIR)/$(CLASS)StateMachine.so.o \ $(OBJS_DIR)/$(CLASS).so.o \ $(OBJS_DIR)/AcquisitionThread.o SVC_INC = $(CLASS)Class.h \ $(CLASS).h \ AcquisitionThread.h $(OBJS_DIR)/%.o: %.cpp $(SVC_INC) $(CC) $(CXXFLAGS) -c $< -o $(OBJS_DIR)/$*.o $(OBJS_DIR)/%.so.o: %.cpp $(SVC_INC) $(CC_SHLIB) $(CXXFLAGS) -c $< -o $(OBJS_DIR)/$*.so.o #----------------------------------------- # Make Entry #----------------------------------------- all: $(CLASS) $(CLASS): make_obj_dir make_bin_dir $(SVC_OBJS) $(CC) $(SVC_OBJS) -o $(CLASS) $(LFLAGS) @mv $(CLASS) bin/$(BIN_DIR)/$(CLASS) shlib: make_obj_dir make_shlib_dir $(SHLIB_OBJS) $(AR_SL) -o \ shlib/$(BIN_DIR)/$(CLASS).$(SL_EXT).$(MAJOR_VERS).$(MINOR_VERS) \ $(VERS_OPT)$(CLASS).$(SL_EXT).$(MAJOR_VERS) \ $(SHLIB_OBJS) $(LFLAGS) @rm -f shlib/$(BIN_DIR)/$(CLASS).$(SL_EXT) @cd shlib/$(BIN_DIR); \ ln -s $(CLASS).$(SL_EXT).$(MAJOR_VERS).$(MINOR_VERS) $(CLASS).$(SL_EXT) clean: rm -f $(OBJS_DIR)/*.o \ $(OBJS_DIR)/*.so.o \ bin/$(BIN_DIR)/$(CLASS) \ core make_obj_dir: @mkdir -p obj @mkdir -p obj/$(BIN_DIR) make_bin_dir: @mkdir -p bin @mkdir -p bin/$(BIN_DIR) make_shlib_dir: @mkdir -p shlib @mkdir -p shlib/$(BIN_DIR) #----------------------------------------- # Install binary file #----------------------------------------- install: cp bin/$(BIN_DIR)/$(CLASS) $(CPP_SERVERS)/bin #----------------------------------------- # Update class library and header files # recompile without debug mode. #----------------------------------------- lib: clean @make no_debug=1 cp *.h $(CPP_SERVERS)/include ar ruv $(TARGET_LIB) $(OBJS_DIR)/$(CLASS).o ar ruv $(TARGET_LIB) $(OBJS_DIR)/$(CLASS)Class.o ar ruv $(TARGET_LIB) $(OBJS_DIR)/$(CLASS)StateMachine.o ident $(TARGET_LIB) | grep $(CLASS) #------------------------------------------------------ # Tag the CVS/SVN module corresponding to this class # copy cvs_tag or svn_tag to tag: entry #------------------------------------------------------ #svn_tag: # svn copy ../trunk ../tags/$(RELEASE) # svn commit ../tags/$(RELEASE) \ # -m "Tagging the $(RELEASE) of the $(CLASS) project." # #cvs_tag: # @cvstag "$(CLASS)-$(RELEASE)" # @make $(CLASS) # @make show_tag #show_cvs_tag: # @cvstag -d # # Only these make options work with the current Pogo version 5.3.x! tag: @cvstag "$(CLASS)-$(RELEASE)" @make $(CLASS) @make show_tag show_tag: @cvstag -d Revision-number: 25 Prop-content-length: 154 Content-length: 154 K 10 svn:author V 5 meyer K 8 svn:date V 27 2010-02-11T16:36:31.000000Z K 7 svn:log V 54 Currents attribute of Bilt understand NaN values now. PROPS-END Node-path: powersupply/itest/BiltCh/trunk/BiltCh.cpp Node-kind: file Node-action: change Text-content-length: 18402 Text-content-md5: 369ce2f9eb1eb94087e825f51f2551b9 Content-length: 18402 static const char *RcsId = "$Id: BiltCh.cpp,v 1.2 2010-02-11 16:36:31 meyer Exp $"; //+============================================================================= // // file : BiltCh.cpp // // description : C++ source for the BiltCh and its commands. // The class is derived from Device. It represents the // CORBA servant object which will be accessed from the // network. All commands which can be executed on the // BiltCh are implemented in this file. // // project : TANGO Device Server // // $Author: meyer $ // // $Revision: 1.2 $ // // $Revision: 1.2 $ // $Date: 2010-02-11 16:36:31 $ // // SVN only: // $HeadURL: $ // // CVS only: // $Source: /segfs/tango/cvsroot/cppserver/machine/powersupply/SrSteerers/tango/BiltCh/BiltCh.cpp,v $ // $Log: not supported by cvs2svn $ // Revision 1.1.1.1 2010-02-10 11:49:21 meyer // Imported using TkCVS // // // copyleft : European Synchrotron Radiation Facility // BP 220, Grenoble 38043 // FRANCE // //-============================================================================= // // This file is generated by POGO // (Program Obviously used to Generate tango Object) // // (c) - Software Engineering Group - ESRF //============================================================================= //=================================================================== // // The following table gives the correspondence // between commands and method name. // // Command name| Method name // ---------------------------------------- // State | dev_state() // Status | dev_status() // //=================================================================== #include #include #include #include namespace BiltCh_ns { //+---------------------------------------------------------------------------- // // method : BiltCh::BiltCh(string &s) // // description : constructor for simulated BiltCh // // in : - cl : Pointer to the DeviceClass object // - s : Device name // //----------------------------------------------------------------------------- BiltCh::BiltCh(Tango::DeviceClass *cl,string &s) :Tango::Device_4Impl(cl,s.c_str()) { init_device(); } BiltCh::BiltCh(Tango::DeviceClass *cl,const char *s) :Tango::Device_4Impl(cl,s) { init_device(); } BiltCh::BiltCh(Tango::DeviceClass *cl,const char *s,const char *d) :Tango::Device_4Impl(cl,s,d) { init_device(); } //+---------------------------------------------------------------------------- // // method : BiltCh::delete_device() // // description : will be called at device destruction or at init command. // //----------------------------------------------------------------------------- void BiltCh::delete_device() { // Delete device allocated objects if ( bilt_obj != NULL ) { delete bilt_obj; } } //+---------------------------------------------------------------------------- // // method : BiltCh::init_device() // // description : will be called at device initialization. // //----------------------------------------------------------------------------- void BiltCh::init_device() { INFO_STREAM << "BiltCh::BiltCh() create device " << device_name << endl; // Initialise variables to default values //-------------------------------------------- get_device_property(); set_state (Tango::UNKNOWN); // open proxy to Bilt power supply try { bilt_obj = new Tango::DeviceProxy(biltName); Tango::DeviceAttribute rattr; Tango::DevState bilt_state; rattr = bilt_obj->read_attribute("State"); rattr >> bilt_state; set_state (bilt_state); bilt_init = true; } catch (Tango::DevFailed &e) { bilt_error = e.errors; bilt_init = false; } } //+---------------------------------------------------------------------------- // // method : BiltCh::get_device_property() // // description : Read the device properties from database. // //----------------------------------------------------------------------------- void BiltCh::get_device_property() { // Initialize your default values here (if not done with POGO). //------------------------------------------------------------------ bilt_obj = NULL; current = 0; voltage = 0; impedance = 0; current_rms = 0; current_average = 0; error_counter = 0; errors_per_sec = 0; frames_per_sec = 0; local_control = false; current_ac = 0; // Read device properties from database.(Automatic code generation) //------------------------------------------------------------------ Tango::DbData dev_prop; dev_prop.push_back(Tango::DbDatum("BiltName")); dev_prop.push_back(Tango::DbDatum("PoleNumber")); // Call database and extract values //-------------------------------------------- if (Tango::Util::instance()->_UseDb==true) get_db_device()->get_property(dev_prop); Tango::DbDatum def_prop, cl_prop; BiltChClass *ds_class = (static_cast(get_device_class())); int i = -1; // Try to initialize BiltName from class property cl_prop = ds_class->get_class_property(dev_prop[++i].name); if (cl_prop.is_empty()==false) cl_prop >> biltName; else { // Try to initialize BiltName from default device value def_prop = ds_class->get_default_device_property(dev_prop[i].name); if (def_prop.is_empty()==false) def_prop >> biltName; } // And try to extract BiltName value from database if (dev_prop[i].is_empty()==false) dev_prop[i] >> biltName; // Try to initialize PoleNumber from class property cl_prop = ds_class->get_class_property(dev_prop[++i].name); if (cl_prop.is_empty()==false) cl_prop >> poleNumber; else { // Try to initialize PoleNumber from default device value def_prop = ds_class->get_default_device_property(dev_prop[i].name); if (def_prop.is_empty()==false) def_prop >> poleNumber; } // And try to extract PoleNumber value from database if (dev_prop[i].is_empty()==false) dev_prop[i] >> poleNumber; // End of Automatic code generation //------------------------------------------------------------------ } //+---------------------------------------------------------------------------- // // method : BiltCh::always_executed_hook() // // description : method always executed before any command is executed // //----------------------------------------------------------------------------- void BiltCh::always_executed_hook() { } //+---------------------------------------------------------------------------- // // method : BiltCh::read_attr_hardware // // description : Hardware acquisition for attributes. // //----------------------------------------------------------------------------- void BiltCh::read_attr_hardware(vector &attr_list) { DEBUG_STREAM << "BiltCh::read_attr_hardware(vector &attr_list) entering... "<< endl; // Add your own code here if ( bilt_init == false ) { TangoSys_MemStream tms; tms << "Device is not correctly initialised! See the device status for more information." << endl; Tango::Except::throw_exception("ReadError", tms.str(), "Bilt::read_attr_hardware"); } } //+---------------------------------------------------------------------------- // // method : BiltCh::read_Current // // description : Extract real attribute values for Current acquisition result. // //----------------------------------------------------------------------------- void BiltCh::read_Current(Tango::Attribute &attr) { DEBUG_STREAM << "BiltCh::read_Current(Tango::Attribute &attr) entering... "<< endl; Tango::DeviceAttribute rattr; vector values; rattr = bilt_obj->read_attribute("Currents"); rattr >> values; Tango::MultiAttribute *attr_list = get_device_attr(); Tango::WAttribute &attr_curr = attr_list->get_w_attr_by_name ("Current"); attr_curr.set_write_value( &(values[POLES + poleNumber]) ); current = values[poleNumber]; attr.set_value (¤t); } //+---------------------------------------------------------------------------- // // method : BiltCh::write_Current // // description : Write Current attribute values to hardware. // //----------------------------------------------------------------------------- void BiltCh::write_Current(Tango::WAttribute &attr) { DEBUG_STREAM << "BiltCh::write_Current(Tango::WAttribute &attr) entering... "<< endl; double set_current; attr.get_write_value(set_current); //Tango::DeviceData argin; //vector cmd_in; //cmd_in.push_back (poleNumber); //cmd_in.push_back (set_current); //argin << cmd_in; //bilt_obj->command_inout("SetPoleCurrent", argin); vector argin; argin.assign(POLES, nan("NaN")); argin[poleNumber] = set_current; Tango::DeviceAttribute w_attr; w_attr.set_name("Currents"); w_attr << argin; bilt_obj->write_attribute(w_attr); } //+---------------------------------------------------------------------------- // // method : BiltCh::read_Voltage // // description : Extract real attribute values for Voltage acquisition result. // //----------------------------------------------------------------------------- void BiltCh::read_Voltage(Tango::Attribute &attr) { DEBUG_STREAM << "BiltCh::read_Voltage(Tango::Attribute &attr) entering... "<< endl; Tango::DeviceAttribute rattr; vector values; rattr = bilt_obj->read_attribute("Voltages"); rattr >> values; voltage = values[poleNumber]; attr.set_value (&voltage); } //+---------------------------------------------------------------------------- // // method : BiltCh::read_Impedance // // description : Extract real attribute values for Impedance acquisition result. // //----------------------------------------------------------------------------- void BiltCh::read_Impedance(Tango::Attribute &attr) { DEBUG_STREAM << "BiltCh::read_Impedance(Tango::Attribute &attr) entering... "<< endl; Tango::DeviceAttribute rattr; vector values; rattr = bilt_obj->read_attribute("Impedances"); rattr >> values; impedance = values[poleNumber]; attr.set_value (&impedance); } //+---------------------------------------------------------------------------- // // method : BiltCh::read_SetCurrentRMS // // description : Extract real attribute values for SetCurrentRMS acquisition result. // //----------------------------------------------------------------------------- void BiltCh::read_SetCurrentRMS(Tango::Attribute &attr) { DEBUG_STREAM << "BiltCh::read_SetCurrentRMS(Tango::Attribute &attr) entering... "<< endl; Tango::DeviceAttribute rattr; vector values; rattr = bilt_obj->read_attribute("SetCurrentsRMS"); rattr >> values; current_rms = values[poleNumber]; attr.set_value (¤t_rms); } //+---------------------------------------------------------------------------- // // method : BiltCh::read_SetCurrentAverage // // description : Extract real attribute values for SetCurrentAverage acquisition result. // //----------------------------------------------------------------------------- void BiltCh::read_SetCurrentAverage(Tango::Attribute &attr) { DEBUG_STREAM << "BiltCh::read_SetCurrentAverage(Tango::Attribute &attr) entering... "<< endl; Tango::DeviceAttribute rattr; vector values; rattr = bilt_obj->read_attribute("SetCurrentsAverage"); rattr >> values; current_average = values[poleNumber]; attr.set_value (¤t_average); } //+---------------------------------------------------------------------------- // // method : BiltCh::read_FramesPerSec // // description : Extract real attribute values for FramesPerSec acquisition result. // //----------------------------------------------------------------------------- void BiltCh::read_FramesPerSecond(Tango::Attribute &attr) { DEBUG_STREAM << "BiltCh::read_FramesPerSec(Tango::Attribute &attr) entering... "<< endl; Tango::DeviceAttribute rattr; vector values; rattr = bilt_obj->read_attribute("FramesPerSecond"); rattr >> values; frames_per_sec = values[poleNumber]; attr.set_value (&frames_per_sec); } //+---------------------------------------------------------------------------- // // method : BiltCh::read_ErrorPerSec // // description : Extract real attribute values for ErrorPerSec acquisition result. // //----------------------------------------------------------------------------- void BiltCh::read_ErrorPerSecond(Tango::Attribute &attr) { DEBUG_STREAM << "BiltCh::read_ErrorPerSec(Tango::Attribute &attr) entering... "<< endl; Tango::DeviceAttribute rattr; vector values; rattr = bilt_obj->read_attribute("ErrorsPerSecond"); rattr >> values; errors_per_sec = values[poleNumber]; attr.set_value (&errors_per_sec); } //+---------------------------------------------------------------------------- // // method : BiltCh::read_ErrorCounter // // description : Extract real attribute values for ErrorCounter acquisition result. // //----------------------------------------------------------------------------- void BiltCh::read_ErrorCounter(Tango::Attribute &attr) { DEBUG_STREAM << "BiltCh::read_ErrorCounter(Tango::Attribute &attr) entering... "<< endl; Tango::DeviceAttribute rattr; vector values; rattr = bilt_obj->read_attribute("ErrorCounters"); rattr >> values; error_counter = values[poleNumber]; attr.set_value (&error_counter); } //+---------------------------------------------------------------------------- // // method : BiltCh::read_LocalControl // // description : Extract real attribute values for LocalControl acquisition result. // //----------------------------------------------------------------------------- void BiltCh::read_LocalControl(Tango::Attribute &attr) { DEBUG_STREAM << "BiltCh::read_LocalControl(Tango::Attribute &attr) entering... "<< endl; Tango::DeviceAttribute rattr; vector values; rattr = bilt_obj->read_attribute("LocalControls"); rattr >> values; local_control = values[poleNumber]; attr.set_value (&local_control); } //+---------------------------------------------------------------------------- // // method : BiltCh::write_LocalControl // // description : Write LocalControl attribute values to hardware. // //----------------------------------------------------------------------------- void BiltCh::write_LocalControl(Tango::WAttribute &attr) { DEBUG_STREAM << "BiltCh::write_LocalControl(Tango::WAttribute &attr) entering... "<< endl; bool local_control; attr.get_write_value(local_control); Tango::DeviceData argin; vector cmd_in; cmd_in.push_back (poleNumber); if (local_control == true) cmd_in.push_back (1); else { cmd_in.push_back (0); // set back the AC current setpoint to 0! Tango::DeviceData ac_curr; vector ac_in; ac_in.push_back (poleNumber); ac_in.push_back (0); ac_curr << ac_in; bilt_obj->command_inout("SetPoleAcCurrent", ac_curr); current_ac = 0; } argin << cmd_in; bilt_obj->command_inout("LocalPoleControl", argin); } //+---------------------------------------------------------------------------- // // method : BiltCh::read_SetCurrentAC // // description : Extract real attribute values for SetCurrentAC acquisition result. // //----------------------------------------------------------------------------- void BiltCh::read_SetCurrentAC(Tango::Attribute &attr) { DEBUG_STREAM << "BiltCh::read_SetCurrentAC(Tango::Attribute &attr) entering... "<< endl; if ( local_control == false ) { attr.set_quality (Tango::ATTR_INVALID); } else { attr.set_value (¤t_ac); } } //+---------------------------------------------------------------------------- // // method : BiltCh::write_SetCurrentAC // // description : Write SetCurrentAC attribute values to hardware. // //----------------------------------------------------------------------------- void BiltCh::write_SetCurrentAC(Tango::WAttribute &attr) { DEBUG_STREAM << "BiltCh::write_SetCurrentAC(Tango::WAttribute &attr) entering... "<< endl; if ( local_control == false ) { TangoSys_MemStream tms; tms << "Can set AC current only when local control enabled!" << endl; Tango::Except::throw_exception("WriteError", tms.str(), "Bilt::write_SetCurrentAC"); } double set_current; attr.get_write_value(set_current); Tango::DeviceData argin; vector cmd_in; cmd_in.push_back (poleNumber); cmd_in.push_back (set_current); argin << cmd_in; bilt_obj->command_inout("SetPoleAcCurrent", argin); current_ac = set_current; } //+------------------------------------------------------------------ /** * method: BiltCh::dev_state * * description: method to execute "State" * This command gets the device state (stored in its device_state data member) and returns it to the caller. * * @return State Code * */ //+------------------------------------------------------------------ Tango::DevState BiltCh::dev_state() { Tango::DevState argout = DeviceImpl::dev_state(); DEBUG_STREAM << "BiltCh::dev_state(): entering... !" << endl; // Add your own code to control device here if ( bilt_init == true ) { Tango::DeviceAttribute rattr; Tango::DevState bilt_state; rattr = bilt_obj->read_attribute("State"); rattr >> bilt_state; set_state (bilt_state); } return get_state(); } //+------------------------------------------------------------------ /** * method: BiltCh::dev_status * * description: method to execute "Status" * This command gets the device status (stored in its device_status data member) and returns it to the caller. * * @return Status description * */ //+------------------------------------------------------------------ Tango::ConstDevString BiltCh::dev_status() { //Tango::ConstDevString argout = DeviceImpl::dev_status(); DEBUG_STREAM << "BiltCh::dev_status(): entering... !" << endl; // Add your own code to control device here string bilt_status; if ( bilt_init == true ) { Tango::DeviceAttribute rattr; rattr = bilt_obj->read_attribute("Status"); rattr >> bilt_status; set_status (bilt_status); } else { bilt_status = "Error during initialisation: \n"; for (short i = 0; i #include #include #include namespace BiltCh_ns { //+---------------------------------------------------------------------------- // // method : BiltCh::BiltCh(string &s) // // description : constructor for simulated BiltCh // // in : - cl : Pointer to the DeviceClass object // - s : Device name // //----------------------------------------------------------------------------- BiltCh::BiltCh(Tango::DeviceClass *cl,string &s) :Tango::Device_4Impl(cl,s.c_str()) { init_device(); } BiltCh::BiltCh(Tango::DeviceClass *cl,const char *s) :Tango::Device_4Impl(cl,s) { init_device(); } BiltCh::BiltCh(Tango::DeviceClass *cl,const char *s,const char *d) :Tango::Device_4Impl(cl,s,d) { init_device(); } //+---------------------------------------------------------------------------- // // method : BiltCh::delete_device() // // description : will be called at device destruction or at init command. // //----------------------------------------------------------------------------- void BiltCh::delete_device() { // Delete device allocated objects if ( bilt_obj != NULL ) { delete bilt_obj; } } //+---------------------------------------------------------------------------- // // method : BiltCh::init_device() // // description : will be called at device initialization. // //----------------------------------------------------------------------------- void BiltCh::init_device() { INFO_STREAM << "BiltCh::BiltCh() create device " << device_name << endl; // Initialise variables to default values //-------------------------------------------- get_device_property(); set_state (Tango::UNKNOWN); // open proxy to Bilt power supply try { bilt_obj = new Tango::DeviceProxy(biltName); Tango::DeviceAttribute rattr; Tango::DevState bilt_state; rattr = bilt_obj->read_attribute("State"); rattr >> bilt_state; set_state (bilt_state); bilt_init = true; } catch (Tango::DevFailed &e) { bilt_error = e.errors; bilt_init = false; } } //+---------------------------------------------------------------------------- // // method : BiltCh::get_device_property() // // description : Read the device properties from database. // //----------------------------------------------------------------------------- void BiltCh::get_device_property() { // Initialize your default values here (if not done with POGO). //------------------------------------------------------------------ bilt_obj = NULL; current = 0; voltage = 0; impedance = 0; current_rms = 0; current_average = 0; error_counter = 0; errors_per_sec = 0; frames_per_sec = 0; local_control = false; current_ac = 0; // Read device properties from database.(Automatic code generation) //------------------------------------------------------------------ Tango::DbData dev_prop; dev_prop.push_back(Tango::DbDatum("BiltName")); dev_prop.push_back(Tango::DbDatum("PoleNumber")); // Call database and extract values //-------------------------------------------- if (Tango::Util::instance()->_UseDb==true) get_db_device()->get_property(dev_prop); Tango::DbDatum def_prop, cl_prop; BiltChClass *ds_class = (static_cast(get_device_class())); int i = -1; // Try to initialize BiltName from class property cl_prop = ds_class->get_class_property(dev_prop[++i].name); if (cl_prop.is_empty()==false) cl_prop >> biltName; else { // Try to initialize BiltName from default device value def_prop = ds_class->get_default_device_property(dev_prop[i].name); if (def_prop.is_empty()==false) def_prop >> biltName; } // And try to extract BiltName value from database if (dev_prop[i].is_empty()==false) dev_prop[i] >> biltName; // Try to initialize PoleNumber from class property cl_prop = ds_class->get_class_property(dev_prop[++i].name); if (cl_prop.is_empty()==false) cl_prop >> poleNumber; else { // Try to initialize PoleNumber from default device value def_prop = ds_class->get_default_device_property(dev_prop[i].name); if (def_prop.is_empty()==false) def_prop >> poleNumber; } // And try to extract PoleNumber value from database if (dev_prop[i].is_empty()==false) dev_prop[i] >> poleNumber; // End of Automatic code generation //------------------------------------------------------------------ } //+---------------------------------------------------------------------------- // // method : BiltCh::always_executed_hook() // // description : method always executed before any command is executed // //----------------------------------------------------------------------------- void BiltCh::always_executed_hook() { } //+---------------------------------------------------------------------------- // // method : BiltCh::read_attr_hardware // // description : Hardware acquisition for attributes. // //----------------------------------------------------------------------------- void BiltCh::read_attr_hardware(vector &attr_list) { DEBUG_STREAM << "BiltCh::read_attr_hardware(vector &attr_list) entering... "<< endl; // Add your own code here if ( bilt_init == false ) { TangoSys_MemStream tms; tms << "Device is not correctly initialised! See the device status for more information." << endl; Tango::Except::throw_exception("ReadError", tms.str(), "Bilt::read_attr_hardware"); } } //+---------------------------------------------------------------------------- // // method : BiltCh::read_Current // // description : Extract real attribute values for Current acquisition result. // //----------------------------------------------------------------------------- void BiltCh::read_Current(Tango::Attribute &attr) { DEBUG_STREAM << "BiltCh::read_Current(Tango::Attribute &attr) entering... "<< endl; Tango::DeviceAttribute rattr; vector values; rattr = bilt_obj->read_attribute("Currents"); rattr >> values; Tango::MultiAttribute *attr_list = get_device_attr(); Tango::WAttribute &attr_curr = attr_list->get_w_attr_by_name ("Current"); attr_curr.set_write_value( &(values[POLES + poleNumber]) ); current = values[poleNumber]; attr.set_value (¤t); } //+---------------------------------------------------------------------------- // // method : BiltCh::write_Current // // description : Write Current attribute values to hardware. // //----------------------------------------------------------------------------- void BiltCh::write_Current(Tango::WAttribute &attr) { DEBUG_STREAM << "BiltCh::write_Current(Tango::WAttribute &attr) entering... "<< endl; double set_current; attr.get_write_value(set_current); Tango::DeviceData argin; vector cmd_in; cmd_in.push_back (poleNumber); cmd_in.push_back (set_current); argin << cmd_in; bilt_obj->command_inout("SetPoleCurrent", argin); } //+---------------------------------------------------------------------------- // // method : BiltCh::read_Voltage // // description : Extract real attribute values for Voltage acquisition result. // //----------------------------------------------------------------------------- void BiltCh::read_Voltage(Tango::Attribute &attr) { DEBUG_STREAM << "BiltCh::read_Voltage(Tango::Attribute &attr) entering... "<< endl; Tango::DeviceAttribute rattr; vector values; rattr = bilt_obj->read_attribute("Voltages"); rattr >> values; voltage = values[poleNumber]; attr.set_value (&voltage); } //+---------------------------------------------------------------------------- // // method : BiltCh::read_Impedance // // description : Extract real attribute values for Impedance acquisition result. // //----------------------------------------------------------------------------- void BiltCh::read_Impedance(Tango::Attribute &attr) { DEBUG_STREAM << "BiltCh::read_Impedance(Tango::Attribute &attr) entering... "<< endl; Tango::DeviceAttribute rattr; vector values; rattr = bilt_obj->read_attribute("Impedances"); rattr >> values; impedance = values[poleNumber]; attr.set_value (&impedance); } //+---------------------------------------------------------------------------- // // method : BiltCh::read_SetCurrentRMS // // description : Extract real attribute values for SetCurrentRMS acquisition result. // //----------------------------------------------------------------------------- void BiltCh::read_SetCurrentRMS(Tango::Attribute &attr) { DEBUG_STREAM << "BiltCh::read_SetCurrentRMS(Tango::Attribute &attr) entering... "<< endl; Tango::DeviceAttribute rattr; vector values; rattr = bilt_obj->read_attribute("SetCurrentsRMS"); rattr >> values; current_rms = values[poleNumber]; attr.set_value (¤t_rms); } //+---------------------------------------------------------------------------- // // method : BiltCh::read_SetCurrentAverage // // description : Extract real attribute values for SetCurrentAverage acquisition result. // //----------------------------------------------------------------------------- void BiltCh::read_SetCurrentAverage(Tango::Attribute &attr) { DEBUG_STREAM << "BiltCh::read_SetCurrentAverage(Tango::Attribute &attr) entering... "<< endl; Tango::DeviceAttribute rattr; vector values; rattr = bilt_obj->read_attribute("SetCurrentsAverage"); rattr >> values; current_average = values[poleNumber]; attr.set_value (¤t_average); } //+---------------------------------------------------------------------------- // // method : BiltCh::read_FramesPerSec // // description : Extract real attribute values for FramesPerSec acquisition result. // //----------------------------------------------------------------------------- void BiltCh::read_FramesPerSecond(Tango::Attribute &attr) { DEBUG_STREAM << "BiltCh::read_FramesPerSec(Tango::Attribute &attr) entering... "<< endl; Tango::DeviceAttribute rattr; vector values; rattr = bilt_obj->read_attribute("FramesPerSecond"); rattr >> values; frames_per_sec = values[poleNumber]; attr.set_value (&frames_per_sec); } //+---------------------------------------------------------------------------- // // method : BiltCh::read_ErrorPerSec // // description : Extract real attribute values for ErrorPerSec acquisition result. // //----------------------------------------------------------------------------- void BiltCh::read_ErrorPerSecond(Tango::Attribute &attr) { DEBUG_STREAM << "BiltCh::read_ErrorPerSec(Tango::Attribute &attr) entering... "<< endl; Tango::DeviceAttribute rattr; vector values; rattr = bilt_obj->read_attribute("ErrorsPerSecond"); rattr >> values; errors_per_sec = values[poleNumber]; attr.set_value (&errors_per_sec); } //+---------------------------------------------------------------------------- // // method : BiltCh::read_ErrorCounter // // description : Extract real attribute values for ErrorCounter acquisition result. // //----------------------------------------------------------------------------- void BiltCh::read_ErrorCounter(Tango::Attribute &attr) { DEBUG_STREAM << "BiltCh::read_ErrorCounter(Tango::Attribute &attr) entering... "<< endl; Tango::DeviceAttribute rattr; vector values; rattr = bilt_obj->read_attribute("ErrorCounters"); rattr >> values; error_counter = values[poleNumber]; attr.set_value (&error_counter); } //+---------------------------------------------------------------------------- // // method : BiltCh::read_LocalControl // // description : Extract real attribute values for LocalControl acquisition result. // //----------------------------------------------------------------------------- void BiltCh::read_LocalControl(Tango::Attribute &attr) { DEBUG_STREAM << "BiltCh::read_LocalControl(Tango::Attribute &attr) entering... "<< endl; Tango::DeviceAttribute rattr; vector values; rattr = bilt_obj->read_attribute("LocalControls"); rattr >> values; local_control = values[poleNumber]; attr.set_value (&local_control); } //+---------------------------------------------------------------------------- // // method : BiltCh::write_LocalControl // // description : Write LocalControl attribute values to hardware. // //----------------------------------------------------------------------------- void BiltCh::write_LocalControl(Tango::WAttribute &attr) { DEBUG_STREAM << "BiltCh::write_LocalControl(Tango::WAttribute &attr) entering... "<< endl; bool local_control; attr.get_write_value(local_control); Tango::DeviceData argin; vector cmd_in; cmd_in.push_back (poleNumber); if (local_control == true) cmd_in.push_back (1); else { cmd_in.push_back (0); // set back the AC current setpoint to 0! Tango::DeviceData ac_curr; vector ac_in; ac_in.push_back (poleNumber); ac_in.push_back (0); ac_curr << ac_in; bilt_obj->command_inout("SetPoleAcCurrent", ac_curr); current_ac = 0; } argin << cmd_in; bilt_obj->command_inout("LocalPoleControl", argin); } //+---------------------------------------------------------------------------- // // method : BiltCh::read_SetCurrentAC // // description : Extract real attribute values for SetCurrentAC acquisition result. // //----------------------------------------------------------------------------- void BiltCh::read_SetCurrentAC(Tango::Attribute &attr) { DEBUG_STREAM << "BiltCh::read_SetCurrentAC(Tango::Attribute &attr) entering... "<< endl; if ( local_control == false ) { attr.set_quality (Tango::ATTR_INVALID); } else { attr.set_value (¤t_ac); } } //+---------------------------------------------------------------------------- // // method : BiltCh::write_SetCurrentAC // // description : Write SetCurrentAC attribute values to hardware. // //----------------------------------------------------------------------------- void BiltCh::write_SetCurrentAC(Tango::WAttribute &attr) { DEBUG_STREAM << "BiltCh::write_SetCurrentAC(Tango::WAttribute &attr) entering... "<< endl; if ( local_control == false ) { TangoSys_MemStream tms; tms << "Can set AC current only when local control enabled!" << endl; Tango::Except::throw_exception("WriteError", tms.str(), "Bilt::write_SetCurrentAC"); } double set_current; attr.get_write_value(set_current); Tango::DeviceData argin; vector cmd_in; cmd_in.push_back (poleNumber); cmd_in.push_back (set_current); argin << cmd_in; bilt_obj->command_inout("SetPoleAcCurrent", argin); current_ac = set_current; } //+------------------------------------------------------------------ /** * method: BiltCh::dev_state * * description: method to execute "State" * This command gets the device state (stored in its device_state data member) and returns it to the caller. * * @return State Code * */ //+------------------------------------------------------------------ Tango::DevState BiltCh::dev_state() { Tango::DevState argout = DeviceImpl::dev_state(); DEBUG_STREAM << "BiltCh::dev_state(): entering... !" << endl; // Add your own code to control device here if ( bilt_init == true ) { Tango::DeviceAttribute rattr; Tango::DevState bilt_state; rattr = bilt_obj->read_attribute("State"); rattr >> bilt_state; set_state (bilt_state); } return get_state(); } //+------------------------------------------------------------------ /** * method: BiltCh::dev_status * * description: method to execute "Status" * This command gets the device status (stored in its device_status data member) and returns it to the caller. * * @return Status description * */ //+------------------------------------------------------------------ Tango::ConstDevString BiltCh::dev_status() { //Tango::ConstDevString argout = DeviceImpl::dev_status(); DEBUG_STREAM << "BiltCh::dev_status(): entering... !" << endl; // Add your own code to control device here string bilt_status; if ( bilt_init == true ) { Tango::DeviceAttribute rattr; rattr = bilt_obj->read_attribute("Status"); rattr >> bilt_status; set_status (bilt_status); } else { bilt_status = "Error during initialisation: \n"; for (short i = 0; i #include namespace Bilt_ns { AcquisitionThread::AcquisitionThread (Bilt *_bilt_ps, omni_mutex &d_m, omni_mutex &bilt_m) : Tango::LogAdapter(_bilt_ps), omni_thread(), data_mutex(d_m), bilt_mutex(bilt_m) { bilt_ps = _bilt_ps; last_update.tv_sec = 0; last_update.tv_usec = 0; updatePeriod = bilt_ps->updatePeriod; // cout << "AcquisitionThread::AcquisitionThread(): go to start thread ...\n"; start_undetached(); } //+------------------------------------------------------------------ /** * method: run_undetached() * * description: * */ //+------------------------------------------------------------------ void *AcquisitionThread::run_undetached(void*) { bool exit; INFO_STREAM << " AcquisitionThread::run_undetached() entering endless loop!" << endl; while (1) { { // copy to local variables omni_mutex_lock l(data_mutex); exit = bilt_ps->exit_thread; } /* exit the calculation thread */ if ( exit == true ) { break; } struct timeval now; gettimeofday (&now, NULL); double delay = (now.tv_sec * 1e6 + now.tv_usec) - (last_update.tv_sec * 1e6 + last_update.tv_usec); // only read new data every updatePeriod ms!! if ( delay < (updatePeriod * 1000) ) { // 20 ms struct timespec sleep_time = {0, SLEEP_NS}; nanosleep(&sleep_time, NULL); continue; } else { INFO_STREAM << "delay = " << delay/1000 << "ms" << endl; last_update = now; } // reset error variables mdata_errors.length(0); fdata_errors.length(0); // read_mdata() try { { // testing //mdata.state = -2; //mdata.idata[0].state = -2; //mdata.idata[1].state = -2; //mdata.idata[2].state = -2; //mdata.idata[0].meascurr = -2; //mdata.idata[1].meascurr = -2; //mdata.idata[2].meascurr = -2; omni_mutex_lock l(bilt_mutex); bilt_ps->BILT->get_mdata (&mdata); // testing //cout << "mag num = " << mdata.magnet << endl; //cout << "mag state = " << mdata.state << endl; //cout << "pole 0 = " << mdata.idata[0].state << " : " << mdata.idata[0].meascurr << endl; //cout << "pole 1 = " << mdata.idata[1].state << " : " << mdata.idata[1].meascurr << endl; //cout << "pole 2 = " << mdata.idata[2].state << " : " << mdata.idata[2].meascurr << endl<< endl; } mdata_errors.length(0); } catch (itest::ItestException &e) { create_tango_error (e, mdata_errors, "Read failure" , "Cannot read the mdata structure", "bilt_ps::read_mdata"); } // read_fdata() try { for (int i=0; iBILT->pole(i).get_fdata (&fdata[i]); } fdata_errors.length(0); } catch (itest::ItestException &e) { create_tango_error (e, fdata_errors, "Read failure" , "Cannot read the mdata structure", "bilt_ps::read_mdata"); } { struct timeval now; gettimeofday (&now, NULL); // copy the read data omni_mutex_lock l(data_mutex); bilt_ps->mdata_errors = mdata_errors; bilt_ps->fdata_errors = fdata_errors; bilt_ps->mdata.magnet = mdata.magnet; bilt_ps->mdata.state = mdata.state; for (int i=0; imdata.idata[i].magnet = mdata.idata[i].magnet; bilt_ps->mdata.idata[i].pole = mdata.idata[i].pole; bilt_ps->mdata.idata[i].state = mdata.idata[i].state; bilt_ps->mdata.idata[i].fail = mdata.idata[i].fail; bilt_ps->mdata.idata[i].measvolt = mdata.idata[i].measvolt; bilt_ps->mdata.idata[i].meascurr = mdata.idata[i].meascurr; bilt_ps->fdata[i].nbrframe_sec = fdata[i].nbrframe_sec; bilt_ps->fdata[i].nbrferr_sec = fdata[i].nbrferr_sec; bilt_ps->fdata[i].rms_ac_sett_sec = fdata[i].rms_ac_sett_sec; bilt_ps->fdata[i].average_sett_sec = fdata[i].average_sett_sec; bilt_ps->fdata[i].nbrferr = fdata[i].nbrferr; } // store time when data was read bilt_ps->data_read_time = now; } } return NULL; } //+------------------------------------------------------------------ /** * method: Bilt::create_tango_error() * * description: convert an itest exception into a tango error * * * in : - &e : Reference to itest exception * - errors : Tango error list to use, to store exception info * - reason : Reason of the local Tango exception to be added to the stack * - desc : Description for the local Tango exception to be added to the stack * - origin : Origin if the local Tango exception to be added to the stack */ //+------------------------------------------------------------------ void AcquisitionThread::create_tango_error (itest::ItestException &e, Tango::DevErrorList &errors, string reason, string desc, string origin) { DEBUG_STREAM << "Bilt::create_tango_exception(): entering... !" << endl; errors.length(e.errors.size() + 1); int i; for(i=0; i #include #include #include #include namespace Bilt_ns { //+---------------------------------------------------------------------------- // // method : Bilt::Bilt(string &s) // // description : constructor for simulated Bilt // // in : - cl : Pointer to the DeviceClass object // - s : Device name // //----------------------------------------------------------------------------- Bilt::Bilt(Tango::DeviceClass *cl,string &s) :Tango::Device_4Impl(cl,s.c_str()) { init_device(); } Bilt::Bilt(Tango::DeviceClass *cl,const char *s) :Tango::Device_4Impl(cl,s) { init_device(); } Bilt::Bilt(Tango::DeviceClass *cl,const char *s,const char *d) :Tango::Device_4Impl(cl,s,d) { init_device(); } //+---------------------------------------------------------------------------- // // method : Bilt::delete_device() // // description : will be called at device destruction or at init command. // //----------------------------------------------------------------------------- void Bilt::delete_device() { // Delete device allocated objects if ( acquisition_thread != NULL ) { data_mutex.lock(); exit_thread = true; data_mutex.unlock(); // join now the thread until it exits int *rv; acquisition_thread->join((void **)&rv); cout << "Bilt::delete_device(): Exit acquisition thread !!!" << endl; } // Delete connection to the power supply delete BILT; BILT = NULL; } //+---------------------------------------------------------------------------- // // method : Bilt::init_device() // // description : will be called at device initialization. // //----------------------------------------------------------------------------- void Bilt::init_device() { INFO_STREAM << "Bilt::Bilt() create device " << device_name << endl; // Initialise variables to default values //-------------------------------------------- get_device_property(); set_state (Tango::OFF); try { BILT = new itest::TMagnet (iPAddress.c_str(), magnetNumber); } catch (itest::ItestException &e) { try { create_tango_exception (e, mdata_errors, "Init failure" , "Cannot initialise ITEST libray objects", "Bilt::init_device"); } catch (Tango::DevFailed &e) { set_state (Tango::UNKNOWN); } } // initialise with the actual current set point values try { for (int i=0; ipole(i).get_current_DC(); } Tango::MultiAttribute *attr_list = get_device_attr(); Tango::WAttribute &attr_curr = attr_list->get_w_attr_by_name ("Currents"); attr_curr.set_write_value(¤ts_dc[0], currents_dc.size()); } catch (itest::ItestException &e) { try { create_tango_exception (e, mdata_errors, "Init failure" , "Cannot read the actual current set point values", "Bilt::init_device"); } catch (Tango::DevFailed &e) { set_state (Tango::UNKNOWN); } } // initialise and start the acquisition thread exit_thread = false; acquisition_thread = new AcquisitionThread(this, data_mutex, bilt_mutex); } //+---------------------------------------------------------------------------- // // method : Bilt::get_device_property() // // description : Read the device properties from database. // //----------------------------------------------------------------------------- void Bilt::get_device_property() { // Initialize your default values here (if not done with POGO). //------------------------------------------------------------------ BILT = NULL; acquisition_thread = NULL; struct timeval now; gettimeofday (&now, NULL); data_set_time = now; data_read_time = now; // intitialise mdada structure for magnet read values mdata.magnet = -1; mdata.state = -1; for (int i=0; i_UseDb==true) get_db_device()->get_property(dev_prop); Tango::DbDatum def_prop, cl_prop; BiltClass *ds_class = (static_cast(get_device_class())); int i = -1; // Try to initialize IPAddress from class property cl_prop = ds_class->get_class_property(dev_prop[++i].name); if (cl_prop.is_empty()==false) cl_prop >> iPAddress; else { // Try to initialize IPAddress from default device value def_prop = ds_class->get_default_device_property(dev_prop[i].name); if (def_prop.is_empty()==false) def_prop >> iPAddress; } // And try to extract IPAddress value from database if (dev_prop[i].is_empty()==false) dev_prop[i] >> iPAddress; // Try to initialize MagnetNumber from class property cl_prop = ds_class->get_class_property(dev_prop[++i].name); if (cl_prop.is_empty()==false) cl_prop >> magnetNumber; else { // Try to initialize MagnetNumber from default device value def_prop = ds_class->get_default_device_property(dev_prop[i].name); if (def_prop.is_empty()==false) def_prop >> magnetNumber; } // And try to extract MagnetNumber value from database if (dev_prop[i].is_empty()==false) dev_prop[i] >> magnetNumber; // Try to initialize UpdatePeriod from class property cl_prop = ds_class->get_class_property(dev_prop[++i].name); if (cl_prop.is_empty()==false) cl_prop >> updatePeriod; else { // Try to initialize UpdatePeriod from default device value def_prop = ds_class->get_default_device_property(dev_prop[i].name); if (def_prop.is_empty()==false) def_prop >> updatePeriod; } // And try to extract UpdatePeriod value from database if (dev_prop[i].is_empty()==false) dev_prop[i] >> updatePeriod; // End of Automatic code generation //------------------------------------------------------------------ } //+---------------------------------------------------------------------------- // // method : Bilt::always_executed_hook() // // description : method always executed before any command is executed // //----------------------------------------------------------------------------- void Bilt::always_executed_hook() { } //+---------------------------------------------------------------------------- // // method : Bilt::read_attr_hardware // // description : Hardware acquisition for attributes. // //----------------------------------------------------------------------------- void Bilt::read_attr_hardware(vector &attr_list) { DEBUG_STREAM << "Bilt::read_attr_hardware(vector &attr_list) entering... "<< endl; // Add your own code here } //+---------------------------------------------------------------------------- // // method : Bilt::read_FramesPerSecond // // description : Extract real attribute values for FramesPerSecond acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_FramesPerSecond(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_FramesPerSecond(Tango::Attribute &attr) entering... "<< endl; omni_mutex_lock l(data_mutex); if ( fdata_errors.length() != 0 ) attr.set_quality(Tango::ATTR_INVALID); else { for (int i=0; ipole(i).get_switch(); } if ( switch_state == 1 ) local_control[i] = false; else local_control[i] = true; } } catch (itest::ItestException &e) { create_tango_exception (e, "Read failure" , "Cannot read the actual switch states", "Bilt::read_LocalControls"); } attr.set_value (&(local_control[0]), POLES); } //+---------------------------------------------------------------------------- // // method : Bilt::read_SetCurrentsRMS // // description : Extract real attribute values for SetCurrentsRMS acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_SetCurrentsRMS(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_SetCurrentsRMS(Tango::Attribute &attr) entering... "<< endl; omni_mutex_lock l(data_mutex); if ( fdata_errors.length() != 0 ) attr.set_quality(Tango::ATTR_INVALID); else { for (int i=0; i CURRENT_LIMIT ) impedances[i] = fabs (mdata.idata[i].measvolt / mdata.idata[i].meascurr); else impedances[i] = nan(""); } attr.set_value (&(impedances[0]), POLES); } } //+---------------------------------------------------------------------------- // // method : Bilt::write_Currents // // description : Write Currents attribute values to hardware. // //----------------------------------------------------------------------------- void Bilt::write_Currents(Tango::WAttribute &attr) { DEBUG_STREAM << "Bilt::write_Currents(Tango::WAttribute &attr) entering... "<< endl; const double *set_currents; // check the correct number of setpoints if ( attr.get_write_value_length() == POLES ) attr.get_write_value(set_currents); else { TangoSys_MemStream tms; tms << "Wrong number of setpoints!" << endl; Tango::Except::throw_exception("WriteError", tms.str(), "Bilt::write_Currents"); } // apply setpoints to the poles try { for (int i=0; ipole(i).set_current_DC (set_currents[i]); } } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot write DC current values", "Bilt::write_Currents"); } // initialise the set time, to be sure that the next // returned read value is newer and contains the changes. struct timeval now; gettimeofday (&now, NULL); data_set_time = now; } //+---------------------------------------------------------------------------- // // method : Bilt::read_Currents // // description : Extract real attribute values for Currents acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_Currents(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_Currents(Tango::Attribute &attr) entering... "<< endl; // wait for the next data acquisition afer a current setpoint change double delay; { omni_mutex_lock l(data_mutex); delay = (data_set_time.tv_sec * 1e6 + data_set_time.tv_usec) - (data_read_time.tv_sec * 1e6 + data_read_time.tv_usec); //cout << "delay = " << delay << endl; } while ( delay > 0 ) { // 20 ms struct timespec sleep_time = {0, SLEEP_NS}; nanosleep(&sleep_time, NULL); omni_mutex_lock l(data_mutex); delay = (data_set_time.tv_sec * 1e6 + data_set_time.tv_usec) - (data_read_time.tv_sec * 1e6 + data_read_time.tv_usec); INFO_STREAM << "read waiting delay = " << delay << endl; } omni_mutex_lock l(data_mutex); if ( mdata_errors.length() != 0 ) attr.set_quality(Tango::ATTR_INVALID); else { for (int i=0; iset_state(1); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot switch on pole", "Bilt::on"); } } //+------------------------------------------------------------------ /** * method: Bilt::off * * description: method to execute "Off" * Turns of power supply * * */ //+------------------------------------------------------------------ void Bilt::off() { DEBUG_STREAM << "Bilt::off(): entering... !" << endl; // Add your own code to control device here try { omni_mutex_lock l(bilt_mutex); BILT->set_state(0); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot switch off pole", "Bilt::off"); } } //+------------------------------------------------------------------ /** * method: Bilt::reset * * description: method to execute "Reset" * Reset faults and alarms * * */ //+------------------------------------------------------------------ void Bilt::reset() { DEBUG_STREAM << "Bilt::reset(): entering... !" << endl; // Add your own code to control device here try { omni_mutex_lock l(bilt_mutex); BILT->clear_all_err(); BILT->clear_alarm(); for (int i=0; ipole(i).clear_ferrors(); } } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot reset pole", "Bilt::reset"); } } //+------------------------------------------------------------------ /** * method: Bilt::set_pole_ac_current * * description: method to execute "SetPoleAcCurrent" * Set the AC current for one Pole. * [0] = pole number, [1] = current * * @param argin * */ //+------------------------------------------------------------------ void Bilt::set_pole_ac_current(const Tango::DevVarDoubleArray *argin) { DEBUG_STREAM << "Bilt::set_pole_ac_current(): entering... !" << endl; // Add your own code to control device here // argin[0] = pole number if ( (*argin)[0] < 0 || (*argin)[0] >= POLES ) { TangoSys_MemStream tms; tms << "The entered Pole number is out of range" << endl; Tango::Except::throw_exception("WriteError", tms.str(), "Bilt::set_pole_ac_current"); } try { omni_mutex_lock l(bilt_mutex); BILT->pole((int)(*argin)[0]).set_current_AC ((*argin)[1]); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot write AC current value", "Bilt::set_pole_ac_current"); } } //+------------------------------------------------------------------ /** * method: Bilt::local_pole_control * * description: method to execute "LocalPoleControl" * Set the AC current for one Pole. * [0] = pole number, [1] = local control true/false * * @param argin * */ //+------------------------------------------------------------------ void Bilt::local_pole_control(const Tango::DevVarShortArray *argin) { DEBUG_STREAM << "Bilt::local_pole_control(): entering... !" << endl; // Add your own code to control device here // argin[0] = pole number if ( (*argin)[0] < 0 || (*argin)[0] >= POLES ) { TangoSys_MemStream tms; tms << "The entered Pole number is out of range" << endl; Tango::Except::throw_exception("WriteError", tms.str(), "Bilt::local_pole_control"); } // argin[1] = true or false (1 or 0 ) if ( (*argin)[1] != 0 && (*argin)[1] != 1 ) { TangoSys_MemStream tms; tms << "Local control can only be choosen as 0 or 1 (false or true)" << endl; Tango::Except::throw_exception("WriteError", tms.str(), "Bilt::local_pole_control"); } try { int switch_state; if ( (*argin)[1] == true ) switch_state = 0; else switch_state = 1; omni_mutex_lock l(bilt_mutex); BILT->pole((*argin)[0]).set_switch (switch_state); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot write switch state", "Bilt::local_pole_control"); } } //+------------------------------------------------------------------ /** * method: Bilt::set_pole_current * * description: method to execute "SetPoleCurrent" * Set the current for one Pole. * [0] = pole number, [1] = current * * @param argin * */ //+------------------------------------------------------------------ void Bilt::set_pole_current(const Tango::DevVarDoubleArray *argin) { DEBUG_STREAM << "Bilt::set_pole_current(): entering... !" << endl; // Add your own code to control device here // argin[0] = pole number if ( (*argin)[0] < 0 || (*argin)[0] >= POLES ) { TangoSys_MemStream tms; tms << "The entered Pole number is out of range" << endl; Tango::Except::throw_exception("WriteError", tms.str(), "Bilt::set_pole_current"); } try { omni_mutex_lock l(bilt_mutex); BILT->pole((int)(*argin)[0]).set_current_DC ((*argin)[1]); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot write current value", "Bilt::set_pole_current"); } // make sure that the current set values are correct! try { omni_mutex_lock l(bilt_mutex); for (int i=0; ipole(i).get_current_DC(); } Tango::MultiAttribute *attr_list = get_device_attr(); Tango::WAttribute &attr_curr = attr_list->get_w_attr_by_name ("Currents"); attr_curr.set_write_value(¤ts_dc[0], currents_dc.size()); } catch (itest::ItestException &e) { create_tango_exception (e, "Read failure" , "Cannot read the actual current set point values", "Bilt::set_pole_current"); } } //+------------------------------------------------------------------ /** * method: Bilt::create_tango_exception() * * description: convert an itest exception into a tango exception * * * in : - &e : Reference to itest exception * - reason : Reason of the local Tango exception to be added to the stack * - desc : Description for the local Tango exception to be added to the stack * - origin : Origin if the local Tango exception to be added to the stack */ //+------------------------------------------------------------------ void Bilt::create_tango_exception (itest::ItestException &e, string reason, string desc, string origin) { Tango::DevErrorList errors; create_tango_exception (e, errors, reason, desc, origin); } //+------------------------------------------------------------------ /** * method: Bilt::create_tango_exception() * * description: convert an itest exception into a tango exception * * * in : - &e : Reference to itest exception * - errors : Tango error list to use, to store exception info * - reason : Reason of the local Tango exception to be added to the stack * - desc : Description for the local Tango exception to be added to the stack * - origin : Origin if the local Tango exception to be added to the stack */ //+------------------------------------------------------------------ void Bilt::create_tango_exception (itest::ItestException &e, Tango::DevErrorList &errors, string reason, string desc, string origin) { DEBUG_STREAM << "Bilt::create_tango_exception(): entering... !" << endl; errors.length(e.errors.size() + 1); int i; for(i=0; idevice_status data member) and returns it to the caller. * * @return Status description * */ //+------------------------------------------------------------------ Tango::ConstDevString Bilt::dev_status() { //Tango::ConstDevString argout = DeviceImpl::dev_status(); DEBUG_STREAM << "Bilt::dev_status(): entering... !" << endl; // Add your own code to control device here stringstream status; Tango::DevState state = dev_state(); switch (state) { case Tango::ON: status << "State : ON" << endl; break; case Tango::OFF: status << "State : OFF" << endl; break; case Tango::ALARM: { status << "State : Alarm" << endl; omni_mutex_lock l(data_mutex); for (int i=0; i 10W in 10ms!" << endl; else { if ( mdata.idata[i].fail == "TEMP" ) status << "Fault descr. : Max. temp on semiconductor reached!" << endl; else { if ( mdata.idata[i].fail == "PWSO" ) status << "Fault descr. : Delivered power > 40W in 100ms!" << endl; else { status << "Fault descr. : Unkown fault code!" << endl; } } } } } } } break; } default: { status << "Pole state : Unknown" << endl; status << "Error stack : " << endl; omni_mutex_lock l(data_mutex); for(int i=0; idevice_state data member) and returns it to the caller. * * @return State Code * */ //+------------------------------------------------------------------ Tango::DevState Bilt::dev_state() { Tango::DevState argout = DeviceImpl::dev_state(); DEBUG_STREAM << "Bilt::dev_state(): entering... !" << endl; // Add your own code to control device here int state; omni_mutex_lock l(data_mutex); try { //read_mdata(); state = mdata.state; INFO_STREAM << "magnet state for " << get_name() << " = " << state << endl; } catch (Tango::DevFailed &e) { // do nothing! // Just avoid exceptions when executing state or status! } if ( mdata_errors.length() != 0 ) set_state (Tango::UNKNOWN); else { // set the device state switch (state) { case 0: set_state (Tango::OFF); break; case 1: set_state (Tango::ON); break; case 2: set_state (Tango::ALARM); break; case 3: set_state (Tango::FAULT); break; default: set_state (Tango::UNKNOWN); break; } } // Check for attribute alarms if ( get_state() == Tango::ON && argout == Tango::ALARM ) set_state (Tango::ALARM); return get_state(); } //+------------------------------------------------------------------ /** * method: Bilt::setpoint_check * * description: method to execute "SetpointCheck" * Check the given current values against the specified limits. * * @param argin Setpoint values for the Poles * @return true when settings are OK * */ //+------------------------------------------------------------------ Tango::DevBoolean Bilt::setpoint_check(const Tango::DevVarDoubleArray *argin) { Tango::DevBoolean argout ; DEBUG_STREAM << "Bilt::setpoint_check(): entering... !" << endl; // Add your own code to control device here return argout; } } // namespace Node-path: powersupply/itest/Bilt/trunk/Bilt.h Node-kind: file Node-action: change Text-content-length: 11536 Text-content-md5: 1d0efacf5bad0fedaa8be87c88add964 Content-length: 11536 //============================================================================= // // file : Bilt.h // // description : Include for the Bilt class. // // project : BILT multi channel power supply // // $Author: meyer $ // // $Revision: 1.7 $ // $Date: 2010-02-12 16:35:13 $ // // SVN only: // $HeadURL: $ // // CVS only: // $Source: /segfs/tango/cvsroot/cppserver/machine/powersupply/SrSteerers/tango/Bilt/Bilt.h,v $ // $Log: not supported by cvs2svn $ // Revision 1.6 2010-02-11 16:35:27 meyer // Currents settings understand NaN values. // Deleted StePoleCurrent command. // // Revision 1.5 2010/02/10 12:27:31 meyer // Restructured Bilt class. // Acquistion is now done by a thread and only the multi channel data // gets exported. A single channel class (BiltCh) was created. // // Revision 1.4 2009/11/27 13:49:26 meyer // Modified structure! The pole is no longer a device. // The device is now a magnet with three poles. // // Revision 1.3 2009/11/26 10:46:58 meyer // Updated for libMagnet_V120 // // Revision 1.2 2009/11/06 12:46:25 meyer // Added impedance attribute and corrected fromatting of attribute values. // // Revision 1.1.1.1 2009/11/04 16:23:02 meyer // Imported using TkCVS // // // copyleft : European Synchrotron Radiation Facility // BP 220, Grenoble 38043 // FRANCE // //============================================================================= // // This file is generated by POGO // (Program Obviously used to Generate tango Object) // // (c) - Software Engineering Group - ESRF //============================================================================= #ifndef _BILT_H #define _BILT_H #include #include #include //using namespace Tango; /** * @author $Author: meyer $ * @version $Revision: 1.7 $ */ // Add your own constant definitions here. //----------------------------------------------- // Number of poles per magnet #define POLES 3 // Current limit for a valid impedeance calculation #define CURRENT_LIMIT 0.005 // define sleep times #define SLEEP_NS 20000000 // 20 ms namespace Bilt_ns { /** * Class Description: * The BILT multi channel power supply will be used with 3 channels for the ESRF fast * feedback systems. * The power supply can be controlled in 2 ways : * By this device server for slow or human control or * by the Libera Beam Position monitors for fast feedback with closed loop control. * The devices are exported as one device per steerer magnet. Every device has three * channels. The channels (poles) cannot be switched on individually but have their * individual set points and measurement values. */ /* * Device States Description: * Tango::ON : Magnet is ON, all three channels are ON. * Tango::OFF : Magnet is OFF, all three channels are OFF. * Tango::FAULT : Error detected by the BILT magnet. * Tango::ALARM : Alarm detected on one or more channels. * Tango::UNKNOWN : Communication fault */ class Bilt: public Tango::Device_4Impl { public : // Add your own data members here //----------------------------------------- // Here is the Start of the automatic code generation part //------------------------------------------------------------- /** * @name attributes * Attribute member data. */ //@{ Tango::DevDouble *attr_Currents_read; Tango::DevDouble attr_Currents_write; Tango::DevDouble *attr_Voltages_read; Tango::DevDouble *attr_Impedances_read; Tango::DevDouble *attr_SetCurrentsRMS_read; Tango::DevDouble *attr_SetCurrentsAverage_read; Tango::DevULong *attr_FramesPerSecond_read; Tango::DevULong *attr_ErrorsPerSecond_read; Tango::DevULong *attr_ErrorCounters_read; Tango::DevBoolean *attr_LocalControls_read; //@} /** * @name Device properties * Device properties member data. */ //@{ /** * IP Address of BILT controller. * Each controller includes several magnets and * each magnet includes 3 power supplies, * for corrections in the X, Y and Z planes. * * */ string iPAddress; /** * Magnet number from 1 to 48 */ Tango::DevShort magnetNumber; /** * The update period for the data reading from the power supply in milli seconds. */ Tango::DevLong updatePeriod; //@} /** * @name Device properties * Device property member data. */ //@{ //@} /**@name Constructors * Miscellaneous constructors */ //@{ /** * Constructs a newly allocated Command object. * * @param cl Class. * @param s Device Name */ Bilt(Tango::DeviceClass *cl,string &s); /** * Constructs a newly allocated Command object. * * @param cl Class. * @param s Device Name */ Bilt(Tango::DeviceClass *cl,const char *s); /** * Constructs a newly allocated Command object. * * @param cl Class. * @param s Device name * @param d Device description. */ Bilt(Tango::DeviceClass *cl,const char *s,const char *d); //@} /**@name Destructor * Only one destructor is defined for this class */ //@{ /** * The object destructor. */ ~Bilt() {delete_device();}; /** * will be called at device destruction or at init command. */ void delete_device(); //@} /**@name Miscellaneous methods */ //@{ /** * Initialize the device */ virtual void init_device(); /** * Always executed method before execution command method. */ virtual void always_executed_hook(); //@} /** * @name Bilt methods prototypes */ //@{ /** * Hardware acquisition for attributes. */ virtual void read_attr_hardware(vector &attr_list); /** * Extract real attribute values for Currents acquisition result. */ virtual void read_Currents(Tango::Attribute &attr); /** * Write Currents attribute values to hardware. */ virtual void write_Currents(Tango::WAttribute &attr); /** * Extract real attribute values for Voltages acquisition result. */ virtual void read_Voltages(Tango::Attribute &attr); /** * Extract real attribute values for Impedances acquisition result. */ virtual void read_Impedances(Tango::Attribute &attr); /** * Extract real attribute values for SetCurrentsRMS acquisition result. */ virtual void read_SetCurrentsRMS(Tango::Attribute &attr); /** * Extract real attribute values for SetCurrentsAverage acquisition result. */ virtual void read_SetCurrentsAverage(Tango::Attribute &attr); /** * Extract real attribute values for FramesPerSecond acquisition result. */ virtual void read_FramesPerSecond(Tango::Attribute &attr); /** * Extract real attribute values for ErrorsPerSecond acquisition result. */ virtual void read_ErrorsPerSecond(Tango::Attribute &attr); /** * Extract real attribute values for ErrorCounters acquisition result. */ virtual void read_ErrorCounters(Tango::Attribute &attr); /** * Extract real attribute values for LocalControls acquisition result. */ virtual void read_LocalControls(Tango::Attribute &attr); /** * Read/Write allowed for Currents attribute. */ virtual bool is_Currents_allowed(Tango::AttReqType type); /** * Read/Write allowed for Voltages attribute. */ virtual bool is_Voltages_allowed(Tango::AttReqType type); /** * Read/Write allowed for Impedances attribute. */ virtual bool is_Impedances_allowed(Tango::AttReqType type); /** * Read/Write allowed for SetCurrentsRMS attribute. */ virtual bool is_SetCurrentsRMS_allowed(Tango::AttReqType type); /** * Read/Write allowed for SetCurrentsAverage attribute. */ virtual bool is_SetCurrentsAverage_allowed(Tango::AttReqType type); /** * Read/Write allowed for FramesPerSecond attribute. */ virtual bool is_FramesPerSecond_allowed(Tango::AttReqType type); /** * Read/Write allowed for ErrorsPerSecond attribute. */ virtual bool is_ErrorsPerSecond_allowed(Tango::AttReqType type); /** * Read/Write allowed for ErrorCounters attribute. */ virtual bool is_ErrorCounters_allowed(Tango::AttReqType type); /** * Read/Write allowed for LocalControls attribute. */ virtual bool is_LocalControls_allowed(Tango::AttReqType type); /** * Execution allowed for On command. */ virtual bool is_On_allowed(const CORBA::Any &any); /** * Execution allowed for Off command. */ virtual bool is_Off_allowed(const CORBA::Any &any); /** * Execution allowed for Reset command. */ virtual bool is_Reset_allowed(const CORBA::Any &any); /** * Execution allowed for SetPoleAcCurrent command. */ virtual bool is_SetPoleAcCurrent_allowed(const CORBA::Any &any); /** * Execution allowed for LocalPoleControl command. */ virtual bool is_LocalPoleControl_allowed(const CORBA::Any &any); /** * Execution allowed for SetpointCheck command. */ virtual bool is_SetpointCheck_allowed(const CORBA::Any &any); /** * Execution allowed for SetPoleCurrent command. */ virtual bool is_SetPoleCurrent_allowed(const CORBA::Any &any); /** * This command gets the device state (stored in its device_state data member) and returns it to the caller. * @return State Code * @exception DevFailed */ virtual Tango::DevState dev_state(); /** * This command gets the device status (stored in its device_status data member) and returns it to the caller. * @return Status description * @exception DevFailed */ virtual Tango::ConstDevString dev_status(); /** * Turns on power supply. * @exception DevFailed */ void on(); /** * Turns of power supply * @exception DevFailed */ void off(); /** * Reset faults and alarms * @exception DevFailed */ void reset(); /** * Set the AC current for one Pole. * [0] = pole number, [1] = current * @param argin * @exception DevFailed */ void set_pole_ac_current(const Tango::DevVarDoubleArray *); /** * Set the AC current for one Pole. * [0] = pole number, [1] = local control true/false * @param argin * @exception DevFailed */ void local_pole_control(const Tango::DevVarShortArray *); /** * Check the given current values against the specified limits. * @param argin Setpoint values for the Poles * @return true when settings are OK * @exception DevFailed */ Tango::DevBoolean setpoint_check(const Tango::DevVarDoubleArray *); /** * Set the current for one Pole. * [0] = pole number, [1] = current * @param argin * @exception DevFailed */ void set_pole_current(const Tango::DevVarDoubleArray *); /** * Read the device properties from database */ void get_device_property(); //@} // Here is the end of the automatic code generation part //------------------------------------------------------------- protected : // Add your own data members here //----------------------------------------- friend class AcquisitionThread; AcquisitionThread *acquisition_thread; omni_mutex data_mutex; omni_mutex bilt_mutex; short exit_thread; struct timeval data_set_time; struct timeval data_read_time; void create_tango_exception (itest::ItestException &e, string reason, string desc, string origin); void create_tango_exception (itest::ItestException &e, Tango::DevErrorList &errors, string reason, string desc, string origin); itest::TMagnet *BILT; struct itest::mdata mdata; struct itest::fdata fdata[POLES]; Tango::DevErrorList mdata_errors; Tango::DevErrorList fdata_errors; vector currents_dc; vector currents_ac; vector voltages; vector impedances; vector currents_rms; vector currents_average; vector frames_per_sec; vector errors_per_sec; vector error_counters; bool local_control[3]; }; } // namespace_ns #endif // _BILT_H Node-path: powersupply/itest/Bilt/trunk/BiltClass.cpp Node-kind: file Node-action: change Text-content-length: 26074 Text-content-md5: ac8a064d84072aa7e02584e8ad543b36 Content-length: 26074 static const char *ClassId = "$Id: BiltClass.cpp,v 1.10 2010-02-12 16:35:13 meyer Exp $"; static const char *TagName = "$Name: not supported by cvs2svn $"; static const char *CvsPath = "$Source: /segfs/tango/cvsroot/cppserver/machine/powersupply/SrSteerers/tango/Bilt/BiltClass.cpp,v $"; static const char *SvnPath = "$HeadURL: $"; static const char *HttpServer = "http://www.esrf.fr/computing/cs/tango/tango_doc/ds_doc/"; //+============================================================================= // // file : BiltClass.cpp // // description : C++ source for the BiltClass. A singleton // class derived from DeviceClass. It implements the // command list and all properties and methods required // by the Bilt once per process. // // project : TANGO Device Server // // $Author: meyer $ // // $Revision: 1.10 $ // // $Log: not supported by cvs2svn $ // Revision 1.9 2010-02-11 16:35:27 meyer // Currents settings understand NaN values. // Deleted StePoleCurrent command. // // Revision 1.8 2010/02/10 16:22:15 meyer // Release_3_0 // // Revision 1.7 2010/02/10 12:27:31 meyer // Restructured Bilt class. // Acquistion is now done by a thread and only the multi channel data // gets exported. A single channel class (BiltCh) was created. // // Revision 1.6 2009/12/18 12:02:18 meyer // Changed version number to 2.1 // // Revision 1.5 2009/11/27 13:49:26 meyer // Modified structure! The pole is no longer a device. // The device is now a magnet with three poles. // // Revision 1.4 2009/11/26 10:46:58 meyer // Updated for libMagnet_V120 // // Revision 1.3 2009/11/23 16:46:58 meyer // Corrected state, status and exception handling // // Revision 1.2 2009/11/06 12:46:25 meyer // Added impedance attribute and corrected fromatting of attribute values. // // Revision 1.1.1.1 2009/11/04 16:23:02 meyer // Imported using TkCVS // // // copyleft : European Synchrotron Radiation Facility // BP 220, Grenoble 38043 // FRANCE // //-============================================================================= // // This file is generated by POGO // (Program Obviously used to Generate tango Object) // // (c) - Software Engineering Group - ESRF //============================================================================= #include #include #include //+---------------------------------------------------------------------------- /** * Create BiltClass singleton and return it in a C function for Python usage */ //+---------------------------------------------------------------------------- extern "C" { #ifdef WIN32 __declspec(dllexport) #endif Tango::DeviceClass *_create_Bilt_class(const char *name) { return Bilt_ns::BiltClass::init(name); } } namespace Bilt_ns { //+---------------------------------------------------------------------------- // // method : SetPoleCurrentCmd::execute() // // description : method to trigger the execution of the command. // PLEASE DO NOT MODIFY this method core without pogo // // in : - device : The device on which the command must be executed // - in_any : The command input data // // returns : The command output data (packed in the Any object) // //----------------------------------------------------------------------------- CORBA::Any *SetPoleCurrentCmd::execute(Tango::DeviceImpl *device,const CORBA::Any &in_any) { cout2 << "SetPoleCurrentCmd::execute(): arrived" << endl; const Tango::DevVarDoubleArray *argin; extract(in_any, argin); ((static_cast(device))->set_pole_current(argin)); return new CORBA::Any(); } //+---------------------------------------------------------------------------- // // method : SetpointCheckCmd::execute() // // description : method to trigger the execution of the command. // PLEASE DO NOT MODIFY this method core without pogo // // in : - device : The device on which the command must be executed // - in_any : The command input data // // returns : The command output data (packed in the Any object) // //----------------------------------------------------------------------------- CORBA::Any *SetpointCheckCmd::execute(Tango::DeviceImpl *device,const CORBA::Any &in_any) { cout2 << "SetpointCheckCmd::execute(): arrived" << endl; const Tango::DevVarDoubleArray *argin; extract(in_any, argin); return insert((static_cast(device))->setpoint_check(argin)); } //+---------------------------------------------------------------------------- // // method : LocalPoleControlCmd::execute() // // description : method to trigger the execution of the command. // PLEASE DO NOT MODIFY this method core without pogo // // in : - device : The device on which the command must be executed // - in_any : The command input data // // returns : The command output data (packed in the Any object) // //----------------------------------------------------------------------------- CORBA::Any *LocalPoleControlCmd::execute(Tango::DeviceImpl *device,const CORBA::Any &in_any) { cout2 << "LocalPoleControlCmd::execute(): arrived" << endl; const Tango::DevVarShortArray *argin; extract(in_any, argin); ((static_cast(device))->local_pole_control(argin)); return new CORBA::Any(); } //+---------------------------------------------------------------------------- // // method : SetPoleAcCurrentCmd::execute() // // description : method to trigger the execution of the command. // PLEASE DO NOT MODIFY this method core without pogo // // in : - device : The device on which the command must be executed // - in_any : The command input data // // returns : The command output data (packed in the Any object) // //----------------------------------------------------------------------------- CORBA::Any *SetPoleAcCurrentCmd::execute(Tango::DeviceImpl *device,const CORBA::Any &in_any) { cout2 << "SetPoleAcCurrentCmd::execute(): arrived" << endl; const Tango::DevVarDoubleArray *argin; extract(in_any, argin); ((static_cast(device))->set_pole_ac_current(argin)); return new CORBA::Any(); } //+---------------------------------------------------------------------------- // // method : OnCmd::execute() // // description : method to trigger the execution of the command. // PLEASE DO NOT MODIFY this method core without pogo // // in : - device : The device on which the command must be executed // - in_any : The command input data // // returns : The command output data (packed in the Any object) // //----------------------------------------------------------------------------- CORBA::Any *OnCmd::execute(Tango::DeviceImpl *device,const CORBA::Any &in_any) { cout2 << "OnCmd::execute(): arrived" << endl; ((static_cast(device))->on()); return new CORBA::Any(); } //+---------------------------------------------------------------------------- // // method : OffCmd::execute() // // description : method to trigger the execution of the command. // PLEASE DO NOT MODIFY this method core without pogo // // in : - device : The device on which the command must be executed // - in_any : The command input data // // returns : The command output data (packed in the Any object) // //----------------------------------------------------------------------------- CORBA::Any *OffCmd::execute(Tango::DeviceImpl *device,const CORBA::Any &in_any) { cout2 << "OffCmd::execute(): arrived" << endl; ((static_cast(device))->off()); return new CORBA::Any(); } //+---------------------------------------------------------------------------- // // method : ResetCmd::execute() // // description : method to trigger the execution of the command. // PLEASE DO NOT MODIFY this method core without pogo // // in : - device : The device on which the command must be executed // - in_any : The command input data // // returns : The command output data (packed in the Any object) // //----------------------------------------------------------------------------- CORBA::Any *ResetCmd::execute(Tango::DeviceImpl *device,const CORBA::Any &in_any) { cout2 << "ResetCmd::execute(): arrived" << endl; ((static_cast(device))->reset()); return new CORBA::Any(); } // //---------------------------------------------------------------- // Initialize pointer for singleton pattern //---------------------------------------------------------------- // BiltClass *BiltClass::_instance = NULL; //+---------------------------------------------------------------------------- // // method : BiltClass::BiltClass(string &s) // // description : constructor for the BiltClass // // in : - s : The class name // //----------------------------------------------------------------------------- BiltClass::BiltClass(string &s):DeviceClass(s) { cout2 << "Entering BiltClass constructor" << endl; set_default_property(); get_class_property(); write_class_property(); cout2 << "Leaving BiltClass constructor" << endl; } //+---------------------------------------------------------------------------- // // method : BiltClass::~BiltClass() // // description : destructor for the BiltClass // //----------------------------------------------------------------------------- BiltClass::~BiltClass() { _instance = NULL; } //+---------------------------------------------------------------------------- // // method : BiltClass::instance // // description : Create the object if not already done. Otherwise, just // return a pointer to the object // // in : - name : The class name // //----------------------------------------------------------------------------- BiltClass *BiltClass::init(const char *name) { if (_instance == NULL) { try { string s(name); _instance = new BiltClass(s); } catch (bad_alloc) { throw; } } return _instance; } BiltClass *BiltClass::instance() { if (_instance == NULL) { cerr << "Class is not initialised !!" << endl; exit(-1); } return _instance; } //+---------------------------------------------------------------------------- // // method : BiltClass::command_factory // // description : Create the command object(s) and store them in the // command list // //----------------------------------------------------------------------------- void BiltClass::command_factory() { command_list.push_back(new OnCmd("On", Tango::DEV_VOID, Tango::DEV_VOID, "", "", Tango::OPERATOR)); command_list.push_back(new OffCmd("Off", Tango::DEV_VOID, Tango::DEV_VOID, "", "", Tango::OPERATOR)); command_list.push_back(new ResetCmd("Reset", Tango::DEV_VOID, Tango::DEV_VOID, "", "", Tango::OPERATOR)); command_list.push_back(new SetPoleAcCurrentCmd("SetPoleAcCurrent", Tango::DEVVAR_DOUBLEARRAY, Tango::DEV_VOID, "", "", Tango::OPERATOR)); command_list.push_back(new LocalPoleControlCmd("LocalPoleControl", Tango::DEVVAR_SHORTARRAY, Tango::DEV_VOID, "", "", Tango::OPERATOR)); command_list.push_back(new SetpointCheckCmd("SetpointCheck", Tango::DEVVAR_DOUBLEARRAY, Tango::DEV_BOOLEAN, "Setpoint values for the Poles", "true when settings are OK", Tango::OPERATOR)); command_list.push_back(new SetPoleCurrentCmd("SetPoleCurrent", Tango::DEVVAR_DOUBLEARRAY, Tango::DEV_VOID, "", "", Tango::OPERATOR)); // add polling if any for (unsigned int i=0 ; ilength() ; i++) { cout4 << "Device name : " << (*devlist_ptr)[i].in() << endl; // Create devices and add it into the device list //---------------------------------------------------- device_list.push_back(new Bilt(this, (*devlist_ptr)[i])); // Export device to the outside world // Check before if database used. //--------------------------------------------- if ((Tango::Util::_UseDb == true) && (Tango::Util::_FileDb == false)) export_device(device_list.back()); else export_device(device_list.back(), (*devlist_ptr)[i]); } // End of Automatic code generation //------------------------------------------------------------- } //+---------------------------------------------------------------------------- // Method: BiltClass::attribute_factory(vector &att_list) //----------------------------------------------------------------------------- void BiltClass::attribute_factory(vector &att_list) { // Attribute : Currents CurrentsAttrib *currents = new CurrentsAttrib(); Tango::UserDefaultAttrProp currents_prop; currents_prop.set_label("Currents"); currents_prop.set_unit("A"); currents_prop.set_format("%6.4f"); currents_prop.set_max_value("1.8"); currents_prop.set_min_value("-1.8"); currents_prop.set_description("The measured currents of the three poles."); currents->set_default_properties(currents_prop); att_list.push_back(currents); // Attribute : Voltages VoltagesAttrib *voltages = new VoltagesAttrib(); Tango::UserDefaultAttrProp voltages_prop; voltages_prop.set_label("Voltages"); voltages_prop.set_unit("V"); voltages_prop.set_format("%6.4"); voltages_prop.set_description("The measured voltages of the three poles."); voltages->set_default_properties(voltages_prop); att_list.push_back(voltages); // Attribute : Impedances ImpedancesAttrib *impedances = new ImpedancesAttrib(); Tango::UserDefaultAttrProp impedances_prop; impedances_prop.set_label("Impedances"); impedances_prop.set_unit("Ohm"); impedances_prop.set_format("%4.2f"); impedances_prop.set_max_alarm("5.0"); impedances_prop.set_description("Calculated impedances for the three poles."); impedances->set_default_properties(impedances_prop); att_list.push_back(impedances); // Attribute : SetCurrentsRMS SetCurrentsRMSAttrib *set_currents_rms = new SetCurrentsRMSAttrib(); Tango::UserDefaultAttrProp set_currents_rms_prop; set_currents_rms_prop.set_label("RMS AC current setpoints/s"); set_currents_rms_prop.set_unit("A"); set_currents_rms_prop.set_format("%6.4"); set_currents_rms_prop.set_description("Statistic when driven by the Libera. One RMS value for every pole\nof the magnet.\nRMS value of the AC setpoint applied on the DAC during the last second.\nX=sqr( (sum(setAC)*sum(setAC)) / n - ((sum(setAC)/n) *(sum(setAC)/n)) )"); set_currents_rms->set_default_properties(set_currents_rms_prop); att_list.push_back(set_currents_rms); // Attribute : SetCurrentsAverage SetCurrentsAverageAttrib *set_currents_average = new SetCurrentsAverageAttrib(); Tango::UserDefaultAttrProp set_currents_average_prop; set_currents_average_prop.set_label("Average AC current setpoints/s"); set_currents_average_prop.set_unit("A"); set_currents_average_prop.set_format("%6.4"); set_currents_average_prop.set_description("Statistic when driven by the Libera. One average value for every pole\nof the magnet.\nRMS value of the AC setpoint applied on the DAC during the last second.\nX=sqr( (sum(setAC)*sum(setAC)) / n - ((sum(setAC)/n) *(sum(setAC)/n)) )"); set_currents_average->set_default_properties(set_currents_average_prop); att_list.push_back(set_currents_average); // Attribute : FramesPerSecond FramesPerSecondAttrib *frames_per_second = new FramesPerSecondAttrib(); Tango::UserDefaultAttrProp frames_per_second_prop; frames_per_second_prop.set_label("Frames per second"); frames_per_second_prop.set_display_unit(" "); frames_per_second_prop.set_format("%6d"); frames_per_second->set_default_properties(frames_per_second_prop); att_list.push_back(frames_per_second); // Attribute : ErrorsPerSecond ErrorsPerSecondAttrib *errors_per_second = new ErrorsPerSecondAttrib(); Tango::UserDefaultAttrProp errors_per_second_prop; errors_per_second_prop.set_label("Errors per second"); errors_per_second_prop.set_display_unit(" "); errors_per_second_prop.set_format("%6d"); errors_per_second->set_default_properties(errors_per_second_prop); att_list.push_back(errors_per_second); // Attribute : ErrorCounters ErrorCountersAttrib *error_counters = new ErrorCountersAttrib(); Tango::UserDefaultAttrProp error_counters_prop; error_counters_prop.set_label("Error counters"); error_counters_prop.set_unit(" "); error_counters_prop.set_format("%6d"); error_counters_prop.set_description("Statistic when driven by the Libera.\nThe total number of errors since the last reset for the \nthree poles."); error_counters->set_default_properties(error_counters_prop); att_list.push_back(error_counters); // Attribute : LocalControls LocalControlsAttrib *local_controls = new LocalControlsAttrib(); att_list.push_back(local_controls); // End of Automatic code generation //------------------------------------------------------------- } //+---------------------------------------------------------------------------- // // method : BiltClass::get_class_property() // // description : Read the class properties from database. // //----------------------------------------------------------------------------- void BiltClass::get_class_property() { // Initialize your default values here (if not done with POGO). //------------------------------------------------------------------ // Read class properties from database.(Automatic code generation) //------------------------------------------------------------------ // Call database and extract values //-------------------------------------------- if (Tango::Util::instance()->_UseDb==true) get_db_class()->get_property(cl_prop); Tango::DbDatum def_prop; int i = -1; // End of Automatic code generation //------------------------------------------------------------------ } //+---------------------------------------------------------------------------- // // method : BiltClass::set_default_property // // description: Set default property (class and device) for wizard. // For each property, add to wizard property name and description // If default value has been set, add it to wizard property and // store it in a DbDatum. // //----------------------------------------------------------------------------- void BiltClass::set_default_property() { string prop_name; string prop_desc; string prop_def; vector vect_data; // Set Default Class Properties // Set Default Device Properties prop_name = "IPAddress"; prop_desc = "IP Address of BILT controller.\nEach controller includes several magnets and\neach magnet includes 3 power supplies,\nfor corrections in the X, Y and Z planes.\n\n"; prop_def = "0.0.0.0"; vect_data.clear(); vect_data.push_back("0.0.0.0"); if (prop_def.length()>0) { Tango::DbDatum data(prop_name); data << vect_data ; dev_def_prop.push_back(data); add_wiz_dev_prop(prop_name, prop_desc, prop_def); } else add_wiz_dev_prop(prop_name, prop_desc); prop_name = "MagnetNumber"; prop_desc = "Magnet number from 1 to 48"; prop_def = "0"; vect_data.clear(); vect_data.push_back("0"); if (prop_def.length()>0) { Tango::DbDatum data(prop_name); data << vect_data ; dev_def_prop.push_back(data); add_wiz_dev_prop(prop_name, prop_desc, prop_def); } else add_wiz_dev_prop(prop_name, prop_desc); prop_name = "UpdatePeriod"; prop_desc = "The update period for the data reading from the power supply in milli seconds."; prop_def = "1000"; vect_data.clear(); vect_data.push_back("1000"); if (prop_def.length()>0) { Tango::DbDatum data(prop_name); data << vect_data ; dev_def_prop.push_back(data); add_wiz_dev_prop(prop_name, prop_desc, prop_def); } else add_wiz_dev_prop(prop_name, prop_desc); } //+---------------------------------------------------------------------------- // // method : BiltClass::write_class_property // // description : Set class description as property in database // //----------------------------------------------------------------------------- void BiltClass::write_class_property() { // First time, check if database used //-------------------------------------------- if (Tango::Util::_UseDb == false) return; Tango::DbData data; string classname = get_name(); string header; string::size_type start, end; // Put title Tango::DbDatum title("ProjectTitle"); string str_title("BILT multi channel power supply"); title << str_title; data.push_back(title); // Put Description Tango::DbDatum description("Description"); vector str_desc; str_desc.push_back("The BILT multi channel power supply will be used with 3 channels for the ESRF fast"); str_desc.push_back("feedback systems."); str_desc.push_back("The power supply can be controlled in 2 ways :"); str_desc.push_back("By this device server for slow or human control or"); str_desc.push_back("by the Libera Beam Position monitors for fast feedback with closed loop control."); str_desc.push_back("The devices are exported as one device per steerer magnet. Every device has three"); str_desc.push_back("channels. The channels (poles) cannot be switched on individually but have their"); str_desc.push_back("individual set points and measurement values."); description << str_desc; data.push_back(description); // put cvs or svn location string filename(classname); filename += "Class.cpp"; // Create a string with the class ID to // get the string into the binary string class_id(ClassId); // check for cvs information string src_path(CvsPath); start = src_path.find("/"); if (start!=string::npos) { end = src_path.find(filename); if (end>start) { string strloc = src_path.substr(start, end-start); // Check if specific repository start = strloc.find("/cvsroot/"); if (start!=string::npos && start>0) { string repository = strloc.substr(0, start); if (repository.find("/segfs/")!=string::npos) strloc = "ESRF:" + strloc.substr(start, strloc.length()-start); } Tango::DbDatum cvs_loc("cvs_location"); cvs_loc << strloc; data.push_back(cvs_loc); } } // check for svn information else { string src_path(SvnPath); start = src_path.find("://"); if (start!=string::npos) { end = src_path.find(filename); if (end>start) { header = "$HeadURL: "; start = header.length(); string strloc = src_path.substr(start, (end-start)); Tango::DbDatum svn_loc("svn_location"); svn_loc << strloc; data.push_back(svn_loc); } } } // Get CVS or SVN revision tag // CVS tag string tagname(TagName); header = "$Name: "; start = header.length(); string endstr(" $"); end = tagname.find(endstr); if (end!=string::npos && end>start) { string strtag = tagname.substr(start, end-start); Tango::DbDatum cvs_tag("cvs_tag"); cvs_tag << strtag; data.push_back(cvs_tag); } // SVN tag string svnpath(SvnPath); header = "$HeadURL: "; start = header.length(); end = svnpath.find(endstr); if (end!=string::npos && end>start) { string strloc = svnpath.substr(start, end-start); string tagstr ("/tags/"); start = strloc.find(tagstr); if ( start!=string::npos ) { start = start + tagstr.length(); end = strloc.find(filename); string strtag = strloc.substr(start, end-start-1); Tango::DbDatum svn_tag("svn_tag"); svn_tag << strtag; data.push_back(svn_tag); } } // Get URL location string httpServ(HttpServer); if (httpServ.length()>0) { Tango::DbDatum db_doc_url("doc_url"); db_doc_url << httpServ; data.push_back(db_doc_url); } // Put inheritance Tango::DbDatum inher_datum("InheritedFrom"); vector inheritance; inheritance.push_back("Device_4Impl"); inher_datum << inheritance; data.push_back(inher_datum); // Call database and and values //-------------------------------------------- get_db_class()->put_property(data); } } // namespace Node-path: powersupply/itest/Bilt/trunk/BiltClass.h Node-kind: file Node-action: change Text-content-length: 12190 Text-content-md5: 8ee263b1d9dec0831ad64fcc86eecd53 Content-length: 12190 //============================================================================= // // file : BiltClass.h // // description : Include for the BiltClass root class. // This class is the singleton class for // the Bilt device class. // It contains all properties and methods which the // Bilt requires only once e.g. the commands. // // project : TANGO Device Server // // $Author: meyer $ // // $Revision: 1.7 $ // $Date: 2010-02-12 16:35:13 $ // // SVN only: // $HeadURL: $ // // CVS only: // $Source: /segfs/tango/cvsroot/cppserver/machine/powersupply/SrSteerers/tango/Bilt/BiltClass.h,v $ // $Log: not supported by cvs2svn $ // Revision 1.6 2010-02-11 16:35:27 meyer // Currents settings understand NaN values. // Deleted StePoleCurrent command. // // Revision 1.5 2010/02/10 12:27:31 meyer // Restructured Bilt class. // Acquistion is now done by a thread and only the multi channel data // gets exported. A single channel class (BiltCh) was created. // // Revision 1.4 2009/11/27 13:49:26 meyer // Modified structure! The pole is no longer a device. // The device is now a magnet with three poles. // // Revision 1.3 2009/11/26 10:46:58 meyer // Updated for libMagnet_V120 // // Revision 1.2 2009/11/06 12:46:25 meyer // Added impedance attribute and corrected fromatting of attribute values. // // Revision 1.1.1.1 2009/11/04 16:23:02 meyer // Imported using TkCVS // // // copyleft : European Synchrotron Radiation Facility // BP 220, Grenoble 38043 // FRANCE // //============================================================================= // // This file is generated by POGO // (Program Obviously used to Generate tango Object) // // (c) - Software Engineering Group - ESRF //============================================================================= #ifndef _BILTCLASS_H #define _BILTCLASS_H #include #include namespace Bilt_ns {//===================================== // Define classes for attributes //===================================== class LocalControlsAttrib: public Tango::SpectrumAttr { public: LocalControlsAttrib():SpectrumAttr("LocalControls", Tango::DEV_BOOLEAN, Tango::READ, 5) {}; ~LocalControlsAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_LocalControls(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_LocalControls_allowed(ty);} }; class ErrorCountersAttrib: public Tango::SpectrumAttr { public: ErrorCountersAttrib():SpectrumAttr("ErrorCounters", Tango::DEV_ULONG, Tango::READ, 3) {}; ~ErrorCountersAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_ErrorCounters(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_ErrorCounters_allowed(ty);} }; class ErrorsPerSecondAttrib: public Tango::SpectrumAttr { public: ErrorsPerSecondAttrib():SpectrumAttr("ErrorsPerSecond", Tango::DEV_ULONG, Tango::READ, 3) {}; ~ErrorsPerSecondAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_ErrorsPerSecond(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_ErrorsPerSecond_allowed(ty);} }; class FramesPerSecondAttrib: public Tango::SpectrumAttr { public: FramesPerSecondAttrib():SpectrumAttr("FramesPerSecond", Tango::DEV_ULONG, Tango::READ, 3) {}; ~FramesPerSecondAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_FramesPerSecond(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_FramesPerSecond_allowed(ty);} }; class SetCurrentsAverageAttrib: public Tango::SpectrumAttr { public: SetCurrentsAverageAttrib():SpectrumAttr("SetCurrentsAverage", Tango::DEV_DOUBLE, Tango::READ, 3) {}; ~SetCurrentsAverageAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_SetCurrentsAverage(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_SetCurrentsAverage_allowed(ty);} }; class SetCurrentsRMSAttrib: public Tango::SpectrumAttr { public: SetCurrentsRMSAttrib():SpectrumAttr("SetCurrentsRMS", Tango::DEV_DOUBLE, Tango::READ, 3) {}; ~SetCurrentsRMSAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_SetCurrentsRMS(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_SetCurrentsRMS_allowed(ty);} }; class ImpedancesAttrib: public Tango::SpectrumAttr { public: ImpedancesAttrib():SpectrumAttr("Impedances", Tango::DEV_DOUBLE, Tango::READ, 3) {}; ~ImpedancesAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_Impedances(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_Impedances_allowed(ty);} }; class VoltagesAttrib: public Tango::SpectrumAttr { public: VoltagesAttrib():SpectrumAttr("Voltages", Tango::DEV_DOUBLE, Tango::READ, 3) {}; ~VoltagesAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_Voltages(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_Voltages_allowed(ty);} }; class CurrentsAttrib: public Tango::SpectrumAttr { public: CurrentsAttrib():SpectrumAttr("Currents", Tango::DEV_DOUBLE, Tango::READ_WRITE, 3) {}; ~CurrentsAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_Currents(att);} virtual void write(Tango::DeviceImpl *dev,Tango::WAttribute &att) {(static_cast(dev))->write_Currents(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_Currents_allowed(ty);} }; //========================================= // Define classes for commands //========================================= class SetPoleCurrentCmd : public Tango::Command { public: SetPoleCurrentCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out, const char *in_desc, const char *out_desc, Tango::DispLevel level) :Command(name,in,out,in_desc,out_desc, level) {}; SetPoleCurrentCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out) :Command(name,in,out) {}; ~SetPoleCurrentCmd() {}; virtual CORBA::Any *execute (Tango::DeviceImpl *dev, const CORBA::Any &any); virtual bool is_allowed (Tango::DeviceImpl *dev, const CORBA::Any &any) {return (static_cast(dev))->is_SetPoleCurrent_allowed(any);} }; class SetpointCheckCmd : public Tango::Command { public: SetpointCheckCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out, const char *in_desc, const char *out_desc, Tango::DispLevel level) :Command(name,in,out,in_desc,out_desc, level) {}; SetpointCheckCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out) :Command(name,in,out) {}; ~SetpointCheckCmd() {}; virtual CORBA::Any *execute (Tango::DeviceImpl *dev, const CORBA::Any &any); virtual bool is_allowed (Tango::DeviceImpl *dev, const CORBA::Any &any) {return (static_cast(dev))->is_SetpointCheck_allowed(any);} }; class LocalPoleControlCmd : public Tango::Command { public: LocalPoleControlCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out, const char *in_desc, const char *out_desc, Tango::DispLevel level) :Command(name,in,out,in_desc,out_desc, level) {}; LocalPoleControlCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out) :Command(name,in,out) {}; ~LocalPoleControlCmd() {}; virtual CORBA::Any *execute (Tango::DeviceImpl *dev, const CORBA::Any &any); virtual bool is_allowed (Tango::DeviceImpl *dev, const CORBA::Any &any) {return (static_cast(dev))->is_LocalPoleControl_allowed(any);} }; class SetPoleAcCurrentCmd : public Tango::Command { public: SetPoleAcCurrentCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out, const char *in_desc, const char *out_desc, Tango::DispLevel level) :Command(name,in,out,in_desc,out_desc, level) {}; SetPoleAcCurrentCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out) :Command(name,in,out) {}; ~SetPoleAcCurrentCmd() {}; virtual CORBA::Any *execute (Tango::DeviceImpl *dev, const CORBA::Any &any); virtual bool is_allowed (Tango::DeviceImpl *dev, const CORBA::Any &any) {return (static_cast(dev))->is_SetPoleAcCurrent_allowed(any);} }; class ResetCmd : public Tango::Command { public: ResetCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out, const char *in_desc, const char *out_desc, Tango::DispLevel level) :Command(name,in,out,in_desc,out_desc, level) {}; ResetCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out) :Command(name,in,out) {}; ~ResetCmd() {}; virtual CORBA::Any *execute (Tango::DeviceImpl *dev, const CORBA::Any &any); virtual bool is_allowed (Tango::DeviceImpl *dev, const CORBA::Any &any) {return (static_cast(dev))->is_Reset_allowed(any);} }; class OffCmd : public Tango::Command { public: OffCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out, const char *in_desc, const char *out_desc, Tango::DispLevel level) :Command(name,in,out,in_desc,out_desc, level) {}; OffCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out) :Command(name,in,out) {}; ~OffCmd() {}; virtual CORBA::Any *execute (Tango::DeviceImpl *dev, const CORBA::Any &any); virtual bool is_allowed (Tango::DeviceImpl *dev, const CORBA::Any &any) {return (static_cast(dev))->is_Off_allowed(any);} }; class OnCmd : public Tango::Command { public: OnCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out, const char *in_desc, const char *out_desc, Tango::DispLevel level) :Command(name,in,out,in_desc,out_desc, level) {}; OnCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out) :Command(name,in,out) {}; ~OnCmd() {}; virtual CORBA::Any *execute (Tango::DeviceImpl *dev, const CORBA::Any &any); virtual bool is_allowed (Tango::DeviceImpl *dev, const CORBA::Any &any) {return (static_cast(dev))->is_On_allowed(any);} }; // // The BiltClass singleton definition // class #ifdef _TG_WINDOWS_ __declspec(dllexport) #endif BiltClass : public Tango::DeviceClass { public: // properties member data // add your own data members here //------------------------------------ public: Tango::DbData cl_prop; Tango::DbData cl_def_prop; Tango::DbData dev_def_prop; // Method prototypes static BiltClass *init(const char *); static BiltClass *instance(); ~BiltClass(); Tango::DbDatum get_class_property(string &); Tango::DbDatum get_default_device_property(string &); Tango::DbDatum get_default_class_property(string &); protected: BiltClass(string &); static BiltClass *_instance; void command_factory(); void get_class_property(); void attribute_factory(vector &); void write_class_property(); void set_default_property(); string get_cvstag(); string get_cvsroot(); private: void device_factory(const Tango::DevVarStringArray *); }; } // namespace Bilt_ns #endif // _BILTCLASS_H Node-path: powersupply/itest/Bilt/trunk/BiltStateMachine.cpp Node-kind: file Node-action: change Text-content-length: 9372 Text-content-md5: 030386625717589a73f2db696c8bceae Content-length: 9372 static const char *RcsId = "$Id $"; //+============================================================================= // // file : BiltStateMachine.cpp // // description : C++ source for the Bilt and its alowed // methods for commands and attributes // // project : TANGO Device Server // // $Author: meyer $ // // $Revision: 1.7 $ // $Date: 2010-02-12 16:35:13 $ // // SVN only: // $HeadURL: $ // // CVS only: // $Source: /segfs/tango/cvsroot/cppserver/machine/powersupply/SrSteerers/tango/Bilt/BiltStateMachine.cpp,v $ // $Log: not supported by cvs2svn $ // Revision 1.6 2010-02-11 16:35:27 meyer // Currents settings understand NaN values. // Deleted StePoleCurrent command. // // Revision 1.5 2010/02/10 12:27:31 meyer // Restructured Bilt class. // Acquistion is now done by a thread and only the multi channel data // gets exported. A single channel class (BiltCh) was created. // // Revision 1.4 2009/11/27 13:49:26 meyer // Modified structure! The pole is no longer a device. // The device is now a magnet with three poles. // // Revision 1.3 2009/11/26 10:46:58 meyer // Updated for libMagnet_V120 // // Revision 1.2 2009/11/06 12:46:25 meyer // Added impedance attribute and corrected fromatting of attribute values. // // Revision 1.1.1.1 2009/11/04 16:23:02 meyer // Imported using TkCVS // // // copyleft : European Synchrotron Radiation Facility // BP 220, Grenoble 38043 // FRANCE // //-============================================================================= // // This file is generated by POGO // (Program Obviously used to Generate tango Object) // // (c) - Software Engineering Group - ESRF //============================================================================= #include #include #include /*==================================================================== * This file contains the methods to allow commands and attributes * read or write execution. * * If you wand to add your own code, add it between * the "End/Re-Start of Generated Code" comments. * * If you want, you can also add your own methods. *==================================================================== */ namespace Bilt_ns { //================================================= // Attributes Allowed Methods //================================================= //+---------------------------------------------------------------------------- // // method : Bilt::is_Voltages_allowed // // description : Read/Write allowed for Voltages attribute. // //----------------------------------------------------------------------------- bool Bilt::is_Voltages_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_Impedances_allowed // // description : Read/Write allowed for Impedances attribute. // //----------------------------------------------------------------------------- bool Bilt::is_Impedances_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_SetCurrentsRMS_allowed // // description : Read/Write allowed for SetCurrentsRMS attribute. // //----------------------------------------------------------------------------- bool Bilt::is_SetCurrentsRMS_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_SetCurrentsAverage_allowed // // description : Read/Write allowed for SetCurrentsAverage attribute. // //----------------------------------------------------------------------------- bool Bilt::is_SetCurrentsAverage_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_ErrorCounters_allowed // // description : Read/Write allowed for ErrorCounters attribute. // //----------------------------------------------------------------------------- bool Bilt::is_ErrorCounters_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_LocalControls_allowed // // description : Read/Write allowed for LocalControls attribute. // //----------------------------------------------------------------------------- bool Bilt::is_LocalControls_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_Currents_allowed // // description : Read/Write allowed for Currents attribute. // //----------------------------------------------------------------------------- bool Bilt::is_Currents_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_FramesPerSecond_allowed // // description : Read/Write allowed for FramesPerSecond attribute. // //----------------------------------------------------------------------------- bool Bilt::is_FramesPerSecond_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_ErrorsPerSecond_allowed // // description : Read/Write allowed for ErrorsPerSecond attribute. // //----------------------------------------------------------------------------- bool Bilt::is_ErrorsPerSecond_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //================================================= // Commands Allowed Methods //================================================= //+---------------------------------------------------------------------------- // // method : Bilt::is_On_allowed // // description : Execution allowed for On command. // //----------------------------------------------------------------------------- bool Bilt::is_On_allowed(const CORBA::Any &any) { if (get_state() == Tango::ON || get_state() == Tango::FAULT || get_state() == Tango::ALARM || get_state() == Tango::UNKNOWN) { // End of Generated Code // Re-Start of Generated Code return false; } return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_Off_allowed // // description : Execution allowed for Off command. // //----------------------------------------------------------------------------- bool Bilt::is_Off_allowed(const CORBA::Any &any) { if (get_state() == Tango::OFF) { // End of Generated Code // Re-Start of Generated Code return false; } return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_Reset_allowed // // description : Execution allowed for Reset command. // //----------------------------------------------------------------------------- bool Bilt::is_Reset_allowed(const CORBA::Any &any) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_SetPoleAcCurrent_allowed // // description : Execution allowed for SetPoleAcCurrent command. // //----------------------------------------------------------------------------- bool Bilt::is_SetPoleAcCurrent_allowed(const CORBA::Any &any) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_LocalPoleControl_allowed // // description : Execution allowed for LocalPoleControl command. // //----------------------------------------------------------------------------- bool Bilt::is_LocalPoleControl_allowed(const CORBA::Any &any) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_SetpointCheck_allowed // // description : Execution allowed for SetpointCheck command. // //----------------------------------------------------------------------------- bool Bilt::is_SetpointCheck_allowed(const CORBA::Any &any) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_SetPoleCurrent_allowed // // description : Execution allowed for SetPoleCurrent command. // //----------------------------------------------------------------------------- bool Bilt::is_SetPoleCurrent_allowed(const CORBA::Any &any) { // End of Generated Code // Re-Start of Generated Code return true; } } // namespace Bilt_ns Revision-number: 28 Prop-content-length: 133 Content-length: 133 K 10 svn:author V 5 meyer K 8 svn:date V 27 2010-02-18T16:46:31.000000Z K 7 svn:log V 33 Filled-in code for SetpointCheck PROPS-END Node-path: powersupply/itest/Bilt/trunk/Bilt.cpp Node-kind: file Node-action: change Text-content-length: 33588 Text-content-md5: 73ebc47fcab755b1aed4ef07e1c65899 Content-length: 33588 static const char *RcsId = "$Id: Bilt.cpp,v 1.11 2010-02-18 16:46:31 meyer Exp $"; //+============================================================================= // // file : Bilt.cpp // // description : C++ source for the Bilt and its commands. // The class is derived from Device. It represents the // CORBA servant object which will be accessed from the // network. All commands which can be executed on the // Bilt are implemented in this file. // // project : TANGO Device Server // // $Author: meyer $ // // $Revision: 1.11 $ // // $Revision: 1.11 $ // $Date: 2010-02-18 16:46:31 $ // // SVN only: // $HeadURL: $ // // CVS only: // $Source: /segfs/tango/cvsroot/cppserver/machine/powersupply/SrSteerers/tango/Bilt/Bilt.cpp,v $ // $Log: not supported by cvs2svn $ // Revision 1.10 2010-02-12 16:35:13 meyer // Added SetPoleCurrent command again. // // Revision 1.9 2010-02-11 16:35:27 meyer // Currents settings understand NaN values. // Deleted StePoleCurrent command. // // Revision 1.8 2010/02/10 12:27:31 meyer // Restructured Bilt class. // Acquistion is now done by a thread and only the multi channel data // gets exported. A single channel class (BiltCh) was created. // // Revision 1.7 2009/12/18 12:01:40 meyer // Corrected alarm handling in dev_state() // // Revision 1.6 2009/11/27 13:49:26 meyer // Modified structure! The pole is no longer a device. // The device is now a magnet with three poles. // // Revision 1.5 2009/11/26 10:46:58 meyer // Updated for libMagnet_V120 // // Revision 1.4 2009/11/24 09:21:46 meyer // Absolut value for impedance // // Revision 1.3 2009/11/23 16:46:58 meyer // Corrected state, status and exception handling // // Revision 1.2 2009/11/06 12:46:25 meyer // Added impedance attribute and corrected fromatting of attribute values. // // Revision 1.1.1.1 2009/11/04 16:23:02 meyer // Imported using TkCVS // // // copyleft : European Synchrotron Radiation Facility // BP 220, Grenoble 38043 // FRANCE // //-============================================================================= // // This file is generated by POGO // (Program Obviously used to Generate tango Object) // // (c) - Software Engineering Group - ESRF //============================================================================= //=================================================================== // // The following table gives the correspondence // between commands and method name. // // Command name | Method name // ---------------------------------------- // State | dev_state() // Status | dev_status() // On | on() // Off | off() // Reset | reset() // SetPoleAcCurrent | set_pole_ac_current() // LocalPoleControl | local_pole_control() // SetpointCheck | setpoint_check() // SetPoleCurrent | set_pole_current() // //=================================================================== #include #include #include #include #include namespace Bilt_ns { //+---------------------------------------------------------------------------- // // method : Bilt::Bilt(string &s) // // description : constructor for simulated Bilt // // in : - cl : Pointer to the DeviceClass object // - s : Device name // //----------------------------------------------------------------------------- Bilt::Bilt(Tango::DeviceClass *cl,string &s) :Tango::Device_4Impl(cl,s.c_str()) { init_device(); } Bilt::Bilt(Tango::DeviceClass *cl,const char *s) :Tango::Device_4Impl(cl,s) { init_device(); } Bilt::Bilt(Tango::DeviceClass *cl,const char *s,const char *d) :Tango::Device_4Impl(cl,s,d) { init_device(); } //+---------------------------------------------------------------------------- // // method : Bilt::delete_device() // // description : will be called at device destruction or at init command. // //----------------------------------------------------------------------------- void Bilt::delete_device() { // Delete device allocated objects if ( acquisition_thread != NULL ) { data_mutex.lock(); exit_thread = true; data_mutex.unlock(); // join now the thread until it exits int *rv; acquisition_thread->join((void **)&rv); cout << "Bilt::delete_device(): Exit acquisition thread !!!" << endl; } // Delete connection to the power supply delete BILT; BILT = NULL; } //+---------------------------------------------------------------------------- // // method : Bilt::init_device() // // description : will be called at device initialization. // //----------------------------------------------------------------------------- void Bilt::init_device() { INFO_STREAM << "Bilt::Bilt() create device " << device_name << endl; // Initialise variables to default values //-------------------------------------------- get_device_property(); set_state (Tango::OFF); try { BILT = new itest::TMagnet (iPAddress.c_str(), magnetNumber); } catch (itest::ItestException &e) { try { create_tango_exception (e, mdata_errors, "Init failure" , "Cannot initialise ITEST libray objects", "Bilt::init_device"); } catch (Tango::DevFailed &e) { set_state (Tango::UNKNOWN); } } // initialise with the actual current set point values try { for (int i=0; ipole(i).get_current_DC(); } Tango::MultiAttribute *attr_list = get_device_attr(); Tango::WAttribute &attr_curr = attr_list->get_w_attr_by_name ("Currents"); attr_curr.set_write_value(¤ts_dc[0], currents_dc.size()); } catch (itest::ItestException &e) { try { create_tango_exception (e, mdata_errors, "Init failure" , "Cannot read the actual current set point values", "Bilt::init_device"); } catch (Tango::DevFailed &e) { set_state (Tango::UNKNOWN); } } // initialise and start the acquisition thread exit_thread = false; acquisition_thread = new AcquisitionThread(this, data_mutex, bilt_mutex); } //+---------------------------------------------------------------------------- // // method : Bilt::get_device_property() // // description : Read the device properties from database. // //----------------------------------------------------------------------------- void Bilt::get_device_property() { // Initialize your default values here (if not done with POGO). //------------------------------------------------------------------ BILT = NULL; acquisition_thread = NULL; struct timeval now; gettimeofday (&now, NULL); data_set_time = now; data_read_time = now; // intitialise mdada structure for magnet read values mdata.magnet = -1; mdata.state = -1; for (int i=0; i_UseDb==true) get_db_device()->get_property(dev_prop); Tango::DbDatum def_prop, cl_prop; BiltClass *ds_class = (static_cast(get_device_class())); int i = -1; // Try to initialize IPAddress from class property cl_prop = ds_class->get_class_property(dev_prop[++i].name); if (cl_prop.is_empty()==false) cl_prop >> iPAddress; else { // Try to initialize IPAddress from default device value def_prop = ds_class->get_default_device_property(dev_prop[i].name); if (def_prop.is_empty()==false) def_prop >> iPAddress; } // And try to extract IPAddress value from database if (dev_prop[i].is_empty()==false) dev_prop[i] >> iPAddress; // Try to initialize MagnetNumber from class property cl_prop = ds_class->get_class_property(dev_prop[++i].name); if (cl_prop.is_empty()==false) cl_prop >> magnetNumber; else { // Try to initialize MagnetNumber from default device value def_prop = ds_class->get_default_device_property(dev_prop[i].name); if (def_prop.is_empty()==false) def_prop >> magnetNumber; } // And try to extract MagnetNumber value from database if (dev_prop[i].is_empty()==false) dev_prop[i] >> magnetNumber; // Try to initialize UpdatePeriod from class property cl_prop = ds_class->get_class_property(dev_prop[++i].name); if (cl_prop.is_empty()==false) cl_prop >> updatePeriod; else { // Try to initialize UpdatePeriod from default device value def_prop = ds_class->get_default_device_property(dev_prop[i].name); if (def_prop.is_empty()==false) def_prop >> updatePeriod; } // And try to extract UpdatePeriod value from database if (dev_prop[i].is_empty()==false) dev_prop[i] >> updatePeriod; // End of Automatic code generation //------------------------------------------------------------------ } //+---------------------------------------------------------------------------- // // method : Bilt::always_executed_hook() // // description : method always executed before any command is executed // //----------------------------------------------------------------------------- void Bilt::always_executed_hook() { } //+---------------------------------------------------------------------------- // // method : Bilt::read_attr_hardware // // description : Hardware acquisition for attributes. // //----------------------------------------------------------------------------- void Bilt::read_attr_hardware(vector &attr_list) { DEBUG_STREAM << "Bilt::read_attr_hardware(vector &attr_list) entering... "<< endl; // Add your own code here } //+---------------------------------------------------------------------------- // // method : Bilt::read_FramesPerSecond // // description : Extract real attribute values for FramesPerSecond acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_FramesPerSecond(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_FramesPerSecond(Tango::Attribute &attr) entering... "<< endl; omni_mutex_lock l(data_mutex); if ( fdata_errors.length() != 0 ) attr.set_quality(Tango::ATTR_INVALID); else { for (int i=0; ipole(i).get_switch(); } if ( switch_state == 1 ) local_control[i] = false; else local_control[i] = true; } } catch (itest::ItestException &e) { create_tango_exception (e, "Read failure" , "Cannot read the actual switch states", "Bilt::read_LocalControls"); } attr.set_value (&(local_control[0]), POLES); } //+---------------------------------------------------------------------------- // // method : Bilt::read_SetCurrentsRMS // // description : Extract real attribute values for SetCurrentsRMS acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_SetCurrentsRMS(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_SetCurrentsRMS(Tango::Attribute &attr) entering... "<< endl; omni_mutex_lock l(data_mutex); if ( fdata_errors.length() != 0 ) attr.set_quality(Tango::ATTR_INVALID); else { for (int i=0; i CURRENT_LIMIT ) impedances[i] = fabs (mdata.idata[i].measvolt / mdata.idata[i].meascurr); else impedances[i] = nan(""); } attr.set_value (&(impedances[0]), POLES); } } //+---------------------------------------------------------------------------- // // method : Bilt::write_Currents // // description : Write Currents attribute values to hardware. // //----------------------------------------------------------------------------- void Bilt::write_Currents(Tango::WAttribute &attr) { DEBUG_STREAM << "Bilt::write_Currents(Tango::WAttribute &attr) entering... "<< endl; const double *set_currents; // check the correct number of setpoints if ( attr.get_write_value_length() == POLES ) attr.get_write_value(set_currents); else { TangoSys_MemStream tms; tms << "Wrong number of setpoints!" << endl; Tango::Except::throw_exception("WriteError", tms.str(), "Bilt::write_Currents"); } // apply setpoints to the poles try { for (int i=0; ipole(i).set_current_DC (set_currents[i]); } } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot write DC current values", "Bilt::write_Currents"); } // initialise the set time, to be sure that the next // returned read value is newer and contains the changes. struct timeval now; gettimeofday (&now, NULL); data_set_time = now; } //+---------------------------------------------------------------------------- // // method : Bilt::read_Currents // // description : Extract real attribute values for Currents acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_Currents(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_Currents(Tango::Attribute &attr) entering... "<< endl; // wait for the next data acquisition afer a current setpoint change double delay; { omni_mutex_lock l(data_mutex); delay = (data_set_time.tv_sec * 1e6 + data_set_time.tv_usec) - (data_read_time.tv_sec * 1e6 + data_read_time.tv_usec); //cout << "delay = " << delay << endl; } while ( delay > 0 ) { // 20 ms struct timespec sleep_time = {0, SLEEP_NS}; nanosleep(&sleep_time, NULL); omni_mutex_lock l(data_mutex); delay = (data_set_time.tv_sec * 1e6 + data_set_time.tv_usec) - (data_read_time.tv_sec * 1e6 + data_read_time.tv_usec); INFO_STREAM << "read waiting delay = " << delay << endl; } omni_mutex_lock l(data_mutex); if ( mdata_errors.length() != 0 ) attr.set_quality(Tango::ATTR_INVALID); else { for (int i=0; iset_state(1); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot switch on pole", "Bilt::on"); } } //+------------------------------------------------------------------ /** * method: Bilt::off * * description: method to execute "Off" * Turns of power supply * * */ //+------------------------------------------------------------------ void Bilt::off() { DEBUG_STREAM << "Bilt::off(): entering... !" << endl; // Add your own code to control device here try { omni_mutex_lock l(bilt_mutex); BILT->set_state(0); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot switch off pole", "Bilt::off"); } } //+------------------------------------------------------------------ /** * method: Bilt::reset * * description: method to execute "Reset" * Reset faults and alarms * * */ //+------------------------------------------------------------------ void Bilt::reset() { DEBUG_STREAM << "Bilt::reset(): entering... !" << endl; // Add your own code to control device here try { omni_mutex_lock l(bilt_mutex); BILT->clear_all_err(); BILT->clear_alarm(); for (int i=0; ipole(i).clear_ferrors(); } } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot reset pole", "Bilt::reset"); } } //+------------------------------------------------------------------ /** * method: Bilt::set_pole_ac_current * * description: method to execute "SetPoleAcCurrent" * Set the AC current for one Pole. * [0] = pole number, [1] = current * * @param argin * */ //+------------------------------------------------------------------ void Bilt::set_pole_ac_current(const Tango::DevVarDoubleArray *argin) { DEBUG_STREAM << "Bilt::set_pole_ac_current(): entering... !" << endl; // Add your own code to control device here // argin[0] = pole number if ( (*argin)[0] < 0 || (*argin)[0] >= POLES ) { TangoSys_MemStream tms; tms << "The entered Pole number is out of range" << endl; Tango::Except::throw_exception("WriteError", tms.str(), "Bilt::set_pole_ac_current"); } try { omni_mutex_lock l(bilt_mutex); BILT->pole((int)(*argin)[0]).set_current_AC ((*argin)[1]); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot write AC current value", "Bilt::set_pole_ac_current"); } } //+------------------------------------------------------------------ /** * method: Bilt::local_pole_control * * description: method to execute "LocalPoleControl" * Set the AC current for one Pole. * [0] = pole number, [1] = local control true/false * * @param argin * */ //+------------------------------------------------------------------ void Bilt::local_pole_control(const Tango::DevVarShortArray *argin) { DEBUG_STREAM << "Bilt::local_pole_control(): entering... !" << endl; // Add your own code to control device here // argin[0] = pole number if ( (*argin)[0] < 0 || (*argin)[0] >= POLES ) { TangoSys_MemStream tms; tms << "The entered Pole number is out of range" << endl; Tango::Except::throw_exception("WriteError", tms.str(), "Bilt::local_pole_control"); } // argin[1] = true or false (1 or 0 ) if ( (*argin)[1] != 0 && (*argin)[1] != 1 ) { TangoSys_MemStream tms; tms << "Local control can only be choosen as 0 or 1 (false or true)" << endl; Tango::Except::throw_exception("WriteError", tms.str(), "Bilt::local_pole_control"); } try { int switch_state; if ( (*argin)[1] == true ) switch_state = 0; else switch_state = 1; omni_mutex_lock l(bilt_mutex); BILT->pole((*argin)[0]).set_switch (switch_state); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot write switch state", "Bilt::local_pole_control"); } } //+------------------------------------------------------------------ /** * method: Bilt::set_pole_current * * description: method to execute "SetPoleCurrent" * Set the current for one Pole. * [0] = pole number, [1] = current * * @param argin * */ //+------------------------------------------------------------------ void Bilt::set_pole_current(const Tango::DevVarDoubleArray *argin) { DEBUG_STREAM << "Bilt::set_pole_current(): entering... !" << endl; // Add your own code to control device here // argin[0] = pole number if ( (*argin)[0] < 0 || (*argin)[0] >= POLES ) { TangoSys_MemStream tms; tms << "The entered Pole number is out of range" << endl; Tango::Except::throw_exception("WriteError", tms.str(), "Bilt::set_pole_current"); } try { omni_mutex_lock l(bilt_mutex); BILT->pole((int)(*argin)[0]).set_current_DC ((*argin)[1]); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot write current value", "Bilt::set_pole_current"); } // make sure that the current set values are correct! try { omni_mutex_lock l(bilt_mutex); for (int i=0; ipole(i).get_current_DC(); } Tango::MultiAttribute *attr_list = get_device_attr(); Tango::WAttribute &attr_curr = attr_list->get_w_attr_by_name ("Currents"); attr_curr.set_write_value(¤ts_dc[0], currents_dc.size()); } catch (itest::ItestException &e) { create_tango_exception (e, "Read failure" , "Cannot read the actual current set point values", "Bilt::set_pole_current"); } } //+------------------------------------------------------------------ /** * method: Bilt::create_tango_exception() * * description: convert an itest exception into a tango exception * * * in : - &e : Reference to itest exception * - reason : Reason of the local Tango exception to be added to the stack * - desc : Description for the local Tango exception to be added to the stack * - origin : Origin if the local Tango exception to be added to the stack */ //+------------------------------------------------------------------ void Bilt::create_tango_exception (itest::ItestException &e, string reason, string desc, string origin) { Tango::DevErrorList errors; create_tango_exception (e, errors, reason, desc, origin); } //+------------------------------------------------------------------ /** * method: Bilt::create_tango_exception() * * description: convert an itest exception into a tango exception * * * in : - &e : Reference to itest exception * - errors : Tango error list to use, to store exception info * - reason : Reason of the local Tango exception to be added to the stack * - desc : Description for the local Tango exception to be added to the stack * - origin : Origin if the local Tango exception to be added to the stack */ //+------------------------------------------------------------------ void Bilt::create_tango_exception (itest::ItestException &e, Tango::DevErrorList &errors, string reason, string desc, string origin) { DEBUG_STREAM << "Bilt::create_tango_exception(): entering... !" << endl; errors.length(e.errors.size() + 1); int i; for(i=0; idevice_status data member) and returns it to the caller. * * @return Status description * */ //+------------------------------------------------------------------ Tango::ConstDevString Bilt::dev_status() { //Tango::ConstDevString argout = DeviceImpl::dev_status(); DEBUG_STREAM << "Bilt::dev_status(): entering... !" << endl; // Add your own code to control device here stringstream status; Tango::DevState state = dev_state(); switch (state) { case Tango::ON: status << "State : ON" << endl; break; case Tango::OFF: status << "State : OFF" << endl; break; case Tango::ALARM: { status << "State : Alarm" << endl; omni_mutex_lock l(data_mutex); for (int i=0; i 10W in 10ms!" << endl; else { if ( mdata.idata[i].fail == "TEMP" ) status << "Fault descr. : Max. temp on semiconductor reached!" << endl; else { if ( mdata.idata[i].fail == "PWSO" ) status << "Fault descr. : Delivered power > 40W in 100ms!" << endl; else { status << "Fault descr. : Unkown fault code!" << endl; } } } } } } } break; } default: { status << "Pole state : Unknown" << endl; status << "Error stack : " << endl; omni_mutex_lock l(data_mutex); for(int i=0; idevice_state data member) and returns it to the caller. * * @return State Code * */ //+------------------------------------------------------------------ Tango::DevState Bilt::dev_state() { Tango::DevState argout = DeviceImpl::dev_state(); DEBUG_STREAM << "Bilt::dev_state(): entering... !" << endl; // Add your own code to control device here int state; omni_mutex_lock l(data_mutex); try { //read_mdata(); state = mdata.state; INFO_STREAM << "magnet state for " << get_name() << " = " << state << endl; } catch (Tango::DevFailed &e) { // do nothing! // Just avoid exceptions when executing state or status! } if ( mdata_errors.length() != 0 ) set_state (Tango::UNKNOWN); else { // set the device state switch (state) { case 0: set_state (Tango::OFF); break; case 1: set_state (Tango::ON); break; case 2: set_state (Tango::ALARM); break; case 3: set_state (Tango::FAULT); break; default: set_state (Tango::UNKNOWN); break; } } // Check for attribute alarms if ( get_state() == Tango::ON && argout == Tango::ALARM ) set_state (Tango::ALARM); return get_state(); } //+------------------------------------------------------------------ /** * method: Bilt::setpoint_check * * description: method to execute "SetpointCheck" * Check the given current values against the specified limits. * * @param argin Setpoint values for the Poles * @return true when settings are OK * */ //+------------------------------------------------------------------ Tango::DevBoolean Bilt::setpoint_check(const Tango::DevVarDoubleArray *argin) { Tango::DevBoolean argout ; DEBUG_STREAM << "Bilt::setpoint_check(): entering... !" << endl; // Add your own code to control device here // get the min and max values for the current settings Tango::MultiAttribute *attr_list = get_device_attr(); Tango::WAttribute &attr_curr = attr_list->get_w_attr_by_name ("Currents"); double min, max; attr_curr.get_min_value(min); attr_curr.get_max_value(max); INFO_STREAM << "min = " << min << " max = " << max << endl; // check the input values argout = true; for ( int i=0; ilength(); i++ ) { INFO_STREAM << "i = " << i << " curr = " << (*argin)[i] << endl; if ( (*argin)[i] < min || (*argin)[i] > max ) { argout = false; break; } } return argout; } } // namespace Revision-number: 29 Prop-content-length: 121 Content-length: 121 K 10 svn:author V 5 meyer K 8 svn:date V 27 2010-02-18T19:19:36.000000Z K 7 svn:log V 21 Added Steerer class. PROPS-END Node-path: powersupply/itest/Bilt/trunk/ClassFactory.cpp Node-kind: file Node-action: change Text-content-length: 1861 Text-content-md5: 03945084cb496a51d61d75e7f4acae49 Content-length: 1861 static const char *RcsId = "$Id: ClassFactory.cpp,v 1.3 2010-02-18 19:19:36 meyer Exp $"; //+============================================================================= // // file : ClassFactory.cpp // // description : C++ source for the class_factory method of the DServer // device class. This method is responsible for the creation of // all class singleton for a device server. It is called // at device server startup // // project : TANGO Device Server // // $Author: meyer $ // // $Revision: 1.3 $ // $Date: 2010-02-18 19:19:36 $ // // SVN only: // $HeadURL: $ // // CVS only: // $Source: /segfs/tango/cvsroot/cppserver/machine/powersupply/SrSteerers/tango/Bilt/ClassFactory.cpp,v $ // $Log: not supported by cvs2svn $ // Revision 1.2 2010/02/10 12:27:31 meyer // Restructured Bilt class. // Acquistion is now done by a thread and only the multi channel data // gets exported. A single channel class (BiltCh) was created. // // Revision 1.1.1.1 2009/11/04 16:23:02 meyer // Imported using TkCVS // // // copyleft : European Synchrotron Radiation Facility // BP 220, Grenoble 38043 // FRANCE // //-============================================================================= // // This file is generated by POGO // (Program Obviously used to Generate tango Object) // // (c) - Software Engineering Group - ESRF //============================================================================= #include #include #include #include /** * Create BiltClass singleton and store it in DServer object. */ void Tango::DServer::class_factory() { add_class(Bilt_ns::BiltClass::init("Bilt")); add_class(BiltCh_ns::BiltChClass::init("BiltCh")); add_class(Steerer_ns::SteererClass::init("Steerer")); } Revision-number: 30 Prop-content-length: 127 Content-length: 127 K 10 svn:author V 5 meyer K 8 svn:date V 27 2010-03-16T14:54:58.000000Z K 7 svn:log V 27 Added reconnection method. PROPS-END Node-path: powersupply/itest/Bilt/trunk/AcquisitionThread.cpp Node-kind: file Node-action: change Text-content-length: 7468 Text-content-md5: 03581c2a86aeecfc49705bc727715c52 Content-length: 7468 #include #include namespace Bilt_ns { AcquisitionThread::AcquisitionThread (Bilt *_bilt_ps, omni_mutex &d_m, omni_mutex &bilt_m) : Tango::LogAdapter(_bilt_ps), omni_thread(), data_mutex(d_m), bilt_mutex(bilt_m) { bilt_ps = _bilt_ps; last_update.tv_sec = 0; last_update.tv_usec = 0; updatePeriod = bilt_ps->updatePeriod; // cout << "AcquisitionThread::AcquisitionThread(): go to start thread ...\n"; start_undetached(); } //+------------------------------------------------------------------ /** * method: run_undetached() * * description: * */ //+------------------------------------------------------------------ void *AcquisitionThread::run_undetached(void*) { bool exit; INFO_STREAM << " AcquisitionThread::run_undetached() entering endless loop!" << endl; while (1) { { // copy to local variables omni_mutex_lock l(data_mutex); exit = bilt_ps->exit_thread; bilt_connection_lost = bilt_ps->bilt_connection_lost; } /* exit the calculation thread */ if ( exit == true ) { break; } struct timeval now; gettimeofday (&now, NULL); double delay = (now.tv_sec * 1e6 + now.tv_usec) - (last_update.tv_sec * 1e6 + last_update.tv_usec); // only read new data every updatePeriod ms!! if ( delay < (updatePeriod * 1000) ) { // 20 ms struct timespec sleep_time = {0, SLEEP_NS}; nanosleep(&sleep_time, NULL); continue; } else { INFO_STREAM << "delay = " << delay/1000 << "ms" << endl; last_update = now; } // reset error variables mdata_errors.length(0); fdata_errors.length(0); // read_mdata() try { { // testing //mdata.state = -2; //mdata.idata[0].state = -2; //mdata.idata[1].state = -2; //mdata.idata[2].state = -2; //mdata.idata[0].meascurr = -2; //mdata.idata[1].meascurr = -2; //mdata.idata[2].meascurr = -2; omni_mutex_lock l(bilt_mutex); // check for a lost connection and try // to reconnect if necessary if ( bilt_connection_lost ) { bilt_reconnect(); } bilt_ps->BILT->get_mdata (&mdata); // testing //cout << "mag num = " << mdata.magnet << endl; //cout << "mag state = " << mdata.state << endl; //cout << "pole 0 = " << mdata.idata[0].state << " : " << mdata.idata[0].meascurr << endl; //cout << "pole 1 = " << mdata.idata[1].state << " : " << mdata.idata[1].meascurr << endl; //cout << "pole 2 = " << mdata.idata[2].state << " : " << mdata.idata[2].meascurr << endl<< endl; } mdata_errors.length(0); } catch (itest::ItestException &e) { create_tango_error (e, mdata_errors, "Read failure" , "Cannot read the mdata structure", "AcquisitionThread::run_undetached"); } // read_fdata() try { for (int i=0; iBILT->pole(i).get_fdata (&fdata[i]); } fdata_errors.length(0); } catch (itest::ItestException &e) { create_tango_error (e, fdata_errors, "Read failure" , "Cannot read the fdata structure", "AcquisitionThread::run_undetached"); } { struct timeval now; gettimeofday (&now, NULL); // copy the read data omni_mutex_lock l(data_mutex); bilt_ps->mdata_errors = mdata_errors; bilt_ps->fdata_errors = fdata_errors; bilt_ps->mdata.magnet = mdata.magnet; bilt_ps->mdata.state = mdata.state; for (int i=0; imdata.idata[i].magnet = mdata.idata[i].magnet; bilt_ps->mdata.idata[i].pole = mdata.idata[i].pole; bilt_ps->mdata.idata[i].state = mdata.idata[i].state; bilt_ps->mdata.idata[i].fail = mdata.idata[i].fail; bilt_ps->mdata.idata[i].measvolt = mdata.idata[i].measvolt; bilt_ps->mdata.idata[i].meascurr = mdata.idata[i].meascurr; bilt_ps->fdata[i].nbrframe_sec = fdata[i].nbrframe_sec; bilt_ps->fdata[i].nbrferr_sec = fdata[i].nbrferr_sec; bilt_ps->fdata[i].rms_ac_sett_sec = fdata[i].rms_ac_sett_sec; bilt_ps->fdata[i].average_sett_sec = fdata[i].average_sett_sec; bilt_ps->fdata[i].nbrferr = fdata[i].nbrferr; } // store time when data was read bilt_ps->data_read_time = now; } } return NULL; } //+------------------------------------------------------------------ /** * method: AcquisitionThread::create_tango_error() * * description: convert an itest exception into a tango error * * * in : - &e : Reference to itest exception * - errors : Tango error list to use, to store exception info * - reason : Reason of the local Tango exception to be added to the stack * - desc : Description for the local Tango exception to be added to the stack * - origin : Origin if the local Tango exception to be added to the stack */ //+------------------------------------------------------------------ void AcquisitionThread::create_tango_error (itest::ItestException &e, Tango::DevErrorList &errors, string reason, string desc, string origin) { DEBUG_STREAM << "Bilt::create_tango_exception(): entering... !" << endl; errors.length(e.errors.size() + 1); int i; for(i=0; iiPAddress.c_str(), bilt_ps->magnetNumber); struct itest::mdata mdata_test; new_handle->get_mdata (&mdata_test); } catch (itest::ItestException &e) { DEBUG_STREAM << "Reconnection failed with error: " << endl; for(int i=0; i #include #include #include #include namespace Bilt_ns { //+---------------------------------------------------------------------------- // // method : Bilt::Bilt(string &s) // // description : constructor for simulated Bilt // // in : - cl : Pointer to the DeviceClass object // - s : Device name // //----------------------------------------------------------------------------- Bilt::Bilt(Tango::DeviceClass *cl,string &s) :Tango::Device_4Impl(cl,s.c_str()) { init_device(); } Bilt::Bilt(Tango::DeviceClass *cl,const char *s) :Tango::Device_4Impl(cl,s) { init_device(); } Bilt::Bilt(Tango::DeviceClass *cl,const char *s,const char *d) :Tango::Device_4Impl(cl,s,d) { init_device(); } //+---------------------------------------------------------------------------- // // method : Bilt::delete_device() // // description : will be called at device destruction or at init command. // //----------------------------------------------------------------------------- void Bilt::delete_device() { // Delete device allocated objects if ( acquisition_thread != NULL ) { data_mutex.lock(); exit_thread = true; data_mutex.unlock(); // join now the thread until it exits int *rv; acquisition_thread->join((void **)&rv); cout << "Bilt::delete_device(): Exit acquisition thread !!!" << endl; } // Delete connection to the power supply delete BILT; BILT = NULL; } //+---------------------------------------------------------------------------- // // method : Bilt::init_device() // // description : will be called at device initialization. // //----------------------------------------------------------------------------- void Bilt::init_device() { INFO_STREAM << "Bilt::Bilt() create device " << device_name << endl; // Initialise variables to default values //-------------------------------------------- get_device_property(); set_state (Tango::OFF); try { BILT = new itest::TMagnet (iPAddress.c_str(), magnetNumber); } catch (itest::ItestException &e) { try { create_tango_exception (e, mdata_errors, "Init failure" , "Cannot initialise ITEST libray objects", "Bilt::init_device"); } catch (Tango::DevFailed &e) { set_state (Tango::UNKNOWN); } } // initialise with the actual current set point values try { for (int i=0; ipole(i).get_current_DC(); } Tango::MultiAttribute *attr_list = get_device_attr(); Tango::WAttribute &attr_curr = attr_list->get_w_attr_by_name ("Currents"); attr_curr.set_write_value(¤ts_dc[0], currents_dc.size()); } catch (itest::ItestException &e) { try { create_tango_exception (e, mdata_errors, "Init failure" , "Cannot read the actual current set point values", "Bilt::init_device"); } catch (Tango::DevFailed &e) { set_state (Tango::UNKNOWN); } } // initialise and start the acquisition thread exit_thread = false; acquisition_thread = new AcquisitionThread(this, data_mutex, bilt_mutex); } //+---------------------------------------------------------------------------- // // method : Bilt::get_device_property() // // description : Read the device properties from database. // //----------------------------------------------------------------------------- void Bilt::get_device_property() { // Initialize your default values here (if not done with POGO). //------------------------------------------------------------------ BILT = NULL; bilt_connection_lost = false; acquisition_thread = NULL; struct timeval now; gettimeofday (&now, NULL); data_set_time = now; data_read_time = now; // intitialise mdada structure for magnet read values mdata.magnet = -1; mdata.state = -1; for (int i=0; i_UseDb==true) get_db_device()->get_property(dev_prop); Tango::DbDatum def_prop, cl_prop; BiltClass *ds_class = (static_cast(get_device_class())); int i = -1; // Try to initialize IPAddress from class property cl_prop = ds_class->get_class_property(dev_prop[++i].name); if (cl_prop.is_empty()==false) cl_prop >> iPAddress; else { // Try to initialize IPAddress from default device value def_prop = ds_class->get_default_device_property(dev_prop[i].name); if (def_prop.is_empty()==false) def_prop >> iPAddress; } // And try to extract IPAddress value from database if (dev_prop[i].is_empty()==false) dev_prop[i] >> iPAddress; // Try to initialize MagnetNumber from class property cl_prop = ds_class->get_class_property(dev_prop[++i].name); if (cl_prop.is_empty()==false) cl_prop >> magnetNumber; else { // Try to initialize MagnetNumber from default device value def_prop = ds_class->get_default_device_property(dev_prop[i].name); if (def_prop.is_empty()==false) def_prop >> magnetNumber; } // And try to extract MagnetNumber value from database if (dev_prop[i].is_empty()==false) dev_prop[i] >> magnetNumber; // Try to initialize UpdatePeriod from class property cl_prop = ds_class->get_class_property(dev_prop[++i].name); if (cl_prop.is_empty()==false) cl_prop >> updatePeriod; else { // Try to initialize UpdatePeriod from default device value def_prop = ds_class->get_default_device_property(dev_prop[i].name); if (def_prop.is_empty()==false) def_prop >> updatePeriod; } // And try to extract UpdatePeriod value from database if (dev_prop[i].is_empty()==false) dev_prop[i] >> updatePeriod; // End of Automatic code generation //------------------------------------------------------------------ } //+---------------------------------------------------------------------------- // // method : Bilt::always_executed_hook() // // description : method always executed before any command is executed // //----------------------------------------------------------------------------- void Bilt::always_executed_hook() { } //+---------------------------------------------------------------------------- // // method : Bilt::read_attr_hardware // // description : Hardware acquisition for attributes. // //----------------------------------------------------------------------------- void Bilt::read_attr_hardware(vector &attr_list) { DEBUG_STREAM << "Bilt::read_attr_hardware(vector &attr_list) entering... "<< endl; // Add your own code here } //+---------------------------------------------------------------------------- // // method : Bilt::read_FramesPerSecond // // description : Extract real attribute values for FramesPerSecond acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_FramesPerSecond(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_FramesPerSecond(Tango::Attribute &attr) entering... "<< endl; omni_mutex_lock l(data_mutex); if ( fdata_errors.length() != 0 ) attr.set_quality(Tango::ATTR_INVALID); else { for (int i=0; ipole(i).get_switch(); } if ( switch_state == 1 ) local_control[i] = false; else local_control[i] = true; } } catch (itest::ItestException &e) { create_tango_exception (e, "Read failure" , "Cannot read the actual switch states", "Bilt::read_LocalControls"); } attr.set_value (&(local_control[0]), POLES); } //+---------------------------------------------------------------------------- // // method : Bilt::read_SetCurrentsRMS // // description : Extract real attribute values for SetCurrentsRMS acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_SetCurrentsRMS(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_SetCurrentsRMS(Tango::Attribute &attr) entering... "<< endl; omni_mutex_lock l(data_mutex); if ( fdata_errors.length() != 0 ) attr.set_quality(Tango::ATTR_INVALID); else { for (int i=0; i CURRENT_LIMIT ) impedances[i] = fabs (mdata.idata[i].measvolt / mdata.idata[i].meascurr); else impedances[i] = nan("NaN"); } } attr.set_value (&(impedances[0]), POLES); } //+---------------------------------------------------------------------------- // // method : Bilt::write_Currents // // description : Write Currents attribute values to hardware. // //----------------------------------------------------------------------------- void Bilt::write_Currents(Tango::WAttribute &attr) { DEBUG_STREAM << "Bilt::write_Currents(Tango::WAttribute &attr) entering... "<< endl; const double *set_currents; // check the correct number of setpoints if ( attr.get_write_value_length() == POLES ) attr.get_write_value(set_currents); else { TangoSys_MemStream tms; tms << "Wrong number of setpoints!" << endl; Tango::Except::throw_exception("WriteError", tms.str(), "Bilt::write_Currents"); } // apply setpoints to the poles try { for (int i=0; ipole(i).set_current_DC (set_currents[i]); } } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot write DC current values", "Bilt::write_Currents"); } // initialise the set time, to be sure that the next // returned read value is newer and contains the changes. struct timeval now; gettimeofday (&now, NULL); data_set_time = now; } //+---------------------------------------------------------------------------- // // method : Bilt::read_Currents // // description : Extract real attribute values for Currents acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_Currents(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_Currents(Tango::Attribute &attr) entering... "<< endl; // wait for the next data acquisition afer a current setpoint change double delay; { omni_mutex_lock l(data_mutex); delay = (data_set_time.tv_sec * 1e6 + data_set_time.tv_usec) - (data_read_time.tv_sec * 1e6 + data_read_time.tv_usec); //cout << "delay = " << delay << endl; } while ( delay > 0 ) { // 20 ms struct timespec sleep_time = {0, SLEEP_NS}; nanosleep(&sleep_time, NULL); omni_mutex_lock l(data_mutex); delay = (data_set_time.tv_sec * 1e6 + data_set_time.tv_usec) - (data_read_time.tv_sec * 1e6 + data_read_time.tv_usec); INFO_STREAM << "read waiting delay = " << delay << endl; } omni_mutex_lock l(data_mutex); if ( mdata_errors.length() != 0 ) attr.set_quality(Tango::ATTR_INVALID); else { for (int i=0; iset_state(1); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot switch on pole", "Bilt::on"); } } //+------------------------------------------------------------------ /** * method: Bilt::off * * description: method to execute "Off" * Turns of power supply * * */ //+------------------------------------------------------------------ void Bilt::off() { DEBUG_STREAM << "Bilt::off(): entering... !" << endl; // Add your own code to control device here try { omni_mutex_lock l(bilt_mutex); BILT->set_state(0); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot switch off pole", "Bilt::off"); } } //+------------------------------------------------------------------ /** * method: Bilt::reset * * description: method to execute "Reset" * Reset faults and alarms * * */ //+------------------------------------------------------------------ void Bilt::reset() { DEBUG_STREAM << "Bilt::reset(): entering... !" << endl; // Add your own code to control device here try { omni_mutex_lock l(bilt_mutex); BILT->clear_all_err(); BILT->clear_alarm(); for (int i=0; ipole(i).clear_ferrors(); } } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot reset pole", "Bilt::reset"); } } //+------------------------------------------------------------------ /** * method: Bilt::set_pole_ac_current * * description: method to execute "SetPoleAcCurrent" * Set the AC current for one Pole. * [0] = pole number, [1] = current * * @param argin * */ //+------------------------------------------------------------------ void Bilt::set_pole_ac_current(const Tango::DevVarDoubleArray *argin) { DEBUG_STREAM << "Bilt::set_pole_ac_current(): entering... !" << endl; // Add your own code to control device here // argin[0] = pole number if ( (*argin)[0] < 0 || (*argin)[0] >= POLES ) { TangoSys_MemStream tms; tms << "The entered Pole number is out of range" << endl; Tango::Except::throw_exception("WriteError", tms.str(), "Bilt::set_pole_ac_current"); } try { omni_mutex_lock l(bilt_mutex); BILT->pole((int)(*argin)[0]).set_current_AC ((*argin)[1]); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot write AC current value", "Bilt::set_pole_ac_current"); } } //+------------------------------------------------------------------ /** * method: Bilt::local_pole_control * * description: method to execute "LocalPoleControl" * Set the AC current for one Pole. * [0] = pole number, [1] = local control true/false * * @param argin * */ //+------------------------------------------------------------------ void Bilt::local_pole_control(const Tango::DevVarShortArray *argin) { DEBUG_STREAM << "Bilt::local_pole_control(): entering... !" << endl; // Add your own code to control device here // argin[0] = pole number if ( (*argin)[0] < 0 || (*argin)[0] >= POLES ) { TangoSys_MemStream tms; tms << "The entered Pole number is out of range" << endl; Tango::Except::throw_exception("WriteError", tms.str(), "Bilt::local_pole_control"); } // argin[1] = true or false (1 or 0 ) if ( (*argin)[1] != 0 && (*argin)[1] != 1 ) { TangoSys_MemStream tms; tms << "Local control can only be choosen as 0 or 1 (false or true)" << endl; Tango::Except::throw_exception("WriteError", tms.str(), "Bilt::local_pole_control"); } try { int switch_state; if ( (*argin)[1] == true ) switch_state = 0; else switch_state = 1; omni_mutex_lock l(bilt_mutex); BILT->pole((*argin)[0]).set_switch (switch_state); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot write switch state", "Bilt::local_pole_control"); } } //+------------------------------------------------------------------ /** * method: Bilt::set_pole_current * * description: method to execute "SetPoleCurrent" * Set the current for one Pole. * [0] = pole number, [1] = current * * @param argin * */ //+------------------------------------------------------------------ void Bilt::set_pole_current(const Tango::DevVarDoubleArray *argin) { DEBUG_STREAM << "Bilt::set_pole_current(): entering... !" << endl; // Add your own code to control device here // argin[0] = pole number if ( (*argin)[0] < 0 || (*argin)[0] >= POLES ) { TangoSys_MemStream tms; tms << "The entered Pole number is out of range" << endl; Tango::Except::throw_exception("WriteError", tms.str(), "Bilt::set_pole_current"); } try { omni_mutex_lock l(bilt_mutex); BILT->pole((int)(*argin)[0]).set_current_DC ((*argin)[1]); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot write current value", "Bilt::set_pole_current"); } // make sure that the current set values are correct! try { omni_mutex_lock l(bilt_mutex); for (int i=0; ipole(i).get_current_DC(); } Tango::MultiAttribute *attr_list = get_device_attr(); Tango::WAttribute &attr_curr = attr_list->get_w_attr_by_name ("Currents"); attr_curr.set_write_value(¤ts_dc[0], currents_dc.size()); } catch (itest::ItestException &e) { create_tango_exception (e, "Read failure" , "Cannot read the actual current set point values", "Bilt::set_pole_current"); } } //+------------------------------------------------------------------ /** * method: Bilt::create_tango_exception() * * description: convert an itest exception into a tango exception * * * in : - &e : Reference to itest exception * - reason : Reason of the local Tango exception to be added to the stack * - desc : Description for the local Tango exception to be added to the stack * - origin : Origin if the local Tango exception to be added to the stack */ //+------------------------------------------------------------------ void Bilt::create_tango_exception (itest::ItestException &e, string reason, string desc, string origin) { Tango::DevErrorList errors; create_tango_exception (e, errors, reason, desc, origin); } //+------------------------------------------------------------------ /** * method: Bilt::create_tango_exception() * * description: convert an itest exception into a tango exception * * * in : - &e : Reference to itest exception * - errors : Tango error list to use, to store exception info * - reason : Reason of the local Tango exception to be added to the stack * - desc : Description for the local Tango exception to be added to the stack * - origin : Origin if the local Tango exception to be added to the stack */ //+------------------------------------------------------------------ void Bilt::create_tango_exception (itest::ItestException &e, Tango::DevErrorList &errors, string reason, string desc, string origin) { DEBUG_STREAM << "Bilt::create_tango_exception(): entering... !" << endl; errors.length(e.errors.size() + 1); int i; for(i=0; idevice_status data member) and returns it to the caller. * * @return Status description * */ //+------------------------------------------------------------------ Tango::ConstDevString Bilt::dev_status() { //Tango::ConstDevString argout = DeviceImpl::dev_status(); DEBUG_STREAM << "Bilt::dev_status(): entering... !" << endl; // Add your own code to control device here stringstream status; Tango::DevState state = dev_state(); switch (state) { case Tango::ON: status << "State : ON" << endl; break; case Tango::OFF: status << "State : OFF" << endl; break; case Tango::ALARM: { status << "State : Alarm" << endl; omni_mutex_lock l(data_mutex); for (int i=0; i 10W in 10ms!" << endl; else { if ( mdata.idata[i].fail == "TEMP" ) status << "Fault descr. : Max. temp on semiconductor reached!" << endl; else { if ( mdata.idata[i].fail == "PWSO" ) status << "Fault descr. : Delivered power > 40W in 100ms!" << endl; else { status << "Fault descr. : Unkown fault code!" << endl; } } } } } } } break; } default: { { omni_mutex_lock l(data_mutex); status << "BILT state : Unknown" << endl; if ( bilt_connection_lost == true ) { status << "Connection lost to BILT power supply, trying to reconnect!" << endl; status << endl; } if ( mdata_errors.length() > 0 ) status << "Error stack : " << endl; for(int i=0; idevice_state data member) and returns it to the caller. * * @return State Code * */ //+------------------------------------------------------------------ Tango::DevState Bilt::dev_state() { Tango::DevState argout = DeviceImpl::dev_state(); DEBUG_STREAM << "Bilt::dev_state(): entering... !" << endl; // Add your own code to control device here int state; omni_mutex_lock l(data_mutex); try { //read_mdata(); state = mdata.state; INFO_STREAM << "magnet state for " << get_name() << " = " << state << endl; } catch (Tango::DevFailed &e) { // do nothing! // Just avoid exceptions when executing state or status! } INFO_STREAM << "mdata errors = " << mdata_errors.length() << endl; if ( mdata_errors.length() != 0 ) set_state (Tango::UNKNOWN); else { // set the device state switch (state) { case -1: set_state (Tango::UNKNOWN); bilt_connection_lost = true; break; case 0: set_state (Tango::OFF); break; case 1: set_state (Tango::ON); break; case 2: set_state (Tango::ALARM); break; case 3: set_state (Tango::FAULT); break; default: set_state (Tango::UNKNOWN); break; } } // Check for attribute alarms if ( get_state() == Tango::ON && argout == Tango::ALARM ) set_state (Tango::ALARM); return get_state(); } //+------------------------------------------------------------------ /** * method: Bilt::setpoint_check * * description: method to execute "SetpointCheck" * Check the given current values against the specified limits. * * @param argin Setpoint values for the Poles * @return true when settings are OK * */ //+------------------------------------------------------------------ Tango::DevBoolean Bilt::setpoint_check(const Tango::DevVarDoubleArray *argin) { Tango::DevBoolean argout ; DEBUG_STREAM << "Bilt::setpoint_check(): entering... !" << endl; // Add your own code to control device here // get the min and max values for the current settings Tango::MultiAttribute *attr_list = get_device_attr(); Tango::WAttribute &attr_curr = attr_list->get_w_attr_by_name ("Currents"); double min, max; attr_curr.get_min_value(min); attr_curr.get_max_value(max); INFO_STREAM << "min = " << min << " max = " << max << endl; // check the input values argout = true; for ( int i=0; ilength(); i++ ) { INFO_STREAM << "i = " << i << " curr = " << (*argin)[i] << endl; if ( (*argin)[i] < min || (*argin)[i] > max ) { argout = false; break; } } return argout; } } // namespace Node-path: powersupply/itest/Bilt/trunk/Bilt.h Node-kind: file Node-action: change Text-content-length: 11650 Text-content-md5: 86cd34943e85d420890f275e483b4e09 Content-length: 11650 //============================================================================= // // file : Bilt.h // // description : Include for the Bilt class. // // project : BILT multi channel power supply // // $Author: meyer $ // // $Revision: 1.8 $ // $Date: 2010-03-16 14:54:58 $ // // SVN only: // $HeadURL: $ // // CVS only: // $Source: /segfs/tango/cvsroot/cppserver/machine/powersupply/SrSteerers/tango/Bilt/Bilt.h,v $ // $Log: not supported by cvs2svn $ // Revision 1.7 2010-02-12 16:35:13 meyer // Added SetPoleCurrent command again. // // Revision 1.6 2010-02-11 16:35:27 meyer // Currents settings understand NaN values. // Deleted StePoleCurrent command. // // Revision 1.5 2010/02/10 12:27:31 meyer // Restructured Bilt class. // Acquistion is now done by a thread and only the multi channel data // gets exported. A single channel class (BiltCh) was created. // // Revision 1.4 2009/11/27 13:49:26 meyer // Modified structure! The pole is no longer a device. // The device is now a magnet with three poles. // // Revision 1.3 2009/11/26 10:46:58 meyer // Updated for libMagnet_V120 // // Revision 1.2 2009/11/06 12:46:25 meyer // Added impedance attribute and corrected fromatting of attribute values. // // Revision 1.1.1.1 2009/11/04 16:23:02 meyer // Imported using TkCVS // // // copyleft : European Synchrotron Radiation Facility // BP 220, Grenoble 38043 // FRANCE // //============================================================================= // // This file is generated by POGO // (Program Obviously used to Generate tango Object) // // (c) - Software Engineering Group - ESRF //============================================================================= #ifndef _BILT_H #define _BILT_H #include #include #include //using namespace Tango; /** * @author $Author: meyer $ * @version $Revision: 1.8 $ */ // Add your own constant definitions here. //----------------------------------------------- // Number of poles per magnet #define POLES 3 // Current limit for a valid impedeance calculation #define CURRENT_LIMIT 0.005 // define sleep times #define SLEEP_NS 20000000 // 20 ms namespace Bilt_ns { /** * Class Description: * The BILT multi channel power supply will be used with 3 channels for the ESRF fast * feedback systems. * The power supply can be controlled in 2 ways : * By this device server for slow or human control or * by the Libera Beam Position monitors for fast feedback with closed loop control. * The devices are exported as one device per steerer magnet. Every device has three * channels. The channels (poles) cannot be switched on individually but have their * individual set points and measurement values. */ /* * Device States Description: * Tango::ON : Magnet is ON, all three channels are ON. * Tango::OFF : Magnet is OFF, all three channels are OFF. * Tango::FAULT : Error detected by the BILT magnet. * Tango::ALARM : Alarm detected on one or more channels. * Tango::UNKNOWN : Communication fault */ class Bilt: public Tango::Device_4Impl { public : // Add your own data members here //----------------------------------------- // Here is the Start of the automatic code generation part //------------------------------------------------------------- /** * @name attributes * Attribute member data. */ //@{ Tango::DevDouble *attr_Currents_read; Tango::DevDouble attr_Currents_write; Tango::DevDouble *attr_Voltages_read; Tango::DevDouble *attr_Impedances_read; Tango::DevDouble *attr_SetCurrentsRMS_read; Tango::DevDouble *attr_SetCurrentsAverage_read; Tango::DevULong *attr_FramesPerSecond_read; Tango::DevULong *attr_ErrorsPerSecond_read; Tango::DevULong *attr_ErrorCounters_read; Tango::DevBoolean *attr_LocalControls_read; //@} /** * @name Device properties * Device properties member data. */ //@{ /** * IP Address of BILT controller. * Each controller includes several magnets and * each magnet includes 3 power supplies, * for corrections in the X, Y and Z planes. * * */ string iPAddress; /** * Magnet number from 1 to 48 */ Tango::DevShort magnetNumber; /** * The update period for the data reading from the power supply in milli seconds. */ Tango::DevLong updatePeriod; //@} /** * @name Device properties * Device property member data. */ //@{ //@} /**@name Constructors * Miscellaneous constructors */ //@{ /** * Constructs a newly allocated Command object. * * @param cl Class. * @param s Device Name */ Bilt(Tango::DeviceClass *cl,string &s); /** * Constructs a newly allocated Command object. * * @param cl Class. * @param s Device Name */ Bilt(Tango::DeviceClass *cl,const char *s); /** * Constructs a newly allocated Command object. * * @param cl Class. * @param s Device name * @param d Device description. */ Bilt(Tango::DeviceClass *cl,const char *s,const char *d); //@} /**@name Destructor * Only one destructor is defined for this class */ //@{ /** * The object destructor. */ ~Bilt() {delete_device();}; /** * will be called at device destruction or at init command. */ void delete_device(); //@} /**@name Miscellaneous methods */ //@{ /** * Initialize the device */ virtual void init_device(); /** * Always executed method before execution command method. */ virtual void always_executed_hook(); //@} /** * @name Bilt methods prototypes */ //@{ /** * Hardware acquisition for attributes. */ virtual void read_attr_hardware(vector &attr_list); /** * Extract real attribute values for Currents acquisition result. */ virtual void read_Currents(Tango::Attribute &attr); /** * Write Currents attribute values to hardware. */ virtual void write_Currents(Tango::WAttribute &attr); /** * Extract real attribute values for Voltages acquisition result. */ virtual void read_Voltages(Tango::Attribute &attr); /** * Extract real attribute values for Impedances acquisition result. */ virtual void read_Impedances(Tango::Attribute &attr); /** * Extract real attribute values for SetCurrentsRMS acquisition result. */ virtual void read_SetCurrentsRMS(Tango::Attribute &attr); /** * Extract real attribute values for SetCurrentsAverage acquisition result. */ virtual void read_SetCurrentsAverage(Tango::Attribute &attr); /** * Extract real attribute values for FramesPerSecond acquisition result. */ virtual void read_FramesPerSecond(Tango::Attribute &attr); /** * Extract real attribute values for ErrorsPerSecond acquisition result. */ virtual void read_ErrorsPerSecond(Tango::Attribute &attr); /** * Extract real attribute values for ErrorCounters acquisition result. */ virtual void read_ErrorCounters(Tango::Attribute &attr); /** * Extract real attribute values for LocalControls acquisition result. */ virtual void read_LocalControls(Tango::Attribute &attr); /** * Read/Write allowed for Currents attribute. */ virtual bool is_Currents_allowed(Tango::AttReqType type); /** * Read/Write allowed for Voltages attribute. */ virtual bool is_Voltages_allowed(Tango::AttReqType type); /** * Read/Write allowed for Impedances attribute. */ virtual bool is_Impedances_allowed(Tango::AttReqType type); /** * Read/Write allowed for SetCurrentsRMS attribute. */ virtual bool is_SetCurrentsRMS_allowed(Tango::AttReqType type); /** * Read/Write allowed for SetCurrentsAverage attribute. */ virtual bool is_SetCurrentsAverage_allowed(Tango::AttReqType type); /** * Read/Write allowed for FramesPerSecond attribute. */ virtual bool is_FramesPerSecond_allowed(Tango::AttReqType type); /** * Read/Write allowed for ErrorsPerSecond attribute. */ virtual bool is_ErrorsPerSecond_allowed(Tango::AttReqType type); /** * Read/Write allowed for ErrorCounters attribute. */ virtual bool is_ErrorCounters_allowed(Tango::AttReqType type); /** * Read/Write allowed for LocalControls attribute. */ virtual bool is_LocalControls_allowed(Tango::AttReqType type); /** * Execution allowed for On command. */ virtual bool is_On_allowed(const CORBA::Any &any); /** * Execution allowed for Off command. */ virtual bool is_Off_allowed(const CORBA::Any &any); /** * Execution allowed for Reset command. */ virtual bool is_Reset_allowed(const CORBA::Any &any); /** * Execution allowed for SetPoleAcCurrent command. */ virtual bool is_SetPoleAcCurrent_allowed(const CORBA::Any &any); /** * Execution allowed for LocalPoleControl command. */ virtual bool is_LocalPoleControl_allowed(const CORBA::Any &any); /** * Execution allowed for SetpointCheck command. */ virtual bool is_SetpointCheck_allowed(const CORBA::Any &any); /** * Execution allowed for SetPoleCurrent command. */ virtual bool is_SetPoleCurrent_allowed(const CORBA::Any &any); /** * This command gets the device state (stored in its device_state data member) and returns it to the caller. * @return State Code * @exception DevFailed */ virtual Tango::DevState dev_state(); /** * This command gets the device status (stored in its device_status data member) and returns it to the caller. * @return Status description * @exception DevFailed */ virtual Tango::ConstDevString dev_status(); /** * Turns on power supply. * @exception DevFailed */ void on(); /** * Turns of power supply * @exception DevFailed */ void off(); /** * Reset faults and alarms * @exception DevFailed */ void reset(); /** * Set the AC current for one Pole. * [0] = pole number, [1] = current * @param argin * @exception DevFailed */ void set_pole_ac_current(const Tango::DevVarDoubleArray *); /** * Set the AC current for one Pole. * [0] = pole number, [1] = local control true/false * @param argin * @exception DevFailed */ void local_pole_control(const Tango::DevVarShortArray *); /** * Check the given current values against the specified limits. * @param argin Setpoint values for the Poles * @return true when settings are OK * @exception DevFailed */ Tango::DevBoolean setpoint_check(const Tango::DevVarDoubleArray *); /** * Set the current for one Pole. * [0] = pole number, [1] = current * @param argin * @exception DevFailed */ void set_pole_current(const Tango::DevVarDoubleArray *); /** * Read the device properties from database */ void get_device_property(); //@} // Here is the end of the automatic code generation part //------------------------------------------------------------- protected : // Add your own data members here //----------------------------------------- friend class AcquisitionThread; AcquisitionThread *acquisition_thread; omni_mutex data_mutex; omni_mutex bilt_mutex; short exit_thread; struct timeval data_set_time; struct timeval data_read_time; void create_tango_exception (itest::ItestException &e, string reason, string desc, string origin); void create_tango_exception (itest::ItestException &e, Tango::DevErrorList &errors, string reason, string desc, string origin); itest::TMagnet *BILT; bool bilt_connection_lost; struct itest::mdata mdata; struct itest::fdata fdata[POLES]; Tango::DevErrorList mdata_errors; Tango::DevErrorList fdata_errors; vector currents_dc; vector currents_ac; vector voltages; vector impedances; vector currents_rms; vector currents_average; vector frames_per_sec; vector errors_per_sec; vector error_counters; bool local_control[3]; }; } // namespace_ns #endif // _BILT_H Revision-number: 31 Prop-content-length: 130 Content-length: 130 K 10 svn:author V 5 meyer K 8 svn:date V 27 2010-03-16T14:56:34.000000Z K 7 svn:log V 30 Changed timeout to 2 seconds. PROPS-END Node-path: powersupply/itest/Bilt/trunk/libMagnet_V130/ClassMagnet.h Node-kind: file Node-action: change Text-content-length: 6625 Text-content-md5: ca87e79fc801ae2694423677f4027a44 Content-length: 6625 // ============================================================================ // // = CONTEXT // ITest Power Supplies - C++ Interface // // = FILENAME // ClassMagnet.h // // = AUTHOR // Sebastien Laurent - ITEST // // = VERSION // 1.30 // // ============================================================================ #ifndef _ITEST_CLASSMAGNET_H_ #define _ITEST_CLASSMAGNET_H_ //--------------------------------------------------------------------------- #include #include "Exception.h" namespace itest{ #define MAGNET1 #define MAGNET2 #define NBRPOLE 3 #define INST_MAGN1_POLE_X 1 //Instrument du pole X de l'aimant 1 #define INST_MAGN2_POLE_X 7 //Instrument du pole X de l'aimant 2 #define P1 1 //groupe de BILT de l'aimant 1 #define P2 2 //groupe de BILT de l'aimant 2 #define BUFFSIZE 130 //taille buffer de caractère de réception #define SOCK_PORT 5025 //Port de communication socket //#define MAXTIME_CONNECT_READ 10 //temps max d'attente pour une connexion et une lecture sur BILT modif V201 #define MAXTIME_CONNECT_READ 2 // set timeout to 2 seconds 16.3.2010 JM/ESRF #define X 0 #define Y 1 #define Z 2 #define CONF 0 #define RS485 1 #define MAGNET_OFF 0 #define MAGNET_ON 1 #define Q_SYSTERR ":syst:err?" #define Q_MCURRAVER ";:meas:curr:aver?" //modif V130 #define Q_MVOLTAVER ";:meas:volt:aver?" //modif V130 #define Q_MCURR ";:meas:curr?" #define Q_MVOLT ";:meas:volt?" #define Q_IDATA ";:idata?" #define Q_MDATA ";:mdata?" #define Q_SWITCH ";:switch?" #define Q_CURR_DC ";:curr:dc?" #define Q_FAIL ";:lim:fail?" #define Q_FAILSTR ";:lim:fail:str?" #define Q_STAT ":stat?" #define SWITCH ";:switch " #define CURR_DC ";:curr:dc " #define CURR_AC ";:curr:ac " #define STAT ":stat " #define STATCLEAR ":stat:clear" #define SYSTVERS ":syst:vers?" //comptage #define Q_FDATA ";:fdata?" #define FRST ";:frst" //--------------------------------------------------------------------------- #define ITEST_EXCEPT_TRY_STR "ItestException exception caught while trying " #define ITEST_EXCEPT_MAGN_STR "ItestException exception caught on magnet" #define UNKNOW_EXCEPT_MAGN_STR "Unknown exception caugth on magnet" #define SOCK_ERROR_STR "Socket error" #define CONNECT_FAILED_STR "Connection failed" //--------------------------------------------------------------------------- class Socket{ private: int Sockfd; char R_Buff[BUFFSIZE]; bool init_device_done; //modif V202 07/06/07 pas d'exception dans constructeur mais dans fonctions membres protected: public: Socket(const char *StrIP); ~Socket(void); char *query(const std::string& Str); void write(const std::string& Str); }; //---------------------------------- class TBilt : private Socket //public Socket modif V202 05/06/07 { private: char BuffLastErr[50]; int NumLastErr; const char *StrLastErr; //modif V202 07/06/07 passage en private protected: public: TBilt(const char *StrIP); ~TBilt(void); void write(const std::string& _Str) throw (itest::ItestException); char *query(const std::string& _Str) throw (itest::ItestException); //ajout de const modif V202 05/06/07 }; //---------------------------------- class TPole{ private: // int Group; int Inst; int *PtrSock; char *Ptr_R_Buff; int NumMagnet; int Pole; TBilt *Bilt; public: TPole(TBilt *_Bilt, int _NumMagnet, int _Pole); double get_measure_current_aver(void) throw (itest::ItestException); //modif V130 double get_measure_voltage_aver(void) throw (itest::ItestException); //modif V130 double get_measure_current(void) throw (itest::ItestException); double get_measure_voltage(void) throw (itest::ItestException); void get_idata(struct idata *) throw (itest::ItestException); int get_switch(void) throw (itest::ItestException); double get_current_DC(void) throw (itest::ItestException); int get_state(void) throw (itest::ItestException); int get_num_alarm(void) throw (itest::ItestException); const char * get_str_alarm(void) throw (itest::ItestException); void set_current_DC(double ValF) throw (itest::ItestException); void set_current_AC(double ValF) throw (itest::ItestException); void set_switch(bool val) throw (itest::ItestException); // void clear_alarm(void) throw (itest::ItestException); //taux de comptage void get_fdata(struct fdata *) throw (itest::ItestException); void clear_ferrors(void) throw (itest::ItestException); }; //---------------------------------- class TMagnet { protected: private: int Group; char StrAddrIp[20]; TBilt *Bilt; TPole *Pole[NBRPOLE]; int NumMagnet; //passe en private modif V202 05/06/07 const char *AddrIP; //passe en private modif V202 05/06/07 public: TMagnet(const char *_AddrIp,int NumMagnet) throw (itest::ItestException); ~TMagnet(void); TMagnet(const TMagnet & Magn) throw (itest::ItestException); TMagnet & operator=(const TMagnet & Magn) throw (itest::ItestException); //modif V201 07/03/07 int num_magnet(void){return NumMagnet;} //modif V202 05/06/07 const char *addrIP_magnet(void){return AddrIP;} //modif V202 05/06/07 TPole & pole(int Num); void clear_all_err(void) throw (itest::ItestException); void clear_alarm(void) throw (itest::ItestException); void set_switch(bool val) throw (itest::ItestException); void set_state(bool val) throw (itest::ItestException); void get_mdata(struct mdata *) throw (itest::ItestException); int get_state(void) throw (itest::ItestException); const char * get_bilt_vers(void) throw (itest::ItestException); }; //--------------------------------------------------------------------------- //Structure de données de idata struct idata{ int magnet; int pole; int state; std::string fail; double measvolt; double meascurr; }; //--------------------------------------------------------------------------- //Structure de données de Mdata struct mdata{ int magnet; int state; struct idata idata[NBRPOLE]; }; //--------------------------------------------------------------------------- //Structure de données de Fdata struct fdata{ unsigned int nbrframe_sec; unsigned int nbrferr_sec; double rms_ac_sett_sec; double average_sett_sec; unsigned int nbrferr; }; //--------------------------------------------------------------------------- } //end namespace //--------------------------------------------------------------------------- #endif //_ITEST_CLASSMAGNET_H_ Revision-number: 32 Prop-content-length: 111 Content-length: 111 K 10 svn:author V 5 meyer K 8 svn:date V 27 2010-03-16T14:57:56.000000Z K 7 svn:log V 11 Rlease_3_1 PROPS-END Node-path: powersupply/itest/Bilt/trunk/Makefile Node-kind: file Node-action: change Text-content-length: 5964 Text-content-md5: 2c18f1f77af1a2b50ee1c40921cc1ae8 Content-length: 5964 #============================================================================= # # file : Makefile # # description : Include for the Bilt class. # # project : Makefile to generate a Tango server # # $Author: meyer $ # # $Revision: 1.9 $ # # $Log: not supported by cvs2svn $ # Revision 1.8 2010-02-11 16:35:27 meyer # Currents settings understand NaN values. # Deleted StePoleCurrent command. # # Revision 1.7 2010/02/10 16:22:15 meyer # Release_3_0 # # Revision 1.6 2010/02/10 12:27:31 meyer # Restructured Bilt class. # Acquistion is now done by a thread and only the multi channel data # gets exported. A single channel class (BiltCh) was created. # # Revision 1.5 2009/12/18 12:02:18 meyer # Changed version number to 2.1 # # Revision 1.4 2009/12/18 10:19:23 meyer # Using libMagnet version 130 now. # # Revision 1.3 2009/11/27 13:49:26 meyer # Modified structure! The pole is no longer a device. # The device is now a magnet with three poles. # # Revision 1.2 2009/11/26 10:46:58 meyer # Updated for libMagnet_V120 # # Revision 1.1.1.1 2009/11/04 16:23:02 meyer # Imported using TkCVS # # # copyleft : European Synchrotron Radiation Facility # BP 220, Grenoble 38043 # FRANCE # #============================================================================= # This file is generated by POGO # (Program Obviously used to Generate tango Object) # # (c) - Software Engineering Group - ESRF #============================================================================= # CLASS = Bilt MAJOR_VERS = 3 MINOR_VERS = 1 RELEASE = Release_$(MAJOR_VERS)_$(MINOR_VERS) OS = $(shell /csadmin/common/scripts/get_os) PROCESSOR = $(shell uname -p) #----------------------------------------- # Set default home directories #----------------------------------------- TANGO_HOME = /segfs/tango/release/$(BIN_DIR) CPP_SERVERS = $(TANGO_HOME)/classes ifdef no_debug DEBUG = -O else DEBUG = -g endif ifdef _solaris CC = CC BIN_DIR=$(OS)_CC AR_SL = $(CC) -mt -G VERS_OPT = -h SL_EXT = so endif ifdef linux CC = c++ CC_SHLIB = $(CC) -fPIC $(PROCESSOR)=1 ifdef x86_64 NBITS=_64 endif BIN_DIR=$(OS)$(NBITS) AR_SL = $(CC) -fPIC -shared SL_EXT = so VERS_OPT = -Wl,-soname, endif INCLUDE_DIRS = -I$(TANGO_HOME)/include -I. \ -I$(CPP_SERVERS)/include \ -I libMagnet_V130 OBJS_DIR = obj/$(BIN_DIR) LIB_DIRS = -L $(CPP_SERVERS)/lib \ -L $(TANGO_HOME)/lib \ -L libMagnet_V130 TARGET_LIB = $(CPP_SERVERS)/lib/libtgclasses.a #----------------------------------------- # Set CXXFLAGS and LFLAGS #----------------------------------------- ifdef _solaris CXXFLAGS = $(DEBUG) -mt -D_PTHREADS $(INCLUDE_DIRS) LFLAGS = $(DEBUG) $(LIB_DIRS) \ -ltango \ -llog4tango \ -lomniORB4 \ -lomniDynamic4 \ -lomnithread \ -lCOS4 \ -lpthread \ -lposix4 -lsocket -lnsl \ -ltgclasses endif ifdef linux CXXFLAGS = -g -D_REENTRANT $(INCLUDE_DIRS) LFLAGS = $(DEBUG) $(LIB_DIRS) \ -ltango \ -llog4tango \ -lomniORB4 \ -lomniDynamic4 \ -lomnithread \ -lCOS4 \ -ldl -lpthread \ -lMagnet \ -ltgclasses endif #----------------------------------------- # Set dependences #----------------------------------------- SVC_OBJS = $(OBJS_DIR)/$(CLASS).o \ $(OBJS_DIR)/$(CLASS)StateMachine.o \ $(OBJS_DIR)/$(CLASS)Class.o \ $(OBJS_DIR)/AcquisitionThread.o \ $(OBJS_DIR)/ClassFactory.o \ $(OBJS_DIR)/main.o SHLIB_OBJS = $(OBJS_DIR)/$(CLASS)Class.so.o \ $(OBJS_DIR)/$(CLASS)StateMachine.so.o \ $(OBJS_DIR)/$(CLASS).so.o \ $(OBJS_DIR)/AcquisitionThread.o SVC_INC = $(CLASS)Class.h \ $(CLASS).h \ AcquisitionThread.h $(OBJS_DIR)/%.o: %.cpp $(SVC_INC) $(CC) $(CXXFLAGS) -c $< -o $(OBJS_DIR)/$*.o $(OBJS_DIR)/%.so.o: %.cpp $(SVC_INC) $(CC_SHLIB) $(CXXFLAGS) -c $< -o $(OBJS_DIR)/$*.so.o #----------------------------------------- # Make Entry #----------------------------------------- all: $(CLASS) $(CLASS): make_obj_dir make_bin_dir $(SVC_OBJS) $(CC) $(SVC_OBJS) -o $(CLASS) $(LFLAGS) @mv $(CLASS) bin/$(BIN_DIR)/$(CLASS) shlib: make_obj_dir make_shlib_dir $(SHLIB_OBJS) $(AR_SL) -o \ shlib/$(BIN_DIR)/$(CLASS).$(SL_EXT).$(MAJOR_VERS).$(MINOR_VERS) \ $(VERS_OPT)$(CLASS).$(SL_EXT).$(MAJOR_VERS) \ $(SHLIB_OBJS) $(LFLAGS) @rm -f shlib/$(BIN_DIR)/$(CLASS).$(SL_EXT) @cd shlib/$(BIN_DIR); \ ln -s $(CLASS).$(SL_EXT).$(MAJOR_VERS).$(MINOR_VERS) $(CLASS).$(SL_EXT) clean: rm -f $(OBJS_DIR)/*.o \ $(OBJS_DIR)/*.so.o \ bin/$(BIN_DIR)/$(CLASS) \ core make_obj_dir: @mkdir -p obj @mkdir -p obj/$(BIN_DIR) make_bin_dir: @mkdir -p bin @mkdir -p bin/$(BIN_DIR) make_shlib_dir: @mkdir -p shlib @mkdir -p shlib/$(BIN_DIR) #----------------------------------------- # Install binary file #----------------------------------------- install: cp bin/$(BIN_DIR)/$(CLASS) $(CPP_SERVERS)/bin #----------------------------------------- # Update class library and header files # recompile without debug mode. #----------------------------------------- lib: clean @make no_debug=1 cp *.h $(CPP_SERVERS)/include ar ruv $(TARGET_LIB) $(OBJS_DIR)/$(CLASS).o ar ruv $(TARGET_LIB) $(OBJS_DIR)/$(CLASS)Class.o ar ruv $(TARGET_LIB) $(OBJS_DIR)/$(CLASS)StateMachine.o ident $(TARGET_LIB) | grep $(CLASS) #------------------------------------------------------ # Tag the CVS/SVN module corresponding to this class # copy cvs_tag or svn_tag to tag: entry #------------------------------------------------------ #svn_tag: # svn copy ../trunk ../tags/$(RELEASE) # svn commit ../tags/$(RELEASE) \ # -m "Tagging the $(RELEASE) of the $(CLASS) project." # #cvs_tag: # @cvstag "$(CLASS)-$(RELEASE)" # @make $(CLASS) # @make show_tag #show_cvs_tag: # @cvstag -d # # Only these make options work with the current Pogo version 5.3.x! tag: @cvstag "$(CLASS)-$(RELEASE)" @make $(CLASS) @make show_tag show_tag: @cvstag -d Revision-number: 33 Prop-content-length: 147 Content-length: 147 K 8 svn:date V 27 2010-03-16T14:57:57.000000Z K 7 svn:log V 73 This commit was manufactured by cvs2svn to create tag 'Bilt-Release_3_1'. PROPS-END Node-path: powersupply/itest/Bilt/tags/Bilt-Release_3_1 Node-kind: dir Node-action: add Node-copyfrom-rev: 32 Node-copyfrom-path: powersupply/itest/Bilt/trunk Revision-number: 34 Prop-content-length: 124 Content-length: 124 K 10 svn:author V 5 meyer K 8 svn:date V 27 2010-03-16T15:03:33.000000Z K 7 svn:log V 24 Excluded Steerer class. PROPS-END Node-path: powersupply/itest/Bilt/trunk/BiltClass.cpp Node-kind: file Node-action: change Text-content-length: 26161 Text-content-md5: bda57cd57abc5f0808e547a4e7f399bd Content-length: 26161 static const char *ClassId = "$Id: BiltClass.cpp,v 1.11 2010-03-16 15:03:33 meyer Exp $"; static const char *TagName = "$Name: not supported by cvs2svn $"; static const char *CvsPath = "$Source: /segfs/tango/cvsroot/cppserver/machine/powersupply/SrSteerers/tango/Bilt/BiltClass.cpp,v $"; static const char *SvnPath = "$HeadURL: $"; static const char *HttpServer = "http://www.esrf.fr/computing/cs/tango/tango_doc/ds_doc/"; //+============================================================================= // // file : BiltClass.cpp // // description : C++ source for the BiltClass. A singleton // class derived from DeviceClass. It implements the // command list and all properties and methods required // by the Bilt once per process. // // project : TANGO Device Server // // $Author: meyer $ // // $Revision: 1.11 $ // // $Log: not supported by cvs2svn $ // Revision 1.10 2010-02-12 16:35:13 meyer // Added SetPoleCurrent command again. // // Revision 1.9 2010-02-11 16:35:27 meyer // Currents settings understand NaN values. // Deleted StePoleCurrent command. // // Revision 1.8 2010/02/10 16:22:15 meyer // Release_3_0 // // Revision 1.7 2010/02/10 12:27:31 meyer // Restructured Bilt class. // Acquistion is now done by a thread and only the multi channel data // gets exported. A single channel class (BiltCh) was created. // // Revision 1.6 2009/12/18 12:02:18 meyer // Changed version number to 2.1 // // Revision 1.5 2009/11/27 13:49:26 meyer // Modified structure! The pole is no longer a device. // The device is now a magnet with three poles. // // Revision 1.4 2009/11/26 10:46:58 meyer // Updated for libMagnet_V120 // // Revision 1.3 2009/11/23 16:46:58 meyer // Corrected state, status and exception handling // // Revision 1.2 2009/11/06 12:46:25 meyer // Added impedance attribute and corrected fromatting of attribute values. // // Revision 1.1.1.1 2009/11/04 16:23:02 meyer // Imported using TkCVS // // // copyleft : European Synchrotron Radiation Facility // BP 220, Grenoble 38043 // FRANCE // //-============================================================================= // // This file is generated by POGO // (Program Obviously used to Generate tango Object) // // (c) - Software Engineering Group - ESRF //============================================================================= #include #include #include //+---------------------------------------------------------------------------- /** * Create BiltClass singleton and return it in a C function for Python usage */ //+---------------------------------------------------------------------------- extern "C" { #ifdef WIN32 __declspec(dllexport) #endif Tango::DeviceClass *_create_Bilt_class(const char *name) { return Bilt_ns::BiltClass::init(name); } } namespace Bilt_ns { //+---------------------------------------------------------------------------- // // method : SetPoleCurrentCmd::execute() // // description : method to trigger the execution of the command. // PLEASE DO NOT MODIFY this method core without pogo // // in : - device : The device on which the command must be executed // - in_any : The command input data // // returns : The command output data (packed in the Any object) // //----------------------------------------------------------------------------- CORBA::Any *SetPoleCurrentCmd::execute(Tango::DeviceImpl *device,const CORBA::Any &in_any) { cout2 << "SetPoleCurrentCmd::execute(): arrived" << endl; const Tango::DevVarDoubleArray *argin; extract(in_any, argin); ((static_cast(device))->set_pole_current(argin)); return new CORBA::Any(); } //+---------------------------------------------------------------------------- // // method : SetpointCheckCmd::execute() // // description : method to trigger the execution of the command. // PLEASE DO NOT MODIFY this method core without pogo // // in : - device : The device on which the command must be executed // - in_any : The command input data // // returns : The command output data (packed in the Any object) // //----------------------------------------------------------------------------- CORBA::Any *SetpointCheckCmd::execute(Tango::DeviceImpl *device,const CORBA::Any &in_any) { cout2 << "SetpointCheckCmd::execute(): arrived" << endl; const Tango::DevVarDoubleArray *argin; extract(in_any, argin); return insert((static_cast(device))->setpoint_check(argin)); } //+---------------------------------------------------------------------------- // // method : LocalPoleControlCmd::execute() // // description : method to trigger the execution of the command. // PLEASE DO NOT MODIFY this method core without pogo // // in : - device : The device on which the command must be executed // - in_any : The command input data // // returns : The command output data (packed in the Any object) // //----------------------------------------------------------------------------- CORBA::Any *LocalPoleControlCmd::execute(Tango::DeviceImpl *device,const CORBA::Any &in_any) { cout2 << "LocalPoleControlCmd::execute(): arrived" << endl; const Tango::DevVarShortArray *argin; extract(in_any, argin); ((static_cast(device))->local_pole_control(argin)); return new CORBA::Any(); } //+---------------------------------------------------------------------------- // // method : SetPoleAcCurrentCmd::execute() // // description : method to trigger the execution of the command. // PLEASE DO NOT MODIFY this method core without pogo // // in : - device : The device on which the command must be executed // - in_any : The command input data // // returns : The command output data (packed in the Any object) // //----------------------------------------------------------------------------- CORBA::Any *SetPoleAcCurrentCmd::execute(Tango::DeviceImpl *device,const CORBA::Any &in_any) { cout2 << "SetPoleAcCurrentCmd::execute(): arrived" << endl; const Tango::DevVarDoubleArray *argin; extract(in_any, argin); ((static_cast(device))->set_pole_ac_current(argin)); return new CORBA::Any(); } //+---------------------------------------------------------------------------- // // method : OnCmd::execute() // // description : method to trigger the execution of the command. // PLEASE DO NOT MODIFY this method core without pogo // // in : - device : The device on which the command must be executed // - in_any : The command input data // // returns : The command output data (packed in the Any object) // //----------------------------------------------------------------------------- CORBA::Any *OnCmd::execute(Tango::DeviceImpl *device,const CORBA::Any &in_any) { cout2 << "OnCmd::execute(): arrived" << endl; ((static_cast(device))->on()); return new CORBA::Any(); } //+---------------------------------------------------------------------------- // // method : OffCmd::execute() // // description : method to trigger the execution of the command. // PLEASE DO NOT MODIFY this method core without pogo // // in : - device : The device on which the command must be executed // - in_any : The command input data // // returns : The command output data (packed in the Any object) // //----------------------------------------------------------------------------- CORBA::Any *OffCmd::execute(Tango::DeviceImpl *device,const CORBA::Any &in_any) { cout2 << "OffCmd::execute(): arrived" << endl; ((static_cast(device))->off()); return new CORBA::Any(); } //+---------------------------------------------------------------------------- // // method : ResetCmd::execute() // // description : method to trigger the execution of the command. // PLEASE DO NOT MODIFY this method core without pogo // // in : - device : The device on which the command must be executed // - in_any : The command input data // // returns : The command output data (packed in the Any object) // //----------------------------------------------------------------------------- CORBA::Any *ResetCmd::execute(Tango::DeviceImpl *device,const CORBA::Any &in_any) { cout2 << "ResetCmd::execute(): arrived" << endl; ((static_cast(device))->reset()); return new CORBA::Any(); } // //---------------------------------------------------------------- // Initialize pointer for singleton pattern //---------------------------------------------------------------- // BiltClass *BiltClass::_instance = NULL; //+---------------------------------------------------------------------------- // // method : BiltClass::BiltClass(string &s) // // description : constructor for the BiltClass // // in : - s : The class name // //----------------------------------------------------------------------------- BiltClass::BiltClass(string &s):DeviceClass(s) { cout2 << "Entering BiltClass constructor" << endl; set_default_property(); get_class_property(); write_class_property(); cout2 << "Leaving BiltClass constructor" << endl; } //+---------------------------------------------------------------------------- // // method : BiltClass::~BiltClass() // // description : destructor for the BiltClass // //----------------------------------------------------------------------------- BiltClass::~BiltClass() { _instance = NULL; } //+---------------------------------------------------------------------------- // // method : BiltClass::instance // // description : Create the object if not already done. Otherwise, just // return a pointer to the object // // in : - name : The class name // //----------------------------------------------------------------------------- BiltClass *BiltClass::init(const char *name) { if (_instance == NULL) { try { string s(name); _instance = new BiltClass(s); } catch (bad_alloc) { throw; } } return _instance; } BiltClass *BiltClass::instance() { if (_instance == NULL) { cerr << "Class is not initialised !!" << endl; exit(-1); } return _instance; } //+---------------------------------------------------------------------------- // // method : BiltClass::command_factory // // description : Create the command object(s) and store them in the // command list // //----------------------------------------------------------------------------- void BiltClass::command_factory() { command_list.push_back(new OnCmd("On", Tango::DEV_VOID, Tango::DEV_VOID, "", "", Tango::OPERATOR)); command_list.push_back(new OffCmd("Off", Tango::DEV_VOID, Tango::DEV_VOID, "", "", Tango::OPERATOR)); command_list.push_back(new ResetCmd("Reset", Tango::DEV_VOID, Tango::DEV_VOID, "", "", Tango::OPERATOR)); command_list.push_back(new SetPoleAcCurrentCmd("SetPoleAcCurrent", Tango::DEVVAR_DOUBLEARRAY, Tango::DEV_VOID, "", "", Tango::OPERATOR)); command_list.push_back(new LocalPoleControlCmd("LocalPoleControl", Tango::DEVVAR_SHORTARRAY, Tango::DEV_VOID, "", "", Tango::OPERATOR)); command_list.push_back(new SetpointCheckCmd("SetpointCheck", Tango::DEVVAR_DOUBLEARRAY, Tango::DEV_BOOLEAN, "Setpoint values for the Poles", "true when settings are OK", Tango::OPERATOR)); command_list.push_back(new SetPoleCurrentCmd("SetPoleCurrent", Tango::DEVVAR_DOUBLEARRAY, Tango::DEV_VOID, "", "", Tango::OPERATOR)); // add polling if any for (unsigned int i=0 ; ilength() ; i++) { cout4 << "Device name : " << (*devlist_ptr)[i].in() << endl; // Create devices and add it into the device list //---------------------------------------------------- device_list.push_back(new Bilt(this, (*devlist_ptr)[i])); // Export device to the outside world // Check before if database used. //--------------------------------------------- if ((Tango::Util::_UseDb == true) && (Tango::Util::_FileDb == false)) export_device(device_list.back()); else export_device(device_list.back(), (*devlist_ptr)[i]); } // End of Automatic code generation //------------------------------------------------------------- } //+---------------------------------------------------------------------------- // Method: BiltClass::attribute_factory(vector &att_list) //----------------------------------------------------------------------------- void BiltClass::attribute_factory(vector &att_list) { // Attribute : Currents CurrentsAttrib *currents = new CurrentsAttrib(); Tango::UserDefaultAttrProp currents_prop; currents_prop.set_label("Currents"); currents_prop.set_unit("A"); currents_prop.set_format("%6.4f"); currents_prop.set_max_value("1.8"); currents_prop.set_min_value("-1.8"); currents_prop.set_description("The measured currents of the three poles."); currents->set_default_properties(currents_prop); att_list.push_back(currents); // Attribute : Voltages VoltagesAttrib *voltages = new VoltagesAttrib(); Tango::UserDefaultAttrProp voltages_prop; voltages_prop.set_label("Voltages"); voltages_prop.set_unit("V"); voltages_prop.set_format("%6.4"); voltages_prop.set_description("The measured voltages of the three poles."); voltages->set_default_properties(voltages_prop); att_list.push_back(voltages); // Attribute : Impedances ImpedancesAttrib *impedances = new ImpedancesAttrib(); Tango::UserDefaultAttrProp impedances_prop; impedances_prop.set_label("Impedances"); impedances_prop.set_unit("Ohm"); impedances_prop.set_format("%4.2f"); impedances_prop.set_max_alarm("5.0"); impedances_prop.set_description("Calculated impedances for the three poles."); impedances->set_default_properties(impedances_prop); att_list.push_back(impedances); // Attribute : SetCurrentsRMS SetCurrentsRMSAttrib *set_currents_rms = new SetCurrentsRMSAttrib(); Tango::UserDefaultAttrProp set_currents_rms_prop; set_currents_rms_prop.set_label("RMS AC current setpoints/s"); set_currents_rms_prop.set_unit("A"); set_currents_rms_prop.set_format("%6.4"); set_currents_rms_prop.set_description("Statistic when driven by the Libera. One RMS value for every pole\nof the magnet.\nRMS value of the AC setpoint applied on the DAC during the last second.\nX=sqr( (sum(setAC)*sum(setAC)) / n - ((sum(setAC)/n) *(sum(setAC)/n)) )"); set_currents_rms->set_default_properties(set_currents_rms_prop); att_list.push_back(set_currents_rms); // Attribute : SetCurrentsAverage SetCurrentsAverageAttrib *set_currents_average = new SetCurrentsAverageAttrib(); Tango::UserDefaultAttrProp set_currents_average_prop; set_currents_average_prop.set_label("Average AC current setpoints/s"); set_currents_average_prop.set_unit("A"); set_currents_average_prop.set_format("%6.4"); set_currents_average_prop.set_description("Statistic when driven by the Libera. One average value for every pole\nof the magnet.\nRMS value of the AC setpoint applied on the DAC during the last second.\nX=sqr( (sum(setAC)*sum(setAC)) / n - ((sum(setAC)/n) *(sum(setAC)/n)) )"); set_currents_average->set_default_properties(set_currents_average_prop); att_list.push_back(set_currents_average); // Attribute : FramesPerSecond FramesPerSecondAttrib *frames_per_second = new FramesPerSecondAttrib(); Tango::UserDefaultAttrProp frames_per_second_prop; frames_per_second_prop.set_label("Frames per second"); frames_per_second_prop.set_display_unit(" "); frames_per_second_prop.set_format("%6d"); frames_per_second->set_default_properties(frames_per_second_prop); att_list.push_back(frames_per_second); // Attribute : ErrorsPerSecond ErrorsPerSecondAttrib *errors_per_second = new ErrorsPerSecondAttrib(); Tango::UserDefaultAttrProp errors_per_second_prop; errors_per_second_prop.set_label("Errors per second"); errors_per_second_prop.set_display_unit(" "); errors_per_second_prop.set_format("%6d"); errors_per_second->set_default_properties(errors_per_second_prop); att_list.push_back(errors_per_second); // Attribute : ErrorCounters ErrorCountersAttrib *error_counters = new ErrorCountersAttrib(); Tango::UserDefaultAttrProp error_counters_prop; error_counters_prop.set_label("Error counters"); error_counters_prop.set_unit(" "); error_counters_prop.set_format("%6d"); error_counters_prop.set_description("Statistic when driven by the Libera.\nThe total number of errors since the last reset for the \nthree poles."); error_counters->set_default_properties(error_counters_prop); att_list.push_back(error_counters); // Attribute : LocalControls LocalControlsAttrib *local_controls = new LocalControlsAttrib(); att_list.push_back(local_controls); // End of Automatic code generation //------------------------------------------------------------- } //+---------------------------------------------------------------------------- // // method : BiltClass::get_class_property() // // description : Read the class properties from database. // //----------------------------------------------------------------------------- void BiltClass::get_class_property() { // Initialize your default values here (if not done with POGO). //------------------------------------------------------------------ // Read class properties from database.(Automatic code generation) //------------------------------------------------------------------ // Call database and extract values //-------------------------------------------- if (Tango::Util::instance()->_UseDb==true) get_db_class()->get_property(cl_prop); Tango::DbDatum def_prop; int i = -1; // End of Automatic code generation //------------------------------------------------------------------ } //+---------------------------------------------------------------------------- // // method : BiltClass::set_default_property // // description: Set default property (class and device) for wizard. // For each property, add to wizard property name and description // If default value has been set, add it to wizard property and // store it in a DbDatum. // //----------------------------------------------------------------------------- void BiltClass::set_default_property() { string prop_name; string prop_desc; string prop_def; vector vect_data; // Set Default Class Properties // Set Default Device Properties prop_name = "IPAddress"; prop_desc = "IP Address of BILT controller.\nEach controller includes several magnets and\neach magnet includes 3 power supplies,\nfor corrections in the X, Y and Z planes.\n\n"; prop_def = "0.0.0.0"; vect_data.clear(); vect_data.push_back("0.0.0.0"); if (prop_def.length()>0) { Tango::DbDatum data(prop_name); data << vect_data ; dev_def_prop.push_back(data); add_wiz_dev_prop(prop_name, prop_desc, prop_def); } else add_wiz_dev_prop(prop_name, prop_desc); prop_name = "MagnetNumber"; prop_desc = "Magnet number from 1 to 48"; prop_def = "0"; vect_data.clear(); vect_data.push_back("0"); if (prop_def.length()>0) { Tango::DbDatum data(prop_name); data << vect_data ; dev_def_prop.push_back(data); add_wiz_dev_prop(prop_name, prop_desc, prop_def); } else add_wiz_dev_prop(prop_name, prop_desc); prop_name = "UpdatePeriod"; prop_desc = "The update period for the data reading from the power supply in milli seconds."; prop_def = "1000"; vect_data.clear(); vect_data.push_back("1000"); if (prop_def.length()>0) { Tango::DbDatum data(prop_name); data << vect_data ; dev_def_prop.push_back(data); add_wiz_dev_prop(prop_name, prop_desc, prop_def); } else add_wiz_dev_prop(prop_name, prop_desc); } //+---------------------------------------------------------------------------- // // method : BiltClass::write_class_property // // description : Set class description as property in database // //----------------------------------------------------------------------------- void BiltClass::write_class_property() { // First time, check if database used //-------------------------------------------- if (Tango::Util::_UseDb == false) return; Tango::DbData data; string classname = get_name(); string header; string::size_type start, end; // Put title Tango::DbDatum title("ProjectTitle"); string str_title("BILT multi channel power supply"); title << str_title; data.push_back(title); // Put Description Tango::DbDatum description("Description"); vector str_desc; str_desc.push_back("The BILT multi channel power supply will be used with 3 channels for the ESRF fast"); str_desc.push_back("feedback systems."); str_desc.push_back("The power supply can be controlled in 2 ways :"); str_desc.push_back("By this device server for slow or human control or"); str_desc.push_back("by the Libera Beam Position monitors for fast feedback with closed loop control."); str_desc.push_back("The devices are exported as one device per steerer magnet. Every device has three"); str_desc.push_back("channels. The channels (poles) cannot be switched on individually but have their"); str_desc.push_back("individual set points and measurement values."); description << str_desc; data.push_back(description); // put cvs or svn location string filename(classname); filename += "Class.cpp"; // Create a string with the class ID to // get the string into the binary string class_id(ClassId); // check for cvs information string src_path(CvsPath); start = src_path.find("/"); if (start!=string::npos) { end = src_path.find(filename); if (end>start) { string strloc = src_path.substr(start, end-start); // Check if specific repository start = strloc.find("/cvsroot/"); if (start!=string::npos && start>0) { string repository = strloc.substr(0, start); if (repository.find("/segfs/")!=string::npos) strloc = "ESRF:" + strloc.substr(start, strloc.length()-start); } Tango::DbDatum cvs_loc("cvs_location"); cvs_loc << strloc; data.push_back(cvs_loc); } } // check for svn information else { string src_path(SvnPath); start = src_path.find("://"); if (start!=string::npos) { end = src_path.find(filename); if (end>start) { header = "$HeadURL: "; start = header.length(); string strloc = src_path.substr(start, (end-start)); Tango::DbDatum svn_loc("svn_location"); svn_loc << strloc; data.push_back(svn_loc); } } } // Get CVS or SVN revision tag // CVS tag string tagname(TagName); header = "$Name: "; start = header.length(); string endstr(" $"); end = tagname.find(endstr); if (end!=string::npos && end>start) { string strtag = tagname.substr(start, end-start); Tango::DbDatum cvs_tag("cvs_tag"); cvs_tag << strtag; data.push_back(cvs_tag); } // SVN tag string svnpath(SvnPath); header = "$HeadURL: "; start = header.length(); end = svnpath.find(endstr); if (end!=string::npos && end>start) { string strloc = svnpath.substr(start, end-start); string tagstr ("/tags/"); start = strloc.find(tagstr); if ( start!=string::npos ) { start = start + tagstr.length(); end = strloc.find(filename); string strtag = strloc.substr(start, end-start-1); Tango::DbDatum svn_tag("svn_tag"); svn_tag << strtag; data.push_back(svn_tag); } } // Get URL location string httpServ(HttpServer); if (httpServ.length()>0) { Tango::DbDatum db_doc_url("doc_url"); db_doc_url << httpServ; data.push_back(db_doc_url); } // Put inheritance Tango::DbDatum inher_datum("InheritedFrom"); vector inheritance; inheritance.push_back("Device_4Impl"); inher_datum << inheritance; data.push_back(inher_datum); // Call database and and values //-------------------------------------------- get_db_class()->put_property(data); } } // namespace Node-path: powersupply/itest/Bilt/trunk/ClassFactory.cpp Node-kind: file Node-action: change Text-content-length: 1936 Text-content-md5: 47e726efd4c6af9b04e3031abcd79b04 Content-length: 1936 static const char *RcsId = "$Id: ClassFactory.cpp,v 1.4 2010-03-16 15:03:33 meyer Exp $"; //+============================================================================= // // file : ClassFactory.cpp // // description : C++ source for the class_factory method of the DServer // device class. This method is responsible for the creation of // all class singleton for a device server. It is called // at device server startup // // project : TANGO Device Server // // $Author: meyer $ // // $Revision: 1.4 $ // $Date: 2010-03-16 15:03:33 $ // // SVN only: // $HeadURL: $ // // CVS only: // $Source: /segfs/tango/cvsroot/cppserver/machine/powersupply/SrSteerers/tango/Bilt/ClassFactory.cpp,v $ // $Log: not supported by cvs2svn $ // Revision 1.3 2010-02-18 19:19:36 meyer // Added Steerer class. // // Revision 1.2 2010/02/10 12:27:31 meyer // Restructured Bilt class. // Acquistion is now done by a thread and only the multi channel data // gets exported. A single channel class (BiltCh) was created. // // Revision 1.1.1.1 2009/11/04 16:23:02 meyer // Imported using TkCVS // // // copyleft : European Synchrotron Radiation Facility // BP 220, Grenoble 38043 // FRANCE // //-============================================================================= // // This file is generated by POGO // (Program Obviously used to Generate tango Object) // // (c) - Software Engineering Group - ESRF //============================================================================= #include #include #include //#include /** * Create BiltClass singleton and store it in DServer object. */ void Tango::DServer::class_factory() { add_class(Bilt_ns::BiltClass::init("Bilt")); add_class(BiltCh_ns::BiltChClass::init("BiltCh")); //add_class(Steerer_ns::SteererClass::init("Steerer")); } Node-path: powersupply/itest/Bilt/trunk/Makefile Node-kind: file Node-action: change Text-content-length: 6077 Text-content-md5: 3260fd4491a822bc40b6c7119b851ae9 Content-length: 6077 #============================================================================= # # file : Makefile # # description : Include for the Bilt class. # # project : Makefile to generate a Tango server # # $Author: meyer $ # # $Revision: 1.10 $ # # $Log: not supported by cvs2svn $ # Revision 1.9 2010/03/16 14:57:56 meyer # Rlease_3_1 # # Revision 1.8 2010-02-11 16:35:27 meyer # Currents settings understand NaN values. # Deleted StePoleCurrent command. # # Revision 1.7 2010/02/10 16:22:15 meyer # Release_3_0 # # Revision 1.6 2010/02/10 12:27:31 meyer # Restructured Bilt class. # Acquistion is now done by a thread and only the multi channel data # gets exported. A single channel class (BiltCh) was created. # # Revision 1.5 2009/12/18 12:02:18 meyer # Changed version number to 2.1 # # Revision 1.4 2009/12/18 10:19:23 meyer # Using libMagnet version 130 now. # # Revision 1.3 2009/11/27 13:49:26 meyer # Modified structure! The pole is no longer a device. # The device is now a magnet with three poles. # # Revision 1.2 2009/11/26 10:46:58 meyer # Updated for libMagnet_V120 # # Revision 1.1.1.1 2009/11/04 16:23:02 meyer # Imported using TkCVS # # # copyleft : European Synchrotron Radiation Facility # BP 220, Grenoble 38043 # FRANCE # #============================================================================= # This file is generated by POGO # (Program Obviously used to Generate tango Object) # # (c) - Software Engineering Group - ESRF #============================================================================= # CLASS = Bilt MAJOR_VERS = 3 MINOR_VERS = 1 RELEASE = Release_$(MAJOR_VERS)_$(MINOR_VERS) OS = $(shell /csadmin/common/scripts/get_os) PROCESSOR = $(shell uname -p) #----------------------------------------- # Set default home directories #----------------------------------------- TANGO_HOME = /segfs/tango/release/$(BIN_DIR) CPP_SERVERS = $(TANGO_HOME)/classes ifdef no_debug DEBUG = -O else DEBUG = -g endif ifdef _solaris CC = CC BIN_DIR=$(OS)_CC AR_SL = $(CC) -mt -G VERS_OPT = -h SL_EXT = so endif ifdef linux CC = c++ CC_SHLIB = $(CC) -fPIC $(PROCESSOR)=1 ifdef x86_64 NBITS=_64 endif BIN_DIR=$(OS)$(NBITS) AR_SL = $(CC) -fPIC -shared SL_EXT = so VERS_OPT = -Wl,-soname, endif INCLUDE_DIRS = -I$(TANGO_HOME)/include -I. \ -I$(CPP_SERVERS)/include \ -I libMagnet_V130 OBJS_DIR = obj/$(BIN_DIR) LIB_DIRS = -L $(CPP_SERVERS)/lib \ -L $(TANGO_HOME)/lib \ -L libMagnet_V130 TARGET_LIB = $(CPP_SERVERS)/lib/libtgclasses.a #----------------------------------------- # Set CXXFLAGS and LFLAGS #----------------------------------------- ifdef _solaris CXXFLAGS = $(DEBUG) -mt -D_PTHREADS $(INCLUDE_DIRS) LFLAGS = $(DEBUG) $(LIB_DIRS) \ -ltango \ -llog4tango \ -lomniORB4 \ -lomniDynamic4 \ -lomnithread \ -lCOS4 \ -lpthread \ -lposix4 -lsocket -lnsl \ -ltgclasses endif ifdef linux CXXFLAGS = -g -D_REENTRANT $(INCLUDE_DIRS) LFLAGS = $(DEBUG) $(LIB_DIRS) \ -ltango \ -llog4tango \ -lomniORB4 \ -lomniDynamic4 \ -lomnithread \ -lCOS4 \ -ldl -lpthread \ -lMagnet \ -ltgclasses endif #----------------------------------------- # Set dependences #----------------------------------------- SVC_OBJS = $(OBJS_DIR)/$(CLASS).o \ $(OBJS_DIR)/$(CLASS)StateMachine.o \ $(OBJS_DIR)/$(CLASS)Class.o \ $(OBJS_DIR)/AcquisitionThread.o \ $(OBJS_DIR)/ClassFactory.o \ $(OBJS_DIR)/main.o SHLIB_OBJS = $(OBJS_DIR)/$(CLASS)Class.so.o \ $(OBJS_DIR)/$(CLASS)StateMachine.so.o \ $(OBJS_DIR)/$(CLASS).so.o \ $(OBJS_DIR)/AcquisitionThread.o SVC_INC = $(CLASS)Class.h \ $(CLASS).h \ AcquisitionThread.h $(OBJS_DIR)/%.o: %.cpp $(SVC_INC) $(CC) $(CXXFLAGS) -c $< -o $(OBJS_DIR)/$*.o $(OBJS_DIR)/%.so.o: %.cpp $(SVC_INC) $(CC_SHLIB) $(CXXFLAGS) -c $< -o $(OBJS_DIR)/$*.so.o #----------------------------------------- # Make Entry #----------------------------------------- all: $(CLASS) $(CLASS): make_obj_dir make_bin_dir $(SVC_OBJS) $(CC) $(SVC_OBJS) -o $(CLASS) $(LFLAGS) @mv $(CLASS) bin/$(BIN_DIR)/$(CLASS) shlib: make_obj_dir make_shlib_dir $(SHLIB_OBJS) $(AR_SL) -o \ shlib/$(BIN_DIR)/$(CLASS).$(SL_EXT).$(MAJOR_VERS).$(MINOR_VERS) \ $(VERS_OPT)$(CLASS).$(SL_EXT).$(MAJOR_VERS) \ $(SHLIB_OBJS) $(LFLAGS) @rm -f shlib/$(BIN_DIR)/$(CLASS).$(SL_EXT) @cd shlib/$(BIN_DIR); \ ln -s $(CLASS).$(SL_EXT).$(MAJOR_VERS).$(MINOR_VERS) $(CLASS).$(SL_EXT) clean: rm -f $(OBJS_DIR)/*.o \ $(OBJS_DIR)/*.so.o \ bin/$(BIN_DIR)/$(CLASS) \ core make_obj_dir: @mkdir -p obj @mkdir -p obj/$(BIN_DIR) make_bin_dir: @mkdir -p bin @mkdir -p bin/$(BIN_DIR) make_shlib_dir: @mkdir -p shlib @mkdir -p shlib/$(BIN_DIR) #----------------------------------------- # Install binary file #----------------------------------------- install: cp bin/$(BIN_DIR)/$(CLASS) $(CPP_SERVERS)/bin #----------------------------------------- # Update class library and header files # recompile without debug mode. #----------------------------------------- lib: clean @make no_debug=1 cp *.h $(CPP_SERVERS)/include ar ruv $(TARGET_LIB) $(OBJS_DIR)/$(CLASS).o ar ruv $(TARGET_LIB) $(OBJS_DIR)/$(CLASS)Class.o ar ruv $(TARGET_LIB) $(OBJS_DIR)/$(CLASS)StateMachine.o ar ruv $(TARGET_LIB) $(OBJS_DIR)/AcquisitionThread.o ident $(TARGET_LIB) | grep $(CLASS) #------------------------------------------------------ # Tag the CVS/SVN module corresponding to this class # copy cvs_tag or svn_tag to tag: entry #------------------------------------------------------ #svn_tag: # svn copy ../trunk ../tags/$(RELEASE) # svn commit ../tags/$(RELEASE) \ # -m "Tagging the $(RELEASE) of the $(CLASS) project." # #cvs_tag: # @cvstag "$(CLASS)-$(RELEASE)" # @make $(CLASS) # @make show_tag #show_cvs_tag: # @cvstag -d # # Only these make options work with the current Pogo version 5.3.x! tag: @cvstag "$(CLASS)-$(RELEASE)" @make $(CLASS) @make show_tag show_tag: @cvstag -d Revision-number: 35 Prop-content-length: 127 Content-length: 127 K 10 svn:author V 5 meyer K 8 svn:date V 27 2010-03-16T15:18:41.000000Z K 7 svn:log V 27 Added Steerer class again. PROPS-END Node-path: powersupply/itest/Bilt/trunk/ClassFactory.cpp Node-kind: file Node-action: change Text-content-length: 2006 Text-content-md5: dbf6af28e954326540e7f7d20a954c1d Content-length: 2006 static const char *RcsId = "$Id: ClassFactory.cpp,v 1.5 2010-03-16 15:18:41 meyer Exp $"; //+============================================================================= // // file : ClassFactory.cpp // // description : C++ source for the class_factory method of the DServer // device class. This method is responsible for the creation of // all class singleton for a device server. It is called // at device server startup // // project : TANGO Device Server // // $Author: meyer $ // // $Revision: 1.5 $ // $Date: 2010-03-16 15:18:41 $ // // SVN only: // $HeadURL: $ // // CVS only: // $Source: /segfs/tango/cvsroot/cppserver/machine/powersupply/SrSteerers/tango/Bilt/ClassFactory.cpp,v $ // $Log: not supported by cvs2svn $ // Revision 1.4 2010/03/16 15:03:33 meyer // Excluded Steerer class. // // Revision 1.3 2010-02-18 19:19:36 meyer // Added Steerer class. // // Revision 1.2 2010/02/10 12:27:31 meyer // Restructured Bilt class. // Acquistion is now done by a thread and only the multi channel data // gets exported. A single channel class (BiltCh) was created. // // Revision 1.1.1.1 2009/11/04 16:23:02 meyer // Imported using TkCVS // // // copyleft : European Synchrotron Radiation Facility // BP 220, Grenoble 38043 // FRANCE // //-============================================================================= // // This file is generated by POGO // (Program Obviously used to Generate tango Object) // // (c) - Software Engineering Group - ESRF //============================================================================= #include #include #include #include /** * Create BiltClass singleton and store it in DServer object. */ void Tango::DServer::class_factory() { add_class(Bilt_ns::BiltClass::init("Bilt")); add_class(BiltCh_ns::BiltChClass::init("BiltCh")); add_class(Steerer_ns::SteererClass::init("Steerer")); } Revision-number: 36 Prop-content-length: 122 Content-length: 122 K 10 svn:author V 5 meyer K 8 svn:date V 27 2010-03-19T15:27:01.000000Z K 7 svn:log V 22 Canged to version 3.2 PROPS-END Node-path: powersupply/itest/Bilt/trunk/Makefile Node-kind: file Node-action: change Text-content-length: 6149 Text-content-md5: 75e9bbafcf5848b69574465398355d86 Content-length: 6149 #============================================================================= # # file : Makefile # # description : Include for the Bilt class. # # project : Makefile to generate a Tango server # # $Author: meyer $ # # $Revision: 1.11 $ # # $Log: not supported by cvs2svn $ # Revision 1.10 2010/03/16 15:03:33 meyer # Excluded Steerer class. # # Revision 1.9 2010/03/16 14:57:56 meyer # Rlease_3_1 # # Revision 1.8 2010-02-11 16:35:27 meyer # Currents settings understand NaN values. # Deleted StePoleCurrent command. # # Revision 1.7 2010/02/10 16:22:15 meyer # Release_3_0 # # Revision 1.6 2010/02/10 12:27:31 meyer # Restructured Bilt class. # Acquistion is now done by a thread and only the multi channel data # gets exported. A single channel class (BiltCh) was created. # # Revision 1.5 2009/12/18 12:02:18 meyer # Changed version number to 2.1 # # Revision 1.4 2009/12/18 10:19:23 meyer # Using libMagnet version 130 now. # # Revision 1.3 2009/11/27 13:49:26 meyer # Modified structure! The pole is no longer a device. # The device is now a magnet with three poles. # # Revision 1.2 2009/11/26 10:46:58 meyer # Updated for libMagnet_V120 # # Revision 1.1.1.1 2009/11/04 16:23:02 meyer # Imported using TkCVS # # # copyleft : European Synchrotron Radiation Facility # BP 220, Grenoble 38043 # FRANCE # #============================================================================= # This file is generated by POGO # (Program Obviously used to Generate tango Object) # # (c) - Software Engineering Group - ESRF #============================================================================= # CLASS = Bilt MAJOR_VERS = 3 MINOR_VERS = 2 RELEASE = Release_$(MAJOR_VERS)_$(MINOR_VERS) OS = $(shell /csadmin/common/scripts/get_os) PROCESSOR = $(shell uname -p) #----------------------------------------- # Set default home directories #----------------------------------------- TANGO_HOME = /segfs/tango/release/$(BIN_DIR) CPP_SERVERS = $(TANGO_HOME)/classes ifdef no_debug DEBUG = -O else DEBUG = -g endif ifdef _solaris CC = CC BIN_DIR=$(OS)_CC AR_SL = $(CC) -mt -G VERS_OPT = -h SL_EXT = so endif ifdef linux CC = c++ CC_SHLIB = $(CC) -fPIC $(PROCESSOR)=1 ifdef x86_64 NBITS=_64 endif BIN_DIR=$(OS)$(NBITS) AR_SL = $(CC) -fPIC -shared SL_EXT = so VERS_OPT = -Wl,-soname, endif INCLUDE_DIRS = -I$(TANGO_HOME)/include -I. \ -I$(CPP_SERVERS)/include \ -I libMagnet_V130 OBJS_DIR = obj/$(BIN_DIR) LIB_DIRS = -L $(CPP_SERVERS)/lib \ -L $(TANGO_HOME)/lib \ -L libMagnet_V130 TARGET_LIB = $(CPP_SERVERS)/lib/libtgclasses.a #----------------------------------------- # Set CXXFLAGS and LFLAGS #----------------------------------------- ifdef _solaris CXXFLAGS = $(DEBUG) -mt -D_PTHREADS $(INCLUDE_DIRS) LFLAGS = $(DEBUG) $(LIB_DIRS) \ -ltango \ -llog4tango \ -lomniORB4 \ -lomniDynamic4 \ -lomnithread \ -lCOS4 \ -lpthread \ -lposix4 -lsocket -lnsl \ -ltgclasses endif ifdef linux CXXFLAGS = -g -D_REENTRANT $(INCLUDE_DIRS) LFLAGS = $(DEBUG) $(LIB_DIRS) \ -ltango \ -llog4tango \ -lomniORB4 \ -lomniDynamic4 \ -lomnithread \ -lCOS4 \ -ldl -lpthread \ -lMagnet \ -ltgclasses endif #----------------------------------------- # Set dependences #----------------------------------------- SVC_OBJS = $(OBJS_DIR)/$(CLASS).o \ $(OBJS_DIR)/$(CLASS)StateMachine.o \ $(OBJS_DIR)/$(CLASS)Class.o \ $(OBJS_DIR)/AcquisitionThread.o \ $(OBJS_DIR)/ClassFactory.o \ $(OBJS_DIR)/main.o SHLIB_OBJS = $(OBJS_DIR)/$(CLASS)Class.so.o \ $(OBJS_DIR)/$(CLASS)StateMachine.so.o \ $(OBJS_DIR)/$(CLASS).so.o \ $(OBJS_DIR)/AcquisitionThread.o SVC_INC = $(CLASS)Class.h \ $(CLASS).h \ AcquisitionThread.h $(OBJS_DIR)/%.o: %.cpp $(SVC_INC) $(CC) $(CXXFLAGS) -c $< -o $(OBJS_DIR)/$*.o $(OBJS_DIR)/%.so.o: %.cpp $(SVC_INC) $(CC_SHLIB) $(CXXFLAGS) -c $< -o $(OBJS_DIR)/$*.so.o #----------------------------------------- # Make Entry #----------------------------------------- all: $(CLASS) $(CLASS): make_obj_dir make_bin_dir $(SVC_OBJS) $(CC) $(SVC_OBJS) -o $(CLASS) $(LFLAGS) @mv $(CLASS) bin/$(BIN_DIR)/$(CLASS) shlib: make_obj_dir make_shlib_dir $(SHLIB_OBJS) $(AR_SL) -o \ shlib/$(BIN_DIR)/$(CLASS).$(SL_EXT).$(MAJOR_VERS).$(MINOR_VERS) \ $(VERS_OPT)$(CLASS).$(SL_EXT).$(MAJOR_VERS) \ $(SHLIB_OBJS) $(LFLAGS) @rm -f shlib/$(BIN_DIR)/$(CLASS).$(SL_EXT) @cd shlib/$(BIN_DIR); \ ln -s $(CLASS).$(SL_EXT).$(MAJOR_VERS).$(MINOR_VERS) $(CLASS).$(SL_EXT) clean: rm -f $(OBJS_DIR)/*.o \ $(OBJS_DIR)/*.so.o \ bin/$(BIN_DIR)/$(CLASS) \ core make_obj_dir: @mkdir -p obj @mkdir -p obj/$(BIN_DIR) make_bin_dir: @mkdir -p bin @mkdir -p bin/$(BIN_DIR) make_shlib_dir: @mkdir -p shlib @mkdir -p shlib/$(BIN_DIR) #----------------------------------------- # Install binary file #----------------------------------------- install: cp bin/$(BIN_DIR)/$(CLASS) $(CPP_SERVERS)/bin #----------------------------------------- # Update class library and header files # recompile without debug mode. #----------------------------------------- lib: clean @make no_debug=1 cp *.h $(CPP_SERVERS)/include ar ruv $(TARGET_LIB) $(OBJS_DIR)/$(CLASS).o ar ruv $(TARGET_LIB) $(OBJS_DIR)/$(CLASS)Class.o ar ruv $(TARGET_LIB) $(OBJS_DIR)/$(CLASS)StateMachine.o ar ruv $(TARGET_LIB) $(OBJS_DIR)/AcquisitionThread.o ident $(TARGET_LIB) | grep $(CLASS) #------------------------------------------------------ # Tag the CVS/SVN module corresponding to this class # copy cvs_tag or svn_tag to tag: entry #------------------------------------------------------ #svn_tag: # svn copy ../trunk ../tags/$(RELEASE) # svn commit ../tags/$(RELEASE) \ # -m "Tagging the $(RELEASE) of the $(CLASS) project." # #cvs_tag: # @cvstag "$(CLASS)-$(RELEASE)" # @make $(CLASS) # @make show_tag #show_cvs_tag: # @cvstag -d # # Only these make options work with the current Pogo version 5.3.x! tag: @cvstag "$(CLASS)-$(RELEASE)" @make $(CLASS) @make show_tag show_tag: @cvstag -d Revision-number: 37 Prop-content-length: 147 Content-length: 147 K 8 svn:date V 27 2010-03-19T15:27:02.000000Z K 7 svn:log V 73 This commit was manufactured by cvs2svn to create tag 'Bilt-Release_3_2'. PROPS-END Node-path: powersupply/itest/Bilt/tags/Bilt-Release_3_2 Node-kind: dir Node-action: add Node-copyfrom-rev: 36 Node-copyfrom-path: powersupply/itest/Bilt/trunk Revision-number: 38 Prop-content-length: 122 Content-length: 122 K 10 svn:author V 5 meyer K 8 svn:date V 27 2010-03-19T15:28:01.000000Z K 7 svn:log V 22 Canged to version 1.1 PROPS-END Node-path: powersupply/itest/BiltCh/trunk/Makefile Node-kind: file Node-action: change Text-content-length: 5111 Text-content-md5: 5d540647dde03b45c71d7557136bae88 Content-length: 5111 #============================================================================= # # file : Makefile # # description : Include for the BiltCh class. # # project : Makefile to generate a Tango server # # $Author: meyer $ # # $Revision: 1.3 $ # # $Log: not supported by cvs2svn $ # Revision 1.2 2010-02-11 16:36:31 meyer # Currents attribute of Bilt understand NaN values now. # # Revision 1.1.1.1 2010-02-10 11:49:21 meyer # Imported using TkCVS # # # copyleft : European Synchrotron Radiation Facility # BP 220, Grenoble 38043 # FRANCE # #============================================================================= # This file is generated by POGO # (Program Obviously used to Generate tango Object) # # (c) - Software Engineering Group - ESRF #============================================================================= # CLASS = BiltCh MAJOR_VERS = 1 MINOR_VERS = 1 RELEASE = Release_$(MAJOR_VERS)_$(MINOR_VERS) OS = $(shell /csadmin/common/scripts/get_os) PROCESSOR = $(shell uname -p) #----------------------------------------- # Set default home directories #----------------------------------------- TANGO_HOME = /segfs/tango/release/$(BIN_DIR) CPP_SERVERS = $(TANGO_HOME)/classes ifdef no_debug DEBUG = -O else DEBUG = -g endif ifdef _solaris CC = CC BIN_DIR=$(OS)_CC AR_SL = $(CC) -mt -G VERS_OPT = -h SL_EXT = so endif ifdef linux CC = c++ CC_SHLIB = $(CC) -fPIC $(PROCESSOR)=1 ifdef x86_64 NBITS=_64 endif BIN_DIR=$(OS)$(NBITS) AR_SL = $(CC) -fPIC -shared SL_EXT = so VERS_OPT = -Wl,-soname, endif INCLUDE_DIRS = -I$(TANGO_HOME)/include -I. \ -I$(CPP_SERVERS)/include OBJS_DIR = obj/$(BIN_DIR) LIB_DIRS = -L $(CPP_SERVERS)/lib \ -L $(TANGO_HOME)/lib \ TARGET_LIB = $(CPP_SERVERS)/lib/libtgclasses.a #----------------------------------------- # Set CXXFLAGS and LFLAGS #----------------------------------------- ifdef _solaris CXXFLAGS = $(DEBUG) -mt -D_PTHREADS $(INCLUDE_DIRS) LFLAGS = $(DEBUG) $(LIB_DIRS) \ -ltango \ -llog4tango \ -lomniORB4 \ -lomniDynamic4 \ -lomnithread \ -lCOS4 \ -lpthread \ -lposix4 -lsocket -lnsl endif ifdef linux CXXFLAGS = -g -D_REENTRANT $(INCLUDE_DIRS) LFLAGS = $(DEBUG) $(LIB_DIRS) \ -ltango \ -llog4tango \ -lomniORB4 \ -lomniDynamic4 \ -lomnithread \ -lCOS4 \ -ldl -lpthread endif #----------------------------------------- # Set dependences #----------------------------------------- SVC_OBJS = $(OBJS_DIR)/$(CLASS).o \ $(OBJS_DIR)/$(CLASS)StateMachine.o \ $(OBJS_DIR)/$(CLASS)Class.o \ $(OBJS_DIR)/ClassFactory.o \ $(OBJS_DIR)/main.o SHLIB_OBJS = $(OBJS_DIR)/$(CLASS)Class.so.o \ $(OBJS_DIR)/$(CLASS)StateMachine.so.o \ $(OBJS_DIR)/$(CLASS).so.o SVC_INC = $(CLASS)Class.h \ $(CLASS).h $(OBJS_DIR)/%.o: %.cpp $(SVC_INC) $(CC) $(CXXFLAGS) -c $< -o $(OBJS_DIR)/$*.o $(OBJS_DIR)/%.so.o: %.cpp $(SVC_INC) $(CC_SHLIB) $(CXXFLAGS) -c $< -o $(OBJS_DIR)/$*.so.o #----------------------------------------- # Make Entry #----------------------------------------- all: $(CLASS) $(CLASS): make_obj_dir make_bin_dir $(SVC_OBJS) $(CC) $(SVC_OBJS) -o $(CLASS) $(LFLAGS) @mv $(CLASS) bin/$(BIN_DIR)/$(CLASS) shlib: make_obj_dir make_shlib_dir $(SHLIB_OBJS) $(AR_SL) -o \ shlib/$(BIN_DIR)/$(CLASS).$(SL_EXT).$(MAJOR_VERS).$(MINOR_VERS) \ $(VERS_OPT)$(CLASS).$(SL_EXT).$(MAJOR_VERS) \ $(SHLIB_OBJS) $(LFLAGS) @rm -f shlib/$(BIN_DIR)/$(CLASS).$(SL_EXT) @cd shlib/$(BIN_DIR); \ ln -s $(CLASS).$(SL_EXT).$(MAJOR_VERS).$(MINOR_VERS) $(CLASS).$(SL_EXT) clean: rm -f $(OBJS_DIR)/*.o \ $(OBJS_DIR)/*.so.o \ bin/$(BIN_DIR)/$(CLASS) \ core make_obj_dir: @mkdir -p obj @mkdir -p obj/$(BIN_DIR) make_bin_dir: @mkdir -p bin @mkdir -p bin/$(BIN_DIR) make_shlib_dir: @mkdir -p shlib @mkdir -p shlib/$(BIN_DIR) #----------------------------------------- # Install binary file #----------------------------------------- install: cp bin/$(BIN_DIR)/$(CLASS) $(CPP_SERVERS)/bin #----------------------------------------- # Update class library and header files # recompile without debug mode. #----------------------------------------- lib: clean @make no_debug=1 cp *.h $(CPP_SERVERS)/include ar ruv $(TARGET_LIB) $(OBJS_DIR)/$(CLASS).o ar ruv $(TARGET_LIB) $(OBJS_DIR)/$(CLASS)Class.o ar ruv $(TARGET_LIB) $(OBJS_DIR)/$(CLASS)StateMachine.o ident $(TARGET_LIB) | grep $(CLASS) #------------------------------------------------------ # Tag the CVS/SVN module corresponding to this class # copy cvs_tag or svn_tag to tag: entry #------------------------------------------------------ #svn_tag: # svn copy ../trunk ../tags/$(RELEASE) # svn commit ../tags/$(RELEASE) \ # -m "Tagging the $(RELEASE) of the $(CLASS) project." # #cvs_tag: # @cvstag "$(CLASS)-$(RELEASE)" # @make $(CLASS) # @make show_tag #show_cvs_tag: # @cvstag -d # # Only these make options work with the current Pogo version 5.3.x! tag: @cvstag "$(CLASS)-$(RELEASE)" @make $(CLASS) @make show_tag show_tag: @cvstag -d Revision-number: 39 Prop-content-length: 149 Content-length: 149 K 8 svn:date V 27 2010-03-19T15:28:02.000000Z K 7 svn:log V 75 This commit was manufactured by cvs2svn to create tag 'BiltCh-Release_1_1'. PROPS-END Node-path: powersupply/itest/BiltCh/tags/BiltCh-Release_1_1 Node-kind: dir Node-action: add Node-copyfrom-rev: 38 Node-copyfrom-path: powersupply/itest/BiltCh/trunk Revision-number: 40 Prop-content-length: 133 Content-length: 133 K 10 svn:author V 5 meyer K 8 svn:date V 27 2010-05-01T16:25:41.000000Z K 7 svn:log V 33 Modified impedance alarm limits. PROPS-END Node-path: powersupply/itest/BiltCh/trunk/BiltCh.cpp Node-kind: file Node-action: change Text-content-length: 18359 Text-content-md5: d394abb0ba1c24b166d7adf1c4db70c3 Content-length: 18359 static const char *RcsId = "$Id: BiltCh.cpp,v 1.4 2010-05-01 16:25:41 meyer Exp $"; //+============================================================================= // // file : BiltCh.cpp // // description : C++ source for the BiltCh and its commands. // The class is derived from Device. It represents the // CORBA servant object which will be accessed from the // network. All commands which can be executed on the // BiltCh are implemented in this file. // // project : TANGO Device Server // // $Author: meyer $ // // $Revision: 1.4 $ // // $Revision: 1.4 $ // $Date: 2010-05-01 16:25:41 $ // // SVN only: // $HeadURL: $ // // CVS only: // $Source: /segfs/tango/cvsroot/cppserver/machine/powersupply/SrSteerers/tango/BiltCh/BiltCh.cpp,v $ // $Log: not supported by cvs2svn $ // Revision 1.3 2010-02-12 16:31:49 meyer // Added SetPoleCurrent again. // // Revision 1.2 2010-02-11 16:36:31 meyer // Currents attribute of Bilt understand NaN values now. // // Revision 1.1.1.1 2010-02-10 11:49:21 meyer // Imported using TkCVS // // // copyleft : European Synchrotron Radiation Facility // BP 220, Grenoble 38043 // FRANCE // //-============================================================================= // // This file is generated by POGO // (Program Obviously used to Generate tango Object) // // (c) - Software Engineering Group - ESRF //============================================================================= //=================================================================== // // The following table gives the correspondence // between commands and method name. // // Command name| Method name // ---------------------------------------- // State | dev_state() // Status | dev_status() // //=================================================================== #include #include #include #include namespace BiltCh_ns { //+---------------------------------------------------------------------------- // // method : BiltCh::BiltCh(string &s) // // description : constructor for simulated BiltCh // // in : - cl : Pointer to the DeviceClass object // - s : Device name // //----------------------------------------------------------------------------- BiltCh::BiltCh(Tango::DeviceClass *cl,string &s) :Tango::Device_4Impl(cl,s.c_str()) { init_device(); } BiltCh::BiltCh(Tango::DeviceClass *cl,const char *s) :Tango::Device_4Impl(cl,s) { init_device(); } BiltCh::BiltCh(Tango::DeviceClass *cl,const char *s,const char *d) :Tango::Device_4Impl(cl,s,d) { init_device(); } //+---------------------------------------------------------------------------- // // method : BiltCh::delete_device() // // description : will be called at device destruction or at init command. // //----------------------------------------------------------------------------- void BiltCh::delete_device() { // Delete device allocated objects if ( bilt_obj != NULL ) { delete bilt_obj; } } //+---------------------------------------------------------------------------- // // method : BiltCh::init_device() // // description : will be called at device initialization. // //----------------------------------------------------------------------------- void BiltCh::init_device() { INFO_STREAM << "BiltCh::BiltCh() create device " << device_name << endl; // Initialise variables to default values //-------------------------------------------- get_device_property(); set_state (Tango::UNKNOWN); // open proxy to Bilt power supply try { bilt_obj = new Tango::DeviceProxy(biltName); Tango::DeviceAttribute rattr; Tango::DevState bilt_state; rattr = bilt_obj->read_attribute("State"); rattr >> bilt_state; set_state (bilt_state); bilt_init = true; } catch (Tango::DevFailed &e) { bilt_error = e.errors; bilt_init = false; } } //+---------------------------------------------------------------------------- // // method : BiltCh::get_device_property() // // description : Read the device properties from database. // //----------------------------------------------------------------------------- void BiltCh::get_device_property() { // Initialize your default values here (if not done with POGO). //------------------------------------------------------------------ bilt_obj = NULL; current = 0; voltage = 0; impedance = 0; current_rms = 0; current_average = 0; error_counter = 0; errors_per_sec = 0; frames_per_sec = 0; local_control = false; current_ac = 0; // Read device properties from database.(Automatic code generation) //------------------------------------------------------------------ Tango::DbData dev_prop; dev_prop.push_back(Tango::DbDatum("BiltName")); dev_prop.push_back(Tango::DbDatum("PoleNumber")); // Call database and extract values //-------------------------------------------- if (Tango::Util::instance()->_UseDb==true) get_db_device()->get_property(dev_prop); Tango::DbDatum def_prop, cl_prop; BiltChClass *ds_class = (static_cast(get_device_class())); int i = -1; // Try to initialize BiltName from class property cl_prop = ds_class->get_class_property(dev_prop[++i].name); if (cl_prop.is_empty()==false) cl_prop >> biltName; else { // Try to initialize BiltName from default device value def_prop = ds_class->get_default_device_property(dev_prop[i].name); if (def_prop.is_empty()==false) def_prop >> biltName; } // And try to extract BiltName value from database if (dev_prop[i].is_empty()==false) dev_prop[i] >> biltName; // Try to initialize PoleNumber from class property cl_prop = ds_class->get_class_property(dev_prop[++i].name); if (cl_prop.is_empty()==false) cl_prop >> poleNumber; else { // Try to initialize PoleNumber from default device value def_prop = ds_class->get_default_device_property(dev_prop[i].name); if (def_prop.is_empty()==false) def_prop >> poleNumber; } // And try to extract PoleNumber value from database if (dev_prop[i].is_empty()==false) dev_prop[i] >> poleNumber; // End of Automatic code generation //------------------------------------------------------------------ } //+---------------------------------------------------------------------------- // // method : BiltCh::always_executed_hook() // // description : method always executed before any command is executed // //----------------------------------------------------------------------------- void BiltCh::always_executed_hook() { } //+---------------------------------------------------------------------------- // // method : BiltCh::read_attr_hardware // // description : Hardware acquisition for attributes. // //----------------------------------------------------------------------------- void BiltCh::read_attr_hardware(vector &attr_list) { DEBUG_STREAM << "BiltCh::read_attr_hardware(vector &attr_list) entering... "<< endl; // Add your own code here if ( bilt_init == false ) { TangoSys_MemStream tms; tms << "Device is not correctly initialised! See the device status for more information." << endl; Tango::Except::throw_exception("ReadError", tms.str(), "Bilt::read_attr_hardware"); } } //+---------------------------------------------------------------------------- // // method : BiltCh::read_Current // // description : Extract real attribute values for Current acquisition result. // //----------------------------------------------------------------------------- void BiltCh::read_Current(Tango::Attribute &attr) { DEBUG_STREAM << "BiltCh::read_Current(Tango::Attribute &attr) entering... "<< endl; Tango::DeviceAttribute rattr; vector values; rattr = bilt_obj->read_attribute("Currents"); rattr >> values; Tango::MultiAttribute *attr_list = get_device_attr(); Tango::WAttribute &attr_curr = attr_list->get_w_attr_by_name ("Current"); attr_curr.set_write_value( &(values[POLES + poleNumber]) ); current = values[poleNumber]; attr.set_value (¤t); } //+---------------------------------------------------------------------------- // // method : BiltCh::write_Current // // description : Write Current attribute values to hardware. // //----------------------------------------------------------------------------- void BiltCh::write_Current(Tango::WAttribute &attr) { DEBUG_STREAM << "BiltCh::write_Current(Tango::WAttribute &attr) entering... "<< endl; double set_current; attr.get_write_value(set_current); Tango::DeviceData argin; vector cmd_in; cmd_in.push_back (poleNumber); cmd_in.push_back (set_current); argin << cmd_in; bilt_obj->command_inout("SetPoleCurrent", argin); } //+---------------------------------------------------------------------------- // // method : BiltCh::read_Voltage // // description : Extract real attribute values for Voltage acquisition result. // //----------------------------------------------------------------------------- void BiltCh::read_Voltage(Tango::Attribute &attr) { DEBUG_STREAM << "BiltCh::read_Voltage(Tango::Attribute &attr) entering... "<< endl; Tango::DeviceAttribute rattr; vector values; rattr = bilt_obj->read_attribute("Voltages"); rattr >> values; voltage = values[poleNumber]; attr.set_value (&voltage); } //+---------------------------------------------------------------------------- // // method : BiltCh::read_Impedance // // description : Extract real attribute values for Impedance acquisition result. // //----------------------------------------------------------------------------- void BiltCh::read_Impedance(Tango::Attribute &attr) { DEBUG_STREAM << "BiltCh::read_Impedance(Tango::Attribute &attr) entering... "<< endl; Tango::DeviceAttribute rattr; vector values; rattr = bilt_obj->read_attribute("Impedances"); rattr >> values; impedance = values[poleNumber]; attr.set_value (&impedance); } //+---------------------------------------------------------------------------- // // method : BiltCh::read_SetCurrentRMS // // description : Extract real attribute values for SetCurrentRMS acquisition result. // //----------------------------------------------------------------------------- void BiltCh::read_SetCurrentRMS(Tango::Attribute &attr) { DEBUG_STREAM << "BiltCh::read_SetCurrentRMS(Tango::Attribute &attr) entering... "<< endl; Tango::DeviceAttribute rattr; vector values; rattr = bilt_obj->read_attribute("SetCurrentsRMS"); rattr >> values; current_rms = values[poleNumber]; attr.set_value (¤t_rms); } //+---------------------------------------------------------------------------- // // method : BiltCh::read_SetCurrentAverage // // description : Extract real attribute values for SetCurrentAverage acquisition result. // //----------------------------------------------------------------------------- void BiltCh::read_SetCurrentAverage(Tango::Attribute &attr) { DEBUG_STREAM << "BiltCh::read_SetCurrentAverage(Tango::Attribute &attr) entering... "<< endl; Tango::DeviceAttribute rattr; vector values; rattr = bilt_obj->read_attribute("SetCurrentsAverage"); rattr >> values; current_average = values[poleNumber]; attr.set_value (¤t_average); } //+---------------------------------------------------------------------------- // // method : BiltCh::read_FramesPerSec // // description : Extract real attribute values for FramesPerSec acquisition result. // //----------------------------------------------------------------------------- void BiltCh::read_FramesPerSecond(Tango::Attribute &attr) { DEBUG_STREAM << "BiltCh::read_FramesPerSec(Tango::Attribute &attr) entering... "<< endl; Tango::DeviceAttribute rattr; vector values; rattr = bilt_obj->read_attribute("FramesPerSecond"); rattr >> values; frames_per_sec = values[poleNumber]; attr.set_value (&frames_per_sec); } //+---------------------------------------------------------------------------- // // method : BiltCh::read_ErrorPerSec // // description : Extract real attribute values for ErrorPerSec acquisition result. // //----------------------------------------------------------------------------- void BiltCh::read_ErrorPerSecond(Tango::Attribute &attr) { DEBUG_STREAM << "BiltCh::read_ErrorPerSec(Tango::Attribute &attr) entering... "<< endl; Tango::DeviceAttribute rattr; vector values; rattr = bilt_obj->read_attribute("ErrorsPerSecond"); rattr >> values; errors_per_sec = values[poleNumber]; attr.set_value (&errors_per_sec); } //+---------------------------------------------------------------------------- // // method : BiltCh::read_ErrorCounter // // description : Extract real attribute values for ErrorCounter acquisition result. // //----------------------------------------------------------------------------- void BiltCh::read_ErrorCounter(Tango::Attribute &attr) { DEBUG_STREAM << "BiltCh::read_ErrorCounter(Tango::Attribute &attr) entering... "<< endl; Tango::DeviceAttribute rattr; vector values; rattr = bilt_obj->read_attribute("ErrorCounters"); rattr >> values; error_counter = values[poleNumber]; attr.set_value (&error_counter); } //+---------------------------------------------------------------------------- // // method : BiltCh::read_LocalControl // // description : Extract real attribute values for LocalControl acquisition result. // //----------------------------------------------------------------------------- void BiltCh::read_LocalControl(Tango::Attribute &attr) { DEBUG_STREAM << "BiltCh::read_LocalControl(Tango::Attribute &attr) entering... "<< endl; Tango::DeviceAttribute rattr; vector values; rattr = bilt_obj->read_attribute("LocalControls"); rattr >> values; local_control = values[poleNumber]; attr.set_value (&local_control); } //+---------------------------------------------------------------------------- // // method : BiltCh::write_LocalControl // // description : Write LocalControl attribute values to hardware. // //----------------------------------------------------------------------------- void BiltCh::write_LocalControl(Tango::WAttribute &attr) { DEBUG_STREAM << "BiltCh::write_LocalControl(Tango::WAttribute &attr) entering... "<< endl; bool local_control; attr.get_write_value(local_control); Tango::DeviceData argin; vector cmd_in; cmd_in.push_back (poleNumber); if (local_control == true) cmd_in.push_back (1); else { cmd_in.push_back (0); // set back the AC current setpoint to 0! Tango::DeviceData ac_curr; vector ac_in; ac_in.push_back (poleNumber); ac_in.push_back (0); ac_curr << ac_in; bilt_obj->command_inout("SetPoleAcCurrent", ac_curr); current_ac = 0; } argin << cmd_in; bilt_obj->command_inout("LocalPoleControl", argin); } //+---------------------------------------------------------------------------- // // method : BiltCh::read_SetCurrentAC // // description : Extract real attribute values for SetCurrentAC acquisition result. // //----------------------------------------------------------------------------- void BiltCh::read_SetCurrentAC(Tango::Attribute &attr) { DEBUG_STREAM << "BiltCh::read_SetCurrentAC(Tango::Attribute &attr) entering... "<< endl; if ( local_control == false ) { attr.set_quality (Tango::ATTR_INVALID); } else { attr.set_value (¤t_ac); } } //+---------------------------------------------------------------------------- // // method : BiltCh::write_SetCurrentAC // // description : Write SetCurrentAC attribute values to hardware. // //----------------------------------------------------------------------------- void BiltCh::write_SetCurrentAC(Tango::WAttribute &attr) { DEBUG_STREAM << "BiltCh::write_SetCurrentAC(Tango::WAttribute &attr) entering... "<< endl; if ( local_control == false ) { TangoSys_MemStream tms; tms << "Can set AC current only when local control enabled!" << endl; Tango::Except::throw_exception("WriteError", tms.str(), "Bilt::write_SetCurrentAC"); } double set_current; attr.get_write_value(set_current); Tango::DeviceData argin; vector cmd_in; cmd_in.push_back (poleNumber); cmd_in.push_back (set_current); argin << cmd_in; bilt_obj->command_inout("SetPoleAcCurrent", argin); current_ac = set_current; } //+------------------------------------------------------------------ /** * method: BiltCh::dev_state * * description: method to execute "State" * This command gets the device state (stored in its device_state data member) and returns it to the caller. * * @return State Code * */ //+------------------------------------------------------------------ Tango::DevState BiltCh::dev_state() { Tango::DevState argout = DeviceImpl::dev_state(); DEBUG_STREAM << "BiltCh::dev_state(): entering... !" << endl; // Add your own code to control device here if ( bilt_init == true ) { Tango::DeviceAttribute rattr; Tango::DevState bilt_state; rattr = bilt_obj->read_attribute("State"); rattr >> bilt_state; set_state (bilt_state); } return get_state(); } //+------------------------------------------------------------------ /** * method: BiltCh::dev_status * * description: method to execute "Status" * This command gets the device status (stored in its device_status data member) and returns it to the caller. * * @return Status description * */ //+------------------------------------------------------------------ Tango::ConstDevString BiltCh::dev_status() { //Tango::ConstDevString argout = DeviceImpl::dev_status(); DEBUG_STREAM << "BiltCh::dev_status(): entering... !" << endl; // Add your own code to control device here string bilt_status; if ( bilt_init == true ) { Tango::DeviceAttribute rattr; rattr = bilt_obj->read_attribute("Status"); rattr >> bilt_status; set_status (bilt_status); } else { bilt_status = "Error during initialisation: \n"; for (short i = 0; i //using namespace Tango; /** * @author $Author: meyer $ * @version $Revision: 1.2 $ */ // Add your own constant definitions here. //----------------------------------------------- // Number of poles per magnet #define POLES 3 namespace BiltCh_ns { /** * Class Description: * The Bilt multi channel power supply has three individual channels. * This class offers an interface to an individual channel of the power supply. */ /* * Device States Description: * Tango::ON : Magnet is ON, all three channels are ON. * Tango::OFF : Magnet is OFF, all three channels are OFF. * Tango::FAULT : Error detected by the BILT magnet. * Tango::ALARM : Alarm detected on one or more channels. * Tango::UNKNOWN : Communication fault */ class BiltCh: public Tango::Device_4Impl { public : // Add your own data members here //----------------------------------------- // Here is the Start of the automatic code generation part //------------------------------------------------------------- /** * @name attributes * Attribute member data. */ //@{ Tango::DevDouble *attr_Current_read; Tango::DevDouble attr_Current_write; Tango::DevDouble *attr_Voltage_read; Tango::DevDouble *attr_Impedance_read; Tango::DevDouble *attr_SetCurrentRMS_read; Tango::DevDouble *attr_SetCurrentAverage_read; Tango::DevULong *attr_FramesPerSecond_read; Tango::DevULong *attr_ErrorPerSecond_read; Tango::DevULong *attr_ErrorCounter_read; Tango::DevBoolean *attr_LocalControl_read; Tango::DevBoolean attr_LocalControl_write; Tango::DevDouble *attr_SetCurrentAC_read; Tango::DevDouble attr_SetCurrentAC_write; //@} /** * @name Device properties * Device properties member data. */ //@{ /** * Name of the Bilt multi channel power supply device * */ string biltName; /** * The number of the channel or Pole of the Bilt power supply [0 -2] */ Tango::DevShort poleNumber; //@} /** * @name Device properties * Device property member data. */ //@{ //@} /**@name Constructors * Miscellaneous constructors */ //@{ /** * Constructs a newly allocated Command object. * * @param cl Class. * @param s Device Name */ BiltCh(Tango::DeviceClass *cl,string &s); /** * Constructs a newly allocated Command object. * * @param cl Class. * @param s Device Name */ BiltCh(Tango::DeviceClass *cl,const char *s); /** * Constructs a newly allocated Command object. * * @param cl Class. * @param s Device name * @param d Device description. */ BiltCh(Tango::DeviceClass *cl,const char *s,const char *d); //@} /**@name Destructor * Only one destructor is defined for this class */ //@{ /** * The object destructor. */ ~BiltCh() {delete_device();}; /** * will be called at device destruction or at init command. */ void delete_device(); //@} /**@name Miscellaneous methods */ //@{ /** * Initialize the device */ virtual void init_device(); /** * Always executed method before execution command method. */ virtual void always_executed_hook(); //@} /** * @name BiltCh methods prototypes */ //@{ /** * Hardware acquisition for attributes. */ virtual void read_attr_hardware(vector &attr_list); /** * Extract real attribute values for Current acquisition result. */ virtual void read_Current(Tango::Attribute &attr); /** * Write Current attribute values to hardware. */ virtual void write_Current(Tango::WAttribute &attr); /** * Extract real attribute values for Voltage acquisition result. */ virtual void read_Voltage(Tango::Attribute &attr); /** * Extract real attribute values for Impedance acquisition result. */ virtual void read_Impedance(Tango::Attribute &attr); /** * Extract real attribute values for SetCurrentRMS acquisition result. */ virtual void read_SetCurrentRMS(Tango::Attribute &attr); /** * Extract real attribute values for SetCurrentAverage acquisition result. */ virtual void read_SetCurrentAverage(Tango::Attribute &attr); /** * Extract real attribute values for FramesPerSecond acquisition result. */ virtual void read_FramesPerSecond(Tango::Attribute &attr); /** * Extract real attribute values for ErrorPerSecond acquisition result. */ virtual void read_ErrorPerSecond(Tango::Attribute &attr); /** * Extract real attribute values for ErrorCounter acquisition result. */ virtual void read_ErrorCounter(Tango::Attribute &attr); /** * Extract real attribute values for LocalControl acquisition result. */ virtual void read_LocalControl(Tango::Attribute &attr); /** * Write LocalControl attribute values to hardware. */ virtual void write_LocalControl(Tango::WAttribute &attr); /** * Extract real attribute values for SetCurrentAC acquisition result. */ virtual void read_SetCurrentAC(Tango::Attribute &attr); /** * Write SetCurrentAC attribute values to hardware. */ virtual void write_SetCurrentAC(Tango::WAttribute &attr); /** * Read/Write allowed for Current attribute. */ virtual bool is_Current_allowed(Tango::AttReqType type); /** * Read/Write allowed for Voltage attribute. */ virtual bool is_Voltage_allowed(Tango::AttReqType type); /** * Read/Write allowed for Impedance attribute. */ virtual bool is_Impedance_allowed(Tango::AttReqType type); /** * Read/Write allowed for SetCurrentRMS attribute. */ virtual bool is_SetCurrentRMS_allowed(Tango::AttReqType type); /** * Read/Write allowed for SetCurrentAverage attribute. */ virtual bool is_SetCurrentAverage_allowed(Tango::AttReqType type); /** * Read/Write allowed for FramesPerSecond attribute. */ virtual bool is_FramesPerSecond_allowed(Tango::AttReqType type); /** * Read/Write allowed for ErrorPerSecond attribute. */ virtual bool is_ErrorPerSecond_allowed(Tango::AttReqType type); /** * Read/Write allowed for ErrorCounter attribute. */ virtual bool is_ErrorCounter_allowed(Tango::AttReqType type); /** * Read/Write allowed for LocalControl attribute. */ virtual bool is_LocalControl_allowed(Tango::AttReqType type); /** * Read/Write allowed for SetCurrentAC attribute. */ virtual bool is_SetCurrentAC_allowed(Tango::AttReqType type); /** * This command gets the device state (stored in its device_state data member) and returns it to the caller. * @return State Code * @exception DevFailed */ virtual Tango::DevState dev_state(); /** * This command gets the device status (stored in its device_status data member) and returns it to the caller. * @return Status description * @exception DevFailed */ virtual Tango::ConstDevString dev_status(); /** * Read the device properties from database */ void get_device_property(); //@} // Here is the end of the automatic code generation part //------------------------------------------------------------- protected : // Add your own data members here //----------------------------------------- Tango::DeviceProxy *bilt_obj; Tango::DevErrorList bilt_error; bool bilt_init; double current; double voltage; double impedance; double current_rms; double current_average; Tango::DevULong error_counter; Tango::DevULong errors_per_sec; Tango::DevULong frames_per_sec; bool local_control; double current_ac; }; } // namespace_ns #endif // _BILTCH_H Node-path: powersupply/itest/BiltCh/trunk/BiltChClass.cpp Node-kind: file Node-action: change Text-content-length: 18758 Text-content-md5: 62d2ffb60e9fbf15c4926e1e082c5fc1 Content-length: 18758 static const char *ClassId = "$Id: BiltChClass.cpp,v 1.3 2010-05-01 16:25:41 meyer Exp $"; static const char *TagName = "$Name: not supported by cvs2svn $"; static const char *CvsPath = "$Source: /segfs/tango/cvsroot/cppserver/machine/powersupply/SrSteerers/tango/BiltCh/BiltChClass.cpp,v $"; static const char *SvnPath = "$HeadURL: $"; static const char *HttpServer = "http://www.esrf.fr/computing/cs/tango/tango_doc/ds_doc/"; //+============================================================================= // // file : BiltChClass.cpp // // description : C++ source for the BiltChClass. A singleton // class derived from DeviceClass. It implements the // command list and all properties and methods required // by the BiltCh once per process. // // project : TANGO Device Server // // $Author: meyer $ // // $Revision: 1.3 $ // // $Log: not supported by cvs2svn $ // Revision 1.2 2010-02-10 16:22:40 meyer // Release_1_0 // // Revision 1.1.1.1 2010-02-10 11:49:21 meyer // Imported using TkCVS // // // copyleft : European Synchrotron Radiation Facility // BP 220, Grenoble 38043 // FRANCE // //-============================================================================= // // This file is generated by POGO // (Program Obviously used to Generate tango Object) // // (c) - Software Engineering Group - ESRF //============================================================================= #include #include #include //+---------------------------------------------------------------------------- /** * Create BiltChClass singleton and return it in a C function for Python usage */ //+---------------------------------------------------------------------------- extern "C" { #ifdef WIN32 __declspec(dllexport) #endif Tango::DeviceClass *_create_BiltCh_class(const char *name) { return BiltCh_ns::BiltChClass::init(name); } } namespace BiltCh_ns { // //---------------------------------------------------------------- // Initialize pointer for singleton pattern //---------------------------------------------------------------- // BiltChClass *BiltChClass::_instance = NULL; //+---------------------------------------------------------------------------- // // method : BiltChClass::BiltChClass(string &s) // // description : constructor for the BiltChClass // // in : - s : The class name // //----------------------------------------------------------------------------- BiltChClass::BiltChClass(string &s):DeviceClass(s) { cout2 << "Entering BiltChClass constructor" << endl; set_default_property(); get_class_property(); write_class_property(); cout2 << "Leaving BiltChClass constructor" << endl; } //+---------------------------------------------------------------------------- // // method : BiltChClass::~BiltChClass() // // description : destructor for the BiltChClass // //----------------------------------------------------------------------------- BiltChClass::~BiltChClass() { _instance = NULL; } //+---------------------------------------------------------------------------- // // method : BiltChClass::instance // // description : Create the object if not already done. Otherwise, just // return a pointer to the object // // in : - name : The class name // //----------------------------------------------------------------------------- BiltChClass *BiltChClass::init(const char *name) { if (_instance == NULL) { try { string s(name); _instance = new BiltChClass(s); } catch (bad_alloc) { throw; } } return _instance; } BiltChClass *BiltChClass::instance() { if (_instance == NULL) { cerr << "Class is not initialised !!" << endl; exit(-1); } return _instance; } //+---------------------------------------------------------------------------- // // method : BiltChClass::command_factory // // description : Create the command object(s) and store them in the // command list // //----------------------------------------------------------------------------- void BiltChClass::command_factory() { // add polling if any for (unsigned int i=0 ; ilength() ; i++) { cout4 << "Device name : " << (*devlist_ptr)[i].in() << endl; // Create devices and add it into the device list //---------------------------------------------------- device_list.push_back(new BiltCh(this, (*devlist_ptr)[i])); // Export device to the outside world // Check before if database used. //--------------------------------------------- if ((Tango::Util::_UseDb == true) && (Tango::Util::_FileDb == false)) export_device(device_list.back()); else export_device(device_list.back(), (*devlist_ptr)[i]); } // End of Automatic code generation //------------------------------------------------------------- } //+---------------------------------------------------------------------------- // Method: BiltChClass::attribute_factory(vector &att_list) //----------------------------------------------------------------------------- void BiltChClass::attribute_factory(vector &att_list) { // Attribute : Current CurrentAttrib *current = new CurrentAttrib(); Tango::UserDefaultAttrProp current_prop; current_prop.set_label("DC Current"); current_prop.set_unit("A"); current_prop.set_format("%6.4f"); current_prop.set_max_value("1.8"); current_prop.set_min_value("-1.8"); current_prop.set_description("The DC current of the selected pole."); current->set_default_properties(current_prop); att_list.push_back(current); // Attribute : Voltage VoltageAttrib *voltage = new VoltageAttrib(); Tango::UserDefaultAttrProp voltage_prop; voltage_prop.set_label("Voltage"); voltage_prop.set_unit("V"); voltage_prop.set_format("%6.4f"); voltage_prop.set_description("The measured voltage of the selected pole."); voltage->set_default_properties(voltage_prop); att_list.push_back(voltage); // Attribute : Impedance ImpedanceAttrib *impedance = new ImpedanceAttrib(); Tango::UserDefaultAttrProp impedance_prop; impedance_prop.set_label("Impedance"); impedance_prop.set_unit("Ohm"); impedance_prop.set_format("%4.2f"); impedance_prop.set_max_alarm("5.0"); impedance_prop.set_min_alarm("2.8"); impedance_prop.set_description("Calculated impedance of the selected pole."); impedance->set_default_properties(impedance_prop); att_list.push_back(impedance); // Attribute : SetCurrentRMS SetCurrentRMSAttrib *set_current_rms = new SetCurrentRMSAttrib(); Tango::UserDefaultAttrProp set_current_rms_prop; set_current_rms_prop.set_label("RMS AC current setpoint/s"); set_current_rms_prop.set_unit("A"); set_current_rms_prop.set_format("%6.4f"); set_current_rms_prop.set_description("Statistic when driven by the Libera.\nRMS value of the AC setpoint applied on the DAC during the last second.\nX=sqr( (sum(setAC)*sum(setAC)) / n - ((sum(setAC)/n) *(sum(setAC)/n)) )"); set_current_rms->set_default_properties(set_current_rms_prop); att_list.push_back(set_current_rms); // Attribute : SetCurrentAverage SetCurrentAverageAttrib *set_current_average = new SetCurrentAverageAttrib(); Tango::UserDefaultAttrProp set_current_average_prop; set_current_average_prop.set_label("Average AC current setpoint/s"); set_current_average_prop.set_unit("A"); set_current_average_prop.set_format("%6.4f"); set_current_average_prop.set_description("Statistic when driven by the Libera.\nThe average AC setpoint applied to the DAC during the last second.\nX=SUM(setAC)/n"); set_current_average->set_default_properties(set_current_average_prop); att_list.push_back(set_current_average); // Attribute : FramesPerSecond FramesPerSecondAttrib *frames_per_second = new FramesPerSecondAttrib(); Tango::UserDefaultAttrProp frames_per_second_prop; frames_per_second_prop.set_label("Frames/s"); frames_per_second_prop.set_unit(" "); frames_per_second_prop.set_format("%3d"); frames_per_second_prop.set_description("Statistic when driven by the Libera.\nThe number of setpoints per second."); frames_per_second->set_default_properties(frames_per_second_prop); att_list.push_back(frames_per_second); // Attribute : ErrorPerSecond ErrorPerSecondAttrib *error_per_second = new ErrorPerSecondAttrib(); Tango::UserDefaultAttrProp error_per_second_prop; error_per_second_prop.set_label("Errors/s"); error_per_second_prop.set_unit(" "); error_per_second_prop.set_format("%3d"); error_per_second_prop.set_description("Statistic when driven by the Libera.\nThe number of errors detected per second."); error_per_second->set_default_properties(error_per_second_prop); att_list.push_back(error_per_second); // Attribute : ErrorCounter ErrorCounterAttrib *error_counter = new ErrorCounterAttrib(); Tango::UserDefaultAttrProp error_counter_prop; error_counter_prop.set_label("Error Counter"); error_counter_prop.set_unit(" "); error_counter_prop.set_format("%6d"); error_counter_prop.set_description("Statistic when driven by the Libera.\nThe total number of errors since the last reset."); error_counter->set_default_properties(error_counter_prop); att_list.push_back(error_counter); // Attribute : LocalControl LocalControlAttrib *local_control = new LocalControlAttrib(); Tango::UserDefaultAttrProp local_control_prop; local_control_prop.set_label("Local Control"); local_control_prop.set_unit(" "); local_control_prop.set_description("If true the AC current can be set on the device,\notherwise it is driven by the Libera."); local_control->set_default_properties(local_control_prop); att_list.push_back(local_control); // Attribute : SetCurrentAC SetCurrentACAttrib *set_current_ac = new SetCurrentACAttrib(); Tango::UserDefaultAttrProp set_current_ac_prop; set_current_ac_prop.set_label("AC Current Setpoint"); set_current_ac_prop.set_unit("A"); set_current_ac_prop.set_format("%5.4f"); set_current_ac_prop.set_max_value("0.2"); set_current_ac_prop.set_min_value("-0.2"); set_current_ac_prop.set_description("The AC current setpoint in local mode. If driven by the Libera, the attribute \nattribute value in INVALID."); set_current_ac->set_default_properties(set_current_ac_prop); att_list.push_back(set_current_ac); // End of Automatic code generation //------------------------------------------------------------- } //+---------------------------------------------------------------------------- // // method : BiltChClass::get_class_property() // // description : Read the class properties from database. // //----------------------------------------------------------------------------- void BiltChClass::get_class_property() { // Initialize your default values here (if not done with POGO). //------------------------------------------------------------------ // Read class properties from database.(Automatic code generation) //------------------------------------------------------------------ // Call database and extract values //-------------------------------------------- if (Tango::Util::instance()->_UseDb==true) get_db_class()->get_property(cl_prop); Tango::DbDatum def_prop; int i = -1; // End of Automatic code generation //------------------------------------------------------------------ } //+---------------------------------------------------------------------------- // // method : BiltChClass::set_default_property // // description: Set default property (class and device) for wizard. // For each property, add to wizard property name and description // If default value has been set, add it to wizard property and // store it in a DbDatum. // //----------------------------------------------------------------------------- void BiltChClass::set_default_property() { string prop_name; string prop_desc; string prop_def; vector vect_data; // Set Default Class Properties // Set Default Device Properties prop_name = "BiltName"; prop_desc = "Name of the Bilt multi channel power supply device\n"; prop_def = "none"; vect_data.clear(); vect_data.push_back("none"); if (prop_def.length()>0) { Tango::DbDatum data(prop_name); data << vect_data ; dev_def_prop.push_back(data); add_wiz_dev_prop(prop_name, prop_desc, prop_def); } else add_wiz_dev_prop(prop_name, prop_desc); prop_name = "PoleNumber"; prop_desc = "The number of the channel or Pole of the Bilt power supply [0 -2]"; prop_def = "-1"; vect_data.clear(); vect_data.push_back("-1"); if (prop_def.length()>0) { Tango::DbDatum data(prop_name); data << vect_data ; dev_def_prop.push_back(data); add_wiz_dev_prop(prop_name, prop_desc, prop_def); } else add_wiz_dev_prop(prop_name, prop_desc); } //+---------------------------------------------------------------------------- // // method : BiltChClass::write_class_property // // description : Set class description as property in database // //----------------------------------------------------------------------------- void BiltChClass::write_class_property() { // First time, check if database used //-------------------------------------------- if (Tango::Util::_UseDb == false) return; Tango::DbData data; string classname = get_name(); string header; string::size_type start, end; // Put title Tango::DbDatum title("ProjectTitle"); string str_title("BILT channel interface"); title << str_title; data.push_back(title); // Put Description Tango::DbDatum description("Description"); vector str_desc; str_desc.push_back("The Bilt multi channel power supply has three individual channels."); str_desc.push_back("This class offers an interface to an individual channel of the power supply."); description << str_desc; data.push_back(description); // put cvs or svn location string filename(classname); filename += "Class.cpp"; // Create a string with the class ID to // get the string into the binary string class_id(ClassId); // check for cvs information string src_path(CvsPath); start = src_path.find("/"); if (start!=string::npos) { end = src_path.find(filename); if (end>start) { string strloc = src_path.substr(start, end-start); // Check if specific repository start = strloc.find("/cvsroot/"); if (start!=string::npos && start>0) { string repository = strloc.substr(0, start); if (repository.find("/segfs/")!=string::npos) strloc = "ESRF:" + strloc.substr(start, strloc.length()-start); } Tango::DbDatum cvs_loc("cvs_location"); cvs_loc << strloc; data.push_back(cvs_loc); } } // check for svn information else { string src_path(SvnPath); start = src_path.find("://"); if (start!=string::npos) { end = src_path.find(filename); if (end>start) { header = "$HeadURL: "; start = header.length(); string strloc = src_path.substr(start, (end-start)); Tango::DbDatum svn_loc("svn_location"); svn_loc << strloc; data.push_back(svn_loc); } } } // Get CVS or SVN revision tag // CVS tag string tagname(TagName); header = "$Name: "; start = header.length(); string endstr(" $"); end = tagname.find(endstr); if (end!=string::npos && end>start) { string strtag = tagname.substr(start, end-start); Tango::DbDatum cvs_tag("cvs_tag"); cvs_tag << strtag; data.push_back(cvs_tag); } // SVN tag string svnpath(SvnPath); header = "$HeadURL: "; start = header.length(); end = svnpath.find(endstr); if (end!=string::npos && end>start) { string strloc = svnpath.substr(start, end-start); string tagstr ("/tags/"); start = strloc.find(tagstr); if ( start!=string::npos ) { start = start + tagstr.length(); end = strloc.find(filename); string strtag = strloc.substr(start, end-start-1); Tango::DbDatum svn_tag("svn_tag"); svn_tag << strtag; data.push_back(svn_tag); } } // Get URL location string httpServ(HttpServer); if (httpServ.length()>0) { Tango::DbDatum db_doc_url("doc_url"); db_doc_url << httpServ; data.push_back(db_doc_url); } // Put inheritance Tango::DbDatum inher_datum("InheritedFrom"); vector inheritance; inheritance.push_back("Device_4Impl"); inher_datum << inheritance; data.push_back(inher_datum); // Call database and and values //-------------------------------------------- get_db_class()->put_property(data); } } // namespace Node-path: powersupply/itest/BiltCh/trunk/BiltChClass.h Node-kind: file Node-action: change Text-content-length: 7235 Text-content-md5: 649985cb45a1d110bef0679569a7ad6a Content-length: 7235 //============================================================================= // // file : BiltChClass.h // // description : Include for the BiltChClass root class. // This class is the singleton class for // the BiltCh device class. // It contains all properties and methods which the // BiltCh requires only once e.g. the commands. // // project : TANGO Device Server // // $Author: meyer $ // // $Revision: 1.2 $ // $Date: 2010-05-01 16:25:41 $ // // SVN only: // $HeadURL: $ // // CVS only: // $Source: /segfs/tango/cvsroot/cppserver/machine/powersupply/SrSteerers/tango/BiltCh/BiltChClass.h,v $ // $Log: not supported by cvs2svn $ // Revision 1.1.1.1 2010-02-10 11:49:21 meyer // Imported using TkCVS // // // copyleft : European Synchrotron Radiation Facility // BP 220, Grenoble 38043 // FRANCE // //============================================================================= // // This file is generated by POGO // (Program Obviously used to Generate tango Object) // // (c) - Software Engineering Group - ESRF //============================================================================= #ifndef _BILTCHCLASS_H #define _BILTCHCLASS_H #include #include namespace BiltCh_ns {//===================================== // Define classes for attributes //===================================== class SetCurrentACAttrib: public Tango::Attr { public: SetCurrentACAttrib():Attr("SetCurrentAC", Tango::DEV_DOUBLE, Tango::READ_WRITE) {}; ~SetCurrentACAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_SetCurrentAC(att);} virtual void write(Tango::DeviceImpl *dev,Tango::WAttribute &att) {(static_cast(dev))->write_SetCurrentAC(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_SetCurrentAC_allowed(ty);} }; class LocalControlAttrib: public Tango::Attr { public: LocalControlAttrib():Attr("LocalControl", Tango::DEV_BOOLEAN, Tango::READ_WRITE) {}; ~LocalControlAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_LocalControl(att);} virtual void write(Tango::DeviceImpl *dev,Tango::WAttribute &att) {(static_cast(dev))->write_LocalControl(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_LocalControl_allowed(ty);} }; class ErrorCounterAttrib: public Tango::Attr { public: ErrorCounterAttrib():Attr("ErrorCounter", Tango::DEV_ULONG, Tango::READ) {}; ~ErrorCounterAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_ErrorCounter(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_ErrorCounter_allowed(ty);} }; class ErrorPerSecondAttrib: public Tango::Attr { public: ErrorPerSecondAttrib():Attr("ErrorPerSecond", Tango::DEV_ULONG, Tango::READ) {}; ~ErrorPerSecondAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_ErrorPerSecond(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_ErrorPerSecond_allowed(ty);} }; class FramesPerSecondAttrib: public Tango::Attr { public: FramesPerSecondAttrib():Attr("FramesPerSecond", Tango::DEV_ULONG, Tango::READ) {}; ~FramesPerSecondAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_FramesPerSecond(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_FramesPerSecond_allowed(ty);} }; class SetCurrentAverageAttrib: public Tango::Attr { public: SetCurrentAverageAttrib():Attr("SetCurrentAverage", Tango::DEV_DOUBLE, Tango::READ) {}; ~SetCurrentAverageAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_SetCurrentAverage(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_SetCurrentAverage_allowed(ty);} }; class SetCurrentRMSAttrib: public Tango::Attr { public: SetCurrentRMSAttrib():Attr("SetCurrentRMS", Tango::DEV_DOUBLE, Tango::READ) {}; ~SetCurrentRMSAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_SetCurrentRMS(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_SetCurrentRMS_allowed(ty);} }; class ImpedanceAttrib: public Tango::Attr { public: ImpedanceAttrib():Attr("Impedance", Tango::DEV_DOUBLE, Tango::READ) {}; ~ImpedanceAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_Impedance(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_Impedance_allowed(ty);} }; class VoltageAttrib: public Tango::Attr { public: VoltageAttrib():Attr("Voltage", Tango::DEV_DOUBLE, Tango::READ) {}; ~VoltageAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_Voltage(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_Voltage_allowed(ty);} }; class CurrentAttrib: public Tango::Attr { public: CurrentAttrib():Attr("Current", Tango::DEV_DOUBLE, Tango::READ_WRITE) {}; ~CurrentAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_Current(att);} virtual void write(Tango::DeviceImpl *dev,Tango::WAttribute &att) {(static_cast(dev))->write_Current(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_Current_allowed(ty);} }; //========================================= // Define classes for commands //========================================= // // The BiltChClass singleton definition // class #ifdef _TG_WINDOWS_ __declspec(dllexport) #endif BiltChClass : public Tango::DeviceClass { public: // properties member data // add your own data members here //------------------------------------ public: Tango::DbData cl_prop; Tango::DbData cl_def_prop; Tango::DbData dev_def_prop; // Method prototypes static BiltChClass *init(const char *); static BiltChClass *instance(); ~BiltChClass(); Tango::DbDatum get_class_property(string &); Tango::DbDatum get_default_device_property(string &); Tango::DbDatum get_default_class_property(string &); protected: BiltChClass(string &); static BiltChClass *_instance; void command_factory(); void get_class_property(); void attribute_factory(vector &); void write_class_property(); void set_default_property(); string get_cvstag(); string get_cvsroot(); private: void device_factory(const Tango::DevVarStringArray *); }; } // namespace BiltCh_ns #endif // _BILTCHCLASS_H Node-path: powersupply/itest/BiltCh/trunk/BiltChStateMachine.cpp Node-kind: file Node-action: change Text-content-length: 6091 Text-content-md5: 51896859c3a32b33eef464ce15f6888a Content-length: 6091 static const char *RcsId = "$Id $"; //+============================================================================= // // file : BiltChStateMachine.cpp // // description : C++ source for the BiltCh and its alowed // methods for commands and attributes // // project : TANGO Device Server // // $Author: meyer $ // // $Revision: 1.2 $ // $Date: 2010-05-01 16:25:41 $ // // SVN only: // $HeadURL: $ // // CVS only: // $Source: /segfs/tango/cvsroot/cppserver/machine/powersupply/SrSteerers/tango/BiltCh/BiltChStateMachine.cpp,v $ // $Log: not supported by cvs2svn $ // Revision 1.1.1.1 2010-02-10 11:49:21 meyer // Imported using TkCVS // // // copyleft : European Synchrotron Radiation Facility // BP 220, Grenoble 38043 // FRANCE // //-============================================================================= // // This file is generated by POGO // (Program Obviously used to Generate tango Object) // // (c) - Software Engineering Group - ESRF //============================================================================= #include #include #include /*==================================================================== * This file contains the methods to allow commands and attributes * read or write execution. * * If you wand to add your own code, add it between * the "End/Re-Start of Generated Code" comments. * * If you want, you can also add your own methods. *==================================================================== */ namespace BiltCh_ns { //================================================= // Attributes Allowed Methods //================================================= //+---------------------------------------------------------------------------- // // method : BiltCh::is_Voltage_allowed // // description : Read/Write allowed for Voltage attribute. // //----------------------------------------------------------------------------- bool BiltCh::is_Voltage_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : BiltCh::is_Impedance_allowed // // description : Read/Write allowed for Impedance attribute. // //----------------------------------------------------------------------------- bool BiltCh::is_Impedance_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : BiltCh::is_SetCurrentRMS_allowed // // description : Read/Write allowed for SetCurrentRMS attribute. // //----------------------------------------------------------------------------- bool BiltCh::is_SetCurrentRMS_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : BiltCh::is_SetCurrentAverage_allowed // // description : Read/Write allowed for SetCurrentAverage attribute. // //----------------------------------------------------------------------------- bool BiltCh::is_SetCurrentAverage_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : BiltCh::is_ErrorCounter_allowed // // description : Read/Write allowed for ErrorCounter attribute. // //----------------------------------------------------------------------------- bool BiltCh::is_ErrorCounter_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : BiltCh::is_LocalControl_allowed // // description : Read/Write allowed for LocalControl attribute. // //----------------------------------------------------------------------------- bool BiltCh::is_LocalControl_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : BiltCh::is_SetCurrentAC_allowed // // description : Read/Write allowed for SetCurrentAC attribute. // //----------------------------------------------------------------------------- bool BiltCh::is_SetCurrentAC_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : BiltCh::is_Current_allowed // // description : Read/Write allowed for Current attribute. // //----------------------------------------------------------------------------- bool BiltCh::is_Current_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : BiltCh::is_FramesPerSecond_allowed // // description : Read/Write allowed for FramesPerSecond attribute. // //----------------------------------------------------------------------------- bool BiltCh::is_FramesPerSecond_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : BiltCh::is_ErrorPerSecond_allowed // // description : Read/Write allowed for ErrorPerSecond attribute. // //----------------------------------------------------------------------------- bool BiltCh::is_ErrorPerSecond_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //================================================= // Commands Allowed Methods //================================================= } // namespace BiltCh_ns Revision-number: 41 Prop-content-length: 123 Content-length: 123 K 10 svn:author V 5 meyer K 8 svn:date V 27 2010-05-01T16:26:01.000000Z K 7 svn:log V 23 Changed version to 1.3 PROPS-END Node-path: powersupply/itest/BiltCh/trunk/Makefile Node-kind: file Node-action: change Text-content-length: 5180 Text-content-md5: 5ab3612085b832f26ff0ade93bfc311a Content-length: 5180 #============================================================================= # # file : Makefile # # description : Include for the BiltCh class. # # project : Makefile to generate a Tango server # # $Author: meyer $ # # $Revision: 1.4 $ # # $Log: not supported by cvs2svn $ # Revision 1.3 2010/03/19 15:28:01 meyer # Canged to version 1.1 # # Revision 1.2 2010-02-11 16:36:31 meyer # Currents attribute of Bilt understand NaN values now. # # Revision 1.1.1.1 2010-02-10 11:49:21 meyer # Imported using TkCVS # # # copyleft : European Synchrotron Radiation Facility # BP 220, Grenoble 38043 # FRANCE # #============================================================================= # This file is generated by POGO # (Program Obviously used to Generate tango Object) # # (c) - Software Engineering Group - ESRF #============================================================================= # CLASS = BiltCh MAJOR_VERS = 1 MINOR_VERS = 3 RELEASE = Release_$(MAJOR_VERS)_$(MINOR_VERS) OS = $(shell /csadmin/common/scripts/get_os) PROCESSOR = $(shell uname -p) #----------------------------------------- # Set default home directories #----------------------------------------- TANGO_HOME = /segfs/tango/release/$(BIN_DIR) CPP_SERVERS = $(TANGO_HOME)/classes ifdef no_debug DEBUG = -O else DEBUG = -g endif ifdef _solaris CC = CC BIN_DIR=$(OS)_CC AR_SL = $(CC) -mt -G VERS_OPT = -h SL_EXT = so endif ifdef linux CC = c++ CC_SHLIB = $(CC) -fPIC $(PROCESSOR)=1 ifdef x86_64 NBITS=_64 endif BIN_DIR=$(OS)$(NBITS) AR_SL = $(CC) -fPIC -shared SL_EXT = so VERS_OPT = -Wl,-soname, endif INCLUDE_DIRS = -I$(TANGO_HOME)/include -I. \ -I$(CPP_SERVERS)/include OBJS_DIR = obj/$(BIN_DIR) LIB_DIRS = -L $(CPP_SERVERS)/lib \ -L $(TANGO_HOME)/lib \ TARGET_LIB = $(CPP_SERVERS)/lib/libtgclasses.a #----------------------------------------- # Set CXXFLAGS and LFLAGS #----------------------------------------- ifdef _solaris CXXFLAGS = $(DEBUG) -mt -D_PTHREADS $(INCLUDE_DIRS) LFLAGS = $(DEBUG) $(LIB_DIRS) \ -ltango \ -llog4tango \ -lomniORB4 \ -lomniDynamic4 \ -lomnithread \ -lCOS4 \ -lpthread \ -lposix4 -lsocket -lnsl endif ifdef linux CXXFLAGS = -g -D_REENTRANT $(INCLUDE_DIRS) LFLAGS = $(DEBUG) $(LIB_DIRS) \ -ltango \ -llog4tango \ -lomniORB4 \ -lomniDynamic4 \ -lomnithread \ -lCOS4 \ -ldl -lpthread endif #----------------------------------------- # Set dependences #----------------------------------------- SVC_OBJS = $(OBJS_DIR)/$(CLASS).o \ $(OBJS_DIR)/$(CLASS)StateMachine.o \ $(OBJS_DIR)/$(CLASS)Class.o \ $(OBJS_DIR)/ClassFactory.o \ $(OBJS_DIR)/main.o SHLIB_OBJS = $(OBJS_DIR)/$(CLASS)Class.so.o \ $(OBJS_DIR)/$(CLASS)StateMachine.so.o \ $(OBJS_DIR)/$(CLASS).so.o SVC_INC = $(CLASS)Class.h \ $(CLASS).h $(OBJS_DIR)/%.o: %.cpp $(SVC_INC) $(CC) $(CXXFLAGS) -c $< -o $(OBJS_DIR)/$*.o $(OBJS_DIR)/%.so.o: %.cpp $(SVC_INC) $(CC_SHLIB) $(CXXFLAGS) -c $< -o $(OBJS_DIR)/$*.so.o #----------------------------------------- # Make Entry #----------------------------------------- all: $(CLASS) $(CLASS): make_obj_dir make_bin_dir $(SVC_OBJS) $(CC) $(SVC_OBJS) -o $(CLASS) $(LFLAGS) @mv $(CLASS) bin/$(BIN_DIR)/$(CLASS) shlib: make_obj_dir make_shlib_dir $(SHLIB_OBJS) $(AR_SL) -o \ shlib/$(BIN_DIR)/$(CLASS).$(SL_EXT).$(MAJOR_VERS).$(MINOR_VERS) \ $(VERS_OPT)$(CLASS).$(SL_EXT).$(MAJOR_VERS) \ $(SHLIB_OBJS) $(LFLAGS) @rm -f shlib/$(BIN_DIR)/$(CLASS).$(SL_EXT) @cd shlib/$(BIN_DIR); \ ln -s $(CLASS).$(SL_EXT).$(MAJOR_VERS).$(MINOR_VERS) $(CLASS).$(SL_EXT) clean: rm -f $(OBJS_DIR)/*.o \ $(OBJS_DIR)/*.so.o \ bin/$(BIN_DIR)/$(CLASS) \ core make_obj_dir: @mkdir -p obj @mkdir -p obj/$(BIN_DIR) make_bin_dir: @mkdir -p bin @mkdir -p bin/$(BIN_DIR) make_shlib_dir: @mkdir -p shlib @mkdir -p shlib/$(BIN_DIR) #----------------------------------------- # Install binary file #----------------------------------------- install: cp bin/$(BIN_DIR)/$(CLASS) $(CPP_SERVERS)/bin #----------------------------------------- # Update class library and header files # recompile without debug mode. #----------------------------------------- lib: clean @make no_debug=1 cp *.h $(CPP_SERVERS)/include ar ruv $(TARGET_LIB) $(OBJS_DIR)/$(CLASS).o ar ruv $(TARGET_LIB) $(OBJS_DIR)/$(CLASS)Class.o ar ruv $(TARGET_LIB) $(OBJS_DIR)/$(CLASS)StateMachine.o ident $(TARGET_LIB) | grep $(CLASS) #------------------------------------------------------ # Tag the CVS/SVN module corresponding to this class # copy cvs_tag or svn_tag to tag: entry #------------------------------------------------------ #svn_tag: # svn copy ../trunk ../tags/$(RELEASE) # svn commit ../tags/$(RELEASE) \ # -m "Tagging the $(RELEASE) of the $(CLASS) project." # #cvs_tag: # @cvstag "$(CLASS)-$(RELEASE)" # @make $(CLASS) # @make show_tag #show_cvs_tag: # @cvstag -d # # Only these make options work with the current Pogo version 5.3.x! tag: @cvstag "$(CLASS)-$(RELEASE)" @make $(CLASS) @make show_tag show_tag: @cvstag -d Revision-number: 42 Prop-content-length: 149 Content-length: 149 K 8 svn:date V 27 2010-05-01T16:26:02.000000Z K 7 svn:log V 75 This commit was manufactured by cvs2svn to create tag 'BiltCh-Release_1_3'. PROPS-END Node-path: powersupply/itest/BiltCh/tags/BiltCh-Release_1_3 Node-kind: dir Node-action: add Node-copyfrom-rev: 41 Node-copyfrom-path: powersupply/itest/BiltCh/trunk Revision-number: 43 Prop-content-length: 150 Content-length: 150 K 10 svn:author V 5 meyer K 8 svn:date V 27 2010-05-01T16:58:39.000000Z K 7 svn:log V 50 Changed alarm limits for the impedance attribute. PROPS-END Node-path: powersupply/itest/Bilt/trunk/Bilt.cpp Node-kind: file Node-action: change Text-content-length: 34403 Text-content-md5: 47cdce65eadaad08c888b2787c376aa6 Content-length: 34403 static const char *RcsId = "$Id: Bilt.cpp,v 1.13 2010-05-01 16:58:39 meyer Exp $"; //+============================================================================= // // file : Bilt.cpp // // description : C++ source for the Bilt and its commands. // The class is derived from Device. It represents the // CORBA servant object which will be accessed from the // network. All commands which can be executed on the // Bilt are implemented in this file. // // project : TANGO Device Server // // $Author: meyer $ // // $Revision: 1.13 $ // // $Revision: 1.13 $ // $Date: 2010-05-01 16:58:39 $ // // SVN only: // $HeadURL: $ // // CVS only: // $Source: /segfs/tango/cvsroot/cppserver/machine/powersupply/SrSteerers/tango/Bilt/Bilt.cpp,v $ // $Log: not supported by cvs2svn $ // Revision 1.12 2010/03/16 14:54:58 meyer // Added reconnection method. // // Revision 1.11 2010-02-18 16:46:31 meyer // Filled-in code for SetpointCheck // // Revision 1.10 2010-02-12 16:35:13 meyer // Added SetPoleCurrent command again. // // Revision 1.9 2010-02-11 16:35:27 meyer // Currents settings understand NaN values. // Deleted StePoleCurrent command. // // Revision 1.8 2010/02/10 12:27:31 meyer // Restructured Bilt class. // Acquistion is now done by a thread and only the multi channel data // gets exported. A single channel class (BiltCh) was created. // // Revision 1.7 2009/12/18 12:01:40 meyer // Corrected alarm handling in dev_state() // // Revision 1.6 2009/11/27 13:49:26 meyer // Modified structure! The pole is no longer a device. // The device is now a magnet with three poles. // // Revision 1.5 2009/11/26 10:46:58 meyer // Updated for libMagnet_V120 // // Revision 1.4 2009/11/24 09:21:46 meyer // Absolut value for impedance // // Revision 1.3 2009/11/23 16:46:58 meyer // Corrected state, status and exception handling // // Revision 1.2 2009/11/06 12:46:25 meyer // Added impedance attribute and corrected fromatting of attribute values. // // Revision 1.1.1.1 2009/11/04 16:23:02 meyer // Imported using TkCVS // // // copyleft : European Synchrotron Radiation Facility // BP 220, Grenoble 38043 // FRANCE // //-============================================================================= // // This file is generated by POGO // (Program Obviously used to Generate tango Object) // // (c) - Software Engineering Group - ESRF //============================================================================= //=================================================================== // // The following table gives the correspondence // between commands and method name. // // Command name | Method name // ---------------------------------------- // State | dev_state() // Status | dev_status() // On | on() // Off | off() // Reset | reset() // SetPoleAcCurrent | set_pole_ac_current() // LocalPoleControl | local_pole_control() // SetpointCheck | setpoint_check() // SetPoleCurrent | set_pole_current() // //=================================================================== #include #include #include #include #include namespace Bilt_ns { //+---------------------------------------------------------------------------- // // method : Bilt::Bilt(string &s) // // description : constructor for simulated Bilt // // in : - cl : Pointer to the DeviceClass object // - s : Device name // //----------------------------------------------------------------------------- Bilt::Bilt(Tango::DeviceClass *cl,string &s) :Tango::Device_4Impl(cl,s.c_str()) { init_device(); } Bilt::Bilt(Tango::DeviceClass *cl,const char *s) :Tango::Device_4Impl(cl,s) { init_device(); } Bilt::Bilt(Tango::DeviceClass *cl,const char *s,const char *d) :Tango::Device_4Impl(cl,s,d) { init_device(); } //+---------------------------------------------------------------------------- // // method : Bilt::delete_device() // // description : will be called at device destruction or at init command. // //----------------------------------------------------------------------------- void Bilt::delete_device() { // Delete device allocated objects if ( acquisition_thread != NULL ) { data_mutex.lock(); exit_thread = true; data_mutex.unlock(); // join now the thread until it exits int *rv; acquisition_thread->join((void **)&rv); cout << "Bilt::delete_device(): Exit acquisition thread !!!" << endl; } // Delete connection to the power supply delete BILT; BILT = NULL; } //+---------------------------------------------------------------------------- // // method : Bilt::init_device() // // description : will be called at device initialization. // //----------------------------------------------------------------------------- void Bilt::init_device() { INFO_STREAM << "Bilt::Bilt() create device " << device_name << endl; // Initialise variables to default values //-------------------------------------------- get_device_property(); set_state (Tango::OFF); try { BILT = new itest::TMagnet (iPAddress.c_str(), magnetNumber); } catch (itest::ItestException &e) { try { create_tango_exception (e, mdata_errors, "Init failure" , "Cannot initialise ITEST libray objects", "Bilt::init_device"); } catch (Tango::DevFailed &e) { set_state (Tango::UNKNOWN); } } // initialise with the actual current set point values try { for (int i=0; ipole(i).get_current_DC(); } Tango::MultiAttribute *attr_list = get_device_attr(); Tango::WAttribute &attr_curr = attr_list->get_w_attr_by_name ("Currents"); attr_curr.set_write_value(¤ts_dc[0], currents_dc.size()); } catch (itest::ItestException &e) { try { create_tango_exception (e, mdata_errors, "Init failure" , "Cannot read the actual current set point values", "Bilt::init_device"); } catch (Tango::DevFailed &e) { set_state (Tango::UNKNOWN); } } // initialise and start the acquisition thread exit_thread = false; acquisition_thread = new AcquisitionThread(this, data_mutex, bilt_mutex); } //+---------------------------------------------------------------------------- // // method : Bilt::get_device_property() // // description : Read the device properties from database. // //----------------------------------------------------------------------------- void Bilt::get_device_property() { // Initialize your default values here (if not done with POGO). //------------------------------------------------------------------ BILT = NULL; bilt_connection_lost = false; acquisition_thread = NULL; struct timeval now; gettimeofday (&now, NULL); data_set_time = now; data_read_time = now; // intitialise mdada structure for magnet read values mdata.magnet = -1; mdata.state = -1; for (int i=0; i_UseDb==true) get_db_device()->get_property(dev_prop); Tango::DbDatum def_prop, cl_prop; BiltClass *ds_class = (static_cast(get_device_class())); int i = -1; // Try to initialize IPAddress from class property cl_prop = ds_class->get_class_property(dev_prop[++i].name); if (cl_prop.is_empty()==false) cl_prop >> iPAddress; else { // Try to initialize IPAddress from default device value def_prop = ds_class->get_default_device_property(dev_prop[i].name); if (def_prop.is_empty()==false) def_prop >> iPAddress; } // And try to extract IPAddress value from database if (dev_prop[i].is_empty()==false) dev_prop[i] >> iPAddress; // Try to initialize MagnetNumber from class property cl_prop = ds_class->get_class_property(dev_prop[++i].name); if (cl_prop.is_empty()==false) cl_prop >> magnetNumber; else { // Try to initialize MagnetNumber from default device value def_prop = ds_class->get_default_device_property(dev_prop[i].name); if (def_prop.is_empty()==false) def_prop >> magnetNumber; } // And try to extract MagnetNumber value from database if (dev_prop[i].is_empty()==false) dev_prop[i] >> magnetNumber; // Try to initialize UpdatePeriod from class property cl_prop = ds_class->get_class_property(dev_prop[++i].name); if (cl_prop.is_empty()==false) cl_prop >> updatePeriod; else { // Try to initialize UpdatePeriod from default device value def_prop = ds_class->get_default_device_property(dev_prop[i].name); if (def_prop.is_empty()==false) def_prop >> updatePeriod; } // And try to extract UpdatePeriod value from database if (dev_prop[i].is_empty()==false) dev_prop[i] >> updatePeriod; // End of Automatic code generation //------------------------------------------------------------------ } //+---------------------------------------------------------------------------- // // method : Bilt::always_executed_hook() // // description : method always executed before any command is executed // //----------------------------------------------------------------------------- void Bilt::always_executed_hook() { } //+---------------------------------------------------------------------------- // // method : Bilt::read_attr_hardware // // description : Hardware acquisition for attributes. // //----------------------------------------------------------------------------- void Bilt::read_attr_hardware(vector &attr_list) { DEBUG_STREAM << "Bilt::read_attr_hardware(vector &attr_list) entering... "<< endl; // Add your own code here } //+---------------------------------------------------------------------------- // // method : Bilt::read_FramesPerSecond // // description : Extract real attribute values for FramesPerSecond acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_FramesPerSecond(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_FramesPerSecond(Tango::Attribute &attr) entering... "<< endl; omni_mutex_lock l(data_mutex); if ( fdata_errors.length() != 0 ) attr.set_quality(Tango::ATTR_INVALID); else { for (int i=0; ipole(i).get_switch(); } if ( switch_state == 1 ) local_control[i] = false; else local_control[i] = true; } } catch (itest::ItestException &e) { create_tango_exception (e, "Read failure" , "Cannot read the actual switch states", "Bilt::read_LocalControls"); } attr.set_value (&(local_control[0]), POLES); } //+---------------------------------------------------------------------------- // // method : Bilt::read_SetCurrentsRMS // // description : Extract real attribute values for SetCurrentsRMS acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_SetCurrentsRMS(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_SetCurrentsRMS(Tango::Attribute &attr) entering... "<< endl; omni_mutex_lock l(data_mutex); if ( fdata_errors.length() != 0 ) attr.set_quality(Tango::ATTR_INVALID); else { for (int i=0; i CURRENT_LIMIT ) impedances[i] = fabs (mdata.idata[i].measvolt / mdata.idata[i].meascurr); else impedances[i] = nan("NaN"); } } attr.set_value (&(impedances[0]), POLES); } //+---------------------------------------------------------------------------- // // method : Bilt::write_Currents // // description : Write Currents attribute values to hardware. // //----------------------------------------------------------------------------- void Bilt::write_Currents(Tango::WAttribute &attr) { DEBUG_STREAM << "Bilt::write_Currents(Tango::WAttribute &attr) entering... "<< endl; const double *set_currents; // check the correct number of setpoints if ( attr.get_write_value_length() == POLES ) attr.get_write_value(set_currents); else { TangoSys_MemStream tms; tms << "Wrong number of setpoints!" << endl; Tango::Except::throw_exception("WriteError", tms.str(), "Bilt::write_Currents"); } // apply setpoints to the poles try { for (int i=0; ipole(i).set_current_DC (set_currents[i]); } } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot write DC current values", "Bilt::write_Currents"); } // initialise the set time, to be sure that the next // returned read value is newer and contains the changes. struct timeval now; gettimeofday (&now, NULL); data_set_time = now; } //+---------------------------------------------------------------------------- // // method : Bilt::read_Currents // // description : Extract real attribute values for Currents acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_Currents(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_Currents(Tango::Attribute &attr) entering... "<< endl; // wait for the next data acquisition afer a current setpoint change double delay; { omni_mutex_lock l(data_mutex); delay = (data_set_time.tv_sec * 1e6 + data_set_time.tv_usec) - (data_read_time.tv_sec * 1e6 + data_read_time.tv_usec); //cout << "delay = " << delay << endl; } while ( delay > 0 ) { // 20 ms struct timespec sleep_time = {0, SLEEP_NS}; nanosleep(&sleep_time, NULL); omni_mutex_lock l(data_mutex); delay = (data_set_time.tv_sec * 1e6 + data_set_time.tv_usec) - (data_read_time.tv_sec * 1e6 + data_read_time.tv_usec); INFO_STREAM << "read waiting delay = " << delay << endl; } omni_mutex_lock l(data_mutex); if ( mdata_errors.length() != 0 ) attr.set_quality(Tango::ATTR_INVALID); else { for (int i=0; iset_state(1); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot switch on pole", "Bilt::on"); } } //+------------------------------------------------------------------ /** * method: Bilt::off * * description: method to execute "Off" * Turns of power supply * * */ //+------------------------------------------------------------------ void Bilt::off() { DEBUG_STREAM << "Bilt::off(): entering... !" << endl; // Add your own code to control device here try { omni_mutex_lock l(bilt_mutex); BILT->set_state(0); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot switch off pole", "Bilt::off"); } } //+------------------------------------------------------------------ /** * method: Bilt::reset * * description: method to execute "Reset" * Reset faults and alarms * * */ //+------------------------------------------------------------------ void Bilt::reset() { DEBUG_STREAM << "Bilt::reset(): entering... !" << endl; // Add your own code to control device here try { omni_mutex_lock l(bilt_mutex); BILT->clear_all_err(); BILT->clear_alarm(); for (int i=0; ipole(i).clear_ferrors(); } } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot reset pole", "Bilt::reset"); } } //+------------------------------------------------------------------ /** * method: Bilt::set_pole_ac_current * * description: method to execute "SetPoleAcCurrent" * Set the AC current for one Pole. * [0] = pole number, [1] = current * * @param argin * */ //+------------------------------------------------------------------ void Bilt::set_pole_ac_current(const Tango::DevVarDoubleArray *argin) { DEBUG_STREAM << "Bilt::set_pole_ac_current(): entering... !" << endl; // Add your own code to control device here // argin[0] = pole number if ( (*argin)[0] < 0 || (*argin)[0] >= POLES ) { TangoSys_MemStream tms; tms << "The entered Pole number is out of range" << endl; Tango::Except::throw_exception("WriteError", tms.str(), "Bilt::set_pole_ac_current"); } try { omni_mutex_lock l(bilt_mutex); BILT->pole((int)(*argin)[0]).set_current_AC ((*argin)[1]); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot write AC current value", "Bilt::set_pole_ac_current"); } } //+------------------------------------------------------------------ /** * method: Bilt::local_pole_control * * description: method to execute "LocalPoleControl" * Set the AC current for one Pole. * [0] = pole number, [1] = local control true/false * * @param argin * */ //+------------------------------------------------------------------ void Bilt::local_pole_control(const Tango::DevVarShortArray *argin) { DEBUG_STREAM << "Bilt::local_pole_control(): entering... !" << endl; // Add your own code to control device here // argin[0] = pole number if ( (*argin)[0] < 0 || (*argin)[0] >= POLES ) { TangoSys_MemStream tms; tms << "The entered Pole number is out of range" << endl; Tango::Except::throw_exception("WriteError", tms.str(), "Bilt::local_pole_control"); } // argin[1] = true or false (1 or 0 ) if ( (*argin)[1] != 0 && (*argin)[1] != 1 ) { TangoSys_MemStream tms; tms << "Local control can only be choosen as 0 or 1 (false or true)" << endl; Tango::Except::throw_exception("WriteError", tms.str(), "Bilt::local_pole_control"); } try { int switch_state; if ( (*argin)[1] == true ) switch_state = 0; else switch_state = 1; omni_mutex_lock l(bilt_mutex); BILT->pole((*argin)[0]).set_switch (switch_state); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot write switch state", "Bilt::local_pole_control"); } } //+------------------------------------------------------------------ /** * method: Bilt::set_pole_current * * description: method to execute "SetPoleCurrent" * Set the current for one Pole. * [0] = pole number, [1] = current * * @param argin * */ //+------------------------------------------------------------------ void Bilt::set_pole_current(const Tango::DevVarDoubleArray *argin) { DEBUG_STREAM << "Bilt::set_pole_current(): entering... !" << endl; // Add your own code to control device here // argin[0] = pole number if ( (*argin)[0] < 0 || (*argin)[0] >= POLES ) { TangoSys_MemStream tms; tms << "The entered Pole number is out of range" << endl; Tango::Except::throw_exception("WriteError", tms.str(), "Bilt::set_pole_current"); } try { omni_mutex_lock l(bilt_mutex); BILT->pole((int)(*argin)[0]).set_current_DC ((*argin)[1]); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot write current value", "Bilt::set_pole_current"); } // make sure that the current set values are correct! try { omni_mutex_lock l(bilt_mutex); for (int i=0; ipole(i).get_current_DC(); } Tango::MultiAttribute *attr_list = get_device_attr(); Tango::WAttribute &attr_curr = attr_list->get_w_attr_by_name ("Currents"); attr_curr.set_write_value(¤ts_dc[0], currents_dc.size()); } catch (itest::ItestException &e) { create_tango_exception (e, "Read failure" , "Cannot read the actual current set point values", "Bilt::set_pole_current"); } } //+------------------------------------------------------------------ /** * method: Bilt::create_tango_exception() * * description: convert an itest exception into a tango exception * * * in : - &e : Reference to itest exception * - reason : Reason of the local Tango exception to be added to the stack * - desc : Description for the local Tango exception to be added to the stack * - origin : Origin if the local Tango exception to be added to the stack */ //+------------------------------------------------------------------ void Bilt::create_tango_exception (itest::ItestException &e, string reason, string desc, string origin) { Tango::DevErrorList errors; create_tango_exception (e, errors, reason, desc, origin); } //+------------------------------------------------------------------ /** * method: Bilt::create_tango_exception() * * description: convert an itest exception into a tango exception * * * in : - &e : Reference to itest exception * - errors : Tango error list to use, to store exception info * - reason : Reason of the local Tango exception to be added to the stack * - desc : Description for the local Tango exception to be added to the stack * - origin : Origin if the local Tango exception to be added to the stack */ //+------------------------------------------------------------------ void Bilt::create_tango_exception (itest::ItestException &e, Tango::DevErrorList &errors, string reason, string desc, string origin) { DEBUG_STREAM << "Bilt::create_tango_exception(): entering... !" << endl; errors.length(e.errors.size() + 1); int i; for(i=0; idevice_status data member) and returns it to the caller. * * @return Status description * */ //+------------------------------------------------------------------ Tango::ConstDevString Bilt::dev_status() { //Tango::ConstDevString argout = DeviceImpl::dev_status(); DEBUG_STREAM << "Bilt::dev_status(): entering... !" << endl; // Add your own code to control device here stringstream status; Tango::DevState state = dev_state(); switch (state) { case Tango::ON: status << "State : ON" << endl; break; case Tango::OFF: status << "State : OFF" << endl; break; case Tango::ALARM: { status << "State : Alarm" << endl; omni_mutex_lock l(data_mutex); for (int i=0; i 10W in 10ms!" << endl; else { if ( mdata.idata[i].fail == "TEMP" ) status << "Fault descr. : Max. temp on semiconductor reached!" << endl; else { if ( mdata.idata[i].fail == "PWSO" ) status << "Fault descr. : Delivered power > 40W in 100ms!" << endl; else { status << "Fault descr. : Unkown fault code!" << endl; } } } } } } } break; } default: { { omni_mutex_lock l(data_mutex); status << "BILT state : Unknown" << endl; if ( bilt_connection_lost == true ) { status << "Connection lost to BILT power supply, trying to reconnect!" << endl; status << endl; } if ( mdata_errors.length() > 0 ) status << "Error stack : " << endl; for(int i=0; idevice_state data member) and returns it to the caller. * * @return State Code * */ //+------------------------------------------------------------------ Tango::DevState Bilt::dev_state() { Tango::DevState argout = DeviceImpl::dev_state(); DEBUG_STREAM << "Bilt::dev_state(): entering... !" << endl; // Add your own code to control device here int state; omni_mutex_lock l(data_mutex); try { //read_mdata(); state = mdata.state; INFO_STREAM << "magnet state for " << get_name() << " = " << state << endl; } catch (Tango::DevFailed &e) { // do nothing! // Just avoid exceptions when executing state or status! } INFO_STREAM << "mdata errors = " << mdata_errors.length() << endl; if ( mdata_errors.length() != 0 ) set_state (Tango::UNKNOWN); else { // set the device state switch (state) { case -1: set_state (Tango::UNKNOWN); bilt_connection_lost = true; break; case 0: set_state (Tango::OFF); break; case 1: set_state (Tango::ON); break; case 2: set_state (Tango::ALARM); break; case 3: set_state (Tango::FAULT); break; default: set_state (Tango::UNKNOWN); break; } } // Check for attribute alarms if ( get_state() == Tango::ON && argout == Tango::ALARM ) set_state (Tango::ALARM); return get_state(); } //+------------------------------------------------------------------ /** * method: Bilt::setpoint_check * * description: method to execute "SetpointCheck" * Check the given current values against the specified limits. * * @param argin Setpoint values for the Poles * @return true when settings are OK * */ //+------------------------------------------------------------------ Tango::DevBoolean Bilt::setpoint_check(const Tango::DevVarDoubleArray *argin) { Tango::DevBoolean argout ; DEBUG_STREAM << "Bilt::setpoint_check(): entering... !" << endl; // Add your own code to control device here // get the min and max values for the current settings Tango::MultiAttribute *attr_list = get_device_attr(); Tango::WAttribute &attr_curr = attr_list->get_w_attr_by_name ("Currents"); double min, max; attr_curr.get_min_value(min); attr_curr.get_max_value(max); INFO_STREAM << "min = " << min << " max = " << max << endl; // check the input values argout = true; for ( int i=0; ilength(); i++ ) { INFO_STREAM << "i = " << i << " curr = " << (*argin)[i] << endl; if ( (*argin)[i] < min || (*argin)[i] > max ) { argout = false; break; } } return argout; } } // namespace Node-path: powersupply/itest/Bilt/trunk/Bilt.h Node-kind: file Node-action: change Text-content-length: 11753 Text-content-md5: ad08f603a5abf7a8471573ae680f4993 Content-length: 11753 //============================================================================= // // file : Bilt.h // // description : Include for the Bilt class. // // project : BILT multi channel power supply // // $Author: meyer $ // // $Revision: 1.9 $ // $Date: 2010-05-01 16:58:39 $ // // SVN only: // $HeadURL: $ // // CVS only: // $Source: /segfs/tango/cvsroot/cppserver/machine/powersupply/SrSteerers/tango/Bilt/Bilt.h,v $ // $Log: not supported by cvs2svn $ // Revision 1.8 2010/03/16 14:54:58 meyer // Added reconnection method. // // Revision 1.7 2010-02-12 16:35:13 meyer // Added SetPoleCurrent command again. // // Revision 1.6 2010-02-11 16:35:27 meyer // Currents settings understand NaN values. // Deleted StePoleCurrent command. // // Revision 1.5 2010/02/10 12:27:31 meyer // Restructured Bilt class. // Acquistion is now done by a thread and only the multi channel data // gets exported. A single channel class (BiltCh) was created. // // Revision 1.4 2009/11/27 13:49:26 meyer // Modified structure! The pole is no longer a device. // The device is now a magnet with three poles. // // Revision 1.3 2009/11/26 10:46:58 meyer // Updated for libMagnet_V120 // // Revision 1.2 2009/11/06 12:46:25 meyer // Added impedance attribute and corrected fromatting of attribute values. // // Revision 1.1.1.1 2009/11/04 16:23:02 meyer // Imported using TkCVS // // // copyleft : European Synchrotron Radiation Facility // BP 220, Grenoble 38043 // FRANCE // //============================================================================= // // This file is generated by POGO // (Program Obviously used to Generate tango Object) // // (c) - Software Engineering Group - ESRF //============================================================================= #ifndef _BILT_H #define _BILT_H #include #include #include //using namespace Tango; /** * @author $Author: meyer $ * @version $Revision: 1.9 $ */ // Add your own constant definitions here. //----------------------------------------------- // Number of poles per magnet #define POLES 3 // Current limit for a valid impedeance calculation #define CURRENT_LIMIT 0.005 // define sleep times #define SLEEP_NS 20000000 // 20 ms namespace Bilt_ns { class AcquisitionThread; /** * Class Description: * The BILT multi channel power supply will be used with 3 channels for the ESRF fast * feedback systems. * The power supply can be controlled in 2 ways : * By this device server for slow or human control or * by the Libera Beam Position monitors for fast feedback with closed loop control. * The devices are exported as one device per steerer magnet. Every device has three * channels. The channels (poles) cannot be switched on individually but have their * individual set points and measurement values. */ /* * Device States Description: * Tango::ON : Magnet is ON, all three channels are ON. * Tango::OFF : Magnet is OFF, all three channels are OFF. * Tango::FAULT : Error detected by the BILT magnet. * Tango::ALARM : Alarm detected on one or more channels. * Tango::UNKNOWN : Communication fault */ class Bilt: public Tango::Device_4Impl { public : // Add your own data members here //----------------------------------------- // Here is the Start of the automatic code generation part //------------------------------------------------------------- /** * @name attributes * Attribute member data. */ //@{ Tango::DevDouble *attr_Currents_read; Tango::DevDouble attr_Currents_write; Tango::DevDouble *attr_Voltages_read; Tango::DevDouble *attr_Impedances_read; Tango::DevDouble *attr_SetCurrentsRMS_read; Tango::DevDouble *attr_SetCurrentsAverage_read; Tango::DevULong *attr_FramesPerSecond_read; Tango::DevULong *attr_ErrorsPerSecond_read; Tango::DevULong *attr_ErrorCounters_read; Tango::DevBoolean *attr_LocalControls_read; //@} /** * @name Device properties * Device properties member data. */ //@{ /** * IP Address of BILT controller. * Each controller includes several magnets and * each magnet includes 3 power supplies, * for corrections in the X, Y and Z planes. * * */ string iPAddress; /** * Magnet number from 1 to 48 */ Tango::DevShort magnetNumber; /** * The update period for the data reading from the power supply in milli seconds. */ Tango::DevLong updatePeriod; //@} /** * @name Device properties * Device property member data. */ //@{ //@} /**@name Constructors * Miscellaneous constructors */ //@{ /** * Constructs a newly allocated Command object. * * @param cl Class. * @param s Device Name */ Bilt(Tango::DeviceClass *cl,string &s); /** * Constructs a newly allocated Command object. * * @param cl Class. * @param s Device Name */ Bilt(Tango::DeviceClass *cl,const char *s); /** * Constructs a newly allocated Command object. * * @param cl Class. * @param s Device name * @param d Device description. */ Bilt(Tango::DeviceClass *cl,const char *s,const char *d); //@} /**@name Destructor * Only one destructor is defined for this class */ //@{ /** * The object destructor. */ ~Bilt() {delete_device();}; /** * will be called at device destruction or at init command. */ void delete_device(); //@} /**@name Miscellaneous methods */ //@{ /** * Initialize the device */ virtual void init_device(); /** * Always executed method before execution command method. */ virtual void always_executed_hook(); //@} /** * @name Bilt methods prototypes */ //@{ /** * Hardware acquisition for attributes. */ virtual void read_attr_hardware(vector &attr_list); /** * Extract real attribute values for Currents acquisition result. */ virtual void read_Currents(Tango::Attribute &attr); /** * Write Currents attribute values to hardware. */ virtual void write_Currents(Tango::WAttribute &attr); /** * Extract real attribute values for Voltages acquisition result. */ virtual void read_Voltages(Tango::Attribute &attr); /** * Extract real attribute values for Impedances acquisition result. */ virtual void read_Impedances(Tango::Attribute &attr); /** * Extract real attribute values for SetCurrentsRMS acquisition result. */ virtual void read_SetCurrentsRMS(Tango::Attribute &attr); /** * Extract real attribute values for SetCurrentsAverage acquisition result. */ virtual void read_SetCurrentsAverage(Tango::Attribute &attr); /** * Extract real attribute values for FramesPerSecond acquisition result. */ virtual void read_FramesPerSecond(Tango::Attribute &attr); /** * Extract real attribute values for ErrorsPerSecond acquisition result. */ virtual void read_ErrorsPerSecond(Tango::Attribute &attr); /** * Extract real attribute values for ErrorCounters acquisition result. */ virtual void read_ErrorCounters(Tango::Attribute &attr); /** * Extract real attribute values for LocalControls acquisition result. */ virtual void read_LocalControls(Tango::Attribute &attr); /** * Read/Write allowed for Currents attribute. */ virtual bool is_Currents_allowed(Tango::AttReqType type); /** * Read/Write allowed for Voltages attribute. */ virtual bool is_Voltages_allowed(Tango::AttReqType type); /** * Read/Write allowed for Impedances attribute. */ virtual bool is_Impedances_allowed(Tango::AttReqType type); /** * Read/Write allowed for SetCurrentsRMS attribute. */ virtual bool is_SetCurrentsRMS_allowed(Tango::AttReqType type); /** * Read/Write allowed for SetCurrentsAverage attribute. */ virtual bool is_SetCurrentsAverage_allowed(Tango::AttReqType type); /** * Read/Write allowed for FramesPerSecond attribute. */ virtual bool is_FramesPerSecond_allowed(Tango::AttReqType type); /** * Read/Write allowed for ErrorsPerSecond attribute. */ virtual bool is_ErrorsPerSecond_allowed(Tango::AttReqType type); /** * Read/Write allowed for ErrorCounters attribute. */ virtual bool is_ErrorCounters_allowed(Tango::AttReqType type); /** * Read/Write allowed for LocalControls attribute. */ virtual bool is_LocalControls_allowed(Tango::AttReqType type); /** * Execution allowed for On command. */ virtual bool is_On_allowed(const CORBA::Any &any); /** * Execution allowed for Off command. */ virtual bool is_Off_allowed(const CORBA::Any &any); /** * Execution allowed for Reset command. */ virtual bool is_Reset_allowed(const CORBA::Any &any); /** * Execution allowed for SetPoleAcCurrent command. */ virtual bool is_SetPoleAcCurrent_allowed(const CORBA::Any &any); /** * Execution allowed for LocalPoleControl command. */ virtual bool is_LocalPoleControl_allowed(const CORBA::Any &any); /** * Execution allowed for SetpointCheck command. */ virtual bool is_SetpointCheck_allowed(const CORBA::Any &any); /** * Execution allowed for SetPoleCurrent command. */ virtual bool is_SetPoleCurrent_allowed(const CORBA::Any &any); /** * This command gets the device state (stored in its device_state data member) and returns it to the caller. * @return State Code * @exception DevFailed */ virtual Tango::DevState dev_state(); /** * This command gets the device status (stored in its device_status data member) and returns it to the caller. * @return Status description * @exception DevFailed */ virtual Tango::ConstDevString dev_status(); /** * Turns on power supply. * @exception DevFailed */ void on(); /** * Turns of power supply * @exception DevFailed */ void off(); /** * Reset faults and alarms * @exception DevFailed */ void reset(); /** * Set the AC current for one Pole. * [0] = pole number, [1] = current * @param argin * @exception DevFailed */ void set_pole_ac_current(const Tango::DevVarDoubleArray *); /** * Set the AC current for one Pole. * [0] = pole number, [1] = local control true/false * @param argin * @exception DevFailed */ void local_pole_control(const Tango::DevVarShortArray *); /** * Check the given current values against the specified limits. * @param argin Setpoint values for the Poles * @return true when settings are OK * @exception DevFailed */ Tango::DevBoolean setpoint_check(const Tango::DevVarDoubleArray *); /** * Set the current for one Pole. * [0] = pole number, [1] = current * @param argin * @exception DevFailed */ void set_pole_current(const Tango::DevVarDoubleArray *); /** * Read the device properties from database */ void get_device_property(); //@} // Here is the end of the automatic code generation part //------------------------------------------------------------- protected : // Add your own data members here //----------------------------------------- friend class AcquisitionThread; AcquisitionThread *acquisition_thread; omni_mutex data_mutex; omni_mutex bilt_mutex; short exit_thread; struct timeval data_set_time; struct timeval data_read_time; void create_tango_exception (itest::ItestException &e, string reason, string desc, string origin); void create_tango_exception (itest::ItestException &e, Tango::DevErrorList &errors, string reason, string desc, string origin); itest::TMagnet *BILT; bool bilt_connection_lost; struct itest::mdata mdata; struct itest::fdata fdata[POLES]; Tango::DevErrorList mdata_errors; Tango::DevErrorList fdata_errors; vector currents_dc; vector currents_ac; vector voltages; vector impedances; vector currents_rms; vector currents_average; vector frames_per_sec; vector errors_per_sec; vector error_counters; bool local_control[3]; }; } // namespace_ns #endif // _BILT_H Node-path: powersupply/itest/Bilt/trunk/BiltClass.cpp Node-kind: file Node-action: change Text-content-length: 26275 Text-content-md5: 1d9fcb4318d0464275c61f03638954bd Content-length: 26275 static const char *ClassId = "$Id: BiltClass.cpp,v 1.12 2010-05-01 16:58:39 meyer Exp $"; static const char *TagName = "$Name: not supported by cvs2svn $"; static const char *CvsPath = "$Source: /segfs/tango/cvsroot/cppserver/machine/powersupply/SrSteerers/tango/Bilt/BiltClass.cpp,v $"; static const char *SvnPath = "$HeadURL: $"; static const char *HttpServer = "http://www.esrf.fr/computing/cs/tango/tango_doc/ds_doc/"; //+============================================================================= // // file : BiltClass.cpp // // description : C++ source for the BiltClass. A singleton // class derived from DeviceClass. It implements the // command list and all properties and methods required // by the Bilt once per process. // // project : TANGO Device Server // // $Author: meyer $ // // $Revision: 1.12 $ // // $Log: not supported by cvs2svn $ // Revision 1.11 2010/03/16 15:03:33 meyer // Excluded Steerer class. // // Revision 1.10 2010-02-12 16:35:13 meyer // Added SetPoleCurrent command again. // // Revision 1.9 2010-02-11 16:35:27 meyer // Currents settings understand NaN values. // Deleted StePoleCurrent command. // // Revision 1.8 2010/02/10 16:22:15 meyer // Release_3_0 // // Revision 1.7 2010/02/10 12:27:31 meyer // Restructured Bilt class. // Acquistion is now done by a thread and only the multi channel data // gets exported. A single channel class (BiltCh) was created. // // Revision 1.6 2009/12/18 12:02:18 meyer // Changed version number to 2.1 // // Revision 1.5 2009/11/27 13:49:26 meyer // Modified structure! The pole is no longer a device. // The device is now a magnet with three poles. // // Revision 1.4 2009/11/26 10:46:58 meyer // Updated for libMagnet_V120 // // Revision 1.3 2009/11/23 16:46:58 meyer // Corrected state, status and exception handling // // Revision 1.2 2009/11/06 12:46:25 meyer // Added impedance attribute and corrected fromatting of attribute values. // // Revision 1.1.1.1 2009/11/04 16:23:02 meyer // Imported using TkCVS // // // copyleft : European Synchrotron Radiation Facility // BP 220, Grenoble 38043 // FRANCE // //-============================================================================= // // This file is generated by POGO // (Program Obviously used to Generate tango Object) // // (c) - Software Engineering Group - ESRF //============================================================================= #include #include #include //+---------------------------------------------------------------------------- /** * Create BiltClass singleton and return it in a C function for Python usage */ //+---------------------------------------------------------------------------- extern "C" { #ifdef WIN32 __declspec(dllexport) #endif Tango::DeviceClass *_create_Bilt_class(const char *name) { return Bilt_ns::BiltClass::init(name); } } namespace Bilt_ns { //+---------------------------------------------------------------------------- // // method : SetPoleCurrentCmd::execute() // // description : method to trigger the execution of the command. // PLEASE DO NOT MODIFY this method core without pogo // // in : - device : The device on which the command must be executed // - in_any : The command input data // // returns : The command output data (packed in the Any object) // //----------------------------------------------------------------------------- CORBA::Any *SetPoleCurrentCmd::execute(Tango::DeviceImpl *device,const CORBA::Any &in_any) { cout2 << "SetPoleCurrentCmd::execute(): arrived" << endl; const Tango::DevVarDoubleArray *argin; extract(in_any, argin); ((static_cast(device))->set_pole_current(argin)); return new CORBA::Any(); } //+---------------------------------------------------------------------------- // // method : SetpointCheckCmd::execute() // // description : method to trigger the execution of the command. // PLEASE DO NOT MODIFY this method core without pogo // // in : - device : The device on which the command must be executed // - in_any : The command input data // // returns : The command output data (packed in the Any object) // //----------------------------------------------------------------------------- CORBA::Any *SetpointCheckCmd::execute(Tango::DeviceImpl *device,const CORBA::Any &in_any) { cout2 << "SetpointCheckCmd::execute(): arrived" << endl; const Tango::DevVarDoubleArray *argin; extract(in_any, argin); return insert((static_cast(device))->setpoint_check(argin)); } //+---------------------------------------------------------------------------- // // method : LocalPoleControlCmd::execute() // // description : method to trigger the execution of the command. // PLEASE DO NOT MODIFY this method core without pogo // // in : - device : The device on which the command must be executed // - in_any : The command input data // // returns : The command output data (packed in the Any object) // //----------------------------------------------------------------------------- CORBA::Any *LocalPoleControlCmd::execute(Tango::DeviceImpl *device,const CORBA::Any &in_any) { cout2 << "LocalPoleControlCmd::execute(): arrived" << endl; const Tango::DevVarShortArray *argin; extract(in_any, argin); ((static_cast(device))->local_pole_control(argin)); return new CORBA::Any(); } //+---------------------------------------------------------------------------- // // method : SetPoleAcCurrentCmd::execute() // // description : method to trigger the execution of the command. // PLEASE DO NOT MODIFY this method core without pogo // // in : - device : The device on which the command must be executed // - in_any : The command input data // // returns : The command output data (packed in the Any object) // //----------------------------------------------------------------------------- CORBA::Any *SetPoleAcCurrentCmd::execute(Tango::DeviceImpl *device,const CORBA::Any &in_any) { cout2 << "SetPoleAcCurrentCmd::execute(): arrived" << endl; const Tango::DevVarDoubleArray *argin; extract(in_any, argin); ((static_cast(device))->set_pole_ac_current(argin)); return new CORBA::Any(); } //+---------------------------------------------------------------------------- // // method : OnCmd::execute() // // description : method to trigger the execution of the command. // PLEASE DO NOT MODIFY this method core without pogo // // in : - device : The device on which the command must be executed // - in_any : The command input data // // returns : The command output data (packed in the Any object) // //----------------------------------------------------------------------------- CORBA::Any *OnCmd::execute(Tango::DeviceImpl *device,const CORBA::Any &in_any) { cout2 << "OnCmd::execute(): arrived" << endl; ((static_cast(device))->on()); return new CORBA::Any(); } //+---------------------------------------------------------------------------- // // method : OffCmd::execute() // // description : method to trigger the execution of the command. // PLEASE DO NOT MODIFY this method core without pogo // // in : - device : The device on which the command must be executed // - in_any : The command input data // // returns : The command output data (packed in the Any object) // //----------------------------------------------------------------------------- CORBA::Any *OffCmd::execute(Tango::DeviceImpl *device,const CORBA::Any &in_any) { cout2 << "OffCmd::execute(): arrived" << endl; ((static_cast(device))->off()); return new CORBA::Any(); } //+---------------------------------------------------------------------------- // // method : ResetCmd::execute() // // description : method to trigger the execution of the command. // PLEASE DO NOT MODIFY this method core without pogo // // in : - device : The device on which the command must be executed // - in_any : The command input data // // returns : The command output data (packed in the Any object) // //----------------------------------------------------------------------------- CORBA::Any *ResetCmd::execute(Tango::DeviceImpl *device,const CORBA::Any &in_any) { cout2 << "ResetCmd::execute(): arrived" << endl; ((static_cast(device))->reset()); return new CORBA::Any(); } // //---------------------------------------------------------------- // Initialize pointer for singleton pattern //---------------------------------------------------------------- // BiltClass *BiltClass::_instance = NULL; //+---------------------------------------------------------------------------- // // method : BiltClass::BiltClass(string &s) // // description : constructor for the BiltClass // // in : - s : The class name // //----------------------------------------------------------------------------- BiltClass::BiltClass(string &s):DeviceClass(s) { cout2 << "Entering BiltClass constructor" << endl; set_default_property(); get_class_property(); write_class_property(); cout2 << "Leaving BiltClass constructor" << endl; } //+---------------------------------------------------------------------------- // // method : BiltClass::~BiltClass() // // description : destructor for the BiltClass // //----------------------------------------------------------------------------- BiltClass::~BiltClass() { _instance = NULL; } //+---------------------------------------------------------------------------- // // method : BiltClass::instance // // description : Create the object if not already done. Otherwise, just // return a pointer to the object // // in : - name : The class name // //----------------------------------------------------------------------------- BiltClass *BiltClass::init(const char *name) { if (_instance == NULL) { try { string s(name); _instance = new BiltClass(s); } catch (bad_alloc) { throw; } } return _instance; } BiltClass *BiltClass::instance() { if (_instance == NULL) { cerr << "Class is not initialised !!" << endl; exit(-1); } return _instance; } //+---------------------------------------------------------------------------- // // method : BiltClass::command_factory // // description : Create the command object(s) and store them in the // command list // //----------------------------------------------------------------------------- void BiltClass::command_factory() { command_list.push_back(new OnCmd("On", Tango::DEV_VOID, Tango::DEV_VOID, "", "", Tango::OPERATOR)); command_list.push_back(new OffCmd("Off", Tango::DEV_VOID, Tango::DEV_VOID, "", "", Tango::OPERATOR)); command_list.push_back(new ResetCmd("Reset", Tango::DEV_VOID, Tango::DEV_VOID, "", "", Tango::OPERATOR)); command_list.push_back(new SetPoleAcCurrentCmd("SetPoleAcCurrent", Tango::DEVVAR_DOUBLEARRAY, Tango::DEV_VOID, "", "", Tango::OPERATOR)); command_list.push_back(new LocalPoleControlCmd("LocalPoleControl", Tango::DEVVAR_SHORTARRAY, Tango::DEV_VOID, "", "", Tango::OPERATOR)); command_list.push_back(new SetpointCheckCmd("SetpointCheck", Tango::DEVVAR_DOUBLEARRAY, Tango::DEV_BOOLEAN, "Setpoint values for the Poles", "true when settings are OK", Tango::OPERATOR)); command_list.push_back(new SetPoleCurrentCmd("SetPoleCurrent", Tango::DEVVAR_DOUBLEARRAY, Tango::DEV_VOID, "", "", Tango::OPERATOR)); // add polling if any for (unsigned int i=0 ; ilength() ; i++) { cout4 << "Device name : " << (*devlist_ptr)[i].in() << endl; // Create devices and add it into the device list //---------------------------------------------------- device_list.push_back(new Bilt(this, (*devlist_ptr)[i])); // Export device to the outside world // Check before if database used. //--------------------------------------------- if ((Tango::Util::_UseDb == true) && (Tango::Util::_FileDb == false)) export_device(device_list.back()); else export_device(device_list.back(), (*devlist_ptr)[i]); } // End of Automatic code generation //------------------------------------------------------------- } //+---------------------------------------------------------------------------- // Method: BiltClass::attribute_factory(vector &att_list) //----------------------------------------------------------------------------- void BiltClass::attribute_factory(vector &att_list) { // Attribute : Currents CurrentsAttrib *currents = new CurrentsAttrib(); Tango::UserDefaultAttrProp currents_prop; currents_prop.set_label("Currents"); currents_prop.set_unit("A"); currents_prop.set_format("%6.4f"); currents_prop.set_max_value("1.8"); currents_prop.set_min_value("-1.8"); currents_prop.set_description("The measured currents of the three poles."); currents->set_default_properties(currents_prop); att_list.push_back(currents); // Attribute : Voltages VoltagesAttrib *voltages = new VoltagesAttrib(); Tango::UserDefaultAttrProp voltages_prop; voltages_prop.set_label("Voltages"); voltages_prop.set_unit("V"); voltages_prop.set_format("%6.4"); voltages_prop.set_description("The measured voltages of the three poles."); voltages->set_default_properties(voltages_prop); att_list.push_back(voltages); // Attribute : Impedances ImpedancesAttrib *impedances = new ImpedancesAttrib(); Tango::UserDefaultAttrProp impedances_prop; impedances_prop.set_label("Impedances"); impedances_prop.set_unit("Ohm"); impedances_prop.set_format("%4.2f"); impedances_prop.set_max_alarm("5.0"); impedances_prop.set_min_alarm("2.8"); impedances_prop.set_description("Calculated impedances for the three poles."); impedances->set_default_properties(impedances_prop); att_list.push_back(impedances); // Attribute : SetCurrentsRMS SetCurrentsRMSAttrib *set_currents_rms = new SetCurrentsRMSAttrib(); Tango::UserDefaultAttrProp set_currents_rms_prop; set_currents_rms_prop.set_label("RMS AC current setpoints/s"); set_currents_rms_prop.set_unit("A"); set_currents_rms_prop.set_format("%6.4"); set_currents_rms_prop.set_description("Statistic when driven by the Libera. One RMS value for every pole\nof the magnet.\nRMS value of the AC setpoint applied on the DAC during the last second.\nX=sqr( (sum(setAC)*sum(setAC)) / n - ((sum(setAC)/n) *(sum(setAC)/n)) )"); set_currents_rms->set_default_properties(set_currents_rms_prop); att_list.push_back(set_currents_rms); // Attribute : SetCurrentsAverage SetCurrentsAverageAttrib *set_currents_average = new SetCurrentsAverageAttrib(); Tango::UserDefaultAttrProp set_currents_average_prop; set_currents_average_prop.set_label("Average AC current setpoints/s"); set_currents_average_prop.set_unit("A"); set_currents_average_prop.set_format("%6.4"); set_currents_average_prop.set_description("Statistic when driven by the Libera. One average value for every pole\nof the magnet.\nRMS value of the AC setpoint applied on the DAC during the last second.\nX=sqr( (sum(setAC)*sum(setAC)) / n - ((sum(setAC)/n) *(sum(setAC)/n)) )"); set_currents_average->set_default_properties(set_currents_average_prop); att_list.push_back(set_currents_average); // Attribute : FramesPerSecond FramesPerSecondAttrib *frames_per_second = new FramesPerSecondAttrib(); Tango::UserDefaultAttrProp frames_per_second_prop; frames_per_second_prop.set_label("Frames per second"); frames_per_second_prop.set_display_unit(" "); frames_per_second_prop.set_format("%6d"); frames_per_second->set_default_properties(frames_per_second_prop); att_list.push_back(frames_per_second); // Attribute : ErrorsPerSecond ErrorsPerSecondAttrib *errors_per_second = new ErrorsPerSecondAttrib(); Tango::UserDefaultAttrProp errors_per_second_prop; errors_per_second_prop.set_label("Errors per second"); errors_per_second_prop.set_display_unit(" "); errors_per_second_prop.set_format("%6d"); errors_per_second->set_default_properties(errors_per_second_prop); att_list.push_back(errors_per_second); // Attribute : ErrorCounters ErrorCountersAttrib *error_counters = new ErrorCountersAttrib(); Tango::UserDefaultAttrProp error_counters_prop; error_counters_prop.set_label("Error counters"); error_counters_prop.set_unit(" "); error_counters_prop.set_format("%6d"); error_counters_prop.set_description("Statistic when driven by the Libera.\nThe total number of errors since the last reset for the \nthree poles."); error_counters->set_default_properties(error_counters_prop); att_list.push_back(error_counters); // Attribute : LocalControls LocalControlsAttrib *local_controls = new LocalControlsAttrib(); att_list.push_back(local_controls); // End of Automatic code generation //------------------------------------------------------------- } //+---------------------------------------------------------------------------- // // method : BiltClass::get_class_property() // // description : Read the class properties from database. // //----------------------------------------------------------------------------- void BiltClass::get_class_property() { // Initialize your default values here (if not done with POGO). //------------------------------------------------------------------ // Read class properties from database.(Automatic code generation) //------------------------------------------------------------------ // Call database and extract values //-------------------------------------------- if (Tango::Util::instance()->_UseDb==true) get_db_class()->get_property(cl_prop); Tango::DbDatum def_prop; int i = -1; // End of Automatic code generation //------------------------------------------------------------------ } //+---------------------------------------------------------------------------- // // method : BiltClass::set_default_property // // description: Set default property (class and device) for wizard. // For each property, add to wizard property name and description // If default value has been set, add it to wizard property and // store it in a DbDatum. // //----------------------------------------------------------------------------- void BiltClass::set_default_property() { string prop_name; string prop_desc; string prop_def; vector vect_data; // Set Default Class Properties // Set Default Device Properties prop_name = "IPAddress"; prop_desc = "IP Address of BILT controller.\nEach controller includes several magnets and\neach magnet includes 3 power supplies,\nfor corrections in the X, Y and Z planes.\n\n"; prop_def = "0.0.0.0"; vect_data.clear(); vect_data.push_back("0.0.0.0"); if (prop_def.length()>0) { Tango::DbDatum data(prop_name); data << vect_data ; dev_def_prop.push_back(data); add_wiz_dev_prop(prop_name, prop_desc, prop_def); } else add_wiz_dev_prop(prop_name, prop_desc); prop_name = "MagnetNumber"; prop_desc = "Magnet number from 1 to 48"; prop_def = "0"; vect_data.clear(); vect_data.push_back("0"); if (prop_def.length()>0) { Tango::DbDatum data(prop_name); data << vect_data ; dev_def_prop.push_back(data); add_wiz_dev_prop(prop_name, prop_desc, prop_def); } else add_wiz_dev_prop(prop_name, prop_desc); prop_name = "UpdatePeriod"; prop_desc = "The update period for the data reading from the power supply in milli seconds."; prop_def = "1000"; vect_data.clear(); vect_data.push_back("1000"); if (prop_def.length()>0) { Tango::DbDatum data(prop_name); data << vect_data ; dev_def_prop.push_back(data); add_wiz_dev_prop(prop_name, prop_desc, prop_def); } else add_wiz_dev_prop(prop_name, prop_desc); } //+---------------------------------------------------------------------------- // // method : BiltClass::write_class_property // // description : Set class description as property in database // //----------------------------------------------------------------------------- void BiltClass::write_class_property() { // First time, check if database used //-------------------------------------------- if (Tango::Util::_UseDb == false) return; Tango::DbData data; string classname = get_name(); string header; string::size_type start, end; // Put title Tango::DbDatum title("ProjectTitle"); string str_title("BILT multi channel power supply"); title << str_title; data.push_back(title); // Put Description Tango::DbDatum description("Description"); vector str_desc; str_desc.push_back("The BILT multi channel power supply will be used with 3 channels for the ESRF fast"); str_desc.push_back("feedback systems."); str_desc.push_back("The power supply can be controlled in 2 ways :"); str_desc.push_back("By this device server for slow or human control or"); str_desc.push_back("by the Libera Beam Position monitors for fast feedback with closed loop control."); str_desc.push_back("The devices are exported as one device per steerer magnet. Every device has three"); str_desc.push_back("channels. The channels (poles) cannot be switched on individually but have their"); str_desc.push_back("individual set points and measurement values."); description << str_desc; data.push_back(description); // put cvs or svn location string filename(classname); filename += "Class.cpp"; // Create a string with the class ID to // get the string into the binary string class_id(ClassId); // check for cvs information string src_path(CvsPath); start = src_path.find("/"); if (start!=string::npos) { end = src_path.find(filename); if (end>start) { string strloc = src_path.substr(start, end-start); // Check if specific repository start = strloc.find("/cvsroot/"); if (start!=string::npos && start>0) { string repository = strloc.substr(0, start); if (repository.find("/segfs/")!=string::npos) strloc = "ESRF:" + strloc.substr(start, strloc.length()-start); } Tango::DbDatum cvs_loc("cvs_location"); cvs_loc << strloc; data.push_back(cvs_loc); } } // check for svn information else { string src_path(SvnPath); start = src_path.find("://"); if (start!=string::npos) { end = src_path.find(filename); if (end>start) { header = "$HeadURL: "; start = header.length(); string strloc = src_path.substr(start, (end-start)); Tango::DbDatum svn_loc("svn_location"); svn_loc << strloc; data.push_back(svn_loc); } } } // Get CVS or SVN revision tag // CVS tag string tagname(TagName); header = "$Name: "; start = header.length(); string endstr(" $"); end = tagname.find(endstr); if (end!=string::npos && end>start) { string strtag = tagname.substr(start, end-start); Tango::DbDatum cvs_tag("cvs_tag"); cvs_tag << strtag; data.push_back(cvs_tag); } // SVN tag string svnpath(SvnPath); header = "$HeadURL: "; start = header.length(); end = svnpath.find(endstr); if (end!=string::npos && end>start) { string strloc = svnpath.substr(start, end-start); string tagstr ("/tags/"); start = strloc.find(tagstr); if ( start!=string::npos ) { start = start + tagstr.length(); end = strloc.find(filename); string strtag = strloc.substr(start, end-start-1); Tango::DbDatum svn_tag("svn_tag"); svn_tag << strtag; data.push_back(svn_tag); } } // Get URL location string httpServ(HttpServer); if (httpServ.length()>0) { Tango::DbDatum db_doc_url("doc_url"); db_doc_url << httpServ; data.push_back(db_doc_url); } // Put inheritance Tango::DbDatum inher_datum("InheritedFrom"); vector inheritance; inheritance.push_back("Device_4Impl"); inher_datum << inheritance; data.push_back(inher_datum); // Call database and and values //-------------------------------------------- get_db_class()->put_property(data); } } // namespace Node-path: powersupply/itest/Bilt/trunk/BiltClass.h Node-kind: file Node-action: change Text-content-length: 12276 Text-content-md5: 45312c4f989a156d99a7ec9314d57df7 Content-length: 12276 //============================================================================= // // file : BiltClass.h // // description : Include for the BiltClass root class. // This class is the singleton class for // the Bilt device class. // It contains all properties and methods which the // Bilt requires only once e.g. the commands. // // project : TANGO Device Server // // $Author: meyer $ // // $Revision: 1.8 $ // $Date: 2010-05-01 16:58:39 $ // // SVN only: // $HeadURL: $ // // CVS only: // $Source: /segfs/tango/cvsroot/cppserver/machine/powersupply/SrSteerers/tango/Bilt/BiltClass.h,v $ // $Log: not supported by cvs2svn $ // Revision 1.7 2010-02-12 16:35:13 meyer // Added SetPoleCurrent command again. // // Revision 1.6 2010-02-11 16:35:27 meyer // Currents settings understand NaN values. // Deleted StePoleCurrent command. // // Revision 1.5 2010/02/10 12:27:31 meyer // Restructured Bilt class. // Acquistion is now done by a thread and only the multi channel data // gets exported. A single channel class (BiltCh) was created. // // Revision 1.4 2009/11/27 13:49:26 meyer // Modified structure! The pole is no longer a device. // The device is now a magnet with three poles. // // Revision 1.3 2009/11/26 10:46:58 meyer // Updated for libMagnet_V120 // // Revision 1.2 2009/11/06 12:46:25 meyer // Added impedance attribute and corrected fromatting of attribute values. // // Revision 1.1.1.1 2009/11/04 16:23:02 meyer // Imported using TkCVS // // // copyleft : European Synchrotron Radiation Facility // BP 220, Grenoble 38043 // FRANCE // //============================================================================= // // This file is generated by POGO // (Program Obviously used to Generate tango Object) // // (c) - Software Engineering Group - ESRF //============================================================================= #ifndef _BILTCLASS_H #define _BILTCLASS_H #include #include namespace Bilt_ns {//===================================== // Define classes for attributes //===================================== class LocalControlsAttrib: public Tango::SpectrumAttr { public: LocalControlsAttrib():SpectrumAttr("LocalControls", Tango::DEV_BOOLEAN, Tango::READ, 5) {}; ~LocalControlsAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_LocalControls(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_LocalControls_allowed(ty);} }; class ErrorCountersAttrib: public Tango::SpectrumAttr { public: ErrorCountersAttrib():SpectrumAttr("ErrorCounters", Tango::DEV_ULONG, Tango::READ, 3) {}; ~ErrorCountersAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_ErrorCounters(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_ErrorCounters_allowed(ty);} }; class ErrorsPerSecondAttrib: public Tango::SpectrumAttr { public: ErrorsPerSecondAttrib():SpectrumAttr("ErrorsPerSecond", Tango::DEV_ULONG, Tango::READ, 3) {}; ~ErrorsPerSecondAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_ErrorsPerSecond(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_ErrorsPerSecond_allowed(ty);} }; class FramesPerSecondAttrib: public Tango::SpectrumAttr { public: FramesPerSecondAttrib():SpectrumAttr("FramesPerSecond", Tango::DEV_ULONG, Tango::READ, 3) {}; ~FramesPerSecondAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_FramesPerSecond(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_FramesPerSecond_allowed(ty);} }; class SetCurrentsAverageAttrib: public Tango::SpectrumAttr { public: SetCurrentsAverageAttrib():SpectrumAttr("SetCurrentsAverage", Tango::DEV_DOUBLE, Tango::READ, 3) {}; ~SetCurrentsAverageAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_SetCurrentsAverage(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_SetCurrentsAverage_allowed(ty);} }; class SetCurrentsRMSAttrib: public Tango::SpectrumAttr { public: SetCurrentsRMSAttrib():SpectrumAttr("SetCurrentsRMS", Tango::DEV_DOUBLE, Tango::READ, 3) {}; ~SetCurrentsRMSAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_SetCurrentsRMS(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_SetCurrentsRMS_allowed(ty);} }; class ImpedancesAttrib: public Tango::SpectrumAttr { public: ImpedancesAttrib():SpectrumAttr("Impedances", Tango::DEV_DOUBLE, Tango::READ, 3) {}; ~ImpedancesAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_Impedances(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_Impedances_allowed(ty);} }; class VoltagesAttrib: public Tango::SpectrumAttr { public: VoltagesAttrib():SpectrumAttr("Voltages", Tango::DEV_DOUBLE, Tango::READ, 3) {}; ~VoltagesAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_Voltages(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_Voltages_allowed(ty);} }; class CurrentsAttrib: public Tango::SpectrumAttr { public: CurrentsAttrib():SpectrumAttr("Currents", Tango::DEV_DOUBLE, Tango::READ_WRITE, 3) {}; ~CurrentsAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_Currents(att);} virtual void write(Tango::DeviceImpl *dev,Tango::WAttribute &att) {(static_cast(dev))->write_Currents(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_Currents_allowed(ty);} }; //========================================= // Define classes for commands //========================================= class SetPoleCurrentCmd : public Tango::Command { public: SetPoleCurrentCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out, const char *in_desc, const char *out_desc, Tango::DispLevel level) :Command(name,in,out,in_desc,out_desc, level) {}; SetPoleCurrentCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out) :Command(name,in,out) {}; ~SetPoleCurrentCmd() {}; virtual CORBA::Any *execute (Tango::DeviceImpl *dev, const CORBA::Any &any); virtual bool is_allowed (Tango::DeviceImpl *dev, const CORBA::Any &any) {return (static_cast(dev))->is_SetPoleCurrent_allowed(any);} }; class SetpointCheckCmd : public Tango::Command { public: SetpointCheckCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out, const char *in_desc, const char *out_desc, Tango::DispLevel level) :Command(name,in,out,in_desc,out_desc, level) {}; SetpointCheckCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out) :Command(name,in,out) {}; ~SetpointCheckCmd() {}; virtual CORBA::Any *execute (Tango::DeviceImpl *dev, const CORBA::Any &any); virtual bool is_allowed (Tango::DeviceImpl *dev, const CORBA::Any &any) {return (static_cast(dev))->is_SetpointCheck_allowed(any);} }; class LocalPoleControlCmd : public Tango::Command { public: LocalPoleControlCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out, const char *in_desc, const char *out_desc, Tango::DispLevel level) :Command(name,in,out,in_desc,out_desc, level) {}; LocalPoleControlCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out) :Command(name,in,out) {}; ~LocalPoleControlCmd() {}; virtual CORBA::Any *execute (Tango::DeviceImpl *dev, const CORBA::Any &any); virtual bool is_allowed (Tango::DeviceImpl *dev, const CORBA::Any &any) {return (static_cast(dev))->is_LocalPoleControl_allowed(any);} }; class SetPoleAcCurrentCmd : public Tango::Command { public: SetPoleAcCurrentCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out, const char *in_desc, const char *out_desc, Tango::DispLevel level) :Command(name,in,out,in_desc,out_desc, level) {}; SetPoleAcCurrentCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out) :Command(name,in,out) {}; ~SetPoleAcCurrentCmd() {}; virtual CORBA::Any *execute (Tango::DeviceImpl *dev, const CORBA::Any &any); virtual bool is_allowed (Tango::DeviceImpl *dev, const CORBA::Any &any) {return (static_cast(dev))->is_SetPoleAcCurrent_allowed(any);} }; class ResetCmd : public Tango::Command { public: ResetCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out, const char *in_desc, const char *out_desc, Tango::DispLevel level) :Command(name,in,out,in_desc,out_desc, level) {}; ResetCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out) :Command(name,in,out) {}; ~ResetCmd() {}; virtual CORBA::Any *execute (Tango::DeviceImpl *dev, const CORBA::Any &any); virtual bool is_allowed (Tango::DeviceImpl *dev, const CORBA::Any &any) {return (static_cast(dev))->is_Reset_allowed(any);} }; class OffCmd : public Tango::Command { public: OffCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out, const char *in_desc, const char *out_desc, Tango::DispLevel level) :Command(name,in,out,in_desc,out_desc, level) {}; OffCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out) :Command(name,in,out) {}; ~OffCmd() {}; virtual CORBA::Any *execute (Tango::DeviceImpl *dev, const CORBA::Any &any); virtual bool is_allowed (Tango::DeviceImpl *dev, const CORBA::Any &any) {return (static_cast(dev))->is_Off_allowed(any);} }; class OnCmd : public Tango::Command { public: OnCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out, const char *in_desc, const char *out_desc, Tango::DispLevel level) :Command(name,in,out,in_desc,out_desc, level) {}; OnCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out) :Command(name,in,out) {}; ~OnCmd() {}; virtual CORBA::Any *execute (Tango::DeviceImpl *dev, const CORBA::Any &any); virtual bool is_allowed (Tango::DeviceImpl *dev, const CORBA::Any &any) {return (static_cast(dev))->is_On_allowed(any);} }; // // The BiltClass singleton definition // class #ifdef _TG_WINDOWS_ __declspec(dllexport) #endif BiltClass : public Tango::DeviceClass { public: // properties member data // add your own data members here //------------------------------------ public: Tango::DbData cl_prop; Tango::DbData cl_def_prop; Tango::DbData dev_def_prop; // Method prototypes static BiltClass *init(const char *); static BiltClass *instance(); ~BiltClass(); Tango::DbDatum get_class_property(string &); Tango::DbDatum get_default_device_property(string &); Tango::DbDatum get_default_class_property(string &); protected: BiltClass(string &); static BiltClass *_instance; void command_factory(); void get_class_property(); void attribute_factory(vector &); void write_class_property(); void set_default_property(); string get_cvstag(); string get_cvsroot(); private: void device_factory(const Tango::DevVarStringArray *); }; } // namespace Bilt_ns #endif // _BILTCLASS_H Node-path: powersupply/itest/Bilt/trunk/BiltStateMachine.cpp Node-kind: file Node-action: change Text-content-length: 9458 Text-content-md5: 855e1ae6e2a237a920c582be24ad0b84 Content-length: 9458 static const char *RcsId = "$Id $"; //+============================================================================= // // file : BiltStateMachine.cpp // // description : C++ source for the Bilt and its alowed // methods for commands and attributes // // project : TANGO Device Server // // $Author: meyer $ // // $Revision: 1.8 $ // $Date: 2010-05-01 16:58:39 $ // // SVN only: // $HeadURL: $ // // CVS only: // $Source: /segfs/tango/cvsroot/cppserver/machine/powersupply/SrSteerers/tango/Bilt/BiltStateMachine.cpp,v $ // $Log: not supported by cvs2svn $ // Revision 1.7 2010-02-12 16:35:13 meyer // Added SetPoleCurrent command again. // // Revision 1.6 2010-02-11 16:35:27 meyer // Currents settings understand NaN values. // Deleted StePoleCurrent command. // // Revision 1.5 2010/02/10 12:27:31 meyer // Restructured Bilt class. // Acquistion is now done by a thread and only the multi channel data // gets exported. A single channel class (BiltCh) was created. // // Revision 1.4 2009/11/27 13:49:26 meyer // Modified structure! The pole is no longer a device. // The device is now a magnet with three poles. // // Revision 1.3 2009/11/26 10:46:58 meyer // Updated for libMagnet_V120 // // Revision 1.2 2009/11/06 12:46:25 meyer // Added impedance attribute and corrected fromatting of attribute values. // // Revision 1.1.1.1 2009/11/04 16:23:02 meyer // Imported using TkCVS // // // copyleft : European Synchrotron Radiation Facility // BP 220, Grenoble 38043 // FRANCE // //-============================================================================= // // This file is generated by POGO // (Program Obviously used to Generate tango Object) // // (c) - Software Engineering Group - ESRF //============================================================================= #include #include #include /*==================================================================== * This file contains the methods to allow commands and attributes * read or write execution. * * If you wand to add your own code, add it between * the "End/Re-Start of Generated Code" comments. * * If you want, you can also add your own methods. *==================================================================== */ namespace Bilt_ns { //================================================= // Attributes Allowed Methods //================================================= //+---------------------------------------------------------------------------- // // method : Bilt::is_Voltages_allowed // // description : Read/Write allowed for Voltages attribute. // //----------------------------------------------------------------------------- bool Bilt::is_Voltages_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_Impedances_allowed // // description : Read/Write allowed for Impedances attribute. // //----------------------------------------------------------------------------- bool Bilt::is_Impedances_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_SetCurrentsRMS_allowed // // description : Read/Write allowed for SetCurrentsRMS attribute. // //----------------------------------------------------------------------------- bool Bilt::is_SetCurrentsRMS_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_SetCurrentsAverage_allowed // // description : Read/Write allowed for SetCurrentsAverage attribute. // //----------------------------------------------------------------------------- bool Bilt::is_SetCurrentsAverage_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_ErrorCounters_allowed // // description : Read/Write allowed for ErrorCounters attribute. // //----------------------------------------------------------------------------- bool Bilt::is_ErrorCounters_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_LocalControls_allowed // // description : Read/Write allowed for LocalControls attribute. // //----------------------------------------------------------------------------- bool Bilt::is_LocalControls_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_Currents_allowed // // description : Read/Write allowed for Currents attribute. // //----------------------------------------------------------------------------- bool Bilt::is_Currents_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_FramesPerSecond_allowed // // description : Read/Write allowed for FramesPerSecond attribute. // //----------------------------------------------------------------------------- bool Bilt::is_FramesPerSecond_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_ErrorsPerSecond_allowed // // description : Read/Write allowed for ErrorsPerSecond attribute. // //----------------------------------------------------------------------------- bool Bilt::is_ErrorsPerSecond_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //================================================= // Commands Allowed Methods //================================================= //+---------------------------------------------------------------------------- // // method : Bilt::is_On_allowed // // description : Execution allowed for On command. // //----------------------------------------------------------------------------- bool Bilt::is_On_allowed(const CORBA::Any &any) { if (get_state() == Tango::ON || get_state() == Tango::FAULT || get_state() == Tango::ALARM || get_state() == Tango::UNKNOWN) { // End of Generated Code // Re-Start of Generated Code return false; } return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_Off_allowed // // description : Execution allowed for Off command. // //----------------------------------------------------------------------------- bool Bilt::is_Off_allowed(const CORBA::Any &any) { if (get_state() == Tango::OFF) { // End of Generated Code // Re-Start of Generated Code return false; } return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_Reset_allowed // // description : Execution allowed for Reset command. // //----------------------------------------------------------------------------- bool Bilt::is_Reset_allowed(const CORBA::Any &any) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_SetPoleAcCurrent_allowed // // description : Execution allowed for SetPoleAcCurrent command. // //----------------------------------------------------------------------------- bool Bilt::is_SetPoleAcCurrent_allowed(const CORBA::Any &any) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_LocalPoleControl_allowed // // description : Execution allowed for LocalPoleControl command. // //----------------------------------------------------------------------------- bool Bilt::is_LocalPoleControl_allowed(const CORBA::Any &any) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_SetpointCheck_allowed // // description : Execution allowed for SetpointCheck command. // //----------------------------------------------------------------------------- bool Bilt::is_SetpointCheck_allowed(const CORBA::Any &any) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_SetPoleCurrent_allowed // // description : Execution allowed for SetPoleCurrent command. // //----------------------------------------------------------------------------- bool Bilt::is_SetPoleCurrent_allowed(const CORBA::Any &any) { // End of Generated Code // Re-Start of Generated Code return true; } } // namespace Bilt_ns Revision-number: 44 Prop-content-length: 155 Content-length: 155 K 10 svn:author V 5 meyer K 8 svn:date V 27 2010-06-21T07:11:03.000000Z K 7 svn:log V 55 Added two attributes for the temperature measurements. PROPS-END Node-path: powersupply/itest/BiltCh/trunk/BiltCh.h Node-kind: file Node-action: change Text-content-length: 8930 Text-content-md5: e8d271dfa2035e755fb7b9710c8df228 Content-length: 8930 //============================================================================= // // file : BiltCh.h // // description : Include for the BiltCh class. // // project : BILT channel interface // // $Author: meyer $ // // $Revision: 1.3 $ // $Date: 2010-06-21 07:11:03 $ // // SVN only: // $HeadURL: $ // // CVS only: // $Source: /segfs/tango/cvsroot/cppserver/machine/powersupply/SrSteerers/tango/BiltCh/BiltCh.h,v $ // $Log: not supported by cvs2svn $ // Revision 1.2 2010/05/01 16:25:41 meyer // Modified impedance alarm limits. // // Revision 1.1.1.1 2010-02-10 11:49:21 meyer // Imported using TkCVS // // // copyleft : European Synchrotron Radiation Facility // BP 220, Grenoble 38043 // FRANCE // //============================================================================= // // This file is generated by POGO // (Program Obviously used to Generate tango Object) // // (c) - Software Engineering Group - ESRF //============================================================================= #ifndef _BILTCH_H #define _BILTCH_H #include //using namespace Tango; /** * @author $Author: meyer $ * @version $Revision: 1.3 $ */ // Add your own constant definitions here. //----------------------------------------------- // Number of poles per magnet #define POLES 3 namespace BiltCh_ns { /** * Class Description: * The Bilt multi channel power supply has three individual channels. * This class offers an interface to an individual channel of the power supply. */ /* * Device States Description: * Tango::ON : Magnet is ON, all three channels are ON. * Tango::OFF : Magnet is OFF, all three channels are OFF. * Tango::FAULT : Error detected by the BILT magnet. * Tango::ALARM : Alarm detected on one or more channels. * Tango::UNKNOWN : Communication fault */ class BiltCh: public Tango::Device_4Impl { public : // Add your own data members here //----------------------------------------- // Here is the Start of the automatic code generation part //------------------------------------------------------------- /** * @name attributes * Attribute member data. */ //@{ Tango::DevDouble *attr_Current_read; Tango::DevDouble attr_Current_write; Tango::DevDouble *attr_Voltage_read; Tango::DevDouble *attr_Impedance_read; Tango::DevDouble *attr_SetCurrentRMS_read; Tango::DevDouble *attr_SetCurrentAverage_read; Tango::DevULong *attr_FramesPerSecond_read; Tango::DevULong *attr_ErrorPerSecond_read; Tango::DevULong *attr_ErrorCounter_read; Tango::DevBoolean *attr_LocalControl_read; Tango::DevBoolean attr_LocalControl_write; Tango::DevDouble *attr_SetCurrentAC_read; Tango::DevDouble attr_SetCurrentAC_write; Tango::DevLong *attr_Temperature1_read; Tango::DevLong *attr_Temperature2_read; //@} /** * @name Device properties * Device properties member data. */ //@{ /** * Name of the Bilt multi channel power supply device * */ string biltName; /** * The number of the channel or Pole of the Bilt power supply [0 -2] */ Tango::DevShort poleNumber; //@} /** * @name Device properties * Device property member data. */ //@{ //@} /**@name Constructors * Miscellaneous constructors */ //@{ /** * Constructs a newly allocated Command object. * * @param cl Class. * @param s Device Name */ BiltCh(Tango::DeviceClass *cl,string &s); /** * Constructs a newly allocated Command object. * * @param cl Class. * @param s Device Name */ BiltCh(Tango::DeviceClass *cl,const char *s); /** * Constructs a newly allocated Command object. * * @param cl Class. * @param s Device name * @param d Device description. */ BiltCh(Tango::DeviceClass *cl,const char *s,const char *d); //@} /**@name Destructor * Only one destructor is defined for this class */ //@{ /** * The object destructor. */ ~BiltCh() {delete_device();}; /** * will be called at device destruction or at init command. */ void delete_device(); //@} /**@name Miscellaneous methods */ //@{ /** * Initialize the device */ virtual void init_device(); /** * Always executed method before execution command method. */ virtual void always_executed_hook(); //@} /** * @name BiltCh methods prototypes */ //@{ /** * Hardware acquisition for attributes. */ virtual void read_attr_hardware(vector &attr_list); /** * Extract real attribute values for Current acquisition result. */ virtual void read_Current(Tango::Attribute &attr); /** * Write Current attribute values to hardware. */ virtual void write_Current(Tango::WAttribute &attr); /** * Extract real attribute values for Voltage acquisition result. */ virtual void read_Voltage(Tango::Attribute &attr); /** * Extract real attribute values for Impedance acquisition result. */ virtual void read_Impedance(Tango::Attribute &attr); /** * Extract real attribute values for SetCurrentRMS acquisition result. */ virtual void read_SetCurrentRMS(Tango::Attribute &attr); /** * Extract real attribute values for SetCurrentAverage acquisition result. */ virtual void read_SetCurrentAverage(Tango::Attribute &attr); /** * Extract real attribute values for FramesPerSecond acquisition result. */ virtual void read_FramesPerSecond(Tango::Attribute &attr); /** * Extract real attribute values for ErrorPerSecond acquisition result. */ virtual void read_ErrorPerSecond(Tango::Attribute &attr); /** * Extract real attribute values for ErrorCounter acquisition result. */ virtual void read_ErrorCounter(Tango::Attribute &attr); /** * Extract real attribute values for LocalControl acquisition result. */ virtual void read_LocalControl(Tango::Attribute &attr); /** * Write LocalControl attribute values to hardware. */ virtual void write_LocalControl(Tango::WAttribute &attr); /** * Extract real attribute values for SetCurrentAC acquisition result. */ virtual void read_SetCurrentAC(Tango::Attribute &attr); /** * Write SetCurrentAC attribute values to hardware. */ virtual void write_SetCurrentAC(Tango::WAttribute &attr); /** * Extract real attribute values for Temperature1 acquisition result. */ virtual void read_Temperature1(Tango::Attribute &attr); /** * Extract real attribute values for Temperature2 acquisition result. */ virtual void read_Temperature2(Tango::Attribute &attr); /** * Read/Write allowed for Current attribute. */ virtual bool is_Current_allowed(Tango::AttReqType type); /** * Read/Write allowed for Voltage attribute. */ virtual bool is_Voltage_allowed(Tango::AttReqType type); /** * Read/Write allowed for Impedance attribute. */ virtual bool is_Impedance_allowed(Tango::AttReqType type); /** * Read/Write allowed for SetCurrentRMS attribute. */ virtual bool is_SetCurrentRMS_allowed(Tango::AttReqType type); /** * Read/Write allowed for SetCurrentAverage attribute. */ virtual bool is_SetCurrentAverage_allowed(Tango::AttReqType type); /** * Read/Write allowed for FramesPerSecond attribute. */ virtual bool is_FramesPerSecond_allowed(Tango::AttReqType type); /** * Read/Write allowed for ErrorPerSecond attribute. */ virtual bool is_ErrorPerSecond_allowed(Tango::AttReqType type); /** * Read/Write allowed for ErrorCounter attribute. */ virtual bool is_ErrorCounter_allowed(Tango::AttReqType type); /** * Read/Write allowed for LocalControl attribute. */ virtual bool is_LocalControl_allowed(Tango::AttReqType type); /** * Read/Write allowed for SetCurrentAC attribute. */ virtual bool is_SetCurrentAC_allowed(Tango::AttReqType type); /** * Read/Write allowed for Temperature1 attribute. */ virtual bool is_Temperature1_allowed(Tango::AttReqType type); /** * Read/Write allowed for Temperature2 attribute. */ virtual bool is_Temperature2_allowed(Tango::AttReqType type); /** * This command gets the device state (stored in its device_state data member) and returns it to the caller. * @return State Code * @exception DevFailed */ virtual Tango::DevState dev_state(); /** * This command gets the device status (stored in its device_status data member) and returns it to the caller. * @return Status description * @exception DevFailed */ virtual Tango::ConstDevString dev_status(); /** * Read the device properties from database */ void get_device_property(); //@} // Here is the end of the automatic code generation part //------------------------------------------------------------- protected : // Add your own data members here //----------------------------------------- Tango::DeviceProxy *bilt_obj; Tango::DevErrorList bilt_error; bool bilt_init; double current; double voltage; double impedance; double current_rms; double current_average; Tango::DevULong error_counter; Tango::DevULong errors_per_sec; Tango::DevULong frames_per_sec; bool local_control; double current_ac; Tango::DevLong temp1; Tango::DevLong temp2; }; } // namespace_ns #endif // _BILTCH_H Node-path: powersupply/itest/BiltCh/trunk/BiltChClass.cpp Node-kind: file Node-action: change Text-content-length: 19675 Text-content-md5: bf2c82974ee8674fc09519c3b86c0bf7 Content-length: 19675 static const char *ClassId = "$Id: BiltChClass.cpp,v 1.4 2010-06-21 07:11:03 meyer Exp $"; static const char *TagName = "$Name: not supported by cvs2svn $"; static const char *CvsPath = "$Source: /segfs/tango/cvsroot/cppserver/machine/powersupply/SrSteerers/tango/BiltCh/BiltChClass.cpp,v $"; static const char *SvnPath = "$HeadURL: $"; static const char *HttpServer = "http://www.esrf.fr/computing/cs/tango/tango_doc/ds_doc/"; //+============================================================================= // // file : BiltChClass.cpp // // description : C++ source for the BiltChClass. A singleton // class derived from DeviceClass. It implements the // command list and all properties and methods required // by the BiltCh once per process. // // project : TANGO Device Server // // $Author: meyer $ // // $Revision: 1.4 $ // // $Log: not supported by cvs2svn $ // Revision 1.3 2010/05/01 16:25:41 meyer // Modified impedance alarm limits. // // Revision 1.2 2010-02-10 16:22:40 meyer // Release_1_0 // // Revision 1.1.1.1 2010-02-10 11:49:21 meyer // Imported using TkCVS // // // copyleft : European Synchrotron Radiation Facility // BP 220, Grenoble 38043 // FRANCE // //-============================================================================= // // This file is generated by POGO // (Program Obviously used to Generate tango Object) // // (c) - Software Engineering Group - ESRF //============================================================================= #include #include #include //+---------------------------------------------------------------------------- /** * Create BiltChClass singleton and return it in a C function for Python usage */ //+---------------------------------------------------------------------------- extern "C" { #ifdef WIN32 __declspec(dllexport) #endif Tango::DeviceClass *_create_BiltCh_class(const char *name) { return BiltCh_ns::BiltChClass::init(name); } } namespace BiltCh_ns { // //---------------------------------------------------------------- // Initialize pointer for singleton pattern //---------------------------------------------------------------- // BiltChClass *BiltChClass::_instance = NULL; //+---------------------------------------------------------------------------- // // method : BiltChClass::BiltChClass(string &s) // // description : constructor for the BiltChClass // // in : - s : The class name // //----------------------------------------------------------------------------- BiltChClass::BiltChClass(string &s):DeviceClass(s) { cout2 << "Entering BiltChClass constructor" << endl; set_default_property(); get_class_property(); write_class_property(); cout2 << "Leaving BiltChClass constructor" << endl; } //+---------------------------------------------------------------------------- // // method : BiltChClass::~BiltChClass() // // description : destructor for the BiltChClass // //----------------------------------------------------------------------------- BiltChClass::~BiltChClass() { _instance = NULL; } //+---------------------------------------------------------------------------- // // method : BiltChClass::instance // // description : Create the object if not already done. Otherwise, just // return a pointer to the object // // in : - name : The class name // //----------------------------------------------------------------------------- BiltChClass *BiltChClass::init(const char *name) { if (_instance == NULL) { try { string s(name); _instance = new BiltChClass(s); } catch (bad_alloc) { throw; } } return _instance; } BiltChClass *BiltChClass::instance() { if (_instance == NULL) { cerr << "Class is not initialised !!" << endl; exit(-1); } return _instance; } //+---------------------------------------------------------------------------- // // method : BiltChClass::command_factory // // description : Create the command object(s) and store them in the // command list // //----------------------------------------------------------------------------- void BiltChClass::command_factory() { // add polling if any for (unsigned int i=0 ; ilength() ; i++) { cout4 << "Device name : " << (*devlist_ptr)[i].in() << endl; // Create devices and add it into the device list //---------------------------------------------------- device_list.push_back(new BiltCh(this, (*devlist_ptr)[i])); // Export device to the outside world // Check before if database used. //--------------------------------------------- if ((Tango::Util::_UseDb == true) && (Tango::Util::_FileDb == false)) export_device(device_list.back()); else export_device(device_list.back(), (*devlist_ptr)[i]); } // End of Automatic code generation //------------------------------------------------------------- } //+---------------------------------------------------------------------------- // Method: BiltChClass::attribute_factory(vector &att_list) //----------------------------------------------------------------------------- void BiltChClass::attribute_factory(vector &att_list) { // Attribute : Current CurrentAttrib *current = new CurrentAttrib(); Tango::UserDefaultAttrProp current_prop; current_prop.set_label("DC Current"); current_prop.set_unit("A"); current_prop.set_format("%6.4f"); current_prop.set_max_value("1.8"); current_prop.set_min_value("-1.8"); current_prop.set_description("The DC current of the selected pole."); current->set_default_properties(current_prop); att_list.push_back(current); // Attribute : Voltage VoltageAttrib *voltage = new VoltageAttrib(); Tango::UserDefaultAttrProp voltage_prop; voltage_prop.set_label("Voltage"); voltage_prop.set_unit("V"); voltage_prop.set_format("%6.4f"); voltage_prop.set_description("The measured voltage of the selected pole."); voltage->set_default_properties(voltage_prop); att_list.push_back(voltage); // Attribute : Impedance ImpedanceAttrib *impedance = new ImpedanceAttrib(); Tango::UserDefaultAttrProp impedance_prop; impedance_prop.set_label("Impedance"); impedance_prop.set_unit("Ohm"); impedance_prop.set_format("%4.2f"); impedance_prop.set_max_alarm("5.0"); impedance_prop.set_min_alarm("2.8"); impedance_prop.set_description("Calculated impedance of the selected pole."); impedance->set_default_properties(impedance_prop); att_list.push_back(impedance); // Attribute : SetCurrentRMS SetCurrentRMSAttrib *set_current_rms = new SetCurrentRMSAttrib(); Tango::UserDefaultAttrProp set_current_rms_prop; set_current_rms_prop.set_label("RMS AC current setpoint/s"); set_current_rms_prop.set_unit("A"); set_current_rms_prop.set_format("%6.4f"); set_current_rms_prop.set_description("Statistic when driven by the Libera.\nRMS value of the AC setpoint applied on the DAC during the last second.\nX=sqr( (sum(setAC)*sum(setAC)) / n - ((sum(setAC)/n) *(sum(setAC)/n)) )"); set_current_rms->set_default_properties(set_current_rms_prop); att_list.push_back(set_current_rms); // Attribute : SetCurrentAverage SetCurrentAverageAttrib *set_current_average = new SetCurrentAverageAttrib(); Tango::UserDefaultAttrProp set_current_average_prop; set_current_average_prop.set_label("Average AC current setpoint/s"); set_current_average_prop.set_unit("A"); set_current_average_prop.set_format("%6.4f"); set_current_average_prop.set_description("Statistic when driven by the Libera.\nThe average AC setpoint applied to the DAC during the last second.\nX=SUM(setAC)/n"); set_current_average->set_default_properties(set_current_average_prop); att_list.push_back(set_current_average); // Attribute : FramesPerSecond FramesPerSecondAttrib *frames_per_second = new FramesPerSecondAttrib(); Tango::UserDefaultAttrProp frames_per_second_prop; frames_per_second_prop.set_label("Frames/s"); frames_per_second_prop.set_unit(" "); frames_per_second_prop.set_format("%3d"); frames_per_second_prop.set_description("Statistic when driven by the Libera.\nThe number of setpoints per second."); frames_per_second->set_default_properties(frames_per_second_prop); att_list.push_back(frames_per_second); // Attribute : ErrorPerSecond ErrorPerSecondAttrib *error_per_second = new ErrorPerSecondAttrib(); Tango::UserDefaultAttrProp error_per_second_prop; error_per_second_prop.set_label("Errors/s"); error_per_second_prop.set_unit(" "); error_per_second_prop.set_format("%3d"); error_per_second_prop.set_description("Statistic when driven by the Libera.\nThe number of errors detected per second."); error_per_second->set_default_properties(error_per_second_prop); att_list.push_back(error_per_second); // Attribute : ErrorCounter ErrorCounterAttrib *error_counter = new ErrorCounterAttrib(); Tango::UserDefaultAttrProp error_counter_prop; error_counter_prop.set_label("Error Counter"); error_counter_prop.set_unit(" "); error_counter_prop.set_format("%6d"); error_counter_prop.set_description("Statistic when driven by the Libera.\nThe total number of errors since the last reset."); error_counter->set_default_properties(error_counter_prop); att_list.push_back(error_counter); // Attribute : LocalControl LocalControlAttrib *local_control = new LocalControlAttrib(); Tango::UserDefaultAttrProp local_control_prop; local_control_prop.set_label("Local Control"); local_control_prop.set_unit(" "); local_control_prop.set_description("If true the AC current can be set on the device,\notherwise it is driven by the Libera."); local_control->set_default_properties(local_control_prop); att_list.push_back(local_control); // Attribute : SetCurrentAC SetCurrentACAttrib *set_current_ac = new SetCurrentACAttrib(); Tango::UserDefaultAttrProp set_current_ac_prop; set_current_ac_prop.set_label("AC Current Setpoint"); set_current_ac_prop.set_unit("A"); set_current_ac_prop.set_format("%5.4f"); set_current_ac_prop.set_max_value("0.2"); set_current_ac_prop.set_min_value("-0.2"); set_current_ac_prop.set_description("The AC current setpoint in local mode. If driven by the Libera, the attribute \nattribute value in INVALID."); set_current_ac->set_default_properties(set_current_ac_prop); att_list.push_back(set_current_ac); // Attribute : Temperature1 Temperature1Attrib *temperature1 = new Temperature1Attrib(); Tango::UserDefaultAttrProp temperature1_prop; temperature1_prop.set_label("Temperature 1"); temperature1_prop.set_unit("C"); temperature1_prop.set_format("%6d"); temperature1_prop.set_description("Temperature 1 of the pole."); temperature1->set_default_properties(temperature1_prop); att_list.push_back(temperature1); // Attribute : Temperature2 Temperature2Attrib *temperature2 = new Temperature2Attrib(); Tango::UserDefaultAttrProp temperature2_prop; temperature2_prop.set_label("Temperature 2"); temperature2_prop.set_unit("C"); temperature2_prop.set_format("%6d"); temperature2_prop.set_description("Temperature 2 of the pole."); temperature2->set_default_properties(temperature2_prop); att_list.push_back(temperature2); // End of Automatic code generation //------------------------------------------------------------- } //+---------------------------------------------------------------------------- // // method : BiltChClass::get_class_property() // // description : Read the class properties from database. // //----------------------------------------------------------------------------- void BiltChClass::get_class_property() { // Initialize your default values here (if not done with POGO). //------------------------------------------------------------------ // Read class properties from database.(Automatic code generation) //------------------------------------------------------------------ // Call database and extract values //-------------------------------------------- if (Tango::Util::instance()->_UseDb==true) get_db_class()->get_property(cl_prop); Tango::DbDatum def_prop; int i = -1; // End of Automatic code generation //------------------------------------------------------------------ } //+---------------------------------------------------------------------------- // // method : BiltChClass::set_default_property // // description: Set default property (class and device) for wizard. // For each property, add to wizard property name and description // If default value has been set, add it to wizard property and // store it in a DbDatum. // //----------------------------------------------------------------------------- void BiltChClass::set_default_property() { string prop_name; string prop_desc; string prop_def; vector vect_data; // Set Default Class Properties // Set Default Device Properties prop_name = "BiltName"; prop_desc = "Name of the Bilt multi channel power supply device\n"; prop_def = "none"; vect_data.clear(); vect_data.push_back("none"); if (prop_def.length()>0) { Tango::DbDatum data(prop_name); data << vect_data ; dev_def_prop.push_back(data); add_wiz_dev_prop(prop_name, prop_desc, prop_def); } else add_wiz_dev_prop(prop_name, prop_desc); prop_name = "PoleNumber"; prop_desc = "The number of the channel or Pole of the Bilt power supply [0 -2]"; prop_def = "-1"; vect_data.clear(); vect_data.push_back("-1"); if (prop_def.length()>0) { Tango::DbDatum data(prop_name); data << vect_data ; dev_def_prop.push_back(data); add_wiz_dev_prop(prop_name, prop_desc, prop_def); } else add_wiz_dev_prop(prop_name, prop_desc); } //+---------------------------------------------------------------------------- // // method : BiltChClass::write_class_property // // description : Set class description as property in database // //----------------------------------------------------------------------------- void BiltChClass::write_class_property() { // First time, check if database used //-------------------------------------------- if (Tango::Util::_UseDb == false) return; Tango::DbData data; string classname = get_name(); string header; string::size_type start, end; // Put title Tango::DbDatum title("ProjectTitle"); string str_title("BILT channel interface"); title << str_title; data.push_back(title); // Put Description Tango::DbDatum description("Description"); vector str_desc; str_desc.push_back("The Bilt multi channel power supply has three individual channels."); str_desc.push_back("This class offers an interface to an individual channel of the power supply."); description << str_desc; data.push_back(description); // put cvs or svn location string filename(classname); filename += "Class.cpp"; // Create a string with the class ID to // get the string into the binary string class_id(ClassId); // check for cvs information string src_path(CvsPath); start = src_path.find("/"); if (start!=string::npos) { end = src_path.find(filename); if (end>start) { string strloc = src_path.substr(start, end-start); // Check if specific repository start = strloc.find("/cvsroot/"); if (start!=string::npos && start>0) { string repository = strloc.substr(0, start); if (repository.find("/segfs/")!=string::npos) strloc = "ESRF:" + strloc.substr(start, strloc.length()-start); } Tango::DbDatum cvs_loc("cvs_location"); cvs_loc << strloc; data.push_back(cvs_loc); } } // check for svn information else { string src_path(SvnPath); start = src_path.find("://"); if (start!=string::npos) { end = src_path.find(filename); if (end>start) { header = "$HeadURL: "; start = header.length(); string strloc = src_path.substr(start, (end-start)); Tango::DbDatum svn_loc("svn_location"); svn_loc << strloc; data.push_back(svn_loc); } } } // Get CVS or SVN revision tag // CVS tag string tagname(TagName); header = "$Name: "; start = header.length(); string endstr(" $"); end = tagname.find(endstr); if (end!=string::npos && end>start) { string strtag = tagname.substr(start, end-start); Tango::DbDatum cvs_tag("cvs_tag"); cvs_tag << strtag; data.push_back(cvs_tag); } // SVN tag string svnpath(SvnPath); header = "$HeadURL: "; start = header.length(); end = svnpath.find(endstr); if (end!=string::npos && end>start) { string strloc = svnpath.substr(start, end-start); string tagstr ("/tags/"); start = strloc.find(tagstr); if ( start!=string::npos ) { start = start + tagstr.length(); end = strloc.find(filename); string strtag = strloc.substr(start, end-start-1); Tango::DbDatum svn_tag("svn_tag"); svn_tag << strtag; data.push_back(svn_tag); } } // Get URL location string httpServ(HttpServer); if (httpServ.length()>0) { Tango::DbDatum db_doc_url("doc_url"); db_doc_url << httpServ; data.push_back(db_doc_url); } // Put inheritance Tango::DbDatum inher_datum("InheritedFrom"); vector inheritance; inheritance.push_back("Device_4Impl"); inher_datum << inheritance; data.push_back(inher_datum); // Call database and and values //-------------------------------------------- get_db_class()->put_property(data); } } // namespace Node-path: powersupply/itest/BiltCh/trunk/BiltChClass.h Node-kind: file Node-action: change Text-content-length: 8170 Text-content-md5: af684c1c177107136993c1f7254f3e6b Content-length: 8170 //============================================================================= // // file : BiltChClass.h // // description : Include for the BiltChClass root class. // This class is the singleton class for // the BiltCh device class. // It contains all properties and methods which the // BiltCh requires only once e.g. the commands. // // project : TANGO Device Server // // $Author: meyer $ // // $Revision: 1.3 $ // $Date: 2010-06-21 07:11:03 $ // // SVN only: // $HeadURL: $ // // CVS only: // $Source: /segfs/tango/cvsroot/cppserver/machine/powersupply/SrSteerers/tango/BiltCh/BiltChClass.h,v $ // $Log: not supported by cvs2svn $ // Revision 1.2 2010/05/01 16:25:41 meyer // Modified impedance alarm limits. // // Revision 1.1.1.1 2010-02-10 11:49:21 meyer // Imported using TkCVS // // // copyleft : European Synchrotron Radiation Facility // BP 220, Grenoble 38043 // FRANCE // //============================================================================= // // This file is generated by POGO // (Program Obviously used to Generate tango Object) // // (c) - Software Engineering Group - ESRF //============================================================================= #ifndef _BILTCHCLASS_H #define _BILTCHCLASS_H #include #include namespace BiltCh_ns {//===================================== // Define classes for attributes //===================================== class Temperature2Attrib: public Tango::Attr { public: Temperature2Attrib():Attr("Temperature2", Tango::DEV_LONG, Tango::READ) {}; ~Temperature2Attrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_Temperature2(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_Temperature2_allowed(ty);} }; class Temperature1Attrib: public Tango::Attr { public: Temperature1Attrib():Attr("Temperature1", Tango::DEV_LONG, Tango::READ) {}; ~Temperature1Attrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_Temperature1(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_Temperature1_allowed(ty);} }; class SetCurrentACAttrib: public Tango::Attr { public: SetCurrentACAttrib():Attr("SetCurrentAC", Tango::DEV_DOUBLE, Tango::READ_WRITE) {}; ~SetCurrentACAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_SetCurrentAC(att);} virtual void write(Tango::DeviceImpl *dev,Tango::WAttribute &att) {(static_cast(dev))->write_SetCurrentAC(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_SetCurrentAC_allowed(ty);} }; class LocalControlAttrib: public Tango::Attr { public: LocalControlAttrib():Attr("LocalControl", Tango::DEV_BOOLEAN, Tango::READ_WRITE) {}; ~LocalControlAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_LocalControl(att);} virtual void write(Tango::DeviceImpl *dev,Tango::WAttribute &att) {(static_cast(dev))->write_LocalControl(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_LocalControl_allowed(ty);} }; class ErrorCounterAttrib: public Tango::Attr { public: ErrorCounterAttrib():Attr("ErrorCounter", Tango::DEV_ULONG, Tango::READ) {}; ~ErrorCounterAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_ErrorCounter(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_ErrorCounter_allowed(ty);} }; class ErrorPerSecondAttrib: public Tango::Attr { public: ErrorPerSecondAttrib():Attr("ErrorPerSecond", Tango::DEV_ULONG, Tango::READ) {}; ~ErrorPerSecondAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_ErrorPerSecond(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_ErrorPerSecond_allowed(ty);} }; class FramesPerSecondAttrib: public Tango::Attr { public: FramesPerSecondAttrib():Attr("FramesPerSecond", Tango::DEV_ULONG, Tango::READ) {}; ~FramesPerSecondAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_FramesPerSecond(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_FramesPerSecond_allowed(ty);} }; class SetCurrentAverageAttrib: public Tango::Attr { public: SetCurrentAverageAttrib():Attr("SetCurrentAverage", Tango::DEV_DOUBLE, Tango::READ) {}; ~SetCurrentAverageAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_SetCurrentAverage(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_SetCurrentAverage_allowed(ty);} }; class SetCurrentRMSAttrib: public Tango::Attr { public: SetCurrentRMSAttrib():Attr("SetCurrentRMS", Tango::DEV_DOUBLE, Tango::READ) {}; ~SetCurrentRMSAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_SetCurrentRMS(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_SetCurrentRMS_allowed(ty);} }; class ImpedanceAttrib: public Tango::Attr { public: ImpedanceAttrib():Attr("Impedance", Tango::DEV_DOUBLE, Tango::READ) {}; ~ImpedanceAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_Impedance(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_Impedance_allowed(ty);} }; class VoltageAttrib: public Tango::Attr { public: VoltageAttrib():Attr("Voltage", Tango::DEV_DOUBLE, Tango::READ) {}; ~VoltageAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_Voltage(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_Voltage_allowed(ty);} }; class CurrentAttrib: public Tango::Attr { public: CurrentAttrib():Attr("Current", Tango::DEV_DOUBLE, Tango::READ_WRITE) {}; ~CurrentAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_Current(att);} virtual void write(Tango::DeviceImpl *dev,Tango::WAttribute &att) {(static_cast(dev))->write_Current(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_Current_allowed(ty);} }; //========================================= // Define classes for commands //========================================= // // The BiltChClass singleton definition // class #ifdef _TG_WINDOWS_ __declspec(dllexport) #endif BiltChClass : public Tango::DeviceClass { public: // properties member data // add your own data members here //------------------------------------ public: Tango::DbData cl_prop; Tango::DbData cl_def_prop; Tango::DbData dev_def_prop; // Method prototypes static BiltChClass *init(const char *); static BiltChClass *instance(); ~BiltChClass(); Tango::DbDatum get_class_property(string &); Tango::DbDatum get_default_device_property(string &); Tango::DbDatum get_default_class_property(string &); protected: BiltChClass(string &); static BiltChClass *_instance; void command_factory(); void get_class_property(); void attribute_factory(vector &); void write_class_property(); void set_default_property(); string get_cvstag(); string get_cvsroot(); private: void device_factory(const Tango::DevVarStringArray *); }; } // namespace BiltCh_ns #endif // _BILTCHCLASS_H Node-path: powersupply/itest/BiltCh/trunk/BiltChStateMachine.cpp Node-kind: file Node-action: change Text-content-length: 7014 Text-content-md5: 7ef34fcf6cdcc23abc5621540fb6ce37 Content-length: 7014 static const char *RcsId = "$Id $"; //+============================================================================= // // file : BiltChStateMachine.cpp // // description : C++ source for the BiltCh and its alowed // methods for commands and attributes // // project : TANGO Device Server // // $Author: meyer $ // // $Revision: 1.3 $ // $Date: 2010-06-21 07:11:03 $ // // SVN only: // $HeadURL: $ // // CVS only: // $Source: /segfs/tango/cvsroot/cppserver/machine/powersupply/SrSteerers/tango/BiltCh/BiltChStateMachine.cpp,v $ // $Log: not supported by cvs2svn $ // Revision 1.2 2010/05/01 16:25:41 meyer // Modified impedance alarm limits. // // Revision 1.1.1.1 2010-02-10 11:49:21 meyer // Imported using TkCVS // // // copyleft : European Synchrotron Radiation Facility // BP 220, Grenoble 38043 // FRANCE // //-============================================================================= // // This file is generated by POGO // (Program Obviously used to Generate tango Object) // // (c) - Software Engineering Group - ESRF //============================================================================= #include #include #include /*==================================================================== * This file contains the methods to allow commands and attributes * read or write execution. * * If you wand to add your own code, add it between * the "End/Re-Start of Generated Code" comments. * * If you want, you can also add your own methods. *==================================================================== */ namespace BiltCh_ns { //================================================= // Attributes Allowed Methods //================================================= //+---------------------------------------------------------------------------- // // method : BiltCh::is_Voltage_allowed // // description : Read/Write allowed for Voltage attribute. // //----------------------------------------------------------------------------- bool BiltCh::is_Voltage_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : BiltCh::is_Impedance_allowed // // description : Read/Write allowed for Impedance attribute. // //----------------------------------------------------------------------------- bool BiltCh::is_Impedance_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : BiltCh::is_SetCurrentRMS_allowed // // description : Read/Write allowed for SetCurrentRMS attribute. // //----------------------------------------------------------------------------- bool BiltCh::is_SetCurrentRMS_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : BiltCh::is_SetCurrentAverage_allowed // // description : Read/Write allowed for SetCurrentAverage attribute. // //----------------------------------------------------------------------------- bool BiltCh::is_SetCurrentAverage_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : BiltCh::is_ErrorCounter_allowed // // description : Read/Write allowed for ErrorCounter attribute. // //----------------------------------------------------------------------------- bool BiltCh::is_ErrorCounter_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : BiltCh::is_LocalControl_allowed // // description : Read/Write allowed for LocalControl attribute. // //----------------------------------------------------------------------------- bool BiltCh::is_LocalControl_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : BiltCh::is_SetCurrentAC_allowed // // description : Read/Write allowed for SetCurrentAC attribute. // //----------------------------------------------------------------------------- bool BiltCh::is_SetCurrentAC_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : BiltCh::is_Current_allowed // // description : Read/Write allowed for Current attribute. // //----------------------------------------------------------------------------- bool BiltCh::is_Current_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : BiltCh::is_FramesPerSecond_allowed // // description : Read/Write allowed for FramesPerSecond attribute. // //----------------------------------------------------------------------------- bool BiltCh::is_FramesPerSecond_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : BiltCh::is_ErrorPerSecond_allowed // // description : Read/Write allowed for ErrorPerSecond attribute. // //----------------------------------------------------------------------------- bool BiltCh::is_ErrorPerSecond_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : BiltCh::is_Temperature1_allowed // // description : Read/Write allowed for Temperature1 attribute. // //----------------------------------------------------------------------------- bool BiltCh::is_Temperature1_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : BiltCh::is_Temperature2_allowed // // description : Read/Write allowed for Temperature2 attribute. // //----------------------------------------------------------------------------- bool BiltCh::is_Temperature2_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //================================================= // Commands Allowed Methods //================================================= } // namespace BiltCh_ns Node-path: powersupply/itest/BiltCh/trunk/BiltCh.cpp Node-kind: file Node-action: change Text-content-length: 19774 Text-content-md5: c55aebfe0cfa9c2b16656f9ed0c44f2e Content-length: 19774 static const char *RcsId = "$Id: BiltCh.cpp,v 1.5 2010-06-21 07:11:03 meyer Exp $"; //+============================================================================= // // file : BiltCh.cpp // // description : C++ source for the BiltCh and its commands. // The class is derived from Device. It represents the // CORBA servant object which will be accessed from the // network. All commands which can be executed on the // BiltCh are implemented in this file. // // project : TANGO Device Server // // $Author: meyer $ // // $Revision: 1.5 $ // // $Revision: 1.5 $ // $Date: 2010-06-21 07:11:03 $ // // SVN only: // $HeadURL: $ // // CVS only: // $Source: /segfs/tango/cvsroot/cppserver/machine/powersupply/SrSteerers/tango/BiltCh/BiltCh.cpp,v $ // $Log: not supported by cvs2svn $ // Revision 1.4 2010/05/01 16:25:41 meyer // Modified impedance alarm limits. // // Revision 1.3 2010-02-12 16:31:49 meyer // Added SetPoleCurrent again. // // Revision 1.2 2010-02-11 16:36:31 meyer // Currents attribute of Bilt understand NaN values now. // // Revision 1.1.1.1 2010-02-10 11:49:21 meyer // Imported using TkCVS // // // copyleft : European Synchrotron Radiation Facility // BP 220, Grenoble 38043 // FRANCE // //-============================================================================= // // This file is generated by POGO // (Program Obviously used to Generate tango Object) // // (c) - Software Engineering Group - ESRF //============================================================================= //=================================================================== // // The following table gives the correspondence // between commands and method name. // // Command name| Method name // ---------------------------------------- // State | dev_state() // Status | dev_status() // //=================================================================== #include #include #include #include namespace BiltCh_ns { //+---------------------------------------------------------------------------- // // method : BiltCh::BiltCh(string &s) // // description : constructor for simulated BiltCh // // in : - cl : Pointer to the DeviceClass object // - s : Device name // //----------------------------------------------------------------------------- BiltCh::BiltCh(Tango::DeviceClass *cl,string &s) :Tango::Device_4Impl(cl,s.c_str()) { init_device(); } BiltCh::BiltCh(Tango::DeviceClass *cl,const char *s) :Tango::Device_4Impl(cl,s) { init_device(); } BiltCh::BiltCh(Tango::DeviceClass *cl,const char *s,const char *d) :Tango::Device_4Impl(cl,s,d) { init_device(); } //+---------------------------------------------------------------------------- // // method : BiltCh::delete_device() // // description : will be called at device destruction or at init command. // //----------------------------------------------------------------------------- void BiltCh::delete_device() { // Delete device allocated objects if ( bilt_obj != NULL ) { delete bilt_obj; } } //+---------------------------------------------------------------------------- // // method : BiltCh::init_device() // // description : will be called at device initialization. // //----------------------------------------------------------------------------- void BiltCh::init_device() { INFO_STREAM << "BiltCh::BiltCh() create device " << device_name << endl; // Initialise variables to default values //-------------------------------------------- get_device_property(); set_state (Tango::UNKNOWN); // open proxy to Bilt power supply try { bilt_obj = new Tango::DeviceProxy(biltName); Tango::DeviceAttribute rattr; Tango::DevState bilt_state; rattr = bilt_obj->read_attribute("State"); rattr >> bilt_state; set_state (bilt_state); bilt_init = true; } catch (Tango::DevFailed &e) { bilt_error = e.errors; bilt_init = false; } } //+---------------------------------------------------------------------------- // // method : BiltCh::get_device_property() // // description : Read the device properties from database. // //----------------------------------------------------------------------------- void BiltCh::get_device_property() { // Initialize your default values here (if not done with POGO). //------------------------------------------------------------------ bilt_obj = NULL; current = 0; voltage = 0; impedance = 0; current_rms = 0; current_average = 0; error_counter = 0; errors_per_sec = 0; frames_per_sec = 0; local_control = false; current_ac = 0; temp1 = 0; temp2 = 0; // Read device properties from database.(Automatic code generation) //------------------------------------------------------------------ Tango::DbData dev_prop; dev_prop.push_back(Tango::DbDatum("BiltName")); dev_prop.push_back(Tango::DbDatum("PoleNumber")); // Call database and extract values //-------------------------------------------- if (Tango::Util::instance()->_UseDb==true) get_db_device()->get_property(dev_prop); Tango::DbDatum def_prop, cl_prop; BiltChClass *ds_class = (static_cast(get_device_class())); int i = -1; // Try to initialize BiltName from class property cl_prop = ds_class->get_class_property(dev_prop[++i].name); if (cl_prop.is_empty()==false) cl_prop >> biltName; else { // Try to initialize BiltName from default device value def_prop = ds_class->get_default_device_property(dev_prop[i].name); if (def_prop.is_empty()==false) def_prop >> biltName; } // And try to extract BiltName value from database if (dev_prop[i].is_empty()==false) dev_prop[i] >> biltName; // Try to initialize PoleNumber from class property cl_prop = ds_class->get_class_property(dev_prop[++i].name); if (cl_prop.is_empty()==false) cl_prop >> poleNumber; else { // Try to initialize PoleNumber from default device value def_prop = ds_class->get_default_device_property(dev_prop[i].name); if (def_prop.is_empty()==false) def_prop >> poleNumber; } // And try to extract PoleNumber value from database if (dev_prop[i].is_empty()==false) dev_prop[i] >> poleNumber; // End of Automatic code generation //------------------------------------------------------------------ } //+---------------------------------------------------------------------------- // // method : BiltCh::always_executed_hook() // // description : method always executed before any command is executed // //----------------------------------------------------------------------------- void BiltCh::always_executed_hook() { } //+---------------------------------------------------------------------------- // // method : BiltCh::read_attr_hardware // // description : Hardware acquisition for attributes. // //----------------------------------------------------------------------------- void BiltCh::read_attr_hardware(vector &attr_list) { DEBUG_STREAM << "BiltCh::read_attr_hardware(vector &attr_list) entering... "<< endl; // Add your own code here if ( bilt_init == false ) { TangoSys_MemStream tms; tms << "Device is not correctly initialised! See the device status for more information." << endl; Tango::Except::throw_exception("ReadError", tms.str(), "Bilt::read_attr_hardware"); } } //+---------------------------------------------------------------------------- // // method : BiltCh::read_Temperature1 // // description : Extract real attribute values for Temperature1 acquisition result. // //----------------------------------------------------------------------------- void BiltCh::read_Temperature1(Tango::Attribute &attr) { DEBUG_STREAM << "BiltCh::read_Temperature1(Tango::Attribute &attr) entering... "<< endl; Tango::DeviceAttribute rattr; vector temps; rattr = bilt_obj->read_attribute("Temperatures"); rattr >> temps; temp1 = temps[poleNumber * 2]; attr.set_value (&temp1); } //+---------------------------------------------------------------------------- // // method : BiltCh::read_Temperature2 // // description : Extract real attribute values for Temperature2 acquisition result. // //----------------------------------------------------------------------------- void BiltCh::read_Temperature2(Tango::Attribute &attr) { DEBUG_STREAM << "BiltCh::read_Temperature2(Tango::Attribute &attr) entering... "<< endl; Tango::DeviceAttribute rattr; vector temps; rattr = bilt_obj->read_attribute("Temperatures"); rattr >> temps; temp2 = temps[(poleNumber * 2) + 1]; attr.set_value (&temp2); } //+---------------------------------------------------------------------------- // // method : BiltCh::read_Current // // description : Extract real attribute values for Current acquisition result. // //----------------------------------------------------------------------------- void BiltCh::read_Current(Tango::Attribute &attr) { DEBUG_STREAM << "BiltCh::read_Current(Tango::Attribute &attr) entering... "<< endl; Tango::DeviceAttribute rattr; vector values; rattr = bilt_obj->read_attribute("Currents"); rattr >> values; Tango::MultiAttribute *attr_list = get_device_attr(); Tango::WAttribute &attr_curr = attr_list->get_w_attr_by_name ("Current"); attr_curr.set_write_value( &(values[POLES + poleNumber]) ); current = values[poleNumber]; attr.set_value (¤t); } //+---------------------------------------------------------------------------- // // method : BiltCh::write_Current // // description : Write Current attribute values to hardware. // //----------------------------------------------------------------------------- void BiltCh::write_Current(Tango::WAttribute &attr) { DEBUG_STREAM << "BiltCh::write_Current(Tango::WAttribute &attr) entering... "<< endl; double set_current; attr.get_write_value(set_current); Tango::DeviceData argin; vector cmd_in; cmd_in.push_back (poleNumber); cmd_in.push_back (set_current); argin << cmd_in; bilt_obj->command_inout("SetPoleCurrent", argin); } //+---------------------------------------------------------------------------- // // method : BiltCh::read_Voltage // // description : Extract real attribute values for Voltage acquisition result. // //----------------------------------------------------------------------------- void BiltCh::read_Voltage(Tango::Attribute &attr) { DEBUG_STREAM << "BiltCh::read_Voltage(Tango::Attribute &attr) entering... "<< endl; Tango::DeviceAttribute rattr; vector values; rattr = bilt_obj->read_attribute("Voltages"); rattr >> values; voltage = values[poleNumber]; attr.set_value (&voltage); } //+---------------------------------------------------------------------------- // // method : BiltCh::read_Impedance // // description : Extract real attribute values for Impedance acquisition result. // //----------------------------------------------------------------------------- void BiltCh::read_Impedance(Tango::Attribute &attr) { DEBUG_STREAM << "BiltCh::read_Impedance(Tango::Attribute &attr) entering... "<< endl; Tango::DeviceAttribute rattr; vector values; rattr = bilt_obj->read_attribute("Impedances"); rattr >> values; impedance = values[poleNumber]; attr.set_value (&impedance); } //+---------------------------------------------------------------------------- // // method : BiltCh::read_SetCurrentRMS // // description : Extract real attribute values for SetCurrentRMS acquisition result. // //----------------------------------------------------------------------------- void BiltCh::read_SetCurrentRMS(Tango::Attribute &attr) { DEBUG_STREAM << "BiltCh::read_SetCurrentRMS(Tango::Attribute &attr) entering... "<< endl; Tango::DeviceAttribute rattr; vector values; rattr = bilt_obj->read_attribute("SetCurrentsRMS"); rattr >> values; current_rms = values[poleNumber]; attr.set_value (¤t_rms); } //+---------------------------------------------------------------------------- // // method : BiltCh::read_SetCurrentAverage // // description : Extract real attribute values for SetCurrentAverage acquisition result. // //----------------------------------------------------------------------------- void BiltCh::read_SetCurrentAverage(Tango::Attribute &attr) { DEBUG_STREAM << "BiltCh::read_SetCurrentAverage(Tango::Attribute &attr) entering... "<< endl; Tango::DeviceAttribute rattr; vector values; rattr = bilt_obj->read_attribute("SetCurrentsAverage"); rattr >> values; current_average = values[poleNumber]; attr.set_value (¤t_average); } //+---------------------------------------------------------------------------- // // method : BiltCh::read_FramesPerSec // // description : Extract real attribute values for FramesPerSec acquisition result. // //----------------------------------------------------------------------------- void BiltCh::read_FramesPerSecond(Tango::Attribute &attr) { DEBUG_STREAM << "BiltCh::read_FramesPerSec(Tango::Attribute &attr) entering... "<< endl; Tango::DeviceAttribute rattr; vector values; rattr = bilt_obj->read_attribute("FramesPerSecond"); rattr >> values; frames_per_sec = values[poleNumber]; attr.set_value (&frames_per_sec); } //+---------------------------------------------------------------------------- // // method : BiltCh::read_ErrorPerSec // // description : Extract real attribute values for ErrorPerSec acquisition result. // //----------------------------------------------------------------------------- void BiltCh::read_ErrorPerSecond(Tango::Attribute &attr) { DEBUG_STREAM << "BiltCh::read_ErrorPerSec(Tango::Attribute &attr) entering... "<< endl; Tango::DeviceAttribute rattr; vector values; rattr = bilt_obj->read_attribute("ErrorsPerSecond"); rattr >> values; errors_per_sec = values[poleNumber]; attr.set_value (&errors_per_sec); } //+---------------------------------------------------------------------------- // // method : BiltCh::read_ErrorCounter // // description : Extract real attribute values for ErrorCounter acquisition result. // //----------------------------------------------------------------------------- void BiltCh::read_ErrorCounter(Tango::Attribute &attr) { DEBUG_STREAM << "BiltCh::read_ErrorCounter(Tango::Attribute &attr) entering... "<< endl; Tango::DeviceAttribute rattr; vector values; rattr = bilt_obj->read_attribute("ErrorCounters"); rattr >> values; error_counter = values[poleNumber]; attr.set_value (&error_counter); } //+---------------------------------------------------------------------------- // // method : BiltCh::read_LocalControl // // description : Extract real attribute values for LocalControl acquisition result. // //----------------------------------------------------------------------------- void BiltCh::read_LocalControl(Tango::Attribute &attr) { DEBUG_STREAM << "BiltCh::read_LocalControl(Tango::Attribute &attr) entering... "<< endl; Tango::DeviceAttribute rattr; vector values; rattr = bilt_obj->read_attribute("LocalControls"); rattr >> values; local_control = values[poleNumber]; attr.set_value (&local_control); } //+---------------------------------------------------------------------------- // // method : BiltCh::write_LocalControl // // description : Write LocalControl attribute values to hardware. // //----------------------------------------------------------------------------- void BiltCh::write_LocalControl(Tango::WAttribute &attr) { DEBUG_STREAM << "BiltCh::write_LocalControl(Tango::WAttribute &attr) entering... "<< endl; bool local_control; attr.get_write_value(local_control); Tango::DeviceData argin; vector cmd_in; cmd_in.push_back (poleNumber); if (local_control == true) cmd_in.push_back (1); else { cmd_in.push_back (0); // set back the AC current setpoint to 0! Tango::DeviceData ac_curr; vector ac_in; ac_in.push_back (poleNumber); ac_in.push_back (0); ac_curr << ac_in; bilt_obj->command_inout("SetPoleAcCurrent", ac_curr); current_ac = 0; } argin << cmd_in; bilt_obj->command_inout("LocalPoleControl", argin); } //+---------------------------------------------------------------------------- // // method : BiltCh::read_SetCurrentAC // // description : Extract real attribute values for SetCurrentAC acquisition result. // //----------------------------------------------------------------------------- void BiltCh::read_SetCurrentAC(Tango::Attribute &attr) { DEBUG_STREAM << "BiltCh::read_SetCurrentAC(Tango::Attribute &attr) entering... "<< endl; if ( local_control == false ) { attr.set_quality (Tango::ATTR_INVALID); } else { attr.set_value (¤t_ac); } } //+---------------------------------------------------------------------------- // // method : BiltCh::write_SetCurrentAC // // description : Write SetCurrentAC attribute values to hardware. // //----------------------------------------------------------------------------- void BiltCh::write_SetCurrentAC(Tango::WAttribute &attr) { DEBUG_STREAM << "BiltCh::write_SetCurrentAC(Tango::WAttribute &attr) entering... "<< endl; if ( local_control == false ) { TangoSys_MemStream tms; tms << "Can set AC current only when local control enabled!" << endl; Tango::Except::throw_exception("WriteError", tms.str(), "Bilt::write_SetCurrentAC"); } double set_current; attr.get_write_value(set_current); Tango::DeviceData argin; vector cmd_in; cmd_in.push_back (poleNumber); cmd_in.push_back (set_current); argin << cmd_in; bilt_obj->command_inout("SetPoleAcCurrent", argin); current_ac = set_current; } //+------------------------------------------------------------------ /** * method: BiltCh::dev_state * * description: method to execute "State" * This command gets the device state (stored in its device_state data member) and returns it to the caller. * * @return State Code * */ //+------------------------------------------------------------------ Tango::DevState BiltCh::dev_state() { Tango::DevState argout = DeviceImpl::dev_state(); DEBUG_STREAM << "BiltCh::dev_state(): entering... !" << endl; // Add your own code to control device here if ( bilt_init == true ) { Tango::DeviceAttribute rattr; Tango::DevState bilt_state; rattr = bilt_obj->read_attribute("State"); rattr >> bilt_state; set_state (bilt_state); } return get_state(); } //+------------------------------------------------------------------ /** * method: BiltCh::dev_status * * description: method to execute "Status" * This command gets the device status (stored in its device_status data member) and returns it to the caller. * * @return Status description * */ //+------------------------------------------------------------------ Tango::ConstDevString BiltCh::dev_status() { //Tango::ConstDevString argout = DeviceImpl::dev_status(); DEBUG_STREAM << "BiltCh::dev_status(): entering... !" << endl; // Add your own code to control device here string bilt_status; if ( bilt_init == true ) { Tango::DeviceAttribute rattr; rattr = bilt_obj->read_attribute("Status"); rattr >> bilt_status; set_status (bilt_status); } else { bilt_status = "Error during initialisation: \n"; for (short i = 0; i #include #include #include #include namespace Bilt_ns { //+---------------------------------------------------------------------------- // // method : Bilt::Bilt(string &s) // // description : constructor for simulated Bilt // // in : - cl : Pointer to the DeviceClass object // - s : Device name // //----------------------------------------------------------------------------- Bilt::Bilt(Tango::DeviceClass *cl,string &s) :Tango::Device_4Impl(cl,s.c_str()) { init_device(); } Bilt::Bilt(Tango::DeviceClass *cl,const char *s) :Tango::Device_4Impl(cl,s) { init_device(); } Bilt::Bilt(Tango::DeviceClass *cl,const char *s,const char *d) :Tango::Device_4Impl(cl,s,d) { init_device(); } //+---------------------------------------------------------------------------- // // method : Bilt::delete_device() // // description : will be called at device destruction or at init command. // //----------------------------------------------------------------------------- void Bilt::delete_device() { // Delete device allocated objects if ( acquisition_thread != NULL ) { data_mutex.lock(); exit_thread = true; data_mutex.unlock(); // join now the thread until it exits int *rv; acquisition_thread->join((void **)&rv); cout << "Bilt::delete_device(): Exit acquisition thread !!!" << endl; } // Delete connection to the power supply delete BILT; BILT = NULL; } //+---------------------------------------------------------------------------- // // method : Bilt::init_device() // // description : will be called at device initialization. // //----------------------------------------------------------------------------- void Bilt::init_device() { INFO_STREAM << "Bilt::Bilt() create device " << device_name << endl; // Initialise variables to default values //-------------------------------------------- get_device_property(); set_state (Tango::OFF); try { BILT = new itest::TMagnet (iPAddress.c_str(), magnetNumber); } catch (itest::ItestException &e) { try { create_tango_exception (e, mdata_errors, "Init failure" , "Cannot initialise ITEST libray objects", "Bilt::init_device"); } catch (Tango::DevFailed &e) { set_state (Tango::UNKNOWN); } } // initialise with the actual current set point values try { for (int i=0; ipole(i).get_current_DC(); } Tango::MultiAttribute *attr_list = get_device_attr(); Tango::WAttribute &attr_curr = attr_list->get_w_attr_by_name ("Currents"); attr_curr.set_write_value(¤ts_dc[0], currents_dc.size()); } catch (itest::ItestException &e) { try { create_tango_exception (e, mdata_errors, "Init failure" , "Cannot read the actual current set point values", "Bilt::init_device"); } catch (Tango::DevFailed &e) { set_state (Tango::UNKNOWN); } } // initialise and start the acquisition thread exit_thread = false; acquisition_thread = new AcquisitionThread(this, data_mutex, bilt_mutex); } //+---------------------------------------------------------------------------- // // method : Bilt::get_device_property() // // description : Read the device properties from database. // //----------------------------------------------------------------------------- void Bilt::get_device_property() { // Initialize your default values here (if not done with POGO). //------------------------------------------------------------------ BILT = NULL; bilt_connection_lost = false; acquisition_thread = NULL; struct timeval now; gettimeofday (&now, NULL); data_set_time = now; data_read_time = now; // intitialise mdada structure for magnet read values mdata.magnet = -1; mdata.state = -1; for (int i=0; i_UseDb==true) get_db_device()->get_property(dev_prop); Tango::DbDatum def_prop, cl_prop; BiltClass *ds_class = (static_cast(get_device_class())); int i = -1; // Try to initialize IPAddress from class property cl_prop = ds_class->get_class_property(dev_prop[++i].name); if (cl_prop.is_empty()==false) cl_prop >> iPAddress; else { // Try to initialize IPAddress from default device value def_prop = ds_class->get_default_device_property(dev_prop[i].name); if (def_prop.is_empty()==false) def_prop >> iPAddress; } // And try to extract IPAddress value from database if (dev_prop[i].is_empty()==false) dev_prop[i] >> iPAddress; // Try to initialize MagnetNumber from class property cl_prop = ds_class->get_class_property(dev_prop[++i].name); if (cl_prop.is_empty()==false) cl_prop >> magnetNumber; else { // Try to initialize MagnetNumber from default device value def_prop = ds_class->get_default_device_property(dev_prop[i].name); if (def_prop.is_empty()==false) def_prop >> magnetNumber; } // And try to extract MagnetNumber value from database if (dev_prop[i].is_empty()==false) dev_prop[i] >> magnetNumber; // Try to initialize UpdatePeriod from class property cl_prop = ds_class->get_class_property(dev_prop[++i].name); if (cl_prop.is_empty()==false) cl_prop >> updatePeriod; else { // Try to initialize UpdatePeriod from default device value def_prop = ds_class->get_default_device_property(dev_prop[i].name); if (def_prop.is_empty()==false) def_prop >> updatePeriod; } // And try to extract UpdatePeriod value from database if (dev_prop[i].is_empty()==false) dev_prop[i] >> updatePeriod; // End of Automatic code generation //------------------------------------------------------------------ } //+---------------------------------------------------------------------------- // // method : Bilt::always_executed_hook() // // description : method always executed before any command is executed // //----------------------------------------------------------------------------- void Bilt::always_executed_hook() { } //+---------------------------------------------------------------------------- // // method : Bilt::read_attr_hardware // // description : Hardware acquisition for attributes. // //----------------------------------------------------------------------------- void Bilt::read_attr_hardware(vector &attr_list) { DEBUG_STREAM << "Bilt::read_attr_hardware(vector &attr_list) entering... "<< endl; // Add your own code here } //+---------------------------------------------------------------------------- // // method : Bilt::read_Temperatures // // description : Extract real attribute values for Temperatures acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_Temperatures(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_Temperatures(Tango::Attribute &attr) entering... "<< endl; try { temperatures.clear(); for (int i=0; ipole(i).get_ctn (&temp1, &temp2); INFO_STREAM << "Pole["<pole(i).get_switch(); } if ( switch_state == 1 ) local_control[i] = false; else local_control[i] = true; } } catch (itest::ItestException &e) { create_tango_exception (e, "Read failure" , "Cannot read the actual switch states", "Bilt::read_LocalControls"); } attr.set_value (&(local_control[0]), POLES); } //+---------------------------------------------------------------------------- // // method : Bilt::read_SetCurrentsRMS // // description : Extract real attribute values for SetCurrentsRMS acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_SetCurrentsRMS(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_SetCurrentsRMS(Tango::Attribute &attr) entering... "<< endl; omni_mutex_lock l(data_mutex); if ( fdata_errors.length() != 0 ) attr.set_quality(Tango::ATTR_INVALID); else { for (int i=0; i CURRENT_LIMIT ) impedances[i] = fabs (mdata.idata[i].measvolt / mdata.idata[i].meascurr); else impedances[i] = nan("NaN"); } } attr.set_value (&(impedances[0]), POLES); } //+---------------------------------------------------------------------------- // // method : Bilt::write_Currents // // description : Write Currents attribute values to hardware. // //----------------------------------------------------------------------------- void Bilt::write_Currents(Tango::WAttribute &attr) { DEBUG_STREAM << "Bilt::write_Currents(Tango::WAttribute &attr) entering... "<< endl; const double *set_currents; // check the correct number of setpoints if ( attr.get_write_value_length() == POLES ) attr.get_write_value(set_currents); else { TangoSys_MemStream tms; tms << "Wrong number of setpoints!" << endl; Tango::Except::throw_exception("WriteError", tms.str(), "Bilt::write_Currents"); } // apply setpoints to the poles try { for (int i=0; ipole(i).set_current_DC (set_currents[i]); } } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot write DC current values", "Bilt::write_Currents"); } // initialise the set time, to be sure that the next // returned read value is newer and contains the changes. struct timeval now; gettimeofday (&now, NULL); data_set_time = now; } //+---------------------------------------------------------------------------- // // method : Bilt::read_Currents // // description : Extract real attribute values for Currents acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_Currents(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_Currents(Tango::Attribute &attr) entering... "<< endl; // wait for the next data acquisition afer a current setpoint change double delay; { omni_mutex_lock l(data_mutex); delay = (data_set_time.tv_sec * 1e6 + data_set_time.tv_usec) - (data_read_time.tv_sec * 1e6 + data_read_time.tv_usec); //cout << "delay = " << delay << endl; } while ( delay > 0 ) { // 20 ms struct timespec sleep_time = {0, SLEEP_NS}; nanosleep(&sleep_time, NULL); omni_mutex_lock l(data_mutex); delay = (data_set_time.tv_sec * 1e6 + data_set_time.tv_usec) - (data_read_time.tv_sec * 1e6 + data_read_time.tv_usec); INFO_STREAM << "read waiting delay = " << delay << endl; } omni_mutex_lock l(data_mutex); if ( mdata_errors.length() != 0 ) attr.set_quality(Tango::ATTR_INVALID); else { for (int i=0; iset_state(1); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot switch on pole", "Bilt::on"); } } //+------------------------------------------------------------------ /** * method: Bilt::off * * description: method to execute "Off" * Turns of power supply * * */ //+------------------------------------------------------------------ void Bilt::off() { DEBUG_STREAM << "Bilt::off(): entering... !" << endl; // Add your own code to control device here try { omni_mutex_lock l(bilt_mutex); BILT->set_state(0); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot switch off pole", "Bilt::off"); } } //+------------------------------------------------------------------ /** * method: Bilt::reset * * description: method to execute "Reset" * Reset faults and alarms * * */ //+------------------------------------------------------------------ void Bilt::reset() { DEBUG_STREAM << "Bilt::reset(): entering... !" << endl; // Add your own code to control device here try { omni_mutex_lock l(bilt_mutex); BILT->clear_all_err(); BILT->clear_alarm(); for (int i=0; ipole(i).clear_ferrors(); } } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot reset pole", "Bilt::reset"); } } //+------------------------------------------------------------------ /** * method: Bilt::set_pole_ac_current * * description: method to execute "SetPoleAcCurrent" * Set the AC current for one Pole. * [0] = pole number, [1] = current * * @param argin * */ //+------------------------------------------------------------------ void Bilt::set_pole_ac_current(const Tango::DevVarDoubleArray *argin) { DEBUG_STREAM << "Bilt::set_pole_ac_current(): entering... !" << endl; // Add your own code to control device here // argin[0] = pole number if ( (*argin)[0] < 0 || (*argin)[0] >= POLES ) { TangoSys_MemStream tms; tms << "The entered Pole number is out of range" << endl; Tango::Except::throw_exception("WriteError", tms.str(), "Bilt::set_pole_ac_current"); } try { omni_mutex_lock l(bilt_mutex); BILT->pole((int)(*argin)[0]).set_current_AC ((*argin)[1]); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot write AC current value", "Bilt::set_pole_ac_current"); } } //+------------------------------------------------------------------ /** * method: Bilt::local_pole_control * * description: method to execute "LocalPoleControl" * Set the AC current for one Pole. * [0] = pole number, [1] = local control true/false * * @param argin * */ //+------------------------------------------------------------------ void Bilt::local_pole_control(const Tango::DevVarShortArray *argin) { DEBUG_STREAM << "Bilt::local_pole_control(): entering... !" << endl; // Add your own code to control device here // argin[0] = pole number if ( (*argin)[0] < 0 || (*argin)[0] >= POLES ) { TangoSys_MemStream tms; tms << "The entered Pole number is out of range" << endl; Tango::Except::throw_exception("WriteError", tms.str(), "Bilt::local_pole_control"); } // argin[1] = true or false (1 or 0 ) if ( (*argin)[1] != 0 && (*argin)[1] != 1 ) { TangoSys_MemStream tms; tms << "Local control can only be choosen as 0 or 1 (false or true)" << endl; Tango::Except::throw_exception("WriteError", tms.str(), "Bilt::local_pole_control"); } try { int switch_state; if ( (*argin)[1] == true ) switch_state = 0; else switch_state = 1; omni_mutex_lock l(bilt_mutex); BILT->pole((*argin)[0]).set_switch (switch_state); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot write switch state", "Bilt::local_pole_control"); } } //+------------------------------------------------------------------ /** * method: Bilt::set_pole_current * * description: method to execute "SetPoleCurrent" * Set the current for one Pole. * [0] = pole number, [1] = current * * @param argin * */ //+------------------------------------------------------------------ void Bilt::set_pole_current(const Tango::DevVarDoubleArray *argin) { DEBUG_STREAM << "Bilt::set_pole_current(): entering... !" << endl; // Add your own code to control device here // argin[0] = pole number if ( (*argin)[0] < 0 || (*argin)[0] >= POLES ) { TangoSys_MemStream tms; tms << "The entered Pole number is out of range" << endl; Tango::Except::throw_exception("WriteError", tms.str(), "Bilt::set_pole_current"); } try { omni_mutex_lock l(bilt_mutex); BILT->pole((int)(*argin)[0]).set_current_DC ((*argin)[1]); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot write current value", "Bilt::set_pole_current"); } // make sure that the current set values are correct! try { omni_mutex_lock l(bilt_mutex); for (int i=0; ipole(i).get_current_DC(); } Tango::MultiAttribute *attr_list = get_device_attr(); Tango::WAttribute &attr_curr = attr_list->get_w_attr_by_name ("Currents"); attr_curr.set_write_value(¤ts_dc[0], currents_dc.size()); } catch (itest::ItestException &e) { create_tango_exception (e, "Read failure" , "Cannot read the actual current set point values", "Bilt::set_pole_current"); } } //+------------------------------------------------------------------ /** * method: Bilt::create_tango_exception() * * description: convert an itest exception into a tango exception * * * in : - &e : Reference to itest exception * - reason : Reason of the local Tango exception to be added to the stack * - desc : Description for the local Tango exception to be added to the stack * - origin : Origin if the local Tango exception to be added to the stack */ //+------------------------------------------------------------------ void Bilt::create_tango_exception (itest::ItestException &e, string reason, string desc, string origin) { Tango::DevErrorList errors; create_tango_exception (e, errors, reason, desc, origin); } //+------------------------------------------------------------------ /** * method: Bilt::create_tango_exception() * * description: convert an itest exception into a tango exception * * * in : - &e : Reference to itest exception * - errors : Tango error list to use, to store exception info * - reason : Reason of the local Tango exception to be added to the stack * - desc : Description for the local Tango exception to be added to the stack * - origin : Origin if the local Tango exception to be added to the stack */ //+------------------------------------------------------------------ void Bilt::create_tango_exception (itest::ItestException &e, Tango::DevErrorList &errors, string reason, string desc, string origin) { DEBUG_STREAM << "Bilt::create_tango_exception(): entering... !" << endl; errors.length(e.errors.size() + 1); int i; for(i=0; idevice_status data member) and returns it to the caller. * * @return Status description * */ //+------------------------------------------------------------------ Tango::ConstDevString Bilt::dev_status() { //Tango::ConstDevString argout = DeviceImpl::dev_status(); DEBUG_STREAM << "Bilt::dev_status(): entering... !" << endl; // Add your own code to control device here stringstream status; Tango::DevState state = dev_state(); switch (state) { case Tango::ON: status << "State : ON" << endl; break; case Tango::OFF: status << "State : OFF" << endl; break; case Tango::ALARM: { status << "State : Alarm" << endl; omni_mutex_lock l(data_mutex); for (int i=0; i 10W in 10ms!" << endl; else { if ( mdata.idata[i].fail == "TEMP" ) status << "Fault descr. : Max. temp on semiconductor reached!" << endl; else { if ( mdata.idata[i].fail == "PWSO" ) status << "Fault descr. : Delivered power > 40W in 100ms!" << endl; else { status << "Fault descr. : Unkown fault code!" << endl; } } } } } } } break; } default: { { omni_mutex_lock l(data_mutex); status << "BILT state : Unknown" << endl; if ( bilt_connection_lost == true ) { status << "Connection lost to BILT power supply, trying to reconnect!" << endl; status << endl; } if ( mdata_errors.length() > 0 ) status << "Error stack : " << endl; for(int i=0; idevice_state data member) and returns it to the caller. * * @return State Code * */ //+------------------------------------------------------------------ Tango::DevState Bilt::dev_state() { Tango::DevState argout = DeviceImpl::dev_state(); DEBUG_STREAM << "Bilt::dev_state(): entering... !" << endl; // Add your own code to control device here int state; omni_mutex_lock l(data_mutex); try { //read_mdata(); state = mdata.state; INFO_STREAM << "magnet state for " << get_name() << " = " << state << endl; } catch (Tango::DevFailed &e) { // do nothing! // Just avoid exceptions when executing state or status! } INFO_STREAM << "mdata errors = " << mdata_errors.length() << endl; if ( mdata_errors.length() != 0 ) set_state (Tango::UNKNOWN); else { // set the device state switch (state) { case -1: set_state (Tango::UNKNOWN); bilt_connection_lost = true; break; case 0: set_state (Tango::OFF); break; case 1: set_state (Tango::ON); break; case 2: set_state (Tango::ALARM); break; case 3: set_state (Tango::FAULT); break; default: set_state (Tango::UNKNOWN); break; } } // Check for attribute alarms if ( get_state() == Tango::ON && argout == Tango::ALARM ) set_state (Tango::ALARM); return get_state(); } //+------------------------------------------------------------------ /** * method: Bilt::setpoint_check * * description: method to execute "SetpointCheck" * Check the given current values against the specified limits. * * @param argin Setpoint values for the Poles * @return true when settings are OK * */ //+------------------------------------------------------------------ Tango::DevBoolean Bilt::setpoint_check(const Tango::DevVarDoubleArray *argin) { Tango::DevBoolean argout ; DEBUG_STREAM << "Bilt::setpoint_check(): entering... !" << endl; // Add your own code to control device here // get the min and max values for the current settings Tango::MultiAttribute *attr_list = get_device_attr(); Tango::WAttribute &attr_curr = attr_list->get_w_attr_by_name ("Currents"); double min, max; attr_curr.get_min_value(min); attr_curr.get_max_value(max); INFO_STREAM << "min = " << min << " max = " << max << endl; // check the input values argout = true; for ( int i=0; ilength(); i++ ) { INFO_STREAM << "i = " << i << " curr = " << (*argin)[i] << endl; if ( (*argin)[i] < min || (*argin)[i] > max ) { argout = false; break; } } return argout; } } // namespace Node-path: powersupply/itest/Bilt/trunk/Bilt.h Node-kind: file Node-action: change Text-content-length: 12195 Text-content-md5: 2253f1e155eb38ca6dff435dabc91242 Content-length: 12195 //============================================================================= // // file : Bilt.h // // description : Include for the Bilt class. // // project : BILT multi channel power supply // // $Author: meyer $ // // $Revision: 1.10 $ // $Date: 2010-06-21 07:13:05 $ // // SVN only: // $HeadURL: $ // // CVS only: // $Source: /segfs/tango/cvsroot/cppserver/machine/powersupply/SrSteerers/tango/Bilt/Bilt.h,v $ // $Log: not supported by cvs2svn $ // Revision 1.9 2010/05/01 16:58:39 meyer // Changed alarm limits for the impedance attribute. // // Revision 1.8 2010/03/16 14:54:58 meyer // Added reconnection method. // // Revision 1.7 2010-02-12 16:35:13 meyer // Added SetPoleCurrent command again. // // Revision 1.6 2010-02-11 16:35:27 meyer // Currents settings understand NaN values. // Deleted StePoleCurrent command. // // Revision 1.5 2010/02/10 12:27:31 meyer // Restructured Bilt class. // Acquistion is now done by a thread and only the multi channel data // gets exported. A single channel class (BiltCh) was created. // // Revision 1.4 2009/11/27 13:49:26 meyer // Modified structure! The pole is no longer a device. // The device is now a magnet with three poles. // // Revision 1.3 2009/11/26 10:46:58 meyer // Updated for libMagnet_V120 // // Revision 1.2 2009/11/06 12:46:25 meyer // Added impedance attribute and corrected fromatting of attribute values. // // Revision 1.1.1.1 2009/11/04 16:23:02 meyer // Imported using TkCVS // // // copyleft : European Synchrotron Radiation Facility // BP 220, Grenoble 38043 // FRANCE // //============================================================================= // // This file is generated by POGO // (Program Obviously used to Generate tango Object) // // (c) - Software Engineering Group - ESRF //============================================================================= #ifndef _BILT_H #define _BILT_H #include #include #include //using namespace Tango; /** * @author $Author: meyer $ * @version $Revision: 1.10 $ */ // Add your own constant definitions here. //----------------------------------------------- // Number of poles per magnet #define POLES 3 // Current limit for a valid impedeance calculation #define CURRENT_LIMIT 0.005 // define sleep times #define SLEEP_NS 20000000 // 20 ms namespace Bilt_ns { class AcquisitionThread; /** * Class Description: * The BILT multi channel power supply will be used with 3 channels for the ESRF fast * feedback systems. * The power supply can be controlled in 2 ways : * By this device server for slow or human control or * by the Libera Beam Position monitors for fast feedback with closed loop control. * The devices are exported as one device per steerer magnet. Every device has three * channels. The channels (poles) cannot be switched on individually but have their * individual set points and measurement values. */ /* * Device States Description: * Tango::ON : Magnet is ON, all three channels are ON. * Tango::OFF : Magnet is OFF, all three channels are OFF. * Tango::FAULT : Error detected by the BILT magnet. * Tango::ALARM : Alarm detected on one or more channels. * Tango::UNKNOWN : Communication fault */ class Bilt: public Tango::Device_4Impl { public : // Add your own data members here //----------------------------------------- // Here is the Start of the automatic code generation part //------------------------------------------------------------- /** * @name attributes * Attribute member data. */ //@{ Tango::DevDouble *attr_Currents_read; Tango::DevDouble attr_Currents_write; Tango::DevDouble *attr_Voltages_read; Tango::DevDouble *attr_Impedances_read; Tango::DevDouble *attr_SetCurrentsRMS_read; Tango::DevDouble *attr_SetCurrentsAverage_read; Tango::DevULong *attr_FramesPerSecond_read; Tango::DevULong *attr_ErrorsPerSecond_read; Tango::DevULong *attr_ErrorCounters_read; Tango::DevBoolean *attr_LocalControls_read; Tango::DevLong *attr_Temperatures_read; //@} /** * @name Device properties * Device properties member data. */ //@{ /** * IP Address of BILT controller. * Each controller includes several magnets and * each magnet includes 3 power supplies, * for corrections in the X, Y and Z planes. * * */ string iPAddress; /** * Magnet number from 1 to 48 */ Tango::DevShort magnetNumber; /** * The update period for the data reading from the power supply in milli seconds. */ Tango::DevLong updatePeriod; //@} /** * @name Device properties * Device property member data. */ //@{ //@} /**@name Constructors * Miscellaneous constructors */ //@{ /** * Constructs a newly allocated Command object. * * @param cl Class. * @param s Device Name */ Bilt(Tango::DeviceClass *cl,string &s); /** * Constructs a newly allocated Command object. * * @param cl Class. * @param s Device Name */ Bilt(Tango::DeviceClass *cl,const char *s); /** * Constructs a newly allocated Command object. * * @param cl Class. * @param s Device name * @param d Device description. */ Bilt(Tango::DeviceClass *cl,const char *s,const char *d); //@} /**@name Destructor * Only one destructor is defined for this class */ //@{ /** * The object destructor. */ ~Bilt() {delete_device();}; /** * will be called at device destruction or at init command. */ void delete_device(); //@} /**@name Miscellaneous methods */ //@{ /** * Initialize the device */ virtual void init_device(); /** * Always executed method before execution command method. */ virtual void always_executed_hook(); //@} /** * @name Bilt methods prototypes */ //@{ /** * Hardware acquisition for attributes. */ virtual void read_attr_hardware(vector &attr_list); /** * Extract real attribute values for Currents acquisition result. */ virtual void read_Currents(Tango::Attribute &attr); /** * Write Currents attribute values to hardware. */ virtual void write_Currents(Tango::WAttribute &attr); /** * Extract real attribute values for Voltages acquisition result. */ virtual void read_Voltages(Tango::Attribute &attr); /** * Extract real attribute values for Impedances acquisition result. */ virtual void read_Impedances(Tango::Attribute &attr); /** * Extract real attribute values for SetCurrentsRMS acquisition result. */ virtual void read_SetCurrentsRMS(Tango::Attribute &attr); /** * Extract real attribute values for SetCurrentsAverage acquisition result. */ virtual void read_SetCurrentsAverage(Tango::Attribute &attr); /** * Extract real attribute values for FramesPerSecond acquisition result. */ virtual void read_FramesPerSecond(Tango::Attribute &attr); /** * Extract real attribute values for ErrorsPerSecond acquisition result. */ virtual void read_ErrorsPerSecond(Tango::Attribute &attr); /** * Extract real attribute values for ErrorCounters acquisition result. */ virtual void read_ErrorCounters(Tango::Attribute &attr); /** * Extract real attribute values for LocalControls acquisition result. */ virtual void read_LocalControls(Tango::Attribute &attr); /** * Extract real attribute values for Temperatures acquisition result. */ virtual void read_Temperatures(Tango::Attribute &attr); /** * Read/Write allowed for Currents attribute. */ virtual bool is_Currents_allowed(Tango::AttReqType type); /** * Read/Write allowed for Voltages attribute. */ virtual bool is_Voltages_allowed(Tango::AttReqType type); /** * Read/Write allowed for Impedances attribute. */ virtual bool is_Impedances_allowed(Tango::AttReqType type); /** * Read/Write allowed for SetCurrentsRMS attribute. */ virtual bool is_SetCurrentsRMS_allowed(Tango::AttReqType type); /** * Read/Write allowed for SetCurrentsAverage attribute. */ virtual bool is_SetCurrentsAverage_allowed(Tango::AttReqType type); /** * Read/Write allowed for FramesPerSecond attribute. */ virtual bool is_FramesPerSecond_allowed(Tango::AttReqType type); /** * Read/Write allowed for ErrorsPerSecond attribute. */ virtual bool is_ErrorsPerSecond_allowed(Tango::AttReqType type); /** * Read/Write allowed for ErrorCounters attribute. */ virtual bool is_ErrorCounters_allowed(Tango::AttReqType type); /** * Read/Write allowed for LocalControls attribute. */ virtual bool is_LocalControls_allowed(Tango::AttReqType type); /** * Read/Write allowed for Temperatures attribute. */ virtual bool is_Temperatures_allowed(Tango::AttReqType type); /** * Execution allowed for On command. */ virtual bool is_On_allowed(const CORBA::Any &any); /** * Execution allowed for Off command. */ virtual bool is_Off_allowed(const CORBA::Any &any); /** * Execution allowed for Reset command. */ virtual bool is_Reset_allowed(const CORBA::Any &any); /** * Execution allowed for SetPoleAcCurrent command. */ virtual bool is_SetPoleAcCurrent_allowed(const CORBA::Any &any); /** * Execution allowed for LocalPoleControl command. */ virtual bool is_LocalPoleControl_allowed(const CORBA::Any &any); /** * Execution allowed for SetpointCheck command. */ virtual bool is_SetpointCheck_allowed(const CORBA::Any &any); /** * Execution allowed for SetPoleCurrent command. */ virtual bool is_SetPoleCurrent_allowed(const CORBA::Any &any); /** * This command gets the device state (stored in its device_state data member) and returns it to the caller. * @return State Code * @exception DevFailed */ virtual Tango::DevState dev_state(); /** * This command gets the device status (stored in its device_status data member) and returns it to the caller. * @return Status description * @exception DevFailed */ virtual Tango::ConstDevString dev_status(); /** * Turns on power supply. * @exception DevFailed */ void on(); /** * Turns of power supply * @exception DevFailed */ void off(); /** * Reset faults and alarms * @exception DevFailed */ void reset(); /** * Set the AC current for one Pole. * [0] = pole number, [1] = current * @param argin * @exception DevFailed */ void set_pole_ac_current(const Tango::DevVarDoubleArray *); /** * Set the AC current for one Pole. * [0] = pole number, [1] = local control true/false * @param argin * @exception DevFailed */ void local_pole_control(const Tango::DevVarShortArray *); /** * Check the given current values against the specified limits. * @param argin Setpoint values for the Poles * @return true when settings are OK * @exception DevFailed */ Tango::DevBoolean setpoint_check(const Tango::DevVarDoubleArray *); /** * Set the current for one Pole. * [0] = pole number, [1] = current * @param argin * @exception DevFailed */ void set_pole_current(const Tango::DevVarDoubleArray *); /** * Read the device properties from database */ void get_device_property(); //@} // Here is the end of the automatic code generation part //------------------------------------------------------------- protected : // Add your own data members here //----------------------------------------- friend class AcquisitionThread; AcquisitionThread *acquisition_thread; omni_mutex data_mutex; omni_mutex bilt_mutex; short exit_thread; struct timeval data_set_time; struct timeval data_read_time; void create_tango_exception (itest::ItestException &e, string reason, string desc, string origin); void create_tango_exception (itest::ItestException &e, Tango::DevErrorList &errors, string reason, string desc, string origin); itest::TMagnet *BILT; bool bilt_connection_lost; struct itest::mdata mdata; struct itest::fdata fdata[POLES]; Tango::DevErrorList mdata_errors; Tango::DevErrorList fdata_errors; vector currents_dc; vector currents_ac; vector voltages; vector impedances; vector currents_rms; vector currents_average; vector frames_per_sec; vector errors_per_sec; vector error_counters; vector temperatures; bool local_control[3]; }; } // namespace_ns #endif // _BILT_H Node-path: powersupply/itest/Bilt/trunk/BiltClass.cpp Node-kind: file Node-action: change Text-content-length: 26854 Text-content-md5: ed76f018218d176ea75ecea02ff6c885 Content-length: 26854 static const char *ClassId = "$Id: BiltClass.cpp,v 1.13 2010-06-21 07:13:05 meyer Exp $"; static const char *TagName = "$Name: not supported by cvs2svn $"; static const char *CvsPath = "$Source: /segfs/tango/cvsroot/cppserver/machine/powersupply/SrSteerers/tango/Bilt/BiltClass.cpp,v $"; static const char *SvnPath = "$HeadURL: $"; static const char *HttpServer = "http://www.esrf.fr/computing/cs/tango/tango_doc/ds_doc/"; //+============================================================================= // // file : BiltClass.cpp // // description : C++ source for the BiltClass. A singleton // class derived from DeviceClass. It implements the // command list and all properties and methods required // by the Bilt once per process. // // project : TANGO Device Server // // $Author: meyer $ // // $Revision: 1.13 $ // // $Log: not supported by cvs2svn $ // Revision 1.12 2010/05/01 16:58:39 meyer // Changed alarm limits for the impedance attribute. // // Revision 1.11 2010/03/16 15:03:33 meyer // Excluded Steerer class. // // Revision 1.10 2010-02-12 16:35:13 meyer // Added SetPoleCurrent command again. // // Revision 1.9 2010-02-11 16:35:27 meyer // Currents settings understand NaN values. // Deleted StePoleCurrent command. // // Revision 1.8 2010/02/10 16:22:15 meyer // Release_3_0 // // Revision 1.7 2010/02/10 12:27:31 meyer // Restructured Bilt class. // Acquistion is now done by a thread and only the multi channel data // gets exported. A single channel class (BiltCh) was created. // // Revision 1.6 2009/12/18 12:02:18 meyer // Changed version number to 2.1 // // Revision 1.5 2009/11/27 13:49:26 meyer // Modified structure! The pole is no longer a device. // The device is now a magnet with three poles. // // Revision 1.4 2009/11/26 10:46:58 meyer // Updated for libMagnet_V120 // // Revision 1.3 2009/11/23 16:46:58 meyer // Corrected state, status and exception handling // // Revision 1.2 2009/11/06 12:46:25 meyer // Added impedance attribute and corrected fromatting of attribute values. // // Revision 1.1.1.1 2009/11/04 16:23:02 meyer // Imported using TkCVS // // // copyleft : European Synchrotron Radiation Facility // BP 220, Grenoble 38043 // FRANCE // //-============================================================================= // // This file is generated by POGO // (Program Obviously used to Generate tango Object) // // (c) - Software Engineering Group - ESRF //============================================================================= #include #include #include //+---------------------------------------------------------------------------- /** * Create BiltClass singleton and return it in a C function for Python usage */ //+---------------------------------------------------------------------------- extern "C" { #ifdef WIN32 __declspec(dllexport) #endif Tango::DeviceClass *_create_Bilt_class(const char *name) { return Bilt_ns::BiltClass::init(name); } } namespace Bilt_ns { //+---------------------------------------------------------------------------- // // method : SetPoleCurrentCmd::execute() // // description : method to trigger the execution of the command. // PLEASE DO NOT MODIFY this method core without pogo // // in : - device : The device on which the command must be executed // - in_any : The command input data // // returns : The command output data (packed in the Any object) // //----------------------------------------------------------------------------- CORBA::Any *SetPoleCurrentCmd::execute(Tango::DeviceImpl *device,const CORBA::Any &in_any) { cout2 << "SetPoleCurrentCmd::execute(): arrived" << endl; const Tango::DevVarDoubleArray *argin; extract(in_any, argin); ((static_cast(device))->set_pole_current(argin)); return new CORBA::Any(); } //+---------------------------------------------------------------------------- // // method : SetpointCheckCmd::execute() // // description : method to trigger the execution of the command. // PLEASE DO NOT MODIFY this method core without pogo // // in : - device : The device on which the command must be executed // - in_any : The command input data // // returns : The command output data (packed in the Any object) // //----------------------------------------------------------------------------- CORBA::Any *SetpointCheckCmd::execute(Tango::DeviceImpl *device,const CORBA::Any &in_any) { cout2 << "SetpointCheckCmd::execute(): arrived" << endl; const Tango::DevVarDoubleArray *argin; extract(in_any, argin); return insert((static_cast(device))->setpoint_check(argin)); } //+---------------------------------------------------------------------------- // // method : LocalPoleControlCmd::execute() // // description : method to trigger the execution of the command. // PLEASE DO NOT MODIFY this method core without pogo // // in : - device : The device on which the command must be executed // - in_any : The command input data // // returns : The command output data (packed in the Any object) // //----------------------------------------------------------------------------- CORBA::Any *LocalPoleControlCmd::execute(Tango::DeviceImpl *device,const CORBA::Any &in_any) { cout2 << "LocalPoleControlCmd::execute(): arrived" << endl; const Tango::DevVarShortArray *argin; extract(in_any, argin); ((static_cast(device))->local_pole_control(argin)); return new CORBA::Any(); } //+---------------------------------------------------------------------------- // // method : SetPoleAcCurrentCmd::execute() // // description : method to trigger the execution of the command. // PLEASE DO NOT MODIFY this method core without pogo // // in : - device : The device on which the command must be executed // - in_any : The command input data // // returns : The command output data (packed in the Any object) // //----------------------------------------------------------------------------- CORBA::Any *SetPoleAcCurrentCmd::execute(Tango::DeviceImpl *device,const CORBA::Any &in_any) { cout2 << "SetPoleAcCurrentCmd::execute(): arrived" << endl; const Tango::DevVarDoubleArray *argin; extract(in_any, argin); ((static_cast(device))->set_pole_ac_current(argin)); return new CORBA::Any(); } //+---------------------------------------------------------------------------- // // method : OnCmd::execute() // // description : method to trigger the execution of the command. // PLEASE DO NOT MODIFY this method core without pogo // // in : - device : The device on which the command must be executed // - in_any : The command input data // // returns : The command output data (packed in the Any object) // //----------------------------------------------------------------------------- CORBA::Any *OnCmd::execute(Tango::DeviceImpl *device,const CORBA::Any &in_any) { cout2 << "OnCmd::execute(): arrived" << endl; ((static_cast(device))->on()); return new CORBA::Any(); } //+---------------------------------------------------------------------------- // // method : OffCmd::execute() // // description : method to trigger the execution of the command. // PLEASE DO NOT MODIFY this method core without pogo // // in : - device : The device on which the command must be executed // - in_any : The command input data // // returns : The command output data (packed in the Any object) // //----------------------------------------------------------------------------- CORBA::Any *OffCmd::execute(Tango::DeviceImpl *device,const CORBA::Any &in_any) { cout2 << "OffCmd::execute(): arrived" << endl; ((static_cast(device))->off()); return new CORBA::Any(); } //+---------------------------------------------------------------------------- // // method : ResetCmd::execute() // // description : method to trigger the execution of the command. // PLEASE DO NOT MODIFY this method core without pogo // // in : - device : The device on which the command must be executed // - in_any : The command input data // // returns : The command output data (packed in the Any object) // //----------------------------------------------------------------------------- CORBA::Any *ResetCmd::execute(Tango::DeviceImpl *device,const CORBA::Any &in_any) { cout2 << "ResetCmd::execute(): arrived" << endl; ((static_cast(device))->reset()); return new CORBA::Any(); } // //---------------------------------------------------------------- // Initialize pointer for singleton pattern //---------------------------------------------------------------- // BiltClass *BiltClass::_instance = NULL; //+---------------------------------------------------------------------------- // // method : BiltClass::BiltClass(string &s) // // description : constructor for the BiltClass // // in : - s : The class name // //----------------------------------------------------------------------------- BiltClass::BiltClass(string &s):DeviceClass(s) { cout2 << "Entering BiltClass constructor" << endl; set_default_property(); get_class_property(); write_class_property(); cout2 << "Leaving BiltClass constructor" << endl; } //+---------------------------------------------------------------------------- // // method : BiltClass::~BiltClass() // // description : destructor for the BiltClass // //----------------------------------------------------------------------------- BiltClass::~BiltClass() { _instance = NULL; } //+---------------------------------------------------------------------------- // // method : BiltClass::instance // // description : Create the object if not already done. Otherwise, just // return a pointer to the object // // in : - name : The class name // //----------------------------------------------------------------------------- BiltClass *BiltClass::init(const char *name) { if (_instance == NULL) { try { string s(name); _instance = new BiltClass(s); } catch (bad_alloc) { throw; } } return _instance; } BiltClass *BiltClass::instance() { if (_instance == NULL) { cerr << "Class is not initialised !!" << endl; exit(-1); } return _instance; } //+---------------------------------------------------------------------------- // // method : BiltClass::command_factory // // description : Create the command object(s) and store them in the // command list // //----------------------------------------------------------------------------- void BiltClass::command_factory() { command_list.push_back(new OnCmd("On", Tango::DEV_VOID, Tango::DEV_VOID, "", "", Tango::OPERATOR)); command_list.push_back(new OffCmd("Off", Tango::DEV_VOID, Tango::DEV_VOID, "", "", Tango::OPERATOR)); command_list.push_back(new ResetCmd("Reset", Tango::DEV_VOID, Tango::DEV_VOID, "", "", Tango::OPERATOR)); command_list.push_back(new SetPoleAcCurrentCmd("SetPoleAcCurrent", Tango::DEVVAR_DOUBLEARRAY, Tango::DEV_VOID, "", "", Tango::OPERATOR)); command_list.push_back(new LocalPoleControlCmd("LocalPoleControl", Tango::DEVVAR_SHORTARRAY, Tango::DEV_VOID, "", "", Tango::OPERATOR)); command_list.push_back(new SetpointCheckCmd("SetpointCheck", Tango::DEVVAR_DOUBLEARRAY, Tango::DEV_BOOLEAN, "Setpoint values for the Poles", "true when settings are OK", Tango::OPERATOR)); command_list.push_back(new SetPoleCurrentCmd("SetPoleCurrent", Tango::DEVVAR_DOUBLEARRAY, Tango::DEV_VOID, "", "", Tango::OPERATOR)); // add polling if any for (unsigned int i=0 ; ilength() ; i++) { cout4 << "Device name : " << (*devlist_ptr)[i].in() << endl; // Create devices and add it into the device list //---------------------------------------------------- device_list.push_back(new Bilt(this, (*devlist_ptr)[i])); // Export device to the outside world // Check before if database used. //--------------------------------------------- if ((Tango::Util::_UseDb == true) && (Tango::Util::_FileDb == false)) export_device(device_list.back()); else export_device(device_list.back(), (*devlist_ptr)[i]); } // End of Automatic code generation //------------------------------------------------------------- } //+---------------------------------------------------------------------------- // Method: BiltClass::attribute_factory(vector &att_list) //----------------------------------------------------------------------------- void BiltClass::attribute_factory(vector &att_list) { // Attribute : Currents CurrentsAttrib *currents = new CurrentsAttrib(); Tango::UserDefaultAttrProp currents_prop; currents_prop.set_label("Currents"); currents_prop.set_unit("A"); currents_prop.set_format("%6.4f"); currents_prop.set_max_value("1.8"); currents_prop.set_min_value("-1.8"); currents_prop.set_description("The measured currents of the three poles."); currents->set_default_properties(currents_prop); att_list.push_back(currents); // Attribute : Voltages VoltagesAttrib *voltages = new VoltagesAttrib(); Tango::UserDefaultAttrProp voltages_prop; voltages_prop.set_label("Voltages"); voltages_prop.set_unit("V"); voltages_prop.set_format("%6.4"); voltages_prop.set_description("The measured voltages of the three poles."); voltages->set_default_properties(voltages_prop); att_list.push_back(voltages); // Attribute : Impedances ImpedancesAttrib *impedances = new ImpedancesAttrib(); Tango::UserDefaultAttrProp impedances_prop; impedances_prop.set_label("Impedances"); impedances_prop.set_unit("Ohm"); impedances_prop.set_format("%4.2f"); impedances_prop.set_max_alarm("5.0"); impedances_prop.set_min_alarm("2.8"); impedances_prop.set_description("Calculated impedances for the three poles."); impedances->set_default_properties(impedances_prop); att_list.push_back(impedances); // Attribute : SetCurrentsRMS SetCurrentsRMSAttrib *set_currents_rms = new SetCurrentsRMSAttrib(); Tango::UserDefaultAttrProp set_currents_rms_prop; set_currents_rms_prop.set_label("RMS AC current setpoints/s"); set_currents_rms_prop.set_unit("A"); set_currents_rms_prop.set_format("%6.4"); set_currents_rms_prop.set_description("Statistic when driven by the Libera. One RMS value for every pole\nof the magnet.\nRMS value of the AC setpoint applied on the DAC during the last second.\nX=sqr( (sum(setAC)*sum(setAC)) / n - ((sum(setAC)/n) *(sum(setAC)/n)) )"); set_currents_rms->set_default_properties(set_currents_rms_prop); att_list.push_back(set_currents_rms); // Attribute : SetCurrentsAverage SetCurrentsAverageAttrib *set_currents_average = new SetCurrentsAverageAttrib(); Tango::UserDefaultAttrProp set_currents_average_prop; set_currents_average_prop.set_label("Average AC current setpoints/s"); set_currents_average_prop.set_unit("A"); set_currents_average_prop.set_format("%6.4"); set_currents_average_prop.set_description("Statistic when driven by the Libera. One average value for every pole\nof the magnet.\nRMS value of the AC setpoint applied on the DAC during the last second.\nX=sqr( (sum(setAC)*sum(setAC)) / n - ((sum(setAC)/n) *(sum(setAC)/n)) )"); set_currents_average->set_default_properties(set_currents_average_prop); att_list.push_back(set_currents_average); // Attribute : FramesPerSecond FramesPerSecondAttrib *frames_per_second = new FramesPerSecondAttrib(); Tango::UserDefaultAttrProp frames_per_second_prop; frames_per_second_prop.set_label("Frames per second"); frames_per_second_prop.set_display_unit(" "); frames_per_second_prop.set_format("%6d"); frames_per_second->set_default_properties(frames_per_second_prop); att_list.push_back(frames_per_second); // Attribute : ErrorsPerSecond ErrorsPerSecondAttrib *errors_per_second = new ErrorsPerSecondAttrib(); Tango::UserDefaultAttrProp errors_per_second_prop; errors_per_second_prop.set_label("Errors per second"); errors_per_second_prop.set_display_unit(" "); errors_per_second_prop.set_format("%6d"); errors_per_second->set_default_properties(errors_per_second_prop); att_list.push_back(errors_per_second); // Attribute : ErrorCounters ErrorCountersAttrib *error_counters = new ErrorCountersAttrib(); Tango::UserDefaultAttrProp error_counters_prop; error_counters_prop.set_label("Error counters"); error_counters_prop.set_unit(" "); error_counters_prop.set_format("%6d"); error_counters_prop.set_description("Statistic when driven by the Libera.\nThe total number of errors since the last reset for the \nthree poles."); error_counters->set_default_properties(error_counters_prop); att_list.push_back(error_counters); // Attribute : LocalControls LocalControlsAttrib *local_controls = new LocalControlsAttrib(); att_list.push_back(local_controls); // Attribute : Temperatures TemperaturesAttrib *temperatures = new TemperaturesAttrib(); Tango::UserDefaultAttrProp temperatures_prop; temperatures_prop.set_label("Temeratureses"); temperatures_prop.set_unit("C"); temperatures_prop.set_format("%6d"); temperatures_prop.set_description("Temperature measurements for the three poles."); temperatures->set_default_properties(temperatures_prop); temperatures->set_polling_period(30000); att_list.push_back(temperatures); // End of Automatic code generation //------------------------------------------------------------- } //+---------------------------------------------------------------------------- // // method : BiltClass::get_class_property() // // description : Read the class properties from database. // //----------------------------------------------------------------------------- void BiltClass::get_class_property() { // Initialize your default values here (if not done with POGO). //------------------------------------------------------------------ // Read class properties from database.(Automatic code generation) //------------------------------------------------------------------ // Call database and extract values //-------------------------------------------- if (Tango::Util::instance()->_UseDb==true) get_db_class()->get_property(cl_prop); Tango::DbDatum def_prop; int i = -1; // End of Automatic code generation //------------------------------------------------------------------ } //+---------------------------------------------------------------------------- // // method : BiltClass::set_default_property // // description: Set default property (class and device) for wizard. // For each property, add to wizard property name and description // If default value has been set, add it to wizard property and // store it in a DbDatum. // //----------------------------------------------------------------------------- void BiltClass::set_default_property() { string prop_name; string prop_desc; string prop_def; vector vect_data; // Set Default Class Properties // Set Default Device Properties prop_name = "IPAddress"; prop_desc = "IP Address of BILT controller.\nEach controller includes several magnets and\neach magnet includes 3 power supplies,\nfor corrections in the X, Y and Z planes.\n\n"; prop_def = "0.0.0.0"; vect_data.clear(); vect_data.push_back("0.0.0.0"); if (prop_def.length()>0) { Tango::DbDatum data(prop_name); data << vect_data ; dev_def_prop.push_back(data); add_wiz_dev_prop(prop_name, prop_desc, prop_def); } else add_wiz_dev_prop(prop_name, prop_desc); prop_name = "MagnetNumber"; prop_desc = "Magnet number from 1 to 48"; prop_def = "0"; vect_data.clear(); vect_data.push_back("0"); if (prop_def.length()>0) { Tango::DbDatum data(prop_name); data << vect_data ; dev_def_prop.push_back(data); add_wiz_dev_prop(prop_name, prop_desc, prop_def); } else add_wiz_dev_prop(prop_name, prop_desc); prop_name = "UpdatePeriod"; prop_desc = "The update period for the data reading from the power supply in milli seconds."; prop_def = "1000"; vect_data.clear(); vect_data.push_back("1000"); if (prop_def.length()>0) { Tango::DbDatum data(prop_name); data << vect_data ; dev_def_prop.push_back(data); add_wiz_dev_prop(prop_name, prop_desc, prop_def); } else add_wiz_dev_prop(prop_name, prop_desc); } //+---------------------------------------------------------------------------- // // method : BiltClass::write_class_property // // description : Set class description as property in database // //----------------------------------------------------------------------------- void BiltClass::write_class_property() { // First time, check if database used //-------------------------------------------- if (Tango::Util::_UseDb == false) return; Tango::DbData data; string classname = get_name(); string header; string::size_type start, end; // Put title Tango::DbDatum title("ProjectTitle"); string str_title("BILT multi channel power supply"); title << str_title; data.push_back(title); // Put Description Tango::DbDatum description("Description"); vector str_desc; str_desc.push_back("The BILT multi channel power supply will be used with 3 channels for the ESRF fast"); str_desc.push_back("feedback systems."); str_desc.push_back("The power supply can be controlled in 2 ways :"); str_desc.push_back("By this device server for slow or human control or"); str_desc.push_back("by the Libera Beam Position monitors for fast feedback with closed loop control."); str_desc.push_back("The devices are exported as one device per steerer magnet. Every device has three"); str_desc.push_back("channels. The channels (poles) cannot be switched on individually but have their"); str_desc.push_back("individual set points and measurement values."); description << str_desc; data.push_back(description); // put cvs or svn location string filename(classname); filename += "Class.cpp"; // Create a string with the class ID to // get the string into the binary string class_id(ClassId); // check for cvs information string src_path(CvsPath); start = src_path.find("/"); if (start!=string::npos) { end = src_path.find(filename); if (end>start) { string strloc = src_path.substr(start, end-start); // Check if specific repository start = strloc.find("/cvsroot/"); if (start!=string::npos && start>0) { string repository = strloc.substr(0, start); if (repository.find("/segfs/")!=string::npos) strloc = "ESRF:" + strloc.substr(start, strloc.length()-start); } Tango::DbDatum cvs_loc("cvs_location"); cvs_loc << strloc; data.push_back(cvs_loc); } } // check for svn information else { string src_path(SvnPath); start = src_path.find("://"); if (start!=string::npos) { end = src_path.find(filename); if (end>start) { header = "$HeadURL: "; start = header.length(); string strloc = src_path.substr(start, (end-start)); Tango::DbDatum svn_loc("svn_location"); svn_loc << strloc; data.push_back(svn_loc); } } } // Get CVS or SVN revision tag // CVS tag string tagname(TagName); header = "$Name: "; start = header.length(); string endstr(" $"); end = tagname.find(endstr); if (end!=string::npos && end>start) { string strtag = tagname.substr(start, end-start); Tango::DbDatum cvs_tag("cvs_tag"); cvs_tag << strtag; data.push_back(cvs_tag); } // SVN tag string svnpath(SvnPath); header = "$HeadURL: "; start = header.length(); end = svnpath.find(endstr); if (end!=string::npos && end>start) { string strloc = svnpath.substr(start, end-start); string tagstr ("/tags/"); start = strloc.find(tagstr); if ( start!=string::npos ) { start = start + tagstr.length(); end = strloc.find(filename); string strtag = strloc.substr(start, end-start-1); Tango::DbDatum svn_tag("svn_tag"); svn_tag << strtag; data.push_back(svn_tag); } } // Get URL location string httpServ(HttpServer); if (httpServ.length()>0) { Tango::DbDatum db_doc_url("doc_url"); db_doc_url << httpServ; data.push_back(db_doc_url); } // Put inheritance Tango::DbDatum inher_datum("InheritedFrom"); vector inheritance; inheritance.push_back("Device_4Impl"); inher_datum << inheritance; data.push_back(inher_datum); // Call database and and values //-------------------------------------------- get_db_class()->put_property(data); } } // namespace Node-path: powersupply/itest/Bilt/trunk/BiltClass.h Node-kind: file Node-action: change Text-content-length: 12817 Text-content-md5: 5a13fdc5b9df15d785afc97cd1d0e234 Content-length: 12817 //============================================================================= // // file : BiltClass.h // // description : Include for the BiltClass root class. // This class is the singleton class for // the Bilt device class. // It contains all properties and methods which the // Bilt requires only once e.g. the commands. // // project : TANGO Device Server // // $Author: meyer $ // // $Revision: 1.9 $ // $Date: 2010-06-21 07:13:05 $ // // SVN only: // $HeadURL: $ // // CVS only: // $Source: /segfs/tango/cvsroot/cppserver/machine/powersupply/SrSteerers/tango/Bilt/BiltClass.h,v $ // $Log: not supported by cvs2svn $ // Revision 1.8 2010/05/01 16:58:39 meyer // Changed alarm limits for the impedance attribute. // // Revision 1.7 2010-02-12 16:35:13 meyer // Added SetPoleCurrent command again. // // Revision 1.6 2010-02-11 16:35:27 meyer // Currents settings understand NaN values. // Deleted StePoleCurrent command. // // Revision 1.5 2010/02/10 12:27:31 meyer // Restructured Bilt class. // Acquistion is now done by a thread and only the multi channel data // gets exported. A single channel class (BiltCh) was created. // // Revision 1.4 2009/11/27 13:49:26 meyer // Modified structure! The pole is no longer a device. // The device is now a magnet with three poles. // // Revision 1.3 2009/11/26 10:46:58 meyer // Updated for libMagnet_V120 // // Revision 1.2 2009/11/06 12:46:25 meyer // Added impedance attribute and corrected fromatting of attribute values. // // Revision 1.1.1.1 2009/11/04 16:23:02 meyer // Imported using TkCVS // // // copyleft : European Synchrotron Radiation Facility // BP 220, Grenoble 38043 // FRANCE // //============================================================================= // // This file is generated by POGO // (Program Obviously used to Generate tango Object) // // (c) - Software Engineering Group - ESRF //============================================================================= #ifndef _BILTCLASS_H #define _BILTCLASS_H #include #include namespace Bilt_ns {//===================================== // Define classes for attributes //===================================== class TemperaturesAttrib: public Tango::SpectrumAttr { public: TemperaturesAttrib():SpectrumAttr("Temperatures", Tango::DEV_LONG, Tango::READ, 6) {}; ~TemperaturesAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_Temperatures(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_Temperatures_allowed(ty);} }; class LocalControlsAttrib: public Tango::SpectrumAttr { public: LocalControlsAttrib():SpectrumAttr("LocalControls", Tango::DEV_BOOLEAN, Tango::READ, 5) {}; ~LocalControlsAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_LocalControls(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_LocalControls_allowed(ty);} }; class ErrorCountersAttrib: public Tango::SpectrumAttr { public: ErrorCountersAttrib():SpectrumAttr("ErrorCounters", Tango::DEV_ULONG, Tango::READ, 3) {}; ~ErrorCountersAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_ErrorCounters(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_ErrorCounters_allowed(ty);} }; class ErrorsPerSecondAttrib: public Tango::SpectrumAttr { public: ErrorsPerSecondAttrib():SpectrumAttr("ErrorsPerSecond", Tango::DEV_ULONG, Tango::READ, 3) {}; ~ErrorsPerSecondAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_ErrorsPerSecond(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_ErrorsPerSecond_allowed(ty);} }; class FramesPerSecondAttrib: public Tango::SpectrumAttr { public: FramesPerSecondAttrib():SpectrumAttr("FramesPerSecond", Tango::DEV_ULONG, Tango::READ, 3) {}; ~FramesPerSecondAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_FramesPerSecond(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_FramesPerSecond_allowed(ty);} }; class SetCurrentsAverageAttrib: public Tango::SpectrumAttr { public: SetCurrentsAverageAttrib():SpectrumAttr("SetCurrentsAverage", Tango::DEV_DOUBLE, Tango::READ, 3) {}; ~SetCurrentsAverageAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_SetCurrentsAverage(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_SetCurrentsAverage_allowed(ty);} }; class SetCurrentsRMSAttrib: public Tango::SpectrumAttr { public: SetCurrentsRMSAttrib():SpectrumAttr("SetCurrentsRMS", Tango::DEV_DOUBLE, Tango::READ, 3) {}; ~SetCurrentsRMSAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_SetCurrentsRMS(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_SetCurrentsRMS_allowed(ty);} }; class ImpedancesAttrib: public Tango::SpectrumAttr { public: ImpedancesAttrib():SpectrumAttr("Impedances", Tango::DEV_DOUBLE, Tango::READ, 3) {}; ~ImpedancesAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_Impedances(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_Impedances_allowed(ty);} }; class VoltagesAttrib: public Tango::SpectrumAttr { public: VoltagesAttrib():SpectrumAttr("Voltages", Tango::DEV_DOUBLE, Tango::READ, 3) {}; ~VoltagesAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_Voltages(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_Voltages_allowed(ty);} }; class CurrentsAttrib: public Tango::SpectrumAttr { public: CurrentsAttrib():SpectrumAttr("Currents", Tango::DEV_DOUBLE, Tango::READ_WRITE, 3) {}; ~CurrentsAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_Currents(att);} virtual void write(Tango::DeviceImpl *dev,Tango::WAttribute &att) {(static_cast(dev))->write_Currents(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_Currents_allowed(ty);} }; //========================================= // Define classes for commands //========================================= class SetPoleCurrentCmd : public Tango::Command { public: SetPoleCurrentCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out, const char *in_desc, const char *out_desc, Tango::DispLevel level) :Command(name,in,out,in_desc,out_desc, level) {}; SetPoleCurrentCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out) :Command(name,in,out) {}; ~SetPoleCurrentCmd() {}; virtual CORBA::Any *execute (Tango::DeviceImpl *dev, const CORBA::Any &any); virtual bool is_allowed (Tango::DeviceImpl *dev, const CORBA::Any &any) {return (static_cast(dev))->is_SetPoleCurrent_allowed(any);} }; class SetpointCheckCmd : public Tango::Command { public: SetpointCheckCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out, const char *in_desc, const char *out_desc, Tango::DispLevel level) :Command(name,in,out,in_desc,out_desc, level) {}; SetpointCheckCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out) :Command(name,in,out) {}; ~SetpointCheckCmd() {}; virtual CORBA::Any *execute (Tango::DeviceImpl *dev, const CORBA::Any &any); virtual bool is_allowed (Tango::DeviceImpl *dev, const CORBA::Any &any) {return (static_cast(dev))->is_SetpointCheck_allowed(any);} }; class LocalPoleControlCmd : public Tango::Command { public: LocalPoleControlCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out, const char *in_desc, const char *out_desc, Tango::DispLevel level) :Command(name,in,out,in_desc,out_desc, level) {}; LocalPoleControlCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out) :Command(name,in,out) {}; ~LocalPoleControlCmd() {}; virtual CORBA::Any *execute (Tango::DeviceImpl *dev, const CORBA::Any &any); virtual bool is_allowed (Tango::DeviceImpl *dev, const CORBA::Any &any) {return (static_cast(dev))->is_LocalPoleControl_allowed(any);} }; class SetPoleAcCurrentCmd : public Tango::Command { public: SetPoleAcCurrentCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out, const char *in_desc, const char *out_desc, Tango::DispLevel level) :Command(name,in,out,in_desc,out_desc, level) {}; SetPoleAcCurrentCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out) :Command(name,in,out) {}; ~SetPoleAcCurrentCmd() {}; virtual CORBA::Any *execute (Tango::DeviceImpl *dev, const CORBA::Any &any); virtual bool is_allowed (Tango::DeviceImpl *dev, const CORBA::Any &any) {return (static_cast(dev))->is_SetPoleAcCurrent_allowed(any);} }; class ResetCmd : public Tango::Command { public: ResetCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out, const char *in_desc, const char *out_desc, Tango::DispLevel level) :Command(name,in,out,in_desc,out_desc, level) {}; ResetCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out) :Command(name,in,out) {}; ~ResetCmd() {}; virtual CORBA::Any *execute (Tango::DeviceImpl *dev, const CORBA::Any &any); virtual bool is_allowed (Tango::DeviceImpl *dev, const CORBA::Any &any) {return (static_cast(dev))->is_Reset_allowed(any);} }; class OffCmd : public Tango::Command { public: OffCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out, const char *in_desc, const char *out_desc, Tango::DispLevel level) :Command(name,in,out,in_desc,out_desc, level) {}; OffCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out) :Command(name,in,out) {}; ~OffCmd() {}; virtual CORBA::Any *execute (Tango::DeviceImpl *dev, const CORBA::Any &any); virtual bool is_allowed (Tango::DeviceImpl *dev, const CORBA::Any &any) {return (static_cast(dev))->is_Off_allowed(any);} }; class OnCmd : public Tango::Command { public: OnCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out, const char *in_desc, const char *out_desc, Tango::DispLevel level) :Command(name,in,out,in_desc,out_desc, level) {}; OnCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out) :Command(name,in,out) {}; ~OnCmd() {}; virtual CORBA::Any *execute (Tango::DeviceImpl *dev, const CORBA::Any &any); virtual bool is_allowed (Tango::DeviceImpl *dev, const CORBA::Any &any) {return (static_cast(dev))->is_On_allowed(any);} }; // // The BiltClass singleton definition // class #ifdef _TG_WINDOWS_ __declspec(dllexport) #endif BiltClass : public Tango::DeviceClass { public: // properties member data // add your own data members here //------------------------------------ public: Tango::DbData cl_prop; Tango::DbData cl_def_prop; Tango::DbData dev_def_prop; // Method prototypes static BiltClass *init(const char *); static BiltClass *instance(); ~BiltClass(); Tango::DbDatum get_class_property(string &); Tango::DbDatum get_default_device_property(string &); Tango::DbDatum get_default_class_property(string &); protected: BiltClass(string &); static BiltClass *_instance; void command_factory(); void get_class_property(); void attribute_factory(vector &); void write_class_property(); void set_default_property(); string get_cvstag(); string get_cvsroot(); private: void device_factory(const Tango::DevVarStringArray *); }; } // namespace Bilt_ns #endif // _BILTCLASS_H Node-path: powersupply/itest/Bilt/trunk/BiltStateMachine.cpp Node-kind: file Node-action: change Text-content-length: 9974 Text-content-md5: f0507df494323e78bb6d15a62190ba54 Content-length: 9974 static const char *RcsId = "$Id $"; //+============================================================================= // // file : BiltStateMachine.cpp // // description : C++ source for the Bilt and its alowed // methods for commands and attributes // // project : TANGO Device Server // // $Author: meyer $ // // $Revision: 1.9 $ // $Date: 2010-06-21 07:13:05 $ // // SVN only: // $HeadURL: $ // // CVS only: // $Source: /segfs/tango/cvsroot/cppserver/machine/powersupply/SrSteerers/tango/Bilt/BiltStateMachine.cpp,v $ // $Log: not supported by cvs2svn $ // Revision 1.8 2010/05/01 16:58:39 meyer // Changed alarm limits for the impedance attribute. // // Revision 1.7 2010-02-12 16:35:13 meyer // Added SetPoleCurrent command again. // // Revision 1.6 2010-02-11 16:35:27 meyer // Currents settings understand NaN values. // Deleted StePoleCurrent command. // // Revision 1.5 2010/02/10 12:27:31 meyer // Restructured Bilt class. // Acquistion is now done by a thread and only the multi channel data // gets exported. A single channel class (BiltCh) was created. // // Revision 1.4 2009/11/27 13:49:26 meyer // Modified structure! The pole is no longer a device. // The device is now a magnet with three poles. // // Revision 1.3 2009/11/26 10:46:58 meyer // Updated for libMagnet_V120 // // Revision 1.2 2009/11/06 12:46:25 meyer // Added impedance attribute and corrected fromatting of attribute values. // // Revision 1.1.1.1 2009/11/04 16:23:02 meyer // Imported using TkCVS // // // copyleft : European Synchrotron Radiation Facility // BP 220, Grenoble 38043 // FRANCE // //-============================================================================= // // This file is generated by POGO // (Program Obviously used to Generate tango Object) // // (c) - Software Engineering Group - ESRF //============================================================================= #include #include #include /*==================================================================== * This file contains the methods to allow commands and attributes * read or write execution. * * If you wand to add your own code, add it between * the "End/Re-Start of Generated Code" comments. * * If you want, you can also add your own methods. *==================================================================== */ namespace Bilt_ns { //================================================= // Attributes Allowed Methods //================================================= //+---------------------------------------------------------------------------- // // method : Bilt::is_Voltages_allowed // // description : Read/Write allowed for Voltages attribute. // //----------------------------------------------------------------------------- bool Bilt::is_Voltages_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_Impedances_allowed // // description : Read/Write allowed for Impedances attribute. // //----------------------------------------------------------------------------- bool Bilt::is_Impedances_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_SetCurrentsRMS_allowed // // description : Read/Write allowed for SetCurrentsRMS attribute. // //----------------------------------------------------------------------------- bool Bilt::is_SetCurrentsRMS_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_SetCurrentsAverage_allowed // // description : Read/Write allowed for SetCurrentsAverage attribute. // //----------------------------------------------------------------------------- bool Bilt::is_SetCurrentsAverage_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_ErrorCounters_allowed // // description : Read/Write allowed for ErrorCounters attribute. // //----------------------------------------------------------------------------- bool Bilt::is_ErrorCounters_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_LocalControls_allowed // // description : Read/Write allowed for LocalControls attribute. // //----------------------------------------------------------------------------- bool Bilt::is_LocalControls_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_Currents_allowed // // description : Read/Write allowed for Currents attribute. // //----------------------------------------------------------------------------- bool Bilt::is_Currents_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_FramesPerSecond_allowed // // description : Read/Write allowed for FramesPerSecond attribute. // //----------------------------------------------------------------------------- bool Bilt::is_FramesPerSecond_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_ErrorsPerSecond_allowed // // description : Read/Write allowed for ErrorsPerSecond attribute. // //----------------------------------------------------------------------------- bool Bilt::is_ErrorsPerSecond_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_Temperatures_allowed // // description : Read/Write allowed for Temperatures attribute. // //----------------------------------------------------------------------------- bool Bilt::is_Temperatures_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //================================================= // Commands Allowed Methods //================================================= //+---------------------------------------------------------------------------- // // method : Bilt::is_On_allowed // // description : Execution allowed for On command. // //----------------------------------------------------------------------------- bool Bilt::is_On_allowed(const CORBA::Any &any) { if (get_state() == Tango::ON || get_state() == Tango::FAULT || get_state() == Tango::ALARM || get_state() == Tango::UNKNOWN) { // End of Generated Code // Re-Start of Generated Code return false; } return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_Off_allowed // // description : Execution allowed for Off command. // //----------------------------------------------------------------------------- bool Bilt::is_Off_allowed(const CORBA::Any &any) { if (get_state() == Tango::OFF) { // End of Generated Code // Re-Start of Generated Code return false; } return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_Reset_allowed // // description : Execution allowed for Reset command. // //----------------------------------------------------------------------------- bool Bilt::is_Reset_allowed(const CORBA::Any &any) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_SetPoleAcCurrent_allowed // // description : Execution allowed for SetPoleAcCurrent command. // //----------------------------------------------------------------------------- bool Bilt::is_SetPoleAcCurrent_allowed(const CORBA::Any &any) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_LocalPoleControl_allowed // // description : Execution allowed for LocalPoleControl command. // //----------------------------------------------------------------------------- bool Bilt::is_LocalPoleControl_allowed(const CORBA::Any &any) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_SetpointCheck_allowed // // description : Execution allowed for SetpointCheck command. // //----------------------------------------------------------------------------- bool Bilt::is_SetpointCheck_allowed(const CORBA::Any &any) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_SetPoleCurrent_allowed // // description : Execution allowed for SetPoleCurrent command. // //----------------------------------------------------------------------------- bool Bilt::is_SetPoleCurrent_allowed(const CORBA::Any &any) { // End of Generated Code // Re-Start of Generated Code return true; } } // namespace Bilt_ns Node-path: powersupply/itest/Bilt/trunk/Makefile Node-kind: file Node-action: change Text-content-length: 6219 Text-content-md5: 7c08cd58191e91b708eca2e9e6d11a0a Content-length: 6219 #============================================================================= # # file : Makefile # # description : Include for the Bilt class. # # project : Makefile to generate a Tango server # # $Author: meyer $ # # $Revision: 1.12 $ # # $Log: not supported by cvs2svn $ # Revision 1.11 2010/03/19 15:27:01 meyer # Canged to version 3.2 # # Revision 1.10 2010/03/16 15:03:33 meyer # Excluded Steerer class. # # Revision 1.9 2010/03/16 14:57:56 meyer # Rlease_3_1 # # Revision 1.8 2010-02-11 16:35:27 meyer # Currents settings understand NaN values. # Deleted StePoleCurrent command. # # Revision 1.7 2010/02/10 16:22:15 meyer # Release_3_0 # # Revision 1.6 2010/02/10 12:27:31 meyer # Restructured Bilt class. # Acquistion is now done by a thread and only the multi channel data # gets exported. A single channel class (BiltCh) was created. # # Revision 1.5 2009/12/18 12:02:18 meyer # Changed version number to 2.1 # # Revision 1.4 2009/12/18 10:19:23 meyer # Using libMagnet version 130 now. # # Revision 1.3 2009/11/27 13:49:26 meyer # Modified structure! The pole is no longer a device. # The device is now a magnet with three poles. # # Revision 1.2 2009/11/26 10:46:58 meyer # Updated for libMagnet_V120 # # Revision 1.1.1.1 2009/11/04 16:23:02 meyer # Imported using TkCVS # # # copyleft : European Synchrotron Radiation Facility # BP 220, Grenoble 38043 # FRANCE # #============================================================================= # This file is generated by POGO # (Program Obviously used to Generate tango Object) # # (c) - Software Engineering Group - ESRF #============================================================================= # CLASS = Bilt MAJOR_VERS = 3 MINOR_VERS = 2 RELEASE = Release_$(MAJOR_VERS)_$(MINOR_VERS) OS = $(shell /csadmin/common/scripts/get_os) PROCESSOR = $(shell uname -p) #----------------------------------------- # Set default home directories #----------------------------------------- TANGO_HOME = /segfs/tango/release/$(BIN_DIR) CPP_SERVERS = $(TANGO_HOME)/classes ifdef no_debug DEBUG = -O else DEBUG = -g endif ifdef _solaris CC = CC BIN_DIR=$(OS)_CC AR_SL = $(CC) -mt -G VERS_OPT = -h SL_EXT = so endif ifdef linux CC = c++ CC_SHLIB = $(CC) -fPIC $(PROCESSOR)=1 ifdef x86_64 NBITS=_64 endif BIN_DIR=$(OS)$(NBITS) AR_SL = $(CC) -fPIC -shared SL_EXT = so VERS_OPT = -Wl,-soname, endif INCLUDE_DIRS = -I$(TANGO_HOME)/include -I. \ -I$(CPP_SERVERS)/include \ -I libMagnet_V140 OBJS_DIR = obj/$(BIN_DIR) LIB_DIRS = -L $(CPP_SERVERS)/lib \ -L $(TANGO_HOME)/lib \ -L libMagnet_V140 TARGET_LIB = $(CPP_SERVERS)/lib/libtgclasses.a #----------------------------------------- # Set CXXFLAGS and LFLAGS #----------------------------------------- ifdef _solaris CXXFLAGS = $(DEBUG) -mt -D_PTHREADS $(INCLUDE_DIRS) LFLAGS = $(DEBUG) $(LIB_DIRS) \ -ltango \ -llog4tango \ -lomniORB4 \ -lomniDynamic4 \ -lomnithread \ -lCOS4 \ -lpthread \ -lposix4 -lsocket -lnsl \ -ltgclasses endif ifdef linux CXXFLAGS = -g -D_REENTRANT $(INCLUDE_DIRS) LFLAGS = $(DEBUG) $(LIB_DIRS) \ -ltango \ -llog4tango \ -lomniORB4 \ -lomniDynamic4 \ -lomnithread \ -lCOS4 \ -ldl -lpthread \ -lMagnet \ -ltgclasses endif #----------------------------------------- # Set dependences #----------------------------------------- SVC_OBJS = $(OBJS_DIR)/$(CLASS).o \ $(OBJS_DIR)/$(CLASS)StateMachine.o \ $(OBJS_DIR)/$(CLASS)Class.o \ $(OBJS_DIR)/AcquisitionThread.o \ $(OBJS_DIR)/ClassFactory.o \ $(OBJS_DIR)/main.o SHLIB_OBJS = $(OBJS_DIR)/$(CLASS)Class.so.o \ $(OBJS_DIR)/$(CLASS)StateMachine.so.o \ $(OBJS_DIR)/$(CLASS).so.o \ $(OBJS_DIR)/AcquisitionThread.o SVC_INC = $(CLASS)Class.h \ $(CLASS).h \ AcquisitionThread.h $(OBJS_DIR)/%.o: %.cpp $(SVC_INC) $(CC) $(CXXFLAGS) -c $< -o $(OBJS_DIR)/$*.o $(OBJS_DIR)/%.so.o: %.cpp $(SVC_INC) $(CC_SHLIB) $(CXXFLAGS) -c $< -o $(OBJS_DIR)/$*.so.o #----------------------------------------- # Make Entry #----------------------------------------- all: $(CLASS) $(CLASS): make_obj_dir make_bin_dir $(SVC_OBJS) $(CC) $(SVC_OBJS) -o $(CLASS) $(LFLAGS) @mv $(CLASS) bin/$(BIN_DIR)/$(CLASS) shlib: make_obj_dir make_shlib_dir $(SHLIB_OBJS) $(AR_SL) -o \ shlib/$(BIN_DIR)/$(CLASS).$(SL_EXT).$(MAJOR_VERS).$(MINOR_VERS) \ $(VERS_OPT)$(CLASS).$(SL_EXT).$(MAJOR_VERS) \ $(SHLIB_OBJS) $(LFLAGS) @rm -f shlib/$(BIN_DIR)/$(CLASS).$(SL_EXT) @cd shlib/$(BIN_DIR); \ ln -s $(CLASS).$(SL_EXT).$(MAJOR_VERS).$(MINOR_VERS) $(CLASS).$(SL_EXT) clean: rm -f $(OBJS_DIR)/*.o \ $(OBJS_DIR)/*.so.o \ bin/$(BIN_DIR)/$(CLASS) \ core make_obj_dir: @mkdir -p obj @mkdir -p obj/$(BIN_DIR) make_bin_dir: @mkdir -p bin @mkdir -p bin/$(BIN_DIR) make_shlib_dir: @mkdir -p shlib @mkdir -p shlib/$(BIN_DIR) #----------------------------------------- # Install binary file #----------------------------------------- install: cp bin/$(BIN_DIR)/$(CLASS) $(CPP_SERVERS)/bin #----------------------------------------- # Update class library and header files # recompile without debug mode. #----------------------------------------- lib: clean @make no_debug=1 cp *.h $(CPP_SERVERS)/include ar ruv $(TARGET_LIB) $(OBJS_DIR)/$(CLASS).o ar ruv $(TARGET_LIB) $(OBJS_DIR)/$(CLASS)Class.o ar ruv $(TARGET_LIB) $(OBJS_DIR)/$(CLASS)StateMachine.o ar ruv $(TARGET_LIB) $(OBJS_DIR)/AcquisitionThread.o ident $(TARGET_LIB) | grep $(CLASS) #------------------------------------------------------ # Tag the CVS/SVN module corresponding to this class # copy cvs_tag or svn_tag to tag: entry #------------------------------------------------------ #svn_tag: # svn copy ../trunk ../tags/$(RELEASE) # svn commit ../tags/$(RELEASE) \ # -m "Tagging the $(RELEASE) of the $(CLASS) project." # #cvs_tag: # @cvstag "$(CLASS)-$(RELEASE)" # @make $(CLASS) # @make show_tag #show_cvs_tag: # @cvstag -d # # Only these make options work with the current Pogo version 5.3.x! tag: @cvstag "$(CLASS)-$(RELEASE)" @make $(CLASS) @make show_tag show_tag: @cvstag -d Revision-number: 46 Prop-content-length: 133 Content-length: 133 K 10 svn:author V 5 meyer K 8 svn:date V 27 2010-06-21T07:14:57.000000Z K 7 svn:log V 33 LibMagnet version 1.4 fron ITEST PROPS-END Node-path: powersupply/itest/Bilt/trunk/libMagnet_V140 Node-kind: dir Node-action: add Node-path: powersupply/itest/Bilt/trunk/libMagnet_V140/ClassMagnet.cpp Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 36147 Text-content-md5: b75c59db9f40782eb75bc1c8de5848d4 Content-length: 36157 PROPS-END // ============================================================================ // // = CONTEXT // ITest Power Supplies - C++ Interface // // = FILENAME // ClassMagnet.cpp // // = AUTHOR // Sebastien Laurent - ITEST // // = VERSION // 1.40 // // ============================================================================ // V140 // get_ctn for measurement : get 2 CTN measures per pole // V130 // idata modified : return average value of voltage and current // get_measre_current_aver and get_measure_voltage_aver added // V120 // fdata modified : RMS value // V110 // first library for BE549 // ============================================================================ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "ClassMagnet.h" #include "Exception.h" namespace itest{ //--------------------------------------------------------------------------- //#define __ITEST_DEBUG //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //---------------------------CLASSE SOCKET---------------------------------- //--------------------------------------------------------------------------- //SOCKET //Création de la socket, connexion au BILT Socket::Socket(const char *StrIP):init_device_done(false) { struct sockaddr_in adresse; int resultat,flag; struct timeval Tv; fd_set myset; #ifdef __ITEST_DEBUG std::cout<<"CREATE SOCKET"<init_device_done=true; //modif V202 07/06/07 //Set blocking // fcntl(Sockfd, F_SETFL, flag); #ifdef __ITEST_DEBUG std::cout<<"END CREATED: "<init_device_done) //modif V202 07/06/07 { std::ostringstream Desc; Desc<"<init_device_done) //modif V202 07/06/07 { std::ostringstream Desc; Desc<"<"<NumLastErr=atoi(Ptr))!=0) { std::ostringstream Desc; this->StrLastErr=strchr(Ptr,','); strcpy(&BuffLastErr[0],++this->StrLastErr); this->StrLastErr=&BuffLastErr[0]; Desc<"<StrLastErr<NumLastErr); throw e; } } //---------------------------------- char *TBilt::query(const std::string& _Str) throw (itest::ItestException) { std::ostringstream oss; oss<<_Str<NumMagnet<NumMagnet<NumMagnet<NBRPOLE) { std::ostringstream Desc; Desc<NumMagnet<Pole[Num]; } //--------------------------------------------------------------------------- //GROUPE //Allume ou éteind le groupe //Allume ou éteind l'aimant //0=OFF;1=ON //---------------------------------- void TMagnet::set_state(bool val) throw (itest::ItestException) { try{ std::ostringstream oss; oss<<":p"<Group<write(oss.str()); } catch(ItestException &e) { std::ostringstream Desc; Desc<NumMagnet<NumMagnet<Group<query(oss.str()))-1); //-1 pour avoir meme numero pour groupe et instrument } catch(ItestException &e) { std::ostringstream Desc; Desc<NumMagnet<NumMagnet<magnet=_magnet; mymdata->state=atoi(TabRes[2].c_str())-1; //-1 pour avoir state inst = state group parse_fill_idata(Tabsplit[1].c_str(), &(mymdata->idata[X]),_magnet); parse_fill_idata(Tabsplit[2].c_str(), &(mymdata->idata[Y]),_magnet); parse_fill_idata(Tabsplit[3].c_str(), &(mymdata->idata[Z]),_magnet); } //---------------------------------- void TMagnet::get_mdata(struct mdata * mymdata) throw (itest::ItestException) { try{ std::ostringstream oss; char *Ptr; oss<<":p"<Group<query(oss.str()); #ifdef __ITEST_DEBUG std::cout<<"GET_MDATA: "<NumMagnet); } catch(ItestException &e) { std::ostringstream Desc; Desc<NumMagnet<NumMagnet<Group<Group<write(oss.str()); } catch(ItestException &e) { std::ostringstream Desc; Desc<NumMagnet<NumMagnet<Pole[i]->set_switch(val); } catch(ItestException &e) { std::ostringstream Desc; Desc<query(oss.str())); #ifdef __ITEST_DEBUG std::cout<<"BOUCLE ERR"<NumMagnet<NumMagnet<query(oss.str()); return Ptr; } catch(ItestException &e) { std::ostringstream Desc; Desc<NumMagnet<NumMagnet<Inst<query(oss.str()))); } catch(ItestException &e) { std::ostringstream Desc; Desc<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<Inst<query(oss.str()); return atof(Ptr); } catch(ItestException &e) { std::ostringstream Desc; Desc<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<Inst<query(oss.str()); return atof(Ptr); } catch(ItestException &e) { std::ostringstream Desc; Desc<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<Inst<query(oss.str()); return atof(Ptr); } catch(ItestException &e) { std::ostringstream Desc; Desc<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<Inst<query(oss.str()); return atof(Ptr); } catch(ItestException &e) { std::ostringstream Desc; Desc<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<magnet=_magnet; int var=atoi(TabRes[0].c_str()+1); myidata->pole=(var>5?(var-7):(var-1))/2; myidata->state=atoi(TabRes[1].c_str()); myidata->fail=TabRes[2]; myidata->measvolt=atof(TabRes[3].c_str()); myidata->meascurr=atof(TabRes[4].c_str()); } //--------------------------------------------------------------------------- //INSTRUMENT BE549 //Lecture de idata : NoModule,State,Fail,MeasU,MeasI //State : 0=OFF,1=ON,2=WARNING,3=ALARM //Lecture de l'état et des paramètres de l'alimentation du pole void TPole::get_idata(struct idata *myidata) throw (itest::ItestException) { try{ std::ostringstream oss; char *Ptr; oss<<":i"<Inst<query(oss.str()); #ifdef __ITEST_DEBUG std::cout<<"GET_IADATA: "<NumMagnet); } catch(ItestException &e) { std::ostringstream Desc; Desc<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<Inst<query(oss.str()); return atoi(Ptr); } catch(ItestException &e) { std::ostringstream Desc; Desc<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<Inst<query(oss.str()); return atof(Ptr); } catch(ItestException &e) { std::ostringstream Desc; Desc<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<Inst<query(oss.str()); return atoi(Ptr); } catch(ItestException &e) { std::ostringstream Desc; Desc<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<Inst<query(oss.str()); return Ptr; } catch(ItestException &e) { std::ostringstream Desc; Desc<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<Inst<write(oss.str()); } catch(ItestException &e) { std::ostringstream Desc; Desc<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<Inst<write(oss.str()); } catch(ItestException &e) { std::ostringstream Desc; Desc<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<Inst<write(oss.str()); } catch(ItestException &e) { std::ostringstream Desc; Desc<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<Inst<query(oss.str()); #ifdef __ITEST_DEBUG std::cout<<"GET_FDATA: "<nbrframe_sec=atoi(data.substr(start,end-start).c_str()); break; case ERRSEC: mydata->nbrferr_sec=atoi(data.substr(start,end-start).c_str()); break; case RMS: mydata->rms_ac_sett_sec=atof(data.substr(start,end-start).c_str()); break; case AVERAGES: mydata->average_sett_sec=atof(data.substr(start,end-start).c_str()); break; default : break; } start=i+1; i++;} mydata->nbrferr=atoi(data.substr(start,end-start).c_str()); } catch(ItestException &e) { std::ostringstream Desc; Desc<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<Inst<write(oss.str()); } catch(ItestException &e) { std::ostringstream Desc; Desc<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<Inst<query(oss.str()); *ctn1=(int)(atof(Ptr)+0.5); *ctn2=(int)(atof(strchr(Ptr,';')+1)+0.5); } catch(ItestException &e) { std::ostringstream Desc; Desc<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"< #include "Exception.h" namespace itest{ #define MAGNET1 #define MAGNET2 #define NBRPOLE 3 #define INST_MAGN1_POLE_X 1 //Instrument du pole X de l'aimant 1 #define INST_MAGN2_POLE_X 7 //Instrument du pole X de l'aimant 2 #define P1 1 //groupe de BILT de l'aimant 1 #define P2 2 //groupe de BILT de l'aimant 2 #define BUFFSIZE 130 //taille buffer de caractère de réception #define SOCK_PORT 5025 //Port de communication socket #define MAXTIME_CONNECT_READ 10 //temps max d'attente pour une connexion et une lecture sur BILT modif V201 #define X 0 #define Y 1 #define Z 2 #define CONF 0 #define RS485 1 #define MAGNET_OFF 0 #define MAGNET_ON 1 #define Q_SYSTERR ":syst:err?" #define Q_MCURRAVER ";:meas:curr:aver?" //modif V130 #define Q_MVOLTAVER ";:meas:volt:aver?" //modif V130 #define Q_MCURR ";:meas:curr?" #define Q_MVOLT ";:meas:volt?" #define Q_IDATA ";:idata?" #define Q_MDATA ";:mdata?" #define Q_SWITCH ";:switch?" #define Q_CURR_DC ";:curr:dc?" #define Q_FAIL ";:lim:fail?" #define Q_FAILSTR ";:lim:fail:str?" #define Q_STAT ":stat?" #define SWITCH ";:switch " #define CURR_DC ";:curr:dc " #define CURR_AC ";:curr:ac " #define STAT ":stat " #define STATCLEAR ":stat:clear" #define SYSTVERS ":syst:vers?" //comptage #define Q_FDATA ";:fdata?" #define FRST ";:frst" //test #define Q_CTN ";:test:temp1?;:test:temp2?" //modif V140 //--------------------------------------------------------------------------- #define ITEST_EXCEPT_TRY_STR "ItestException exception caught while trying " #define ITEST_EXCEPT_MAGN_STR "ItestException exception caught on magnet" #define UNKNOW_EXCEPT_MAGN_STR "Unknown exception caugth on magnet" #define SOCK_ERROR_STR "Socket error" #define CONNECT_FAILED_STR "Connection failed" //--------------------------------------------------------------------------- class Socket{ private: int Sockfd; char R_Buff[BUFFSIZE]; bool init_device_done; //modif V202 07/06/07 pas d'exception dans constructeur mais dans fonctions membres protected: public: Socket(const char *StrIP); ~Socket(void); char *query(const std::string& Str); void write(const std::string& Str); }; //---------------------------------- class TBilt : private Socket //public Socket modif V202 05/06/07 { private: char BuffLastErr[50]; int NumLastErr; const char *StrLastErr; //modif V202 07/06/07 passage en private protected: public: TBilt(const char *StrIP); ~TBilt(void); void write(const std::string& _Str) throw (itest::ItestException); char *query(const std::string& _Str) throw (itest::ItestException); //ajout de const modif V202 05/06/07 }; //---------------------------------- class TPole{ private: // int Group; int Inst; int *PtrSock; char *Ptr_R_Buff; int NumMagnet; int Pole; TBilt *Bilt; public: TPole(TBilt *_Bilt, int _NumMagnet, int _Pole); double get_measure_current_aver(void) throw (itest::ItestException); //modif V130 double get_measure_voltage_aver(void) throw (itest::ItestException); //modif V130 double get_measure_current(void) throw (itest::ItestException); double get_measure_voltage(void) throw (itest::ItestException); void get_idata(struct idata *) throw (itest::ItestException); int get_switch(void) throw (itest::ItestException); double get_current_DC(void) throw (itest::ItestException); int get_state(void) throw (itest::ItestException); int get_num_alarm(void) throw (itest::ItestException); const char * get_str_alarm(void) throw (itest::ItestException); void set_current_DC(double ValF) throw (itest::ItestException); void set_current_AC(double ValF) throw (itest::ItestException); void set_switch(bool val) throw (itest::ItestException); // void clear_alarm(void) throw (itest::ItestException); //taux de comptage void get_fdata(struct fdata *) throw (itest::ItestException); void clear_ferrors(void) throw (itest::ItestException); //test ctn modif V140 void get_ctn(int *ctn1,int *ctn2) throw (itest::ItestException); }; //---------------------------------- class TMagnet { protected: private: int Group; char StrAddrIp[20]; TBilt *Bilt; TPole *Pole[NBRPOLE]; int NumMagnet; //passe en private modif V202 05/06/07 const char *AddrIP; //passe en private modif V202 05/06/07 public: TMagnet(const char *_AddrIp,int NumMagnet) throw (itest::ItestException); ~TMagnet(void); TMagnet(const TMagnet & Magn) throw (itest::ItestException); TMagnet & operator=(const TMagnet & Magn) throw (itest::ItestException); //modif V201 07/03/07 int num_magnet(void){return NumMagnet;} //modif V202 05/06/07 const char *addrIP_magnet(void){return AddrIP;} //modif V202 05/06/07 TPole & pole(int Num); void clear_all_err(void) throw (itest::ItestException); void clear_alarm(void) throw (itest::ItestException); void set_switch(bool val) throw (itest::ItestException); void set_state(bool val) throw (itest::ItestException); void get_mdata(struct mdata *) throw (itest::ItestException); int get_state(void) throw (itest::ItestException); const char * get_bilt_vers(void) throw (itest::ItestException); }; //--------------------------------------------------------------------------- //Structure de données de idata struct idata{ int magnet; int pole; int state; std::string fail; double measvolt; double meascurr; }; //--------------------------------------------------------------------------- //Structure de données de Mdata struct mdata{ int magnet; int state; struct idata idata[NBRPOLE]; }; //--------------------------------------------------------------------------- //Structure de données de Fdata struct fdata{ unsigned int nbrframe_sec; unsigned int nbrferr_sec; double rms_ac_sett_sec; double average_sett_sec; unsigned int nbrferr; }; //--------------------------------------------------------------------------- } //end namespace //--------------------------------------------------------------------------- #endif //_ITEST_CLASSMAGNET_H_ Node-path: powersupply/itest/Bilt/trunk/libMagnet_V140/Exception.h Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 4255 Text-content-md5: 216d054c131bc191accef25995d29271 Content-length: 4265 PROPS-END // ============================================================================ // // = CONTEXT // ITest Power Supplies - C++ Interface - Error & Exception Classes // // = FILENAME // Exception.h // // = AUTHOR // Nicolas Leclercq - SOLEIL // // ============================================================================ #ifndef _ITEST_EXCEPTION_H_ #define _ITEST_EXCEPTION_H_ // ============================================================================ // DEPENDENCIES // ============================================================================ #include #include namespace itest { // ============================================================================ // Error severity // ============================================================================ typedef enum { WARN, ERR, PANIC } ErrorSeverity; // ============================================================================ // Error abstraction class // ============================================================================ class Error { public: /** * Initialization. */ Error (void); /** * Initialization. */ Error (const char *reason, const char *desc, const char *origin, int severity = itest::ERR, int err_code = -1); /** * Initialization. */ Error (const std::string& reason, const std::string& desc, const std::string& origin, int severity = itest::ERR, int err_code = -1); /** * Copy constructor. */ Error (const Error& src); /** * Error details: code */ virtual ~Error (void); /** * operator= */ Error& operator= (const Error& _src); /** * Error details: reason */ std::string reason; /** * Error details: description */ std::string desc; /** * Error details: origin */ std::string origin; /** * Error details: severity */ int severity; /** * Error details: code */ int code; }; // ============================================================================ // Error list // ============================================================================ typedef std::vector ErrorList; // ============================================================================ // Exception class // ============================================================================ class ItestException { public: /** * Default constructor */ ItestException (void); /** * Constructor */ ItestException (const char *reason, const char *desc, const char *origin, int severity = itest::ERR, int err_code = -1); /** * Constructor */ ItestException (const std::string& reason, const std::string& desc, const std::string& origin, int severity = itest::ERR, int err_code = -1); /** * Constructor */ ItestException (const Error& error); /** * Constructor */ ItestException (const ErrorList& errors); /** * Copy constructor */ ItestException (const ItestException& src); /** * operator= */ ItestException& operator= (const ItestException& _src); /** * Destructor */ virtual ~ItestException (void); /** * Push the specified error into the errors list. */ void push_error (const char *reason, const char *desc, const char *origin, int severity = itest::ERR, int err_code = -1); /** * Push the specified error into the errors list. */ void push_error (const std::string& reason, const std::string& desc, const std::string& origin, int severity = itest::ERR, int err_code = -1); /** * Push the specified error into the errors list. */ void push_error (const Error& error); /** * The errors list */ ErrorList errors; }; } // namespace itest #endif // _ITEST_EXCEPTION_H_ Node-path: powersupply/itest/Bilt/trunk/libMagnet_V140/Manuel_esrf_bibliothequeC++_itest_ed5.pdf Node-kind: file Node-action: add Prop-content-length: 36 Text-content-length: 322469 Text-content-md5: 1b82afaf368072eb7848539d5b4912b0 Content-length: 322505 K 14 svn:executable V 1 * PROPS-END %PDF-1.3 %Çì¢ 5 0 obj <> stream xœí]˒ݶÝ߯àÎr\C ’ËÈQ\Nœ*Kšr²PUJÑÖ4ÆŽÿ6•M¤}> |_àöÙäÜ]iÚ*»tf£»4@ð,Q©6‰jþ yòzs¶¹}¿JžŸoΫLÕÂÖižXSÖÿuº¨RW4Eoß×*ùÓéæÞF¥¶*“à¿É_!úK-·L³æŸV´ÿ÷'¯“;ÇT›h•*“?«eTUåT§žNŒÕ©qIQê4/“ã×›[ûúøçM-ÅfYSèøéæÖ£ÊÓܘyÓ ®n¥±¶‡.:H¹Zdtõœ­‹õЫ2iáôP(!ÈÓ^xi¬ %yÐj½èÒhWœV{L›ò’S:üÅA‹¤Vb;ã¹~ÆkØoáW©sÛO×(]å[ ª}•n;㵬6  rÒºU™™`~·5dTàu›æªfVþ 4' ÔÒÕ]æ\¼âcòÀ—½(£«*Z<ï%…N©õÞ÷”©5¨ð‚Hÿ@Û|Ƶz™*›™<ÞâvF¬¡Ê¼æ›^”Q#!gwÕ<+5•NŽŒJ‹Kùì U÷´ƒ*[SÑzÝJÏk‹MA¥+gU°R‚žõ<t!œ¢x{Ô¡´A·÷ˆR¶œ “°‰ÀáïzÓoW@‡R<¯w·jHCæ¹û-±+ðÚ}è;VP€ŽÅ ëóíè=Tü3x=¡jKåyû]$ÈZáyqò€VlW?ºž_Ë|ß®~ŽtYëQÏZ[WÞ¡_v²F«„ð¯h)^‡˜þ¶¡2ŒÛø<£…@—çEʯT-Ú!€ÃÏ;HSf;žóiЭ4­—ÒR––R?x¹Ñ…RI®U•6ó¾3Íj·h&þzªw²yÆ FE“V¹k(C^Ø&€^÷sI¸?݆F0^ia35„ÙÛÁpº È–M­ÕEáG Jzø‰ƒÇT(5¤¼ Q$ ;áÎèr'3bªv–Ã^½SªÔsjªÁjZè„¢Päd §¢ Û’DüNïPg\VËJ]ì¬Rü¦XÚàj Ì{›³-tb‹B5××u˜fM v^mWv@W~øõbó÷äÍÆ$¿ÕAþ—úߟ»` ±-Œ'®•ïùZ%j؆媚z Àðä± W•æÑá  ÉTS²ÄÖ³XÓ· é¦z÷€m‰úÁÿ­mËbÒ·^y€õ¬=þbZÛ–yhíصöVÞ¸[=FÀ†Öf«Òc«IoíMÂà³… <Òÿ®—tž1Æ_KC¯ÿíLA4p¦ 4è\ÎcDxîÑS±_ÁNôš=gÛa÷cà+l…V¾£ºŸ—† óШ¬ŠœŒ;#€o‡¾8ßm ú?µÃ(´òuØÚ¡ý¹µC_œoLt؇UÙ„)rPweSS•f]>á§nÞ÷óð`êê·ü͇óòw b;<á”ó†NLdŠÛGƒ¤š»yžkŸ­}¥@=Ò–žY9“©,TÀ—ô„Îà½Ñ­Ñc6ª'nZ™Qy mÀ}ÀWÀ1Æó*¾¥QŒíêFD„#`-†Bª[>Õ (‹äHדWL Ä÷gß÷ézæAWÍß.µÔœ%5gK’ë½Øæ€AÀd ÔmLºpX̓5W3x—ÝÆäq·,ʬ ÷¨[ø–e–ça©W[‹ä¾MÝäQÂRO©¬úÄs Y]òΦf›@Ú¿ïì™ÕÜɯú²>Њï:k윪Ýdf¼Ôxhq—7;ÂŽ‹ÁJº{N“ÈûC©ïºG»Ú¼ƒÎ·-Vao¨¬¾”©Ã<Gl#Ú©Ê<µÊ„iöî @0´„Ð{ }¤²ÎÇÅï iJ›(@ $@ t…Óãá¥Cƒ>#U¯jÍGÖéz%QÕ+ä,-[œGœËyôú ÒkÀ’Ûåaȸ_Pñ,¹^¹ïœ0ôy9*^t¥*»s.¶;µYÄŃf·K¨ª^ãdEpNgV °öç:=®x{KÔ…l\­WT:€@ŃQH › ÚL*Ð …nx`îAZJäÐl@ÕNiƒž³Ú´¥Nh© I+ …H H Ë@‡ Ã§[«ígf´õCi6 aªnxÚ›’EÀÀþE+Ômš‚'íwÝ¿ŒÝ¼T1p¹þ¥KçL1”ºMUø¾BN*†# ¥®†À¿ ºÊdݡڽˆ§{+gÆc\Õ«H :H’=I+\ªu>MÒxi¾Ëѯ™}ÏG´TO; «Ç«‹èaJ@È€@SÀÑx[€¶ Øl7{ou˜¿K<»r{4»»?BÕmI'Pd^À8 'úðë^1¥'(º@ $@Ÿ˜ÖɸaÐ wG›¦ãåý¥aÍ;¡2^ ÙÞöü‡—¥é-@¯âDÓWbÑôߊMk÷ †'H èÊ¡+”~hÔó:ØèÊ4(`™`ÇH{ÂýMþ–sì}ø»OóR©«=^%wÛ$@Ý\èÐx†@Â*÷Ë*W2—²‹¿«°üôúA0T^Ö³¯Éu\üeo_\nƒ\H h?Ðõв/“òîÁ¹ß@az¼–>aHÒõ¼âwÅ©ÊåwòY ¾ï7k¯}nñ_îõ]x«áÌg±mDH ˆB73A§6Ãv¼ŒwÙËw &èxDàó&N€ÿ<ë*Îðʼn“Šž%x×H_Ó½'BœH /:„)^ ½@_¬kík¡}Ò>ÞûÇ’Ž“tÜnE`{ïíóÔ&ˆB`hÞ«M¼Óà›"œ?=thù@ ³¹6fÃ{3ö&$´ÝùH…ÿDÞ$yé;_ä^DH bB‡ ÃU¬Ëâl‘sCJÁâ[?5Ð,Y)°wÇ»Ôm‚ýLÓ9r `[@øêLÌÄÇP½ƹu¡²| ÃkÃ&3ùäå*\H :¼<’@’”ÜhfûÖ*f–,.ŹÈyõ·í¡*ñààï¦<ùh‰@ $@ ´/èÐxàbè‹kÐ#¾}_‰6Éñ3[Ú¶HÏqý„Þ#*(þž‚s¦ÈâÛ,HG†7‚ì>½¡ª%€ª‹ÞXQõß,«ö' œ2…ã}•”æg;ÄÏp>ÙìÒ˜b÷ȃ!šÎ¼+TÑ.«´ªiõ¢6ã¬>ŠÁ2=‚ œ }·ÉÏÔR­x‡N¢¿Æ}±{®’û5`?˜{Vß”Níì7qc¼ç|Þ ±`»% ˆÑVû§u@ŒðÌÅ Áø[¼qæûR<ŸMWŒO-ÀA`léwºÀ‡Ëy£±s=aÖe–yÙ¤E'–+gUð}†fü*9ã—×gbÊͶ |Z Xhµãxƒ(hãħµèg¾ Aƒ€½x“á a„óÝ,(t<Ãèï°ò\Ë›Oè¼,lsA›xÙé±Ô®ˆ‹Ÿ³ˆ[Þçýs§Ë"þDàXÐ@«MŒ³ÿÑ@á9†¸q|Ÿ Šõÿ‰Ž~XRÅ'ÈÖv§]oåð=‘þC×BÕŒ¡rL«ñFß)æ{#¼éŒë`ÚzÅ_¤j*.b A{ú™Ée©ÑÞÄT V?Ž%f&Æ¿§ìB ›y¼/#ñÆâoigäÀ-uñÚ¬µâÊï`Ú8&·fj(\Ý…Ni<Lõ¼¥oä1´ÿ9:#€ Çë<÷Eƒ——ïzÞË­ª×Œª> stream xœí[“%¹qßïó)ú”è9 d&n~3%Z±2±äŒ#d‡"˽Ó3{_™ú¶ ?qßõ ê‚ü'ÎéêÞî¥H‘$÷ (~¸d¢è¯îÜÅÓkÿlÿòÁÛ_½øêN•å·Ät wB¹þoô©\bj:ïü†òÝßñâ×/ÜEJ¾Sÿ{÷ß§©ÿ§–›/Üþ³=þûoï~þº–êåλ‹£»××2J)Ñõzù;¡x—²¿„|÷ú틟þêo^ÿîE-E˜›Òë_üôý–.hKù¼¥Äúz$²&}ד\¬E®Iõ|QªÚšô¦%Ñ%E¿)Ý™”×Â3IÔ% 5°ÙÖ¢3y½â6Ûoí«|vFiò¸-Ÿó.­I_،߶$¾°ó¼ÿ©}ã?šªe•¶6wÄåz›Ûwþ»–’.ä(oEý¬çË™X ‰ˆ¯7Ÿm«Éûmøòñ6ߨ¤-cô|½ê_ÚýÂö¼ï¬Ö×½ôâ|ºô¡íŸ?é)â\Ùòý¢—^GQä5éUOJDqCÿÛÈÿ­%mã1ìÃ1,#yޱN 2Ç9@¯n\¶—[Çc…²n‚1é#›q}ß"ÞoZÿÛjM2~c“––‹Ë>nI÷F—ìåz鿵5ýÌVk¢5©ü$ã6ã·¦ZŸžj­¯ÛÌë€ ‘]½‹ÆëI“æú¬WÞ9Oþêûœ#¶æ â…D¢%ÓVÑЕR¤}Ô_®³8ò}x•ÎX«m¤fï£NKÖ3g4I ±Çd|ÊÚ¿¤X’:'¾ôÔŒ“&po°IïØ^ç,òkuUü±ÖD]Ö˜ô£A!ÿ§…¢µÞë¢DÚ”Þ·móIWâHL¤I Ž$«õŽ­ƒ·—Œ¿x}÷ëþ®ýÓìÑíßÎÚ uÎâ·Ù ¡®›uÍsù» z×’à|–±F¹¾ GµzËEÄç à?´¤Ú³ƒ„-éûž1gÞ×êe±,—,âHkŽ6±£FZë­Äg6éÛÞž,´ƒ˜<ñ›nTcËÓÐLk+¥ú3ßÅTQŽVêæ’X‹a’Ô$<׊”xlK­õ_{£pPM"•’/[Ã}`Ëú´¯uL<6ˆ.üÛÕT ¿¿ýG¶¤Iᓌßáó&Õœ>yå·K÷q5çn5¾ª ßÛvŸTbÒ“z½YµªùtRí=jI®î¢[»ÊK}í±Îëå’d´9JfJ#šÅ_Ø Œ÷®¹¹_Y­ïlÒG6ã0¥noós[‰Ï®¾ é!:iRü¶_ت~ÞµŠL° ë…­.T„toQC¾IE£­Õ¹Öš4s°e‰M*6i \ôt£|ªªïÛ¶™ôÜI—Ûg_Nåú;~n+1é“Î;ÑšTâ\'ùÆŽáIK|yjPmÎÑ0kœkÕsM¸f¬+îÑÜÓ„“JüóO{Z‰~_3'Mñ‘}äﯴᑓÉdÒ†D“6©Ä?ÿ­þe]ZÃ]9VÖÌÛÒ*ͩꗴ¬¬ÿ©kW³…¸Öþ;»P^ë^z¦ÿØv‰ ìO®ÎÆcY_Û÷þUþcË<`p,ÛéÆœ°öËÅ=¬ß_/:éÚú©µ®¯Ÿ÷dœ¼Ð‡¶¡b‹Ÿà8×^ÛtOL[Yïö>‘Äï»M¿´‹Âk›ô_ZÒK¢jTä¥ù"ײO \_['3ü°ÔMŠÚ¦Š£e¯Ooÿs'uŸôêÍÞsyß8œtásx'VÍÄ8¹6æ³ÀPÖ¹eÒ“ªNÌšIÆÉìt®“×~Êwœ$ë_ÙŒ´ÛøF+C×ë_lÒ¤“–˜Ôk2;=z€>`á™.ÃȾ±î ›£×ßÿ@ëÎÌú´žrÝùÞ>qÒ½¾¶Zð¾{YëqKñ/E¸íÖu‡/ùž©{Ìý]îìò1¥“åœsó®Í81&'àÖJ„ès‚–Í>Þ˜Z'Í8)þËSÝdxhÍd8L2NúÅugÌ8¹B“¤Içü­-þºÝÿ\öã™ÉœdÜ ã‹å¤UÏùÓ“xR¯ëFÌ=öÃd’ùÔfü×;ÀM3pbœsºÿâóI—ø¢?qô¦¯Mæ÷®­“•îÑãå¡ÉkßèÐCÒ¤%nÏ{×g¯™"ƒísÃŒlŸk‹Ð°…ÿRBº´/9/Ù_rÛêáûötuÀþß·Ÿ º/°ðOzE*7ö'5ÿ¡»ö&ãK/TôÖ'­Nú£ûŸj _bkL>kL²MZôëç÷&LZë÷§šùê³2»µ~Ù&tïuqSä[Ò»6i’qR…o®¬Nºÿ­ý=;_°¬¡ýÜÖ~R/CøuŸ‰Ž/Dä|Z<~!š|nx׎ÓyÑcÂdöŸà¼±=¼îíT?ñD'»éçì³ÉÞódãÿ\Y“MëÉk?ÚxÝšyèíÛ'½aÃð=ÛÕÞ1ëÙ„ê–o˜^®méÕòúÚ8&]Ûºï“Û¹Ò'I“/'þò‡S|¼-ÞJš”õ«Õæ¾<ÿÖfœt¸s¶Ø¹lçøOFйÅﺽyÏ—æÉkŸÛYùý©wœôœµ÷Ž>Õ|ö{?€M>ÞøD}» gµ&M8é&ç¾ò¯Ñ¯Þ¹=ˆõ¶q&õZ>R¿¬¯s¡ þо؟¦ÍÈùœ|j§ùácËú¹ç¾ØÞG·Ã ®õ]ÖÄá›4—­üžáä¥MpÃM<ãqÞóá÷Üpý•î½N´ÎÕëܨ½YrïÆÄ¤ÿzµ%&›¯×¬=îÞp}Ú¾çcÔµø]¯!=ŽÛ›»“ˆšÉºM6i’ñj@…nüF'VV]ÖdxLFßd¶<·w4é“)îÛIoš4Τ%&Ããö‚sßóK©ÎzÌã—õ¨ÇhqOBí&vùÄ ï±*:m™—H[w‘v†¬´WiQ¶þî³$¡Ü‰Ë5=ݽ}‘ª+·ýzÓý—øúzøs×U½yññß¾ »ÿ[ñõ¿¿{¶Ç¼zQ\;úr®hï(6e“°ëëÒ–×xÞ¼zá[PôQ¼ÉaËñæç¡>·¼Àó> ¾@ º…0—£3?e]Xg}À«äbÖåC]`û¦ÚkK8:©.°†gH}ÉãlSh,è> ³&ÿzÒy¿?‰pÖD߬å¥àƒÜhˆNv‰YÞï&y¿ž´KHSCn1ЏÎíà·P¶_oÀ^©kùy誂ÖÙþyŠ®S¤¯óÆQòj…ÖN!˜fׄ!ËXd7žý!Ÿë'1àµÈK®m™Úþü2×ûëV;‹*ôvRCó"2K²èB{Ûý(zšö í+ÆØ~t½ý‚dýZ¦Žæ-bð³„!‹.´·ßò §i¿¼BÚ¯·_ A¿–©£y‹¬œ¶åç ® ìm÷ìy’v#—.ªÙäúí«7ªö{Q5Z¬% C]hŸ±”=MóÕa«»]¼Þ~œ~-SGó’êºÀÞvÏþ§i·:\U³¥ëÍò¸~cõ òÆ1ë C†±¸ÞdÏú€'i.n£T­ùz{¥’Æ×1õ3o€;:kÂe,²·Ù³?äiÚ­Z%!íV®¯ %ÊðJ8ûê¹ÙN@8E©âúŠð¬xšaÉmowl¯pµ½Ø9½ÀY¢Èœ½wøóP‡û.dz?äiúY=] …˜·d‹ö8^k ïÃõÿàç <Õ[ðÙ š–kw½Ñ=MwÝ•h1Æ·ƒ Ãëü9(Eõ¦{¶ÂŸ¤éÄÉEîëu‹qc‡®È…rÛlÿ÷-º¿îi=ÏžÖÿÜö´¤]HÓ6ÿºÕøïËÿÚ°”jß½ä‹+÷rË|—Ù;WV!Fw–ÕøìO&\>ŸèÍúÓYVôL¬êêžòú]Ýž/íäÁ0£Ã$ Sxbퟯ C†±¸¾d<ëžfÙ rá{Vë{'ÕÜëüöªCt|kê6üýÝÍ»xö‡¼jËw¿žy—ÀŒì G‘ <ø9šJQ¿Äó>ài>бH»VS µÍÇû–ÿ¿Îgšùl7 \ \hkÏpZá©m‚«¬üiV?¶ð\¬m',3'çX›íÎs‹b_f€šyHx³'äDë'Êb~êºÀ6œùWnºŸê;ÞU§î’ûJðûJ°ßž¼^ÜnêTÁbáBDNX÷˜Å±­µÒÒ„Ë%†;u²IÛ]Kãß3ÅÏ2^ÿºÈ-2ÅG7Ëè–ðfOH´&H‹ƒÃŸ‡úX\ŸëŸõO´ìK›ã}iÛ özf*‘ê8Ùô>‚vóä6<¾Ý郊º¬ïlYKÌw®}‚‚p'ÊÕžãåú“5Zn\Ü•²Ç³bc]‡ÂXõ&óîzsµ¯úRÖ‘N¡,¸×„7[Qôj蛄#‹*rÝ {î‡<ÍŽNû"X§•à¶»_÷æ¯_XO RÞ¯S}Ï*½c¾k©¼wϰ— £rMxc‡) ÃþóP‹†ýs=àI‡}öÿ0ì'w8>~Ø—<ì`ÿšðÆvÞêcqC{®çmŸ›”»R»^g1ÏÒ§öŸoÖŸ9ùÍSvÅüÜ•UQ?Ø¢$w‹’þ4¥¬E9Ëx#^ÍgYFbÚc¡—†-áÍž ekê°ü›°gB×XˆãAOóñ¸ÝèáëÃ<©©`èÅ“Qø°©`(ë;[Ö6dü[ £Òd:š<ð!'™ôŸ¼ö¤°}Œ9¯/5²ê[‹}Kˆ°›„£cèBU‡{Þ=i‡kªé/ Ã»fúd‡›ö¸=ôƒò–°›„è¡ì C‡{Þ=i‡«>tù èp4lnw¸[VÌ´ÃQX>vÛZ·ì~•²ÛZ_MÌÕåuÜv—w ~&¢ö×,ë¹%Ÿ/‡IT‹ñÞ÷„¼…æE£0oÁ6*Ë iyÖ¶shõ-T6kšÛ).ò”6k=–ªÎyÛÏ÷½®‰voüPß¾Å}ÿ¯= ,½ºD¿!eIØöT†50‹¨«”-4ËI)´Õ’RX}þõÓJÎÃ[Pâ2@PÊk´Ü:Ô¶ZRl9öPhå¥È02UÙ·G†µ€Ê¬TÚ¹c ×Ú¨§ÐùÕæ¹§–AÒ^˶¥æ÷~’ÂR-dͰÕs}0ï5u}ãk­™\o~öº–S5•Êt­)U`Áí]<Öö „KkW_{¦pß]ÜvšÛ|V«Žž¹nD„¼v-‰}J Ûç¥vS¬oGï\„|<†JÙvü:‡­‹s¯\Ù*YÖÚ.Çàkm['.$XÛ^MðŠ‹ïÕóÛ“u–kõuc¯©µm0¾Ü¬kPÆP­ëÒu ë*D{]kC†?WAËŸÀa'ºQÏv#ÖXÏÐæ/[–­çt?’BFX›zÖ„cšÌ´W³oš„=‹*òØ|Ö‡<å~$×®Âô§Ý\Þn}û·¶}Öv%ªö1 C ŽETžó!O™+Í”â:dÿjÄ€`ýk†Õá/›—>¹šhb\M’&FÒÄÖ±uø™í?;L‰‹•I»e!†„~¢¹ï¹:Ë_¹Õ:}:tÚ¢=jpÛc;äœÈÛ*1ÈC¹ˆ’/¶—ÖðE×—ø¥CË×£A§¶”ÑItÚ’§4$)9c •Ç(÷^ËëÔ7Ê}ŽXŸ€‹†‹Àųáâ ¸x\¼S\ª1«åíkÿ(ÀÅÅʼnáâ¸8o¸ô æC§¶rñ%{Љ4BRrÁ˜•œ<ÈÝÈ¥.`ÈÅ笹,¦+êD:‚\|æ:$ áIÉæâS¹ø”"È£(y@.ÕâÕ\ªñ„\|òÀ%9Ã%àp‰Qq‰KÅ%2p‰^qiŸŸ „P€KȆKHÀ%Ã%p \).Á—ö7¼¹dà"IqYÍX¥!ÀEØp.â qÀ…3pᤸ´¿[¨åAq©F+ÈIqao¸°.T ÊÀ…¢áR½ÐàB¬¸—¶é>È›Q£äíSŽòd¸ÔN¦ëPY.µ^FÇW€‹ËŠ‹KP‚‹Š‹ ÀűââÈpq¸8‡\JÑXJB*%j(%h&Eô‹ÖLŠ‘§‰ä2Éyä¨qä€4²h™‘EµÂ´†Ó$Ú‰®CšÔä¿ÈÓ"EÍ!Ɉ!1RH¤!$ ’Ó bF1i1j1ŒÃ¢úŸZJ#è5èF¡ègï¿w'}KÙÜÀõw»Û+ ®½Oilîö¡ÁYk‡qõ¾·ßI ¼…5l¿K Ù"۶߇[¼¥pPõÍ=?4BÑGûm)™µF  \Rõ¾@=ÚV£ÒF´FD.!k.¡ — \i´Ý&Ð ÍeßÐ84‚æR;$Ô£uY¥‘‘KršKòÈ%‘æ’¹ÔÁ§5"r©ƒWkdä’ŠæR§¨G›@”#—6 )€\rÒ\rF.u*Tuªâ5—ÂÈ¥ˆæRr)Qs) ¹ì¡[ý7µECiTÓ^q©¶?p¡º6iàQ#²ÖH5rÒõ(ÀeÙ 5Ú2 ´†$ÔˆŠKõÉ€ËòFiàÒ>õ+ "‡¬¸T߸…¨5bF¬¹4#Kk°Ó\Ø#—jËi A.ÕÔqç]j¿Ë¶Ž”ý×"íßIù²Û«4–]ÊAcÙ†U©hâA#ÕÕꧺ–)i]éi]•´®’ƒ4Š–.kì Ïž—uúÐÈËJ®4–µ~ÐàˆRFyôZZ-Aš!oÛ¿¹±£´nÿÂØþEtû—€í_¢nÿîŒ+2¶5(5€jrf%gr!%ò¨)T³1xW43ƒ€!ŠjÆ¥<È#+yÂü9)yÑ@GÍkÙ¹@. CÈkÙ%Ñ:yùT4¯ÚŸ—O1‚N@^> #¯:¯ä ¯X€W̆WLÀ+Ã+ ðŠlxE^Ñ^¡¯ ¯€Wˆ†WàØð ¼‚7¼‚^’ /IÀK¢á%x‰^BÀK¼á%xq1¼8/ކàÅbx1/ö†;àEÅ𢠼†8ˆº2uåÂHŽº¾éP!&ñgu%ÅhŽºÚFÐø3!&ñgu½C:ª5A®âÏ*=Œ«©v‡¬©– FÖTû%€Ž‰?«¾Œ®©V’Ž®©vTRrˆ?«v+9ÄŸUKNqq&þ¬ÚƒšKµ‘KuÃè˜ø³jFÐø³jß’’CüYµG.ÕzÖ\ª…-JnâϪ®¹TK¹T{?€Ž‰?ã ñgÕ«Ð\ªß‘”âϪßÂJñgœTü'Vý'à’LüYµò€K4hÕ›.bЪ?¨¸DˆA«þ¤â! ­z¤ŠK0qhÕ¯.ÁD¢Uÿ¸‹Æ‚Ѫ\D…£qû“]Z®ÂÑÚ)«€´:›.!i,&&‚Ò˜MT3„¥1C\³ L«Ö9paš¶\¨å*8­: † %àBÑp¡\H bàB¸S\Ú_Uòj™)y.>(.^ ÏÀÅ“á²ü±²QÇÃÅeàâpqQqq¸8V\ççKõ¨à<@Iæ<@‰pN£sNÃK« ç4ŠWç4ŠƒrQç4r†s9ªs9 Êç42›s™àœFvæœF*š ¥ ç4RRç4R„sIÔ9ÄpN#‘:§‘¼á p‰Ùp‰ ¸Äh¸Ä\"—HŠKôX‚S\B.!).!.!— †K`à¼áp‘\$+.’4—tM]ïÚGͺ¾¤|1Ó·Ñ|jo•yßÞó•¹.æ;›orÍÝz‚-'Ø&רü›)ý8ù–Vú‡­ÖVëGošIéŸÙ†x»žÈËûß•›äûÜÖá¸AÿÑæ—m-¨d¹÷JSL.(š\c4Iš¼ø76éKÓ†“~n”&°'­ú‡ëm?´ª½oiÒ„Æ8éÏŸÙŒYªóäõ'Úv˜Ôa¢5é]_œi‡­ß¸KŠyï7ߟÂ?iŠOÎðŸ”>!{£;EMšÞ޳køßùM3¶Iøes‰IÂÞ.ŸÙ†Ÿ´é¤]&ľ¶Z¶ç.5¯k¯kçèïíG8Eè%¥>>Ö îB«ônÏÔìº!Ó ðO¶T½m÷¤˜©éÞq5™j''o:érÿrj¼ß¨Ä`íàŠó{?˜L¶#N:þ¤®“>=˓꿱e]lÆIþý©¹éÜz?©Ääd@üg›q2àn­œwmû¥iú×6_ÙüÓæoª}ߢ|î½'SØ®7 uŸTkÒË'm&Ëöegxà©õ~R…ÒÉIºm¸rŠ;Óɸ›Ìµ_œý_Z¥ìxoëÚWûIKñí®ö-yÊV4”§ÅsÆçÕk)õZ¢^åñKÉËÇù¦µrÊö±íûÃÌï{Þd®Ÿ$ýñ”¥5éf7ÌãÛ Îü¤³MOõãs¾Ä¶öò%ȱö~l«qjÊ™¼÷ÚÑ7ýùÚ=÷Íbçê~n5›¬•Ö—¼ÞIÚ†¤½“Lºïd}¾aUÝ6¡&3Ω&œÔÿ_9ÉOf‰sæÆb$nwþ,q6²Â^ïüÙú®V¨tzеÒñXN‹Ô5Ú?ƒ¼Ýù£å-4|·Ðq%Qòu¨4z€ú ÓƒØG~çÏ ÓïüÑ:ɃN‹ T-ä~3–ÐBöy éå˰CÞïüÑýàÀ  —~çϨÆËzžmÐñÀ¥Ýù3ÈÛ?JÞîüå¸,gó¹.ýΟQÇ.ýΟCg½ógÔYïüub”\°f%'r7rYïüQýΟQ'!—õΟQGËzçϨCž”Üi.Ë?ƒ¼Ýù£åQ”< —õΟQ‡ËzçϨ㠗õøí¡ÓîüÑQqiwþh¹(.íÎ-÷ŠK¿óGiô;~çÖIÀ¥ßù£u¸´;´).íÎ%owþ òvç–'Å¥ßù£5¸ô;´—~çÖqÀ¥Ýù£4Ú?£gðõ9g¿úoÀ¥o¿ŠKoŸ‹òö¹€·ÏEyû\ÀÛçÞ>ãí‹o_œñö«Ý# c¼}qÊÛÞ¾8åí‹o_¼òöŃ·/¼}ñÆÛ¯ÆXãí‹o_¼ñö…”·/Þ¾òö«Ïí@®¼}!ðö«¨¹o¿NcÀ…·/ ÞþzäÿÐ9ðþƒvÔSÝ%Ð{Â}í¸'è$otBs¿{Öw?°'Æú´‹JÇ•‚:íºt­cîiÇ>u}\pXŸö—@µE£ãtÌý"´ÿÀ=!e¨µïŒZ'ˆÑs¿H;ªïŒ)yµc Z§}xDX@ÇÜ/BYà.œÌÈ«|ŽC^”ŠæEÉÜ/ÒŽƒêú¤ˆ¼Ú‘PÐaäÕŽ…‚޹_„ÚIUŸöIêÓ¾Ijhxµ? ¡uÌý"íh¨®Oô†WtÀ«Ý:íf9­cî9þòãž †W»éNëxëýù¥#æ~‘vLT×G’á%x‰^ÂÀkø›%ub?]שO7®“ãøéZ¨èo×u‚-Jñëu¢õçë:‰ã÷k!v ãñ ¶ÓŸ°ër¢¿aW•”<9‡¬äA΢䄱â&W0š@\ “0ž@\ô #4Xqq„%xÅÅ9Í¥$#. ¹p‰š ÓÉb:¹˜˜N.ÓYÍ/Í…³Šé¬öš¹Šé¬f`¹Šéälb:9CL'gÓÉ b:9™˜NNÓÉ b:«áœ”œ±ÓÉ b:«¯¸DÓÉb:9š˜NŽÓÉÑÄt¶?“ :ÓÉQÅtVÿ¸ÓYÝ&àTL'ÓÉb:9˜˜NÓÉbb:Y ¦³ÿ™q¥¡b:«+Š%¨˜Nˆé\þô gÓY]fàÂ&¦³ýueÐ11Õu. 1Ì*¦³NÚÀ…TL'Ät2©˜N&ÓÉ1Õl5\b:«k¸xˆéd1ìUL'û€%¨˜Îj¿¯b:Ù›˜Îj½gb:ÙALg5U 1uå.NÅtV»b ‹Šé¤1TTL'ÓYÍSˆ.&¦“ ÄtÖ%ÙĦˆé¬=bÓ³Šé¬¶*”ULgµS!6=«˜NÊ&¦³Z©›žLLgµR!6=™˜NJÓYmTˆMO*¦³Ú§À%©˜NŠÓIQÅtV»Ôp‰ÓYG˜á!¦³Ú¥†K„˜Îj†— b:«M %ÓYíQàTLgu —àK01$ÔYMOäò·”ÔUë"ýaÿÒž“¹qõö!µÉÉœIY“Ã3“¤sçχœTuR¯Sg™&ç©&'z}ø!§îêbÝlÕ‡]$b”NŽ$Ý8cyó>Ô^¿ö+[Öäöœ÷L&'Í{lùj37§¢®G7Ž£ÿÙžTëbaLZðæ 'CýÑãàÑ£rêÿÜ©ÂsOüA§þ_¶?]憋I&ÏœŒO{FñÜÁâG_+pã¬îQ‡I«ž;ÉøÌ—F=ó‚s}ê­/r¸u–uRÜ¿‡îú”Ççϵþ$ãSNçÎŒÛauÙdÀüàsË·[ðú|rÿP^'/0©ÚëSžgq:7åONÙŸºügR‡scoÒ)¬í8 “žóh«ðÜM<çšfÒà ô²8m1l¾wÿ#7Á­7’/g®ñfý#Ið“·?Ž© ë_ÍÙŽ¡ôòåï¦èŸ{éªvo^|ü·^õ}õâ×õŸÿ­¥h endstream endobj 27 0 obj 10659 endobj 43 0 obj <> stream xœÕ]ÍnǾó)؉wÔÓÓlY”ز-óà ‰¤(ɤ¨_G†‘'Ê%÷¼ŒÒ[¤g{zÙ½õõLÍpWMHà–»kªë¿ªkVÏ*QKU‰þ'þrt~ðìàYe„êÖŸmë¦2Êù¿­l»Ú¶ýšwMS}~qðͨMçªìïêïú£ÇëjÝÿ·Fþ~t^}vè±JSIQ U>ð8º®³"Ð%+ed­lÕ:Y7®:9éÿ‡ âm(èÕ:AE^Ú˜“"/cÍq¥ w&%[¡ä«¾ÑYÝ£¼9 ‹´UÍVŠ8˜>PÓU7( ’ŠQõ [‡Õ7²êú|4þÆÍA}ŒvIЋ9hãã¦yÂÕ6¤ U$.{¼óGÑ6‹Þ¦6Fº(À/zPçc¼Ù¸Ù{¬GtÕ]p½OBoâþ‹°Ê9½ÉN†UV·eöGtÕy’¦V®qåOÂ1"Ë®šÚX/Ô2ß–i£6:sH‘­³é#ŽÙ$S÷è±OéF@Ø eáKJÄ÷…ÜIyQ‰e:d«åZ…¾WoÎ:¤qRG³çM¸MRÐ,£ÈAgåU>éÍTÃx–ÝVæÖŸ«+?ñ„®¤Æ|ÖJ›É3¸´:¦z°ñŒP6…UÊgÕm™_àW].âTJÝvå>¡¼Â~JWi€#¤zEϫϜT€ Ð6^ÐU÷Ã;sYõ<.Ò• (æJšòƒÍ / cÊL=-œ'' ð&)›IíJŸ8ȳ3@*Oqz@=8c,š”Ü8ï JÐK`.à‰@{¿ÊÚ›j ï‰ß…8Ð ÝÄÓUÿ «®²ªN0úŸÁý+«º¸ª¦«ÀÆÃí¸¸Å‹@»x L<¯Êq¥æ²Æµ2Fù¢Rùt^×®äúÞ²¢ÎC–¦ðâÉpÐÖÈnÄ–‹~a½3ÂíÑSÃâù“ű–’P§2 ˆ(ψ£ñ~ÂIÏà`.kž’Pv-ö÷#Ø‹ä<Ï”A.4‚ùŸÁ±y:8Kþ~d¾< ñòÍ(„Ñ ôKŒ ÀðÒÉ·,Û¸ªOÈApçÕ<ã8¥6 BI"Y]^ª@*H†§Ì'!@¶¢n¥N$xìkzÐ#* +OéFšJï2Äð´˜$Ï÷Å#ªKꓦ~<5¯äI˜ÖbÿÔŽgGà@€«¯—&@¨¢? ü*ÙQ¾q±çÅ0^•üµ@×ËÝŽøCšÖ$v<°«±ÒmUDi S*¡—˜pÀ¿² m†;œŒtóRØDq@]¯½rµ$sÒByPÌ{¤TŸÛÆJ¤1âBGJÈ„Ðÿ,àüÔMäBà6…&…`QòÀyÂç5ÞÐSÏ0X|=ýÒ$1P0^3×~ŠÌ¯)ÁÆRèÆ]/µp¼2º¶×Ê•ì†Ó|Ú/qµ5zs3=äÓª-ƒnQЮ۔_‹ÑVo®?‡ÒŒi!/-á•÷ Ι¯µªÍ +ÊÁRŽ$cÜL1}"@_öéÆrFžÚ6µÚÁ£uÖˆ‘óÏQ¾£šÈTov)l Fà`@Þ0Øp«TkˤÖÁî´Šv§´®eçSx-»«(³Ô@”Pm6˜¯’”t€ë&5ŸçÏqÔ FÔô‰¯‚¥ë¼’À¦{ôi€éa†Gx ò[æ|#yÞË …ÍÌJ*SwR&Þï&uO{h—O(ci2!=¦|¹·Áÿ°RÞTHi€a’ìÒá~MíØ^La¬T#L½M% èßÒXGz^Ÿt¤tŸiØsC’G׬¡#~ÓmžÛã&'@<N"æ]ãòêSVk>}br? Ë\Ôótb¨mšÖ»—Ô6ŸQ›¼M%ÝHžžì²µXÁk᎔sãOä5l'Ê—d†)‹&å;Éô¼ÉAªé (byA$qoxñÅE¹?Ñíquq&<ÓO, T‚75èS­àrôýxi.Pû_giÎì^Ó¬Fæ„iFƒ3î¹k¹çмªƒ5®âùœá5PTÿÍv¾¼{ÞX hÂ/¸½;Þ\p/vy §éû.]£gL1-¹Dèy/°Ê^½ï„Ü"a"zðî^yþ¤ÔÀ…>“yW:Ûqó"Hˆy‹‡ŒÁëCo9Z¦ÝA‹8Í;bΙ4¼ú¡­‘ˆè±c™©´ŠOüŠÒÚÍwèª[”T:o ÎȺöIqùµ;ààç”ÒðZ®÷’>R,Õ 0¶\¯ƒ¢hË€ËEÞ,ðqáM¸œ0ð†ÅU ó óQ3©búÏ­ŒmjÑÊñ±OÎuèÈ`ã¥3AàÝÌ5òd4¿Iù^d\¼¬b^Q£ºí—k3Dgß2¾ÀK‰ª]¿­¿zÉuUøî%ÛÕÆõßcë³òõ—/ý.œ³ÿþ®¬y£|*':™ò,_u˜Ñ:¹ùZ³3ºñ]u<€”l²Ê7_UQ\ÐU7½ðYg³E„]–æO|Qˆ  ¯Üúcë|ö4'┢üg|IŸXÓc?¤¸ÖœX9¯žé¯gÖ_Pz|Ý…y‹ ó5‹ÔJÄSºpûÕ• ºðkŽ˜Ú¶Vì']\ÆÅqm¤:€êU¬À$΃_lÊ+±IR¯•-ÕÀ J©`ã'=HŠþ·¾3%â%â½`Î1]èâéPý¨ÉÈ9À|̈„RKZù˜ç _µ±@à"Ï×Ä:à82pN€XÛsºñ”¥Sô@/€—ŠG8Ð).Z|ìŸ(®|­:Õ.y¿Ô}ýêQÌ‚&ÝÇsŠåç€%É¥rŠÖ^ùLJ©õíU$Hpð½Xu̪O…³»îwšòºÞ=hp ÐG‚©r‘ˆà²äXùÀÕPXJ—f‘ øübþG¥H­ýº$y‘T À½¥ŠØ.³È]Æs®¯ÈÒ?QXµu ñ  2AÀ‰ÅÑlü/Ë"¿Vtã_X!H$æ ” p ÷œö5:žR5ÀBvüXfá¶Y­tÓ7ašëLß‹ ¨@€ä@Ûˆ ÅÄïh¼7+@§Jª‘¯ú¥y<ƒãÙ ÏÙº>§ÜáñuDºã±“*GXë×ÙØåEXкÞh"§<ß¶¸Åk‚'‚òŒùy ŸÅ¾œ‘§Ó¼J’;a8/‹[€ ´yþpœ…€.à÷¬«#y^‚诫²XB‹Ë¿,— ô ˆGÄžr³‘¨vír3Ó¸Ú·‹Üìß=(ëÏLv½î±”°Ôõʺ8Ó‘÷6]­Ÿ™ƒ®Ñ=Þï¿&ˆí:W++Ì.”æÊ^n¢èbÑby#Ç“šk¤{¾•Y»gk}ù/@^oió> ‹XG4gü‰ó4g6'F4n  Htéíy:/¼Þ‹ÓN^§ è/²ñ$žÞƒ|•—Þ¤d z0¥°Þ¸Ò­ªûeûé.ñˆÉ=ÇÏÎóÊ ÿI8»7%ݤ×Tkþ‘@­d¥„l¤’íæÓYødû/ëXÏ" mÈÇÍÚ oRÉt¥I¥¶ñŒ«”Ï Ìè R®H¥ÙPÜå_ÑUÇ“š”PpŠm í¡`PÉO2 ú28д¸NY^û%=6èN;çsV¨…nÓL×Vâ·(®RÜž$¢·ÁdFNÄ.œŠ²l]Ý6*Íû·Òòä ”Ȥ4õ'\R3ܤ–{–³4S“s˜T !*8éMÎ{ä•÷Û=ôð}p#¨"lœ‘Nr£ÔöÌ7–hrÐŒšÉ˃O)ó‹ @ÄmªP@…?¦œà)g©K8‰ëΓnðÀLw©™ÅËu‚ÔÿüÙb©endstream endobj 44 0 obj 3933 endobj 54 0 obj <> stream xœí]ݒݸq®ÜÎSœ«xíd(AÐU¾ˆ×›*'N²?ª$v¹jkõ/GÒHÖj]y¦tFT­9ÜyñÙ¿üüþŸ.,Õ4ÐýGŸ}7tµU+eèy5ôh;<©”ïzçºjmQú®Çî;­,˜ïz1tɪÓ"XÏ#ÜH¥SL„þ™Gm¤yÂùgøPž—Ÿ ßÕ¢î|×ÿðû¡«©šZ4ý3>â¿2Òßp ÀóZ6}žç|ÌŸ=]%kiª¿sß#5뒲ɳó Œ/LŸ‰£y˻‡Z4yÒ_s†^qÉ{Ç¡þì°÷µhÛ;B.Ÿ?s=ª®ûðÝ»Õ"Ýø®o\W'¥Sÿ5gò?]AÛIÛQ“©:jkUÇN7íLª‡y ƒóúh'½5) h×cþ¡o¯„Pßr(ðá[Þ5rXUµ:t=qLWF¨<öœÒçœ,ˆ^ñ¿gd=+âÖ›½lö ×ê¦N´Ë‰¨Îwv=wÄ×µ";ž²óßµJ(¹iö½‰VFB[Ôi9i}•Ÿ‹øÝ£ììPª‚¦!tÚE±o‚:ó‡¬kœ±=ž’úK©mPbmâ¥Cp2üCͧ·å]÷¸ÔÕ|Ês¦¤ˆèktŠ‹v]Û¤Hña'%…úÒ)D¯eúŽóæ©j´lg!à ýAÅ¡îqŸF9t}qÿðÕ…8 †x4ü­$µ!„Äãy‡×Ù¦9tV}øyˆA€¡?=ºÛ.1-JË®I§˜BýÎâF6”mégo'_ÞÍ„eˆiBp5ÇôzÞñž£ö.RÑ'Þ<…úÞ;R)tøµç|(Œ€Wó޲uåY·Òó`Nû ³0UFv&?B@Â;ÿ{¦©çs#EŸ—Ÿw«L½ºlħͦ™~ÊIbÈóÏFa±úÕú¨^¦ ú¥¬}>èÞê·‹'ÿÆËªc/gàX_Z»<ŒlzË…š×D=ƵÊÜ„€‘Èù‡zí~±W³X~UAÞ»¥ï;Ê,…Ä$Žç§ÔóÆ.óå#‚dÏU0¥|øh ÀÅǦìñdàåá/Ö´ÿ“ý¿•ÚÃó ÕYë|h»Ú† Ýáå…è!/.¾»„R¦Oþ]YÅkÛvLtD¾#"˜ ,‚9ÄWo,q°a¡ húa:^í~ØÃûÖ³‹ÿ8¼b£‹îÌS‰.§ïDØnM~v ¶„ŠÐô¿Á Ép¬˜¨p¼œÑ°:ˆ8®=0RÌÙj`ÔãÚ/Bû86ƹ lÕt*ׯßÕ" £?0uÂ0õd®yì$»eT¢ ©8ÓYP¦£Ó œøÆyPsy?(Ÿ‰T‹"³¹ØÑ .$“U´¿×ʃ¶_»¨Žg‰^93U+Y'ž å•®{C¿S6h}â“ST/ÛÒÖ—ÎVÒ¢–“{ P2zÜïzeç:ØØ§ý+Žë±û°1¢SéxhzéŸEãýÀ‘]ùAZƒÈΑ=âPüùÐ×·•ž"þuƒ¤i¨2†½ç¬øst7Iò-Ååg­ÖUøœ=æÈÁdg²q¢êT­ûtÊÚZt}Ê,ò_§šÚä§:'”—²5v‚»l¶&`ìÿ|ŠÄô|ÖÈ0Â·Ž‡4 …ñð!—¯gü÷/œ‰cÈ‘ÅD¹¦ñø½ßò®/݇4Mý-G¤2¯ T€•Ç NÐOS~¨µöÐ.%†xë¾=Ⱦګ.ìç—1Îý[ž `0¯‹V}Ùß§k´DéœWüK»ó;>W$ª.î¢|ã™NNe½ç‰°X鯇|&‚›,’#ry”ÕÔJÉz­hÆJ¤á§SIãò ü{¾ú½‡ÒÒd1ÆQ ¬?8õ£ÇåŽKâ-ñ;ŸÂ£Ò䄳,]›Íá5JT}«Iï>¤M™šq\-JN‚A¤Ú·œRÀF ªœ€ è3È@®l†ûD|vV ä3Gÿ¯fG4©Cy‰}Âqæƒy,Kjñü"ö;Î`öÁ|„„•­ÉÓP$q ÷Åy·D€ßñyž§ŠdY÷n.€ìyÖéâ» ûœÌN ûk'êZËÉÿ–ÏÂï¸BÜ÷fÑTµ0Ÿ¼YP=Ý >…w?p*®8s¶ì€sñ¦¯únÒýÂâÌÚ¢ŠûÀþ€Ðw(nMg ºjjÊÌÖkŽë'¯w$È,‹´£b:*|£Laý±á›]×­º>;öˆ€€% 8ipýűƒô€TBÝ|Â$†=Èðk•…ÙK[QNÀ\©pÞ¸Õ•l§|?ØmVdè8ó[2dròñЦ¿f8 ²à,JòF~%p:¥Ipø¥ìPŸüÙÝÔ/FÄyÉI޲…;ðm9ººžSÎ!µ#¡åNÇRÂOZoI²¬ìï³Ýn!Fõ•j{ëVÄ“þ¡æt0Zå×,g?òØiì:h2p® ؼh¯x¬K.YœÍ@HöYý«bǽÜ7ìŒÁjrkÃTÅŽ¯¹ä‡ÜhL*Îí18B‘?EBf¨CYÀ[²°Y]°ZŽ,ݳç6#?rD%'b\tpÙtÒºƒk\¢ž!ôçýVB ˆØèi uö@¯•Š·ƒƒÇ!!0ˆ²ÀäÌÀϲ%kYJŽñœŽåzÌöéNBŸl­Ý 7¬ƒÙÛnÊë-†é~Åjêº[8[xÔ™áÕx+DFÌíN$ýŒqÇ¿yM›×"H·ú@W¹§& /1íÇŒ,v€qû¡—²i«f̸Â&`|ë·i8º@f-lºË¶°A6GðpÖPöáÃ_–è?¼"£¶ž£g™‰•\•ËlHÝeí'pé[—jœW»‡\vš˜ÿ H_€"o.¨zú.¥ã}ÄΡ)óÜdF¬¬P?hX¦ÏÁU`G|̫ڱûúbÞ²´Xž¹è´ Iõ"€3å €Ð†KÙt‚Åȳ,\YŒO?æó N¹“¶¯zV<u¹Rü øW–”:ã^gfG=u]€Ê’0ødñtÑÒ H6d!—•HkÙh˶ŒåØ‹‚Ôø¨_›Z/øÈSß·Éî}muq: ï–QÌ 6Å%eÉõ•}¹ì,•Ú}Õ¬,³ýÖñ‰žMÑS?SYœÊùIè+Aofžn…}J—¸à 6…¦§?t%†šQ&P«üJÑ6÷‘v}]çNsŠéè úåÛ¶9ere õxãº_7øÖûáL¼–±ÌÓ(*&L2U¯št³iüy~k;àÔªN²Ô«>äP/8ÀõÖýb]7:±}¦2¦Ñ‰÷´Pºéò4¼v@F©:0ý'ÞÈzÌitfÀUˆIR)þñd}ZŽèŠs5GEÊœp3s±ÒÍ{Ó÷Ù‹•g(}C¡À­@^ §ì–ãý9é¾R-¯nh‚Ë‘e¿ &=æ$E7C¸r >$5#›<àN¨/ˆ*êÚè<ãÁÕNÐå¯ÂÒŠIÞÒrO€_  þÇ"FƒË·`ßqºÀ‡€Ñe—oËĈ3ÀUVD \C\Sû='ÕWß²¨æEy ¯xWQ¥-0èwU‰µÐ ò d\´FéM‘DìÖìŸNh8Êt°0L éЉàÓïm0Mz~7Õu @¸|±ÇZ ©ód}îœS­š…;û{^‰‡~pÁ'-_„!WíRiUÉátJS™£ Ù0É|ú©óF †$ ˆðâÀ.RËäº`…6[è¦nßjÑA¼H-§•ÃXY܆J«R¦”>-²ã ªF†Xqº©;CD`q®§ÐÆ çjlŠéd¸?ö|I¡µPHN¨)£™xÁ  øÐ|H°UYÊ‹×öšeóAѺÊb¯6_ø¦Õ×ô•x|«°ôR_ÓQ†&)UÓ‘ßwu–¦ße—&r\±”BB­§‰WviFÁÚˆ¥smÝÍÊ.SæÚƒJ "KåÚ™•]"†Èµ#’âˆvƵE=§#š‘±mM€J!ˆ•píAÓ_!FÀµÛnVþ‰è¸kú™âˆ*ìÚ²ŸÓ5ÔµíJqDÛ½]NëIòeª_c{˜„‚¨+ eE_ÌD¿m"–±„v”t*Cu„ðí e¨å[•ÝQøh}5*}Ì“R¿(2®2:>3ÇC½¥™É svÑu1z¨¿339dîŠ:‘ñG“wéú9ê’ÌL™G‰þÑCŠ™I$ó “…oææ6q f&•̪ÍlbÌP#’ÌXï(»˜8³I:C˜BƒÀ¹tκ4HKËjñ@ŽÚG5“NfÍð°PŒÚH5“Î(© ¦¨T3éœBn^RŒ‡CÔVª™tÆ`…ÑÃj/ÕL:§pƒXL5“Î)žPss0«©é ï£ÝT3é %ÎJ-§šIg,q–Hç™Jœ5rxEi\ë‚“ WOÈÙ›j_}‘§œ‚½g’ó·m@ÅŽ•{ »ºÀÝÚôäÀZYÝpÔ¼ì´1à8Ÿ³p˳¤Â¬7²·F¹´¤é>$ò‡}@Ù•ÃØÇö9á%¡Åc;e÷6š,óbý¡œÎpé|óeŠS] ×Ëæ ¨Ä±PºÀù°’©·ÀÄ’{¾%׬Ê.¦äÄð`õA¿‘)­»èÉ1Í;xJˆì¨ïRt®±ìxlYA®|­“½Þðˆ£¯ÀZý4ýúÑ×;ox#¼aöPõŠ+*+:“hå V™çþ{Ö#òwþp¿?d÷4VËåÔúC»Ànïüá'¸><~yŸcjH ™õK€wëFx¬[·~»l¤²¼[|z+‚sÜVК»Þ$‡ ï àÍ5€·2d·F°©†˜ýFVy(ÓF`âÀ…H…Þâ,ºE ·|•‡­57 zóUQösàeVgÞôp¥®»¥ñ jÃEòóÖy Ã{_ÄвÒ<%E¼?L­‡í’P\|Ïc5 •ÓK–®Ø•óVlX®P±¡`ÃJj9}Á†Éû‚ Öåõª¿‰BÉvRÀ \£//Ù>{»}ÓÛÓ{ß‘¬(h½e~ãã(ã°Ç¨m{ `iY–`qQ~â¼ÄjrxCýöÒwßVêeíÕËjÔ—å¨÷–Ên‚Ï«µ_ʺ¯G²‚æ”ì³/œ¹ö‚æËÚ{d=s¡¡“L=óR%53'¯g€‡óÕÌ)ÿÇjæ—MÝY—·5yä L½7m _ŽI~Ã]x¢aÛ–øÞ@BÛ¿y뉲üÚÂ>á² ;ÖÒY,ãÌ&wxÂþò‡Ý¯—äT㲑º²2y—·µ>Ü-±7eiqìKsw “ëK˜\6ª©ZÑ}„æjÕ…-¼:N2ùã€(Ä^΢—¶]·½Ï¹ó¸…±ìé j.t¶¯ä­à”ó“MY^oª ›þ^¾À/åÂé_ ª!lI£§f>ÿtÊJx2ï;e®"ÿ,.8z·R’¹Ä¡äš)Ìî¯ °¸"3Hh­,”òþŠÏ+uX7¸«• â®òVîo¥Ü)3â­ŽÍRÏZø—å;Ë^wèA•ýa%°éåë3ÙÃ-޾˜NgȸÍ`À6U¤¹Ažõšó y¡§PÿÇÙP–d=ñ†H±®ä‚Aü·P\<2ô¯Eâ½ûX _O`Âw󵌥 7&Ô&˜¬&QÁ®'LÊ4.«¬00«lL8“P%Ȇ7ñ¬ó¬«¾iï^µD܆W-ÉÎÿðîQË3ib²hر­„Ÿ‰^y^‘Áœø)ÇÅë%ï8.}Ë$øìŒ.g_s´kŒÊqÃ_s\Úû½–ÇwGº‘NÉ»äÌåGücÉ]Ä}Ï8®²é¼<êÇ%?›A6ïÑoågþxÊ?ÁóÄJ|DÏ7ž2¸[8þ@ŒÊ¦ãÈ@ñ=Þe ÚúØ¿k>œnhe, 0+÷×›ÚJN‡«¿d!°w`Äà¿;}:N~ú|5ù„\à)· €={)OŠlB–(àSÉŒ†Sf´ËQõÉîú GfQ–wÇskÓUyôÑüŵ)¨I¹emZ|q‚@mY›.Vd8vmÊ–¦MU7]€ú¸»µ)ÕËë[›–)áIצ©Ú0˜7®¬®—ÊJ«–XÚü¥å\#ýwäc¸wia,`w}kv@oQ¦®ìðIYS°©[vî œéØvjyï%®Þþ@4Õak¬–MП'œØ'œ=€‰»‹G–爺p-‡?ΪìÐíø:Ûðçÿ©áÒmendstream endobj 55 0 obj 5960 endobj 62 0 obj <> stream xœí]Ù²µ­¼Þ¯8o á¶%µº[Í[R•±Ü !E_Û®ç!¯Êoä/xžý‘ZRk«÷Òiõ9çâÆX:ÒÖÖž4-©ïD#ÕN¸?ñ/·îŸ=> 9coÿÿõ™ÜÝ;Óƒjº]× ÓÈa';ÙïT;îžÜ>»s&GcȪ"ýøx§…'Òºl1­\á^cÓ®¹÷z÷ÁóÎD£G³Ëþ»ûÌýÚÒ5Mëþ™Hӿߺ¿{ïÂR•z'E#Ôî⎥1Žc/|åNiÙ¨~7ÙtfwqÿìÍ¿¼uñÕ™¥¢ÛÖº¸<{ó¦ËêšN©˜óÀåôVRJëõÜg‰Þ’ Y·}½^Ûb!ëÊe©fèe,´c9—¸QºÏ)xµ@Ú()ËŒój_ð®Ü«)š‹õ„CÈzÈ+>sYmÓ ÙFò_òÏXÌ E™ gdE™ó>¿ïr†F e"©ßúzƨV/²”jËâã²ý‹ê3©7OyV¬ØË¶Ìú#.ЇÜòžóRO<õQȮ˩Srû|Ãçh!ÆXïCOÝzQ߆¬O|Ö TUÿ1òï]VôÇnvÇnòdꎽ šºãзݪ^bç‚?Z¥w&ͺÍ+†þŽZÊXês^ T|ʳ& ëFÙǬ;^èÚH]¦þçôg ”̃ŠyÅgŒ­/«¤õøP1‡ëúVdÞåM´/gqÝóÌ !•,ö§Nc¡^§¥V›´B´6*2ÚùBC¯f¯oʺHõ.‹Ú¡\EO5Röy¥¾©Ô5WdY“Æ©xJîÏUog36&žKåæ9îÁÕÛñ¬ÜêWy©bΊLcMŸÓ¢Y?™R”|µJÉKýÍ;ÄØ«Xè&—Í]_¨íU·˜" Ò;^êçAr5*—õáÅî#;;}l'ÁÒN\[åf¹÷í´wLÉ«9)|2” ©/Ï>Ý=8S»ÙÉôí¿_M“j¹sÜ×O¯)m3ÚŸLÍÛÌ”Ñ:k?&EdÇ®d Ìá)uÀÁ¾´;; OsúÀ~LºÊq‰0—°äi†+3‘0z ˆIJb.I2QIv)2s2¦äÕœ’’RªNIq™Y ÉLI©ýI+©ý˜ˆ’êX,´‚’–äVªMôzÒVîTsj«‘8-Vš‰ÊÍÀ§î£Ì*4ÚÄ2Ú—1A†>}œ“E¥”ƒ…«Y³™CFœ×dµ“»ÉÙcÌ&I2Jþѳž$aFÆgiÆŒcm’:.5ÒY§z¼r‰† b˜z“DC4ÈØ6‰.B 0¹uêL¢‘ñdŸz!Q_¡ÞBu!Ð-m4é ü­fWD‰â®H7Ú…÷nPmÓûM‘¿óµÜC?F ­Är-LÖÿ—¼T•»yÚqׯ›F#Çl ¡­å)=ãÄÃ\] %â:ô_|n–ɧ…/(ôÙ›|‰þ”¯«9­'œ­çœ­[5lñi;’˜ÕNSÑ„þ´F:§Î¶ŒòRosN?{kš€YÒCìõŸù6Pcèc'ä0–5 „ó„‹Òú™¡^rC}ȳðöðR?p9ŸŽ+ > ˜*“ΩSáÓ€©²¶Rµ[\* ÎÜ÷ÑhЭˆÄñRUÝ«‹=ïr?a¬¿ïÍ¿ïUß­GžtÌ7ïŒjÕ®Þ‚¹]a æÉŽžu7>nM&ÚF+9/œ^•EÃÊ[‘Ì\WÛÒ{µíNù#‹z· YFË®Í;C ë©MsÊ>VžÛÉiã†ÿsióé‡kTÁXÂ÷vh€€Áës΄nóXh, þÊÐý¢µ³×¥‰*;ð…¼¹ï€Ž‡˜Õ›V,  ÈnÇbWIÿÍËüP¥Z ÀBÑ–hŸ‹á]ÉAåÍшDUÞ5ƒÑ+t™2Eòæ¦ciÇÑeý+­›·”ÇA¯ÇþíÆQûWÐiÚøgácç–cƒš–cFŠÍ°+)ŽÃO¹ëíbTÿÌVcU 0%BaœÏ‰À¨j¹ô6oð¥Žk-Ñmù1X”%,‰9)i䵨“;dµ³:bP¿Ê¥߀÷oxEF¼nll,«H«—]‘+° ¹àzþkˆ%d1À(€Ó²jÿñe„šÏUK@ëÈûÁ¶Äób¼¡ó 0†=àëÌ 4@]`šâ 0{ÖK@Íê†CMTß3Óç‚gº/EB±ì áLßY‰…}+ÝÖg¯ì¸ûF_W0ëMS0ðÚŠDç,8whY v•ù†³¢Çe›66ÂëvÛà Ä5v" …H ¿‡<ë’gÝNA*³; ¡«9‹/ªZºÇY ÛiëЖ%p·È¢²f¶þõ ÑÅÂyÔ 6fB¨!ÛÓÈ[Œä휻+—ò3윋§iƱ‡×'\§Ï¹tn4Ÿ3dû-dÛ•…“ ° ú Z|H筯ĉ¦=Úy&ö¨¨z*‚xìÑË~á5­h*W^zRv‘×|×:}Î[|ÄUh=á.ÉkÕd.y‹ b=ଃïíôY•Ƀ>Zu‚Ž-rÍ{'(ò¡ÌCІ }Rç´tÊõê$_'溊Àx¿-ØMQ¦{ü·1(­›…@œóuÓO:mÜAÛ”Š‚ãy!*åÁÌbÐrÜcçW¼£@uF †`Ôwx\Ý®‹jÀ%p€2A‹e_^!ð‡:&N)û謁æŠó.âH!L_–*PÈâ;˜šËóžš’W}Ü€{¥÷!å%ϪSmã‡[dLShã7™änÐn­ÇÞ®V§9ôo³…|Ê=ªEñ§Üåᄨü=ÃÉþø"­ê”_šá®Žä`ÈœJM›ˆKéñ¼î¼Öƒ'•)é “6Cg%&5-á€èí¨zïœÄ$!J|&-3‘Œ&<Ä$%1—ˆ$H™‰D¯%å"$)‰¹D$AÊL$ôH%“”Ä\"’ e&m—É"$)‰¹D$AÊDDw«d7“æäÕœlž;¥êðܶ|&ëœA¿ÖlHû ?µ“¡ÅX¸’(‚™ƒÉž+ æè;äŒiÖÊíͧÓ&E«Üœ|Ú™BN#Y‹OëÑ,h$cði§ÈÅå›ï Aû†^.8R•É–¢j[jJ«š°¢4³é…,™ó&Wl—FMýW/äÉÜ/9“YÒ¡¨L½ÁÍBµÉ>“jÌ8ÖB©S“­†Æg1Ó,­4‚4¦%;ÍÃ\´tX`£¶šª<ì,/sõÈ|b¯!#ìT¡Þbóh—øXØì5AõõÐO×ídâi|<ºO¸T»„¯€hÊç« ê&µnÌ|.Ï¢ ®œƒc6¦0¯:d[ù0Ž’gÒ*\œÏc@~Ô Ž7œÂž«^Ú‰œ&@Ó“™Ä#ÏE×¾ä„ Ø@ÙM×øÿÏu ðE12/yVA çJ»Ù†¹ý칋BŽáƒ1­àx‚Î&; Yÿõ ö˜ÇЮ‚󃌓±Ç$—ý;WÊ4î&hRÆ'¾6{˜cI÷.ë%ÏÙtYhü– „b&ç;œv9(-—qwˆÛYs¨Õ^LÉc pCðà €ÚœÎËI‚ØS'P`ËUPÅ:\>»<Ñ@àn Áãaö{­©¢*Ê|Q=Á+8À¸ò– *û\¾ B³ 6¨®¤XÞ1*ü>à£r©‘\<‡ ˜.óÁ èè θpF?;•ccúÈDx‰È˜¶k7i®Û_‘?Y_uUbÓÍ4jâÑ@Ȥ¬ÊЦó\1¾­êséÒežÆ‹ù‹FÞ×(£Q·‡x 2h{͸”xn×ã6·ûG ×`ãÒU¶_JÔ¨³œ:6Á[ž+î?O4V½±4À]7à ,l¬"È-Pp¿!˜Õ… šUw›¹dl+´¶ÕVï¯h—¯ €–W Ò{-Æ2±â‚žIƒ3üg¼Ôq´œVÉŠÜ^«Ñr¥ßH@É_+mõ¬»P¼æ@˳J´¼EàÍ Ô&¥õÓШ£ïA ÷ ÐN¸v Á‚FúH hë>´B>ø4íünô§z)j¨låéŽNö :+†Xê‚28”9C±y9à²ÕëËvVùHÙ)žµ:ÝëT5”Àù< ~¨ùŸÍRQ¨{›²ê¥£qƒÌø·êxwÝù)W[‰áÈ+{ÒMhë÷"HñÃ4¬Wù»FÙ èò½_RhÓQÆÊû£^Þ3£—·ï±z`ßáà]¡Œú¶Ë‘|ó˜ò€óöì`î?DªÛÔ¬;âûN@‚`“ œÓ¶Âšbåº"ØÖÆŽ¨êޏäËGzîÝœ=F¸f:ô=wƒwÃA×m¬‚CÀê'+:{χ©Ñ´*6øÎ)ÛX½XfWCçýŸ®×Í8m‚„ôUJ·ñC9’¤*÷uQ÷{fÌKim4)“mäHe­ñ`ÛÌi+ÆÀþOPI­ÂîS`?¤]í‰øü»'N~žª+#²Þ‡ô\}þÝW'?OÕm\ÊZé¹úü»¯N~vÕí¸×ôv)«Çt¬ž~ŸªÓŸ]uÓÙ¾ê1«§ß§êôçh[ƒû>^ ál)¦£m î;VSz*=§êlk"ë_Lç¶•x˜Œ)±à“s›¡t5N‰ƒIKr÷ ۩ɶ‡`Q‚¸×œÚê^!­•ªµnEìy®ï,0»âKLÔ§e;ä›ÌÄ §´³#9Û‘"†K˜N19™NÏe¼µéÙ4ôѦBlu6ÉL% …y $š e«55¡èÉ´”ǘ9dHBBD²C#H¦™<xVÀ}’^œ’V\ê8çÉâ ÷mD»ÛÜ{BFrŸ©B½ÿh÷±î¼¹Íƒæ iK"YY+Ô‹æ,“ÑÉü(eÍñF"OrB ®ä…D|Éggr6xSl–„~ üé°­w¤WØú·^k×rpJn¥½›|©“/_Á÷±§9˜²M·óÄ€ÑÁ¶jêûIÍúøÑ<¹SÊy[Ÿ×+Áðóƒ”se§L£¡pûs.­éƒ¥î*c+cwÀW~Ž\ÛÓM³Š M°Qwó ‰^÷îvù~ ÛÙzý ð ¶žÁý#`Œ²ðž_“Ð×ÔÁ± xÛ?î›Åkývà# ?`û”1Ãê¾FK)‹»m`3ªîû-uo^³ö€š1T}èë„WbsRàŒ°f»½´{yÈU^V2>ø öâÓæç­‘}¸kúXw+š®›O¹^y´­ÛMÞ°^õ˜ÁŠÝ€ø[uÜ\¦v.¥ÛGî‰väkíÔiôŽwcÁÝA=¦‚:âêùÔeM§Û…Ï¢?b„P | ƒ¿Õ°áA”Àwð@花’\š-4+·>>5‡É!ðöFä×wÖÌ$ž;’Q sÊw‘?mÆoÔϱáÝä¤éÇUîÊ›2>øzïžÍ,ODWoàŽR3Ó3à«5'¢uW¡`ê¾[dõcÙˆ‚éì ®‡‚tÊ®µÿ…¨º;ñb—êë¼mǦèrµ­y¿ëô D¿ÖËW y£9m±ü¼ËÊjí0èj¾WyrcÛ«»J½m9GJ]{Ï\ój {‚qÎ&|€…š5ô±!tû‡y‚z ¤ã– ºòbÄ5ÌOÐã)Kúïn¯Ëº½eÈí§¾ïûAO˜¾ ®,Á³êî¢Z༿ p‚í9n ÀçP8F4ø‚3xX˜m¢ßÈ©{ ½tâ=V®0LÝ=rðñ›:e—ïà¯Ø%‚+ù­ži,ŽÄÒwÝŸÿ O±¹endstream endobj 63 0 obj 5118 endobj 70 0 obj <> stream xœíÛ’µ±xݯ8o$;Öm4šT%U€I!l¯á…*×z×—%kÖ»Þ%ð[ù"1_ÍèÖšnÍhfÆE …±tZ­VßuËk¸Ø±áßð—“——;ÅD?–•îšv§„±jÞõî˜;÷;±»{qpï€5ª7»ìÏÝgdí¿-^ÓÈáŸ5üûÉ‹ÝGG+W;Î&vGO-޾ï5stñP¼z×Þ´fwôâàý}pôíÅ¢¤€ŽNÞ?ªÚ¦"Ô|7Ôh;<¡”¯ºqUL[”¾ê‰k§•óUçC•h:ÍÐÕœzäF(càfµœ— ÇÍ㡜ÕÝ…vŒ³ÎW]à†×C•l$ã2 ŽGü3"ýž3!û2Ïñ˜?jºF0aª?¹vÆ©&UBÈ2û0¯ˆññ™4šW¸*4Ô\–I‰z5ïC]9ì=ãm›c‡"ÄúùW£ëC»OvkEZúª®ªBÑßÇLþûPì±æØŽ– ÍQ[—  9vZ¶­äçíÑ ½59 `ÕÜзWœ¨GŠhø WV 3\‡ª§ŽéÊpUÆþSz†É" ≆¸á5"ëy·.·²Ù\«%ˬ˩¨.Wì:sÄ3Æ/ާNb¾]«¸«¤ï]´2"Ú: N‹hõMY©ÝiQ:ª`©†sWAì« ~冨j”Ø–†û¤þPh›”XŸxÈÅœ ?0,ÞWÝÁZǰÈK sRxŠ5:ǫޘPÿm…’C}é ¢×"cÞàuÊêÏ®³áиx÷ž ‘Âþ(@€ôམ€ßuáQ+£úkG¼T‚‡¤È‡¡^ó°1Tʦ¢û)Iàà+å´á}æœ*ô§×Ü#Ñð÷è3ÎXL$êØÚã7ïcîœa*Âdßa*ò Â[SMj‚«r/¦^¥DàGÞ)Þ·e\ªÕÜt«´äû"ëíŒ/¦·ÏªH I”àº-ë¡ãåéYâ Qƒ ¾]¥J?UADjS×ã‹¡ªo„’]_a³uèŸcº.p!³:/QÇh‚9X²gÈZB L«|—°S¥®Ü𣡪kz#E€ú³æŸJÉBÃ#W%´èƒÈ¾ù œ{—ªã»¶gÖt»¦×vúÊç©Ì\ÙCûÒóƒ¯w߈ÝlÀú‡ýï[ûßcªÛ€]eØŒ˜>‡²óp“¥ ¨Yy‰ÛoŽ_d ÓÿŒ)¸P¡È"QjC·9vŽh‚õF)£L(²@®ìßvȲñYtQ0'L;üqþ DéËCë‘Éñ÷Àdà!ÀïÀá# Zv™6ùr$!þHŽ„áH¿"„#@Œ$´Le\ðåHBü= ‘~$DG€I]nS¾Iˆ¿€#!B8Àï„áH# BæºàË‘„ø{ 8"„#üHˆŽ1’ÀY® ¾Iˆ¿€#!B8Àï„áHÁ}ª¾ÓÐ}†òy*KG¶‡ö¥:÷iá3m åÜ}&¼·LD¤ ßolQIÇÀÊD…gå” ï£¿LT„¢ï3W1Š+Q1ŠkJÃ裿L„¢ï0WöïÕ!Q0ªÃ”‚<šª.w¾ÜéDÓXZM}yð•\äîÕ•µÔɦDîý\yð=<ƒHÎÉ•eÇ'8’ïpåÁrsÉ´]™38É™ 0Þ¾M0$ukÖ m&/±ÆœgF@v¶Z–>#áѰWÈ1´>æEÞå10†#èaøÊd—GŽèÄa[èô‘Ì<¢ÔFE™ ¥Û9¡Ìß—LAaS8rŒUZÄ ü‰«j¡‹ñÌr×ô©fTü^4¦SZÂbá–Í#E´èG^çië”)DPY ±8—FÄç+‡½Wéah×xˆuWgÚ„/Á¾È9OP³º$1@ÂwUä7%N ¦ÂÄ^L¥Ý[Ôøâw5ˆU°Í©A¡‚«B1ÃùFˆáRJÀ¾BíïÜ—†<•ÛêáTnkZ›´ŽKŸþº<Fˆ¬;w쨧ÑãªsÜ8IGà"#tç߈~ÄiaW‰ˆüh(qd•8ŸŠOý~‰'h Î÷®c=hXw¸ò%ÆEœY$t…YO 'ÎÛt2{„{$Nt½p¾F'p­à}N=1lßcgCJ-uœÛ­c¸«Y3ç7 -¯Sé}²ºx¶#Xñf8 eë8nuœ^¸îÐ*e™\}Ý€޵|Ü}Á>êŽÎg› 'ýÐ Ö%ÂË£vg9¡JUu™‰Ë3ÇѵP3þ«Ä­ÜöRÙjgåsì×IÙôæ¹Zvµ Œ&8AÚEÑР_ÂöOtxYCërŽºÔ¡Î¦Ž±4F7ˆ{ u7Å!¤Q6Y$ ÅÀ·ê2 cö9Ô"Ÿ‰ªRÔÎYO\¯©º²ô—¡æPölpÛ‡¢kôXýÇŽÍ^ã®Kšˆl‹0ÂÞë¬3£ì™ ªÛy¦ÜÕ–öHØû>ïô¬rMë/ÖÍDV™Ì|ôõæ!™431§lÉ;Aaî·uL |x#މЄ€§·uLP7Ç*"ÿ#Â1Áâº#µO;ØçÁ: ªJx„º¨Ý8ô\Lv²sºÂµ¸XQrJ¹Ï[}9ãé¡’Ö´ÅîËÆ,8¤S,I"fì!üq]ÎLˆíÙV æuË@¹@ÎTÜØøy4­ø³Ç¬¹˜é¬î&8ÁöÒ"Úâl¼Äª=eÕå{ì׿{ìû\£«Ë½7'¦uóì²wYà=µ$1ùqUh~rçÉàFv]YlDæà¹oïgê¦_uVü+?ý°Ê>Þºwê…ºaÿ„Õœ€bU&Ci+qm¼îý‰Í† ’š=Yq[þPµÜê~ b+aп`KÚlö·]O_ð„fÔ¡ßlIoÞœ ]ÙüŒ¡Šõu"fýuO€¸5!R°Ÿ‹Þbaá§”«oq’·}ÝcÁ`J¯{,.‰ÔqbÅëäÞÐæIñÞÓß½¾ï‘·'J‡Ré¦cvNÒÊFeç´ºN{f²eÀÙºW_ÊϤ µo ¹ žbԙ鉾ï\ë´m_Ú—[|ÉåÚKÌú‰Í4ÂQD›izbcŽÊ3»ÆPWEÿ +oŠ,¬ >Åä—ÆMFäÙÍìwJ©:Ø:\LêöÑêÖ4VÄô-¹*Ó%dZ·ðMà"z$¬¹nÑ™HeˆÓæÌU«a )úÌ „-BM"ˆ-_BMêòÏSÀ-«Ä¬Òœ„~Ž®à+Ÿ „J”Vnì\bxØ€¹ÄŠlœpǵ{ Î>·N‰ Gh5…êÖI‰mŒºE1bacŸû¤›“±ºU>±€°O×Mx‚_„8k+=¬¸Hª_…_Xtõ©&ÌTë†]Gê[.ôgÄ1¿’¹yYžØ.YZîÒˆ< .×Ù<1­[ÓÝ,Ž/>œß¼M6ÞÐÏÏ,€ÃgÙŒmá´›µð5§ÝøÆyßš„ûKiwRëø^žf¹ÃBè¡Æ'4§e¸§¤$çʽ!OÅá} [¡2¥LŸA /Û‰¾óÏÓŒB Hir˜…= !!ŠP˜…êá0B¢ˆ€Qˆ¶…(|¢ˆ€ / ÈÐ.Ïc1¾°ÆA©î°ðÚã316ð€þ•ê9è?E$G® ° R0*¢`a@—Ü€MÈ[ÊâÊÓ€Ùƒm@\Yõr‘DíÊ¢EOßÙ: l åð`Û-•4% ®êAŸdt2JZM8…ì*Y‰™Ú4-5᲌¤ç ëUd˜-êŒc¡â¶º P­âš·ÇÌU™©~åκž82¹ŠE_!§0ÈŸLµL™ª™êY®g¾")ÚØ ^Ór”è˜pmÛGC|.|/ªí›Vìlþ7Äè‡>a_¹ñ×´z;ß›Ü †ßÁz†Ûù31½Þ¥ï²õ¸¼¡¿GÕÆÛ]Ä·™Ò‹3,{r&ÿ"Ǥ4›R>Æ$\¥A€zŠ«®b'³à®ixÒ ÿ„Ž6’é2anŒ‚ÑiŽáèbò9–ë¶§«S2^M,sŽ‘ ž`ô)î‘ Éú©!‹ô”Pœò”¹ »{•R»!HØ"WÀ”e {;ÁUË«JL?´2¾Cµ;ä]ÃÇúwÆ¿Âø ÚøâÑðQKK*`ƒ—j»0 ·É¬¡`Ó£'ù|‰æ×¼ÿ$lö¦,!À{‚«H•~»F¾:÷[Á®ídpÆ ®»W)]6EhÉ îö1†Â_Ô++Iâ!à…œ‹n0„§'œ#ѰN „ÛÀh3vg걩k€ú Ûð1Oßo0Y„!錟6Ì¿vè¿Sh„lÔ‡œø%tâÑ|ŒÑ#­I 0Wí ¨ÜMëƒ_."ÌÔØ ¡á)O`¦/kÌô ëõ%FEhÐkLà ґÛΑ£fw±þ•Ò"¾¡áUJk1}¬b!ß$¨"DS9Šª·-Ë~‚ðh}IAsÒË9ö¬´êTaÔ¡Ca§];Ü2pÓÆÓø&‚Í“´R°%ó6üMáo±`÷ó}ªÒ)¦³cE‹†Ó˪ü6÷•©ÆCÌ‹òs™.åàVŒPN# Œ)ÐBCL1é­•1¦Œ+Ãç ÁÂÐåø]=¾Bbs„á^˰BqìGh8Ë‚j^NÓ”>•ÝC¶$æ¿ÜûNhr…z÷ãŽLßT&-ä¯àMþIåÿ:\Œq>£ä‡ÚDè‘þX´³5¬›ëÃq'£lË->Âað‡„ýÝ2……|%ü;á÷BÚ"x79f´°(ô¬È3µ*ó„¤b·ZHk7OMMߘ6>\òÛ§µe‡<:Üx]œªÓñý-ƒ½Å¹îã/Ï»l÷4e»àõ5)an·ÌuA.W§{«×6³¯]î7Ù…t]bô3é®Íø»t·Ê|þ/Ò]Ñ릗æÝÊùí¶Í¦|­[¾>Ó™·jüs•H4(‰b¢ÝA>@ªW­·/È¢.+G’õÙÏK,žÌRBš·E+ض†]·DIð…0löÝdü¶Îjx@ìÅ f'˜Oe+]pÔ˜ÊÍ ;wôߤ¾wð?WTyendstream endobj 71 0 obj 4873 endobj 81 0 obj <> stream xœí]Ýrž?O±Eªˆ8«ùÙ™µª0©€­¢H€¢„%Û RlÙ2P¼¯‘·ÈeÈu ³?sÎìéoW½«=ŠV:¸ ¬¦§·§»çëîÙ™ÕY"R©Qþ y|º8[œ%™PEõsfóÔ$™rþ¿VæEjó’gï¡ÓÉ{Ï/Dš.iý7ù=¤~íåºT—ÿT¢ã¿?>M~³ï¥Ê,‘"*ÙâeEaE­—LT&Se“ÜÉÔ¸dÿtqçûû]x)™Ö%ÓþáâÎAI2©Q*PþVR¬ŸžÊ²†ôº& ëE6¤£zœÍ<[C:)I*Í­ L ¡6ÂÊl[R¤ÖˆvJÊnÅé°¯èTŽ9Làqaœ"oHÏéÀó’¤S-¤âŸÑÿ›¨~F™‚Í…ÒE·Íéœß-)yª„rAÔ[õ8ç”Î6HJénóQ[ù÷¹õl^QRh¥îVý5èsy¯)×ËZz!¤1mé± i|þ¼¦dBa܃Zº_EV7¤G5)WÊ×?¤F~¿$…õhVËÑT+9^ŽÖCB/ÇÜj³Õ¥_Âäšõèn\Û1éˆlæ[dR®/)øŠ’* g©pÒÒ“Ú虓Y·ô¯¨¦ÇT-À”ŸÓçD­g,k5s³àŒÕ¢µºêµÝ$`®ãZy!¤’óáy¬g2™©AÞo :s*(jj¦ÜªÕªO»}±wØéX«°R”¶MŠ¥âÚò@Bª<6fà”Ú/•õE‰ÇÄ¥TeqRþAÝk(iF .ïØVE®smËŠIWæ%ÿ¿Nis}T/ˆÂªÀt@mó´fÒV™ X0~`N¹ö¨’ºQ•¤ûÉÇ ™”Êz4üSƒúBª(ã5 /÷?º$÷ÑØ”ŸÉº:g«t›· ¥Í%.«rÝvqÌõ âÂiòô·tà%–$Ÿµ­[U/jYZžú¼£:ã+ÑÌ~éDªŒo–ºðWñü³)¬*6”ZzÊ+y'SÓA§ãu5Ê—¦XðUã*Í®sJ:¦ókÔÒ^‰bà Ñ@ ×!U¢‰`ß%µËõö@ ¾)Ѥ«Jë€Ês¬œZx’vª{BÀ^çÔ@ÕQY=ŠduO(–*Z+Weh(Á”´aŽÿ¡yÚuFÜ_ÕJX'‹‹¬j<8­Kt0ˆï ¹þÀöpD½Ö”{+4TÉß=~àÿõð/|ŒøV:QÚøD›'§ cÖ?T?#\ÙñŸ,2]mšCÜÉâk=Ú”·F[àÖ÷™K¬ö E ·?«§f„t­U®R¥D!c_µ¹ׯÌ\e :ð5å:lHJšV¤µ¹*ë—T‰WÁ×&SÒËŽpo+q@U=­± w*±ðNUX•nRžmYwv‡s7mPÕ‰¢Õg_è€aÖŽT= ªk+•Û¶µ=.eÖÍÓÚoP®w¬U^؆‘@<òVÀ‡u…a„E·µŸRñÀ^`ŽÀå)ö3*«²ÄÒein²âÆ8óuæ·,UÁ¢xAkó+°×7å¾D5²\s®eÅþhª=@è%¬<ˆ†ª[ƒUòxl¤KWòTï—$)Ê®m£õŽ•Ø£J\ ãR. /&@èƒDdŒéñP¤j—‡–*+|¯Vkè¬ÈÃ:0Ïït/À~a`ž@>Xm ·?eÅÅÛT<ˆ €’ xz ý‚ʤÑÓþ†Êúün…§jç¼ï;Â}ûC9!|¼¤R¾«¥DMA[£êÁKéѽÜ_Y+¼,x-¸F—¡ ¡Ê[`mT±ÄPÓ™î;qïÕ\åöE~Y%$¿Žg_]fb¦á³O-tõ3Ðëê•þE9å úH0² $EI)ue)ÉuËŠldJcõÒ,U½@úCÆ¿K_zÚó­<É+ô@“ ñ§±˜5º ™²Ý^µ™*ý…U꯹¼KŒ.¦ÀÀY+ØkI¾Ó=°ßC ¯u ÀLÀ@^'ñ2,Øùh "¤S¶ÞÊäí8ƒ'‚–‰—ùyû…£±Ì‘Ó¼^î àá°*¢?m%€Óþ·ûMôp¸åXí©ó"ñ ¾x›r]Zê\¤Ö¨]¶žS¶þó.[o%[ƒFtº`g4åÙ.[ï²õ.[_E¶px3³5ðOàÚ'ðl—Àç”ÀÿÒ€wt:±/÷oáð&Þ“À#eÁ+¥a |ðÞâ°lXlÈÛBÔnç^µ|3[ïø.ï8ÃÐoÍkŸÀUêr½KàS&ð)Ó$ï|ï5#På±?Ñ øGJêLGÀ“¹IÝú¢0/C)ØçQ…/®bY.•©–»wV“®Ap¤lô^ð/(]À´y+­Á7é#A;²4X±!EháågbØç¥lÞ©2^ï°åºtËTåÅ4ïÈ(hy;¶<½xçpŸÐ'‚ê¸v4Æó*;` ^äðú @§‰¦Ô‹WÚ÷ˆŸ¢»ôéÓH<è{.w†f©­Jµ-’¥’×'áNy¬„þ=*ë}"¯˜ ”7è œ¥Ç¯iöûmIj·w šû!àh+°Ћ7!&_}†ïíxûÆSÖx< òH/àG÷¼ Àa}Ô[I¯šsó¬ôo¤<¢â ”\Rn)~lyㆂ…,Œ‹ybÅè*¾ï^ÿpÞ&4õ+* œÀ[[@ˆ; >ì8GÈpŸÊMoQY€îɉ47sÝÚ­nÖI“Jgããa[^Ä£_\:EOüˆFØ‘ýCÕµ»„Ó³t¦¼OøY7FEOü‚rU‡½ìïO874–ûãY1›ýq™§™ÈÕÕXûZ Ö#*þÒUs„k`Ú@‰a vÝ®ƒ7 ¼˜r3¹Ä¢'ö€ØàÖ§*ØãÜ® îOy;Ú@<Àî€kyªäl*üÛ‡kïS.b¿£O ÅÙ®›Q%zVÞ±Z°Ào*b)Ï(gs_çö!x%òÉ‹æ‡E¼—Ù¼òñ‚îë½—ñ•XQì*±9á¸U·ÃµÛ„kSÞ½©õÚ¼:Ì6×õ„':=Ç38àe2o¿ƒ÷ 0p~C;ú´ì–7ƒ˜'ÖAïHÇYýŠ)•Õ$­NÈ­oQ¶ç N>PUuº¾ðÙúbåÅÏÁÆå¾ÝÚ&Íè›ÎÀyà 6 Êæ•«K•“\‡ýžÚc+/Õ£GŽþÞzƒ[޼·Þ ƒ`ÛÒ<$žYAøóöÆA|þƒ•#™÷pÀ3‡œ&°þÊ„À;ÞŽÖôàãý¼“Ï``¸õ?q¸ ¶ï¤87ð‚ ¨ ôýöOÚž×䌶Äè ¥¼O>ò®µ€¼&‡÷à&êhБÓu)§ºvZ²Í²1¹qaç@Àë7¦Ì¦S¾¢ýk‹xŸ-(3z³ „ï‹ÿ£OE܆}Í t&£Ï—€Ÿ\£÷1¯k¥<å®"O \æõE7s¿°-¾ÞÓZ¤RÛ-ej^1úº/¯ÅïjL—Ú½ÚÄ¿™¡²IõË Ë?ÿ¦ýhendstream endobj 82 0 obj 2843 endobj 89 0 obj <> stream xœí]ëŽÝ¶FÿîSôG›´=ZÞ$Q iR mŠ&öÍÁÚëË&ë½Ù›ØÏ”Gè5~‹R")Îh†:Ô9»ŽÝœ ¢ñp8œçH™«•¨¤Z‰þïøž\\­ŒPÝðlš¶ªWFY÷ïF¶]Õ´=ÏáýN®>»8øú@T¦³+ôïÕ?XêN®­tÿ× þ÷£ç«OœTiVRTB­Žž8]×5Âë%WÊÈJ5«Öʪ¶«£çüóãuÏttrðÁqOª«Z©H9ï)[ž2&n5Ì+_ÍÜϘ±ïa¬æsî1\Òà×G c“.èÀsJb,{\`uÞ¤O©,f £Ä %]zñI?eÊœÈX¾lFÆ„y_Ãpc”`B—ÑžÆ)#Š·(pàÀ™ÀšžYðœ:ˆÉfA'TV™gϨƒŽir0RU™5>¤z13挃Å3V}FÅÿB—}UªŒ½*ºlÆáYgµjóz1Uv‘^ÜÁ”¦VýX´lfsôZ娺ïøuesq^rH!ìÌùtƒ\¹tcì'·Y¦ûÓÃÄfYÙyî[et;SP˜aªá›¢Œ?¡dÎØ¦¬1\fç|lœa‚„±=chF/f]ù¶ÌMçÛ2ÖPŸk×”‹ >†+· ‚6qø¦&o·—Wý™ÆnÜî b`ÛÆ´nŒ;Ê:ð²0®¦òvsKéRwmýÏH¹jÍÐ^צqêÚëßM¬Œ›ñNaî÷¸ÏÚ˜.¾Ü ;³\ÃoxµúÉýzÿ»ûç{÷Ïéi•3T­­ê?E=?PÆ @8;x0‡1¶CnZ½ª••„! 9œ;áDˆ®Å:B1rD€£aººFZDÂ("qca%¶D$$#G8M‹m IÄÈEޝ®œ¹2µêF1½“"á ?qàOÏþ½:'žNoo¼Ï?¶w$D%”i-˜¶W¶“@‹øfMì…jxSŒZ qEtذ–þYé.ùB09ú˜‘ˆ#…•7L犒¢Æ?÷G2@Pøç¦éà:5­Œ<Æ;]F÷™ÝÝ™b*¹W–X2å÷´ÈŽ“ôM©(ÙÜŒyfpÖ ÔDœdUÈl¿\£ ûô»Æ"JÜŒåÖH;F\õp “˜gZçPD⺅«–C+Õ4*maXšNภ„˜Ã€òÈÄÕ-é1±ì–/–Û,¸AÖýkØU£µÛˆÓ×Ô®2V·èí€qÛ«lcw4ô÷Öõ‡£DŸãÃ.lŒÄ¢”py7v{ŸùÍ~~L¾Û7ø6ýˆr13Ò¯ï—DQæ³:ºa”ˆ¤óÔ`Eû®Ùª®u¿%Ûþ%gü?…_x5;×nZ( Kg–üÒk?LJ/ÉžÁ,ý dôéÏwìIµH¯™¯S«,sÂÿD%]Sã1þ;κÔY/3 Ñê0kÓˆQ/¹ù0iKGä‡AøË ]ß={”R&œñÍ)ÕœYòSªÕ†Âà~©Ißp‘ݨ¦Î»™f£û–Ž?¡Ã˜Øcb!b‘® Š¦Ë‹zå•’B «X0A ^ÒÕ¼$:0¾‰†q¿Ð{‡µ«Æ®¦ØßP¡a2eë"WB(ênË Rja:á–†ä=ʵ¨‚$¦ei®€H1À·îhëç÷p`†%i8Ýûo³<ÁtÈ—'hãPŸ+š6o«Eõ ’.©ªL ÈÁ7™¶h­]ÿ^·õo¨@1¦(‹J&Yh æFN¶ŽÍš%çÄí«Ô©hÜ’>z}QeÜÀ,9Û¹Óm\à¿h›q|Rë)¡²ö,ßälÙ¥aK:#B¯¨¥ÑÌÊUžÛ+É®1ròUêÎÔûŒ«·ÛKü˜íS WQ€0Uîõ@¢‹?ðóAœø›"­Þ,ÚE‰V€ÂHbêÓ©0†ÉF$ÈÔ’VˆVå#ë ‘›!V”i¼Ê_¸˜tÛ^}!YYLýû.›¯6†\îz¿ÊŽH½²½>ßÒoh˜ù˜(4Îü Œ› =èqÃ@£äOúV«0Óÿmð*cãEU¸ ýÛÐûHf7,«PùêSTºÁkͪ:õcöç¾h3^f6ò`ãA`Vµ•b.Ã`H&3#³ìcJ*Óž°¾¡ª^SU˧LÕë’ÀÉ26‚—vFCÄÒ£!7₦fDɬ•íªÚÕ¬uÿM2U:ˆ/É¡„7øÊá»"{¨!œqÔ° óùÜ™ È2ŒxJð)²L‡"ÛÙz€Ã€ðJ7¨)#žqþ2ô,ðënèÙzÝ -Áf­Gb„Ó¼´6B9Ð`@;&F˜ÄødLÿ2¸É;ç @ñÌÀO}aé”VÐ8ˆA¦–¾œÔ,Œk»GÌÌ ðÝLß“›|£x¦ aÌR\ mUžTäÉ4ß9†óÖÐ^Œød2=ó2Í(ñJÊ1Â5$ ^ÞýZ‡Œo)¿ÞI—;Ҟѫ¬¼2-'Ó•%èO=ɺ:ªÇ_ÄŒ¬­aæ¸Èu_)Áz0ŽkÚ\à»Ê‘süÞÏa9e*$3‡¤s|D—p’ÑɵÃ+‰Ä7cFF-†Ä¬zMëÉÇ~ 3Øø1ƒXfƨ_Ñ] tšÍp1GJ˜°+;5Qfè²#%LT—!ç—5œOfFÖêí²N¼l·eJQ܉Tê]B0uV‰™–ºl;,{+³õ™[&™ˆ&?µQ «c¦L¦n3 DÛÈܙՙÓº­èGˆFN*þyð×èt>’€‘#@^!Ç ÂÈëIÄÈEŽA„T‹„$bäˆ"G/BuºF ‰„QDâ" Ç ¢í4Ò"’ˆ‘#Нà“ÞI‘p–¦KðøôTwâ^i LæIáxCÒ"<ÆYGöR5¼)F-†¸":lXKÿÜ:‡âÎ?Ùà³ ¬ü³Tí„#E7]ïq4  ÿÜv áÊ{µ§âs<í°£;SL%÷–Ÿvp†Lç²ã$}c*68½Qö"N/%‘d³*fˆâbq4áp¼!YÐ?î‹(q—Äb¨%°FÚi4âªkXŠG\Ö`‘j§<ÓB†b&XfpTö‡@Xúà .!æ0 <2quKzLbó®N;m‡kvö§nÿ´ó5‘ §ßT·„ó1Z†O±Õ¢Á$øu–Á©3Ÿ­À ÑêIj«d^x‰ ˜8pM]eE´ætŸÉ†· ºWzäÉD§(Ëp:.Ü¢ ¯íÌÕn«M»?‚3߬¼ÏGp6ltÌa Æ?g\r2ŽïÍ•èE?vF¾ßpô/×…pL°‘2ÈxF÷×Ô¢ î̘MôÿY4·3¬•^±ÃÝççoçkõ†DgHL=evù|žÑ¢7½  ÿ/-gLmæ Í2€½ÖºÙâB0µñ%‡¶íâKŽs3XÚÝ~I/œŸi9·< âÏ´n-‘²?õ޲®Åêÿ·%)ô÷LJæ6òwóø³9(ªmޤ†×ÆqŠýI·VÞÉ“: ™ªÓ•ëJ¡™€}x·îšmLÔᓞ„¿]38‚óqç›B3 î` 1ˆ¡ ÉÜq;ÔŸ×Ib¼ i½5v’AœS˜A‘Áw0–AQ˜3[ßÞ™¿pb«¡Sî¬É^+è”`Í­ofàŽ ’vÅjÂ5¿GHSƨ»a57žw)ƒw•iÏ€æíó58“@3R.ÆÌsWã¯vÛÊðÝ1‚<¿¡;K> stream xœí]é®Ý¶FÿÞ§8H6ird’¢6§ Ð,ÒˆwšÂp|½%Þ®íëÄ úN}¤ ¿â·(%’ÒPóQ{}m‰‘ âÎ gç’OvªÐf§ú?ñnÜ?:9:ÙYeºáÙÖMQí¬iÝkÝtEÝô0—>ïºÝÇ®©Âví.ùïîOpô‡·-ÊþŸ5ýÿ÷w^uXµÝiU(³»zËá躮Vž/½3V¦Þ5­.ªvwõþÑÛyçê×G‹-ËèêñÑÛ×û¡ª¨Œ‰#ú‘Ú-ÏX†NýªÊ0tÓÏ«­ C÷ú!S4µŽ@;6r·ÆÖ)&ŸP·Fë<ã|ÚW|)w%@€\œ§´jÂÐC>ñi?T¥ÒeD‡¯øGÆú Š2W¦ìò2çkþ¨i £LQ½ëçµ­)ílȘ2/>.+°¾¨¾vZÍ>'ֺ̳þˆ ô!·¼SõØcï”®ª;U!·Ï_û«Tç}â±;/ªË0ô…jŒ©£ê?çBþC?ý±ݱ<™ºcíB‚¥îØÔe5³ê^/qqÁÒ«6ºÉ'†õvVëuC‰OøÐ a[¨V×qè–ºmµÍcÿŠsz—³ ó`âC>ñ)cëŽHZ'‡Š98\U—*ñ.o¢u~ˆë®g^)mtv=2…y•ÕÖlÒ~Ѷ5‘ÑÊ5µ½¾ÈëbšwœÕå*zj«uQì› ^òD64hì‰çÉýÞÔ®(q1q¯M_œô?(®ÞŠ]âV§¸ÊsSVô”kêº0¥ýj•’B}梫MºÎesÛ•µ©f% %Øq¨KœÍÕhú¡O®î®é]ÿ§¯GãÿIjвÚuSÂkËðëìg×([´>ßý§Hã~4$AðÎÌÀ¯øôXÛrÌêSQ4/Kkt¬“îMÅF”Í Ÿxê'vvª#.W˧µŒ-ê ;1®2ÏÃw"ì÷û¡®0¶lâÄGœS°@1pÚXÝUyV9úPi¥Ú¡~Ç'ÞðPÆYM~`A¤ŒŒ¬Þåk|È'>àR}2¯Ù}ëÌöî߯ݿwlc\!VµÊ­­ÙÝ?jÝœøtïè ÷\&¿›ªjÈ@Òk;ün›rWÕÕ°É Â!0þ O`„pÔ b Ño*§5„'Bbü=’ žÄIˆ„qî:­"<ãï‘ñ$FˆH‚@ $TYá‰$ˆ'1BD¢'a{L£ âÓDbú=  ‰ " ‰ZAÅ'Bbü=’ žÄIˆ„©‰EÅ'Bbü=’ žÄIˆ„jˆEÅ'Bbü=’ žÄIˆžDÙXâxñi"1ýHPÄHPˆ„Ó?!ž‰ñ÷H‚€x#D$A ®82zWêIõøt/>…UÈðtçèï»,$MùÕ'ß’„§H»u5òDÛñÛù)ü4hx!AD#QD3&ÜpEÈ‚* ñ1PÀ…lx5Œ\ !–ñ°"F¡ýs?G;Gjaëzò“ÄÐðÜG¯Çàüs|Rˆ)> Ï.v˜” /þ¹wý‰þ¹÷Übrnÿ¬šÙZˆoz3sEA A\Ë?Wjät4ûjâÄz˜¦ÂóÙLò¼è å`ÍpÎutÊr¦óyâ³dRšWË™Îçi䨂dµr¦óyÒ!"¶$§”3ÏCþŸgk¡½œé|pÇè˜è|ÕÄI•è<<Ÿ-ØxMƒÏºÎc!¦§¼—h|VGÅšg”Ѭš –d~Rã$ºž•±T0 þ´ºHô˜{=™;ÃÊÃ…îÔ¼ÕíRƒ)\D2C›ÓÆBt$•Ð5Nö7œ|Óul—»¿^Eé F:éçü:góžGCOÒ¥ùþäJhîœþ¬.1Ñ;ÉÄþÕ¤¬µKʪYW<Òòr"`O ‰2"âäz>«ÝD Ùöå⦸û{s˜–ûŠ$$€€l®Ø†·Ã) 9ˆ<[q×ÚÂÕG³ûO¤¸“í»>ž„Õ8üõháö¶ç@   '}"k–Ä"…î|µH3Ðà\ÊÀÇòoè·ŸHætHr{ã ˆÉùŽ] hC‚˜¯éÉ3 ˜¯AÖYl®çŒü”~%N]u¯‘Ë2À+Vë'î7Cù4¼üEwÖÀó@¶‘¤e IpµàÃÄvò'+æ”WîJ‹ p¿–ƒºè¤\¦8°·Péð[=+;È-•ÉóùJî§·ÏÜ´>Å€/ñ š 9×Ý]ý»!d›ލ'‚¢ò7™å†‚ÍÔ­«Ršs+Øš¶¨;× 6Pƒˆê0Äç öþg,ADEäÊžåÐÃÞA Ne¦Ë"+PÙÁj~¸ÒZˇŽMô— ÷ ,ýòéM´cf{Ó7¦8Û—*lE¹Ï¸Ës`M9káÓ{T_xN–ï,sŸÊîð©þóæ­ç*C ®KÚ#¢ÒÆos²¨é×rö>[š8+W(ÏÍUCo«±ªÎ_A“Ëñåä|—b¥jŠ¢jµÎªAv($9ÚÈ_9ZéÌç«]éüÅ‰í·Š—åPQV÷º­ ¥-ÝÈ2ö×ä#¾†…Mvr’?[’]Œ¾àôÎXÀ.`¥É»é¿ß Y¤4Ãß²ÔÇí—£tÛYÁoŒêf¢¤P7¼@šVW³2ŽN<åPÇaÈÌ>"‘Bí8®ßr&‚¦èwØÁÐS>ô˜&®sV‡D];(3ZãƒoÖ½KVýËÃßRsü¦‹6²Úª.ñ±Ul“6aõ:g5JÛ˜¦N¥]ÆÖí›)í·8ÔG>0¹½ÔXáÞã ö(ó€a_Ù¸e—ªËKû6GäÖT^ðeßá¸Iì[WâV¶ûÉ(ó®ÌïD¬§xÄ'iËœÈk‹šš¦0•î}®M¤¸l€5À0½h¢,DÁV¬—Ü8ÔR€$€*e¬‚‰C%­Uÿ7ÐÌþ!ÊÄ%ÎÄk!œcø’Ù0}H.c4DXÍihol7\­>øR”Å:°€¸C¸Œ ¬àÞrûm‘]¼ÇÑ»Q(_`A¿á¸ÀÐÁË~Æq…FyçFË–æ¼ï3æ>|—9–ó«áã1ÇòÜc!›ß1›¢pß°7m£ C@@‚¯Š M½n· _òî/ž ,…·8I0³ãC&_C}\5jEõÀUñ!u(_¥ˆU /¿ðßÉeê²°vì/È25Ø%€8ô‚ `çYEžg>åz8º¨”ªÍlAËIT‚@gC0ñ¿"òÚó‰ˆR>Ð(ÌA"ñ@/k§¼d36(‚R ˆ”ßäE8w«}Yõ-ÒêÍL¦¯EÒ‰ì@€æ@Û¨ åÄð"EoV€MåL#…º&²<™ÃÉ|Pì_sé€t?DJÖUUk?%­O%)´vK³cJ¥PЛ"á˜È—²àup³IÖÁþK–ÚeƒƒX£Ìhe[EYržÞ¶2a9/&€Ò¶¼e¾@¼{ɶºPÈôÀ¾dm™†Pè_v“Çñî!« x¹Ehuȱ@‘`Ùñ2a§ŠfhžVE‘¡ÿ€´DYp]dM¹þT’ÏÒ¿Êà§|èlÇtè :‘*þ·#TÒ…ÆZ[”FÙó0šï¹8hËwü§ÊÆ:¹°ôõ¨d XçeNñ2G/Û.Ñ&@ê\Ȧ„"h4¨—œMÿ)Jÿ¥áƒ/ÝÉz¶ ÊÈd®ðÔW\?À¶n?`ìL¶©vyüg@\ÛTûºUÊ ª%|-¨vys˜èA+A¶/úÙ·_+ß–u_eu¿LªÛjB$|PÈúÐ=(¹ÁfpèHí­îÿZå—uëFV!.ñ.Ç"Y÷&×sØ—n?S&kd2¼QÑÿù?w`wendstream endobj 98 0 obj 4929 endobj 105 0 obj <> stream xœí]ÝnÝÆ¾×S½h4‡æþr‰"ÛÒ:ãè"-²$Ûj$˲¤4AÑwêcE½ÎtÉ%ÏYr¾%‡GG²äž ¤Íîpvþ¾Ù™%}–¹YQÿé~Ø?Ù9Û9Ët!«æwmËÜdZ:ÿ_+Ê*·e=çásQ”ÙãÓovŠ\W.ëý7û ýÁv¹ªÿihÇ?ïŸd_ìÖdu&мÙî+O£ª*[ÆD&µÈ¥ÍJ'rã²Ý“_}ºûOE+UOÚ=Øy°W™ÜHÙ¼­G¬ßŸÔºº C…õ$ۡðÎj?­:®‡d^ZÑMÊÈÈAKÜImû”"è²–´“B¤§Ë^Ò­q&ÇuëŠZaè”.¼¨‡T® ¡:òoèŽ!¬ŸÑIÌ ©ª´ÌéžÕ#e. é:R¿ 뜓J†¤TiñQYýuês«ÝœÓ¡n¡*Íú;*ÐSjy—tÖû@½*„1}ê± ©}~FtQTݺ'º÷"«Ú¡oÃP)¥íTÿœ ùOõPçf鎦ñ䨭 :vÇÒ*3°êZ/ÝæZôJ7®/‚xè.l÷[i!ºY/è,°ðœ5Öyá„í†^¡k'tšúKÊée Ì̃…§táaë KZg늹u8cUÑó®`¢6=Äu˜/ !Er?<µëŒZÎÒ~¢µ“£&L*­\z}žÖÅjÝAR;1W§:!l(¦>kÖ /$CÆÖY¸IîÒú¬ÄÇÄ…uvRÿ‚ª×С‡Ôê ªòÔÂ>+b…5¶O+º5¥Hña•ÒŸõ,8Dee7iÊæu˜¤¬4ƒ H‰>RýCÊ– Ê–õГÝ웑Õêµû‰›–zØvvi©ñPêa°p¹ Yi°ÅÂu|Û€Œ•V¶è:×Z¸ŽÉ«=Úºb™ üD†!çÔÑOš…:—n˜šÜ£ò)„.zøÙ" uV•}Nãý„I¥SU—Ì}lÔiaº…—a–ÓºèåMÆg첃}¶§`Ö9•Í^Ë|¡–© ”Õ·­­.¦%/‹22öÖÖKÿ«Ëlé]A¯l=äÁtmðwŸq–=tíÏí,+Ko¶?ëQ`ÐjµL„ÛÌÍ:Qu¿¢´öèÐE›òI±Üì}âiÈ~”T±ø§Š!£þÔ`b3ˆ—|’]Úô²cÊ@›Ã׉¾MoæˆÒ:i£‡uËè¾2z.‹Vám½cûù‹R{ˈ•åÏnËd¯Q©æ¢ÐU¬¬Òˆ’e_Y±Ì¯‚?J¿Á2fÓøc =_Eû[>¥|½¥CzªX]ýY‡” °ð˜2Ñ*L…³é ¥Vù!åÇ¥:XUé ]P«¬Z?&·«cŸ.äσjK-ªk«c24Œé²Úòe¬pešU°ðõ%}â3ÝÀB@ž§´sÝÖ–*˜uI‡Z+”Z-qèŠrdøj‚«1×>ê-„ÇÅñãkìyf "{Úç'¬øqIdTiu̯4¯mL<î_#yÐÉû¶Ê‹£`Û7}ÑP(NüŒÏcp8¯ÓŽ[¢}Ïê,M”ü@Pf2ïÜ8¢Çñþ*¯Ä´¶oƒ£QDk„ût!¨ø¥|‡’'¨þŽljS/Ž;8Š›» ؤ60«3 ƒ—Í*`ñšž±¥¤ÎÕ}&«æåãÇöœr6ÔÞFW 6QÊáá@:ÐZ»>ÂË!׎† –§ëò1ì1Ù‚-¸Þ]¾]úAs€N' Ï[NËå##>cáYç&»–ÀTk§u6‘Ä‚”d`ÀzGŽN³Ò¼ž ÿŠZÀ>÷‡+™•§“òk‹<ß´¨EV˜fõ•rZé¼òJ[µ‹x 6xï&-€"^Ò…ú¬S*J4+]àÕJÁï˼]³3¼³Ë¬]ã΀&ÝVŸPïÚ×\>†²Ýü:ÈèR•ÜÉZP#¯’Ëë‹ÌØã$«¼š ˆÂéâhë‚m §Ê‘ÚïôßuƒÜ²$}°©âj aÅ©§aÖD’ n{ùëË{|˜™¼AŽ kgÄ©+.ý ¥®¸À¦+©¨]ãXœŒðŒ~FS¿Jíqƒ'cïžñÚw¯<©¦oöÄ–¶/Šªá2f€¿£C¦õÎe¯Všº¸™^­¢ h=§š¯ìÓ!ÒÊ|7tÒž³o) Oà-…˜s–è¥tó8æ‰4`¯¨:Á›-O¥“å „¾ƒq™J´ŒèîWº,•Å­céA£~íhö{­OÅïMHÑÌèͺÅé@MV1À‘• úƒë’©Ûò ýݩ߾7°¡Æx"¯‚Ï+×òPb“Y<¯Ý ê `ÛàðxK—Æ[7p/2:Å¥O’qöB¯âGX»ß£ðñi$ÿë:ÞQÐÌ\Çïú¦ok’Å„œl‚®}ë=UØf×ÛÖí5ÍiܱG¼¦18½ðBIª,¿ÐJæ¶wzmÇrä!Ѻ¿0Ù€Úøý…É nâþÂ&1&òšÆLÖ_îÆ€Y¼›B7¬`L¿R¾Ò·²&ªmmIÆOYúê•ö‡¾*·£nÖKµ=lØÊKÓLØæÙÛ<{›gß·Œœ×ìN©uÒ—Ô5‰æ[12ûçŽÈþìÿõ±$;ÚñÄEn2e “ûv²cÌê·ãæ7­¬¿ùŸšO'VóäŽw¾e|‰ÆGÁ:†­¾Íáª,|œÃV¹v™Ögñ«sHÔ(ªÁgƒ¤+ªÁwë>쬯Bl6…*z6ªòÒ‰åwƒ^·CR˜^E)|Y¥§åþ ªeA支wtÖ):¦{<¤¬vï Ç\|·²Û.w/¶ÄÓrú€s: <lüåŸJì’ÒzOi! } #_©tµy†?>›ž\›¬¢ó ¶ª#Êe–ÑQé/Azù}àwb¹”ÒCjDéÞÐm)ýȲ¾#–õ?< ³€ö€·{ßc=qŸÎ’Ö¶½v|{äÙ1Xœ ì‘ç_ òœ ðh&€ÒæÅÀq¾@¼a[m [Þi‹ÂÊp"òÀ¾N«qkb††º¨û*uE¤ù¢ê]ÁÞ-B!ôß¶}ó]PÊŸQV[„Þ"ô¡o¡AÜ"ô¡ï Bÿ½ÔQéy ¡#ÎFz|ã#1{IiÍCèq]¡c]¡#šµZæªXJi‹Ð[„Þ"ô AƒfPZ<#| tDþˆ.ìÚÉrˆRŒpçºþüû½Aè…pÞ¦J}_ø½ÅkJkí“5°GÓÁ¶y`È(aù-}$È[faùúŒ¥ xõðûh²Ñ^Ñ"­Ü¾ x5#-0 xÜçtC`HÑ¡`- ÓÜ#t‘iü‹ #$ZÜz$Œož×ó¹ïtRnÀ¶y™ B2줧o!a ,H˜´Š7Ñ¡þáJQmãÿ8@‘à#ŽMövæ©nÜX˜%³¯©1þ•]3„+T᎓‘®®Lu¿…+Sƨ毕]Þ¢Ëùr›¹2eËÅÝ¿1u¿Ï’»Ô¾n?—¸« òÑßÐG‚•’¬hY:äXÉ eXèÀã œG«@^ ‡Œ„Ÿ sBùy3‹Ò û 2÷+j(-öÑüÎçÅ“Á˜3P"èÖƒò v@I„Qäób&ÀÑyEˆÙLº§õ®‰áòú & )îŽmÞïà~ïJ¬#×YRõÖ¾ØgxÐdr fÍð þ¬×t¨}4>w²øARWvZÐ’5Ê”NçÂV5h‰ÕoÇÍoB”eWº‘ F Vóä® Zõ ‡Yý÷¶h»­5@ œÎ>:Ð/›Üuk›ñ[ÛŽÝÝw:,Ö¾zÃÞÌFØ(¾}„ý®EÅè^Ü=ÝÔá±þó?¸ džendstream endobj 106 0 obj 3755 endobj 113 0 obj <> stream xœí]K“ܶ¾Ï¯à)¶+ŠI¬œâXI9¶«"ySå$N©V»«—÷)iùߦr’|ö8$g€é@ÃY­äµÊ*©€F¿»½ÊŠ\ȬèM8:[\-®²ªÝêï•jò:«d«W¢érÕôcî=¢Î¾¼X7Í+DÑŒ  :ñu*ó²å´ü3ºã·õ+:h¢y!ËÎMsºç?õ&—…l§¥~?Ìk[YV[ )K7ù(­Àþ¦ãk7»yEAÓD%J7ê—” ”ó®é¨—Ãê]!êÚ^Ý€C&#¾ÑÄ/©&~Dqä ŒËŸ HWTÅ4ê‡O)‹ýðÝ$ Ø0Õæ»kÊÖçç¡ ž³IÄ—”úô‹C“Ѹ:ïeÕ¨¼Öç¶eÞ®à_ V»kK9}ã+ªb¾¡£zP›UéÙ:Ð…@0]²jÓìˆè„òOGBA@ŒÇkzÈ@k‰À«Ü4Í;–uÇ{½áDÆ9¦ò8Vöà8ÀyÌ9IªªŠÎ\>¨™y¦ïÒa}R|“iÔæ4Ü^T€ôïX² 0¼4(1à ­!@(Â]÷‹»¹Êåq×¢9áÊa˜mT£¹u¸y|FªÖÙ{üÅagƒþçÎÎyt´ôäHÃK¥W´eÓìŠ<ÀІâ`¡e‰—UYkóÖæíÒá<ؤú' £\,ôµÎ)#òN°>ø"Ø£[k*6^Çt-Ï)ùÏr“»^G nç‘x|Á/ßâÄ›ñöèŠOlÐÈà“%„—l ´ ¼¨­[wlbž,@뿬]ó´!°WÉ| (Yt6`A¹X¢9-d²—½‡àž=Š€§¦;lX@h µyxçXº—>ØÈªÎ…¶±‘_žÃð Wk™tWšHc^”º2Wç1âξ”ß~ºg*4° AMtç[íÍ·ÚÁ£@ÙéÙ|« ðíæ[£]êŠ|®•q²nßÊœÈËûº}«€¶³oÍ— I÷™‘Éê(RåUiF‘·\˜gáa º§œ•ÜØ[„ÌØú­Ã}¼n†ï$tçRl%¦£¡Oa®Jm#c–EÙzÔ@r*i]A1ô-°úÀ#É;Û#ªx1ꈀ'p±S¸IAâD%²M쥠䰋Y ‹JƒnÒ‚Ò7íœý¡Ñ¿)‘“‡²)|F%xi0óƒníP:@×ý­Ý§µn¹v'^Ųjd^v•a㲟õxzJVž]Í)Í+Ž2êÿö—þÞÿk›«ª\7éO…Ìízpð,@= Ô׈ÿ~ótŠš$*Œ}tD³—ôzIÝ£ˆ‚™]†Ø»êʶÆ+{ˆc qÄR% zÅMÐÎ6RxnÚ–P%¶„yJ³þæ$Pš³ZIGýJ¥ÃÕ­$Ž»ñއW@›éXy«ý-ºv}ÉP•§¬À(wƒ“ª™O(VÀèðòÿÀÖº=à߃k>ž»o4þ  “ïÀ}ltŽJÄP°ïhZp@¼[DÉ=<­Ññ3¬¬(%Z ªSU4 !Ï?â]¢„çF¹C @ ‘Ü|ä祈Âçð»â·`qlñ+J®ÓÁ†6u®¬ûŒg42ETO”‚åÁDyå]zwX+Ñz¼yP u¥¦áér\«”¸W°ì¶ðtÁúL÷}(ðvDÀ¯âeY>ŽL£fbs!ï’Ö[:‘çaâ<£_V-¹9ùJƒ;dE:ÙŸSKî%µ—R¶ƒ–Uåε—iÔoû=!0ñ ,?˜HªK;‰lÛzôGik«ZóÑŸƒíIQ)ÿ¸+s¼æ©`ß…äå6"YRr 1ØãÛC÷œp½’’r¯ü(ÿFž7ôÕ¨ˆ6­<»Êkü¾?ˆYOu3j !‚ç$_ŠjÆ77”œVßPâyÖ Ûy ãä>æøŠÈ’¸ãæ@Ó@è)UÝ…ÜY”¡A·ßXŽ~ê ° ¯'ÎÅÑËJ©¼ëSÁë0vç‹¿±•7C%?§ð˜"J|àá''âÜÑhüõ ^¸È‹ “3Òžgå & /uçãE•Ûy ÁÀ¾{J±^MréŠWñ áç,{¸› ›ÊßRöM–4G&žûjœy°Q™øÀ :ÈÙ€¡‡)!=œsKrÜ=–9îG{,q=! PVÚj­Ó±ž·3Oœ^IX;‡ãõŠÁüŽYš=x­{~P÷ÒŽÉ{LnªH¾ê¹Ñêïh¢Àó¸‰?;œ|› øBÿcI(§ÐÖ‚˜ÎC›/Acïåj íq“W×=˜™.ê'{xÐŽ÷ ¸ÉߪdŒÚŽf{„%X¥tUk–U£-eYùß: ‚ÃÜõz Püʉ~|›—ðˆè \åÞ[R¼˜b2ë3Esd“+o/èyw<ä ªd¼Ïëº.õ^âïû±`šÇó纀ìñ$”Çq¼"ñ~™¸»#•2wÑ€\RJ,°³âs±ÛK7ñ¸C¹[¯àJv¹TfÜùÑõêG•Foºâmü“Éî(¯, Tpx ÒEœ 3¥)ùaPWµoõƒÊzèDä=ܾ_ L"ï¦ÏMÚC­ÉÖ{z‘÷r'¯b×rX@»“ãŸÛ]ŒOgÌù6ÖœÝ îÈÀ;X7á:ù+ùM^pôÌA°¶ý^C(§êN¼šäxêÏ•žúâÎ9šoJîüŽÈŸoÙí#êÏ-‚³æy»¼Œ½¿KÝ­Îx¢Õê˪î1SþŸJ¡Óàãeñ¹ª(Æ»öòÁè´ýý?žÐ€lìÕö¨~pP<0å”§e¢^÷šõ¸ý6 šÌ:ž¹ß ˆó飻ÿ£~¸NÆdüh¼¦â«,å4qJq‰WñÕ¬¬ïžßšñ/¤x‘rtû!ÏFòü¤žó;{ü°¬š"¯óçðò¶Q·BÀcXòJ”ä‚_1Zå¢ßä=°«0›²;õRw+† ðBh<ŠÆH ¸Ÿ® —üs?’/¹UylCšxlÊÒ;êØà;ˆ×sS|Wžs\ `*“_¯Ž¨Æ¿8gS«Ä<´÷–B¯½V RRȼ÷kx ÉÏ`ð^PàÚJ¸ïd2ûÏBdÕÿ¿Ðÿ?_è•D^ge#Š\oãlQ×›¿®þVÕ:ÎUýߪR59lÆo-wºønq•µyÙÿ§q)¬?e_ ÑúN¾þ*Z‘w]W·ÝêßE¦º¼j³º¬z;r6ž•ÔÖ±è¬Gô4¨-ºj ô^G½¢lõš‚^RÐõjZQ[¢£ARÔžµ^Oè¨cºÖ!ý"XþN_<XÔ¼&ùóÀu!ÚÚ×—ÞnvÅë{ºÖ#ŠÄ·ƒÿR¥ýójí/>¥ËŸÓµ}~K‰ó;⸉óOªÓãˆc¬õ”"Á#ÎzÐRjM*z/ZŠÛ£Õx£ædžÖQ*æ¯K:ê‚‚NéO(ªSvÎÄèɇ&®¶ý áyhº›xX¬@€ˆ`°ˆˆˆˆbƒDˆRæMÓ? ShãÖpûLøŽ˜›;™¸“‰ß´L/Ã'fGt—§t ðOv– ¿|½_™(êêN&>$™H÷-xçqûœó°ñÕOxš2öœß TèäuQÖfˆÝâ"{¢ q{Ô÷£Æ’z3nê¹x×õ”‚ΩB¥ŒÜ=Å#þÊëV܉ÿ‡$þénâøï_üw˱ÅßÐ.Éâ/ZM¾Æj r¸”z\y§#>(‘î6ƒTøæÎ:Âïo{t„1‘­#Œ<é­Ð»¥NoTG$Ë᪄Öÿú?¤t{endstream endobj 114 0 obj 4267 endobj 121 0 obj <> stream xœÕZÛr5-^÷+æðD­»xr) P$Ù‚—TQŽí`ÛÇ1äŸø~(ù 4#iFšîÙÕ® q%åít÷´úôU³ k7¬ûI¿œ-.dÜõŸ¥6­j$·þ_ ƵÚtÊI ñ¸$Ç€™HZaÁ×I´‚Hêñ‰ß"Ó/0Sò9ãÂÍûŸù»ŽbZθMª¾ rÖr!'$Îżû°¯ˆó%øìxšKLJ‚ļé/±CW8ò®0׫ Ý1PªÔžCˆãóó@‘Œ¹$w/h÷Y¤E$= $ùNÐ?ÆN¾ß‘R>ª!UŸÉy:j_džŽF 5‰ê—t¸˜teKä¤#,Ïë$@âús‚—˜Ô{X¶Ì‚N¤çÁéÒ‚œ×þ [z‚Í"¸ã Á|Ì:®òÖÅ®nŽ §´`Ev…Õó$Â]'ÁxÆ€Ãìyê‹rJ‚ä[¡K´´<ª“Ñ|Èúv‹Qîpܪ”©@—¤\ûV\ïY‘zÄv¼Ië÷¸öS‰¯‰{À»é¤û†áU˜tGÃÏ –¦ÀØkt©+'}0P8|\PJ®_BB8ÍÓ>öÍIh®&#áAÊõ@ ÞÁf»¼·l- é~º5ýV;–ú¶m³>˜ÆRå[©n´µÞ†¾ 6¡·(6ÙmBgtR袡ËVJ°ÉÈ_;’ï¶–É¢ž•‚¯†ÙJJÉu‚Õ÷Íù©B²¢»ÖJÉ ]ÎÇš¦â@±`|¢°~K˜W…IoªžHxâuÀYH^iyì½W¹¯Ñª˜)üÜ"mNê„7ûÐøÁÿõ<ÍÉB/Û(¡L·ûœ-¸´,#œ.žô¤ŒÃkuÅÿK#N— "aT0pxvÂÑ«`Bµ«ˆ„QÅÀ‘Tdüf' 4Ò5XÒ-N3‚R‘?~:^üÖœ#\åùeaf"$#¸46{lg¬ƒÌŠô1>ud¯4£wÅhE²aÃ!24Ãç HXð ƒ ™ÐJ®ö´Gžˆhø|=Ggh›6]sÆ1`œŠNâ1ÅVq¾ËxÄ.x²ö¯‹bòÛ ã?OJ;űL³»ë¨=pþ9c_7­³‚'CŽª4ÎÞâèýŠo&3dîÆ¸“* l¢ÞøñJ]šq3¹²ÈÕ÷ML€ùÌUÚõ6Bcõ¡ â’àñUÁÛö“ööƒ0æ&lš|ðBÐúÙD$»d•¡Þã¬âÐï\ô8k«ÆÙ‡xÞ$†8Bð¬÷l¹UÅ^Q ¾ÀccTo­.»žã‘O1é(xŠ3ºz/1_÷ÃÝ×Ãie9ìÊ èÖ8‘Õµ\ŠahÞÇ‚/pœêã–Ó0œþd&éKRÔå'òòî¹4õ0p99¹|.u]OêѬ¹ö@Zê3¹jË}…IïªÜ}Ê-‡+Uùô J}ò)¡æQ$‰3>%¸ˆ'‚+ Æ1Vÿ[QG]Ô`8VX‘/«üµsˆa»ÕaWs]„`Ê3 nSÎnôQ8‰Á$Ñr=”ðà9¶!ÝÉ^wl.Dl>N.87$ÈÖHpj«@šwCŽô¼K7D ñD"=ßD’ær."˲ô,Fõ²¸doU̼z!âØï0á‰^pOÖr'ü(Z;wv€:×>«j|kŠôts¹Ù"{è&‹4‘’„]Dg[ØJÒΦ¶a0ó)ãÆ¹ÌŠ8˜Ù fRkïÐ~0û,°ÏÌqŽOØor ûºªw#Æ§Ô s»êš!ÑNˆ(!L%êášþ˜ Æ÷ÞÀ˜]3Ö5úè%"êKÝ=ßÝ7t™5SÇúá0•Èö?‘0"¾Ê·S"aˆ_çÇùøÊ¹ˆb²Ý,‡‹ÜûîÇl®ùh³|ž´um‚HÇ}\rˆòE#€æ‹ÜÌþ©JÚºñž@¶ÿF 0¿ e±4yCºý°BL"ië¢÷ßš¶*M [´Õ‘ýºmuC¯"zhÝEQWÇëzûyUµ'`$R›(¸Jl·bÛG;Ù†&´æÖ);φqÍV†1»‘­ì üD"]V5‰À÷q}"Œìï9ˆ²´¦Ù¯ì³ˆœ"Biçl!௛TˆÚÙú/inüƯÌõë.“Y‘øð»$1ØAØ;_™‚ÄE41pÎ%hÄ-uÍUñUoþ¨æ’ž¼!'*{îÕ5Fd·9Ä¥ÌÓ[ØÖí–¯õmoÎÓ—‰ƒâôNfç ëìnúÕt|鿲$rp4qYLÔhâŒñ>O‚_(!»ÏûCþsG*¿¯¿Ùžï¢ËŽ”¿—û‹¡wwˆ@|7‚°(~‹>óüô6fëgŽþ«fÝÏ|ÃÔ endstream endobj 122 0 obj 2059 endobj 4 0 obj <> /Contents 5 0 R >> endobj 25 0 obj <> /Contents 26 0 R >> endobj 42 0 obj <> /Contents 43 0 R >> endobj 53 0 obj <> /Contents 54 0 R >> endobj 61 0 obj <> /Contents 62 0 R >> endobj 69 0 obj <> /Contents 70 0 R >> endobj 80 0 obj <> /Contents 81 0 R >> endobj 88 0 obj <> /Contents 89 0 R >> endobj 96 0 obj <> /Contents 97 0 R >> endobj 104 0 obj <> /Contents 105 0 R >> endobj 112 0 obj <> /Contents 113 0 R >> endobj 120 0 obj <> /Contents 121 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 4 0 R 25 0 R 42 0 R 53 0 R 61 0 R 69 0 R 80 0 R 88 0 R 96 0 R 104 0 R 112 0 R 120 0 R ] /Count 12 /Rotate 0>> endobj 1 0 obj <> endobj 9 0 obj <> endobj 11 0 obj [/Indexed /DeviceRGB 255 <000000FF00006B6BD2FFFFFF666666FF66667B7B7B6666C24A4AB96B6B6B4242 B1F30000FF9090B1B1DA888888737373B1A1A1FFB1B1CC6B6B181818FF33337B 7BCC6666B9E33333B9B9B99090D2DADADA8888CCB98888FFC2C2424242E37B7B FFE3E3DA9999FF1818FF7B7BEB2121B1B1EBFF4A4A8080D2C2C2E3A9A9A93333 33F33333D252529090E3DADAF3CCCCEBEB1818FFA1A1999999A1A1DAB99090FF D2D2525252EBA9A98080E3A1A1E3EBEBF3080808FF08087B7BD2FF73737373C2 5A5AB9B1B1B1292929FF4242E34242C2C2C2E3E3E3DADAEBF38888FFF3F3EB90 90FF2929FF8888C2C2EBB1B1F3FF5A5AD2D2D2EB4242E34A4A9999F3CCCCF3A1 A1F3C2C2F37373D2FF6B6B8080806B6BC26666CC5252B94A4AB1FF9999B9B9E3 B1B1E3909090B1A9A9FFB9B9D26B6BCC7373212121FF39398080CCE339399999 D29090DAC28080FFCCCC4A4A4AE38080FFEBEBFF2121FF8080F32121B9B9EBFF 52528888D28080DA393939DA4A4A9999E39090EBE3E3F3DADAFFD2D2EBF31010 FFA9A9A1A1A1A9A9DAB99999FFDADA5A5A5A8888E3A9A9E3A1A1EBF3F3F3EBEB FF101010FF10107B7BDA7373CC5A5AC2CCCCCCEBEBEBB9B9F3B1B1FFD2D2F3CC CCFFA9A9F3C2C2FF6B6BCC5252C2D273739999DAC28888F329298888DA9999EB E3E3FF8888EBA9A9EBF3F3FFD2D2FFF7B796FC949005E770C2F0F4F7B82899EB 94F741F7FC9490F7B84E6D892D05E770C2F118F7B77BF741F7FC949003EE8803 D600F713EE00016FF7A2E3007DF1C2F164000FF8DF0008402004F7A3A0C40000 1F200C000FF8000000C4000CC40000DF0008000000F713E22A001EC4000CDEFD 30C2F18CF7A10E03EE8803D60000000305E00FC2F1A800E44A05E0F8000032F7 B9C59A3DEC000030001DE803B600C2F1E000CD7C00000900CD5C000000FF92D0 05E10005E17003B600C2F20400CD7CC2F21000F56A033238FFFFFFC2F2780010 260000300021F9000028FF92D0601232FF94D0FF92A005E100F432F805E100C2 F22C66E8880000006021D3FF92D0F432F805E100C2F26C66E94B00000060D91D>]endobj 10 0 obj <>stream xœí} Oi–¶s1Ónó!H ‚Âf0IX&|&\‡5Ù| .FÁËe@_˜ F€Âm#I‡ÉÆÍF ¼?tÏ9ï¥Þ*@fâäö‚ Æ—AçbSHôïÝœiñ×­ôÆ |E ã‹`c±ªw ~~^±Iäo*ô%1Œ/+óŒÕû'6+6Áö³ò3ßBÁxo¨xÌïŸh‘¿B_ƒÁøhÙXœ{2PÜ]ï÷û»Aø¹«ÁøFp3¸Ÿ u‡zçªxƒñm`3Ä¡ýÅÐB¡¹3…¾ ƒñ…н±ØTõ$„xRÅÓúŒoþ`0^UÕ47×gî3ßî÷nãKñÅ•_ }) ãËâ—¿ßߢ©½×Â`0 ˆë}…¾ƒQT³ø3ß(n3ûŒoÑB_ƒÁ( b· } £0ˆ²ñg0¾MDÙø3ß&˜ü Æ7ŠëìûŒooXúŒoi&?ƒñ­àæó ¿_/äã®ü­µ_ð‚~ëë…¾ã7Ÿ·øWz—:7®|×ùžÔëFþÉ|_ôÒÎÇZÏwTè‹`0þA1S/‰òW6®t^¹Ò Mþëyä_?ðùþ—?× —Âäg0.‰ûÀxã †zõn,Zm;{­Ñ÷ïÿ[È¿ñù²L~ãÒ~'(Ÿ¯P °”?=4NÍ=óù’¨¶]¸Nî–ŠkI2ùŒKÂOt¯j©ðw^¿¡üѨ1©¿•ˆbë»V€ë´aý\^ +?ƒqiÜDÅ‚G3”ñ9¿Yï›üA2ß—ÌØö?˜Ïd“Ù$\+?ƒñˆåïÓÑXçw6å¯Öä§:!YhåÏmõ3@~V~ãó0°Ñ¹!Ž&déO+4:(^S…6‹;Tþ7…¸VDi&›Aîù³>îçg0. g°Sµl!@“äÔÂ/Ò}‚ü€ú@ÿd6+²V~㲘Yê\zNGcADgç†$ÿmÝÑ×*óý¬(ùÔögüÙ üŒÏÅÍÅ`pf—‚ ý@AþÃh4-ϱ+a ~D~¬øù²lûŒÏBïÒâRh³Â_ BÀ Èo ?)¿¦~mf¹ŸM²íg0>þÅx|1¾ø!þ!aø$òGÑ}¨üY‹ý…·ýÄþ$Û~ã³P¬ÿP¯Š ,Å—üףј>¥Õ&üÙB“?+J~äüïòZŒlܯB4‰†ô_ôÓL~cX¿™óg}ÉÆ|ãÚèëöð~*mwwyxïã×p:üëÙY8ŽÐgÚÏú_{jFTüPù“IV~ã3ðóœDÕñ c|Ï|¾?(É—ìÅæøº½©ðþ~d?Lã^ ¯6œÏeÀéò*œFàùRûíkÎó¦J!ßÇFôïÉRw]l\øc0.ŒÇOû逹/GõËQ}IÓö'³è¼3™Tþ—­½ìÚOõS¤û€×ÀíÝÿ>ïçOV‡VOV"«4æá“?^:,ÃÔ¸`þ¸èë“I¿;ãâ(Ö?é}ÒÛ;ÛÜ\SÕDLíóŠQ}¶j?xnâþxžòçºà>)ŒJt&ú¯6ä\|xHpÿ%Š?6éýáKöSvFùýã2é—}D8bò3—¿7ê õÂz‚ìŸû'£Øgé½:H’éGÔ8¾ho>±OÔßGþ*âõONVON]~ûס“!|t?ŒÊOQƒØIì›ç"ùÉ÷Ó ¿lR;òñãRh …B+ÐBž„zç~3 ýF²o R(¿Ãö¯ãß—ôO¡‚£éôzƒ¾çgþ£C#'CC@þW-å—ÒI$Ì€AäÏ’ñÏR¹ß¢>+?ƒqÜX‘Qèý-–Óoúœ@Ê÷3™yÛ×ìu%ÒôƒòHÈW¥ò¯"ÅÚ:424´{‚äÔ틤63¾ùµðgù…+ö2Œ‹âþ€ÄÊÊñÿ/­7¶™õ¾,ÖÝl9n^Ⱦþyð°HãWQ×ÑÞíæì¿ündhw„„ÿääDÿ0±¬? ?|á²uvƒ~Ó÷[®„•ŸÁ¸8~(¦FüýÿÆ›NÛïÓõ>‡ò¿ÝGîKáO…SaUëá‚ ŒüjûáW#€¡]Š (þ»ïÎPýQù÷¥ö'ö­Ó…ògÇůÓ0ëêXùŒ‹ãfw1Bñ`eÓxÓÅô'E_ßxÖ$s‚È¿¿Of=œŠDVwÏ^*ú½GvGFliÿè±DP_†½³U•õ§(–XÒß  ~Ö0V~ãsð˜È?V,B¿ÅxÓ-çÝüY[Á¯Qr;ùQ¶w‰æ¹_¥ðCÊOLkþð[úÓ‰ ÿOê¯Ã`üçUo_"ѧËj–Ä_¬èa]+?ƒqq<öuwûíÊŸWíOf{¨ânöóß½Šäߗ‰h½>¢Z?æûCÄSú‡FýÉõ[oìb¹ÈIääe¿êÓ0®ËýjjU‹`åg0.·€äÿ@…ñ^žîõ³Rû Û?Ü¿ M°×zg;ù‡PÞIù²ÞÙCê¿Bã?tbô…_î6ŒöŸ:û¦ˆúBû1Ð"ž¬ü ÆgÀß]è®Gþ#û7'´›å>_6LÿÞÕ« I}ª÷åŒ÷ND±ì=ÁzãT ?ÕûOÞ}âÅjî ågÅg0.çâ›þz’ÿâ çZ åÙÏ¿Qgâ*¥ü²à×`¾Òä¦b?°ý­¥ð¹·Èþ·ôŽóý„é´˜‡œØ×ƒ¦Ÿ'ô0Ÿ¿±¼¿ ù³¦ïÏŸÏ?ÂÒ/¹i6ß;¥þ!)ü#µÞQÊ/»úWëg££Ín£€ Èr¿˜Ù“dåg0>é3Ù_ßíF~£“?ébûß_¥”_VüÃ~¥ò á7ëýôRÒÿDŒðÇ©½‘ðnÿiUc|Øö3Ÿ‹XßðþŸ-úÍ8O±­á—Í_Ìc„_Ò?’Ûß=#é—"ÿÖHúÿ›Ê}¤üb€¿œÜüO¥vïæ\/7#†øeiF?Oèa0.ëÑ´wÂoÙŸ¯üz4 ÖûòÉß|ÕÈù#‘HûIûnûî¶³wgTî“Å~hVfŸÃ”_)ÿÍ ¾4-(Ùop+ŒÓ¼½€/“ŸÁ¸q±®–– „fÿŒó,Û~.ä§^þ„®ö›Ëøà„>Tþ!9Êgä­Áè¿êœ_ð%åËñ½)ç„~‚ZɇÆösÎÏ`\bîîf ÂbÿŒó´‘¿áêUQï¾GçÍÓ}ò“!1ÆG)¿9ÌÇÈù‡TÒ/föÐJ@ûûgy—lüàjšóN`0‡\¤s`ÐßüY‹û.ýüS ´ýªÚŸ@ÛNÚ/çõœ¨‚ñß\ÐkïJùMåˆ~`üö^C„îê˰ò3—…Z¤³bsSð_°¿þ†óDSùÝ ~ V¹’~þ”X¿/,øIåG¡·­æ·÷VŒÔ·ôÐËy8Ù­”?Ë9?ƒqY(î?ž©ûÏU~Ëõ»ÙþI³Ú/&öÐ^±Ž‡˜²«¤ß¾”gî?‡dÊ¿z"‚)D(?.äçø­ŒZÊGäülûŒ ã0z]ùgff*Èúûgœ§ZÕ~*÷çð›Õ~k”ϼ´ý‘°š×£êýNò{½§ÿI¿Ö}±–Ìùû Ǩ}]ìϰò3—BßmuWŽŸgfn û+Ðø»“ß>³'o„_s¾ò‹¥|(é²ÿ<ò{ñž# ü/UüHøi^ŸsÔÀ¸X»;ÃÕ~ã’°îÁûóù'>Jþlþ:E??P_Tûç§§kÐöâpÎõœ¿;‘®^ÌçO!õ÷‰œíùÊß®gõ‘úæÊ{©ˆUïK$–moÊÛu‰A>¬ü ÆE¡ïŸ®æÆïåüëæb^Ùd&ï뎤í—+ùØjt¹ß£»wz:<üÓÙÙªÉâZ¾“ï†ï´/ù›‘KyHåŸü¤ÿ\ƒ!q]õñ#€ø7ˆûçVû¬•2if ꃜu ñ“S{‘ý~ãûXÆ;ûixô•}a®W¿þôŽº÷iBϪ¹’O¿Èùé ¯:rþ.P~ZFL(¿ìyàî~ãÓPm¸þDz§]ÿ„ë¿ucJ/®Ü]:utw»+c¸ûVáûåœÞýˆõVƒ^»ŸîÌ1¢~{ÿðoâ^]«ÏDÂäÏÙ®¥±Tß±'‰~¤±}ª6yð·øWa0¾ÜÖwáõz®æ›ÂŸ?¯Ù6+í=Xt›²ÎÈIòÓHŸÈ~*%Ù¿&‡í…Qßi!ÏœúÈ«= Ÿ`Ý‘{]?Ú~rýÖÚÝ„F½x¯yûàäßè†ÁøÊÑ­¶Rþ_**Ôð^Êøëýÿ7ï>›ôc;ÊïkãŒvs˜ÎÇ 7Œö¾”ÔÇÁ{â†\Æ*^'CrmO9£'<šÃ?ï5¤tOÖûS{ÚEO_FŒñÑø[þó0_/Ž>ïÍŠMIý‰s¦ôz3ö™=”rÛoו벆øÒŒ~q“nû}ºWmkôâÊž«òîÜrdßnûnX ðÙÜ/áè7œ”Â/”_oÓã«EµYïÚcÓsúüÝ3y¨±I?òÍ·mÎÍ‘îí£Ûõí«™}4Ä_êÿÉIÎøDîäÄä¾ÝgõóEð wíWâmÜÇ‘ý>¾cƒqA˜äÿ¹¥E®å1¡–ñšÉûÀ¤©üú>½öþþvYò»º/²~âp8bQ(n/Üë„_Ýw>¢—ñÀé¼h$rÎk—Âï3oÒËýý Æ'!jÿ—‰–‰½ŠW½¿¾Û…ü9Û=»ô}zí'Í'(ë$ôr>á”pþ’ú«Î¹w«Öd¾°^ÄCÌé‘ý|ùƒZ³êf]jØnÜßÏ`| ¢FOß ÿ6Å}¼oOÞžŽå<|IºQ¯“ü¹°ãK¦ù}b–®S÷»V¾§¤ÂÒò§h= ü®¿æ}Ä»7žµ:ú4Ú?÷ß„Áø&`*ÿ¦céÞn—›vÞ›Ê/´?›qŽá?KÐðþ«2éW{åb~n#ýÞ™sø#j6_Šfó%ö#®“&3bÙn›i½ü¿ƒñ á¶EþÇzÝîz¡ûn·ëäžÔ÷ɂ޸º£ÒËôòNÝ)¹œW$üSÎõRŽ„á§•»ÂF­…?õNy±Ž‡-áQ> ƧÀPþ›@yâ=4y«¾üu"r]û‘üI`¿Ë Úá”è—Py?!Ü;÷bFOÔŠ½ÒóGhh_äìü¹“ìp°i?“ŸÁøD«£êf-HzÁüzy—î7åÕd²–öÌ¿vP:ÚŽºäO…çwï~däýéðÙ‰òü4¶/uÒ_°aªÖ”ýÄñòƒß?ŸÁ`bzxïc}{nIý±âWå>>::ZoþØŒýWk¯ÖÄj>Ÿ|Qê§á½Â\^Î'žÎ`0ƒQq·¯÷—n…1BqñÀÀÊïŸÁ`üCã ø~q´9f˜Ügò3_/¢Ñè!î×kæ÷WZ }y ãï…ê¨XÊç9¾˜hOªÜ…˜ü ÆW‹¾¨ä7t/–¢~Áäg0¾^û¯{½cHxE|IýÞ¹‰B_ƒÁø»!Åš_Eh%´‚¬³/˜êí›cåg0¾b ‚ôGBÈþf>P¸ÏÊÏ`|ÕÀ¬ÿ@wÚˆø`ø‘úMMþB_ƒÁø{¥ÿ7ú^¤}¯Ð|ä~0(ˆÇk  Ø`D‡öí×­ØÚ·Û[U;/$`4 ‡ý1íÙ÷hýÿÄÿm1¸ º¿|'€þz«îá`90>FB=»S‚ìóîÌvô:hØp%FŠ’ÙXÚOe-#¯C;à-¸³0ˆ~¿£Ž–¯ë0Ïi[hÃìÂû¢Òƒ!¡­r– ±J¢}Y]ú‚­…E”Q<ž‹åü–æ›Òo ì™MÐ<½G> }®öŸ>85èoñœ8ß¼ö Ù­h¿$‡‡ØÐ¬K7 Žá@÷©MXE÷#hÃJûG%ñiwËlŠñ¸5yKcRøIý~;é—÷‘ößOM‚ðO~?e6EðÈ{`?6ê#í[‘îÛí†%  6¤=vÏZ%ÿéÙ >0_qý˜žk„-˜·”ŸœB#n©šFxn´¸ßˆÜo´´ß&þëkmD×Ú ŽDÄGšÙáàGhHtr?RC¼/ŦP|—dÇnÄthÁ}â|¾ê)U„—ÜïÁ嬀ö¸¨º‚,nÂøp‡/ðöZ´è…XçÒ"ÿÅÅ¥xü7,ûýWÓ"ÙýÅÅà´ ù©Âm«{8‹‘òw$?p\áNݬ`{Ñ2à¡é‚ž:.£W]ûï -ðUvà7¥á é“uóœ’_Í=ôõÓ 1V½;++ñ¯áÃø±jØÅ.B}—(3viÒ~öôþÁyÚo×} þÞšMøÅ4gü›=pŠ?i¿Hš…ðÛÄŸ( •²¥ûÃnÀÝ~up«ßˆyªßO´¿µ,èkR‡bÿÔÔ䔡ü¦P1`Usaý¿ßކ͖´£êߤð‹½]÷Qõå^„€VKôÿÏ5ØTN`—}|Týy¢;<”ú7ZÍzì'í·YýÒ5°é>„‚kZ÷1àëT@(ÿÔý§OÇŸ"åi/--5%ßd$  ‚~´ÿúÔ”ð‹-ké?ŸêÿúǽKAäz$þŽþöaì>¼ ;ƒ6ò— ¦nÕŸ1⸠‘gyžö*ëLò×S…š;•m·­c«Þh¥çE>ùÓm•Èö¨`;üNG”XN¢m–ªJ ñ³fÁàSèoùý\^[ÚEûÅÞ]û ö›ªoj¿®4ÛËk¦ò?²ë¾Ò~Cù×µÝ?’H?,µ_‰¿Cûï’ðdXÖz/›¤~¿aü%ó—…ç—Ú?)ÔßÔ} (÷ úÀý)Ãú;tÉßÞJÛ¶!üZ÷Û¡µ¶Ãó±6Rú•ë—–_ÿXk¿|¨ÂÀ<ÑÞR~“þ û5]`ìÊoñ^»WíWºÄ¿&ŒÿS²ü:ï?Ê/Ô_˜~|HÖKá—q€èýC)Ñ^k¿f¿”~8øAZ±vµd~’¨/´ö —Ÿ•¼'êÓß²šüõÀsäz0ø¯ÿGûýñ½Øè„f#êô½Ù鯄ò{ªù%ëbH¢K ò÷É¿Ùu\uü-²ÇŠ®ÏzòÈß7}{‡¾IüŠ·dzº#`½”D¼úð½@삾ߌ.Å?þ¼"à=öÎ×þ½SS÷Úß,ÙeßEù­ò_3é¾~<Àl)¿®Ú]­ûÃ:ëwhÿ­~Cùïjí_6ó}ñ÷kí—•ïʯ´_Å€×È{tû–÷ÝŸ²åû¢¡÷Ý*”¿µÝ,á[[-ÁoÕOZûI÷üHÿg†æ«ä=¥ü˜üká×A e…€®FWt5v]k¼ÖUÛu­ËUûµî“í¿&…_Š>=¿Mè?E’~ÓúK`©öãš÷ãvíÏëïùAi&©š¢¿ÔþŒÖ~"¾Èõ³Û X ±òG4ÿÑ¿,mtv¯t^±‘ŸJóŽ-¨¬M“Á®ö´íx0 zh7íÑl‘ßëé»;1›'­óp£Eõ‹Ù<òÇ*ËËMò{^D©œ¯È§:–Æ«óP ©óô]LùÍBŸ“úJûEÕ/m¯ùS;GûAùO䷴ߪó­iöËðHª¿¡ÿGÍ–ö7«¼_è¾,õ©@0_i¿æ¿%ýH}þ»†õy¿~Ò}§òkö[¼'íŸt~Ù€1€lD€©ísŠ}ÛDúvÊûÛ-í?&ío•vÍ¿`¾!ýó¸ÕKÅ—ûg¦öÏ+áGç¯6Óù§„ô7Ú­€Úk°á£K‰¿Mû­Œ™MýI÷§ïÔíéSÅþ[ѯÔHdª?Žâ/ÆõÇ•ç_ú„Û·©D⟥[júä--Í‚ßãP'ð|ã xüà*þŸ¢èþ£þËÿÿ°ñ ºïknm"}O“òƒ°W")Óƒ“-$#ïê<1'ùït”‹à±Yzñf]™†(ìÚòÈuJÛeRoYâ xÚðc垎 uõÙ‚€KÏŸ—”ß)þB÷õ]´ß©ûμÿ•tkpdïÌKüåi¿Ðÿõ#;ý…0µßVï7´_øÿ~³âÒ¯u_)¿ ·–ÏÑþ)ËX1à{¡ý´ÕñÚöŸ„[$þöÎ@$;Ðÿeë±ØTõï™,ø¡òߟKñŸ¯12~É|!ùêXûS5–æKÆ+÷/F¨íïß…´wA+hç/»~|o6Jd’þ÷¥FÞ/CÀ¸¦©©û¢Ê/{þ¤ ûb‹¼3¬Tÿ¬ ½Èû…óÏêq×¹•.@ü?ß²qeãÊ•ÎNÜÑ3Ä‚¥ùcuTàv´Z÷»‰ìÚã½#l¬ˆXX$U˜̦¤Ü´ý^ÙùîU¹|ò£“Ç‚ßV>ùÛ:›–Ah:0h¼„ÏâW÷Űᢠûí!À .Í=çGíß;gðO>ý8JþÍkhûÖ_Ëÿš~›ö«´ÝMùlõþa©ûŽa?*Õ¿%^P@‰ÿ¤j’úùÚ?µl)ÿ¤*øOé^?5ö=?Ù}cô=(Û/ˆ/°-+ôLº/©ÿRåüÊjŽçIúíŸÊ/çµù¯‘Ù¾­æ§´^°¿F¿@î×BÂÔ'þ»û±èÿãÁ5£äoÚcèÏ{½·[YúÏH¿/[©æ½Ùß/¸}~=¢¨€LþÅÞÒ~!öº»ÏVðc˜’ïJû´-íÇç´QíÏÙ´_qÝÅø“'x`y¿ÃøËœ_ê>>ÖuÙïÐ…ß>pØÔKû‡UÍßÈûupKÕþßAøûoYù¾Nío˜4h?)Šþ“†ðË1>$ýTó±À>þOdþdÿ[·[e ÀìÓ. ~/)÷©„_Sÿeÿ ÿŠþRþíÊߨò~Êú)é@•üæÍ í>\#×ßEY?…gÚoØ~=ÔGþM²_û\¤ýOu¹ÏðýôœQIáû5ý3Õá×#R~â;²_åüTû3 R¤ü¢»O0ßÇ÷±wEîñ7µÏÒþ:ówjÿš«ö»´WfÞoô£@Ð,¿ììü_äû‚þ„ñu‡ö÷ëš¿‘÷[)¿½Ãó}cدCÿyÿ”îó³úù•ù—%ÿ)ìé{=eËù ío•UÿV™ðËÑ>ªòGy»RûgÇVŸŽç­¿Çbä¯ÕõW£³ÿFÕÝ'Jïßj÷Iþ‰÷Ž´ëý.ôWÂ/ºûóéo9Ô~‹ýV©Ÿ^«:¿òšû2ûÏHÐ#¶¬ä~ÖªøgDÕ¯ÇR~à'ºûðQhž1 ƒÁ`0 ƒÁ`0 ƒÁø\üƒÔ endstream endobj 21 0 obj <> endobj 22 0 obj <> endobj 23 0 obj <> endobj 24 0 obj <> endobj 8 0 obj <>stream xœkhÙDÀ€ endstream endobj 7 0 obj <>stream xœc`Ù endstream endobj 29 0 obj [/Indexed /DeviceRGB 255 <000000FF00006B6BD2FFFFFF666666FF66667B7B7B6666C24A4AB96B6B6B4242 B1F30000FF9090B1B1DA888888737373B1A1A1FFB1B1CC6B6B181818FF33337B 7BCC6666B9E33333B9B9B99090D2DADADA8888CCB98888FFC2C2424242E37B7B FFE3E3DA9999FF1818FF7B7BEB2121B1B1EBFF4A4A8080D2C2C2E3A9A9A93333 33F33333D252529090E3DADAF3CCCCEBEB1818FFA1A1999999A1A1DAB99090FF D2D2525252EBA9A98080E3A1A1E3EBEBF3080808FF08087B7BD2FF73737373C2 5A5AB9B1B1B1292929FF4242E34242C2C2C2E3E3E3DADAEBF38888FFF3F3EB90 90FF2929FF8888C2C2EBB1B1F3FF5A5AD2D2D2EB4242E34A4A9999F3CCCCF3A1 A1F3C2C2F37373D2FF6B6B8080806B6BC26666CC5252B94A4AB1FF9999B9B9E3 B1B1E3909090B1A9A9FFB9B9D26B6BCC7373212121FF39398080CCE339399999 D29090DAC28080FFCCCC4A4A4AE38080FFEBEBFF2121FF8080F32121B9B9EBFF 52528888D28080DA393939DA4A4A9999E39090EBE3E3F3DADAFFD2D2EBF31010 FFA9A9A1A1A1A9A9DAB99999FFDADA5A5A5A8888E3A9A9E3A1A1EBF3F3F3EBEB FF101010FF10107B7BDA7373CC5A5AC2CCCCCCEBEBEBB9B9F3B1B1FFD2D2F3CC CCFFA9A9F3C2C2FF6B6BCC5252C2D273739999DAC28888F329298888DA9999EB E3E3FF8888EBA9A9EBF3F3FFD2D2FFF7B796FC949005E770C2F0F4F7B82899EB 94F741F7FC9490F7B84E6D892D05E770C2F118F7B77BF741F7FC949003EE8803 D600F713EE00016FF7A2E3007DF1C2F164000FF8DF0008402004F7A3A0C40000 1F200C000FF8000000C4000CC40000DF0008000000F713E22A001EC4000CDEFD 30C2F18CF7A10E03EE8803D60000000305E00FC2F1A800E44A05E0F8000032F7 B9C59A3DEC000030001DE803B600C2F1E000CD7C00000900CD5C000000FF92D0 05E10005E17003B600C2F20400CD7CC2F21000F56A033238FFFFFFC2F2780010 260000300021F9000028FF92D0601232FF94D0FF92A005E100F432F805E100C2 F22C66E8880000006021D3FF92D0F432F805E100C2F26C66E94B00000060D91D>]endobj 28 0 obj <>stream xœí} Oi–¶s1Ónó!H ‚Âf0IX&|&\‡5Ù| .FÁËe@_˜ F€Âm#I‡ÉÆÍF ¼?tÏ9ï¥Þ*@fâäö‚ Æ—AçbSHôïÝœiñ×­ôÆ |E ã‹`c±ªw ~~^±Iäo*ô%1Œ/+óŒÕû'6+6Áö³ò3ßBÁxo¨xÌïŸh‘¿B_ƒÁøhÙXœ{2PÜ]ï÷û»Aø¹«ÁøFp3¸Ÿ u‡zçªxƒñm`3Ä¡ýÅÐB¡¹3…¾ ƒñ…н±ØTõ$„xRÅÓúŒoþ`0^UÕ47×gî3ßî÷nãKñÅ•_ }) ãËâ—¿ßߢ©½×Â`0 ˆë}…¾ƒQT³ø3ß(n3ûŒoÑB_ƒÁ( b· } £0ˆ²ñg0¾MDÙø3ß&˜ü Æ7ŠëìûŒooXúŒoi&?ƒñ­àæó ¿_/äã®ü­µ_ð‚~ëë…¾ã7Ÿ·øWz—:7®|×ùžÔëFþÉ|_ôÒÎÇZÏwTè‹`0þA1S/‰òW6®t^¹Ò Mþëyä_?ðùþ—?× —Âäg0.‰ûÀxã †zõn,Zm;{­Ñ÷ïÿ[È¿ñù²L~ãÒ~'(Ÿ¯P °”?=4NÍ=óù’¨¶]¸Nî–ŠkI2ùŒKÂOt¯j©ðw^¿¡üѨ1©¿•ˆbë»V€ë´aý\^ +?ƒqiÜDÅ‚G3”ñ9¿Yï›üA2ß—ÌØö?˜Ïd“Ù$\+?ƒñˆåïÓÑXçw6å¯Öä§:!YhåÏmõ3@~V~ãó0°Ñ¹!Ž&déO+4:(^S…6‹;Tþ7…¸VDi&›Aîù³>îçg0. g°Sµl!@“äÔÂ/Ò}‚ü€ú@ÿd6+²V~㲘Yê\zNGcADgç†$ÿmÝÑ×*óý¬(ùÔögüÙ üŒÏÅÍÅ`pf—‚ ý@AþÃh4-ϱ+a ~D~¬øù²lûŒÏBïÒâRh³Â_ BÀ Èo ?)¿¦~mf¹ŸM²íg0>þÅx|1¾ø!þ!aø$òGÑ}¨üY‹ý…·ýÄþ$Û~ã³P¬ÿP¯Š ,Å—üףј>¥Õ&üÙB“?+J~äüïòZŒlܯB4‰†ô_ôÓL~cX¿™óg}ÉÆ|ãÚèëöð~*mwwyxïã×p:üëÙY8ŽÐgÚÏú_{jFTüPù“IV~ã3ðóœDÕñ c|Ï|¾?(É—ìÅæøº½©ðþ~d?Lã^ ¯6œÏeÀéò*œFàùRûíkÎó¦J!ßÇFôïÉRw]l\øc0.ŒÇOû逹/GõËQ}IÓö'³è¼3™Tþ—­½ìÚOõS¤û€×ÀíÝÿ>ïçOV‡VOV"«4æá“?^:,ÃÔ¸`þ¸èë“I¿;ãâ(Ö?é}ÒÛ;ÛÜ\SÕDLíóŠQ}¶j?xnâþxžòçºà>)ŒJt&ú¯6ä\|xHpÿ%Š?6éýáKöSvFùýã2é—}D8bò3—¿7ê õÂz‚ìŸû'£Øgé½:H’éGÔ8¾ho>±OÔßGþ*âõONVON]~ûס“!|t?ŒÊOQƒØIì›ç"ùÉ÷Ó ¿lR;òñãRh …B+ÐBž„zç~3 ýF²o R(¿Ãö¯ãß—ôO¡‚£éôzƒ¾çgþ£C#'CC@þW-å—ÒI$Ì€AäÏ’ñÏR¹ß¢>+?ƒqÜX‘Qèý-–Óoúœ@Ê÷3™yÛ×ìu%ÒôƒòHÈW¥ò¯"ÅÚ:424´{‚äÔ틤63¾ùµðgù…+ö2Œ‹âþ€ÄÊÊñÿ/­7¶™õ¾,ÖÝl9n^Ⱦþyð°HãWQ×ÑÞíæì¿ündhw„„ÿääDÿ0±¬? ?|á²uvƒ~Ó÷[®„•ŸÁ¸8~(¦FüýÿÆ›NÛïÓõ>‡ò¿ÝGîKáO…SaUëá‚ ŒüjûáW#€¡]Š (þ»ïÎPýQù÷¥ö'ö­Ó…ògÇůÓ0ëêXùŒ‹ãfw1Bñ`eÓxÓÅô'E_ßxÖ$s‚È¿¿Of=œŠDVwÏ^*ú½GvGFliÿè±DP_†½³U•õ§(–XÒß  ~Ö0V~ãsð˜È?V,B¿ÅxÓ-çÝüY[Á¯Qr;ùQ¶w‰æ¹_¥ðCÊOLkþð[úÓ‰ ÿOê¯Ã`üçUo_"ѧËj–Ä_¬èa]+?ƒqq<öuwûíÊŸWíOf{¨ânöóß½Šäߗ‰h½>¢Z?æûCÄSú‡FýÉõ[oìb¹ÈIääe¿êÓ0®ËýjjU‹`åg0.·€äÿ@…ñ^žîõ³Rû Û?Ü¿ M°×zg;ù‡PÞIù²ÞÙCê¿Bã?tbô…_î6ŒöŸ:û¦ˆúBû1Ð"ž¬ü ÆgÀß]è®Gþ#û7'´›å>_6LÿÞÕ« I}ª÷åŒ÷ND±ì=ÁzãT ?ÕûOÞ}âÅjî ågÅg0.çâ›þz’ÿâ çZ åÙÏ¿Qgâ*¥ü²à×`¾Òä¦b?°ý­¥ð¹·Èþ·ôŽóý„é´˜‡œØ×ƒ¦Ÿ'ô0Ÿ¿±¼¿ ù³¦ïÏŸÏ?ÂÒ/¹i6ß;¥þ!)ü#µÞQÊ/»úWëg££Ín£€ Èr¿˜Ù“dåg0>é3Ù_ßíF~£“?ébûß_¥”_VüÃ~¥ò á7ëýôRÒÿDŒðÇ©½‘ðnÿiUc|Øö3Ÿ‹XßðþŸ-úÍ8O±­á—Í_Ìc„_Ò?’Ûß=#é—"ÿÖHúÿ›Ê}¤üb€¿œÜüO¥vïæ\/7#†øeiF?Oèa0.ëÑ´wÂoÙŸ¯üz4 ÖûòÉß|ÕÈù#‘HûIûnûî¶³wgTî“Å~hVfŸÃ”_)ÿÍ ¾4-(Ùop+ŒÓ¼½€/“ŸÁ¸q±®–– „fÿŒó,Û~.ä§^þ„®ö›Ëøà„>Tþ!9Êgä­Áè¿êœ_ð%åËñ½)ç„~‚ZɇÆösÎÏ`\bîîf ÂbÿŒó´‘¿áêUQï¾GçÍÓ}ò“!1ÆG)¿9ÌÇÈù‡TÒ/föÐJ@ûûgy—lüàjšóN`0‡\¤s`ÐßüY‹û.ýüS ´ýªÚŸ@ÛNÚ/çõœ¨‚ñß\ÐkïJùMåˆ~`üö^C„îê˰ò3—…Z¤³bsSð_°¿þ†óDSùÝ ~ V¹’~þ”X¿/,øIåG¡·­æ·÷VŒÔ·ôÐËy8Ù­”?Ë9?ƒqY(î?ž©ûÏU~Ëõ»ÙþI³Ú/&öÐ^±Ž‡˜²«¤ß¾”gî?‡dÊ¿z"‚)D(?.äçø­ŒZÊGäülûŒ ã0z]ùgff*Èúûgœ§ZÕ~*÷çð›Õ~k”ϼ´ý‘°š×£êýNò{½§ÿI¿Ö}±–Ìùû Ǩ}]ìϰò3—BßmuWŽŸgfn û+Ðø»“ß>³'o„_s¾ò‹¥|(é²ÿ<ò{ñž# ü/UüHøi^ŸsÔÀ¸X»;ÃÕ~ã’°îÁûóù'>Jþlþ:E??P_Tûç§§kÐöâpÎõœ¿;‘®^ÌçO!õ÷‰œíùÊß®gõ‘úæÊ{©ˆUïK$–moÊÛu‰A>¬ü ÆE¡ïŸ®æÆïåüëæb^Ùd&ï뎤í—+ùØjt¹ß£»wz:<üÓÙÙªÉâZ¾“ï†ï´/ù›‘KyHåŸü¤ÿ\ƒ!q]õñ#€ø7ˆûçVû¬•2if ꃜu ñ“S{‘ý~ãûXÆ;ûixô•}a®W¿þôŽº÷iBϪ¹’O¿Èùé ¯:rþ.P~ZFL(¿ìyàî~ãÓPm¸þDz§]ÿ„ë¿ucJ/®Ü]:utw»+c¸ûVáûåœÞýˆõVƒ^»ŸîÌ1¢~{ÿðoâ^]«ÏDÂäÏÙ®¥±Tß±'‰~¤±}ª6yð·øWa0¾ÜÖwáõz®æ›ÂŸ?¯Ù6+í=Xt›²ÎÈIòÓHŸÈ~*%Ù¿&‡í…Qßi!ÏœúÈ«= Ÿ`Ý‘{]?Ú~rýÖÚÝ„F½x¯yûàäßè†ÁøÊÑ­¶Rþ_**Ôð^Êøëýÿ7ï>›ôc;ÊïkãŒvs˜ÎÇ 7Œö¾”ÔÇÁ{â†\Æ*^'CrmO9£'<šÃ?ï5¤tOÖûS{ÚEO_FŒñÑø[þó0_/Ž>ïÍŠMIý‰s¦ôz3ö™=”rÛoו벆øÒŒ~q“nû}ºWmkôâÊž«òîÜrdßnûnX ðÙÜ/áè7œ”Â/”_oÓã«EµYïÚcÓsúüÝ3y¨±I?òÍ·mÎÍ‘îí£Ûõí«™}4Ä_êÿÉIÎøDîäÄä¾ÝgõóEð wíWâmÜÇ‘ý>¾cƒqA˜äÿ¹¥E®å1¡–ñšÉûÀ¤©üú>½öþþvYò»º/²~âp8bQ(n/Üë„_Ýw>¢—ñÀé¼h$rÎk—Âï3oÒËýý Æ'!jÿ—‰–‰½ŠW½¿¾Û…ü9Û=»ô}zí'Í'(ë$ôr>á”pþ’ú«Î¹w«Öd¾°^ÄCÌé‘ý|ùƒZ³êf]jØnÜßÏ`| ¢FOß ÿ6Å}¼oOÞžŽå<|IºQ¯“ü¹°ãK¦ù}b–®S÷»V¾§¤ÂÒò§h= ü®¿æ}Ä»7žµ:ú4Ú?÷ß„Áø&`*ÿ¦céÞn—›vÞ›Ê/´?›qŽá?KÐðþ«2éW{åb~n#ýÞ™sø#j6_Šfó%ö#®“&3bÙn›i½ü¿ƒñ á¶EþÇzÝîz¡ûn·ëäžÔ÷ɂ޸º£ÒËôòNÝ)¹œW$üSÎõRŽ„á§•»ÂF­…?õNy±Ž‡-áQ> ƧÀPþ›@yâ=4y«¾üu"r]û‘üI`¿Ë Úá”è—Py?!Ü;÷bFOÔŠ½ÒóGhh_äìü¹“ìp°i?“ŸÁøD«£êf-HzÁüzy—î7åÕd²–öÌ¿vP:ÚŽºäO…çwï~däýéðÙ‰òü4¶/uÒ_°aªÖ”ýÄñòƒß?ŸÁ`bzxïc}{nIý±âWå>>::ZoþØŒýWk¯ÖÄj>Ÿ|Qê§á½Â\^Î'žÎ`0ƒQq·¯÷—n…1BqñÀÀÊïŸÁ`üCã ø~q´9f˜Ügò3_/¢Ñè!î×kæ÷WZ }y ãï…ê¨XÊç9¾˜hOªÜ…˜ü ÆW‹¾¨ä7t/–¢~Áäg0¾^û¯{½cHxE|IýÞ¹‰B_ƒÁø»!Åš_Eh%´‚¬³/˜êí›cåg0¾b ‚ôGBÈþf>P¸ÏÊÏ`|ÕÀ¬ÿ@wÚˆø`ø‘úMMþB_ƒÁø{¥ÿ7ú^¤}¯Ð|ä~0(ˆÇk  Ø`D‡öí×­ØÚ·Û[U;/$`4 ‡ý1íÙ÷hýÿÄÿm1¸ º¿|'€þz«îá`90>FB=»S‚ìóîÌvô:hØp%FŠ’ÙXÚOe-#¯C;à-¸³0ˆ~¿£Ž–¯ë0Ïi[hÃìÂû¢Òƒ!¡­r– ±J¢}Y]ú‚­…E”Q<ž‹åü–æ›Òo ì™MÐ<½G> }®öŸ>85èoñœ8ß¼ö Ù­h¿$‡‡ØÐ¬K7 Žá@÷©MXE÷#hÃJûG%ñiwËlŠñ¸5yKcRøIý~;é—÷‘ößOM‚ðO~?e6EðÈ{`?6ê#í[‘îÛí†%  6¤=vÏZ%ÿéÙ >0_qý˜žk„-˜·”ŸœB#n©šFxn´¸ßˆÜo´´ß&þëkmD×Ú ŽDÄGšÙáàGhHtr?RC¼/ŦP|—dÇnÄthÁ}â|¾ê)U„—ÜïÁ嬀ö¸¨º‚,nÂøp‡/ðöZ´è…XçÒ"ÿÅÅ¥xü7,ûýWÓ"ÙýÅÅà´ ù©Âm«{8‹‘òw$?p\áNݬ`{Ñ2à¡é‚ž:.£W]ûï -ðUvà7¥á é“uóœ’_Í=ôõÓ 1V½;++ñ¯áÃø±jØÅ.B}—(3viÒ~öôþÁyÚo×} þÞšMøÅ4gü›=pŠ?i¿Hš…ðÛÄŸ( •²¥ûÃnÀÝ~up«ßˆyªßO´¿µ,èkR‡bÿÔÔ䔡ü¦P1`Usaý¿ßކ͖´£êߤð‹½]÷Qõå^„€VKôÿÏ5ØTN`—}|Týy¢;<”ú7ZÍzì'í·YýÒ5°é>„‚kZ÷1àëT@(ÿÔý§OÇŸ"åi/--5%ßd$  ‚~´ÿúÔ”ð‹-ké?ŸêÿúǽKAäz$þŽþöaì>¼ ;ƒ6ò— ¦nÕŸ1⸠‘gyžö*ëLò×S…š;•m·­c«Þh¥çE>ùÓm•Èö¨`;üNG”XN¢m–ªJ ñ³fÁàSèoùý\^[ÚEûÅÞ]û ö›ªoj¿®4ÛËk¦ò?²ë¾Ò~Cù×µÝ?’H?,µ_‰¿Cûï’ðdXÖz/›¤~¿aü%ó—…ç—Ú?)ÔßÔ} (÷ úÀý)Ãú;tÉßÞJÛ¶!üZ÷Û¡µ¶Ãó±6Rú•ë—–_ÿXk¿|¨ÂÀ<ÑÞR~“þ û5]`ìÊoñ^»WíWºÄ¿&ŒÿS²ü:ï?Ê/Ô_˜~|HÖKá—q€èýC)Ñ^k¿f¿”~8øAZ±vµd~’¨/´ö —Ÿ•¼'êÓß²šüõÀsäz0ø¯ÿGûýñ½Øè„f#êô½Ù鯄ò{ªù%ëbH¢K ò÷É¿Ùu\uü-²ÇŠ®ÏzòÈß7}{‡¾IüŠ·dzº#`½”D¼úð½@삾ߌ.Å?þ¼"à=öÎ×þ½SS÷Úß,ÙeßEù­ò_3é¾~<Àl)¿®Ú]­ûÃ:ëwhÿ­~Cùïjí_6ó}ñ÷kí—•ïʯ´_Å€×È{tû–÷ÝŸ²åû¢¡÷Ý*”¿µÝ,á[[-ÁoÕOZûI÷üHÿg†æ«ä=¥ü˜üká×A e…€®FWt5v]k¼ÖUÛu­ËUûµî“í¿&…_Š>=¿Mè?E’~ÓúK`©öãš÷ãvíÏëïùAi&©š¢¿ÔþŒÖ~"¾Èõ³Û X ±òG4ÿÑ¿,mtv¯t^±‘ŸJóŽ-¨¬M“Á®ö´íx0 zh7íÑl‘ßëé»;1›'­óp£Eõ‹Ù<òÇ*ËËMò{^D©œ¯È§:–Æ«óP ©óô]LùÍBŸ“úJûEÕ/m¯ùS;GûAùO䷴ߪó­iöËðHª¿¡ÿGÍ–ö7«¼_è¾,õ©@0_i¿æ¿%ýH}þ»†õy¿~Ò}§òkö[¼'íŸt~Ù€1€lD€©ísŠ}ÛDúvÊûÛ-í?&ío•vÍ¿`¾!ýó¸ÕKÅ—ûg¦öÏ+áGç¯6Óù§„ô7Ú­€Úk°á£K‰¿Mû­Œ™MýI÷§ïÔíéSÅþ[ѯÔHdª?Žâ/ÆõÇ•ç_ú„Û·©D⟥[júä--Í‚ßãP'ð|ã xüà*þŸ¢èþ£þËÿÿ°ñ ºïknm"}O“òƒ°W")Óƒ“-$#ïê<1'ùït”‹à±Yzñf]™†(ìÚòÈuJÛeRoYâ xÚðc垎 uõÙ‚€KÏŸ—”ß)þB÷õ]´ß©ûμÿ•tkpdïÌKüåi¿Ðÿõ#;ý…0µßVï7´_øÿ~³âÒ¯u_)¿ ·–ÏÑþ)ËX1à{¡ý´ÕñÚöŸ„[$þöÎ@$;Ðÿeë±ØTõï™,ø¡òߟKñŸ¯12~É|!ùêXûS5–æKÆ+÷/F¨íïß…´wA+hç/»~|o6Jd’þ÷¥FÞ/CÀ¸¦©©û¢Ê/{þ¤ ûb‹¼3¬Tÿ¬ ½Èû…óÏêq×¹•.@ü?ß²qeãÊ•ÎNÜÑ3Ä‚¥ùcuTàv´Z÷»‰ìÚã½#l¬ˆXX$U˜̦¤Ü´ý^ÙùîU¹|ò£“Ç‚ßV>ùÛ:›–Ah:0h¼„ÏâW÷Űᢠûí!À .Í=çGíß;gðO>ý8JþÍkhûÖ_Ëÿš~›ö«´ÝMùlõþa©ûŽa?*Õ¿%^P@‰ÿ¤j’úùÚ?µl)ÿ¤*øOé^?5ö=?Ù}cô=(Û/ˆ/°-+ôLº/©ÿRåüÊjŽçIúíŸÊ/çµù¯‘Ù¾­æ§´^°¿F¿@î×BÂÔ'þ»û±èÿãÁ5£äoÚcèÏ{½·[YúÏH¿/[©æ½Ùß/¸}~=¢¨€LþÅÞÒ~!öº»ÏVðc˜’ïJû´-íÇç´QíÏÙ´_qÝÅø“'x`y¿ÃøËœ_ê>>ÖuÙïÐ…ß>pØÔKû‡UÍßÈûupKÕþßAøûoYù¾Nío˜4h?)Šþ“†ðË1>$ýTó±À>þOdþdÿ[·[e ÀìÓ. ~/)÷©„_Sÿeÿ ÿŠþRþíÊߨò~Êú)é@•üæÍ í>\#×ßEY?…gÚoØ~=ÔGþM²_û\¤ýOu¹ÏðýôœQIáû5ý3Õá×#R~â;²_åüTû3 R¤ü¢»O0ßÇ÷±wEîñ7µÏÒþ:ówjÿš«ö»´WfÞoô£@Ð,¿ììü_äû‚þ„ñu‡ö÷ëš¿‘÷[)¿½Ãó}cدCÿyÿ”îó³úù•ù—%ÿ)ìé{=eËù ío•UÿV™ðËÑ>ªòGy»RûgÇVŸŽç­¿Çbä¯ÕõW£³ÿFÕÝ'Jïßj÷Iþ‰÷Ž´ëý.ôWÂ/ºûóéo9Ô~‹ýV©Ÿ^«:¿òšû2ûÏHÐ#¶¬ä~ÖªøgDÕ¯ÇR~à'ºûðQhž1 ƒÁ`0 ƒÁ`0 ƒÁø\üƒÔ endstream endobj 39 0 obj <> endobj 40 0 obj <> endobj 41 0 obj <> endobj 46 0 obj [/Indexed /DeviceRGB 255 <000000FF00006B6BD2FFFFFF666666FF66667B7B7B6666C24A4AB96B6B6B4242 B1F30000FF9090B1B1DA888888737373B1A1A1FFB1B1CC6B6B181818FF33337B 7BCC6666B9E33333B9B9B99090D2DADADA8888CCB98888FFC2C2424242E37B7B FFE3E3DA9999FF1818FF7B7BEB2121B1B1EBFF4A4A8080D2C2C2E3A9A9A93333 33F33333D252529090E3DADAF3CCCCEBEB1818FFA1A1999999A1A1DAB99090FF D2D2525252EBA9A98080E3A1A1E3EBEBF3080808FF08087B7BD2FF73737373C2 5A5AB9B1B1B1292929FF4242E34242C2C2C2E3E3E3DADAEBF38888FFF3F3EB90 90FF2929FF8888C2C2EBB1B1F3FF5A5AD2D2D2EB4242E34A4A9999F3CCCCF3A1 A1F3C2C2F37373D2FF6B6B8080806B6BC26666CC5252B94A4AB1FF9999B9B9E3 B1B1E3909090B1A9A9FFB9B9D26B6BCC7373212121FF39398080CCE339399999 D29090DAC28080FFCCCC4A4A4AE38080FFEBEBFF2121FF8080F32121B9B9EBFF 52528888D28080DA393939DA4A4A9999E39090EBE3E3F3DADAFFD2D2EBF31010 FFA9A9A1A1A1A9A9DAB99999FFDADA5A5A5A8888E3A9A9E3A1A1EBF3F3F3EBEB FF101010FF10107B7BDA7373CC5A5AC2CCCCCCEBEBEBB9B9F3B1B1FFD2D2F3CC CCFFA9A9F3C2C2FF6B6BCC5252C2D273739999DAC28888F329298888DA9999EB E3E3FF8888EBA9A9EBF3F3FFD2D2FFF7B796FC949005E770C2F0F4F7B82899EB 94F741F7FC9490F7B84E6D892D05E770C2F118F7B77BF741F7FC949003EE8803 D600F713EE00016FF7A2E3007DF1C2F164000FF8DF0008402004F7A3A0C40000 1F200C000FF8000000C4000CC40000DF0008000000F713E22A001EC4000CDEFD 30C2F18CF7A10E03EE8803D60000000305E00FC2F1A800E44A05E0F8000032F7 B9C59A3DEC000030001DE803B600C2F1E000CD7C00000900CD5C000000FF92D0 05E10005E17003B600C2F20400CD7CC2F21000F56A033238FFFFFFC2F2780010 260000300021F9000028FF92D0601232FF94D0FF92A005E100F432F805E100C2 F22C66E8880000006021D3FF92D0F432F805E100C2F26C66E94B00000060D91D>]endobj 45 0 obj <>stream xœí} Oi–¶s1Ónó!H ‚Âf0IX&|&\‡5Ù| .FÁËe@_˜ F€Âm#I‡ÉÆÍF ¼?tÏ9ï¥Þ*@fâäö‚ Æ—AçbSHôïÝœiñ×­ôÆ |E ã‹`c±ªw ~~^±Iäo*ô%1Œ/+óŒÕû'6+6Áö³ò3ßBÁxo¨xÌïŸh‘¿B_ƒÁøhÙXœ{2PÜ]ï÷û»Aø¹«ÁøFp3¸Ÿ u‡zçªxƒñm`3Ä¡ýÅÐB¡¹3…¾ ƒñ…н±ØTõ$„xRÅÓúŒoþ`0^UÕ47×gî3ßî÷nãKñÅ•_ }) ãËâ—¿ßߢ©½×Â`0 ˆë}…¾ƒQT³ø3ß(n3ûŒoÑB_ƒÁ( b· } £0ˆ²ñg0¾MDÙø3ß&˜ü Æ7ŠëìûŒooXúŒoi&?ƒñ­àæó ¿_/äã®ü­µ_ð‚~ëë…¾ã7Ÿ·øWz—:7®|×ùžÔëFþÉ|_ôÒÎÇZÏwTè‹`0þA1S/‰òW6®t^¹Ò Mþëyä_?ðùþ—?× —Âäg0.‰ûÀxã †zõn,Zm;{­Ñ÷ïÿ[È¿ñù²L~ãÒ~'(Ÿ¯P °”?=4NÍ=óù’¨¶]¸Nî–ŠkI2ùŒKÂOt¯j©ðw^¿¡üѨ1©¿•ˆbë»V€ë´aý\^ +?ƒqiÜDÅ‚G3”ñ9¿Yï›üA2ß—ÌØö?˜Ïd“Ù$\+?ƒñˆåïÓÑXçw6å¯Öä§:!YhåÏmõ3@~V~ãó0°Ñ¹!Ž&déO+4:(^S…6‹;Tþ7…¸VDi&›Aîù³>îçg0. g°Sµl!@“äÔÂ/Ò}‚ü€ú@ÿd6+²V~㲘Yê\zNGcADgç†$ÿmÝÑ×*óý¬(ùÔögüÙ üŒÏÅÍÅ`pf—‚ ý@AþÃh4-ϱ+a ~D~¬øù²lûŒÏBïÒâRh³Â_ BÀ Èo ?)¿¦~mf¹ŸM²íg0>þÅx|1¾ø!þ!aø$òGÑ}¨üY‹ý…·ýÄþ$Û~ã³P¬ÿP¯Š ,Å—üףј>¥Õ&üÙB“?+J~äüïòZŒlܯB4‰†ô_ôÓL~cX¿™óg}ÉÆ|ãÚèëöð~*mwwyxïã×p:üëÙY8ŽÐgÚÏú_{jFTüPù“IV~ã3ðóœDÕñ c|Ï|¾?(É—ìÅæøº½©ðþ~d?Lã^ ¯6œÏeÀéò*œFàùRûíkÎó¦J!ßÇFôïÉRw]l\øc0.ŒÇOû逹/GõËQ}IÓö'³è¼3™Tþ—­½ìÚOõS¤û€×ÀíÝÿ>ïçOV‡VOV"«4æá“?^:,ÃÔ¸`þ¸èë“I¿;ãâ(Ö?é}ÒÛ;ÛÜ\SÕDLíóŠQ}¶j?xnâþxžòçºà>)ŒJt&ú¯6ä\|xHpÿ%Š?6éýáKöSvFùýã2é—}D8bò3—¿7ê õÂz‚ìŸû'£Øgé½:H’éGÔ8¾ho>±OÔßGþ*âõONVON]~ûס“!|t?ŒÊOQƒØIì›ç"ùÉ÷Ó ¿lR;òñãRh …B+ÐBž„zç~3 ýF²o R(¿Ãö¯ãß—ôO¡‚£éôzƒ¾çgþ£C#'CC@þW-å—ÒI$Ì€AäÏ’ñÏR¹ß¢>+?ƒqÜX‘Qèý-–Óoúœ@Ê÷3™yÛ×ìu%ÒôƒòHÈW¥ò¯"ÅÚ:424´{‚äÔ틤63¾ùµðgù…+ö2Œ‹âþ€ÄÊÊñÿ/­7¶™õ¾,ÖÝl9n^Ⱦþyð°HãWQ×ÑÞíæì¿ündhw„„ÿääDÿ0±¬? ?|á²uvƒ~Ó÷[®„•ŸÁ¸8~(¦FüýÿÆ›NÛïÓõ>‡ò¿ÝGîKáO…SaUëá‚ ŒüjûáW#€¡]Š (þ»ïÎPýQù÷¥ö'ö­Ó…ògÇůÓ0ëêXùŒ‹ãfw1Bñ`eÓxÓÅô'E_ßxÖ$s‚È¿¿Of=œŠDVwÏ^*ú½GvGFliÿè±DP_†½³U•õ§(–XÒß  ~Ö0V~ãsð˜È?V,B¿ÅxÓ-çÝüY[Á¯Qr;ùQ¶w‰æ¹_¥ðCÊOLkþð[úÓ‰ ÿOê¯Ã`üçUo_"ѧËj–Ä_¬èa]+?ƒqq<öuwûíÊŸWíOf{¨ânöóß½Šäߗ‰h½>¢Z?æûCÄSú‡FýÉõ[oìb¹ÈIääe¿êÓ0®ËýjjU‹`åg0.·€äÿ@…ñ^žîõ³Rû Û?Ü¿ M°×zg;ù‡PÞIù²ÞÙCê¿Bã?tbô…_î6ŒöŸ:û¦ˆúBû1Ð"ž¬ü ÆgÀß]è®Gþ#û7'´›å>_6LÿÞÕ« I}ª÷åŒ÷ND±ì=ÁzãT ?ÕûOÞ}âÅjî ågÅg0.çâ›þz’ÿâ çZ åÙÏ¿Qgâ*¥ü²à×`¾Òä¦b?°ý­¥ð¹·Èþ·ôŽóý„é´˜‡œØ×ƒ¦Ÿ'ô0Ÿ¿±¼¿ ù³¦ïÏŸÏ?ÂÒ/¹i6ß;¥þ!)ü#µÞQÊ/»úWëg££Ín£€ Èr¿˜Ù“dåg0>é3Ù_ßíF~£“?ébûß_¥”_VüÃ~¥ò á7ëýôRÒÿDŒðÇ©½‘ðnÿiUc|Øö3Ÿ‹XßðþŸ-úÍ8O±­á—Í_Ìc„_Ò?’Ûß=#é—"ÿÖHúÿ›Ê}¤üb€¿œÜüO¥vïæ\/7#†øeiF?Oèa0.ëÑ´wÂoÙŸ¯üz4 ÖûòÉß|ÕÈù#‘HûIûnûî¶³wgTî“Å~hVfŸÃ”_)ÿÍ ¾4-(Ùop+ŒÓ¼½€/“ŸÁ¸q±®–– „fÿŒó,Û~.ä§^þ„®ö›Ëøà„>Tþ!9Êgä­Áè¿êœ_ð%åËñ½)ç„~‚ZɇÆösÎÏ`\bîîf ÂbÿŒó´‘¿áêUQï¾GçÍÓ}ò“!1ÆG)¿9ÌÇÈù‡TÒ/föÐJ@ûûgy—lüàjšóN`0‡\¤s`ÐßüY‹û.ýüS ´ýªÚŸ@ÛNÚ/çõœ¨‚ñß\ÐkïJùMåˆ~`üö^C„îê˰ò3—…Z¤³bsSð_°¿þ†óDSùÝ ~ V¹’~þ”X¿/,øIåG¡·­æ·÷VŒÔ·ôÐËy8Ù­”?Ë9?ƒqY(î?ž©ûÏU~Ëõ»ÙþI³Ú/&öÐ^±Ž‡˜²«¤ß¾”gî?‡dÊ¿z"‚)D(?.äçø­ŒZÊGäülûŒ ã0z]ùgff*Èúûgœ§ZÕ~*÷çð›Õ~k”ϼ´ý‘°š×£êýNò{½§ÿI¿Ö}±–Ìùû Ǩ}]ìϰò3—BßmuWŽŸgfn û+Ðø»“ß>³'o„_s¾ò‹¥|(é²ÿ<ò{ñž# ü/UüHøi^ŸsÔÀ¸X»;ÃÕ~ã’°îÁûóù'>Jþlþ:E??P_Tûç§§kÐöâpÎõœ¿;‘®^ÌçO!õ÷‰œíùÊß®gõ‘úæÊ{©ˆUïK$–moÊÛu‰A>¬ü ÆE¡ïŸ®æÆïåüëæb^Ùd&ï뎤í—+ùØjt¹ß£»wz:<üÓÙÙªÉâZ¾“ï†ï´/ù›‘KyHåŸü¤ÿ\ƒ!q]õñ#€ø7ˆûçVû¬•2if ꃜu ñ“S{‘ý~ãûXÆ;ûixô•}a®W¿þôŽº÷iBϪ¹’O¿Èùé ¯:rþ.P~ZFL(¿ìyàî~ãÓPm¸þDz§]ÿ„ë¿ucJ/®Ü]:utw»+c¸ûVáûåœÞýˆõVƒ^»ŸîÌ1¢~{ÿðoâ^]«ÏDÂäÏÙ®¥±Tß±'‰~¤±}ª6yð·øWa0¾ÜÖwáõz®æ›ÂŸ?¯Ù6+í=Xt›²ÎÈIòÓHŸÈ~*%Ù¿&‡í…Qßi!ÏœúÈ«= Ÿ`Ý‘{]?Ú~rýÖÚÝ„F½x¯yûàäßè†ÁøÊÑ­¶Rþ_**Ôð^Êøëýÿ7ï>›ôc;ÊïkãŒvs˜ÎÇ 7Œö¾”ÔÇÁ{â†\Æ*^'CrmO9£'<šÃ?ï5¤tOÖûS{ÚEO_FŒñÑø[þó0_/Ž>ïÍŠMIý‰s¦ôz3ö™=”rÛoו벆øÒŒ~q“nû}ºWmkôâÊž«òîÜrdßnûnX ðÙÜ/áè7œ”Â/”_oÓã«EµYïÚcÓsúüÝ3y¨±I?òÍ·mÎÍ‘îí£Ûõí«™}4Ä_êÿÉIÎøDîäÄä¾ÝgõóEð wíWâmÜÇ‘ý>¾cƒqA˜äÿ¹¥E®å1¡–ñšÉûÀ¤©üú>½öþþvYò»º/²~âp8bQ(n/Üë„_Ýw>¢—ñÀé¼h$rÎk—Âï3oÒËýý Æ'!jÿ—‰–‰½ŠW½¿¾Û…ü9Û=»ô}zí'Í'(ë$ôr>á”pþ’ú«Î¹w«Öd¾°^ÄCÌé‘ý|ùƒZ³êf]jØnÜßÏ`| ¢FOß ÿ6Å}¼oOÞžŽå<|IºQ¯“ü¹°ãK¦ù}b–®S÷»V¾§¤ÂÒò§h= ü®¿æ}Ä»7žµ:ú4Ú?÷ß„Áø&`*ÿ¦céÞn—›vÞ›Ê/´?›qŽá?KÐðþ«2éW{åb~n#ýÞ™sø#j6_Šfó%ö#®“&3bÙn›i½ü¿ƒñ á¶EþÇzÝîz¡ûn·ëäžÔ÷ɂ޸º£ÒËôòNÝ)¹œW$üSÎõRŽ„á§•»ÂF­…?õNy±Ž‡-áQ> ƧÀPþ›@yâ=4y«¾üu"r]û‘üI`¿Ë Úá”è—Py?!Ü;÷bFOÔŠ½ÒóGhh_äìü¹“ìp°i?“ŸÁøD«£êf-HzÁüzy—î7åÕd²–öÌ¿vP:ÚŽºäO…çwï~däýéðÙ‰òü4¶/uÒ_°aªÖ”ýÄñòƒß?ŸÁ`bzxïc}{nIý±âWå>>::ZoþØŒýWk¯ÖÄj>Ÿ|Qê§á½Â\^Î'žÎ`0ƒQq·¯÷—n…1BqñÀÀÊïŸÁ`üCã ø~q´9f˜Ügò3_/¢Ñè!î×kæ÷WZ }y ãï…ê¨XÊç9¾˜hOªÜ…˜ü ÆW‹¾¨ä7t/–¢~Áäg0¾^û¯{½cHxE|IýÞ¹‰B_ƒÁø»!Åš_Eh%´‚¬³/˜êí›cåg0¾b ‚ôGBÈþf>P¸ÏÊÏ`|ÕÀ¬ÿ@wÚˆø`ø‘úMMþB_ƒÁø{¥ÿ7ú^¤}¯Ð|ä~0(ˆÇk  Ø`D‡öí×­ØÚ·Û[U;/$`4 ‡ý1íÙ÷hýÿÄÿm1¸ º¿|'€þz«îá`90>FB=»S‚ìóîÌvô:hØp%FŠ’ÙXÚOe-#¯C;à-¸³0ˆ~¿£Ž–¯ë0Ïi[hÃìÂû¢Òƒ!¡­r– ±J¢}Y]ú‚­…E”Q<ž‹åü–æ›Òo ì™MÐ<½G> }®öŸ>85èoñœ8ß¼ö Ù­h¿$‡‡ØÐ¬K7 Žá@÷©MXE÷#hÃJûG%ñiwËlŠñ¸5yKcRøIý~;é—÷‘ößOM‚ðO~?e6EðÈ{`?6ê#í[‘îÛí†%  6¤=vÏZ%ÿéÙ >0_qý˜žk„-˜·”ŸœB#n©šFxn´¸ßˆÜo´´ß&þëkmD×Ú ŽDÄGšÙáàGhHtr?RC¼/ŦP|—dÇnÄthÁ}â|¾ê)U„—ÜïÁ嬀ö¸¨º‚,nÂøp‡/ðöZ´è…XçÒ"ÿÅÅ¥xü7,ûýWÓ"ÙýÅÅà´ ù©Âm«{8‹‘òw$?p\áNݬ`{Ñ2à¡é‚ž:.£W]ûï -ðUvà7¥á é“uóœ’_Í=ôõÓ 1V½;++ñ¯áÃø±jØÅ.B}—(3viÒ~öôþÁyÚo×} þÞšMøÅ4gü›=pŠ?i¿Hš…ðÛÄŸ( •²¥ûÃnÀÝ~up«ßˆyªßO´¿µ,èkR‡bÿÔÔ䔡ü¦P1`Usaý¿ßކ͖´£êߤð‹½]÷Qõå^„€VKôÿÏ5ØTN`—}|Týy¢;<”ú7ZÍzì'í·YýÒ5°é>„‚kZ÷1àëT@(ÿÔý§OÇŸ"åi/--5%ßd$  ‚~´ÿúÔ”ð‹-ké?ŸêÿúǽKAäz$þŽþöaì>¼ ;ƒ6ò— ¦nÕŸ1⸠‘gyžö*ëLò×S…š;•m·­c«Þh¥çE>ùÓm•Èö¨`;üNG”XN¢m–ªJ ñ³fÁàSèoùý\^[ÚEûÅÞ]û ö›ªoj¿®4ÛËk¦ò?²ë¾Ò~Cù×µÝ?’H?,µ_‰¿Cûï’ðdXÖz/›¤~¿aü%ó—…ç—Ú?)ÔßÔ} (÷ úÀý)Ãú;tÉßÞJÛ¶!üZ÷Û¡µ¶Ãó±6Rú•ë—–_ÿXk¿|¨ÂÀ<ÑÞR~“þ û5]`ìÊoñ^»WíWºÄ¿&ŒÿS²ü:ï?Ê/Ô_˜~|HÖKá—q€èýC)Ñ^k¿f¿”~8øAZ±vµd~’¨/´ö —Ÿ•¼'êÓß²šüõÀsäz0ø¯ÿGûýñ½Øè„f#êô½Ù鯄ò{ªù%ëbH¢K ò÷É¿Ùu\uü-²ÇŠ®ÏzòÈß7}{‡¾IüŠ·dzº#`½”D¼úð½@삾ߌ.Å?þ¼"à=öÎ×þ½SS÷Úß,ÙeßEù­ò_3é¾~<Àl)¿®Ú]­ûÃ:ëwhÿ­~Cùïjí_6ó}ñ÷kí—•ïʯ´_Å€×È{tû–÷ÝŸ²åû¢¡÷Ý*”¿µÝ,á[[-ÁoÕOZûI÷üHÿg†æ«ä=¥ü˜üká×A e…€®FWt5v]k¼ÖUÛu­ËUûµî“í¿&…_Š>=¿Mè?E’~ÓúK`©öãš÷ãvíÏëïùAi&©š¢¿ÔþŒÖ~"¾Èõ³Û X ±òG4ÿÑ¿,mtv¯t^±‘ŸJóŽ-¨¬M“Á®ö´íx0 zh7íÑl‘ßëé»;1›'­óp£Eõ‹Ù<òÇ*ËËMò{^D©œ¯È§:–Æ«óP ©óô]LùÍBŸ“úJûEÕ/m¯ùS;GûAùO䷴ߪó­iöËðHª¿¡ÿGÍ–ö7«¼_è¾,õ©@0_i¿æ¿%ýH}þ»†õy¿~Ò}§òkö[¼'íŸt~Ù€1€lD€©ísŠ}ÛDúvÊûÛ-í?&ío•vÍ¿`¾!ýó¸ÕKÅ—ûg¦öÏ+áGç¯6Óù§„ô7Ú­€Úk°á£K‰¿Mû­Œ™MýI÷§ïÔíéSÅþ[ѯÔHdª?Žâ/ÆõÇ•ç_ú„Û·©D⟥[júä--Í‚ßãP'ð|ã xüà*þŸ¢èþ£þËÿÿ°ñ ºïknm"}O“òƒ°W")Óƒ“-$#ïê<1'ùït”‹à±Yzñf]™†(ìÚòÈuJÛeRoYâ xÚðc垎 uõÙ‚€KÏŸ—”ß)þB÷õ]´ß©ûμÿ•tkpdïÌKüåi¿Ðÿõ#;ý…0µßVï7´_øÿ~³âÒ¯u_)¿ ·–ÏÑþ)ËX1à{¡ý´ÕñÚöŸ„[$þöÎ@$;Ðÿeë±ØTõï™,ø¡òߟKñŸ¯12~É|!ùêXûS5–æKÆ+÷/F¨íïß…´wA+hç/»~|o6Jd’þ÷¥FÞ/CÀ¸¦©©û¢Ê/{þ¤ ûb‹¼3¬Tÿ¬ ½Èû…óÏêq×¹•.@ü?ß²qeãÊ•ÎNÜÑ3Ä‚¥ùcuTàv´Z÷»‰ìÚã½#l¬ˆXX$U˜̦¤Ü´ý^ÙùîU¹|ò£“Ç‚ßV>ùÛ:›–Ah:0h¼„ÏâW÷Űᢠûí!À .Í=çGíß;gðO>ý8JþÍkhûÖ_Ëÿš~›ö«´ÝMùlõþa©ûŽa?*Õ¿%^P@‰ÿ¤j’úùÚ?µl)ÿ¤*øOé^?5ö=?Ù}cô=(Û/ˆ/°-+ôLº/©ÿRåüÊjŽçIúíŸÊ/çµù¯‘Ù¾­æ§´^°¿F¿@î×BÂÔ'þ»û±èÿãÁ5£äoÚcèÏ{½·[YúÏH¿/[©æ½Ùß/¸}~=¢¨€LþÅÞÒ~!öº»ÏVðc˜’ïJû´-íÇç´QíÏÙ´_qÝÅø“'x`y¿ÃøËœ_ê>>ÖuÙïÐ…ß>pØÔKû‡UÍßÈûupKÕþßAøûoYù¾Nío˜4h?)Šþ“†ðË1>$ýTó±À>þOdþdÿ[·[e ÀìÓ. ~/)÷©„_Sÿeÿ ÿŠþRþíÊߨò~Êú)é@•üæÍ í>\#×ßEY?…gÚoØ~=ÔGþM²_û\¤ýOu¹ÏðýôœQIáû5ý3Õá×#R~â;²_åüTû3 R¤ü¢»O0ßÇ÷±wEîñ7µÏÒþ:ówjÿš«ö»´WfÞoô£@Ð,¿ììü_äû‚þ„ñu‡ö÷ëš¿‘÷[)¿½Ãó}cدCÿyÿ”îó³úù•ù—%ÿ)ìé{=eËù ío•UÿV™ðËÑ>ªòGy»RûgÇVŸŽç­¿Çbä¯ÕõW£³ÿFÕÝ'Jïßj÷Iþ‰÷Ž´ëý.ôWÂ/ºûóéo9Ô~‹ýV©Ÿ^«:¿òšû2ûÏHÐ#¶¬ä~ÖªøgDÕ¯ÇR~à'ºûðQhž1 ƒÁ`0 ƒÁ`0 ƒÁø\üƒÔ endstream endobj 50 0 obj <> endobj 51 0 obj <> endobj 52 0 obj <> endobj 57 0 obj [/Indexed /DeviceRGB 255 <000000FF00006B6BD2FFFFFF666666FF66667B7B7B6666C24A4AB96B6B6B4242 B1F30000FF9090B1B1DA888888737373B1A1A1FFB1B1CC6B6B181818FF33337B 7BCC6666B9E33333B9B9B99090D2DADADA8888CCB98888FFC2C2424242E37B7B FFE3E3DA9999FF1818FF7B7BEB2121B1B1EBFF4A4A8080D2C2C2E3A9A9A93333 33F33333D252529090E3DADAF3CCCCEBEB1818FFA1A1999999A1A1DAB99090FF D2D2525252EBA9A98080E3A1A1E3EBEBF3080808FF08087B7BD2FF73737373C2 5A5AB9B1B1B1292929FF4242E34242C2C2C2E3E3E3DADAEBF38888FFF3F3EB90 90FF2929FF8888C2C2EBB1B1F3FF5A5AD2D2D2EB4242E34A4A9999F3CCCCF3A1 A1F3C2C2F37373D2FF6B6B8080806B6BC26666CC5252B94A4AB1FF9999B9B9E3 B1B1E3909090B1A9A9FFB9B9D26B6BCC7373212121FF39398080CCE339399999 D29090DAC28080FFCCCC4A4A4AE38080FFEBEBFF2121FF8080F32121B9B9EBFF 52528888D28080DA393939DA4A4A9999E39090EBE3E3F3DADAFFD2D2EBF31010 FFA9A9A1A1A1A9A9DAB99999FFDADA5A5A5A8888E3A9A9E3A1A1EBF3F3F3EBEB FF101010FF10107B7BDA7373CC5A5AC2CCCCCCEBEBEBB9B9F3B1B1FFD2D2F3CC CCFFA9A9F3C2C2FF6B6BCC5252C2D273739999DAC28888F329298888DA9999EB E3E3FF8888EBA9A9EBF3F3FFD2D2FFF7B796FC949005E770C2F0F4F7B82899EB 94F741F7FC9490F7B84E6D892D05E770C2F118F7B77BF741F7FC949003EE8803 D600F713EE00016FF7A2E3007DF1C2F164000FF8DF0008402004F7A3A0C40000 1F200C000FF8000000C4000CC40000DF0008000000F713E22A001EC4000CDEFD 30C2F18CF7A10E03EE8803D60000000305E00FC2F1A800E44A05E0F8000032F7 B9C59A3DEC000030001DE803B600C2F1E000CD7C00000900CD5C000000FF92D0 05E10005E17003B600C2F20400CD7CC2F21000F56A033238FFFFFFC2F2780010 260000300021F9000028FF92D0601232FF94D0FF92A005E100F432F805E100C2 F22C66E8880000006021D3FF92D0F432F805E100C2F26C66E94B00000060D91D>]endobj 56 0 obj <>stream xœí} Oi–¶s1Ónó!H ‚Âf0IX&|&\‡5Ù| .FÁËe@_˜ F€Âm#I‡ÉÆÍF ¼?tÏ9ï¥Þ*@fâäö‚ Æ—AçbSHôïÝœiñ×­ôÆ |E ã‹`c±ªw ~~^±Iäo*ô%1Œ/+óŒÕû'6+6Áö³ò3ßBÁxo¨xÌïŸh‘¿B_ƒÁøhÙXœ{2PÜ]ï÷û»Aø¹«ÁøFp3¸Ÿ u‡zçªxƒñm`3Ä¡ýÅÐB¡¹3…¾ ƒñ…н±ØTõ$„xRÅÓúŒoþ`0^UÕ47×gî3ßî÷nãKñÅ•_ }) ãËâ—¿ßߢ©½×Â`0 ˆë}…¾ƒQT³ø3ß(n3ûŒoÑB_ƒÁ( b· } £0ˆ²ñg0¾MDÙø3ß&˜ü Æ7ŠëìûŒooXúŒoi&?ƒñ­àæó ¿_/äã®ü­µ_ð‚~ëë…¾ã7Ÿ·øWz—:7®|×ùžÔëFþÉ|_ôÒÎÇZÏwTè‹`0þA1S/‰òW6®t^¹Ò Mþëyä_?ðùþ—?× —Âäg0.‰ûÀxã †zõn,Zm;{­Ñ÷ïÿ[È¿ñù²L~ãÒ~'(Ÿ¯P °”?=4NÍ=óù’¨¶]¸Nî–ŠkI2ùŒKÂOt¯j©ðw^¿¡üѨ1©¿•ˆbë»V€ë´aý\^ +?ƒqiÜDÅ‚G3”ñ9¿Yï›üA2ß—ÌØö?˜Ïd“Ù$\+?ƒñˆåïÓÑXçw6å¯Öä§:!YhåÏmõ3@~V~ãó0°Ñ¹!Ž&déO+4:(^S…6‹;Tþ7…¸VDi&›Aîù³>îçg0. g°Sµl!@“äÔÂ/Ò}‚ü€ú@ÿd6+²V~㲘Yê\zNGcADgç†$ÿmÝÑ×*óý¬(ùÔögüÙ üŒÏÅÍÅ`pf—‚ ý@AþÃh4-ϱ+a ~D~¬øù²lûŒÏBïÒâRh³Â_ BÀ Èo ?)¿¦~mf¹ŸM²íg0>þÅx|1¾ø!þ!aø$òGÑ}¨üY‹ý…·ýÄþ$Û~ã³P¬ÿP¯Š ,Å—üףј>¥Õ&üÙB“?+J~äüïòZŒlܯB4‰†ô_ôÓL~cX¿™óg}ÉÆ|ãÚèëöð~*mwwyxïã×p:üëÙY8ŽÐgÚÏú_{jFTüPù“IV~ã3ðóœDÕñ c|Ï|¾?(É—ìÅæøº½©ðþ~d?Lã^ ¯6œÏeÀéò*œFàùRûíkÎó¦J!ßÇFôïÉRw]l\øc0.ŒÇOû逹/GõËQ}IÓö'³è¼3™Tþ—­½ìÚOõS¤û€×ÀíÝÿ>ïçOV‡VOV"«4æá“?^:,ÃÔ¸`þ¸èë“I¿;ãâ(Ö?é}ÒÛ;ÛÜ\SÕDLíóŠQ}¶j?xnâþxžòçºà>)ŒJt&ú¯6ä\|xHpÿ%Š?6éýáKöSvFùýã2é—}D8bò3—¿7ê õÂz‚ìŸû'£Øgé½:H’éGÔ8¾ho>±OÔßGþ*âõONVON]~ûס“!|t?ŒÊOQƒØIì›ç"ùÉ÷Ó ¿lR;òñãRh …B+ÐBž„zç~3 ýF²o R(¿Ãö¯ãß—ôO¡‚£éôzƒ¾çgþ£C#'CC@þW-å—ÒI$Ì€AäÏ’ñÏR¹ß¢>+?ƒqÜX‘Qèý-–Óoúœ@Ê÷3™yÛ×ìu%ÒôƒòHÈW¥ò¯"ÅÚ:424´{‚äÔ틤63¾ùµðgù…+ö2Œ‹âþ€ÄÊÊñÿ/­7¶™õ¾,ÖÝl9n^Ⱦþyð°HãWQ×ÑÞíæì¿ündhw„„ÿääDÿ0±¬? ?|á²uvƒ~Ó÷[®„•ŸÁ¸8~(¦FüýÿÆ›NÛïÓõ>‡ò¿ÝGîKáO…SaUëá‚ ŒüjûáW#€¡]Š (þ»ïÎPýQù÷¥ö'ö­Ó…ògÇůÓ0ëêXùŒ‹ãfw1Bñ`eÓxÓÅô'E_ßxÖ$s‚È¿¿Of=œŠDVwÏ^*ú½GvGFliÿè±DP_†½³U•õ§(–XÒß  ~Ö0V~ãsð˜È?V,B¿ÅxÓ-çÝüY[Á¯Qr;ùQ¶w‰æ¹_¥ðCÊOLkþð[úÓ‰ ÿOê¯Ã`üçUo_"ѧËj–Ä_¬èa]+?ƒqq<öuwûíÊŸWíOf{¨ânöóß½Šäߗ‰h½>¢Z?æûCÄSú‡FýÉõ[oìb¹ÈIääe¿êÓ0®ËýjjU‹`åg0.·€äÿ@…ñ^žîõ³Rû Û?Ü¿ M°×zg;ù‡PÞIù²ÞÙCê¿Bã?tbô…_î6ŒöŸ:û¦ˆúBû1Ð"ž¬ü ÆgÀß]è®Gþ#û7'´›å>_6LÿÞÕ« I}ª÷åŒ÷ND±ì=ÁzãT ?ÕûOÞ}âÅjî ågÅg0.çâ›þz’ÿâ çZ åÙÏ¿Qgâ*¥ü²à×`¾Òä¦b?°ý­¥ð¹·Èþ·ôŽóý„é´˜‡œØ×ƒ¦Ÿ'ô0Ÿ¿±¼¿ ù³¦ïÏŸÏ?ÂÒ/¹i6ß;¥þ!)ü#µÞQÊ/»úWëg££Ín£€ Èr¿˜Ù“dåg0>é3Ù_ßíF~£“?ébûß_¥”_VüÃ~¥ò á7ëýôRÒÿDŒðÇ©½‘ðnÿiUc|Øö3Ÿ‹XßðþŸ-úÍ8O±­á—Í_Ìc„_Ò?’Ûß=#é—"ÿÖHúÿ›Ê}¤üb€¿œÜüO¥vïæ\/7#†øeiF?Oèa0.ëÑ´wÂoÙŸ¯üz4 ÖûòÉß|ÕÈù#‘HûIûnûî¶³wgTî“Å~hVfŸÃ”_)ÿÍ ¾4-(Ùop+ŒÓ¼½€/“ŸÁ¸q±®–– „fÿŒó,Û~.ä§^þ„®ö›Ëøà„>Tþ!9Êgä­Áè¿êœ_ð%åËñ½)ç„~‚ZɇÆösÎÏ`\bîîf ÂbÿŒó´‘¿áêUQï¾GçÍÓ}ò“!1ÆG)¿9ÌÇÈù‡TÒ/föÐJ@ûûgy—lüàjšóN`0‡\¤s`ÐßüY‹û.ýüS ´ýªÚŸ@ÛNÚ/çõœ¨‚ñß\ÐkïJùMåˆ~`üö^C„îê˰ò3—…Z¤³bsSð_°¿þ†óDSùÝ ~ V¹’~þ”X¿/,øIåG¡·­æ·÷VŒÔ·ôÐËy8Ù­”?Ë9?ƒqY(î?ž©ûÏU~Ëõ»ÙþI³Ú/&öÐ^±Ž‡˜²«¤ß¾”gî?‡dÊ¿z"‚)D(?.äçø­ŒZÊGäülûŒ ã0z]ùgff*Èúûgœ§ZÕ~*÷çð›Õ~k”ϼ´ý‘°š×£êýNò{½§ÿI¿Ö}±–Ìùû Ǩ}]ìϰò3—BßmuWŽŸgfn û+Ðø»“ß>³'o„_s¾ò‹¥|(é²ÿ<ò{ñž# ü/UüHøi^ŸsÔÀ¸X»;ÃÕ~ã’°îÁûóù'>Jþlþ:E??P_Tûç§§kÐöâpÎõœ¿;‘®^ÌçO!õ÷‰œíùÊß®gõ‘úæÊ{©ˆUïK$–moÊÛu‰A>¬ü ÆE¡ïŸ®æÆïåüëæb^Ùd&ï뎤í—+ùØjt¹ß£»wz:<üÓÙÙªÉâZ¾“ï†ï´/ù›‘KyHåŸü¤ÿ\ƒ!q]õñ#€ø7ˆûçVû¬•2if ꃜu ñ“S{‘ý~ãûXÆ;ûixô•}a®W¿þôŽº÷iBϪ¹’O¿Èùé ¯:rþ.P~ZFL(¿ìyàî~ãÓPm¸þDz§]ÿ„ë¿ucJ/®Ü]:utw»+c¸ûVáûåœÞýˆõVƒ^»ŸîÌ1¢~{ÿðoâ^]«ÏDÂäÏÙ®¥±Tß±'‰~¤±}ª6yð·øWa0¾ÜÖwáõz®æ›ÂŸ?¯Ù6+í=Xt›²ÎÈIòÓHŸÈ~*%Ù¿&‡í…Qßi!ÏœúÈ«= Ÿ`Ý‘{]?Ú~rýÖÚÝ„F½x¯yûàäßè†ÁøÊÑ­¶Rþ_**Ôð^Êøëýÿ7ï>›ôc;ÊïkãŒvs˜ÎÇ 7Œö¾”ÔÇÁ{â†\Æ*^'CrmO9£'<šÃ?ï5¤tOÖûS{ÚEO_FŒñÑø[þó0_/Ž>ïÍŠMIý‰s¦ôz3ö™=”rÛoו벆øÒŒ~q“nû}ºWmkôâÊž«òîÜrdßnûnX ðÙÜ/áè7œ”Â/”_oÓã«EµYïÚcÓsúüÝ3y¨±I?òÍ·mÎÍ‘îí£Ûõí«™}4Ä_êÿÉIÎøDîäÄä¾ÝgõóEð wíWâmÜÇ‘ý>¾cƒqA˜äÿ¹¥E®å1¡–ñšÉûÀ¤©üú>½öþþvYò»º/²~âp8bQ(n/Üë„_Ýw>¢—ñÀé¼h$rÎk—Âï3oÒËýý Æ'!jÿ—‰–‰½ŠW½¿¾Û…ü9Û=»ô}zí'Í'(ë$ôr>á”pþ’ú«Î¹w«Öd¾°^ÄCÌé‘ý|ùƒZ³êf]jØnÜßÏ`| ¢FOß ÿ6Å}¼oOÞžŽå<|IºQ¯“ü¹°ãK¦ù}b–®S÷»V¾§¤ÂÒò§h= ü®¿æ}Ä»7žµ:ú4Ú?÷ß„Áø&`*ÿ¦céÞn—›vÞ›Ê/´?›qŽá?KÐðþ«2éW{åb~n#ýÞ™sø#j6_Šfó%ö#®“&3bÙn›i½ü¿ƒñ á¶EþÇzÝîz¡ûn·ëäžÔ÷ɂ޸º£ÒËôòNÝ)¹œW$üSÎõRŽ„á§•»ÂF­…?õNy±Ž‡-áQ> ƧÀPþ›@yâ=4y«¾üu"r]û‘üI`¿Ë Úá”è—Py?!Ü;÷bFOÔŠ½ÒóGhh_äìü¹“ìp°i?“ŸÁøD«£êf-HzÁüzy—î7åÕd²–öÌ¿vP:ÚŽºäO…çwï~däýéðÙ‰òü4¶/uÒ_°aªÖ”ýÄñòƒß?ŸÁ`bzxïc}{nIý±âWå>>::ZoþØŒýWk¯ÖÄj>Ÿ|Qê§á½Â\^Î'žÎ`0ƒQq·¯÷—n…1BqñÀÀÊïŸÁ`üCã ø~q´9f˜Ügò3_/¢Ñè!î×kæ÷WZ }y ãï…ê¨XÊç9¾˜hOªÜ…˜ü ÆW‹¾¨ä7t/–¢~Áäg0¾^û¯{½cHxE|IýÞ¹‰B_ƒÁø»!Åš_Eh%´‚¬³/˜êí›cåg0¾b ‚ôGBÈþf>P¸ÏÊÏ`|ÕÀ¬ÿ@wÚˆø`ø‘úMMþB_ƒÁø{¥ÿ7ú^¤}¯Ð|ä~0(ˆÇk  Ø`D‡öí×­ØÚ·Û[U;/$`4 ‡ý1íÙ÷hýÿÄÿm1¸ º¿|'€þz«îá`90>FB=»S‚ìóîÌvô:hØp%FŠ’ÙXÚOe-#¯C;à-¸³0ˆ~¿£Ž–¯ë0Ïi[hÃìÂû¢Òƒ!¡­r– ±J¢}Y]ú‚­…E”Q<ž‹åü–æ›Òo ì™MÐ<½G> }®öŸ>85èoñœ8ß¼ö Ù­h¿$‡‡ØÐ¬K7 Žá@÷©MXE÷#hÃJûG%ñiwËlŠñ¸5yKcRøIý~;é—÷‘ößOM‚ðO~?e6EðÈ{`?6ê#í[‘îÛí†%  6¤=vÏZ%ÿéÙ >0_qý˜žk„-˜·”ŸœB#n©šFxn´¸ßˆÜo´´ß&þëkmD×Ú ŽDÄGšÙáàGhHtr?RC¼/ŦP|—dÇnÄthÁ}â|¾ê)U„—ÜïÁ嬀ö¸¨º‚,nÂøp‡/ðöZ´è…XçÒ"ÿÅÅ¥xü7,ûýWÓ"ÙýÅÅà´ ù©Âm«{8‹‘òw$?p\áNݬ`{Ñ2à¡é‚ž:.£W]ûï -ðUvà7¥á é“uóœ’_Í=ôõÓ 1V½;++ñ¯áÃø±jØÅ.B}—(3viÒ~öôþÁyÚo×} þÞšMøÅ4gü›=pŠ?i¿Hš…ðÛÄŸ( •²¥ûÃnÀÝ~up«ßˆyªßO´¿µ,èkR‡bÿÔÔ䔡ü¦P1`Usaý¿ßކ͖´£êߤð‹½]÷Qõå^„€VKôÿÏ5ØTN`—}|Týy¢;<”ú7ZÍzì'í·YýÒ5°é>„‚kZ÷1àëT@(ÿÔý§OÇŸ"åi/--5%ßd$  ‚~´ÿúÔ”ð‹-ké?ŸêÿúǽKAäz$þŽþöaì>¼ ;ƒ6ò— ¦nÕŸ1⸠‘gyžö*ëLò×S…š;•m·­c«Þh¥çE>ùÓm•Èö¨`;üNG”XN¢m–ªJ ñ³fÁàSèoùý\^[ÚEûÅÞ]û ö›ªoj¿®4ÛËk¦ò?²ë¾Ò~Cù×µÝ?’H?,µ_‰¿Cûï’ðdXÖz/›¤~¿aü%ó—…ç—Ú?)ÔßÔ} (÷ úÀý)Ãú;tÉßÞJÛ¶!üZ÷Û¡µ¶Ãó±6Rú•ë—–_ÿXk¿|¨ÂÀ<ÑÞR~“þ û5]`ìÊoñ^»WíWºÄ¿&ŒÿS²ü:ï?Ê/Ô_˜~|HÖKá—q€èýC)Ñ^k¿f¿”~8øAZ±vµd~’¨/´ö —Ÿ•¼'êÓß²šüõÀsäz0ø¯ÿGûýñ½Øè„f#êô½Ù鯄ò{ªù%ëbH¢K ò÷É¿Ùu\uü-²ÇŠ®ÏzòÈß7}{‡¾IüŠ·dzº#`½”D¼úð½@삾ߌ.Å?þ¼"à=öÎ×þ½SS÷Úß,ÙeßEù­ò_3é¾~<Àl)¿®Ú]­ûÃ:ëwhÿ­~Cùïjí_6ó}ñ÷kí—•ïʯ´_Å€×È{tû–÷ÝŸ²åû¢¡÷Ý*”¿µÝ,á[[-ÁoÕOZûI÷üHÿg†æ«ä=¥ü˜üká×A e…€®FWt5v]k¼ÖUÛu­ËUûµî“í¿&…_Š>=¿Mè?E’~ÓúK`©öãš÷ãvíÏëïùAi&©š¢¿ÔþŒÖ~"¾Èõ³Û X ±òG4ÿÑ¿,mtv¯t^±‘ŸJóŽ-¨¬M“Á®ö´íx0 zh7íÑl‘ßëé»;1›'­óp£Eõ‹Ù<òÇ*ËËMò{^D©œ¯È§:–Æ«óP ©óô]LùÍBŸ“úJûEÕ/m¯ùS;GûAùO䷴ߪó­iöËðHª¿¡ÿGÍ–ö7«¼_è¾,õ©@0_i¿æ¿%ýH}þ»†õy¿~Ò}§òkö[¼'íŸt~Ù€1€lD€©ísŠ}ÛDúvÊûÛ-í?&ío•vÍ¿`¾!ýó¸ÕKÅ—ûg¦öÏ+áGç¯6Óù§„ô7Ú­€Úk°á£K‰¿Mû­Œ™MýI÷§ïÔíéSÅþ[ѯÔHdª?Žâ/ÆõÇ•ç_ú„Û·©D⟥[júä--Í‚ßãP'ð|ã xüà*þŸ¢èþ£þËÿÿ°ñ ºïknm"}O“òƒ°W")Óƒ“-$#ïê<1'ùït”‹à±Yzñf]™†(ìÚòÈuJÛeRoYâ xÚðc垎 uõÙ‚€KÏŸ—”ß)þB÷õ]´ß©ûμÿ•tkpdïÌKüåi¿Ðÿõ#;ý…0µßVï7´_øÿ~³âÒ¯u_)¿ ·–ÏÑþ)ËX1à{¡ý´ÕñÚöŸ„[$þöÎ@$;Ðÿeë±ØTõï™,ø¡òߟKñŸ¯12~É|!ùêXûS5–æKÆ+÷/F¨íïß…´wA+hç/»~|o6Jd’þ÷¥FÞ/CÀ¸¦©©û¢Ê/{þ¤ ûb‹¼3¬Tÿ¬ ½Èû…óÏêq×¹•.@ü?ß²qeãÊ•ÎNÜÑ3Ä‚¥ùcuTàv´Z÷»‰ìÚã½#l¬ˆXX$U˜̦¤Ü´ý^ÙùîU¹|ò£“Ç‚ßV>ùÛ:›–Ah:0h¼„ÏâW÷Űᢠûí!À .Í=çGíß;gðO>ý8JþÍkhûÖ_Ëÿš~›ö«´ÝMùlõþa©ûŽa?*Õ¿%^P@‰ÿ¤j’úùÚ?µl)ÿ¤*øOé^?5ö=?Ù}cô=(Û/ˆ/°-+ôLº/©ÿRåüÊjŽçIúíŸÊ/çµù¯‘Ù¾­æ§´^°¿F¿@î×BÂÔ'þ»û±èÿãÁ5£äoÚcèÏ{½·[YúÏH¿/[©æ½Ùß/¸}~=¢¨€LþÅÞÒ~!öº»ÏVðc˜’ïJû´-íÇç´QíÏÙ´_qÝÅø“'x`y¿ÃøËœ_ê>>ÖuÙïÐ…ß>pØÔKû‡UÍßÈûupKÕþßAøûoYù¾Nío˜4h?)Šþ“†ðË1>$ýTó±À>þOdþdÿ[·[e ÀìÓ. ~/)÷©„_Sÿeÿ ÿŠþRþíÊߨò~Êú)é@•üæÍ í>\#×ßEY?…gÚoØ~=ÔGþM²_û\¤ýOu¹ÏðýôœQIáû5ý3Õá×#R~â;²_åüTû3 R¤ü¢»O0ßÇ÷±wEîñ7µÏÒþ:ówjÿš«ö»´WfÞoô£@Ð,¿ììü_äû‚þ„ñu‡ö÷ëš¿‘÷[)¿½Ãó}cدCÿyÿ”îó³úù•ù—%ÿ)ìé{=eËù ío•UÿV™ðËÑ>ªòGy»RûgÇVŸŽç­¿Çbä¯ÕõW£³ÿFÕÝ'Jïßj÷Iþ‰÷Ž´ëý.ôWÂ/ºûóéo9Ô~‹ýV©Ÿ^«:¿òšû2ûÏHÐ#¶¬ä~ÖªøgDÕ¯ÇR~à'ºûðQhž1 ƒÁ`0 ƒÁ`0 ƒÁø\üƒÔ endstream endobj 58 0 obj <> endobj 59 0 obj <> endobj 60 0 obj <> endobj 65 0 obj [/Indexed /DeviceRGB 255 <000000FF00006B6BD2FFFFFF666666FF66667B7B7B6666C24A4AB96B6B6B4242 B1F30000FF9090B1B1DA888888737373B1A1A1FFB1B1CC6B6B181818FF33337B 7BCC6666B9E33333B9B9B99090D2DADADA8888CCB98888FFC2C2424242E37B7B FFE3E3DA9999FF1818FF7B7BEB2121B1B1EBFF4A4A8080D2C2C2E3A9A9A93333 33F33333D252529090E3DADAF3CCCCEBEB1818FFA1A1999999A1A1DAB99090FF D2D2525252EBA9A98080E3A1A1E3EBEBF3080808FF08087B7BD2FF73737373C2 5A5AB9B1B1B1292929FF4242E34242C2C2C2E3E3E3DADAEBF38888FFF3F3EB90 90FF2929FF8888C2C2EBB1B1F3FF5A5AD2D2D2EB4242E34A4A9999F3CCCCF3A1 A1F3C2C2F37373D2FF6B6B8080806B6BC26666CC5252B94A4AB1FF9999B9B9E3 B1B1E3909090B1A9A9FFB9B9D26B6BCC7373212121FF39398080CCE339399999 D29090DAC28080FFCCCC4A4A4AE38080FFEBEBFF2121FF8080F32121B9B9EBFF 52528888D28080DA393939DA4A4A9999E39090EBE3E3F3DADAFFD2D2EBF31010 FFA9A9A1A1A1A9A9DAB99999FFDADA5A5A5A8888E3A9A9E3A1A1EBF3F3F3EBEB FF101010FF10107B7BDA7373CC5A5AC2CCCCCCEBEBEBB9B9F3B1B1FFD2D2F3CC CCFFA9A9F3C2C2FF6B6BCC5252C2D273739999DAC28888F329298888DA9999EB E3E3FF8888EBA9A9EBF3F3FFD2D2FFF7B796FC949005E770C2F0F4F7B82899EB 94F741F7FC9490F7B84E6D892D05E770C2F118F7B77BF741F7FC949003EE8803 D600F713EE00016FF7A2E3007DF1C2F164000FF8DF0008402004F7A3A0C40000 1F200C000FF8000000C4000CC40000DF0008000000F713E22A001EC4000CDEFD 30C2F18CF7A10E03EE8803D60000000305E00FC2F1A800E44A05E0F8000032F7 B9C59A3DEC000030001DE803B600C2F1E000CD7C00000900CD5C000000FF92D0 05E10005E17003B600C2F20400CD7CC2F21000F56A033238FFFFFFC2F2780010 260000300021F9000028FF92D0601232FF94D0FF92A005E100F432F805E100C2 F22C66E8880000006021D3FF92D0F432F805E100C2F26C66E94B00000060D91D>]endobj 64 0 obj <>stream xœí} Oi–¶s1Ónó!H ‚Âf0IX&|&\‡5Ù| .FÁËe@_˜ F€Âm#I‡ÉÆÍF ¼?tÏ9ï¥Þ*@fâäö‚ Æ—AçbSHôïÝœiñ×­ôÆ |E ã‹`c±ªw ~~^±Iäo*ô%1Œ/+óŒÕû'6+6Áö³ò3ßBÁxo¨xÌïŸh‘¿B_ƒÁøhÙXœ{2PÜ]ï÷û»Aø¹«ÁøFp3¸Ÿ u‡zçªxƒñm`3Ä¡ýÅÐB¡¹3…¾ ƒñ…н±ØTõ$„xRÅÓúŒoþ`0^UÕ47×gî3ßî÷nãKñÅ•_ }) ãËâ—¿ßߢ©½×Â`0 ˆë}…¾ƒQT³ø3ß(n3ûŒoÑB_ƒÁ( b· } £0ˆ²ñg0¾MDÙø3ß&˜ü Æ7ŠëìûŒooXúŒoi&?ƒñ­àæó ¿_/äã®ü­µ_ð‚~ëë…¾ã7Ÿ·øWz—:7®|×ùžÔëFþÉ|_ôÒÎÇZÏwTè‹`0þA1S/‰òW6®t^¹Ò Mþëyä_?ðùþ—?× —Âäg0.‰ûÀxã †zõn,Zm;{­Ñ÷ïÿ[È¿ñù²L~ãÒ~'(Ÿ¯P °”?=4NÍ=óù’¨¶]¸Nî–ŠkI2ùŒKÂOt¯j©ðw^¿¡üѨ1©¿•ˆbë»V€ë´aý\^ +?ƒqiÜDÅ‚G3”ñ9¿Yï›üA2ß—ÌØö?˜Ïd“Ù$\+?ƒñˆåïÓÑXçw6å¯Öä§:!YhåÏmõ3@~V~ãó0°Ñ¹!Ž&déO+4:(^S…6‹;Tþ7…¸VDi&›Aîù³>îçg0. g°Sµl!@“äÔÂ/Ò}‚ü€ú@ÿd6+²V~㲘Yê\zNGcADgç†$ÿmÝÑ×*óý¬(ùÔögüÙ üŒÏÅÍÅ`pf—‚ ý@AþÃh4-ϱ+a ~D~¬øù²lûŒÏBïÒâRh³Â_ BÀ Èo ?)¿¦~mf¹ŸM²íg0>þÅx|1¾ø!þ!aø$òGÑ}¨üY‹ý…·ýÄþ$Û~ã³P¬ÿP¯Š ,Å—üףј>¥Õ&üÙB“?+J~äüïòZŒlܯB4‰†ô_ôÓL~cX¿™óg}ÉÆ|ãÚèëöð~*mwwyxïã×p:üëÙY8ŽÐgÚÏú_{jFTüPù“IV~ã3ðóœDÕñ c|Ï|¾?(É—ìÅæøº½©ðþ~d?Lã^ ¯6œÏeÀéò*œFàùRûíkÎó¦J!ßÇFôïÉRw]l\øc0.ŒÇOû逹/GõËQ}IÓö'³è¼3™Tþ—­½ìÚOõS¤û€×ÀíÝÿ>ïçOV‡VOV"«4æá“?^:,ÃÔ¸`þ¸èë“I¿;ãâ(Ö?é}ÒÛ;ÛÜ\SÕDLíóŠQ}¶j?xnâþxžòçºà>)ŒJt&ú¯6ä\|xHpÿ%Š?6éýáKöSvFùýã2é—}D8bò3—¿7ê õÂz‚ìŸû'£Øgé½:H’éGÔ8¾ho>±OÔßGþ*âõONVON]~ûס“!|t?ŒÊOQƒØIì›ç"ùÉ÷Ó ¿lR;òñãRh …B+ÐBž„zç~3 ýF²o R(¿Ãö¯ãß—ôO¡‚£éôzƒ¾çgþ£C#'CC@þW-å—ÒI$Ì€AäÏ’ñÏR¹ß¢>+?ƒqÜX‘Qèý-–Óoúœ@Ê÷3™yÛ×ìu%ÒôƒòHÈW¥ò¯"ÅÚ:424´{‚äÔ틤63¾ùµðgù…+ö2Œ‹âþ€ÄÊÊñÿ/­7¶™õ¾,ÖÝl9n^Ⱦþyð°HãWQ×ÑÞíæì¿ündhw„„ÿääDÿ0±¬? ?|á²uvƒ~Ó÷[®„•ŸÁ¸8~(¦FüýÿÆ›NÛïÓõ>‡ò¿ÝGîKáO…SaUëá‚ ŒüjûáW#€¡]Š (þ»ïÎPýQù÷¥ö'ö­Ó…ògÇůÓ0ëêXùŒ‹ãfw1Bñ`eÓxÓÅô'E_ßxÖ$s‚È¿¿Of=œŠDVwÏ^*ú½GvGFliÿè±DP_†½³U•õ§(–XÒß  ~Ö0V~ãsð˜È?V,B¿ÅxÓ-çÝüY[Á¯Qr;ùQ¶w‰æ¹_¥ðCÊOLkþð[úÓ‰ ÿOê¯Ã`üçUo_"ѧËj–Ä_¬èa]+?ƒqq<öuwûíÊŸWíOf{¨ânöóß½Šäߗ‰h½>¢Z?æûCÄSú‡FýÉõ[oìb¹ÈIääe¿êÓ0®ËýjjU‹`åg0.·€äÿ@…ñ^žîõ³Rû Û?Ü¿ M°×zg;ù‡PÞIù²ÞÙCê¿Bã?tbô…_î6ŒöŸ:û¦ˆúBû1Ð"ž¬ü ÆgÀß]è®Gþ#û7'´›å>_6LÿÞÕ« I}ª÷åŒ÷ND±ì=ÁzãT ?ÕûOÞ}âÅjî ågÅg0.çâ›þz’ÿâ çZ åÙÏ¿Qgâ*¥ü²à×`¾Òä¦b?°ý­¥ð¹·Èþ·ôŽóý„é´˜‡œØ×ƒ¦Ÿ'ô0Ÿ¿±¼¿ ù³¦ïÏŸÏ?ÂÒ/¹i6ß;¥þ!)ü#µÞQÊ/»úWëg££Ín£€ Èr¿˜Ù“dåg0>é3Ù_ßíF~£“?ébûß_¥”_VüÃ~¥ò á7ëýôRÒÿDŒðÇ©½‘ðnÿiUc|Øö3Ÿ‹XßðþŸ-úÍ8O±­á—Í_Ìc„_Ò?’Ûß=#é—"ÿÖHúÿ›Ê}¤üb€¿œÜüO¥vïæ\/7#†øeiF?Oèa0.ëÑ´wÂoÙŸ¯üz4 ÖûòÉß|ÕÈù#‘HûIûnûî¶³wgTî“Å~hVfŸÃ”_)ÿÍ ¾4-(Ùop+ŒÓ¼½€/“ŸÁ¸q±®–– „fÿŒó,Û~.ä§^þ„®ö›Ëøà„>Tþ!9Êgä­Áè¿êœ_ð%åËñ½)ç„~‚ZɇÆösÎÏ`\bîîf ÂbÿŒó´‘¿áêUQï¾GçÍÓ}ò“!1ÆG)¿9ÌÇÈù‡TÒ/föÐJ@ûûgy—lüàjšóN`0‡\¤s`ÐßüY‹û.ýüS ´ýªÚŸ@ÛNÚ/çõœ¨‚ñß\ÐkïJùMåˆ~`üö^C„îê˰ò3—…Z¤³bsSð_°¿þ†óDSùÝ ~ V¹’~þ”X¿/,øIåG¡·­æ·÷VŒÔ·ôÐËy8Ù­”?Ë9?ƒqY(î?ž©ûÏU~Ëõ»ÙþI³Ú/&öÐ^±Ž‡˜²«¤ß¾”gî?‡dÊ¿z"‚)D(?.äçø­ŒZÊGäülûŒ ã0z]ùgff*Èúûgœ§ZÕ~*÷çð›Õ~k”ϼ´ý‘°š×£êýNò{½§ÿI¿Ö}±–Ìùû Ǩ}]ìϰò3—BßmuWŽŸgfn û+Ðø»“ß>³'o„_s¾ò‹¥|(é²ÿ<ò{ñž# ü/UüHøi^ŸsÔÀ¸X»;ÃÕ~ã’°îÁûóù'>Jþlþ:E??P_Tûç§§kÐöâpÎõœ¿;‘®^ÌçO!õ÷‰œíùÊß®gõ‘úæÊ{©ˆUïK$–moÊÛu‰A>¬ü ÆE¡ïŸ®æÆïåüëæb^Ùd&ï뎤í—+ùØjt¹ß£»wz:<üÓÙÙªÉâZ¾“ï†ï´/ù›‘KyHåŸü¤ÿ\ƒ!q]õñ#€ø7ˆûçVû¬•2if ꃜu ñ“S{‘ý~ãûXÆ;ûixô•}a®W¿þôŽº÷iBϪ¹’O¿Èùé ¯:rþ.P~ZFL(¿ìyàî~ãÓPm¸þDz§]ÿ„ë¿ucJ/®Ü]:utw»+c¸ûVáûåœÞýˆõVƒ^»ŸîÌ1¢~{ÿðoâ^]«ÏDÂäÏÙ®¥±Tß±'‰~¤±}ª6yð·øWa0¾ÜÖwáõz®æ›ÂŸ?¯Ù6+í=Xt›²ÎÈIòÓHŸÈ~*%Ù¿&‡í…Qßi!ÏœúÈ«= Ÿ`Ý‘{]?Ú~rýÖÚÝ„F½x¯yûàäßè†ÁøÊÑ­¶Rþ_**Ôð^Êøëýÿ7ï>›ôc;ÊïkãŒvs˜ÎÇ 7Œö¾”ÔÇÁ{â†\Æ*^'CrmO9£'<šÃ?ï5¤tOÖûS{ÚEO_FŒñÑø[þó0_/Ž>ïÍŠMIý‰s¦ôz3ö™=”rÛoו벆øÒŒ~q“nû}ºWmkôâÊž«òîÜrdßnûnX ðÙÜ/áè7œ”Â/”_oÓã«EµYïÚcÓsúüÝ3y¨±I?òÍ·mÎÍ‘îí£Ûõí«™}4Ä_êÿÉIÎøDîäÄä¾ÝgõóEð wíWâmÜÇ‘ý>¾cƒqA˜äÿ¹¥E®å1¡–ñšÉûÀ¤©üú>½öþþvYò»º/²~âp8bQ(n/Üë„_Ýw>¢—ñÀé¼h$rÎk—Âï3oÒËýý Æ'!jÿ—‰–‰½ŠW½¿¾Û…ü9Û=»ô}zí'Í'(ë$ôr>á”pþ’ú«Î¹w«Öd¾°^ÄCÌé‘ý|ùƒZ³êf]jØnÜßÏ`| ¢FOß ÿ6Å}¼oOÞžŽå<|IºQ¯“ü¹°ãK¦ù}b–®S÷»V¾§¤ÂÒò§h= ü®¿æ}Ä»7žµ:ú4Ú?÷ß„Áø&`*ÿ¦céÞn—›vÞ›Ê/´?›qŽá?KÐðþ«2éW{åb~n#ýÞ™sø#j6_Šfó%ö#®“&3bÙn›i½ü¿ƒñ á¶EþÇzÝîz¡ûn·ëäžÔ÷ɂ޸º£ÒËôòNÝ)¹œW$üSÎõRŽ„á§•»ÂF­…?õNy±Ž‡-áQ> ƧÀPþ›@yâ=4y«¾üu"r]û‘üI`¿Ë Úá”è—Py?!Ü;÷bFOÔŠ½ÒóGhh_äìü¹“ìp°i?“ŸÁøD«£êf-HzÁüzy—î7åÕd²–öÌ¿vP:ÚŽºäO…çwï~däýéðÙ‰òü4¶/uÒ_°aªÖ”ýÄñòƒß?ŸÁ`bzxïc}{nIý±âWå>>::ZoþØŒýWk¯ÖÄj>Ÿ|Qê§á½Â\^Î'žÎ`0ƒQq·¯÷—n…1BqñÀÀÊïŸÁ`üCã ø~q´9f˜Ügò3_/¢Ñè!î×kæ÷WZ }y ãï…ê¨XÊç9¾˜hOªÜ…˜ü ÆW‹¾¨ä7t/–¢~Áäg0¾^û¯{½cHxE|IýÞ¹‰B_ƒÁø»!Åš_Eh%´‚¬³/˜êí›cåg0¾b ‚ôGBÈþf>P¸ÏÊÏ`|ÕÀ¬ÿ@wÚˆø`ø‘úMMþB_ƒÁø{¥ÿ7ú^¤}¯Ð|ä~0(ˆÇk  Ø`D‡öí×­ØÚ·Û[U;/$`4 ‡ý1íÙ÷hýÿÄÿm1¸ º¿|'€þz«îá`90>FB=»S‚ìóîÌvô:hØp%FŠ’ÙXÚOe-#¯C;à-¸³0ˆ~¿£Ž–¯ë0Ïi[hÃìÂû¢Òƒ!¡­r– ±J¢}Y]ú‚­…E”Q<ž‹åü–æ›Òo ì™MÐ<½G> }®öŸ>85èoñœ8ß¼ö Ù­h¿$‡‡ØÐ¬K7 Žá@÷©MXE÷#hÃJûG%ñiwËlŠñ¸5yKcRøIý~;é—÷‘ößOM‚ðO~?e6EðÈ{`?6ê#í[‘îÛí†%  6¤=vÏZ%ÿéÙ >0_qý˜žk„-˜·”ŸœB#n©šFxn´¸ßˆÜo´´ß&þëkmD×Ú ŽDÄGšÙáàGhHtr?RC¼/ŦP|—dÇnÄthÁ}â|¾ê)U„—ÜïÁ嬀ö¸¨º‚,nÂøp‡/ðöZ´è…XçÒ"ÿÅÅ¥xü7,ûýWÓ"ÙýÅÅà´ ù©Âm«{8‹‘òw$?p\áNݬ`{Ñ2à¡é‚ž:.£W]ûï -ðUvà7¥á é“uóœ’_Í=ôõÓ 1V½;++ñ¯áÃø±jØÅ.B}—(3viÒ~öôþÁyÚo×} þÞšMøÅ4gü›=pŠ?i¿Hš…ðÛÄŸ( •²¥ûÃnÀÝ~up«ßˆyªßO´¿µ,èkR‡bÿÔÔ䔡ü¦P1`Usaý¿ßކ͖´£êߤð‹½]÷Qõå^„€VKôÿÏ5ØTN`—}|Týy¢;<”ú7ZÍzì'í·YýÒ5°é>„‚kZ÷1àëT@(ÿÔý§OÇŸ"åi/--5%ßd$  ‚~´ÿúÔ”ð‹-ké?ŸêÿúǽKAäz$þŽþöaì>¼ ;ƒ6ò— ¦nÕŸ1⸠‘gyžö*ëLò×S…š;•m·­c«Þh¥çE>ùÓm•Èö¨`;üNG”XN¢m–ªJ ñ³fÁàSèoùý\^[ÚEûÅÞ]û ö›ªoj¿®4ÛËk¦ò?²ë¾Ò~Cù×µÝ?’H?,µ_‰¿Cûï’ðdXÖz/›¤~¿aü%ó—…ç—Ú?)ÔßÔ} (÷ úÀý)Ãú;tÉßÞJÛ¶!üZ÷Û¡µ¶Ãó±6Rú•ë—–_ÿXk¿|¨ÂÀ<ÑÞR~“þ û5]`ìÊoñ^»WíWºÄ¿&ŒÿS²ü:ï?Ê/Ô_˜~|HÖKá—q€èýC)Ñ^k¿f¿”~8øAZ±vµd~’¨/´ö —Ÿ•¼'êÓß²šüõÀsäz0ø¯ÿGûýñ½Øè„f#êô½Ù鯄ò{ªù%ëbH¢K ò÷É¿Ùu\uü-²ÇŠ®ÏzòÈß7}{‡¾IüŠ·dzº#`½”D¼úð½@삾ߌ.Å?þ¼"à=öÎ×þ½SS÷Úß,ÙeßEù­ò_3é¾~<Àl)¿®Ú]­ûÃ:ëwhÿ­~Cùïjí_6ó}ñ÷kí—•ïʯ´_Å€×È{tû–÷ÝŸ²åû¢¡÷Ý*”¿µÝ,á[[-ÁoÕOZûI÷üHÿg†æ«ä=¥ü˜üká×A e…€®FWt5v]k¼ÖUÛu­ËUûµî“í¿&…_Š>=¿Mè?E’~ÓúK`©öãš÷ãvíÏëïùAi&©š¢¿ÔþŒÖ~"¾Èõ³Û X ±òG4ÿÑ¿,mtv¯t^±‘ŸJóŽ-¨¬M“Á®ö´íx0 zh7íÑl‘ßëé»;1›'­óp£Eõ‹Ù<òÇ*ËËMò{^D©œ¯È§:–Æ«óP ©óô]LùÍBŸ“úJûEÕ/m¯ùS;GûAùO䷴ߪó­iöËðHª¿¡ÿGÍ–ö7«¼_è¾,õ©@0_i¿æ¿%ýH}þ»†õy¿~Ò}§òkö[¼'íŸt~Ù€1€lD€©ísŠ}ÛDúvÊûÛ-í?&ío•vÍ¿`¾!ýó¸ÕKÅ—ûg¦öÏ+áGç¯6Óù§„ô7Ú­€Úk°á£K‰¿Mû­Œ™MýI÷§ïÔíéSÅþ[ѯÔHdª?Žâ/ÆõÇ•ç_ú„Û·©D⟥[júä--Í‚ßãP'ð|ã xüà*þŸ¢èþ£þËÿÿ°ñ ºïknm"}O“òƒ°W")Óƒ“-$#ïê<1'ùït”‹à±Yzñf]™†(ìÚòÈuJÛeRoYâ xÚðc垎 uõÙ‚€KÏŸ—”ß)þB÷õ]´ß©ûμÿ•tkpdïÌKüåi¿Ðÿõ#;ý…0µßVï7´_øÿ~³âÒ¯u_)¿ ·–ÏÑþ)ËX1à{¡ý´ÕñÚöŸ„[$þöÎ@$;Ðÿeë±ØTõï™,ø¡òߟKñŸ¯12~É|!ùêXûS5–æKÆ+÷/F¨íïß…´wA+hç/»~|o6Jd’þ÷¥FÞ/CÀ¸¦©©û¢Ê/{þ¤ ûb‹¼3¬Tÿ¬ ½Èû…óÏêq×¹•.@ü?ß²qeãÊ•ÎNÜÑ3Ä‚¥ùcuTàv´Z÷»‰ìÚã½#l¬ˆXX$U˜̦¤Ü´ý^ÙùîU¹|ò£“Ç‚ßV>ùÛ:›–Ah:0h¼„ÏâW÷Űᢠûí!À .Í=çGíß;gðO>ý8JþÍkhûÖ_Ëÿš~›ö«´ÝMùlõþa©ûŽa?*Õ¿%^P@‰ÿ¤j’úùÚ?µl)ÿ¤*øOé^?5ö=?Ù}cô=(Û/ˆ/°-+ôLº/©ÿRåüÊjŽçIúíŸÊ/çµù¯‘Ù¾­æ§´^°¿F¿@î×BÂÔ'þ»û±èÿãÁ5£äoÚcèÏ{½·[YúÏH¿/[©æ½Ùß/¸}~=¢¨€LþÅÞÒ~!öº»ÏVðc˜’ïJû´-íÇç´QíÏÙ´_qÝÅø“'x`y¿ÃøËœ_ê>>ÖuÙïÐ…ß>pØÔKû‡UÍßÈûupKÕþßAøûoYù¾Nío˜4h?)Šþ“†ðË1>$ýTó±À>þOdþdÿ[·[e ÀìÓ. ~/)÷©„_Sÿeÿ ÿŠþRþíÊߨò~Êú)é@•üæÍ í>\#×ßEY?…gÚoØ~=ÔGþM²_û\¤ýOu¹ÏðýôœQIáû5ý3Õá×#R~â;²_åüTû3 R¤ü¢»O0ßÇ÷±wEîñ7µÏÒþ:ówjÿš«ö»´WfÞoô£@Ð,¿ììü_äû‚þ„ñu‡ö÷ëš¿‘÷[)¿½Ãó}cدCÿyÿ”îó³úù•ù—%ÿ)ìé{=eËù ío•UÿV™ðËÑ>ªòGy»RûgÇVŸŽç­¿Çbä¯ÕõW£³ÿFÕÝ'Jïßj÷Iþ‰÷Ž´ëý.ôWÂ/ºûóéo9Ô~‹ýV©Ÿ^«:¿òšû2ûÏHÐ#¶¬ä~ÖªøgDÕ¯ÇR~à'ºûðQhž1 ƒÁ`0 ƒÁ`0 ƒÁø\üƒÔ endstream endobj 66 0 obj <> endobj 67 0 obj <> endobj 68 0 obj <> endobj 73 0 obj [/Indexed /DeviceRGB 255 <000000FF00006B6BD2FFFFFF666666FF66667B7B7B6666C24A4AB96B6B6B4242 B1F30000FF9090B1B1DA888888737373B1A1A1FFB1B1CC6B6B181818FF33337B 7BCC6666B9E33333B9B9B99090D2DADADA8888CCB98888FFC2C2424242E37B7B FFE3E3DA9999FF1818FF7B7BEB2121B1B1EBFF4A4A8080D2C2C2E3A9A9A93333 33F33333D252529090E3DADAF3CCCCEBEB1818FFA1A1999999A1A1DAB99090FF D2D2525252EBA9A98080E3A1A1E3EBEBF3080808FF08087B7BD2FF73737373C2 5A5AB9B1B1B1292929FF4242E34242C2C2C2E3E3E3DADAEBF38888FFF3F3EB90 90FF2929FF8888C2C2EBB1B1F3FF5A5AD2D2D2EB4242E34A4A9999F3CCCCF3A1 A1F3C2C2F37373D2FF6B6B8080806B6BC26666CC5252B94A4AB1FF9999B9B9E3 B1B1E3909090B1A9A9FFB9B9D26B6BCC7373212121FF39398080CCE339399999 D29090DAC28080FFCCCC4A4A4AE38080FFEBEBFF2121FF8080F32121B9B9EBFF 52528888D28080DA393939DA4A4A9999E39090EBE3E3F3DADAFFD2D2EBF31010 FFA9A9A1A1A1A9A9DAB99999FFDADA5A5A5A8888E3A9A9E3A1A1EBF3F3F3EBEB FF101010FF10107B7BDA7373CC5A5AC2CCCCCCEBEBEBB9B9F3B1B1FFD2D2F3CC CCFFA9A9F3C2C2FF6B6BCC5252C2D273739999DAC28888F329298888DA9999EB E3E3FF8888EBA9A9EBF3F3FFD2D2FFF7B796FC949005E770C2F0F4F7B82899EB 94F741F7FC9490F7B84E6D892D05E770C2F118F7B77BF741F7FC949003EE8803 D600F713EE00016FF7A2E3007DF1C2F164000FF8DF0008402004F7A3A0C40000 1F200C000FF8000000C4000CC40000DF0008000000F713E22A001EC4000CDEFD 30C2F18CF7A10E03EE8803D60000000305E00FC2F1A800E44A05E0F8000032F7 B9C59A3DEC000030001DE803B600C2F1E000CD7C00000900CD5C000000FF92D0 05E10005E17003B600C2F20400CD7CC2F21000F56A033238FFFFFFC2F2780010 260000300021F9000028FF92D0601232FF94D0FF92A005E100F432F805E100C2 F22C66E8880000006021D3FF92D0F432F805E100C2F26C66E94B00000060D91D>]endobj 72 0 obj <>stream xœí} Oi–¶s1Ónó!H ‚Âf0IX&|&\‡5Ù| .FÁËe@_˜ F€Âm#I‡ÉÆÍF ¼?tÏ9ï¥Þ*@fâäö‚ Æ—AçbSHôïÝœiñ×­ôÆ |E ã‹`c±ªw ~~^±Iäo*ô%1Œ/+óŒÕû'6+6Áö³ò3ßBÁxo¨xÌïŸh‘¿B_ƒÁøhÙXœ{2PÜ]ï÷û»Aø¹«ÁøFp3¸Ÿ u‡zçªxƒñm`3Ä¡ýÅÐB¡¹3…¾ ƒñ…н±ØTõ$„xRÅÓúŒoþ`0^UÕ47×gî3ßî÷nãKñÅ•_ }) ãËâ—¿ßߢ©½×Â`0 ˆë}…¾ƒQT³ø3ß(n3ûŒoÑB_ƒÁ( b· } £0ˆ²ñg0¾MDÙø3ß&˜ü Æ7ŠëìûŒooXúŒoi&?ƒñ­àæó ¿_/äã®ü­µ_ð‚~ëë…¾ã7Ÿ·øWz—:7®|×ùžÔëFþÉ|_ôÒÎÇZÏwTè‹`0þA1S/‰òW6®t^¹Ò Mþëyä_?ðùþ—?× —Âäg0.‰ûÀxã †zõn,Zm;{­Ñ÷ïÿ[È¿ñù²L~ãÒ~'(Ÿ¯P °”?=4NÍ=óù’¨¶]¸Nî–ŠkI2ùŒKÂOt¯j©ðw^¿¡üѨ1©¿•ˆbë»V€ë´aý\^ +?ƒqiÜDÅ‚G3”ñ9¿Yï›üA2ß—ÌØö?˜Ïd“Ù$\+?ƒñˆåïÓÑXçw6å¯Öä§:!YhåÏmõ3@~V~ãó0°Ñ¹!Ž&déO+4:(^S…6‹;Tþ7…¸VDi&›Aîù³>îçg0. g°Sµl!@“äÔÂ/Ò}‚ü€ú@ÿd6+²V~㲘Yê\zNGcADgç†$ÿmÝÑ×*óý¬(ùÔögüÙ üŒÏÅÍÅ`pf—‚ ý@AþÃh4-ϱ+a ~D~¬øù²lûŒÏBïÒâRh³Â_ BÀ Èo ?)¿¦~mf¹ŸM²íg0>þÅx|1¾ø!þ!aø$òGÑ}¨üY‹ý…·ýÄþ$Û~ã³P¬ÿP¯Š ,Å—üףј>¥Õ&üÙB“?+J~äüïòZŒlܯB4‰†ô_ôÓL~cX¿™óg}ÉÆ|ãÚèëöð~*mwwyxïã×p:üëÙY8ŽÐgÚÏú_{jFTüPù“IV~ã3ðóœDÕñ c|Ï|¾?(É—ìÅæøº½©ðþ~d?Lã^ ¯6œÏeÀéò*œFàùRûíkÎó¦J!ßÇFôïÉRw]l\øc0.ŒÇOû逹/GõËQ}IÓö'³è¼3™Tþ—­½ìÚOõS¤û€×ÀíÝÿ>ïçOV‡VOV"«4æá“?^:,ÃÔ¸`þ¸èë“I¿;ãâ(Ö?é}ÒÛ;ÛÜ\SÕDLíóŠQ}¶j?xnâþxžòçºà>)ŒJt&ú¯6ä\|xHpÿ%Š?6éýáKöSvFùýã2é—}D8bò3—¿7ê õÂz‚ìŸû'£Øgé½:H’éGÔ8¾ho>±OÔßGþ*âõONVON]~ûס“!|t?ŒÊOQƒØIì›ç"ùÉ÷Ó ¿lR;òñãRh …B+ÐBž„zç~3 ýF²o R(¿Ãö¯ãß—ôO¡‚£éôzƒ¾çgþ£C#'CC@þW-å—ÒI$Ì€AäÏ’ñÏR¹ß¢>+?ƒqÜX‘Qèý-–Óoúœ@Ê÷3™yÛ×ìu%ÒôƒòHÈW¥ò¯"ÅÚ:424´{‚äÔ틤63¾ùµðgù…+ö2Œ‹âþ€ÄÊÊñÿ/­7¶™õ¾,ÖÝl9n^Ⱦþyð°HãWQ×ÑÞíæì¿ündhw„„ÿääDÿ0±¬? ?|á²uvƒ~Ó÷[®„•ŸÁ¸8~(¦FüýÿÆ›NÛïÓõ>‡ò¿ÝGîKáO…SaUëá‚ ŒüjûáW#€¡]Š (þ»ïÎPýQù÷¥ö'ö­Ó…ògÇůÓ0ëêXùŒ‹ãfw1Bñ`eÓxÓÅô'E_ßxÖ$s‚È¿¿Of=œŠDVwÏ^*ú½GvGFliÿè±DP_†½³U•õ§(–XÒß  ~Ö0V~ãsð˜È?V,B¿ÅxÓ-çÝüY[Á¯Qr;ùQ¶w‰æ¹_¥ðCÊOLkþð[úÓ‰ ÿOê¯Ã`üçUo_"ѧËj–Ä_¬èa]+?ƒqq<öuwûíÊŸWíOf{¨ânöóß½Šäߗ‰h½>¢Z?æûCÄSú‡FýÉõ[oìb¹ÈIääe¿êÓ0®ËýjjU‹`åg0.·€äÿ@…ñ^žîõ³Rû Û?Ü¿ M°×zg;ù‡PÞIù²ÞÙCê¿Bã?tbô…_î6ŒöŸ:û¦ˆúBû1Ð"ž¬ü ÆgÀß]è®Gþ#û7'´›å>_6LÿÞÕ« I}ª÷åŒ÷ND±ì=ÁzãT ?ÕûOÞ}âÅjî ågÅg0.çâ›þz’ÿâ çZ åÙÏ¿Qgâ*¥ü²à×`¾Òä¦b?°ý­¥ð¹·Èþ·ôŽóý„é´˜‡œØ×ƒ¦Ÿ'ô0Ÿ¿±¼¿ ù³¦ïÏŸÏ?ÂÒ/¹i6ß;¥þ!)ü#µÞQÊ/»úWëg££Ín£€ Èr¿˜Ù“dåg0>é3Ù_ßíF~£“?ébûß_¥”_VüÃ~¥ò á7ëýôRÒÿDŒðÇ©½‘ðnÿiUc|Øö3Ÿ‹XßðþŸ-úÍ8O±­á—Í_Ìc„_Ò?’Ûß=#é—"ÿÖHúÿ›Ê}¤üb€¿œÜüO¥vïæ\/7#†øeiF?Oèa0.ëÑ´wÂoÙŸ¯üz4 ÖûòÉß|ÕÈù#‘HûIûnûî¶³wgTî“Å~hVfŸÃ”_)ÿÍ ¾4-(Ùop+ŒÓ¼½€/“ŸÁ¸q±®–– „fÿŒó,Û~.ä§^þ„®ö›Ëøà„>Tþ!9Êgä­Áè¿êœ_ð%åËñ½)ç„~‚ZɇÆösÎÏ`\bîîf ÂbÿŒó´‘¿áêUQï¾GçÍÓ}ò“!1ÆG)¿9ÌÇÈù‡TÒ/föÐJ@ûûgy—lüàjšóN`0‡\¤s`ÐßüY‹û.ýüS ´ýªÚŸ@ÛNÚ/çõœ¨‚ñß\ÐkïJùMåˆ~`üö^C„îê˰ò3—…Z¤³bsSð_°¿þ†óDSùÝ ~ V¹’~þ”X¿/,øIåG¡·­æ·÷VŒÔ·ôÐËy8Ù­”?Ë9?ƒqY(î?ž©ûÏU~Ëõ»ÙþI³Ú/&öÐ^±Ž‡˜²«¤ß¾”gî?‡dÊ¿z"‚)D(?.äçø­ŒZÊGäülûŒ ã0z]ùgff*Èúûgœ§ZÕ~*÷çð›Õ~k”ϼ´ý‘°š×£êýNò{½§ÿI¿Ö}±–Ìùû Ǩ}]ìϰò3—BßmuWŽŸgfn û+Ðø»“ß>³'o„_s¾ò‹¥|(é²ÿ<ò{ñž# ü/UüHøi^ŸsÔÀ¸X»;ÃÕ~ã’°îÁûóù'>Jþlþ:E??P_Tûç§§kÐöâpÎõœ¿;‘®^ÌçO!õ÷‰œíùÊß®gõ‘úæÊ{©ˆUïK$–moÊÛu‰A>¬ü ÆE¡ïŸ®æÆïåüëæb^Ùd&ï뎤í—+ùØjt¹ß£»wz:<üÓÙÙªÉâZ¾“ï†ï´/ù›‘KyHåŸü¤ÿ\ƒ!q]õñ#€ø7ˆûçVû¬•2if ꃜu ñ“S{‘ý~ãûXÆ;ûixô•}a®W¿þôŽº÷iBϪ¹’O¿Èùé ¯:rþ.P~ZFL(¿ìyàî~ãÓPm¸þDz§]ÿ„ë¿ucJ/®Ü]:utw»+c¸ûVáûåœÞýˆõVƒ^»ŸîÌ1¢~{ÿðoâ^]«ÏDÂäÏÙ®¥±Tß±'‰~¤±}ª6yð·øWa0¾ÜÖwáõz®æ›ÂŸ?¯Ù6+í=Xt›²ÎÈIòÓHŸÈ~*%Ù¿&‡í…Qßi!ÏœúÈ«= Ÿ`Ý‘{]?Ú~rýÖÚÝ„F½x¯yûàäßè†ÁøÊÑ­¶Rþ_**Ôð^Êøëýÿ7ï>›ôc;ÊïkãŒvs˜ÎÇ 7Œö¾”ÔÇÁ{â†\Æ*^'CrmO9£'<šÃ?ï5¤tOÖûS{ÚEO_FŒñÑø[þó0_/Ž>ïÍŠMIý‰s¦ôz3ö™=”rÛoו벆øÒŒ~q“nû}ºWmkôâÊž«òîÜrdßnûnX ðÙÜ/áè7œ”Â/”_oÓã«EµYïÚcÓsúüÝ3y¨±I?òÍ·mÎÍ‘îí£Ûõí«™}4Ä_êÿÉIÎøDîäÄä¾ÝgõóEð wíWâmÜÇ‘ý>¾cƒqA˜äÿ¹¥E®å1¡–ñšÉûÀ¤©üú>½öþþvYò»º/²~âp8bQ(n/Üë„_Ýw>¢—ñÀé¼h$rÎk—Âï3oÒËýý Æ'!jÿ—‰–‰½ŠW½¿¾Û…ü9Û=»ô}zí'Í'(ë$ôr>á”pþ’ú«Î¹w«Öd¾°^ÄCÌé‘ý|ùƒZ³êf]jØnÜßÏ`| ¢FOß ÿ6Å}¼oOÞžŽå<|IºQ¯“ü¹°ãK¦ù}b–®S÷»V¾§¤ÂÒò§h= ü®¿æ}Ä»7žµ:ú4Ú?÷ß„Áø&`*ÿ¦céÞn—›vÞ›Ê/´?›qŽá?KÐðþ«2éW{åb~n#ýÞ™sø#j6_Šfó%ö#®“&3bÙn›i½ü¿ƒñ á¶EþÇzÝîz¡ûn·ëäžÔ÷ɂ޸º£ÒËôòNÝ)¹œW$üSÎõRŽ„á§•»ÂF­…?õNy±Ž‡-áQ> ƧÀPþ›@yâ=4y«¾üu"r]û‘üI`¿Ë Úá”è—Py?!Ü;÷bFOÔŠ½ÒóGhh_äìü¹“ìp°i?“ŸÁøD«£êf-HzÁüzy—î7åÕd²–öÌ¿vP:ÚŽºäO…çwï~däýéðÙ‰òü4¶/uÒ_°aªÖ”ýÄñòƒß?ŸÁ`bzxïc}{nIý±âWå>>::ZoþØŒýWk¯ÖÄj>Ÿ|Qê§á½Â\^Î'žÎ`0ƒQq·¯÷—n…1BqñÀÀÊïŸÁ`üCã ø~q´9f˜Ügò3_/¢Ñè!î×kæ÷WZ }y ãï…ê¨XÊç9¾˜hOªÜ…˜ü ÆW‹¾¨ä7t/–¢~Áäg0¾^û¯{½cHxE|IýÞ¹‰B_ƒÁø»!Åš_Eh%´‚¬³/˜êí›cåg0¾b ‚ôGBÈþf>P¸ÏÊÏ`|ÕÀ¬ÿ@wÚˆø`ø‘úMMþB_ƒÁø{¥ÿ7ú^¤}¯Ð|ä~0(ˆÇk  Ø`D‡öí×­ØÚ·Û[U;/$`4 ‡ý1íÙ÷hýÿÄÿm1¸ º¿|'€þz«îá`90>FB=»S‚ìóîÌvô:hØp%FŠ’ÙXÚOe-#¯C;à-¸³0ˆ~¿£Ž–¯ë0Ïi[hÃìÂû¢Òƒ!¡­r– ±J¢}Y]ú‚­…E”Q<ž‹åü–æ›Òo ì™MÐ<½G> }®öŸ>85èoñœ8ß¼ö Ù­h¿$‡‡ØÐ¬K7 Žá@÷©MXE÷#hÃJûG%ñiwËlŠñ¸5yKcRøIý~;é—÷‘ößOM‚ðO~?e6EðÈ{`?6ê#í[‘îÛí†%  6¤=vÏZ%ÿéÙ >0_qý˜žk„-˜·”ŸœB#n©šFxn´¸ßˆÜo´´ß&þëkmD×Ú ŽDÄGšÙáàGhHtr?RC¼/ŦP|—dÇnÄthÁ}â|¾ê)U„—ÜïÁ嬀ö¸¨º‚,nÂøp‡/ðöZ´è…XçÒ"ÿÅÅ¥xü7,ûýWÓ"ÙýÅÅà´ ù©Âm«{8‹‘òw$?p\áNݬ`{Ñ2à¡é‚ž:.£W]ûï -ðUvà7¥á é“uóœ’_Í=ôõÓ 1V½;++ñ¯áÃø±jØÅ.B}—(3viÒ~öôþÁyÚo×} þÞšMøÅ4gü›=pŠ?i¿Hš…ðÛÄŸ( •²¥ûÃnÀÝ~up«ßˆyªßO´¿µ,èkR‡bÿÔÔ䔡ü¦P1`Usaý¿ßކ͖´£êߤð‹½]÷Qõå^„€VKôÿÏ5ØTN`—}|Týy¢;<”ú7ZÍzì'í·YýÒ5°é>„‚kZ÷1àëT@(ÿÔý§OÇŸ"åi/--5%ßd$  ‚~´ÿúÔ”ð‹-ké?ŸêÿúǽKAäz$þŽþöaì>¼ ;ƒ6ò— ¦nÕŸ1⸠‘gyžö*ëLò×S…š;•m·­c«Þh¥çE>ùÓm•Èö¨`;üNG”XN¢m–ªJ ñ³fÁàSèoùý\^[ÚEûÅÞ]û ö›ªoj¿®4ÛËk¦ò?²ë¾Ò~Cù×µÝ?’H?,µ_‰¿Cûï’ðdXÖz/›¤~¿aü%ó—…ç—Ú?)ÔßÔ} (÷ úÀý)Ãú;tÉßÞJÛ¶!üZ÷Û¡µ¶Ãó±6Rú•ë—–_ÿXk¿|¨ÂÀ<ÑÞR~“þ û5]`ìÊoñ^»WíWºÄ¿&ŒÿS²ü:ï?Ê/Ô_˜~|HÖKá—q€èýC)Ñ^k¿f¿”~8øAZ±vµd~’¨/´ö —Ÿ•¼'êÓß²šüõÀsäz0ø¯ÿGûýñ½Øè„f#êô½Ù鯄ò{ªù%ëbH¢K ò÷É¿Ùu\uü-²ÇŠ®ÏzòÈß7}{‡¾IüŠ·dzº#`½”D¼úð½@삾ߌ.Å?þ¼"à=öÎ×þ½SS÷Úß,ÙeßEù­ò_3é¾~<Àl)¿®Ú]­ûÃ:ëwhÿ­~Cùïjí_6ó}ñ÷kí—•ïʯ´_Å€×È{tû–÷ÝŸ²åû¢¡÷Ý*”¿µÝ,á[[-ÁoÕOZûI÷üHÿg†æ«ä=¥ü˜üká×A e…€®FWt5v]k¼ÖUÛu­ËUûµî“í¿&…_Š>=¿Mè?E’~ÓúK`©öãš÷ãvíÏëïùAi&©š¢¿ÔþŒÖ~"¾Èõ³Û X ±òG4ÿÑ¿,mtv¯t^±‘ŸJóŽ-¨¬M“Á®ö´íx0 zh7íÑl‘ßëé»;1›'­óp£Eõ‹Ù<òÇ*ËËMò{^D©œ¯È§:–Æ«óP ©óô]LùÍBŸ“úJûEÕ/m¯ùS;GûAùO䷴ߪó­iöËðHª¿¡ÿGÍ–ö7«¼_è¾,õ©@0_i¿æ¿%ýH}þ»†õy¿~Ò}§òkö[¼'íŸt~Ù€1€lD€©ísŠ}ÛDúvÊûÛ-í?&ío•vÍ¿`¾!ýó¸ÕKÅ—ûg¦öÏ+áGç¯6Óù§„ô7Ú­€Úk°á£K‰¿Mû­Œ™MýI÷§ïÔíéSÅþ[ѯÔHdª?Žâ/ÆõÇ•ç_ú„Û·©D⟥[júä--Í‚ßãP'ð|ã xüà*þŸ¢èþ£þËÿÿ°ñ ºïknm"}O“òƒ°W")Óƒ“-$#ïê<1'ùït”‹à±Yzñf]™†(ìÚòÈuJÛeRoYâ xÚðc垎 uõÙ‚€KÏŸ—”ß)þB÷õ]´ß©ûμÿ•tkpdïÌKüåi¿Ðÿõ#;ý…0µßVï7´_øÿ~³âÒ¯u_)¿ ·–ÏÑþ)ËX1à{¡ý´ÕñÚöŸ„[$þöÎ@$;Ðÿeë±ØTõï™,ø¡òߟKñŸ¯12~É|!ùêXûS5–æKÆ+÷/F¨íïß…´wA+hç/»~|o6Jd’þ÷¥FÞ/CÀ¸¦©©û¢Ê/{þ¤ ûb‹¼3¬Tÿ¬ ½Èû…óÏêq×¹•.@ü?ß²qeãÊ•ÎNÜÑ3Ä‚¥ùcuTàv´Z÷»‰ìÚã½#l¬ˆXX$U˜̦¤Ü´ý^ÙùîU¹|ò£“Ç‚ßV>ùÛ:›–Ah:0h¼„ÏâW÷Űᢠûí!À .Í=çGíß;gðO>ý8JþÍkhûÖ_Ëÿš~›ö«´ÝMùlõþa©ûŽa?*Õ¿%^P@‰ÿ¤j’úùÚ?µl)ÿ¤*øOé^?5ö=?Ù}cô=(Û/ˆ/°-+ôLº/©ÿRåüÊjŽçIúíŸÊ/çµù¯‘Ù¾­æ§´^°¿F¿@î×BÂÔ'þ»û±èÿãÁ5£äoÚcèÏ{½·[YúÏH¿/[©æ½Ùß/¸}~=¢¨€LþÅÞÒ~!öº»ÏVðc˜’ïJû´-íÇç´QíÏÙ´_qÝÅø“'x`y¿ÃøËœ_ê>>ÖuÙïÐ…ß>pØÔKû‡UÍßÈûupKÕþßAøûoYù¾Nío˜4h?)Šþ“†ðË1>$ýTó±À>þOdþdÿ[·[e ÀìÓ. ~/)÷©„_Sÿeÿ ÿŠþRþíÊߨò~Êú)é@•üæÍ í>\#×ßEY?…gÚoØ~=ÔGþM²_û\¤ýOu¹ÏðýôœQIáû5ý3Õá×#R~â;²_åüTû3 R¤ü¢»O0ßÇ÷±wEîñ7µÏÒþ:ówjÿš«ö»´WfÞoô£@Ð,¿ììü_äû‚þ„ñu‡ö÷ëš¿‘÷[)¿½Ãó}cدCÿyÿ”îó³úù•ù—%ÿ)ìé{=eËù ío•UÿV™ðËÑ>ªòGy»RûgÇVŸŽç­¿Çbä¯ÕõW£³ÿFÕÝ'Jïßj÷Iþ‰÷Ž´ëý.ôWÂ/ºûóéo9Ô~‹ýV©Ÿ^«:¿òšû2ûÏHÐ#¶¬ä~ÖªøgDÕ¯ÇR~à'ºûðQhž1 ƒÁ`0 ƒÁ`0 ƒÁø\üƒÔ endstream endobj 77 0 obj <> endobj 78 0 obj <> endobj 79 0 obj <> endobj 84 0 obj [/Indexed /DeviceRGB 255 <000000FF00006B6BD2FFFFFF666666FF66667B7B7B6666C24A4AB96B6B6B4242 B1F30000FF9090B1B1DA888888737373B1A1A1FFB1B1CC6B6B181818FF33337B 7BCC6666B9E33333B9B9B99090D2DADADA8888CCB98888FFC2C2424242E37B7B FFE3E3DA9999FF1818FF7B7BEB2121B1B1EBFF4A4A8080D2C2C2E3A9A9A93333 33F33333D252529090E3DADAF3CCCCEBEB1818FFA1A1999999A1A1DAB99090FF D2D2525252EBA9A98080E3A1A1E3EBEBF3080808FF08087B7BD2FF73737373C2 5A5AB9B1B1B1292929FF4242E34242C2C2C2E3E3E3DADAEBF38888FFF3F3EB90 90FF2929FF8888C2C2EBB1B1F3FF5A5AD2D2D2EB4242E34A4A9999F3CCCCF3A1 A1F3C2C2F37373D2FF6B6B8080806B6BC26666CC5252B94A4AB1FF9999B9B9E3 B1B1E3909090B1A9A9FFB9B9D26B6BCC7373212121FF39398080CCE339399999 D29090DAC28080FFCCCC4A4A4AE38080FFEBEBFF2121FF8080F32121B9B9EBFF 52528888D28080DA393939DA4A4A9999E39090EBE3E3F3DADAFFD2D2EBF31010 FFA9A9A1A1A1A9A9DAB99999FFDADA5A5A5A8888E3A9A9E3A1A1EBF3F3F3EBEB FF101010FF10107B7BDA7373CC5A5AC2CCCCCCEBEBEBB9B9F3B1B1FFD2D2F3CC CCFFA9A9F3C2C2FF6B6BCC5252C2D273739999DAC28888F329298888DA9999EB E3E3FF8888EBA9A9EBF3F3FFD2D2FFF7B796FC949005E770C2F0F4F7B82899EB 94F741F7FC9490F7B84E6D892D05E770C2F118F7B77BF741F7FC949003EE8803 D600F713EE00016FF7A2E3007DF1C2F164000FF8DF0008402004F7A3A0C40000 1F200C000FF8000000C4000CC40000DF0008000000F713E22A001EC4000CDEFD 30C2F18CF7A10E03EE8803D60000000305E00FC2F1A800E44A05E0F8000032F7 B9C59A3DEC000030001DE803B600C2F1E000CD7C00000900CD5C000000FF92D0 05E10005E17003B600C2F20400CD7CC2F21000F56A033238FFFFFFC2F2780010 260000300021F9000028FF92D0601232FF94D0FF92A005E100F432F805E100C2 F22C66E8880000006021D3FF92D0F432F805E100C2F26C66E94B00000060D91D>]endobj 83 0 obj <>stream xœí} Oi–¶s1Ónó!H ‚Âf0IX&|&\‡5Ù| .FÁËe@_˜ F€Âm#I‡ÉÆÍF ¼?tÏ9ï¥Þ*@fâäö‚ Æ—AçbSHôïÝœiñ×­ôÆ |E ã‹`c±ªw ~~^±Iäo*ô%1Œ/+óŒÕû'6+6Áö³ò3ßBÁxo¨xÌïŸh‘¿B_ƒÁøhÙXœ{2PÜ]ï÷û»Aø¹«ÁøFp3¸Ÿ u‡zçªxƒñm`3Ä¡ýÅÐB¡¹3…¾ ƒñ…н±ØTõ$„xRÅÓúŒoþ`0^UÕ47×gî3ßî÷nãKñÅ•_ }) ãËâ—¿ßߢ©½×Â`0 ˆë}…¾ƒQT³ø3ß(n3ûŒoÑB_ƒÁ( b· } £0ˆ²ñg0¾MDÙø3ß&˜ü Æ7ŠëìûŒooXúŒoi&?ƒñ­àæó ¿_/äã®ü­µ_ð‚~ëë…¾ã7Ÿ·øWz—:7®|×ùžÔëFþÉ|_ôÒÎÇZÏwTè‹`0þA1S/‰òW6®t^¹Ò Mþëyä_?ðùþ—?× —Âäg0.‰ûÀxã †zõn,Zm;{­Ñ÷ïÿ[È¿ñù²L~ãÒ~'(Ÿ¯P °”?=4NÍ=óù’¨¶]¸Nî–ŠkI2ùŒKÂOt¯j©ðw^¿¡üѨ1©¿•ˆbë»V€ë´aý\^ +?ƒqiÜDÅ‚G3”ñ9¿Yï›üA2ß—ÌØö?˜Ïd“Ù$\+?ƒñˆåïÓÑXçw6å¯Öä§:!YhåÏmõ3@~V~ãó0°Ñ¹!Ž&déO+4:(^S…6‹;Tþ7…¸VDi&›Aîù³>îçg0. g°Sµl!@“äÔÂ/Ò}‚ü€ú@ÿd6+²V~㲘Yê\zNGcADgç†$ÿmÝÑ×*óý¬(ùÔögüÙ üŒÏÅÍÅ`pf—‚ ý@AþÃh4-ϱ+a ~D~¬øù²lûŒÏBïÒâRh³Â_ BÀ Èo ?)¿¦~mf¹ŸM²íg0>þÅx|1¾ø!þ!aø$òGÑ}¨üY‹ý…·ýÄþ$Û~ã³P¬ÿP¯Š ,Å—üףј>¥Õ&üÙB“?+J~äüïòZŒlܯB4‰†ô_ôÓL~cX¿™óg}ÉÆ|ãÚèëöð~*mwwyxïã×p:üëÙY8ŽÐgÚÏú_{jFTüPù“IV~ã3ðóœDÕñ c|Ï|¾?(É—ìÅæøº½©ðþ~d?Lã^ ¯6œÏeÀéò*œFàùRûíkÎó¦J!ßÇFôïÉRw]l\øc0.ŒÇOû逹/GõËQ}IÓö'³è¼3™Tþ—­½ìÚOõS¤û€×ÀíÝÿ>ïçOV‡VOV"«4æá“?^:,ÃÔ¸`þ¸èë“I¿;ãâ(Ö?é}ÒÛ;ÛÜ\SÕDLíóŠQ}¶j?xnâþxžòçºà>)ŒJt&ú¯6ä\|xHpÿ%Š?6éýáKöSvFùýã2é—}D8bò3—¿7ê õÂz‚ìŸû'£Øgé½:H’éGÔ8¾ho>±OÔßGþ*âõONVON]~ûס“!|t?ŒÊOQƒØIì›ç"ùÉ÷Ó ¿lR;òñãRh …B+ÐBž„zç~3 ýF²o R(¿Ãö¯ãß—ôO¡‚£éôzƒ¾çgþ£C#'CC@þW-å—ÒI$Ì€AäÏ’ñÏR¹ß¢>+?ƒqÜX‘Qèý-–Óoúœ@Ê÷3™yÛ×ìu%ÒôƒòHÈW¥ò¯"ÅÚ:424´{‚äÔ틤63¾ùµðgù…+ö2Œ‹âþ€ÄÊÊñÿ/­7¶™õ¾,ÖÝl9n^Ⱦþyð°HãWQ×ÑÞíæì¿ündhw„„ÿääDÿ0±¬? ?|á²uvƒ~Ó÷[®„•ŸÁ¸8~(¦FüýÿÆ›NÛïÓõ>‡ò¿ÝGîKáO…SaUëá‚ ŒüjûáW#€¡]Š (þ»ïÎPýQù÷¥ö'ö­Ó…ògÇůÓ0ëêXùŒ‹ãfw1Bñ`eÓxÓÅô'E_ßxÖ$s‚È¿¿Of=œŠDVwÏ^*ú½GvGFliÿè±DP_†½³U•õ§(–XÒß  ~Ö0V~ãsð˜È?V,B¿ÅxÓ-çÝüY[Á¯Qr;ùQ¶w‰æ¹_¥ðCÊOLkþð[úÓ‰ ÿOê¯Ã`üçUo_"ѧËj–Ä_¬èa]+?ƒqq<öuwûíÊŸWíOf{¨ânöóß½Šäߗ‰h½>¢Z?æûCÄSú‡FýÉõ[oìb¹ÈIääe¿êÓ0®ËýjjU‹`åg0.·€äÿ@…ñ^žîõ³Rû Û?Ü¿ M°×zg;ù‡PÞIù²ÞÙCê¿Bã?tbô…_î6ŒöŸ:û¦ˆúBû1Ð"ž¬ü ÆgÀß]è®Gþ#û7'´›å>_6LÿÞÕ« I}ª÷åŒ÷ND±ì=ÁzãT ?ÕûOÞ}âÅjî ågÅg0.çâ›þz’ÿâ çZ åÙÏ¿Qgâ*¥ü²à×`¾Òä¦b?°ý­¥ð¹·Èþ·ôŽóý„é´˜‡œØ×ƒ¦Ÿ'ô0Ÿ¿±¼¿ ù³¦ïÏŸÏ?ÂÒ/¹i6ß;¥þ!)ü#µÞQÊ/»úWëg££Ín£€ Èr¿˜Ù“dåg0>é3Ù_ßíF~£“?ébûß_¥”_VüÃ~¥ò á7ëýôRÒÿDŒðÇ©½‘ðnÿiUc|Øö3Ÿ‹XßðþŸ-úÍ8O±­á—Í_Ìc„_Ò?’Ûß=#é—"ÿÖHúÿ›Ê}¤üb€¿œÜüO¥vïæ\/7#†øeiF?Oèa0.ëÑ´wÂoÙŸ¯üz4 ÖûòÉß|ÕÈù#‘HûIûnûî¶³wgTî“Å~hVfŸÃ”_)ÿÍ ¾4-(Ùop+ŒÓ¼½€/“ŸÁ¸q±®–– „fÿŒó,Û~.ä§^þ„®ö›Ëøà„>Tþ!9Êgä­Áè¿êœ_ð%åËñ½)ç„~‚ZɇÆösÎÏ`\bîîf ÂbÿŒó´‘¿áêUQï¾GçÍÓ}ò“!1ÆG)¿9ÌÇÈù‡TÒ/föÐJ@ûûgy—lüàjšóN`0‡\¤s`ÐßüY‹û.ýüS ´ýªÚŸ@ÛNÚ/çõœ¨‚ñß\ÐkïJùMåˆ~`üö^C„îê˰ò3—…Z¤³bsSð_°¿þ†óDSùÝ ~ V¹’~þ”X¿/,øIåG¡·­æ·÷VŒÔ·ôÐËy8Ù­”?Ë9?ƒqY(î?ž©ûÏU~Ëõ»ÙþI³Ú/&öÐ^±Ž‡˜²«¤ß¾”gî?‡dÊ¿z"‚)D(?.äçø­ŒZÊGäülûŒ ã0z]ùgff*Èúûgœ§ZÕ~*÷çð›Õ~k”ϼ´ý‘°š×£êýNò{½§ÿI¿Ö}±–Ìùû Ǩ}]ìϰò3—BßmuWŽŸgfn û+Ðø»“ß>³'o„_s¾ò‹¥|(é²ÿ<ò{ñž# ü/UüHøi^ŸsÔÀ¸X»;ÃÕ~ã’°îÁûóù'>Jþlþ:E??P_Tûç§§kÐöâpÎõœ¿;‘®^ÌçO!õ÷‰œíùÊß®gõ‘úæÊ{©ˆUïK$–moÊÛu‰A>¬ü ÆE¡ïŸ®æÆïåüëæb^Ùd&ï뎤í—+ùØjt¹ß£»wz:<üÓÙÙªÉâZ¾“ï†ï´/ù›‘KyHåŸü¤ÿ\ƒ!q]õñ#€ø7ˆûçVû¬•2if ꃜu ñ“S{‘ý~ãûXÆ;ûixô•}a®W¿þôŽº÷iBϪ¹’O¿Èùé ¯:rþ.P~ZFL(¿ìyàî~ãÓPm¸þDz§]ÿ„ë¿ucJ/®Ü]:utw»+c¸ûVáûåœÞýˆõVƒ^»ŸîÌ1¢~{ÿðoâ^]«ÏDÂäÏÙ®¥±Tß±'‰~¤±}ª6yð·øWa0¾ÜÖwáõz®æ›ÂŸ?¯Ù6+í=Xt›²ÎÈIòÓHŸÈ~*%Ù¿&‡í…Qßi!ÏœúÈ«= Ÿ`Ý‘{]?Ú~rýÖÚÝ„F½x¯yûàäßè†ÁøÊÑ­¶Rþ_**Ôð^Êøëýÿ7ï>›ôc;ÊïkãŒvs˜ÎÇ 7Œö¾”ÔÇÁ{â†\Æ*^'CrmO9£'<šÃ?ï5¤tOÖûS{ÚEO_FŒñÑø[þó0_/Ž>ïÍŠMIý‰s¦ôz3ö™=”rÛoו벆øÒŒ~q“nû}ºWmkôâÊž«òîÜrdßnûnX ðÙÜ/áè7œ”Â/”_oÓã«EµYïÚcÓsúüÝ3y¨±I?òÍ·mÎÍ‘îí£Ûõí«™}4Ä_êÿÉIÎøDîäÄä¾ÝgõóEð wíWâmÜÇ‘ý>¾cƒqA˜äÿ¹¥E®å1¡–ñšÉûÀ¤©üú>½öþþvYò»º/²~âp8bQ(n/Üë„_Ýw>¢—ñÀé¼h$rÎk—Âï3oÒËýý Æ'!jÿ—‰–‰½ŠW½¿¾Û…ü9Û=»ô}zí'Í'(ë$ôr>á”pþ’ú«Î¹w«Öd¾°^ÄCÌé‘ý|ùƒZ³êf]jØnÜßÏ`| ¢FOß ÿ6Å}¼oOÞžŽå<|IºQ¯“ü¹°ãK¦ù}b–®S÷»V¾§¤ÂÒò§h= ü®¿æ}Ä»7žµ:ú4Ú?÷ß„Áø&`*ÿ¦céÞn—›vÞ›Ê/´?›qŽá?KÐðþ«2éW{åb~n#ýÞ™sø#j6_Šfó%ö#®“&3bÙn›i½ü¿ƒñ á¶EþÇzÝîz¡ûn·ëäžÔ÷ɂ޸º£ÒËôòNÝ)¹œW$üSÎõRŽ„á§•»ÂF­…?õNy±Ž‡-áQ> ƧÀPþ›@yâ=4y«¾üu"r]û‘üI`¿Ë Úá”è—Py?!Ü;÷bFOÔŠ½ÒóGhh_äìü¹“ìp°i?“ŸÁøD«£êf-HzÁüzy—î7åÕd²–öÌ¿vP:ÚŽºäO…çwï~däýéðÙ‰òü4¶/uÒ_°aªÖ”ýÄñòƒß?ŸÁ`bzxïc}{nIý±âWå>>::ZoþØŒýWk¯ÖÄj>Ÿ|Qê§á½Â\^Î'žÎ`0ƒQq·¯÷—n…1BqñÀÀÊïŸÁ`üCã ø~q´9f˜Ügò3_/¢Ñè!î×kæ÷WZ }y ãï…ê¨XÊç9¾˜hOªÜ…˜ü ÆW‹¾¨ä7t/–¢~Áäg0¾^û¯{½cHxE|IýÞ¹‰B_ƒÁø»!Åš_Eh%´‚¬³/˜êí›cåg0¾b ‚ôGBÈþf>P¸ÏÊÏ`|ÕÀ¬ÿ@wÚˆø`ø‘úMMþB_ƒÁø{¥ÿ7ú^¤}¯Ð|ä~0(ˆÇk  Ø`D‡öí×­ØÚ·Û[U;/$`4 ‡ý1íÙ÷hýÿÄÿm1¸ º¿|'€þz«îá`90>FB=»S‚ìóîÌvô:hØp%FŠ’ÙXÚOe-#¯C;à-¸³0ˆ~¿£Ž–¯ë0Ïi[hÃìÂû¢Òƒ!¡­r– ±J¢}Y]ú‚­…E”Q<ž‹åü–æ›Òo ì™MÐ<½G> }®öŸ>85èoñœ8ß¼ö Ù­h¿$‡‡ØÐ¬K7 Žá@÷©MXE÷#hÃJûG%ñiwËlŠñ¸5yKcRøIý~;é—÷‘ößOM‚ðO~?e6EðÈ{`?6ê#í[‘îÛí†%  6¤=vÏZ%ÿéÙ >0_qý˜žk„-˜·”ŸœB#n©šFxn´¸ßˆÜo´´ß&þëkmD×Ú ŽDÄGšÙáàGhHtr?RC¼/ŦP|—dÇnÄthÁ}â|¾ê)U„—ÜïÁ嬀ö¸¨º‚,nÂøp‡/ðöZ´è…XçÒ"ÿÅÅ¥xü7,ûýWÓ"ÙýÅÅà´ ù©Âm«{8‹‘òw$?p\áNݬ`{Ñ2à¡é‚ž:.£W]ûï -ðUvà7¥á é“uóœ’_Í=ôõÓ 1V½;++ñ¯áÃø±jØÅ.B}—(3viÒ~öôþÁyÚo×} þÞšMøÅ4gü›=pŠ?i¿Hš…ðÛÄŸ( •²¥ûÃnÀÝ~up«ßˆyªßO´¿µ,èkR‡bÿÔÔ䔡ü¦P1`Usaý¿ßކ͖´£êߤð‹½]÷Qõå^„€VKôÿÏ5ØTN`—}|Týy¢;<”ú7ZÍzì'í·YýÒ5°é>„‚kZ÷1àëT@(ÿÔý§OÇŸ"åi/--5%ßd$  ‚~´ÿúÔ”ð‹-ké?ŸêÿúǽKAäz$þŽþöaì>¼ ;ƒ6ò— ¦nÕŸ1⸠‘gyžö*ëLò×S…š;•m·­c«Þh¥çE>ùÓm•Èö¨`;üNG”XN¢m–ªJ ñ³fÁàSèoùý\^[ÚEûÅÞ]û ö›ªoj¿®4ÛËk¦ò?²ë¾Ò~Cù×µÝ?’H?,µ_‰¿Cûï’ðdXÖz/›¤~¿aü%ó—…ç—Ú?)ÔßÔ} (÷ úÀý)Ãú;tÉßÞJÛ¶!üZ÷Û¡µ¶Ãó±6Rú•ë—–_ÿXk¿|¨ÂÀ<ÑÞR~“þ û5]`ìÊoñ^»WíWºÄ¿&ŒÿS²ü:ï?Ê/Ô_˜~|HÖKá—q€èýC)Ñ^k¿f¿”~8øAZ±vµd~’¨/´ö —Ÿ•¼'êÓß²šüõÀsäz0ø¯ÿGûýñ½Øè„f#êô½Ù鯄ò{ªù%ëbH¢K ò÷É¿Ùu\uü-²ÇŠ®ÏzòÈß7}{‡¾IüŠ·dzº#`½”D¼úð½@삾ߌ.Å?þ¼"à=öÎ×þ½SS÷Úß,ÙeßEù­ò_3é¾~<Àl)¿®Ú]­ûÃ:ëwhÿ­~Cùïjí_6ó}ñ÷kí—•ïʯ´_Å€×È{tû–÷ÝŸ²åû¢¡÷Ý*”¿µÝ,á[[-ÁoÕOZûI÷üHÿg†æ«ä=¥ü˜üká×A e…€®FWt5v]k¼ÖUÛu­ËUûµî“í¿&…_Š>=¿Mè?E’~ÓúK`©öãš÷ãvíÏëïùAi&©š¢¿ÔþŒÖ~"¾Èõ³Û X ±òG4ÿÑ¿,mtv¯t^±‘ŸJóŽ-¨¬M“Á®ö´íx0 zh7íÑl‘ßëé»;1›'­óp£Eõ‹Ù<òÇ*ËËMò{^D©œ¯È§:–Æ«óP ©óô]LùÍBŸ“úJûEÕ/m¯ùS;GûAùO䷴ߪó­iöËðHª¿¡ÿGÍ–ö7«¼_è¾,õ©@0_i¿æ¿%ýH}þ»†õy¿~Ò}§òkö[¼'íŸt~Ù€1€lD€©ísŠ}ÛDúvÊûÛ-í?&ío•vÍ¿`¾!ýó¸ÕKÅ—ûg¦öÏ+áGç¯6Óù§„ô7Ú­€Úk°á£K‰¿Mû­Œ™MýI÷§ïÔíéSÅþ[ѯÔHdª?Žâ/ÆõÇ•ç_ú„Û·©D⟥[júä--Í‚ßãP'ð|ã xüà*þŸ¢èþ£þËÿÿ°ñ ºïknm"}O“òƒ°W")Óƒ“-$#ïê<1'ùït”‹à±Yzñf]™†(ìÚòÈuJÛeRoYâ xÚðc垎 uõÙ‚€KÏŸ—”ß)þB÷õ]´ß©ûμÿ•tkpdïÌKüåi¿Ðÿõ#;ý…0µßVï7´_øÿ~³âÒ¯u_)¿ ·–ÏÑþ)ËX1à{¡ý´ÕñÚöŸ„[$þöÎ@$;Ðÿeë±ØTõï™,ø¡òߟKñŸ¯12~É|!ùêXûS5–æKÆ+÷/F¨íïß…´wA+hç/»~|o6Jd’þ÷¥FÞ/CÀ¸¦©©û¢Ê/{þ¤ ûb‹¼3¬Tÿ¬ ½Èû…óÏêq×¹•.@ü?ß²qeãÊ•ÎNÜÑ3Ä‚¥ùcuTàv´Z÷»‰ìÚã½#l¬ˆXX$U˜̦¤Ü´ý^ÙùîU¹|ò£“Ç‚ßV>ùÛ:›–Ah:0h¼„ÏâW÷Űᢠûí!À .Í=çGíß;gðO>ý8JþÍkhûÖ_Ëÿš~›ö«´ÝMùlõþa©ûŽa?*Õ¿%^P@‰ÿ¤j’úùÚ?µl)ÿ¤*øOé^?5ö=?Ù}cô=(Û/ˆ/°-+ôLº/©ÿRåüÊjŽçIúíŸÊ/çµù¯‘Ù¾­æ§´^°¿F¿@î×BÂÔ'þ»û±èÿãÁ5£äoÚcèÏ{½·[YúÏH¿/[©æ½Ùß/¸}~=¢¨€LþÅÞÒ~!öº»ÏVðc˜’ïJû´-íÇç´QíÏÙ´_qÝÅø“'x`y¿ÃøËœ_ê>>ÖuÙïÐ…ß>pØÔKû‡UÍßÈûupKÕþßAøûoYù¾Nío˜4h?)Šþ“†ðË1>$ýTó±À>þOdþdÿ[·[e ÀìÓ. ~/)÷©„_Sÿeÿ ÿŠþRþíÊߨò~Êú)é@•üæÍ í>\#×ßEY?…gÚoØ~=ÔGþM²_û\¤ýOu¹ÏðýôœQIáû5ý3Õá×#R~â;²_åüTû3 R¤ü¢»O0ßÇ÷±wEîñ7µÏÒþ:ówjÿš«ö»´WfÞoô£@Ð,¿ììü_äû‚þ„ñu‡ö÷ëš¿‘÷[)¿½Ãó}cدCÿyÿ”îó³úù•ù—%ÿ)ìé{=eËù ío•UÿV™ðËÑ>ªòGy»RûgÇVŸŽç­¿Çbä¯ÕõW£³ÿFÕÝ'Jïßj÷Iþ‰÷Ž´ëý.ôWÂ/ºûóéo9Ô~‹ýV©Ÿ^«:¿òšû2ûÏHÐ#¶¬ä~ÖªøgDÕ¯ÇR~à'ºûðQhž1 ƒÁ`0 ƒÁ`0 ƒÁø\üƒÔ endstream endobj 85 0 obj <> endobj 86 0 obj <> endobj 87 0 obj <> endobj 92 0 obj [/Indexed /DeviceRGB 255 <000000FF00006B6BD2FFFFFF666666FF66667B7B7B6666C24A4AB96B6B6B4242 B1F30000FF9090B1B1DA888888737373B1A1A1FFB1B1CC6B6B181818FF33337B 7BCC6666B9E33333B9B9B99090D2DADADA8888CCB98888FFC2C2424242E37B7B FFE3E3DA9999FF1818FF7B7BEB2121B1B1EBFF4A4A8080D2C2C2E3A9A9A93333 33F33333D252529090E3DADAF3CCCCEBEB1818FFA1A1999999A1A1DAB99090FF D2D2525252EBA9A98080E3A1A1E3EBEBF3080808FF08087B7BD2FF73737373C2 5A5AB9B1B1B1292929FF4242E34242C2C2C2E3E3E3DADAEBF38888FFF3F3EB90 90FF2929FF8888C2C2EBB1B1F3FF5A5AD2D2D2EB4242E34A4A9999F3CCCCF3A1 A1F3C2C2F37373D2FF6B6B8080806B6BC26666CC5252B94A4AB1FF9999B9B9E3 B1B1E3909090B1A9A9FFB9B9D26B6BCC7373212121FF39398080CCE339399999 D29090DAC28080FFCCCC4A4A4AE38080FFEBEBFF2121FF8080F32121B9B9EBFF 52528888D28080DA393939DA4A4A9999E39090EBE3E3F3DADAFFD2D2EBF31010 FFA9A9A1A1A1A9A9DAB99999FFDADA5A5A5A8888E3A9A9E3A1A1EBF3F3F3EBEB FF101010FF10107B7BDA7373CC5A5AC2CCCCCCEBEBEBB9B9F3B1B1FFD2D2F3CC CCFFA9A9F3C2C2FF6B6BCC5252C2D273739999DAC28888F329298888DA9999EB E3E3FF8888EBA9A9EBF3F3FFD2D2FFF7B796FC949005E770C2F0F4F7B82899EB 94F741F7FC9490F7B84E6D892D05E770C2F118F7B77BF741F7FC949003EE8803 D600F713EE00016FF7A2E3007DF1C2F164000FF8DF0008402004F7A3A0C40000 1F200C000FF8000000C4000CC40000DF0008000000F713E22A001EC4000CDEFD 30C2F18CF7A10E03EE8803D60000000305E00FC2F1A800E44A05E0F8000032F7 B9C59A3DEC000030001DE803B600C2F1E000CD7C00000900CD5C000000FF92D0 05E10005E17003B600C2F20400CD7CC2F21000F56A033238FFFFFFC2F2780010 260000300021F9000028FF92D0601232FF94D0FF92A005E100F432F805E100C2 F22C66E8880000006021D3FF92D0F432F805E100C2F26C66E94B00000060D91D>]endobj 91 0 obj <>stream xœí} Oi–¶s1Ónó!H ‚Âf0IX&|&\‡5Ù| .FÁËe@_˜ F€Âm#I‡ÉÆÍF ¼?tÏ9ï¥Þ*@fâäö‚ Æ—AçbSHôïÝœiñ×­ôÆ |E ã‹`c±ªw ~~^±Iäo*ô%1Œ/+óŒÕû'6+6Áö³ò3ßBÁxo¨xÌïŸh‘¿B_ƒÁøhÙXœ{2PÜ]ï÷û»Aø¹«ÁøFp3¸Ÿ u‡zçªxƒñm`3Ä¡ýÅÐB¡¹3…¾ ƒñ…н±ØTõ$„xRÅÓúŒoþ`0^UÕ47×gî3ßî÷nãKñÅ•_ }) ãËâ—¿ßߢ©½×Â`0 ˆë}…¾ƒQT³ø3ß(n3ûŒoÑB_ƒÁ( b· } £0ˆ²ñg0¾MDÙø3ß&˜ü Æ7ŠëìûŒooXúŒoi&?ƒñ­àæó ¿_/äã®ü­µ_ð‚~ëë…¾ã7Ÿ·øWz—:7®|×ùžÔëFþÉ|_ôÒÎÇZÏwTè‹`0þA1S/‰òW6®t^¹Ò Mþëyä_?ðùþ—?× —Âäg0.‰ûÀxã †zõn,Zm;{­Ñ÷ïÿ[È¿ñù²L~ãÒ~'(Ÿ¯P °”?=4NÍ=óù’¨¶]¸Nî–ŠkI2ùŒKÂOt¯j©ðw^¿¡üѨ1©¿•ˆbë»V€ë´aý\^ +?ƒqiÜDÅ‚G3”ñ9¿Yï›üA2ß—ÌØö?˜Ïd“Ù$\+?ƒñˆåïÓÑXçw6å¯Öä§:!YhåÏmõ3@~V~ãó0°Ñ¹!Ž&déO+4:(^S…6‹;Tþ7…¸VDi&›Aîù³>îçg0. g°Sµl!@“äÔÂ/Ò}‚ü€ú@ÿd6+²V~㲘Yê\zNGcADgç†$ÿmÝÑ×*óý¬(ùÔögüÙ üŒÏÅÍÅ`pf—‚ ý@AþÃh4-ϱ+a ~D~¬øù²lûŒÏBïÒâRh³Â_ BÀ Èo ?)¿¦~mf¹ŸM²íg0>þÅx|1¾ø!þ!aø$òGÑ}¨üY‹ý…·ýÄþ$Û~ã³P¬ÿP¯Š ,Å—üףј>¥Õ&üÙB“?+J~äüïòZŒlܯB4‰†ô_ôÓL~cX¿™óg}ÉÆ|ãÚèëöð~*mwwyxïã×p:üëÙY8ŽÐgÚÏú_{jFTüPù“IV~ã3ðóœDÕñ c|Ï|¾?(É—ìÅæøº½©ðþ~d?Lã^ ¯6œÏeÀéò*œFàùRûíkÎó¦J!ßÇFôïÉRw]l\øc0.ŒÇOû逹/GõËQ}IÓö'³è¼3™Tþ—­½ìÚOõS¤û€×ÀíÝÿ>ïçOV‡VOV"«4æá“?^:,ÃÔ¸`þ¸èë“I¿;ãâ(Ö?é}ÒÛ;ÛÜ\SÕDLíóŠQ}¶j?xnâþxžòçºà>)ŒJt&ú¯6ä\|xHpÿ%Š?6éýáKöSvFùýã2é—}D8bò3—¿7ê õÂz‚ìŸû'£Øgé½:H’éGÔ8¾ho>±OÔßGþ*âõONVON]~ûס“!|t?ŒÊOQƒØIì›ç"ùÉ÷Ó ¿lR;òñãRh …B+ÐBž„zç~3 ýF²o R(¿Ãö¯ãß—ôO¡‚£éôzƒ¾çgþ£C#'CC@þW-å—ÒI$Ì€AäÏ’ñÏR¹ß¢>+?ƒqÜX‘Qèý-–Óoúœ@Ê÷3™yÛ×ìu%ÒôƒòHÈW¥ò¯"ÅÚ:424´{‚äÔ틤63¾ùµðgù…+ö2Œ‹âþ€ÄÊÊñÿ/­7¶™õ¾,ÖÝl9n^Ⱦþyð°HãWQ×ÑÞíæì¿ündhw„„ÿääDÿ0±¬? ?|á²uvƒ~Ó÷[®„•ŸÁ¸8~(¦FüýÿÆ›NÛïÓõ>‡ò¿ÝGîKáO…SaUëá‚ ŒüjûáW#€¡]Š (þ»ïÎPýQù÷¥ö'ö­Ó…ògÇůÓ0ëêXùŒ‹ãfw1Bñ`eÓxÓÅô'E_ßxÖ$s‚È¿¿Of=œŠDVwÏ^*ú½GvGFliÿè±DP_†½³U•õ§(–XÒß  ~Ö0V~ãsð˜È?V,B¿ÅxÓ-çÝüY[Á¯Qr;ùQ¶w‰æ¹_¥ðCÊOLkþð[úÓ‰ ÿOê¯Ã`üçUo_"ѧËj–Ä_¬èa]+?ƒqq<öuwûíÊŸWíOf{¨ânöóß½Šäߗ‰h½>¢Z?æûCÄSú‡FýÉõ[oìb¹ÈIääe¿êÓ0®ËýjjU‹`åg0.·€äÿ@…ñ^žîõ³Rû Û?Ü¿ M°×zg;ù‡PÞIù²ÞÙCê¿Bã?tbô…_î6ŒöŸ:û¦ˆúBû1Ð"ž¬ü ÆgÀß]è®Gþ#û7'´›å>_6LÿÞÕ« I}ª÷åŒ÷ND±ì=ÁzãT ?ÕûOÞ}âÅjî ågÅg0.çâ›þz’ÿâ çZ åÙÏ¿Qgâ*¥ü²à×`¾Òä¦b?°ý­¥ð¹·Èþ·ôŽóý„é´˜‡œØ×ƒ¦Ÿ'ô0Ÿ¿±¼¿ ù³¦ïÏŸÏ?ÂÒ/¹i6ß;¥þ!)ü#µÞQÊ/»úWëg££Ín£€ Èr¿˜Ù“dåg0>é3Ù_ßíF~£“?ébûß_¥”_VüÃ~¥ò á7ëýôRÒÿDŒðÇ©½‘ðnÿiUc|Øö3Ÿ‹XßðþŸ-úÍ8O±­á—Í_Ìc„_Ò?’Ûß=#é—"ÿÖHúÿ›Ê}¤üb€¿œÜüO¥vïæ\/7#†øeiF?Oèa0.ëÑ´wÂoÙŸ¯üz4 ÖûòÉß|ÕÈù#‘HûIûnûî¶³wgTî“Å~hVfŸÃ”_)ÿÍ ¾4-(Ùop+ŒÓ¼½€/“ŸÁ¸q±®–– „fÿŒó,Û~.ä§^þ„®ö›Ëøà„>Tþ!9Êgä­Áè¿êœ_ð%åËñ½)ç„~‚ZɇÆösÎÏ`\bîîf ÂbÿŒó´‘¿áêUQï¾GçÍÓ}ò“!1ÆG)¿9ÌÇÈù‡TÒ/föÐJ@ûûgy—lüàjšóN`0‡\¤s`ÐßüY‹û.ýüS ´ýªÚŸ@ÛNÚ/çõœ¨‚ñß\ÐkïJùMåˆ~`üö^C„îê˰ò3—…Z¤³bsSð_°¿þ†óDSùÝ ~ V¹’~þ”X¿/,øIåG¡·­æ·÷VŒÔ·ôÐËy8Ù­”?Ë9?ƒqY(î?ž©ûÏU~Ëõ»ÙþI³Ú/&öÐ^±Ž‡˜²«¤ß¾”gî?‡dÊ¿z"‚)D(?.äçø­ŒZÊGäülûŒ ã0z]ùgff*Èúûgœ§ZÕ~*÷çð›Õ~k”ϼ´ý‘°š×£êýNò{½§ÿI¿Ö}±–Ìùû Ǩ}]ìϰò3—BßmuWŽŸgfn û+Ðø»“ß>³'o„_s¾ò‹¥|(é²ÿ<ò{ñž# ü/UüHøi^ŸsÔÀ¸X»;ÃÕ~ã’°îÁûóù'>Jþlþ:E??P_Tûç§§kÐöâpÎõœ¿;‘®^ÌçO!õ÷‰œíùÊß®gõ‘úæÊ{©ˆUïK$–moÊÛu‰A>¬ü ÆE¡ïŸ®æÆïåüëæb^Ùd&ï뎤í—+ùØjt¹ß£»wz:<üÓÙÙªÉâZ¾“ï†ï´/ù›‘KyHåŸü¤ÿ\ƒ!q]õñ#€ø7ˆûçVû¬•2if ꃜu ñ“S{‘ý~ãûXÆ;ûixô•}a®W¿þôŽº÷iBϪ¹’O¿Èùé ¯:rþ.P~ZFL(¿ìyàî~ãÓPm¸þDz§]ÿ„ë¿ucJ/®Ü]:utw»+c¸ûVáûåœÞýˆõVƒ^»ŸîÌ1¢~{ÿðoâ^]«ÏDÂäÏÙ®¥±Tß±'‰~¤±}ª6yð·øWa0¾ÜÖwáõz®æ›ÂŸ?¯Ù6+í=Xt›²ÎÈIòÓHŸÈ~*%Ù¿&‡í…Qßi!ÏœúÈ«= Ÿ`Ý‘{]?Ú~rýÖÚÝ„F½x¯yûàäßè†ÁøÊÑ­¶Rþ_**Ôð^Êøëýÿ7ï>›ôc;ÊïkãŒvs˜ÎÇ 7Œö¾”ÔÇÁ{â†\Æ*^'CrmO9£'<šÃ?ï5¤tOÖûS{ÚEO_FŒñÑø[þó0_/Ž>ïÍŠMIý‰s¦ôz3ö™=”rÛoו벆øÒŒ~q“nû}ºWmkôâÊž«òîÜrdßnûnX ðÙÜ/áè7œ”Â/”_oÓã«EµYïÚcÓsúüÝ3y¨±I?òÍ·mÎÍ‘îí£Ûõí«™}4Ä_êÿÉIÎøDîäÄä¾ÝgõóEð wíWâmÜÇ‘ý>¾cƒqA˜äÿ¹¥E®å1¡–ñšÉûÀ¤©üú>½öþþvYò»º/²~âp8bQ(n/Üë„_Ýw>¢—ñÀé¼h$rÎk—Âï3oÒËýý Æ'!jÿ—‰–‰½ŠW½¿¾Û…ü9Û=»ô}zí'Í'(ë$ôr>á”pþ’ú«Î¹w«Öd¾°^ÄCÌé‘ý|ùƒZ³êf]jØnÜßÏ`| ¢FOß ÿ6Å}¼oOÞžŽå<|IºQ¯“ü¹°ãK¦ù}b–®S÷»V¾§¤ÂÒò§h= ü®¿æ}Ä»7žµ:ú4Ú?÷ß„Áø&`*ÿ¦céÞn—›vÞ›Ê/´?›qŽá?KÐðþ«2éW{åb~n#ýÞ™sø#j6_Šfó%ö#®“&3bÙn›i½ü¿ƒñ á¶EþÇzÝîz¡ûn·ëäžÔ÷ɂ޸º£ÒËôòNÝ)¹œW$üSÎõRŽ„á§•»ÂF­…?õNy±Ž‡-áQ> ƧÀPþ›@yâ=4y«¾üu"r]û‘üI`¿Ë Úá”è—Py?!Ü;÷bFOÔŠ½ÒóGhh_äìü¹“ìp°i?“ŸÁøD«£êf-HzÁüzy—î7åÕd²–öÌ¿vP:ÚŽºäO…çwï~däýéðÙ‰òü4¶/uÒ_°aªÖ”ýÄñòƒß?ŸÁ`bzxïc}{nIý±âWå>>::ZoþØŒýWk¯ÖÄj>Ÿ|Qê§á½Â\^Î'žÎ`0ƒQq·¯÷—n…1BqñÀÀÊïŸÁ`üCã ø~q´9f˜Ügò3_/¢Ñè!î×kæ÷WZ }y ãï…ê¨XÊç9¾˜hOªÜ…˜ü ÆW‹¾¨ä7t/–¢~Áäg0¾^û¯{½cHxE|IýÞ¹‰B_ƒÁø»!Åš_Eh%´‚¬³/˜êí›cåg0¾b ‚ôGBÈþf>P¸ÏÊÏ`|ÕÀ¬ÿ@wÚˆø`ø‘úMMþB_ƒÁø{¥ÿ7ú^¤}¯Ð|ä~0(ˆÇk  Ø`D‡öí×­ØÚ·Û[U;/$`4 ‡ý1íÙ÷hýÿÄÿm1¸ º¿|'€þz«îá`90>FB=»S‚ìóîÌvô:hØp%FŠ’ÙXÚOe-#¯C;à-¸³0ˆ~¿£Ž–¯ë0Ïi[hÃìÂû¢Òƒ!¡­r– ±J¢}Y]ú‚­…E”Q<ž‹åü–æ›Òo ì™MÐ<½G> }®öŸ>85èoñœ8ß¼ö Ù­h¿$‡‡ØÐ¬K7 Žá@÷©MXE÷#hÃJûG%ñiwËlŠñ¸5yKcRøIý~;é—÷‘ößOM‚ðO~?e6EðÈ{`?6ê#í[‘îÛí†%  6¤=vÏZ%ÿéÙ >0_qý˜žk„-˜·”ŸœB#n©šFxn´¸ßˆÜo´´ß&þëkmD×Ú ŽDÄGšÙáàGhHtr?RC¼/ŦP|—dÇnÄthÁ}â|¾ê)U„—ÜïÁ嬀ö¸¨º‚,nÂøp‡/ðöZ´è…XçÒ"ÿÅÅ¥xü7,ûýWÓ"ÙýÅÅà´ ù©Âm«{8‹‘òw$?p\áNݬ`{Ñ2à¡é‚ž:.£W]ûï -ðUvà7¥á é“uóœ’_Í=ôõÓ 1V½;++ñ¯áÃø±jØÅ.B}—(3viÒ~öôþÁyÚo×} þÞšMøÅ4gü›=pŠ?i¿Hš…ðÛÄŸ( •²¥ûÃnÀÝ~up«ßˆyªßO´¿µ,èkR‡bÿÔÔ䔡ü¦P1`Usaý¿ßކ͖´£êߤð‹½]÷Qõå^„€VKôÿÏ5ØTN`—}|Týy¢;<”ú7ZÍzì'í·YýÒ5°é>„‚kZ÷1àëT@(ÿÔý§OÇŸ"åi/--5%ßd$  ‚~´ÿúÔ”ð‹-ké?ŸêÿúǽKAäz$þŽþöaì>¼ ;ƒ6ò— ¦nÕŸ1⸠‘gyžö*ëLò×S…š;•m·­c«Þh¥çE>ùÓm•Èö¨`;üNG”XN¢m–ªJ ñ³fÁàSèoùý\^[ÚEûÅÞ]û ö›ªoj¿®4ÛËk¦ò?²ë¾Ò~Cù×µÝ?’H?,µ_‰¿Cûï’ðdXÖz/›¤~¿aü%ó—…ç—Ú?)ÔßÔ} (÷ úÀý)Ãú;tÉßÞJÛ¶!üZ÷Û¡µ¶Ãó±6Rú•ë—–_ÿXk¿|¨ÂÀ<ÑÞR~“þ û5]`ìÊoñ^»WíWºÄ¿&ŒÿS²ü:ï?Ê/Ô_˜~|HÖKá—q€èýC)Ñ^k¿f¿”~8øAZ±vµd~’¨/´ö —Ÿ•¼'êÓß²šüõÀsäz0ø¯ÿGûýñ½Øè„f#êô½Ù鯄ò{ªù%ëbH¢K ò÷É¿Ùu\uü-²ÇŠ®ÏzòÈß7}{‡¾IüŠ·dzº#`½”D¼úð½@삾ߌ.Å?þ¼"à=öÎ×þ½SS÷Úß,ÙeßEù­ò_3é¾~<Àl)¿®Ú]­ûÃ:ëwhÿ­~Cùïjí_6ó}ñ÷kí—•ïʯ´_Å€×È{tû–÷ÝŸ²åû¢¡÷Ý*”¿µÝ,á[[-ÁoÕOZûI÷üHÿg†æ«ä=¥ü˜üká×A e…€®FWt5v]k¼ÖUÛu­ËUûµî“í¿&…_Š>=¿Mè?E’~ÓúK`©öãš÷ãvíÏëïùAi&©š¢¿ÔþŒÖ~"¾Èõ³Û X ±òG4ÿÑ¿,mtv¯t^±‘ŸJóŽ-¨¬M“Á®ö´íx0 zh7íÑl‘ßëé»;1›'­óp£Eõ‹Ù<òÇ*ËËMò{^D©œ¯È§:–Æ«óP ©óô]LùÍBŸ“úJûEÕ/m¯ùS;GûAùO䷴ߪó­iöËðHª¿¡ÿGÍ–ö7«¼_è¾,õ©@0_i¿æ¿%ýH}þ»†õy¿~Ò}§òkö[¼'íŸt~Ù€1€lD€©ísŠ}ÛDúvÊûÛ-í?&ío•vÍ¿`¾!ýó¸ÕKÅ—ûg¦öÏ+áGç¯6Óù§„ô7Ú­€Úk°á£K‰¿Mû­Œ™MýI÷§ïÔíéSÅþ[ѯÔHdª?Žâ/ÆõÇ•ç_ú„Û·©D⟥[júä--Í‚ßãP'ð|ã xüà*þŸ¢èþ£þËÿÿ°ñ ºïknm"}O“òƒ°W")Óƒ“-$#ïê<1'ùït”‹à±Yzñf]™†(ìÚòÈuJÛeRoYâ xÚðc垎 uõÙ‚€KÏŸ—”ß)þB÷õ]´ß©ûμÿ•tkpdïÌKüåi¿Ðÿõ#;ý…0µßVï7´_øÿ~³âÒ¯u_)¿ ·–ÏÑþ)ËX1à{¡ý´ÕñÚöŸ„[$þöÎ@$;Ðÿeë±ØTõï™,ø¡òߟKñŸ¯12~É|!ùêXûS5–æKÆ+÷/F¨íïß…´wA+hç/»~|o6Jd’þ÷¥FÞ/CÀ¸¦©©û¢Ê/{þ¤ ûb‹¼3¬Tÿ¬ ½Èû…óÏêq×¹•.@ü?ß²qeãÊ•ÎNÜÑ3Ä‚¥ùcuTàv´Z÷»‰ìÚã½#l¬ˆXX$U˜̦¤Ü´ý^ÙùîU¹|ò£“Ç‚ßV>ùÛ:›–Ah:0h¼„ÏâW÷Űᢠûí!À .Í=çGíß;gðO>ý8JþÍkhûÖ_Ëÿš~›ö«´ÝMùlõþa©ûŽa?*Õ¿%^P@‰ÿ¤j’úùÚ?µl)ÿ¤*øOé^?5ö=?Ù}cô=(Û/ˆ/°-+ôLº/©ÿRåüÊjŽçIúíŸÊ/çµù¯‘Ù¾­æ§´^°¿F¿@î×BÂÔ'þ»û±èÿãÁ5£äoÚcèÏ{½·[YúÏH¿/[©æ½Ùß/¸}~=¢¨€LþÅÞÒ~!öº»ÏVðc˜’ïJû´-íÇç´QíÏÙ´_qÝÅø“'x`y¿ÃøËœ_ê>>ÖuÙïÐ…ß>pØÔKû‡UÍßÈûupKÕþßAøûoYù¾Nío˜4h?)Šþ“†ðË1>$ýTó±À>þOdþdÿ[·[e ÀìÓ. ~/)÷©„_Sÿeÿ ÿŠþRþíÊߨò~Êú)é@•üæÍ í>\#×ßEY?…gÚoØ~=ÔGþM²_û\¤ýOu¹ÏðýôœQIáû5ý3Õá×#R~â;²_åüTû3 R¤ü¢»O0ßÇ÷±wEîñ7µÏÒþ:ówjÿš«ö»´WfÞoô£@Ð,¿ììü_äû‚þ„ñu‡ö÷ëš¿‘÷[)¿½Ãó}cدCÿyÿ”îó³úù•ù—%ÿ)ìé{=eËù ío•UÿV™ðËÑ>ªòGy»RûgÇVŸŽç­¿Çbä¯ÕõW£³ÿFÕÝ'Jïßj÷Iþ‰÷Ž´ëý.ôWÂ/ºûóéo9Ô~‹ýV©Ÿ^«:¿òšû2ûÏHÐ#¶¬ä~ÖªøgDÕ¯ÇR~à'ºûðQhž1 ƒÁ`0 ƒÁ`0 ƒÁø\üƒÔ endstream endobj 93 0 obj <> endobj 94 0 obj <> endobj 95 0 obj <> endobj 100 0 obj [/Indexed /DeviceRGB 255 <000000FF00006B6BD2FFFFFF666666FF66667B7B7B6666C24A4AB96B6B6B4242 B1F30000FF9090B1B1DA888888737373B1A1A1FFB1B1CC6B6B181818FF33337B 7BCC6666B9E33333B9B9B99090D2DADADA8888CCB98888FFC2C2424242E37B7B FFE3E3DA9999FF1818FF7B7BEB2121B1B1EBFF4A4A8080D2C2C2E3A9A9A93333 33F33333D252529090E3DADAF3CCCCEBEB1818FFA1A1999999A1A1DAB99090FF D2D2525252EBA9A98080E3A1A1E3EBEBF3080808FF08087B7BD2FF73737373C2 5A5AB9B1B1B1292929FF4242E34242C2C2C2E3E3E3DADAEBF38888FFF3F3EB90 90FF2929FF8888C2C2EBB1B1F3FF5A5AD2D2D2EB4242E34A4A9999F3CCCCF3A1 A1F3C2C2F37373D2FF6B6B8080806B6BC26666CC5252B94A4AB1FF9999B9B9E3 B1B1E3909090B1A9A9FFB9B9D26B6BCC7373212121FF39398080CCE339399999 D29090DAC28080FFCCCC4A4A4AE38080FFEBEBFF2121FF8080F32121B9B9EBFF 52528888D28080DA393939DA4A4A9999E39090EBE3E3F3DADAFFD2D2EBF31010 FFA9A9A1A1A1A9A9DAB99999FFDADA5A5A5A8888E3A9A9E3A1A1EBF3F3F3EBEB FF101010FF10107B7BDA7373CC5A5AC2CCCCCCEBEBEBB9B9F3B1B1FFD2D2F3CC CCFFA9A9F3C2C2FF6B6BCC5252C2D273739999DAC28888F329298888DA9999EB E3E3FF8888EBA9A9EBF3F3FFD2D2FFF7B796FC949005E770C2F0F4F7B82899EB 94F741F7FC9490F7B84E6D892D05E770C2F118F7B77BF741F7FC949003EE8803 D600F713EE00016FF7A2E3007DF1C2F164000FF8DF0008402004F7A3A0C40000 1F200C000FF8000000C4000CC40000DF0008000000F713E22A001EC4000CDEFD 30C2F18CF7A10E03EE8803D60000000305E00FC2F1A800E44A05E0F8000032F7 B9C59A3DEC000030001DE803B600C2F1E000CD7C00000900CD5C000000FF92D0 05E10005E17003B600C2F20400CD7CC2F21000F56A033238FFFFFFC2F2780010 260000300021F9000028FF92D0601232FF94D0FF92A005E100F432F805E100C2 F22C66E8880000006021D3FF92D0F432F805E100C2F26C66E94B00000060D91D>]endobj 99 0 obj <>stream xœí} Oi–¶s1Ónó!H ‚Âf0IX&|&\‡5Ù| .FÁËe@_˜ F€Âm#I‡ÉÆÍF ¼?tÏ9ï¥Þ*@fâäö‚ Æ—AçbSHôïÝœiñ×­ôÆ |E ã‹`c±ªw ~~^±Iäo*ô%1Œ/+óŒÕû'6+6Áö³ò3ßBÁxo¨xÌïŸh‘¿B_ƒÁøhÙXœ{2PÜ]ï÷û»Aø¹«ÁøFp3¸Ÿ u‡zçªxƒñm`3Ä¡ýÅÐB¡¹3…¾ ƒñ…н±ØTõ$„xRÅÓúŒoþ`0^UÕ47×gî3ßî÷nãKñÅ•_ }) ãËâ—¿ßߢ©½×Â`0 ˆë}…¾ƒQT³ø3ß(n3ûŒoÑB_ƒÁ( b· } £0ˆ²ñg0¾MDÙø3ß&˜ü Æ7ŠëìûŒooXúŒoi&?ƒñ­àæó ¿_/äã®ü­µ_ð‚~ëë…¾ã7Ÿ·øWz—:7®|×ùžÔëFþÉ|_ôÒÎÇZÏwTè‹`0þA1S/‰òW6®t^¹Ò Mþëyä_?ðùþ—?× —Âäg0.‰ûÀxã †zõn,Zm;{­Ñ÷ïÿ[È¿ñù²L~ãÒ~'(Ÿ¯P °”?=4NÍ=óù’¨¶]¸Nî–ŠkI2ùŒKÂOt¯j©ðw^¿¡üѨ1©¿•ˆbë»V€ë´aý\^ +?ƒqiÜDÅ‚G3”ñ9¿Yï›üA2ß—ÌØö?˜Ïd“Ù$\+?ƒñˆåïÓÑXçw6å¯Öä§:!YhåÏmõ3@~V~ãó0°Ñ¹!Ž&déO+4:(^S…6‹;Tþ7…¸VDi&›Aîù³>îçg0. g°Sµl!@“äÔÂ/Ò}‚ü€ú@ÿd6+²V~㲘Yê\zNGcADgç†$ÿmÝÑ×*óý¬(ùÔögüÙ üŒÏÅÍÅ`pf—‚ ý@AþÃh4-ϱ+a ~D~¬øù²lûŒÏBïÒâRh³Â_ BÀ Èo ?)¿¦~mf¹ŸM²íg0>þÅx|1¾ø!þ!aø$òGÑ}¨üY‹ý…·ýÄþ$Û~ã³P¬ÿP¯Š ,Å—üףј>¥Õ&üÙB“?+J~äüïòZŒlܯB4‰†ô_ôÓL~cX¿™óg}ÉÆ|ãÚèëöð~*mwwyxïã×p:üëÙY8ŽÐgÚÏú_{jFTüPù“IV~ã3ðóœDÕñ c|Ï|¾?(É—ìÅæøº½©ðþ~d?Lã^ ¯6œÏeÀéò*œFàùRûíkÎó¦J!ßÇFôïÉRw]l\øc0.ŒÇOû逹/GõËQ}IÓö'³è¼3™Tþ—­½ìÚOõS¤û€×ÀíÝÿ>ïçOV‡VOV"«4æá“?^:,ÃÔ¸`þ¸èë“I¿;ãâ(Ö?é}ÒÛ;ÛÜ\SÕDLíóŠQ}¶j?xnâþxžòçºà>)ŒJt&ú¯6ä\|xHpÿ%Š?6éýáKöSvFùýã2é—}D8bò3—¿7ê õÂz‚ìŸû'£Øgé½:H’éGÔ8¾ho>±OÔßGþ*âõONVON]~ûס“!|t?ŒÊOQƒØIì›ç"ùÉ÷Ó ¿lR;òñãRh …B+ÐBž„zç~3 ýF²o R(¿Ãö¯ãß—ôO¡‚£éôzƒ¾çgþ£C#'CC@þW-å—ÒI$Ì€AäÏ’ñÏR¹ß¢>+?ƒqÜX‘Qèý-–Óoúœ@Ê÷3™yÛ×ìu%ÒôƒòHÈW¥ò¯"ÅÚ:424´{‚äÔ틤63¾ùµðgù…+ö2Œ‹âþ€ÄÊÊñÿ/­7¶™õ¾,ÖÝl9n^Ⱦþyð°HãWQ×ÑÞíæì¿ündhw„„ÿääDÿ0±¬? ?|á²uvƒ~Ó÷[®„•ŸÁ¸8~(¦FüýÿÆ›NÛïÓõ>‡ò¿ÝGîKáO…SaUëá‚ ŒüjûáW#€¡]Š (þ»ïÎPýQù÷¥ö'ö­Ó…ògÇůÓ0ëêXùŒ‹ãfw1Bñ`eÓxÓÅô'E_ßxÖ$s‚È¿¿Of=œŠDVwÏ^*ú½GvGFliÿè±DP_†½³U•õ§(–XÒß  ~Ö0V~ãsð˜È?V,B¿ÅxÓ-çÝüY[Á¯Qr;ùQ¶w‰æ¹_¥ðCÊOLkþð[úÓ‰ ÿOê¯Ã`üçUo_"ѧËj–Ä_¬èa]+?ƒqq<öuwûíÊŸWíOf{¨ânöóß½Šäߗ‰h½>¢Z?æûCÄSú‡FýÉõ[oìb¹ÈIääe¿êÓ0®ËýjjU‹`åg0.·€äÿ@…ñ^žîõ³Rû Û?Ü¿ M°×zg;ù‡PÞIù²ÞÙCê¿Bã?tbô…_î6ŒöŸ:û¦ˆúBû1Ð"ž¬ü ÆgÀß]è®Gþ#û7'´›å>_6LÿÞÕ« I}ª÷åŒ÷ND±ì=ÁzãT ?ÕûOÞ}âÅjî ågÅg0.çâ›þz’ÿâ çZ åÙÏ¿Qgâ*¥ü²à×`¾Òä¦b?°ý­¥ð¹·Èþ·ôŽóý„é´˜‡œØ×ƒ¦Ÿ'ô0Ÿ¿±¼¿ ù³¦ïÏŸÏ?ÂÒ/¹i6ß;¥þ!)ü#µÞQÊ/»úWëg££Ín£€ Èr¿˜Ù“dåg0>é3Ù_ßíF~£“?ébûß_¥”_VüÃ~¥ò á7ëýôRÒÿDŒðÇ©½‘ðnÿiUc|Øö3Ÿ‹XßðþŸ-úÍ8O±­á—Í_Ìc„_Ò?’Ûß=#é—"ÿÖHúÿ›Ê}¤üb€¿œÜüO¥vïæ\/7#†øeiF?Oèa0.ëÑ´wÂoÙŸ¯üz4 ÖûòÉß|ÕÈù#‘HûIûnûî¶³wgTî“Å~hVfŸÃ”_)ÿÍ ¾4-(Ùop+ŒÓ¼½€/“ŸÁ¸q±®–– „fÿŒó,Û~.ä§^þ„®ö›Ëøà„>Tþ!9Êgä­Áè¿êœ_ð%åËñ½)ç„~‚ZɇÆösÎÏ`\bîîf ÂbÿŒó´‘¿áêUQï¾GçÍÓ}ò“!1ÆG)¿9ÌÇÈù‡TÒ/föÐJ@ûûgy—lüàjšóN`0‡\¤s`ÐßüY‹û.ýüS ´ýªÚŸ@ÛNÚ/çõœ¨‚ñß\ÐkïJùMåˆ~`üö^C„îê˰ò3—…Z¤³bsSð_°¿þ†óDSùÝ ~ V¹’~þ”X¿/,øIåG¡·­æ·÷VŒÔ·ôÐËy8Ù­”?Ë9?ƒqY(î?ž©ûÏU~Ëõ»ÙþI³Ú/&öÐ^±Ž‡˜²«¤ß¾”gî?‡dÊ¿z"‚)D(?.äçø­ŒZÊGäülûŒ ã0z]ùgff*Èúûgœ§ZÕ~*÷çð›Õ~k”ϼ´ý‘°š×£êýNò{½§ÿI¿Ö}±–Ìùû Ǩ}]ìϰò3—BßmuWŽŸgfn û+Ðø»“ß>³'o„_s¾ò‹¥|(é²ÿ<ò{ñž# ü/UüHøi^ŸsÔÀ¸X»;ÃÕ~ã’°îÁûóù'>Jþlþ:E??P_Tûç§§kÐöâpÎõœ¿;‘®^ÌçO!õ÷‰œíùÊß®gõ‘úæÊ{©ˆUïK$–moÊÛu‰A>¬ü ÆE¡ïŸ®æÆïåüëæb^Ùd&ï뎤í—+ùØjt¹ß£»wz:<üÓÙÙªÉâZ¾“ï†ï´/ù›‘KyHåŸü¤ÿ\ƒ!q]õñ#€ø7ˆûçVû¬•2if ꃜu ñ“S{‘ý~ãûXÆ;ûixô•}a®W¿þôŽº÷iBϪ¹’O¿Èùé ¯:rþ.P~ZFL(¿ìyàî~ãÓPm¸þDz§]ÿ„ë¿ucJ/®Ü]:utw»+c¸ûVáûåœÞýˆõVƒ^»ŸîÌ1¢~{ÿðoâ^]«ÏDÂäÏÙ®¥±Tß±'‰~¤±}ª6yð·øWa0¾ÜÖwáõz®æ›ÂŸ?¯Ù6+í=Xt›²ÎÈIòÓHŸÈ~*%Ù¿&‡í…Qßi!ÏœúÈ«= Ÿ`Ý‘{]?Ú~rýÖÚÝ„F½x¯yûàäßè†ÁøÊÑ­¶Rþ_**Ôð^Êøëýÿ7ï>›ôc;ÊïkãŒvs˜ÎÇ 7Œö¾”ÔÇÁ{â†\Æ*^'CrmO9£'<šÃ?ï5¤tOÖûS{ÚEO_FŒñÑø[þó0_/Ž>ïÍŠMIý‰s¦ôz3ö™=”rÛoו벆øÒŒ~q“nû}ºWmkôâÊž«òîÜrdßnûnX ðÙÜ/áè7œ”Â/”_oÓã«EµYïÚcÓsúüÝ3y¨±I?òÍ·mÎÍ‘îí£Ûõí«™}4Ä_êÿÉIÎøDîäÄä¾ÝgõóEð wíWâmÜÇ‘ý>¾cƒqA˜äÿ¹¥E®å1¡–ñšÉûÀ¤©üú>½öþþvYò»º/²~âp8bQ(n/Üë„_Ýw>¢—ñÀé¼h$rÎk—Âï3oÒËýý Æ'!jÿ—‰–‰½ŠW½¿¾Û…ü9Û=»ô}zí'Í'(ë$ôr>á”pþ’ú«Î¹w«Öd¾°^ÄCÌé‘ý|ùƒZ³êf]jØnÜßÏ`| ¢FOß ÿ6Å}¼oOÞžŽå<|IºQ¯“ü¹°ãK¦ù}b–®S÷»V¾§¤ÂÒò§h= ü®¿æ}Ä»7žµ:ú4Ú?÷ß„Áø&`*ÿ¦céÞn—›vÞ›Ê/´?›qŽá?KÐðþ«2éW{åb~n#ýÞ™sø#j6_Šfó%ö#®“&3bÙn›i½ü¿ƒñ á¶EþÇzÝîz¡ûn·ëäžÔ÷ɂ޸º£ÒËôòNÝ)¹œW$üSÎõRŽ„á§•»ÂF­…?õNy±Ž‡-áQ> ƧÀPþ›@yâ=4y«¾üu"r]û‘üI`¿Ë Úá”è—Py?!Ü;÷bFOÔŠ½ÒóGhh_äìü¹“ìp°i?“ŸÁøD«£êf-HzÁüzy—î7åÕd²–öÌ¿vP:ÚŽºäO…çwï~däýéðÙ‰òü4¶/uÒ_°aªÖ”ýÄñòƒß?ŸÁ`bzxïc}{nIý±âWå>>::ZoþØŒýWk¯ÖÄj>Ÿ|Qê§á½Â\^Î'žÎ`0ƒQq·¯÷—n…1BqñÀÀÊïŸÁ`üCã ø~q´9f˜Ügò3_/¢Ñè!î×kæ÷WZ }y ãï…ê¨XÊç9¾˜hOªÜ…˜ü ÆW‹¾¨ä7t/–¢~Áäg0¾^û¯{½cHxE|IýÞ¹‰B_ƒÁø»!Åš_Eh%´‚¬³/˜êí›cåg0¾b ‚ôGBÈþf>P¸ÏÊÏ`|ÕÀ¬ÿ@wÚˆø`ø‘úMMþB_ƒÁø{¥ÿ7ú^¤}¯Ð|ä~0(ˆÇk  Ø`D‡öí×­ØÚ·Û[U;/$`4 ‡ý1íÙ÷hýÿÄÿm1¸ º¿|'€þz«îá`90>FB=»S‚ìóîÌvô:hØp%FŠ’ÙXÚOe-#¯C;à-¸³0ˆ~¿£Ž–¯ë0Ïi[hÃìÂû¢Òƒ!¡­r– ±J¢}Y]ú‚­…E”Q<ž‹åü–æ›Òo ì™MÐ<½G> }®öŸ>85èoñœ8ß¼ö Ù­h¿$‡‡ØÐ¬K7 Žá@÷©MXE÷#hÃJûG%ñiwËlŠñ¸5yKcRøIý~;é—÷‘ößOM‚ðO~?e6EðÈ{`?6ê#í[‘îÛí†%  6¤=vÏZ%ÿéÙ >0_qý˜žk„-˜·”ŸœB#n©šFxn´¸ßˆÜo´´ß&þëkmD×Ú ŽDÄGšÙáàGhHtr?RC¼/ŦP|—dÇnÄthÁ}â|¾ê)U„—ÜïÁ嬀ö¸¨º‚,nÂøp‡/ðöZ´è…XçÒ"ÿÅÅ¥xü7,ûýWÓ"ÙýÅÅà´ ù©Âm«{8‹‘òw$?p\áNݬ`{Ñ2à¡é‚ž:.£W]ûï -ðUvà7¥á é“uóœ’_Í=ôõÓ 1V½;++ñ¯áÃø±jØÅ.B}—(3viÒ~öôþÁyÚo×} þÞšMøÅ4gü›=pŠ?i¿Hš…ðÛÄŸ( •²¥ûÃnÀÝ~up«ßˆyªßO´¿µ,èkR‡bÿÔÔ䔡ü¦P1`Usaý¿ßކ͖´£êߤð‹½]÷Qõå^„€VKôÿÏ5ØTN`—}|Týy¢;<”ú7ZÍzì'í·YýÒ5°é>„‚kZ÷1àëT@(ÿÔý§OÇŸ"åi/--5%ßd$  ‚~´ÿúÔ”ð‹-ké?ŸêÿúǽKAäz$þŽþöaì>¼ ;ƒ6ò— ¦nÕŸ1⸠‘gyžö*ëLò×S…š;•m·­c«Þh¥çE>ùÓm•Èö¨`;üNG”XN¢m–ªJ ñ³fÁàSèoùý\^[ÚEûÅÞ]û ö›ªoj¿®4ÛËk¦ò?²ë¾Ò~Cù×µÝ?’H?,µ_‰¿Cûï’ðdXÖz/›¤~¿aü%ó—…ç—Ú?)ÔßÔ} (÷ úÀý)Ãú;tÉßÞJÛ¶!üZ÷Û¡µ¶Ãó±6Rú•ë—–_ÿXk¿|¨ÂÀ<ÑÞR~“þ û5]`ìÊoñ^»WíWºÄ¿&ŒÿS²ü:ï?Ê/Ô_˜~|HÖKá—q€èýC)Ñ^k¿f¿”~8øAZ±vµd~’¨/´ö —Ÿ•¼'êÓß²šüõÀsäz0ø¯ÿGûýñ½Øè„f#êô½Ù鯄ò{ªù%ëbH¢K ò÷É¿Ùu\uü-²ÇŠ®ÏzòÈß7}{‡¾IüŠ·dzº#`½”D¼úð½@삾ߌ.Å?þ¼"à=öÎ×þ½SS÷Úß,ÙeßEù­ò_3é¾~<Àl)¿®Ú]­ûÃ:ëwhÿ­~Cùïjí_6ó}ñ÷kí—•ïʯ´_Å€×È{tû–÷ÝŸ²åû¢¡÷Ý*”¿µÝ,á[[-ÁoÕOZûI÷üHÿg†æ«ä=¥ü˜üká×A e…€®FWt5v]k¼ÖUÛu­ËUûµî“í¿&…_Š>=¿Mè?E’~ÓúK`©öãš÷ãvíÏëïùAi&©š¢¿ÔþŒÖ~"¾Èõ³Û X ±òG4ÿÑ¿,mtv¯t^±‘ŸJóŽ-¨¬M“Á®ö´íx0 zh7íÑl‘ßëé»;1›'­óp£Eõ‹Ù<òÇ*ËËMò{^D©œ¯È§:–Æ«óP ©óô]LùÍBŸ“úJûEÕ/m¯ùS;GûAùO䷴ߪó­iöËðHª¿¡ÿGÍ–ö7«¼_è¾,õ©@0_i¿æ¿%ýH}þ»†õy¿~Ò}§òkö[¼'íŸt~Ù€1€lD€©ísŠ}ÛDúvÊûÛ-í?&ío•vÍ¿`¾!ýó¸ÕKÅ—ûg¦öÏ+áGç¯6Óù§„ô7Ú­€Úk°á£K‰¿Mû­Œ™MýI÷§ïÔíéSÅþ[ѯÔHdª?Žâ/ÆõÇ•ç_ú„Û·©D⟥[júä--Í‚ßãP'ð|ã xüà*þŸ¢èþ£þËÿÿ°ñ ºïknm"}O“òƒ°W")Óƒ“-$#ïê<1'ùït”‹à±Yzñf]™†(ìÚòÈuJÛeRoYâ xÚðc垎 uõÙ‚€KÏŸ—”ß)þB÷õ]´ß©ûμÿ•tkpdïÌKüåi¿Ðÿõ#;ý…0µßVï7´_øÿ~³âÒ¯u_)¿ ·–ÏÑþ)ËX1à{¡ý´ÕñÚöŸ„[$þöÎ@$;Ðÿeë±ØTõï™,ø¡òߟKñŸ¯12~É|!ùêXûS5–æKÆ+÷/F¨íïß…´wA+hç/»~|o6Jd’þ÷¥FÞ/CÀ¸¦©©û¢Ê/{þ¤ ûb‹¼3¬Tÿ¬ ½Èû…óÏêq×¹•.@ü?ß²qeãÊ•ÎNÜÑ3Ä‚¥ùcuTàv´Z÷»‰ìÚã½#l¬ˆXX$U˜̦¤Ü´ý^ÙùîU¹|ò£“Ç‚ßV>ùÛ:›–Ah:0h¼„ÏâW÷Űᢠûí!À .Í=çGíß;gðO>ý8JþÍkhûÖ_Ëÿš~›ö«´ÝMùlõþa©ûŽa?*Õ¿%^P@‰ÿ¤j’úùÚ?µl)ÿ¤*øOé^?5ö=?Ù}cô=(Û/ˆ/°-+ôLº/©ÿRåüÊjŽçIúíŸÊ/çµù¯‘Ù¾­æ§´^°¿F¿@î×BÂÔ'þ»û±èÿãÁ5£äoÚcèÏ{½·[YúÏH¿/[©æ½Ùß/¸}~=¢¨€LþÅÞÒ~!öº»ÏVðc˜’ïJû´-íÇç´QíÏÙ´_qÝÅø“'x`y¿ÃøËœ_ê>>ÖuÙïÐ…ß>pØÔKû‡UÍßÈûupKÕþßAøûoYù¾Nío˜4h?)Šþ“†ðË1>$ýTó±À>þOdþdÿ[·[e ÀìÓ. ~/)÷©„_Sÿeÿ ÿŠþRþíÊߨò~Êú)é@•üæÍ í>\#×ßEY?…gÚoØ~=ÔGþM²_û\¤ýOu¹ÏðýôœQIáû5ý3Õá×#R~â;²_åüTû3 R¤ü¢»O0ßÇ÷±wEîñ7µÏÒþ:ówjÿš«ö»´WfÞoô£@Ð,¿ììü_äû‚þ„ñu‡ö÷ëš¿‘÷[)¿½Ãó}cدCÿyÿ”îó³úù•ù—%ÿ)ìé{=eËù ío•UÿV™ðËÑ>ªòGy»RûgÇVŸŽç­¿Çbä¯ÕõW£³ÿFÕÝ'Jïßj÷Iþ‰÷Ž´ëý.ôWÂ/ºûóéo9Ô~‹ýV©Ÿ^«:¿òšû2ûÏHÐ#¶¬ä~ÖªøgDÕ¯ÇR~à'ºûðQhž1 ƒÁ`0 ƒÁ`0 ƒÁø\üƒÔ endstream endobj 101 0 obj <> endobj 102 0 obj <> endobj 103 0 obj <> endobj 108 0 obj [/Indexed /DeviceRGB 255 <000000FF00006B6BD2FFFFFF666666FF66667B7B7B6666C24A4AB96B6B6B4242 B1F30000FF9090B1B1DA888888737373B1A1A1FFB1B1CC6B6B181818FF33337B 7BCC6666B9E33333B9B9B99090D2DADADA8888CCB98888FFC2C2424242E37B7B FFE3E3DA9999FF1818FF7B7BEB2121B1B1EBFF4A4A8080D2C2C2E3A9A9A93333 33F33333D252529090E3DADAF3CCCCEBEB1818FFA1A1999999A1A1DAB99090FF D2D2525252EBA9A98080E3A1A1E3EBEBF3080808FF08087B7BD2FF73737373C2 5A5AB9B1B1B1292929FF4242E34242C2C2C2E3E3E3DADAEBF38888FFF3F3EB90 90FF2929FF8888C2C2EBB1B1F3FF5A5AD2D2D2EB4242E34A4A9999F3CCCCF3A1 A1F3C2C2F37373D2FF6B6B8080806B6BC26666CC5252B94A4AB1FF9999B9B9E3 B1B1E3909090B1A9A9FFB9B9D26B6BCC7373212121FF39398080CCE339399999 D29090DAC28080FFCCCC4A4A4AE38080FFEBEBFF2121FF8080F32121B9B9EBFF 52528888D28080DA393939DA4A4A9999E39090EBE3E3F3DADAFFD2D2EBF31010 FFA9A9A1A1A1A9A9DAB99999FFDADA5A5A5A8888E3A9A9E3A1A1EBF3F3F3EBEB FF101010FF10107B7BDA7373CC5A5AC2CCCCCCEBEBEBB9B9F3B1B1FFD2D2F3CC CCFFA9A9F3C2C2FF6B6BCC5252C2D273739999DAC28888F329298888DA9999EB E3E3FF8888EBA9A9EBF3F3FFD2D2FFF7B796FC949005E770C2F0F4F7B82899EB 94F741F7FC9490F7B84E6D892D05E770C2F118F7B77BF741F7FC949003EE8803 D600F713EE00016FF7A2E3007DF1C2F164000FF8DF0008402004F7A3A0C40000 1F200C000FF8000000C4000CC40000DF0008000000F713E22A001EC4000CDEFD 30C2F18CF7A10E03EE8803D60000000305E00FC2F1A800E44A05E0F8000032F7 B9C59A3DEC000030001DE803B600C2F1E000CD7C00000900CD5C000000FF92D0 05E10005E17003B600C2F20400CD7CC2F21000F56A033238FFFFFFC2F2780010 260000300021F9000028FF92D0601232FF94D0FF92A005E100F432F805E100C2 F22C66E8880000006021D3FF92D0F432F805E100C2F26C66E94B00000060D91D>]endobj 107 0 obj <>stream xœí} Oi–¶s1Ónó!H ‚Âf0IX&|&\‡5Ù| .FÁËe@_˜ F€Âm#I‡ÉÆÍF ¼?tÏ9ï¥Þ*@fâäö‚ Æ—AçbSHôïÝœiñ×­ôÆ |E ã‹`c±ªw ~~^±Iäo*ô%1Œ/+óŒÕû'6+6Áö³ò3ßBÁxo¨xÌïŸh‘¿B_ƒÁøhÙXœ{2PÜ]ï÷û»Aø¹«ÁøFp3¸Ÿ u‡zçªxƒñm`3Ä¡ýÅÐB¡¹3…¾ ƒñ…н±ØTõ$„xRÅÓúŒoþ`0^UÕ47×gî3ßî÷nãKñÅ•_ }) ãËâ—¿ßߢ©½×Â`0 ˆë}…¾ƒQT³ø3ß(n3ûŒoÑB_ƒÁ( b· } £0ˆ²ñg0¾MDÙø3ß&˜ü Æ7ŠëìûŒooXúŒoi&?ƒñ­àæó ¿_/äã®ü­µ_ð‚~ëë…¾ã7Ÿ·øWz—:7®|×ùžÔëFþÉ|_ôÒÎÇZÏwTè‹`0þA1S/‰òW6®t^¹Ò Mþëyä_?ðùþ—?× —Âäg0.‰ûÀxã †zõn,Zm;{­Ñ÷ïÿ[È¿ñù²L~ãÒ~'(Ÿ¯P °”?=4NÍ=óù’¨¶]¸Nî–ŠkI2ùŒKÂOt¯j©ðw^¿¡üѨ1©¿•ˆbë»V€ë´aý\^ +?ƒqiÜDÅ‚G3”ñ9¿Yï›üA2ß—ÌØö?˜Ïd“Ù$\+?ƒñˆåïÓÑXçw6å¯Öä§:!YhåÏmõ3@~V~ãó0°Ñ¹!Ž&déO+4:(^S…6‹;Tþ7…¸VDi&›Aîù³>îçg0. g°Sµl!@“äÔÂ/Ò}‚ü€ú@ÿd6+²V~㲘Yê\zNGcADgç†$ÿmÝÑ×*óý¬(ùÔögüÙ üŒÏÅÍÅ`pf—‚ ý@AþÃh4-ϱ+a ~D~¬øù²lûŒÏBïÒâRh³Â_ BÀ Èo ?)¿¦~mf¹ŸM²íg0>þÅx|1¾ø!þ!aø$òGÑ}¨üY‹ý…·ýÄþ$Û~ã³P¬ÿP¯Š ,Å—üףј>¥Õ&üÙB“?+J~äüïòZŒlܯB4‰†ô_ôÓL~cX¿™óg}ÉÆ|ãÚèëöð~*mwwyxïã×p:üëÙY8ŽÐgÚÏú_{jFTüPù“IV~ã3ðóœDÕñ c|Ï|¾?(É—ìÅæøº½©ðþ~d?Lã^ ¯6œÏeÀéò*œFàùRûíkÎó¦J!ßÇFôïÉRw]l\øc0.ŒÇOû逹/GõËQ}IÓö'³è¼3™Tþ—­½ìÚOõS¤û€×ÀíÝÿ>ïçOV‡VOV"«4æá“?^:,ÃÔ¸`þ¸èë“I¿;ãâ(Ö?é}ÒÛ;ÛÜ\SÕDLíóŠQ}¶j?xnâþxžòçºà>)ŒJt&ú¯6ä\|xHpÿ%Š?6éýáKöSvFùýã2é—}D8bò3—¿7ê õÂz‚ìŸû'£Øgé½:H’éGÔ8¾ho>±OÔßGþ*âõONVON]~ûס“!|t?ŒÊOQƒØIì›ç"ùÉ÷Ó ¿lR;òñãRh …B+ÐBž„zç~3 ýF²o R(¿Ãö¯ãß—ôO¡‚£éôzƒ¾çgþ£C#'CC@þW-å—ÒI$Ì€AäÏ’ñÏR¹ß¢>+?ƒqÜX‘Qèý-–Óoúœ@Ê÷3™yÛ×ìu%ÒôƒòHÈW¥ò¯"ÅÚ:424´{‚äÔ틤63¾ùµðgù…+ö2Œ‹âþ€ÄÊÊñÿ/­7¶™õ¾,ÖÝl9n^Ⱦþyð°HãWQ×ÑÞíæì¿ündhw„„ÿääDÿ0±¬? ?|á²uvƒ~Ó÷[®„•ŸÁ¸8~(¦FüýÿÆ›NÛïÓõ>‡ò¿ÝGîKáO…SaUëá‚ ŒüjûáW#€¡]Š (þ»ïÎPýQù÷¥ö'ö­Ó…ògÇůÓ0ëêXùŒ‹ãfw1Bñ`eÓxÓÅô'E_ßxÖ$s‚È¿¿Of=œŠDVwÏ^*ú½GvGFliÿè±DP_†½³U•õ§(–XÒß  ~Ö0V~ãsð˜È?V,B¿ÅxÓ-çÝüY[Á¯Qr;ùQ¶w‰æ¹_¥ðCÊOLkþð[úÓ‰ ÿOê¯Ã`üçUo_"ѧËj–Ä_¬èa]+?ƒqq<öuwûíÊŸWíOf{¨ânöóß½Šäߗ‰h½>¢Z?æûCÄSú‡FýÉõ[oìb¹ÈIääe¿êÓ0®ËýjjU‹`åg0.·€äÿ@…ñ^žîõ³Rû Û?Ü¿ M°×zg;ù‡PÞIù²ÞÙCê¿Bã?tbô…_î6ŒöŸ:û¦ˆúBû1Ð"ž¬ü ÆgÀß]è®Gþ#û7'´›å>_6LÿÞÕ« I}ª÷åŒ÷ND±ì=ÁzãT ?ÕûOÞ}âÅjî ågÅg0.çâ›þz’ÿâ çZ åÙÏ¿Qgâ*¥ü²à×`¾Òä¦b?°ý­¥ð¹·Èþ·ôŽóý„é´˜‡œØ×ƒ¦Ÿ'ô0Ÿ¿±¼¿ ù³¦ïÏŸÏ?ÂÒ/¹i6ß;¥þ!)ü#µÞQÊ/»úWëg££Ín£€ Èr¿˜Ù“dåg0>é3Ù_ßíF~£“?ébûß_¥”_VüÃ~¥ò á7ëýôRÒÿDŒðÇ©½‘ðnÿiUc|Øö3Ÿ‹XßðþŸ-úÍ8O±­á—Í_Ìc„_Ò?’Ûß=#é—"ÿÖHúÿ›Ê}¤üb€¿œÜüO¥vïæ\/7#†øeiF?Oèa0.ëÑ´wÂoÙŸ¯üz4 ÖûòÉß|ÕÈù#‘HûIûnûî¶³wgTî“Å~hVfŸÃ”_)ÿÍ ¾4-(Ùop+ŒÓ¼½€/“ŸÁ¸q±®–– „fÿŒó,Û~.ä§^þ„®ö›Ëøà„>Tþ!9Êgä­Áè¿êœ_ð%åËñ½)ç„~‚ZɇÆösÎÏ`\bîîf ÂbÿŒó´‘¿áêUQï¾GçÍÓ}ò“!1ÆG)¿9ÌÇÈù‡TÒ/föÐJ@ûûgy—lüàjšóN`0‡\¤s`ÐßüY‹û.ýüS ´ýªÚŸ@ÛNÚ/çõœ¨‚ñß\ÐkïJùMåˆ~`üö^C„îê˰ò3—…Z¤³bsSð_°¿þ†óDSùÝ ~ V¹’~þ”X¿/,øIåG¡·­æ·÷VŒÔ·ôÐËy8Ù­”?Ë9?ƒqY(î?ž©ûÏU~Ëõ»ÙþI³Ú/&öÐ^±Ž‡˜²«¤ß¾”gî?‡dÊ¿z"‚)D(?.äçø­ŒZÊGäülûŒ ã0z]ùgff*Èúûgœ§ZÕ~*÷çð›Õ~k”ϼ´ý‘°š×£êýNò{½§ÿI¿Ö}±–Ìùû Ǩ}]ìϰò3—BßmuWŽŸgfn û+Ðø»“ß>³'o„_s¾ò‹¥|(é²ÿ<ò{ñž# ü/UüHøi^ŸsÔÀ¸X»;ÃÕ~ã’°îÁûóù'>Jþlþ:E??P_Tûç§§kÐöâpÎõœ¿;‘®^ÌçO!õ÷‰œíùÊß®gõ‘úæÊ{©ˆUïK$–moÊÛu‰A>¬ü ÆE¡ïŸ®æÆïåüëæb^Ùd&ï뎤í—+ùØjt¹ß£»wz:<üÓÙÙªÉâZ¾“ï†ï´/ù›‘KyHåŸü¤ÿ\ƒ!q]õñ#€ø7ˆûçVû¬•2if ꃜu ñ“S{‘ý~ãûXÆ;ûixô•}a®W¿þôŽº÷iBϪ¹’O¿Èùé ¯:rþ.P~ZFL(¿ìyàî~ãÓPm¸þDz§]ÿ„ë¿ucJ/®Ü]:utw»+c¸ûVáûåœÞýˆõVƒ^»ŸîÌ1¢~{ÿðoâ^]«ÏDÂäÏÙ®¥±Tß±'‰~¤±}ª6yð·øWa0¾ÜÖwáõz®æ›ÂŸ?¯Ù6+í=Xt›²ÎÈIòÓHŸÈ~*%Ù¿&‡í…Qßi!ÏœúÈ«= Ÿ`Ý‘{]?Ú~rýÖÚÝ„F½x¯yûàäßè†ÁøÊÑ­¶Rþ_**Ôð^Êøëýÿ7ï>›ôc;ÊïkãŒvs˜ÎÇ 7Œö¾”ÔÇÁ{â†\Æ*^'CrmO9£'<šÃ?ï5¤tOÖûS{ÚEO_FŒñÑø[þó0_/Ž>ïÍŠMIý‰s¦ôz3ö™=”rÛoו벆øÒŒ~q“nû}ºWmkôâÊž«òîÜrdßnûnX ðÙÜ/áè7œ”Â/”_oÓã«EµYïÚcÓsúüÝ3y¨±I?òÍ·mÎÍ‘îí£Ûõí«™}4Ä_êÿÉIÎøDîäÄä¾ÝgõóEð wíWâmÜÇ‘ý>¾cƒqA˜äÿ¹¥E®å1¡–ñšÉûÀ¤©üú>½öþþvYò»º/²~âp8bQ(n/Üë„_Ýw>¢—ñÀé¼h$rÎk—Âï3oÒËýý Æ'!jÿ—‰–‰½ŠW½¿¾Û…ü9Û=»ô}zí'Í'(ë$ôr>á”pþ’ú«Î¹w«Öd¾°^ÄCÌé‘ý|ùƒZ³êf]jØnÜßÏ`| ¢FOß ÿ6Å}¼oOÞžŽå<|IºQ¯“ü¹°ãK¦ù}b–®S÷»V¾§¤ÂÒò§h= ü®¿æ}Ä»7žµ:ú4Ú?÷ß„Áø&`*ÿ¦céÞn—›vÞ›Ê/´?›qŽá?KÐðþ«2éW{åb~n#ýÞ™sø#j6_Šfó%ö#®“&3bÙn›i½ü¿ƒñ á¶EþÇzÝîz¡ûn·ëäžÔ÷ɂ޸º£ÒËôòNÝ)¹œW$üSÎõRŽ„á§•»ÂF­…?õNy±Ž‡-áQ> ƧÀPþ›@yâ=4y«¾üu"r]û‘üI`¿Ë Úá”è—Py?!Ü;÷bFOÔŠ½ÒóGhh_äìü¹“ìp°i?“ŸÁøD«£êf-HzÁüzy—î7åÕd²–öÌ¿vP:ÚŽºäO…çwï~däýéðÙ‰òü4¶/uÒ_°aªÖ”ýÄñòƒß?ŸÁ`bzxïc}{nIý±âWå>>::ZoþØŒýWk¯ÖÄj>Ÿ|Qê§á½Â\^Î'žÎ`0ƒQq·¯÷—n…1BqñÀÀÊïŸÁ`üCã ø~q´9f˜Ügò3_/¢Ñè!î×kæ÷WZ }y ãï…ê¨XÊç9¾˜hOªÜ…˜ü ÆW‹¾¨ä7t/–¢~Áäg0¾^û¯{½cHxE|IýÞ¹‰B_ƒÁø»!Åš_Eh%´‚¬³/˜êí›cåg0¾b ‚ôGBÈþf>P¸ÏÊÏ`|ÕÀ¬ÿ@wÚˆø`ø‘úMMþB_ƒÁø{¥ÿ7ú^¤}¯Ð|ä~0(ˆÇk  Ø`D‡öí×­ØÚ·Û[U;/$`4 ‡ý1íÙ÷hýÿÄÿm1¸ º¿|'€þz«îá`90>FB=»S‚ìóîÌvô:hØp%FŠ’ÙXÚOe-#¯C;à-¸³0ˆ~¿£Ž–¯ë0Ïi[hÃìÂû¢Òƒ!¡­r– ±J¢}Y]ú‚­…E”Q<ž‹åü–æ›Òo ì™MÐ<½G> }®öŸ>85èoñœ8ß¼ö Ù­h¿$‡‡ØÐ¬K7 Žá@÷©MXE÷#hÃJûG%ñiwËlŠñ¸5yKcRøIý~;é—÷‘ößOM‚ðO~?e6EðÈ{`?6ê#í[‘îÛí†%  6¤=vÏZ%ÿéÙ >0_qý˜žk„-˜·”ŸœB#n©šFxn´¸ßˆÜo´´ß&þëkmD×Ú ŽDÄGšÙáàGhHtr?RC¼/ŦP|—dÇnÄthÁ}â|¾ê)U„—ÜïÁ嬀ö¸¨º‚,nÂøp‡/ðöZ´è…XçÒ"ÿÅÅ¥xü7,ûýWÓ"ÙýÅÅà´ ù©Âm«{8‹‘òw$?p\áNݬ`{Ñ2à¡é‚ž:.£W]ûï -ðUvà7¥á é“uóœ’_Í=ôõÓ 1V½;++ñ¯áÃø±jØÅ.B}—(3viÒ~öôþÁyÚo×} þÞšMøÅ4gü›=pŠ?i¿Hš…ðÛÄŸ( •²¥ûÃnÀÝ~up«ßˆyªßO´¿µ,èkR‡bÿÔÔ䔡ü¦P1`Usaý¿ßކ͖´£êߤð‹½]÷Qõå^„€VKôÿÏ5ØTN`—}|Týy¢;<”ú7ZÍzì'í·YýÒ5°é>„‚kZ÷1àëT@(ÿÔý§OÇŸ"åi/--5%ßd$  ‚~´ÿúÔ”ð‹-ké?ŸêÿúǽKAäz$þŽþöaì>¼ ;ƒ6ò— ¦nÕŸ1⸠‘gyžö*ëLò×S…š;•m·­c«Þh¥çE>ùÓm•Èö¨`;üNG”XN¢m–ªJ ñ³fÁàSèoùý\^[ÚEûÅÞ]û ö›ªoj¿®4ÛËk¦ò?²ë¾Ò~Cù×µÝ?’H?,µ_‰¿Cûï’ðdXÖz/›¤~¿aü%ó—…ç—Ú?)ÔßÔ} (÷ úÀý)Ãú;tÉßÞJÛ¶!üZ÷Û¡µ¶Ãó±6Rú•ë—–_ÿXk¿|¨ÂÀ<ÑÞR~“þ û5]`ìÊoñ^»WíWºÄ¿&ŒÿS²ü:ï?Ê/Ô_˜~|HÖKá—q€èýC)Ñ^k¿f¿”~8øAZ±vµd~’¨/´ö —Ÿ•¼'êÓß²šüõÀsäz0ø¯ÿGûýñ½Øè„f#êô½Ù鯄ò{ªù%ëbH¢K ò÷É¿Ùu\uü-²ÇŠ®ÏzòÈß7}{‡¾IüŠ·dzº#`½”D¼úð½@삾ߌ.Å?þ¼"à=öÎ×þ½SS÷Úß,ÙeßEù­ò_3é¾~<Àl)¿®Ú]­ûÃ:ëwhÿ­~Cùïjí_6ó}ñ÷kí—•ïʯ´_Å€×È{tû–÷ÝŸ²åû¢¡÷Ý*”¿µÝ,á[[-ÁoÕOZûI÷üHÿg†æ«ä=¥ü˜üká×A e…€®FWt5v]k¼ÖUÛu­ËUûµî“í¿&…_Š>=¿Mè?E’~ÓúK`©öãš÷ãvíÏëïùAi&©š¢¿ÔþŒÖ~"¾Èõ³Û X ±òG4ÿÑ¿,mtv¯t^±‘ŸJóŽ-¨¬M“Á®ö´íx0 zh7íÑl‘ßëé»;1›'­óp£Eõ‹Ù<òÇ*ËËMò{^D©œ¯È§:–Æ«óP ©óô]LùÍBŸ“úJûEÕ/m¯ùS;GûAùO䷴ߪó­iöËðHª¿¡ÿGÍ–ö7«¼_è¾,õ©@0_i¿æ¿%ýH}þ»†õy¿~Ò}§òkö[¼'íŸt~Ù€1€lD€©ísŠ}ÛDúvÊûÛ-í?&ío•vÍ¿`¾!ýó¸ÕKÅ—ûg¦öÏ+áGç¯6Óù§„ô7Ú­€Úk°á£K‰¿Mû­Œ™MýI÷§ïÔíéSÅþ[ѯÔHdª?Žâ/ÆõÇ•ç_ú„Û·©D⟥[júä--Í‚ßãP'ð|ã xüà*þŸ¢èþ£þËÿÿ°ñ ºïknm"}O“òƒ°W")Óƒ“-$#ïê<1'ùït”‹à±Yzñf]™†(ìÚòÈuJÛeRoYâ xÚðc垎 uõÙ‚€KÏŸ—”ß)þB÷õ]´ß©ûμÿ•tkpdïÌKüåi¿Ðÿõ#;ý…0µßVï7´_øÿ~³âÒ¯u_)¿ ·–ÏÑþ)ËX1à{¡ý´ÕñÚöŸ„[$þöÎ@$;Ðÿeë±ØTõï™,ø¡òߟKñŸ¯12~É|!ùêXûS5–æKÆ+÷/F¨íïß…´wA+hç/»~|o6Jd’þ÷¥FÞ/CÀ¸¦©©û¢Ê/{þ¤ ûb‹¼3¬Tÿ¬ ½Èû…óÏêq×¹•.@ü?ß²qeãÊ•ÎNÜÑ3Ä‚¥ùcuTàv´Z÷»‰ìÚã½#l¬ˆXX$U˜̦¤Ü´ý^ÙùîU¹|ò£“Ç‚ßV>ùÛ:›–Ah:0h¼„ÏâW÷Űᢠûí!À .Í=çGíß;gðO>ý8JþÍkhûÖ_Ëÿš~›ö«´ÝMùlõþa©ûŽa?*Õ¿%^P@‰ÿ¤j’úùÚ?µl)ÿ¤*øOé^?5ö=?Ù}cô=(Û/ˆ/°-+ôLº/©ÿRåüÊjŽçIúíŸÊ/çµù¯‘Ù¾­æ§´^°¿F¿@î×BÂÔ'þ»û±èÿãÁ5£äoÚcèÏ{½·[YúÏH¿/[©æ½Ùß/¸}~=¢¨€LþÅÞÒ~!öº»ÏVðc˜’ïJû´-íÇç´QíÏÙ´_qÝÅø“'x`y¿ÃøËœ_ê>>ÖuÙïÐ…ß>pØÔKû‡UÍßÈûupKÕþßAøûoYù¾Nío˜4h?)Šþ“†ðË1>$ýTó±À>þOdþdÿ[·[e ÀìÓ. ~/)÷©„_Sÿeÿ ÿŠþRþíÊߨò~Êú)é@•üæÍ í>\#×ßEY?…gÚoØ~=ÔGþM²_û\¤ýOu¹ÏðýôœQIáû5ý3Õá×#R~â;²_åüTû3 R¤ü¢»O0ßÇ÷±wEîñ7µÏÒþ:ówjÿš«ö»´WfÞoô£@Ð,¿ììü_äû‚þ„ñu‡ö÷ëš¿‘÷[)¿½Ãó}cدCÿyÿ”îó³úù•ù—%ÿ)ìé{=eËù ío•UÿV™ðËÑ>ªòGy»RûgÇVŸŽç­¿Çbä¯ÕõW£³ÿFÕÝ'Jïßj÷Iþ‰÷Ž´ëý.ôWÂ/ºûóéo9Ô~‹ýV©Ÿ^«:¿òšû2ûÏHÐ#¶¬ä~ÖªøgDÕ¯ÇR~à'ºûðQhž1 ƒÁ`0 ƒÁ`0 ƒÁø\üƒÔ endstream endobj 109 0 obj <> endobj 110 0 obj <> endobj 111 0 obj <> endobj 116 0 obj [/Indexed /DeviceRGB 255 <000000FF00006B6BD2FFFFFF666666FF66667B7B7B6666C24A4AB96B6B6B4242 B1F30000FF9090B1B1DA888888737373B1A1A1FFB1B1CC6B6B181818FF33337B 7BCC6666B9E33333B9B9B99090D2DADADA8888CCB98888FFC2C2424242E37B7B FFE3E3DA9999FF1818FF7B7BEB2121B1B1EBFF4A4A8080D2C2C2E3A9A9A93333 33F33333D252529090E3DADAF3CCCCEBEB1818FFA1A1999999A1A1DAB99090FF D2D2525252EBA9A98080E3A1A1E3EBEBF3080808FF08087B7BD2FF73737373C2 5A5AB9B1B1B1292929FF4242E34242C2C2C2E3E3E3DADAEBF38888FFF3F3EB90 90FF2929FF8888C2C2EBB1B1F3FF5A5AD2D2D2EB4242E34A4A9999F3CCCCF3A1 A1F3C2C2F37373D2FF6B6B8080806B6BC26666CC5252B94A4AB1FF9999B9B9E3 B1B1E3909090B1A9A9FFB9B9D26B6BCC7373212121FF39398080CCE339399999 D29090DAC28080FFCCCC4A4A4AE38080FFEBEBFF2121FF8080F32121B9B9EBFF 52528888D28080DA393939DA4A4A9999E39090EBE3E3F3DADAFFD2D2EBF31010 FFA9A9A1A1A1A9A9DAB99999FFDADA5A5A5A8888E3A9A9E3A1A1EBF3F3F3EBEB FF101010FF10107B7BDA7373CC5A5AC2CCCCCCEBEBEBB9B9F3B1B1FFD2D2F3CC CCFFA9A9F3C2C2FF6B6BCC5252C2D273739999DAC28888F329298888DA9999EB E3E3FF8888EBA9A9EBF3F3FFD2D2FFF7B796FC949005E770C2F0F4F7B82899EB 94F741F7FC9490F7B84E6D892D05E770C2F118F7B77BF741F7FC949003EE8803 D600F713EE00016FF7A2E3007DF1C2F164000FF8DF0008402004F7A3A0C40000 1F200C000FF8000000C4000CC40000DF0008000000F713E22A001EC4000CDEFD 30C2F18CF7A10E03EE8803D60000000305E00FC2F1A800E44A05E0F8000032F7 B9C59A3DEC000030001DE803B600C2F1E000CD7C00000900CD5C000000FF92D0 05E10005E17003B600C2F20400CD7CC2F21000F56A033238FFFFFFC2F2780010 260000300021F9000028FF92D0601232FF94D0FF92A005E100F432F805E100C2 F22C66E8880000006021D3FF92D0F432F805E100C2F26C66E94B00000060D91D>]endobj 115 0 obj <>stream xœí} Oi–¶s1Ónó!H ‚Âf0IX&|&\‡5Ù| .FÁËe@_˜ F€Âm#I‡ÉÆÍF ¼?tÏ9ï¥Þ*@fâäö‚ Æ—AçbSHôïÝœiñ×­ôÆ |E ã‹`c±ªw ~~^±Iäo*ô%1Œ/+óŒÕû'6+6Áö³ò3ßBÁxo¨xÌïŸh‘¿B_ƒÁøhÙXœ{2PÜ]ï÷û»Aø¹«ÁøFp3¸Ÿ u‡zçªxƒñm`3Ä¡ýÅÐB¡¹3…¾ ƒñ…н±ØTõ$„xRÅÓúŒoþ`0^UÕ47×gî3ßî÷nãKñÅ•_ }) ãËâ—¿ßߢ©½×Â`0 ˆë}…¾ƒQT³ø3ß(n3ûŒoÑB_ƒÁ( b· } £0ˆ²ñg0¾MDÙø3ß&˜ü Æ7ŠëìûŒooXúŒoi&?ƒñ­àæó ¿_/äã®ü­µ_ð‚~ëë…¾ã7Ÿ·øWz—:7®|×ùžÔëFþÉ|_ôÒÎÇZÏwTè‹`0þA1S/‰òW6®t^¹Ò Mþëyä_?ðùþ—?× —Âäg0.‰ûÀxã †zõn,Zm;{­Ñ÷ïÿ[È¿ñù²L~ãÒ~'(Ÿ¯P °”?=4NÍ=óù’¨¶]¸Nî–ŠkI2ùŒKÂOt¯j©ðw^¿¡üѨ1©¿•ˆbë»V€ë´aý\^ +?ƒqiÜDÅ‚G3”ñ9¿Yï›üA2ß—ÌØö?˜Ïd“Ù$\+?ƒñˆåïÓÑXçw6å¯Öä§:!YhåÏmõ3@~V~ãó0°Ñ¹!Ž&déO+4:(^S…6‹;Tþ7…¸VDi&›Aîù³>îçg0. g°Sµl!@“äÔÂ/Ò}‚ü€ú@ÿd6+²V~㲘Yê\zNGcADgç†$ÿmÝÑ×*óý¬(ùÔögüÙ üŒÏÅÍÅ`pf—‚ ý@AþÃh4-ϱ+a ~D~¬øù²lûŒÏBïÒâRh³Â_ BÀ Èo ?)¿¦~mf¹ŸM²íg0>þÅx|1¾ø!þ!aø$òGÑ}¨üY‹ý…·ýÄþ$Û~ã³P¬ÿP¯Š ,Å—üףј>¥Õ&üÙB“?+J~äüïòZŒlܯB4‰†ô_ôÓL~cX¿™óg}ÉÆ|ãÚèëöð~*mwwyxïã×p:üëÙY8ŽÐgÚÏú_{jFTüPù“IV~ã3ðóœDÕñ c|Ï|¾?(É—ìÅæøº½©ðþ~d?Lã^ ¯6œÏeÀéò*œFàùRûíkÎó¦J!ßÇFôïÉRw]l\øc0.ŒÇOû逹/GõËQ}IÓö'³è¼3™Tþ—­½ìÚOõS¤û€×ÀíÝÿ>ïçOV‡VOV"«4æá“?^:,ÃÔ¸`þ¸èë“I¿;ãâ(Ö?é}ÒÛ;ÛÜ\SÕDLíóŠQ}¶j?xnâþxžòçºà>)ŒJt&ú¯6ä\|xHpÿ%Š?6éýáKöSvFùýã2é—}D8bò3—¿7ê õÂz‚ìŸû'£Øgé½:H’éGÔ8¾ho>±OÔßGþ*âõONVON]~ûס“!|t?ŒÊOQƒØIì›ç"ùÉ÷Ó ¿lR;òñãRh …B+ÐBž„zç~3 ýF²o R(¿Ãö¯ãß—ôO¡‚£éôzƒ¾çgþ£C#'CC@þW-å—ÒI$Ì€AäÏ’ñÏR¹ß¢>+?ƒqÜX‘Qèý-–Óoúœ@Ê÷3™yÛ×ìu%ÒôƒòHÈW¥ò¯"ÅÚ:424´{‚äÔ틤63¾ùµðgù…+ö2Œ‹âþ€ÄÊÊñÿ/­7¶™õ¾,ÖÝl9n^Ⱦþyð°HãWQ×ÑÞíæì¿ündhw„„ÿääDÿ0±¬? ?|á²uvƒ~Ó÷[®„•ŸÁ¸8~(¦FüýÿÆ›NÛïÓõ>‡ò¿ÝGîKáO…SaUëá‚ ŒüjûáW#€¡]Š (þ»ïÎPýQù÷¥ö'ö­Ó…ògÇůÓ0ëêXùŒ‹ãfw1Bñ`eÓxÓÅô'E_ßxÖ$s‚È¿¿Of=œŠDVwÏ^*ú½GvGFliÿè±DP_†½³U•õ§(–XÒß  ~Ö0V~ãsð˜È?V,B¿ÅxÓ-çÝüY[Á¯Qr;ùQ¶w‰æ¹_¥ðCÊOLkþð[úÓ‰ ÿOê¯Ã`üçUo_"ѧËj–Ä_¬èa]+?ƒqq<öuwûíÊŸWíOf{¨ânöóß½Šäߗ‰h½>¢Z?æûCÄSú‡FýÉõ[oìb¹ÈIääe¿êÓ0®ËýjjU‹`åg0.·€äÿ@…ñ^žîõ³Rû Û?Ü¿ M°×zg;ù‡PÞIù²ÞÙCê¿Bã?tbô…_î6ŒöŸ:û¦ˆúBû1Ð"ž¬ü ÆgÀß]è®Gþ#û7'´›å>_6LÿÞÕ« I}ª÷åŒ÷ND±ì=ÁzãT ?ÕûOÞ}âÅjî ågÅg0.çâ›þz’ÿâ çZ åÙÏ¿Qgâ*¥ü²à×`¾Òä¦b?°ý­¥ð¹·Èþ·ôŽóý„é´˜‡œØ×ƒ¦Ÿ'ô0Ÿ¿±¼¿ ù³¦ïÏŸÏ?ÂÒ/¹i6ß;¥þ!)ü#µÞQÊ/»úWëg££Ín£€ Èr¿˜Ù“dåg0>é3Ù_ßíF~£“?ébûß_¥”_VüÃ~¥ò á7ëýôRÒÿDŒðÇ©½‘ðnÿiUc|Øö3Ÿ‹XßðþŸ-úÍ8O±­á—Í_Ìc„_Ò?’Ûß=#é—"ÿÖHúÿ›Ê}¤üb€¿œÜüO¥vïæ\/7#†øeiF?Oèa0.ëÑ´wÂoÙŸ¯üz4 ÖûòÉß|ÕÈù#‘HûIûnûî¶³wgTî“Å~hVfŸÃ”_)ÿÍ ¾4-(Ùop+ŒÓ¼½€/“ŸÁ¸q±®–– „fÿŒó,Û~.ä§^þ„®ö›Ëøà„>Tþ!9Êgä­Áè¿êœ_ð%åËñ½)ç„~‚ZɇÆösÎÏ`\bîîf ÂbÿŒó´‘¿áêUQï¾GçÍÓ}ò“!1ÆG)¿9ÌÇÈù‡TÒ/föÐJ@ûûgy—lüàjšóN`0‡\¤s`ÐßüY‹û.ýüS ´ýªÚŸ@ÛNÚ/çõœ¨‚ñß\ÐkïJùMåˆ~`üö^C„îê˰ò3—…Z¤³bsSð_°¿þ†óDSùÝ ~ V¹’~þ”X¿/,øIåG¡·­æ·÷VŒÔ·ôÐËy8Ù­”?Ë9?ƒqY(î?ž©ûÏU~Ëõ»ÙþI³Ú/&öÐ^±Ž‡˜²«¤ß¾”gî?‡dÊ¿z"‚)D(?.äçø­ŒZÊGäülûŒ ã0z]ùgff*Èúûgœ§ZÕ~*÷çð›Õ~k”ϼ´ý‘°š×£êýNò{½§ÿI¿Ö}±–Ìùû Ǩ}]ìϰò3—BßmuWŽŸgfn û+Ðø»“ß>³'o„_s¾ò‹¥|(é²ÿ<ò{ñž# ü/UüHøi^ŸsÔÀ¸X»;ÃÕ~ã’°îÁûóù'>Jþlþ:E??P_Tûç§§kÐöâpÎõœ¿;‘®^ÌçO!õ÷‰œíùÊß®gõ‘úæÊ{©ˆUïK$–moÊÛu‰A>¬ü ÆE¡ïŸ®æÆïåüëæb^Ùd&ï뎤í—+ùØjt¹ß£»wz:<üÓÙÙªÉâZ¾“ï†ï´/ù›‘KyHåŸü¤ÿ\ƒ!q]õñ#€ø7ˆûçVû¬•2if ꃜu ñ“S{‘ý~ãûXÆ;ûixô•}a®W¿þôŽº÷iBϪ¹’O¿Èùé ¯:rþ.P~ZFL(¿ìyàî~ãÓPm¸þDz§]ÿ„ë¿ucJ/®Ü]:utw»+c¸ûVáûåœÞýˆõVƒ^»ŸîÌ1¢~{ÿðoâ^]«ÏDÂäÏÙ®¥±Tß±'‰~¤±}ª6yð·øWa0¾ÜÖwáõz®æ›ÂŸ?¯Ù6+í=Xt›²ÎÈIòÓHŸÈ~*%Ù¿&‡í…Qßi!ÏœúÈ«= Ÿ`Ý‘{]?Ú~rýÖÚÝ„F½x¯yûàäßè†ÁøÊÑ­¶Rþ_**Ôð^Êøëýÿ7ï>›ôc;ÊïkãŒvs˜ÎÇ 7Œö¾”ÔÇÁ{â†\Æ*^'CrmO9£'<šÃ?ï5¤tOÖûS{ÚEO_FŒñÑø[þó0_/Ž>ïÍŠMIý‰s¦ôz3ö™=”rÛoו벆øÒŒ~q“nû}ºWmkôâÊž«òîÜrdßnûnX ðÙÜ/áè7œ”Â/”_oÓã«EµYïÚcÓsúüÝ3y¨±I?òÍ·mÎÍ‘îí£Ûõí«™}4Ä_êÿÉIÎøDîäÄä¾ÝgõóEð wíWâmÜÇ‘ý>¾cƒqA˜äÿ¹¥E®å1¡–ñšÉûÀ¤©üú>½öþþvYò»º/²~âp8bQ(n/Üë„_Ýw>¢—ñÀé¼h$rÎk—Âï3oÒËýý Æ'!jÿ—‰–‰½ŠW½¿¾Û…ü9Û=»ô}zí'Í'(ë$ôr>á”pþ’ú«Î¹w«Öd¾°^ÄCÌé‘ý|ùƒZ³êf]jØnÜßÏ`| ¢FOß ÿ6Å}¼oOÞžŽå<|IºQ¯“ü¹°ãK¦ù}b–®S÷»V¾§¤ÂÒò§h= ü®¿æ}Ä»7žµ:ú4Ú?÷ß„Áø&`*ÿ¦céÞn—›vÞ›Ê/´?›qŽá?KÐðþ«2éW{åb~n#ýÞ™sø#j6_Šfó%ö#®“&3bÙn›i½ü¿ƒñ á¶EþÇzÝîz¡ûn·ëäžÔ÷ɂ޸º£ÒËôòNÝ)¹œW$üSÎõRŽ„á§•»ÂF­…?õNy±Ž‡-áQ> ƧÀPþ›@yâ=4y«¾üu"r]û‘üI`¿Ë Úá”è—Py?!Ü;÷bFOÔŠ½ÒóGhh_äìü¹“ìp°i?“ŸÁøD«£êf-HzÁüzy—î7åÕd²–öÌ¿vP:ÚŽºäO…çwï~däýéðÙ‰òü4¶/uÒ_°aªÖ”ýÄñòƒß?ŸÁ`bzxïc}{nIý±âWå>>::ZoþØŒýWk¯ÖÄj>Ÿ|Qê§á½Â\^Î'žÎ`0ƒQq·¯÷—n…1BqñÀÀÊïŸÁ`üCã ø~q´9f˜Ügò3_/¢Ñè!î×kæ÷WZ }y ãï…ê¨XÊç9¾˜hOªÜ…˜ü ÆW‹¾¨ä7t/–¢~Áäg0¾^û¯{½cHxE|IýÞ¹‰B_ƒÁø»!Åš_Eh%´‚¬³/˜êí›cåg0¾b ‚ôGBÈþf>P¸ÏÊÏ`|ÕÀ¬ÿ@wÚˆø`ø‘úMMþB_ƒÁø{¥ÿ7ú^¤}¯Ð|ä~0(ˆÇk  Ø`D‡öí×­ØÚ·Û[U;/$`4 ‡ý1íÙ÷hýÿÄÿm1¸ º¿|'€þz«îá`90>FB=»S‚ìóîÌvô:hØp%FŠ’ÙXÚOe-#¯C;à-¸³0ˆ~¿£Ž–¯ë0Ïi[hÃìÂû¢Òƒ!¡­r– ±J¢}Y]ú‚­…E”Q<ž‹åü–æ›Òo ì™MÐ<½G> }®öŸ>85èoñœ8ß¼ö Ù­h¿$‡‡ØÐ¬K7 Žá@÷©MXE÷#hÃJûG%ñiwËlŠñ¸5yKcRøIý~;é—÷‘ößOM‚ðO~?e6EðÈ{`?6ê#í[‘îÛí†%  6¤=vÏZ%ÿéÙ >0_qý˜žk„-˜·”ŸœB#n©šFxn´¸ßˆÜo´´ß&þëkmD×Ú ŽDÄGšÙáàGhHtr?RC¼/ŦP|—dÇnÄthÁ}â|¾ê)U„—ÜïÁ嬀ö¸¨º‚,nÂøp‡/ðöZ´è…XçÒ"ÿÅÅ¥xü7,ûýWÓ"ÙýÅÅà´ ù©Âm«{8‹‘òw$?p\áNݬ`{Ñ2à¡é‚ž:.£W]ûï -ðUvà7¥á é“uóœ’_Í=ôõÓ 1V½;++ñ¯áÃø±jØÅ.B}—(3viÒ~öôþÁyÚo×} þÞšMøÅ4gü›=pŠ?i¿Hš…ðÛÄŸ( •²¥ûÃnÀÝ~up«ßˆyªßO´¿µ,èkR‡bÿÔÔ䔡ü¦P1`Usaý¿ßކ͖´£êߤð‹½]÷Qõå^„€VKôÿÏ5ØTN`—}|Týy¢;<”ú7ZÍzì'í·YýÒ5°é>„‚kZ÷1àëT@(ÿÔý§OÇŸ"åi/--5%ßd$  ‚~´ÿúÔ”ð‹-ké?ŸêÿúǽKAäz$þŽþöaì>¼ ;ƒ6ò— ¦nÕŸ1⸠‘gyžö*ëLò×S…š;•m·­c«Þh¥çE>ùÓm•Èö¨`;üNG”XN¢m–ªJ ñ³fÁàSèoùý\^[ÚEûÅÞ]û ö›ªoj¿®4ÛËk¦ò?²ë¾Ò~Cù×µÝ?’H?,µ_‰¿Cûï’ðdXÖz/›¤~¿aü%ó—…ç—Ú?)ÔßÔ} (÷ úÀý)Ãú;tÉßÞJÛ¶!üZ÷Û¡µ¶Ãó±6Rú•ë—–_ÿXk¿|¨ÂÀ<ÑÞR~“þ û5]`ìÊoñ^»WíWºÄ¿&ŒÿS²ü:ï?Ê/Ô_˜~|HÖKá—q€èýC)Ñ^k¿f¿”~8øAZ±vµd~’¨/´ö —Ÿ•¼'êÓß²šüõÀsäz0ø¯ÿGûýñ½Øè„f#êô½Ù鯄ò{ªù%ëbH¢K ò÷É¿Ùu\uü-²ÇŠ®ÏzòÈß7}{‡¾IüŠ·dzº#`½”D¼úð½@삾ߌ.Å?þ¼"à=öÎ×þ½SS÷Úß,ÙeßEù­ò_3é¾~<Àl)¿®Ú]­ûÃ:ëwhÿ­~Cùïjí_6ó}ñ÷kí—•ïʯ´_Å€×È{tû–÷ÝŸ²åû¢¡÷Ý*”¿µÝ,á[[-ÁoÕOZûI÷üHÿg†æ«ä=¥ü˜üká×A e…€®FWt5v]k¼ÖUÛu­ËUûµî“í¿&…_Š>=¿Mè?E’~ÓúK`©öãš÷ãvíÏëïùAi&©š¢¿ÔþŒÖ~"¾Èõ³Û X ±òG4ÿÑ¿,mtv¯t^±‘ŸJóŽ-¨¬M“Á®ö´íx0 zh7íÑl‘ßëé»;1›'­óp£Eõ‹Ù<òÇ*ËËMò{^D©œ¯È§:–Æ«óP ©óô]LùÍBŸ“úJûEÕ/m¯ùS;GûAùO䷴ߪó­iöËðHª¿¡ÿGÍ–ö7«¼_è¾,õ©@0_i¿æ¿%ýH}þ»†õy¿~Ò}§òkö[¼'íŸt~Ù€1€lD€©ísŠ}ÛDúvÊûÛ-í?&ío•vÍ¿`¾!ýó¸ÕKÅ—ûg¦öÏ+áGç¯6Óù§„ô7Ú­€Úk°á£K‰¿Mû­Œ™MýI÷§ïÔíéSÅþ[ѯÔHdª?Žâ/ÆõÇ•ç_ú„Û·©D⟥[júä--Í‚ßãP'ð|ã xüà*þŸ¢èþ£þËÿÿ°ñ ºïknm"}O“òƒ°W")Óƒ“-$#ïê<1'ùït”‹à±Yzñf]™†(ìÚòÈuJÛeRoYâ xÚðc垎 uõÙ‚€KÏŸ—”ß)þB÷õ]´ß©ûμÿ•tkpdïÌKüåi¿Ðÿõ#;ý…0µßVï7´_øÿ~³âÒ¯u_)¿ ·–ÏÑþ)ËX1à{¡ý´ÕñÚöŸ„[$þöÎ@$;Ðÿeë±ØTõï™,ø¡òߟKñŸ¯12~É|!ùêXûS5–æKÆ+÷/F¨íïß…´wA+hç/»~|o6Jd’þ÷¥FÞ/CÀ¸¦©©û¢Ê/{þ¤ ûb‹¼3¬Tÿ¬ ½Èû…óÏêq×¹•.@ü?ß²qeãÊ•ÎNÜÑ3Ä‚¥ùcuTàv´Z÷»‰ìÚã½#l¬ˆXX$U˜̦¤Ü´ý^ÙùîU¹|ò£“Ç‚ßV>ùÛ:›–Ah:0h¼„ÏâW÷Űᢠûí!À .Í=çGíß;gðO>ý8JþÍkhûÖ_Ëÿš~›ö«´ÝMùlõþa©ûŽa?*Õ¿%^P@‰ÿ¤j’úùÚ?µl)ÿ¤*øOé^?5ö=?Ù}cô=(Û/ˆ/°-+ôLº/©ÿRåüÊjŽçIúíŸÊ/çµù¯‘Ù¾­æ§´^°¿F¿@î×BÂÔ'þ»û±èÿãÁ5£äoÚcèÏ{½·[YúÏH¿/[©æ½Ùß/¸}~=¢¨€LþÅÞÒ~!öº»ÏVðc˜’ïJû´-íÇç´QíÏÙ´_qÝÅø“'x`y¿ÃøËœ_ê>>ÖuÙïÐ…ß>pØÔKû‡UÍßÈûupKÕþßAøûoYù¾Nío˜4h?)Šþ“†ðË1>$ýTó±À>þOdþdÿ[·[e ÀìÓ. ~/)÷©„_Sÿeÿ ÿŠþRþíÊߨò~Êú)é@•üæÍ í>\#×ßEY?…gÚoØ~=ÔGþM²_û\¤ýOu¹ÏðýôœQIáû5ý3Õá×#R~â;²_åüTû3 R¤ü¢»O0ßÇ÷±wEîñ7µÏÒþ:ówjÿš«ö»´WfÞoô£@Ð,¿ììü_äû‚þ„ñu‡ö÷ëš¿‘÷[)¿½Ãó}cدCÿyÿ”îó³úù•ù—%ÿ)ìé{=eËù ío•UÿV™ðËÑ>ªòGy»RûgÇVŸŽç­¿Çbä¯ÕõW£³ÿFÕÝ'Jïßj÷Iþ‰÷Ž´ëý.ôWÂ/ºûóéo9Ô~‹ýV©Ÿ^«:¿òšû2ûÏHÐ#¶¬ä~ÖªøgDÕ¯ÇR~à'ºûðQhž1 ƒÁ`0 ƒÁ`0 ƒÁø\üƒÔ endstream endobj 117 0 obj <> endobj 118 0 obj <> endobj 119 0 obj <> endobj 124 0 obj [/Indexed /DeviceRGB 255 <000000FF00006B6BD2FFFFFF666666FF66667B7B7B6666C24A4AB96B6B6B4242 B1F30000FF9090B1B1DA888888737373B1A1A1FFB1B1CC6B6B181818FF33337B 7BCC6666B9E33333B9B9B99090D2DADADA8888CCB98888FFC2C2424242E37B7B FFE3E3DA9999FF1818FF7B7BEB2121B1B1EBFF4A4A8080D2C2C2E3A9A9A93333 33F33333D252529090E3DADAF3CCCCEBEB1818FFA1A1999999A1A1DAB99090FF D2D2525252EBA9A98080E3A1A1E3EBEBF3080808FF08087B7BD2FF73737373C2 5A5AB9B1B1B1292929FF4242E34242C2C2C2E3E3E3DADAEBF38888FFF3F3EB90 90FF2929FF8888C2C2EBB1B1F3FF5A5AD2D2D2EB4242E34A4A9999F3CCCCF3A1 A1F3C2C2F37373D2FF6B6B8080806B6BC26666CC5252B94A4AB1FF9999B9B9E3 B1B1E3909090B1A9A9FFB9B9D26B6BCC7373212121FF39398080CCE339399999 D29090DAC28080FFCCCC4A4A4AE38080FFEBEBFF2121FF8080F32121B9B9EBFF 52528888D28080DA393939DA4A4A9999E39090EBE3E3F3DADAFFD2D2EBF31010 FFA9A9A1A1A1A9A9DAB99999FFDADA5A5A5A8888E3A9A9E3A1A1EBF3F3F3EBEB FF101010FF10107B7BDA7373CC5A5AC2CCCCCCEBEBEBB9B9F3B1B1FFD2D2F3CC CCFFA9A9F3C2C2FF6B6BCC5252C2D273739999DAC28888F329298888DA9999EB E3E3FF8888EBA9A9EBF3F3FFD2D2FFF7B796FC949005E770C2F0F4F7B82899EB 94F741F7FC9490F7B84E6D892D05E770C2F118F7B77BF741F7FC949003EE8803 D600F713EE00016FF7A2E3007DF1C2F164000FF8DF0008402004F7A3A0C40000 1F200C000FF8000000C4000CC40000DF0008000000F713E22A001EC4000CDEFD 30C2F18CF7A10E03EE8803D60000000305E00FC2F1A800E44A05E0F8000032F7 B9C59A3DEC000030001DE803B600C2F1E000CD7C00000900CD5C000000FF92D0 05E10005E17003B600C2F20400CD7CC2F21000F56A033238FFFFFFC2F2780010 260000300021F9000028FF92D0601232FF94D0FF92A005E100F432F805E100C2 F22C66E8880000006021D3FF92D0F432F805E100C2F26C66E94B00000060D91D>]endobj 123 0 obj <>stream xœí} Oi–¶s1Ónó!H ‚Âf0IX&|&\‡5Ù| .FÁËe@_˜ F€Âm#I‡ÉÆÍF ¼?tÏ9ï¥Þ*@fâäö‚ Æ—AçbSHôïÝœiñ×­ôÆ |E ã‹`c±ªw ~~^±Iäo*ô%1Œ/+óŒÕû'6+6Áö³ò3ßBÁxo¨xÌïŸh‘¿B_ƒÁøhÙXœ{2PÜ]ï÷û»Aø¹«ÁøFp3¸Ÿ u‡zçªxƒñm`3Ä¡ýÅÐB¡¹3…¾ ƒñ…н±ØTõ$„xRÅÓúŒoþ`0^UÕ47×gî3ßî÷nãKñÅ•_ }) ãËâ—¿ßߢ©½×Â`0 ˆë}…¾ƒQT³ø3ß(n3ûŒoÑB_ƒÁ( b· } £0ˆ²ñg0¾MDÙø3ß&˜ü Æ7ŠëìûŒooXúŒoi&?ƒñ­àæó ¿_/äã®ü­µ_ð‚~ëë…¾ã7Ÿ·øWz—:7®|×ùžÔëFþÉ|_ôÒÎÇZÏwTè‹`0þA1S/‰òW6®t^¹Ò Mþëyä_?ðùþ—?× —Âäg0.‰ûÀxã †zõn,Zm;{­Ñ÷ïÿ[È¿ñù²L~ãÒ~'(Ÿ¯P °”?=4NÍ=óù’¨¶]¸Nî–ŠkI2ùŒKÂOt¯j©ðw^¿¡üѨ1©¿•ˆbë»V€ë´aý\^ +?ƒqiÜDÅ‚G3”ñ9¿Yï›üA2ß—ÌØö?˜Ïd“Ù$\+?ƒñˆåïÓÑXçw6å¯Öä§:!YhåÏmõ3@~V~ãó0°Ñ¹!Ž&déO+4:(^S…6‹;Tþ7…¸VDi&›Aîù³>îçg0. g°Sµl!@“äÔÂ/Ò}‚ü€ú@ÿd6+²V~㲘Yê\zNGcADgç†$ÿmÝÑ×*óý¬(ùÔögüÙ üŒÏÅÍÅ`pf—‚ ý@AþÃh4-ϱ+a ~D~¬øù²lûŒÏBïÒâRh³Â_ BÀ Èo ?)¿¦~mf¹ŸM²íg0>þÅx|1¾ø!þ!aø$òGÑ}¨üY‹ý…·ýÄþ$Û~ã³P¬ÿP¯Š ,Å—üףј>¥Õ&üÙB“?+J~äüïòZŒlܯB4‰†ô_ôÓL~cX¿™óg}ÉÆ|ãÚèëöð~*mwwyxïã×p:üëÙY8ŽÐgÚÏú_{jFTüPù“IV~ã3ðóœDÕñ c|Ï|¾?(É—ìÅæøº½©ðþ~d?Lã^ ¯6œÏeÀéò*œFàùRûíkÎó¦J!ßÇFôïÉRw]l\øc0.ŒÇOû逹/GõËQ}IÓö'³è¼3™Tþ—­½ìÚOõS¤û€×ÀíÝÿ>ïçOV‡VOV"«4æá“?^:,ÃÔ¸`þ¸èë“I¿;ãâ(Ö?é}ÒÛ;ÛÜ\SÕDLíóŠQ}¶j?xnâþxžòçºà>)ŒJt&ú¯6ä\|xHpÿ%Š?6éýáKöSvFùýã2é—}D8bò3—¿7ê õÂz‚ìŸû'£Øgé½:H’éGÔ8¾ho>±OÔßGþ*âõONVON]~ûס“!|t?ŒÊOQƒØIì›ç"ùÉ÷Ó ¿lR;òñãRh …B+ÐBž„zç~3 ýF²o R(¿Ãö¯ãß—ôO¡‚£éôzƒ¾çgþ£C#'CC@þW-å—ÒI$Ì€AäÏ’ñÏR¹ß¢>+?ƒqÜX‘Qèý-–Óoúœ@Ê÷3™yÛ×ìu%ÒôƒòHÈW¥ò¯"ÅÚ:424´{‚äÔ틤63¾ùµðgù…+ö2Œ‹âþ€ÄÊÊñÿ/­7¶™õ¾,ÖÝl9n^Ⱦþyð°HãWQ×ÑÞíæì¿ündhw„„ÿääDÿ0±¬? ?|á²uvƒ~Ó÷[®„•ŸÁ¸8~(¦FüýÿÆ›NÛïÓõ>‡ò¿ÝGîKáO…SaUëá‚ ŒüjûáW#€¡]Š (þ»ïÎPýQù÷¥ö'ö­Ó…ògÇůÓ0ëêXùŒ‹ãfw1Bñ`eÓxÓÅô'E_ßxÖ$s‚È¿¿Of=œŠDVwÏ^*ú½GvGFliÿè±DP_†½³U•õ§(–XÒß  ~Ö0V~ãsð˜È?V,B¿ÅxÓ-çÝüY[Á¯Qr;ùQ¶w‰æ¹_¥ðCÊOLkþð[úÓ‰ ÿOê¯Ã`üçUo_"ѧËj–Ä_¬èa]+?ƒqq<öuwûíÊŸWíOf{¨ânöóß½Šäߗ‰h½>¢Z?æûCÄSú‡FýÉõ[oìb¹ÈIääe¿êÓ0®ËýjjU‹`åg0.·€äÿ@…ñ^žîõ³Rû Û?Ü¿ M°×zg;ù‡PÞIù²ÞÙCê¿Bã?tbô…_î6ŒöŸ:û¦ˆúBû1Ð"ž¬ü ÆgÀß]è®Gþ#û7'´›å>_6LÿÞÕ« I}ª÷åŒ÷ND±ì=ÁzãT ?ÕûOÞ}âÅjî ågÅg0.çâ›þz’ÿâ çZ åÙÏ¿Qgâ*¥ü²à×`¾Òä¦b?°ý­¥ð¹·Èþ·ôŽóý„é´˜‡œØ×ƒ¦Ÿ'ô0Ÿ¿±¼¿ ù³¦ïÏŸÏ?ÂÒ/¹i6ß;¥þ!)ü#µÞQÊ/»úWëg££Ín£€ Èr¿˜Ù“dåg0>é3Ù_ßíF~£“?ébûß_¥”_VüÃ~¥ò á7ëýôRÒÿDŒðÇ©½‘ðnÿiUc|Øö3Ÿ‹XßðþŸ-úÍ8O±­á—Í_Ìc„_Ò?’Ûß=#é—"ÿÖHúÿ›Ê}¤üb€¿œÜüO¥vïæ\/7#†øeiF?Oèa0.ëÑ´wÂoÙŸ¯üz4 ÖûòÉß|ÕÈù#‘HûIûnûî¶³wgTî“Å~hVfŸÃ”_)ÿÍ ¾4-(Ùop+ŒÓ¼½€/“ŸÁ¸q±®–– „fÿŒó,Û~.ä§^þ„®ö›Ëøà„>Tþ!9Êgä­Áè¿êœ_ð%åËñ½)ç„~‚ZɇÆösÎÏ`\bîîf ÂbÿŒó´‘¿áêUQï¾GçÍÓ}ò“!1ÆG)¿9ÌÇÈù‡TÒ/föÐJ@ûûgy—lüàjšóN`0‡\¤s`ÐßüY‹û.ýüS ´ýªÚŸ@ÛNÚ/çõœ¨‚ñß\ÐkïJùMåˆ~`üö^C„îê˰ò3—…Z¤³bsSð_°¿þ†óDSùÝ ~ V¹’~þ”X¿/,øIåG¡·­æ·÷VŒÔ·ôÐËy8Ù­”?Ë9?ƒqY(î?ž©ûÏU~Ëõ»ÙþI³Ú/&öÐ^±Ž‡˜²«¤ß¾”gî?‡dÊ¿z"‚)D(?.äçø­ŒZÊGäülûŒ ã0z]ùgff*Èúûgœ§ZÕ~*÷çð›Õ~k”ϼ´ý‘°š×£êýNò{½§ÿI¿Ö}±–Ìùû Ǩ}]ìϰò3—BßmuWŽŸgfn û+Ðø»“ß>³'o„_s¾ò‹¥|(é²ÿ<ò{ñž# ü/UüHøi^ŸsÔÀ¸X»;ÃÕ~ã’°îÁûóù'>Jþlþ:E??P_Tûç§§kÐöâpÎõœ¿;‘®^ÌçO!õ÷‰œíùÊß®gõ‘úæÊ{©ˆUïK$–moÊÛu‰A>¬ü ÆE¡ïŸ®æÆïåüëæb^Ùd&ï뎤í—+ùØjt¹ß£»wz:<üÓÙÙªÉâZ¾“ï†ï´/ù›‘KyHåŸü¤ÿ\ƒ!q]õñ#€ø7ˆûçVû¬•2if ꃜu ñ“S{‘ý~ãûXÆ;ûixô•}a®W¿þôŽº÷iBϪ¹’O¿Èùé ¯:rþ.P~ZFL(¿ìyàî~ãÓPm¸þDz§]ÿ„ë¿ucJ/®Ü]:utw»+c¸ûVáûåœÞýˆõVƒ^»ŸîÌ1¢~{ÿðoâ^]«ÏDÂäÏÙ®¥±Tß±'‰~¤±}ª6yð·øWa0¾ÜÖwáõz®æ›ÂŸ?¯Ù6+í=Xt›²ÎÈIòÓHŸÈ~*%Ù¿&‡í…Qßi!ÏœúÈ«= Ÿ`Ý‘{]?Ú~rýÖÚÝ„F½x¯yûàäßè†ÁøÊÑ­¶Rþ_**Ôð^Êøëýÿ7ï>›ôc;ÊïkãŒvs˜ÎÇ 7Œö¾”ÔÇÁ{â†\Æ*^'CrmO9£'<šÃ?ï5¤tOÖûS{ÚEO_FŒñÑø[þó0_/Ž>ïÍŠMIý‰s¦ôz3ö™=”rÛoו벆øÒŒ~q“nû}ºWmkôâÊž«òîÜrdßnûnX ðÙÜ/áè7œ”Â/”_oÓã«EµYïÚcÓsúüÝ3y¨±I?òÍ·mÎÍ‘îí£Ûõí«™}4Ä_êÿÉIÎøDîäÄä¾ÝgõóEð wíWâmÜÇ‘ý>¾cƒqA˜äÿ¹¥E®å1¡–ñšÉûÀ¤©üú>½öþþvYò»º/²~âp8bQ(n/Üë„_Ýw>¢—ñÀé¼h$rÎk—Âï3oÒËýý Æ'!jÿ—‰–‰½ŠW½¿¾Û…ü9Û=»ô}zí'Í'(ë$ôr>á”pþ’ú«Î¹w«Öd¾°^ÄCÌé‘ý|ùƒZ³êf]jØnÜßÏ`| ¢FOß ÿ6Å}¼oOÞžŽå<|IºQ¯“ü¹°ãK¦ù}b–®S÷»V¾§¤ÂÒò§h= ü®¿æ}Ä»7žµ:ú4Ú?÷ß„Áø&`*ÿ¦céÞn—›vÞ›Ê/´?›qŽá?KÐðþ«2éW{åb~n#ýÞ™sø#j6_Šfó%ö#®“&3bÙn›i½ü¿ƒñ á¶EþÇzÝîz¡ûn·ëäžÔ÷ɂ޸º£ÒËôòNÝ)¹œW$üSÎõRŽ„á§•»ÂF­…?õNy±Ž‡-áQ> ƧÀPþ›@yâ=4y«¾üu"r]û‘üI`¿Ë Úá”è—Py?!Ü;÷bFOÔŠ½ÒóGhh_äìü¹“ìp°i?“ŸÁøD«£êf-HzÁüzy—î7åÕd²–öÌ¿vP:ÚŽºäO…çwï~däýéðÙ‰òü4¶/uÒ_°aªÖ”ýÄñòƒß?ŸÁ`bzxïc}{nIý±âWå>>::ZoþØŒýWk¯ÖÄj>Ÿ|Qê§á½Â\^Î'žÎ`0ƒQq·¯÷—n…1BqñÀÀÊïŸÁ`üCã ø~q´9f˜Ügò3_/¢Ñè!î×kæ÷WZ }y ãï…ê¨XÊç9¾˜hOªÜ…˜ü ÆW‹¾¨ä7t/–¢~Áäg0¾^û¯{½cHxE|IýÞ¹‰B_ƒÁø»!Åš_Eh%´‚¬³/˜êí›cåg0¾b ‚ôGBÈþf>P¸ÏÊÏ`|ÕÀ¬ÿ@wÚˆø`ø‘úMMþB_ƒÁø{¥ÿ7ú^¤}¯Ð|ä~0(ˆÇk  Ø`D‡öí×­ØÚ·Û[U;/$`4 ‡ý1íÙ÷hýÿÄÿm1¸ º¿|'€þz«îá`90>FB=»S‚ìóîÌvô:hØp%FŠ’ÙXÚOe-#¯C;à-¸³0ˆ~¿£Ž–¯ë0Ïi[hÃìÂû¢Òƒ!¡­r– ±J¢}Y]ú‚­…E”Q<ž‹åü–æ›Òo ì™MÐ<½G> }®öŸ>85èoñœ8ß¼ö Ù­h¿$‡‡ØÐ¬K7 Žá@÷©MXE÷#hÃJûG%ñiwËlŠñ¸5yKcRøIý~;é—÷‘ößOM‚ðO~?e6EðÈ{`?6ê#í[‘îÛí†%  6¤=vÏZ%ÿéÙ >0_qý˜žk„-˜·”ŸœB#n©šFxn´¸ßˆÜo´´ß&þëkmD×Ú ŽDÄGšÙáàGhHtr?RC¼/ŦP|—dÇnÄthÁ}â|¾ê)U„—ÜïÁ嬀ö¸¨º‚,nÂøp‡/ðöZ´è…XçÒ"ÿÅÅ¥xü7,ûýWÓ"ÙýÅÅà´ ù©Âm«{8‹‘òw$?p\áNݬ`{Ñ2à¡é‚ž:.£W]ûï -ðUvà7¥á é“uóœ’_Í=ôõÓ 1V½;++ñ¯áÃø±jØÅ.B}—(3viÒ~öôþÁyÚo×} þÞšMøÅ4gü›=pŠ?i¿Hš…ðÛÄŸ( •²¥ûÃnÀÝ~up«ßˆyªßO´¿µ,èkR‡bÿÔÔ䔡ü¦P1`Usaý¿ßކ͖´£êߤð‹½]÷Qõå^„€VKôÿÏ5ØTN`—}|Týy¢;<”ú7ZÍzì'í·YýÒ5°é>„‚kZ÷1àëT@(ÿÔý§OÇŸ"åi/--5%ßd$  ‚~´ÿúÔ”ð‹-ké?ŸêÿúǽKAäz$þŽþöaì>¼ ;ƒ6ò— ¦nÕŸ1⸠‘gyžö*ëLò×S…š;•m·­c«Þh¥çE>ùÓm•Èö¨`;üNG”XN¢m–ªJ ñ³fÁàSèoùý\^[ÚEûÅÞ]û ö›ªoj¿®4ÛËk¦ò?²ë¾Ò~Cù×µÝ?’H?,µ_‰¿Cûï’ðdXÖz/›¤~¿aü%ó—…ç—Ú?)ÔßÔ} (÷ úÀý)Ãú;tÉßÞJÛ¶!üZ÷Û¡µ¶Ãó±6Rú•ë—–_ÿXk¿|¨ÂÀ<ÑÞR~“þ û5]`ìÊoñ^»WíWºÄ¿&ŒÿS²ü:ï?Ê/Ô_˜~|HÖKá—q€èýC)Ñ^k¿f¿”~8øAZ±vµd~’¨/´ö —Ÿ•¼'êÓß²šüõÀsäz0ø¯ÿGûýñ½Øè„f#êô½Ù鯄ò{ªù%ëbH¢K ò÷É¿Ùu\uü-²ÇŠ®ÏzòÈß7}{‡¾IüŠ·dzº#`½”D¼úð½@삾ߌ.Å?þ¼"à=öÎ×þ½SS÷Úß,ÙeßEù­ò_3é¾~<Àl)¿®Ú]­ûÃ:ëwhÿ­~Cùïjí_6ó}ñ÷kí—•ïʯ´_Å€×È{tû–÷ÝŸ²åû¢¡÷Ý*”¿µÝ,á[[-ÁoÕOZûI÷üHÿg†æ«ä=¥ü˜üká×A e…€®FWt5v]k¼ÖUÛu­ËUûµî“í¿&…_Š>=¿Mè?E’~ÓúK`©öãš÷ãvíÏëïùAi&©š¢¿ÔþŒÖ~"¾Èõ³Û X ±òG4ÿÑ¿,mtv¯t^±‘ŸJóŽ-¨¬M“Á®ö´íx0 zh7íÑl‘ßëé»;1›'­óp£Eõ‹Ù<òÇ*ËËMò{^D©œ¯È§:–Æ«óP ©óô]LùÍBŸ“úJûEÕ/m¯ùS;GûAùO䷴ߪó­iöËðHª¿¡ÿGÍ–ö7«¼_è¾,õ©@0_i¿æ¿%ýH}þ»†õy¿~Ò}§òkö[¼'íŸt~Ù€1€lD€©ísŠ}ÛDúvÊûÛ-í?&ío•vÍ¿`¾!ýó¸ÕKÅ—ûg¦öÏ+áGç¯6Óù§„ô7Ú­€Úk°á£K‰¿Mû­Œ™MýI÷§ïÔíéSÅþ[ѯÔHdª?Žâ/ÆõÇ•ç_ú„Û·©D⟥[júä--Í‚ßãP'ð|ã xüà*þŸ¢èþ£þËÿÿ°ñ ºïknm"}O“òƒ°W")Óƒ“-$#ïê<1'ùït”‹à±Yzñf]™†(ìÚòÈuJÛeRoYâ xÚðc垎 uõÙ‚€KÏŸ—”ß)þB÷õ]´ß©ûμÿ•tkpdïÌKüåi¿Ðÿõ#;ý…0µßVï7´_øÿ~³âÒ¯u_)¿ ·–ÏÑþ)ËX1à{¡ý´ÕñÚöŸ„[$þöÎ@$;Ðÿeë±ØTõï™,ø¡òߟKñŸ¯12~É|!ùêXûS5–æKÆ+÷/F¨íïß…´wA+hç/»~|o6Jd’þ÷¥FÞ/CÀ¸¦©©û¢Ê/{þ¤ ûb‹¼3¬Tÿ¬ ½Èû…óÏêq×¹•.@ü?ß²qeãÊ•ÎNÜÑ3Ä‚¥ùcuTàv´Z÷»‰ìÚã½#l¬ˆXX$U˜̦¤Ü´ý^ÙùîU¹|ò£“Ç‚ßV>ùÛ:›–Ah:0h¼„ÏâW÷Űᢠûí!À .Í=çGíß;gðO>ý8JþÍkhûÖ_Ëÿš~›ö«´ÝMùlõþa©ûŽa?*Õ¿%^P@‰ÿ¤j’úùÚ?µl)ÿ¤*øOé^?5ö=?Ù}cô=(Û/ˆ/°-+ôLº/©ÿRåüÊjŽçIúíŸÊ/çµù¯‘Ù¾­æ§´^°¿F¿@î×BÂÔ'þ»û±èÿãÁ5£äoÚcèÏ{½·[YúÏH¿/[©æ½Ùß/¸}~=¢¨€LþÅÞÒ~!öº»ÏVðc˜’ïJû´-íÇç´QíÏÙ´_qÝÅø“'x`y¿ÃøËœ_ê>>ÖuÙïÐ…ß>pØÔKû‡UÍßÈûupKÕþßAøûoYù¾Nío˜4h?)Šþ“†ðË1>$ýTó±À>þOdþdÿ[·[e ÀìÓ. ~/)÷©„_Sÿeÿ ÿŠþRþíÊߨò~Êú)é@•üæÍ í>\#×ßEY?…gÚoØ~=ÔGþM²_û\¤ýOu¹ÏðýôœQIáû5ý3Õá×#R~â;²_åüTû3 R¤ü¢»O0ßÇ÷±wEîñ7µÏÒþ:ówjÿš«ö»´WfÞoô£@Ð,¿ììü_äû‚þ„ñu‡ö÷ëš¿‘÷[)¿½Ãó}cدCÿyÿ”îó³úù•ù—%ÿ)ìé{=eËù ío•UÿV™ðËÑ>ªòGy»RûgÇVŸŽç­¿Çbä¯ÕõW£³ÿFÕÝ'Jïßj÷Iþ‰÷Ž´ëý.ôWÂ/ºûóéo9Ô~‹ýV©Ÿ^«:¿òšû2ûÏHÐ#¶¬ä~ÖªøgDÕ¯ÇR~à'ºûðQhž1 ƒÁ`0 ƒÁ`0 ƒÁø\üƒÔ endstream endobj 125 0 obj <> endobj 126 0 obj <> endobj 127 0 obj <> endobj 75 0 obj <> endobj 74 0 obj <>stream xœí| |TEºïWUçtw4!@H€î¤ÓÐ A–@$¥C ([€Ñ$„}1Á48 ‚\@®étz%:£^t¼ .ãŽ:.3*£àrÞ¿ª»CˆøÐy¾ß½ïý8‡}õ-UõUÕWËVbDd¥å$hü¸Ii¤žQ÷#™R¹¨¢:À #bY•Kk_§¼s ï™_œ]=gÑïwôF –GˆLç,¼avÀ~X ’çΪ˜yøªÞ¿!*Œ?d.Q_F}CñøÄ¹‹jÕ˜Ûýeðgˆb“VUVÊg:àT÷E¿ª¶2ÛDɉ:®­X4+è_-’¾ÕU5µAþ”ÔW_7«úÃaáKr>QdWýv"},Ù^b#ÅŽ1Îè ÈÙ:ß8!º¢ô® ˆ\´‰¶R"déyj¡1´ƒrhEZD«}°êDyôíg Ù$JC¾§07Z^o´PJ2o{€>b‰F#"÷WêBý¨Žî (šO/gäÒ z”-cŸR<•Óí2­ÞX@#heEÈ]A7èo…í¡…(õ0ëÁZŒãÆÇô¬Æhjú ­†Ç~jáDž¾Ô—.§+©Ú_ÓÛ¬+(6 êO%ðp+=‡6N±tØ ‘ jµ>Z­žqöôp&ÝOGè5øñÆý4ý“õÇû>¿™×SÆGðÅBvFhUÑRºž¬>O °ïy,k/è7ê';1¶})¾ƒõ$Ô½³ä§f¼ÇÐË.Ì^ cW²‰l[Ï6±fö6{››x<_Ì?>ñŠxW¢ëÆpÔÔú ]'M¥¹˜›1Úw¢¿;é:Ⱥ±¾,=:†òßð<ïÃü0O¬ëµ3ú­­'ZÿÖú½QOfDÙ(ŒÃz £ð%ë’Ù|VÃ>€çø“"BØ„S 9¢X”ŠÕb£øñªvÖ ½£Ö+ôsEëµ­¯EÆo1ŒLð«¥Ðe4ñ3Ñ´þU㽎–Ñ-TO·#^î¤mÔ€~ ƒt”þLÇ ‹‡ÏóÐú"DÝJv;Þ{Ùãì9ö;ÈÞgßÈ—'àMâCx6Ïã|_‰w#?ÂñOD/Q)êÄr¼[Ä^ñ¶Fš¦zÞB}þ¨és’¹Ð<ÃòÇ3ŸŸí¶ôì{­ÔÛzUë¦ÖçZ?6¦7À¥Òxº ^Þ‹ÜŽ÷1Dâ^z‘þHo*_¿bœéˆøæD4¤`Ö²Ù(6ïlÞÉx§²ix+Ø 6o[Î~ÃV°ß²uìnõnFß¶³c{ñ>Åöã=ÊŽ³¿²ÏØWAÌ¢ÙÅûñ4ž‰žæñQ|Ÿˆw¯Â[ͯãK1Cò&¾]…K¤Š ±XÜ+žÏ‹7Ä·×R´4-K›¢ÍÑVh‡µ×´·´ïu»îÕçê[ôçMq¦ËL“MóM›M»MŸ˜Î˜Mæñææeæ7̆ŅÝê%ô{µÒL‡Y­ýŠǺˆÕú*6#fâÅb¡¸]ü§>›ö«óÄãaQÀÿ)ªØ~€%»>\̦µd°þ>?Å?Öº±bþ)KÒî`Oñ*‘ÇM²ýu­›¶Bÿ„ˆ¿IÃùM¬…¿ VˆÆ¿Óp} ;®oᯑC;Á»Òq¬êUüz•Ïãk¨D»LÿžæaÜÿMÿÆ{$_Íú‹7´-ô‘pò¯ÙI¶ »Æ!6FKä×ðLÖ€÷,ëCŸ³ÅTÍî&{šý™5c;Å£l,ïŒÙòq+ŠCèˆgoˆNT*}d}y76žŸä“Å3¦#b0cØ%þ“nd‚¥#vBO+]‹°‘÷ÞæÅnò:Ë ºûý©Ög䎭¿¥¯Aœ=(Rh"¥ÓÕü޵ñÞº•2h?bp5¥óÍ´ÌXÎfbß¿û'§f6ŸÒX8vËð­çEwž€½° ­þûÿËØõ‹Øt=s`eµP’&5k5/v¦rì¿kðΤ«ÁÝOwšöè¯Ó8ÖƒHs´nA”¿K×àÌùíÇRü›Fj)ðÚy1JÜßZH¼·Ò+ŒÓMðy$Öùx­;ï&c>z8gÔXœ‰ižqåaî&+Œ5TfCÛÍ:öžåÔGߎØ%OîäbOöÈ˳F Ï6tÈàËe LOšâԯ¯+Ñ™ï°÷éÝ+.¶gLîÑ]£ºØ"#¬Ã;…YÌ&]œQŠ×YPîðõ-÷i}……©’wV@PÑNPîs@Tp¾ÏQ®Ìç[z`9»ƒ¥'`éi³d6Ge¥¦8¼N‡ïP¾ÓÑ̦M(A~]¾³Ôáû\å¯Pù *oE>>Þ˜¹ù+wx}KçÖ{ËóQ]cx§–Wéœá#g®/Ò­L(O5ã3åù̪Ç<ÙZãhLi©_Ûl£åîÎ33+¦—øDE©l£‹íæûzÜøaÌ9•G啬j¯õÞ˜yÉÖׯrø¶M(i¯—ii)êðqWAy}^‹!,šä@[|ei‰­DƒÙÙ§@ïf9½RR>ßá sæ:çÖÏ/ÇÄÄÖûhâ ñþØXÏ>ãÅzõÅ%Îx_vœ³´"¿Wc4ÕO¼¡©§ÇÑó|MjJ£­K`X#"ƒ™ÎÖö™Ym:•Sæ2W4±m\™ôÈ9áàsT:àI‰}&“Yè¾rÌð”2”òÍÄ|Ìó…å•×Û†Cn“å}ºËætÔŸ&Ì¿óó¿Ÿ/©JL.Ûi’Y%m}(ïs»}ýûË1çaFáãHÅNMYÚÌ}Îj›ÃGã1¶¥ÃÓ0øññrz×4{hßò %ÞA3âüäIs—úx¹Ô´„4Ý&KÍò¦­x¹qü$Éï‹n>Kß¶?‘¶î]½s‡ûX÷ÿzV@_4ÉY4aZ‰Ã[_Û¢âó¸€~X›.˜cܧ¹0R£½‰ÓJ¤tWÓ;¯¼K >úºæ•ˆ8^Èñ8¡ªBüNo«Y2%e]šË¤âf³Ù‚Væ(ðÙÊ ii§øøŸX¨Ù8)K)r®X°O¾áîóùçñç¹×¹^Àa­//*žV_ßé<]6«úú§£ ¾¼¾¢ÙX>Ãé°9ë÷‰QR_í-M³±Mœ¯`m):1— GhsÊmt²Õ=lõ¤i%ûløÄZ]\âçŒç•ç–6&BW²_j%åR*…’qHçV…Ÿ[”}Ü>Ñr¥Õ”@ñ•ÍŒ”Ì’1ªlæ™-$ãi™GÉä#wмâ’ö1 Viªºà 5¾ÕKSmô}mk_›’´Lõ¦LÖKæx¸a‹|Z©áXhzŒ M™èÅbš]10ò;´ä‚ýµà'ÞÁ3I@>8 ¤“0(ÆË€ °õ·Ë:BëhºùªÐ_"›>…€1È;µ¨¿VCñÈJí ½©?ò Ð%›{Ãö%ã#©‡]‚²›‚r5´ú‘àÃ(ó:ŠºB‹zvJŸA‹Äs²¯Æ—È/…£‘ÿ´¾æƒŽ…|ò—V”Éâ™F%ò]¿cÓù΀徕e`o…3¡Ï¥-Úµ‚ÆI[Ô™,Þdqì>ܩޤF­˜¢¡P@¿eŸC}’þKŸ~Ò¿öø§ }åç|ûx̃Ô\ÝìëýüU‹mÆWÈ;MÑä•0¿I}п¿™ÚLêiîm|GëOÒ`ð FAÖy?Ý*N‘:·iâf&ä¡l|ÇM½M.…þb¼©|/•±‡XH„Ý$U~&õÑ>¢Xä=¢¿¶Æs_š‡qÿÂBÆç¨#OõìžCùh?MŽœw6¥µ¶ŸBw=Pƒé ô€~Ša”‘åÑNŽl#0dS1ÈØ2BÎOá!¨ñL¡;Ð Èv7OW¥ êíû>ðãf326e|ÈØPñxR1+ç±c#c,°f¶óÙ´ˆRðQrkýa«Ö‹œGé³\ ²n[2fBú¾¸g_Ê~ʘjGzŠj[­A[íh²Œ}I…Gõ!™·Ð³±QåƒW®G¹&B4ä\Ÿj€ŠÔUŽœ÷ EÝF.èÆêoÓ(m M/ þ§#?t(Æg‹Zƒ_jwÓ‡|%qs ¥`.åÚ½·Ý,a>Êæ£¾Œe_íÝ«èQž eºÞ`|ª7ð›åÛÓŽ`-¤íu?Wþ¯€Óh6òŸéG C;Jw¢¯dþK! ¹Xô·¸ÙfËÖlžL6ÄÍ) JóàûÕCCµÊÖº©uç‚|2êNÓДøR»ML¦‡L t™8ŠyD[ü­õƒV·ÅQǘûa,)Š× P¹¬!ªÖT¦ñžZW™Æqµ&3Ö¥Ly6ÈýY¤öæ.¡xm‹Ë¨¯8Ý.>;Äi»ør¶ŽqÙŽFH<[¬¡uŠ2ÝåY#û¯öÇ)j=©}:Ⱦ#m+ÿ5óÇŒ?©}øM ­k` à‚þ÷Á}û0æ[ž™ëŒé¦ëébŒ1ýÜkZú•ÑÄûmgª‹2‚{Ylè,•㤢^m程Æ÷3—¦d ¡9¡+§T±õT!®¾Cþ ÃP÷ƒ?SÙ6äÁû‰¼'pµ^^C¹ƒ”*טôA7ÒŸûo‡É.ÏDóCÃNr 2†ñî<£ÀsÐõí°!(ë ,ž¿MS”®˜Nðgùnþ¬±@ÞÅ;T&Áüí¦x1 ç÷ 8Gà ƒ±:B%âUä ß,Åݯ–"µHš)þ» èªQîêxz‰[Qæ]Ð'èrñ2Í-¸üEÞ(^[z5OyìqZÀ¿¥¦!8“G¨ú%j«¹ù—`Ù ”¯!\Èçp·»€¿Ê×ö~J/àŸ¬CÖ«ÊÁFÓ(’Èxph뾎€müØ^A7°Æ~v?°€ûƒØE…Š6°Æ³eÀm0=Ü‚| è³ÀîO÷V¢îç@›Lê/Éñ\Ä3(d[€ÍÀ+!]{ȶ.$o=ÎØ¿g ÀN¡§Îש6o¡!hoˆv¹±_B|Š30ÕQ´y)E‹~÷A¹¼‡}n%^ÌŸ‹¦t5†x~J*äÚ•çó/UßOæ·¸ZùðöcCÁŽï‚NaÇpn/Á^ €Oß54ž¡y‚ü.%ï0ˆdüWGyG¾ã¼^ŒçMTÖ¡8h‹‡;i¤„– { #o9H#%L/@÷ÂyíÑ‹`î(÷IŸƒý~È›ÆQ? ž_ce¬9 ?Œ}¶ª¼ç% Ö.ÀŸÄY ´écÏÚë9®â¾€>4?¡yé8?ðÏ£½ LÃ}öUJš¢mñÜ/΋ù xoãå^òQ›skâÜÚÀZù±:ÿÖÎËÀKÀ‹ÿ·Ûb„Xl€º£ŽÀ7ø`Ü=§È¿ª9ûG¢3Ñ ]q.`å9üÈÏÜÈ?ÙfÐÕ ØjδBnà [´XÜ߉V¨£µ:Pöì7Àõ:Î>Môý[AÔÊŸY @‡›Ù™'À@>Ê„ê¹übÐ߃¨ë ògßVEÀ=z¦ú0´ñ¦¼\à;ô¥?öýñSið;#+Dð ñs舟DÏûæÍÿÅhè[âTCÐS;~ìç<Šø kÜ¥òN)ïÑò.+ïÏòþØFåw[¡¢]ƒõ„h¤<åÝYÞ_õAêïå7»Ý÷ 7tn´ß[Ù)ÚØ€¸ ]›oñ­ó*ΦHì©§Ñ¿G$ÔÙ&Ï5þVúcÆiz|oÐÓ¡3-´·þ`½È™öKó?÷ŒüÎÔŒ Ê:àÇä! b´Ddzøçâbg÷¿|–ÿÈÝþœþ?åCç|»—þàpþbõý\¾ã½ãgóî%!¾#~ ï{¡ûL,¾Cè°î~.ä·…¶çÜÝ?äCÇuܶÞBßu8SÛû@άdà!ìé@o ¸²›-g(ò‹2ÀïöBö9èL©ÝÊÖasûÆ8 þ7àmÚ!e[ÄÌ‹ÅsǸ•÷su?Ę©}pƒôŸÒ€@Ð, ͵üöDÛógˆäw®6Í8­½ t¸^”¦ÅÀ.ð‘à#q!S=}EY´”Ì8l”&wTýeÃÀ¥Ÿï§b£E¼ßäõfxšAÝõ'%gì“ l¯ŒïóÇ©Ù!8îï§4ïùssƒ™!Ù¦þ©Çs:‰÷èK€‹÷ÄqLŠ*Õ”4 ãdŽ&nÆNÎÈNÛÄŸÉpòˆwšûfl= þýËâ ÍTÅú­]2PáKâ)Š"»Ø+ö5{š"ºdPN ŽF-H'€“€FUâQªÖ»|#µiÀ8) ¢~nGùH¤i@°ШX<ù™Šb>% ìZ±‘º®w)úh,èC÷}¼¤[ƒüï@¥þ¾ ü^ðÝA7é=ÇnR?ï´‹»ƒüR„½,W¤ÛD¿Ý–Ózä6"·C·!eb…X¨ZjÍ] ®›üñN5G75õè™± Cz†þ&ŒÜM¹›HƒjYÈfYÀ&U,ƒÍ2Ø,ƒÍ2ŒJº¨A{5ò2Ô8q¯Á¸K¹i pDÉ‹t°MrâzŒc2¼ºMÌ÷'Ùdsš2=ÙO‹Ùj˜ÝÔ³wÆús\X'ˆ A)mg)í¬¦°ÎR:«)¶w€ÂjAN„¨¤_[g%%—ù€&*ý‰iöýâJZd!O„½Ž×‰:­N×ÒóYÔ‘AãqÓ¶S”H¥,$Û˲ØÐò°ê°åaÂæKó„Ó«DX/„]¤‰l1N” ½Ùhñ›‡ñŒ2 ´!|[¸/¼%üH¸î3µ˜Ž˜N˜Nšt‡)Ýä17•›ªMËMLÛLaL̼<¼:|y¸°…;ÂÓÃ=áãÃu»™mËY)fÈe‹ÔT c\¹C\”a6Ê0×È¿‘@JàlÀäO€êà"a »HH#!„”JÍx ¨jMmšPiRjùºF`lO =)sÀpVpVpVXágà¡ ©%; j†téA}9`Rú“Ê&¤óȲüŒ§¢_K2ó%³mÉlC2ódeçdxDEE•9Ë\eIeÛµ*g•«*©j»6Î9Î5.iÜv-Û™íÊNÊÞ®¥9Ó\iIiÛ5»Óî²'Ù·këÇî{`ìá±ZÙØª±ucÅPL]“ßž¡h‚KÒ=þž±C#sFðÝèNÒ­Àq@i TßÔÎwAº Ò]4(t”Ø%·¤ö NÊ·*ÌI=?O/ÐñÇýÃ˃-· Ø Ôý8ô+ë@n·’ûžPòqAûmJnG*#°ÁMSÛÜ4,¿i” ”Õ€N‡ÅT: f¤v Ø hbÞ©b*ß…÷qþ¸HñXv³S÷îDÕÅb˱ñΈ+_™nVém*ÍVi¢'bŒõ›1ÖgÇXocí‡ O¢(6ª4Þžc}2Ç:.ÇšœcEm=(ž¬¼›JM2eSé•*MñDÇ[¿·~oýG¼õxëâxëåñ²\/¬]+Vi¸LÙ&•ŽQi_O¸Ýú¢Ý:Õnj·æXÙ†Ö)W¥}T'SöÕ“‘ù‘ö4ûŠòQóg%Û›9) VH«?kÈYÖïüYwÙŸaß2u¤±oü‰Úsº±Sl´&ù¯ƒôl45€žºƒ²˜ ôÖ-Òþa”¿üC”`‘öÒxUn+­äËÝïO™VçO¹­ÞG)ªÕ{ü)Bz—?å6;ý) AÖû]ÒÁùþ¬þöœ.l%ri[I..=l±5/(ìõ§ÈRù²f–çwé'½|†9i¼jÎîwªNö&§ª¢9•ÓqäR4‚E*ç­” ¨Åï¼µ˜žt}hÿ¯¬§eÇé4‹ôo±ð ú7ì_Øhƒýµ}r¸üöÃ)Í̵×þªóiû ‰ÍlŠßÞ’Òlâ@J3g{ìdl9Ûkß2Ǿ˩´ÛÐbª·f¥Úçœf¿×Þo¿%åé-B§@]š2Ò>6«Á^àjfP{²Ð˜§“}¸ó:{&ÄÚÙè¦ûÀÄféJ:êhØkïû:•+“‡îçƒÉÌ–xR̵ææ)æ ææAæT³ÃÜÛÜËm‰²Ø,–ΖN‹ÅdÑ,ÜB–èfã„Ç-ÇmR?ç1i2ÕTÞÆeÊ?üá̱v|]E/š”Ë|QETTœëê.j6}ÃÜE>Ëø«J»½œ¯nfT\‚•¢•qòÇ‹ûˆ±´•ëâ$]¶r]i)+òµTRÑ ‡ï›IèG§ Ó|º37†º/ÍŽÉŽÙ%³ ÿIy0uŸ{bÜퟘ޾ME“J|õ.õeȌѻ´È7Jþìq_Ì«¼ùûxµ$¥%ûØ|±w¢”³óKÛÌ(WÃŒ²$‘fM” Í(5)³±Ê ašàÍoLH=ÏFK#„ÏóÊhN ®D4ºÆK3Þ‡U]‰¼4C<*‹l_Ygb‘ª²ÈΤ*ë%].˜¤¸¤IãP ]C•ºáœÚé ¸SJ.ÕŽ‹•ªv;g“°Am¸6î_ò™•û3ŒYSÅ»3+åOËÞY@¹oÍÒ¹1¾å3ŽÆ™ï•Ú·|Få\I+fùÞuÎÊ÷Ítæ;+*/ ®”ê g~#Uz‹K+=³òýž ¯³"¿´iG]^ÑymÝÖÖV^Ý*«“•åɶv]@]$Õ;d[E²­"ÙÖÏÕVÑÄ\V4¾¤ÑB¹¥yÓ´‰‡wÂz(‹/Íín«©Ljø˜›ãök„c+Ü]êëìÌõY©JÍIÍ‘*¬N©Š?/ªbn‡ïé Êqg.¹)Æ;/¿íOMMM­Ä’%n¤µKb”¬‹6~R‘¯@þ2Ë—åõyÊóK™œŽ%Á'¯Äc;u8‹WeÕe­ÏÚšµ;K_²¤â¨ ‡xYBUB]Âú„­ »LR1½d¯'kk— b ¢‰Õâñæ«6—€âdk—ÔȇÐ@ hνÄW’“@•¸í2ÜÌS©+à“~ôuààk@£HD¤ŠTo̼|Ùb©[n:1"£)}pưfЊÙ:iZ€z¯ ЬœŒPö N9‘¸x3Úôeàà3à;@"CU¾$µ¥5TãfpŸÀÔʤÆ]ËÜÈ09ܵ5n7IÈÇ ÀÔÍÎ{b5KC ‘’ÖÈbK$=gŸ¦~mŽù |1ßãñ$qf2›pÍñ-LºîÔD´¦ 2›œAjâLh&³ÎÌš.¸IàÃ:×i[ë15³dO„á/×·éBïi)>ã¾ÒvêêØžW|söóžQ™i“–•šÕ#“u‰Êì’™¹Ê2À­ßdûêˆ1î™±3ÓÙÕlcæ~.¦õÓú­¶X*»Û|Å?g‰³Wyî9s.=¿èSyé½ô^z/½—ÞKï¥÷Ò{é½ô^zÿ|åÃ)ð_ÔEË<Ã_, ÿÿÛÿÛ¾/þg<%¨T“ãs’F(%õÓW5>Œ¢äÿB‚ä`£‰&L˜R\<Æ]\옛7¸ 3½6=]YÛ ÿÁé_{NÒIã> endobj 33 0 obj <>stream xœíX pUÕ]÷wîCˆ˜H$½§(æ¥oBm ßÃ4>1F‘OP@0àò"b†AHÀi1“¦—”: Ã0jñWÅ¢C‰Z‘±è8VÁŠuTòºöÍ{©dPik§ïfÝ}ÏgŸ³Ï9{¯}o è†û` à§S ‚ÿë=‘·¢Ù•¥Uíå´÷mÄìêÅ®}«ÚÍŠ·‰˪n¯¼ï™çg°í »}Þ=eíý/ÉÛÌò¹¥s>òëz?ÍòÐrV$otþ 诰|eyåâ»ï¼íðû,Ÿ’ûÎ[0»4®ÏþvßÊÒ»«Ì—ÍÙ,§²Ò_Z97nŸË[¿ª‹ÇËõÒ^µpnÕÖ®Ãþ×±œIlDÖâW˜„ˆ`®Cƒ0· ˆ±ƒžÁsx ¿Ã¸›Qƒ-¨‡‡_"!—å{ׄ½¼êˆ‡à¨4Oe†GFüº{#îO»ìÇiYžrßò’2³<=”_Œ²<#tGšëå„^n$Ë3C¢–…¥Ф³_ølú_"éÁ€ge†½ñÕ¿!áxV¨[ñô,O…v÷ÕäìîƒÅÅé8ŒÚ}¥_•ÛQå„z\êåu ¹÷Ê$9ŒëWM ºžÙ/ÏCA8:7ZêÊÃõé@$=ê— ÛK2a×vëRÒSñ’ûº¿œ¤;À³3‹Ã®;!8¾´Â »sfµ!ýºÉ̜ں¢ãKƒQ7ô§ Êà^.{r}RáåΕu’ý™FM ÒÝ£Qn•&ÑšiqÛ~·î¡ {4>yÐ çOIxZ$å‚&£A7:),…vY /ÛEgW]ÂmumkF©ùæÏ¨1ýIz\#Àçè%ا·¢Ä\ˆTÅv5œu{ÑD,7®À(³ ‹t`uÇPÖéÒ>±Žmw©b©Æf"ÏHF±@êyÆ9Ò ã踜r5Küör¬öõóiËBÔë–²ÀéŠtuÄï_C;æX‡c0O }úû¶/ÃHÚà˜Íz*†ð¹—9™ c_;l×ÞE!QBL6r0˜H%tãQ_¿Vyö㨷›iÜ“XJ,²Šg5 «ùW˜fïØ‡vL§kì€9ÃTF¬Í*Á,ã&³_¦ñ X+lj=gc²‡ÕŒåJGí‡ue´ã]µ‚ëHÆ6µ÷¨±½j©[°Ï:‰fÊFÊÇÅÍÆ“XbžÄfójT9n&¨e¨U³°Ôž‡UÎ`Ôp¼š.E:º¡1!ÕIîñM(´Fc‰­°^­çÜ{PKÔO«1ØNB™} m+"âûklg¿µQÔÃ~…ÊD™õ¥-K+3^Áds»vs¢ÇÍí”­8Ö%™çö!ŽÙ}ù>§Ïçê÷Ü‹Mè¬Ûç4Ž d¼Ä¸ß"u®·îæZE¡Ã¹ ëyô¡4÷i/qö«Çñ‚Z—þØ!›QDäèw"¾¦ÝMv*‘GÜ@$ÙDW4©/)A¤ì'sûþÿ¾ö€> 9ÖWhf}³õ•Öh÷Õo° @`M€'àóÓ>·Ôýí¸Ð~ñõ7j£Šµ— Ë|•…!ö<¦žÆto`—¥CWC0ÑZ‡sKìkÛãÞOAК‰þô¯aê'Ø`B£5öé"ÀxÍ$ú}ÌZ¬µÔ«¥ÏoA ¥N ‹Î`ž!ö3ÇdUÁ1§#‰s´ÉÀ½žLÙLüÂ.C…µ  L%rƒ>¢¿qV Ó€¬óÅãz¹p¥ðœ:€B‰u3ƒÜ5#T|íó'Á½)¦üˆXâó(PF?™eãr}%6Ü o«×Ï2'0ŒeäVÂvÑlŒÖ¯&oöW.}r Ö‘/·Öc¼ú[uô«Ó(·v’Ó&ÓN`–y˜öT ËÞ³wa¢ólr ‘'4TX¤Âz™Ú€ê!òØ­X¬nc¾ùãö6ÆjXkVaUÓqDÎÇþ"ö[»1ö u ìixÈåÖ,­Ä9HÎZ‰™+«ÌiñóNð¡´ùíäEAG®"¬l<ïûD­wð¬Õ‚ÍÖV<¤æ“çBøØ‘¼»6õŽçåùÄuØe;äÈÉÃÀ.¿O!Ïìâ ¾ÛTsnæ3Œf¬èØ« ÉïÄØx›ÈPò<”¸?>Žøó–Þ ‡åÝQ?¨åžs.´ÙhA#¹°É¾FK¡SÿUõ™6”6ìáøïØyÚ•¾=%þ|§ìlm³]ï¯åm±_ÎÒ_[²¿ÎvÆ"é›P‹ýNTÓ7fú/°{rŒžxƒï†-„?®?¶¬ñîרr‰•h²>ÿGûà`M|g9H4©Ïî5sM“qsŒ4Ì"×îWõØfs¾rêÅýEÀ÷ÿ‰Â þû 9"Áç–õi•¥ý\й,üáûj||_ÿgÎßjÑ”ø«¿Œ‹Îq)>!> 1äÇ}Á¸L{Í\Ž“V.sÐU±·ŒúæJ=ߺQ;mÒtá›v´½(]áÁóíùwùÅ…œk§k6àÔñ¾Ñ‚|5h¥èï4ê,kH‘êXL*öj±5ž¶ùžSÞ­iGv—¯g/%’ï¥òá¾H~å‡#¢tœÌ´Ê¬G7\…ù¿„gJHÍKà™G½Kñoww-ÙîÕýR† ¸½z¦ØÊÈj;½½¾~»Ö]ë¶sÇŽ õzF}CCÃÙ÷pñ÷ü˾x]¼.^¯‹×¿uÉOÿ'8†­7Á¯(|ô_c÷ÿŸ‰¾þÝ”ý9¥ÉûMûeù4ÿÈêÁýãÇ>÷“·N›š—9uê¸AG’}ýâìl¿´G`ý«†œÂ©Ø9‰ÿÜߣ(ý´!Ïîö~½oF÷gð#ǯ~îÓ&d[ÝÙUN£]ù¬ÐÛÕþ¹uùd endstream endobj 129 0 obj 2673 endobj 48 0 obj <> endobj 47 0 obj <>stream xœÍ\ \M[Ûß»ÓÙç˜éÜ­Â='2Kf2&š$¤”T$Í4Ï!BÆe¾¢kŠ¢ÈP %Q*3 ÆBâÞ ÷rqßgëx¿oí}*q¹¯;}ßû‹}ö´Ö^ëyþë™Ö³MijP4M7µôô‹ð óuw㯠¹ö4×AƒûV„Çà#ïbÞMKYoÿ¡'oN%uüF«ƒôx›Œq«â}­)g¾Š5tN¿¤ßÐ* ±F¶5zhôÕ¢1Rc¬Æ8I35ü4"4k¬ÐX¯±Yc‡Æƒ™'4Nk\Ò(Ó¸­Q¥Q£ñTã†R$5µéˆä¢ž¢Á¢¢±¢I"{Ñ,Q (\4O´X´B´N´M´[”*:,Ê‹.‹ÊEU¢§¢W"¬©¡ÙD³µ¦¶æ·šúš½5hkšjZi:hºkújiFhÎ×\©¯¹[s_w{Û©=zõ2âëí¦×oèСz³¢õêžè™z†úzèu%'ž~Aþža†zvžžza>žz^¾~žzc'ÙL7ÑB¯»ÅD{= ÏÏ7?=›ðY~¾îz־ž=ô¼CôüÔzî¾a¾¡†z&¡znz¡Ažî¾¤g”»gÿÀ@/È3Äß74”œëù†êy‡¸„yzè…êù¸û…{ðŸ'÷½Âô‚BÉsò„Teêâ¦G¾hcj®nc˜[ÿÝP_òX/Ћ¼éèÎ÷¦áY˜›o@¨^˜gTÿYžz¾¡A~nÑ令ª _¡ ᡾Þ¾n âéíâáç*ÔËSåCÿôõÚ-(È/Z((¼Õð}ß°PO?/ɾþ³ÂCõìÜH1k=[Oïp?·n~àÒŸã›YxH ßNÏàp7¿Ðp7¾‘Þ!žnaž!ÂMSO¿0· ·0 _/¯€À0á¾_à\ÏoÂX2BüLf…J½…£µ»[H`€“›{x˜§} w`€çœqanî¤ÓaÖîä#ês§†»îÚ íÜ==|ýüÜÜ„*Çù»¹“:MÔ?¡uÏl…7Ç©?aO˜ámר3¡&ê§c…Wm…[…s³†»×=ûPt¢ðÞáh¦þæXuÑF/Mitî®~Uý­ñ˜ &ù„D„ûû¹…‡Ù7¾0%u»…Yœ¤þ’µšpê‹9êòêò޾êÇž ð*òÊzªú oz7ªÁ¯qmêÆ6ºã«¾ã¦.í¦¾ WÿÌ*Žs> ¾Û¨Žpž ‡ßnÜç¡T¸ú3a»!Â1°ñ[aЇ4:T—£(*ÞÚ$:ÀÝq˜¹Ó&Ž òtšdìecâ=Ù<ÔÇÖ"Ì×Î2|ö”qsì­"ýÜÆGùÏš:zPOçÁ½ô\†tœnÔ»ÓŒ¡†ú®Ãútž9¼o—y#úu?²·˜Qº/0Øc÷Ó󹇒ž]8y8ùù¥¼ô=¿\>udï¯Wó3S¸’3Y©ÊÒ£ûÞ•ßg§ÕœÍ9P{îÄAŠêMu¢œ¨I”)5”2¤ô)gʆ2£†Q}¨ÎÔdÊœNõ¥ºP¶”ÕêJÙQ–Tª5…G  ºSö”5êA9Pã©ATOj*eM ¦zQŽÔj 5„2 ¦Q©±”Õ‘jK5£FPÚTsЦFR:T JƒEéR-)eLµ£ZQšÔhª=ÕšS&Tª ÅP.Ô·”%¡¦SrJFI©”‚ú†jB¹RzK5¥fRk¨ÅT$åG¹Qk©%TåOÍ¢ÖQqT4@¹Së©¥Ô\*ò 6P˨yTåIm¤–Só©`Ê‹úŽZAÅP!”7µ‰ZI- B)*žZE-¤Â(_ Q±T85›ZM-¢"¨9Tu”J¦vQ¨Têµ:A¦¶P¨ÛÔª˜:N öRIÔ]ª„:CeS©ÝT UA]£ ©*ƒÚNUR¥Tµ•:Dí¡îQeÔY*—J§öSw¨rjuš:B%P‰Ô-ê2u’:Fm¦Rש T•Ií¤ª©ÔE*ŸÊ¢¶Q)Ô}ê&u•:E£ ¨óTõ˜FÔ÷ôj¢Â×Òëèõôz#ý½‰Ž§7Ó[èú{z+½ÞNï wÒ‰ô.z7QõÉôz/B§Òûèýt}€>H¢ ƒ>BgÒYôQú}œÎ¦sèt.}’ΣOѧé|º€>CÒEt1}–>GŸ§/ÐéKôeú }•.¡Ké2ºœ¾F_§oÐ7é[ômº‚®¤ïÐwé{t]Mß§ÐéÄâ ì– m£îÒÝh7z³Fgbe¬Õx(j-N,ƒk:i.Ô¼#Öû‰SÄÏ3™¹#+ñ–\“jI£¥OšÈ›˜4)nòkÓ¾M½šÆ5ÝÚôTÓŸ›6›Ólg³£ÍÍ›û6ßÙüF‹þ-âZœj¹¶åÓVº­†´JmuµUY«ZkµîÛÚ¥utkhÓ¢Íð6Nm.¶¹£e¬5YËOk™¬‹lœ,Rvå›oR¿¹ðÍS6–ÝÄf´•µÜvuÛÃÚݵ]µÓuZêëDèìÖm¯k¨;[w¹î“v~íV¶Ëoߦ}~‡–Ì:øu8Ñ¡ìÛß>’o”ï‘?WЊΊ%ŠT=VÏX/Jo­^aÇ%éÔ²S—N#;×7ÓŸª¦¿_¿¨ó Îó:Ÿí\Ý¥C—¬.g»üÐU»«E׈®]/uóë–Þݦ{@÷3=Œ{<ïٮ稞‹{níÉõŠ105øÎ Çà}ïÔÞØÐÞ°¦Ï€>3úìïó¨¯Yß]ý´úùôKèÿMÿ±ý÷ Ð2 p l ÏÀ7ƒü¥ î0xùà—C&9gÔÄ(dè7C}†®š=ÌuØÅáÔðo‡û ß4bĈƒ#><1ÊǸ‰±…ñyãÊÑ}F»š 19hòvÌš1ÆN»ÁTÏÔËt£é¿ÌôÌLÌÎ›ÓæÌíÌ[X¤Xܵt°œoyÜò§qÑVÍ­®Ž_;>güÿX˜Ðq‚Ë„ò‰á³&µ›´Þ¦¹…M¬Í£É¾“Ó&WÙ¶µÝh[e×În±]õ”S–MyoïdŸæ0Ö!Ý¡bj©s§¾vtw\ãønÚ´i ¦=s’;]pç•Îûߺlž>czÙŒæ3ÖÌ(vÕuÝ;³íÌ ™%n½ÜbÜÎÍúvVȬ;îÝW»?‚´–\ªRJiT+¥?køÞŸ›V…ULKe”Ε\ßDš €@ö¿að&¥¿7gpÂ{ñÏLŠá»JÏg 9<·äVà€*å7¤Œ·‹Å]T¸g îÏ€™*iŽÑ¯¨¤»Ŭ‰^'-Ù¾xûòÝ(íÛ´{ÛÞ[wo;1Ê–:|³9Û>‰Z¨bÔ}X[­-;XN*TíºÇ$²+ÿ**xõ˜»µÿO5§'ydUÔU.ë;MóŸ>FZ#!Í«à *hôHÄÍWìòÓ±#÷yçY¸c¬IÜ‘Oô ´¹s ¾‰W ab†Ìt3EÒ>SnAkÐ>SùCyö¬1ñ J3Ò£ö\SVˆ±ˆÁ68O‚L13° Þ¬j*rîÅàŒ‹Å !$¼©.‰j¸5"Χ-¸q VAÒ³ìó¾öS¶cö½  ¸«@Ì® ÖUÁü*-T wj'ÖjËÞÞi UL:½3óXú‘Ä|TŒjÜ Ó¥2îjÚá37Û¡‚È\ÏCž‡§m3#ýËcjq óÁR’öÅí‰Úù½?rG1~Á‘!QqSÉK–ø! ë R’ƒöÇî•ÊÞîÛ2Ç»òY8'<,<Ô?v’B¢\Ë47‰§~û1Ã૪æâÑܨ¸R—¹„éõÔ†‚G"ØÃ¥³¸[ÿNØ›Öt‚ÐíÉ[ ã¾Á½«G±O‹FᶸÕä‘} m+@ZÅ•µ ¾’J®g%ŒJäëɯqKp2ãS`—Êw«CLãáØì¦¡ãõS)Wræ7%x.çÆ>)ŽÛà“‡è3ñ´„–îýðsp¨VÄiC& )Ü${„c³yNJ8¤"÷2k%-•^ ì’׈”íÈç¨jU®VÜ•gQ õPÕˆßÎz…Uq/ªøa£ìÉ!6ö©ÄQ4ÂÏ~Ò¸±Þú7E¸yFç2Ó¢É׃ž!0G/Ÿï{i/fÉ´E¾óü'MðIzÕ¥HÁ &Õ€:ž+ŒܯH Ùê·Ùž¿$ÂXž,êqpú‘¶ìÅÀÞ‡½L¶}^h)’BûÇ@Ãp0X¡½2E¶s<&HïHd/F10ךýñü0Bœf‡õ0ù.´‚VgïÖô®ËRXAsñ°€Ew—žœŸéûpx~Òª®½ÉGÿкAóêR`v‘!fîâm‰ÐŒäÀìÈýqûWåK×”²_œ»tI«.Y Z‰V®ZIêTÅ]¬¢¹JBCÕ!£²R]åò«TVÎ’;O€¾³ž†ÜVÂ]e4‹=q'lˆ£p_𪹓rêœâNI.ˆ4“ÂB¬€Þx¶|¨&ôÿ7ÇÖØ´ù1Ä}ô‰ø±Ë7äÇPÁsRø>©ºC­èq[8Ä€5ˆA‘5AŽ'(ð!¦ö}{–»£%ÐùvO<[÷ÀÉÞEBså\3‰G¡Í~sBy?,&"dÔÃN ¿qjoq¦§IpWåpö1¢nÞŪ~T´„4"еÛß Ë«E°™Œ¦UÌáÄG6®E«vÊË$QëbWÏEÒQÓ]G+ú›Y”«\ª9—Gµ>V›øîÀã"Ò“‹,D3Å(g{æá쬹¨D ß«ÀåøÌ{ÿZ†k¯ ›ÀAò¸Àyøpçþ µPY[1da<<`¹ŽUªŽÃõ­R­!B?±J5†i I3£—©å®¶ìBYÐÝ#A·væeíÛ»sφ³«¥$²¾kbâVǶ·G³æ8”ÊlžI•C›zYW!âú’òÆ·‹Žû, Õtûa)5(Éìø4E¦kQp!ºŠN¤æ^•Iéâ™á~3£‘'òÛµuÉ÷ËÒ¤ƒ™MÝ+l ªD%{Ë:¹õ*‚VRÎJ‚£&°O Œ±6nco< ïA–U>V|-eð*¶wEÙíCOHt :!ö"aíúùm‡ÏÉßc7ØÎN·»9afäì%®H÷éü\} Ï‚8‹Þ!cì' @O„+Ñ^UáW„®zUªž º(á,&êÈŠkÉ®zmq· i9ºçÐcÐÚ_Qu6&)yê:9Í3Ã3aw„|ÁÖ¥[—eH0ëp‹ÒÉð-ì:÷¯¼ªt=®¿G1|§Å¶€Ý(C÷äñ´Ò’ô€)käõjS¡ÕDkŠÊÉø{ï_Mt&¯1SRÏO”'ÏA^Rµæ¬±.ìb2#l¼“ö«% äòê‡'&ÁÚD Š$Ž©Îpï§Xe…f|çšà¯ â$Æ'9nïÊ« yTúˆCUYO£j)h(ÃúrüX¡ž&Q/áDí_’¹'"a6r•rõè.Ø+ª EøÌ‚*‘rDz¸x(„D2¸m¯ÞX×Ä2%w¦Ü9?àz"‹_ )‚è®mïDù3&ºcÍx8êÆ†Ùº 1sÆb„µ¥8 ¾Å}aÚÏw2î\“'õŸ#ˆN »Áõ,¥¯‘Q·‘€qt6ÂM-®©ô‡tÿ+‰‰kÖ§ÊË%±+¬š‡¤Þ‹â3€JZB¡å«·Zè¾±>Ê ')l¤ÚUÍÈ(ý5‡tºÏ›Hf¯*éݵM$X-·…]ú=ªñÂÚ݇bþ¹vÏC0ÎùÇÐc^ÈVyD¸û…DNµA#ýNŸcA^Cx¼Ú2ÁuŸû)‹ûÞ BеÄÜô¼Ì´+èzbwµ{ Ÿ§3 yN**’Þ¼’÷H¯8¬–«9Fx’ŒØZç\SÞZàNâµJC\ªj¥DÃî)<`x±ƒs"oWúêÑ·´e¯¸ˆ¶Ü.#|J¢gg6pœ[Ö%9'1Ru— ¼b÷‹\v¡å¥ä•IÇðÁ7”ñoé,^.¼L;×qB«çÊM%ñ+ׯJ@Ò§yG®)”-$à¦iÔ©š†ˆRREC ÿR¶gaI•ªl(Ľo_ËrQйOEà@ÀÚ›4“2‚¢áH[˜Îí÷fpwÕH¬Ç$§`­Ú%^ ¾vä æ3™{wÁ gˆ_3D½?'juœXÁ!8D,¨l¥œ·t ‘D\¯™6Iz˜NÂMì]öøÈ½Sçf B)·ÉÜÇÝí&` O¡«œÛ$˜”•ÊN¤ü3&=yÈ—— ÉKgÏ ‰ôë…¤f¹¹ã%¸iåhh²;w@KÎe«ß!ît[0:¤¯2èL ã.L7•9éÀé×Sæ×çWU±€?¡ƒ÷E`@>6ä½ÿý:öõÄkÑKòØÅ+—£eH0oë^\ÔZœÂ¬±u¸‡<4h‘ÿÊ©ÒûÌÆËGöU"é­cÓáä1ÜÜt~ôò9 &†ø¹ ©ÁÕI¿^-H:sN¾Áaoè´%¬IÙH̰`Qà’¹!a¾~³æ9!©•gZAaFêãEÍ–ëR¤Ìãmaqº3x†ê=žÍ½wc`+q^áEähøŽ…fä/ž7˜5\À™Â)8%8ÿ£‹91j­är ™SØÀ£@ Ûb-°00Çã 8QüŒ]˜Úxºø…Úänä8ñÿ´e‡ë}‡*‰¬ävá…Ò‹‡=-åø=ƒ¿¼î1Ž¿ä¾•<µÏïaæaã$÷+rK¶@RY_34=x†µô¦ä#µò‰ÎòõV‰$kbAÀ "ŸåOˆ™1F z‹åcƒl<°O]ñ.¶Vm…MøØ {gª&r~[˜@¨§ÏàvªÇx÷˜P&§ß’S}&BþÂÀî9ŒP=·|‡p§ hYnu\†NZètyÂm$âeon%>.¤Ømÿ¢¿ÚáVXwÑ/Q[p|÷© Ù}ÇMG‚/µ¿‰.ì;}¾ðrÚ=T)Wl#q n†µœ†÷è? ·¤jÌÀæ°áæÝ­)×å%CÃlÛ“j}ðbÚ?ÌÀ›œ ÂzÄ>ob„ŃƒÂ“7­Ûñ]’â 㘙l:ê¶Â~å´ !!^RÙY^¡^í§¸æ_ÍŠ_î«íxT }ßñ‰ˆ RNcUŒƒª­øs4ïÐöB$}vÞªS› ½F¹dÞP `¶LŽÜœeÝï.¡½þË7Ðô ŸãÓÜøÏR¤‚“N’A£Ëm&ÁÒ@¯õX³ã‘( üÍûŸò¾T{ÑðtºÙc öGëè¹4ÉÐKÃ>וG® Âe-)‚'þÛ&^ï¬<òšQ7ôB%ØVò²àiê2‚®¹ 5.ÉÌ<ݬ]Í#"Ì"Ül‡ñ1ë#¶ý*yKýÅKP€N¿Z,3›4ÕS±LŠž¿BÑqï-¤ƒØ6ý'Y :¡ô‡šóÂÜ[”“Êip/qiÈbwp7ÃîØÝ È¡È%/HÉ¿ÈDå´D:—´x ‹Þ/2j›àgBÔí󄯫EI؇…‰ïLðı¯ßé\GÁ7!”¸5O¬žÀ*r Ž q°›°7²“Óy{V4°’Œö6FbѸdïë3ä²×Ã<ÜmF¶Ãmêz ÷Ó`︟š)—½ÀRØÌÞ:éj>ÎÉÕÄÄ)»¤4/û¦BöŸÒ¬9og4d’]¿A“Š««Ï‘!!ް‹ ®°xñXXL ¨¶¤V”Oˆ„E’ÜŽt)Ú‰A$)iûé–œ/Lãßì­j-.c @K\@Nq®µXÝAÛJ¸Hõ8ò\TƒÙíXzÛ(bÇ^;rôRNYâ#,qk¢o»]ò(žÆ;ƒí{và ¬óľ)ÉK.<¡X…MìzuEÐÌ̘R)|ÃÍf«.Zô8q Áçž=9åžBÍ6ôFv„uúoxG&‚])Œ)¥¹håvミ “ŽbcÆ›¿haã‡Çˆ1cñŠñÄÞâÛ ÞbhÝø¢Ii'& ƈ-5dú[°Âûm˜äo훞¢¹[X‹XÓ¸‚2eê¦ÌV7…Û¥)´¨›Í'54a‘r_Mâ=žƒvU"X®ÜÌÚKð7óÌÍfu²S®ïÞ¨”ØáR¼G2cƒgbXÚü¤åÛ—^‘Ž`â°â¶t\,í|îµä̺ŒÍϦ*ãétjòÁà­ Ö÷I•ÂIÉŠ\ÇÕc¤w̘›¸Å&鉊fGìòÊDÐÕcÇoÆKÏáÇì/þüÑ8ä1ß'(84,dñÌedH„pÁoÍÕŸ fß8KVoM=´^zD2iÙl4BÚUÒÐïÕ¤ßsˆ,à{Ü —}a *¼²’GFƤC“¼œ¦O3î’»XгŠ841 ÿÑå²Üë”M*q¡Fj>ËíE”àôé½{ºüàûìÑ#-"£Êazù®r˜Q®…ÊÀµ ºóGmY~,8+MXÃQ£z÷®õ´¶¢âÇ£o÷R˜iç̰2}Æ»é' ‹Nä*8ç¬JATÍU†Su” ÒæË*dÞ±|Ù++~|NÊÊÕeí…²9E…|Ù–ðû\Qæ_¡++D°ðy:cîîl¤ÀÃ%È0j¶ÍB©¹äܾ¨”Ü2Êr.“Ÿ¸2ŸqŠÙšOLd ªγÛ{!y×Qô£”\ç¿5O¾•€ùÞâD:œX.»‹ïHTr0âä0ˆ?åïކ~5"ØÂ­aUkj”Ó&Kü09w˜+µæ]h¢¶ïªÜ'N‡ÉmY·±«½:Gú`]¢óæÜ¡ãèºôG‹+Ææ\vz^)'Ò¬õXÏi}ÛáæU# U^nBRº|WÂŽ­G2.ŽÔšÁ-¡WFñ®«è¼®¬}ÁN,_¼–æ:”*ÃÛiFHÀH'R èâ\ÖÎffØT$ks¶¼(-뇳„^ üˆ@çE/ ­þmrþ Ç=•ÿRNAÿ+«Š2㢘.šê_¾Ÿ¸c4§MtÎÚG¬ª ³éìŒG§_žÑùùÌéÄk8ZèvÄíÈÔ–¨²œã1)Ä3ÖuåXi ³öä†}[’’ŽŸØ[€¤wÏÛÛÍv¶öVô™Š»™i¹÷ÕåüÈ0 VŠ´_&MÒ?)Y=9&ÈgAïùõO »ÒW’\¾[!ÚG${.Sžu²Z„É?É\:Ñnªpprl¤’ãAü)Gm{ݬЂÿybþ„W?ÁPÉnf2V‹_œrÜŠCŸ^.'_/%VÁ:Ûx¯ísÒ-Ê}^¥Ûõé#h÷ÄçÔà} Ùƒ«{žºÖZ»Ûc}ã‘¸× y ³úøºäÍ»3³“‰Q™;}ô´hyŠÐE~Ë'¬""à¡À§{"ˆ%T醵­±Âýî [½$¶úN0Á@ò`d t’ò¬ÜUz¸„朹>ìj‡ùá^(Í[¹7)Ó™µ!Y!OÇe½¥Ìš¤5ñëâãwoOØâQÒ’ø¥?Yëì·Ñ$½|ôT…b/7ˆú-ª¤aÈ“ÇDnTƒ3›+AÙ›·—^ºUº']•B£[¸-îÛR`ÌËp“ï¤ÝúIpûRá!„ŽÕúÐ~¡´Ç±n¸U±šK‡0 GxÎ'u[Ã%8_G|¸´Eε‡Û¤-ßͬšP+«`q•?¥ÀéBæþ wY¸W…ïÁbx\¥21fdkϻ٤m?™89YXúè#ÜáÖ©}ÎYäOº9纇Š÷¸"•y™pæUø©D¶Öð%ë>l’Ç¢5R|N{Ÿ™½B¿l½’~æðé‚”tóÈ&p{Mz–´Ò•Õïü†Á¯…_BXÿ%ò€óã/Ñm…R}ùÖì†Vy5Ø<݃õ_XëÒºxñ®ëBa?%n¯€àBH­ÔJ­Mx -[ÀipÍY Téy4È‘xDÅX,ç¸hNÌ„`¿éÈB*[ÑûêÄ_*/¨¼%߸p]Üú%R™åÔÃWý*ÚCSt¿t0RYŽÊi%‹¢¢‚üÃf‡x.pGÒ žò ÓSž$('l_—ºEz7»~åÁ9+žxöѪh0¹%‚¡mÝúl‰Û²aãš-Hwßö˜°à°(¿à¹’¦+¯‹p¿”—‰toç¦Hž¶$­\ H*"™~ƇîüqñÜÎÁ¸s{ùÃþ -òú+ýØ¡–CJ,ªï•–Þ{0®dˆb’æé,wG§Y³œ¦Í:z*ïèÑ<…¬ô<*ç­ÃUjëp•x´ÊõwŠNsª/ ªó_õ/ˆkÆ%n™êÒXîRVêsºâ4 5"n î^ Lf°¾…'À-r nĸ—#Œ…G“#[caÔi<ªF©ÃŒ|0‰¦™Ð QíâÔ‡JDú‚2Ší…{ŠÏ3ÐzŠ/´mtÑ’ì_Ɉ?yÂëÄæp‘ ‹æ™Y¶qE–Rܤz4hCç[wÁP>˜AÓ—. òrp (žz¢ôÄîÌ‚\Ź„v$íJݘ„Ò¥…’~ÏØ'oúñÝ㌪h°']‹çV±ØÜÏÞ~(Ø«žÖpOÁûTrIåàx—漉ŽÀbfKùÖªÙ¹Hw+Ú²|OÌþ;:þ a‚‘;š=Çß? Ò#Ö.\_·113RÕoþ(oG¤‰bÖÏÝ,w}ªã–:?í“æI?-—=>wÄ}‚b®d±OÁ'Y‡Ì‰( eíLÉ?ƒ0­#+ÌóMöšÕ¹{¹„ÔsC;„™sn/÷;'u²ÕŒœ©‰æÄ„éÎO¢ÜjsÐI1Îä@à…²¬YE%Hº×¼ÓÛ1Eþ§ÍÙ-~<‘«kÙŽ4tóÙv @–ÉÆŒË@¹Rav=;+jö^ÞªQzÂ{q5ìsîñ̈^Þ‹­™çðõ\±FCwõèÎÇ ÚÐZ‹À›3fqkÜZ :{@xVлï€ï ¶¬ý™iñÐ!]t`Qú¼=……:¶gm‚wøÄ{!]o4gqÀÜ)…:vg¦D.ôDÞºÈ{‹Gb³“N‘íéÓ{ç^|éf¢Cñ)‰:¸7\dÏçºØØ9¹ØÚ8çŸ=™{–˜6Ì[£G"e‘🙖þ á… íaÈÔc–¥{¹ez¢¢{ êJD‡åÃ.Ыæò¡²cЬqe^4CÕ‚¼V Y ,n3y”¥ð ¡cE­ãËéwóy‘õ.†ˆ¬/ûnSOe©2Z+—™;Ïïõ_bz òä²÷eÜ/W]q;ùXÈZkõè„Û›ì7ÏŸ©8pxaá ©Êò²²ºê}59“‘f‡žŠN~ˆLe}ˆCAd÷°’ŸÍYòÈŽ¨¼ „[¿°gÑšU{—/8äD4T› ƒäÌ’‘Ìöñ«¶—èÛG?B·Ú™E=*d¯n¦>A\"á7qÓ‰¶‘>³äÞsæÍBÖRÕájî°¤ìdö²¼ã­l§—/fx}_:Uéœ'7½VÄùÀlÏæ"ªTº°ÞVá·ÃIªÞkHp>Ñί™0[ »«X¼˜9¼¿ŒieIÀU-Y,|¯tc—„Ä.ŒF QÐÆÐÍRÙèínqk"Ú»"?¯Øqҳ̆¤-ßoE›Ñ÷Ë“Ke±g¶,ßÙ>í?_F Ë×0–›ÍšÛÙ™›Ù•••\›Rd&Ø3BàæJ­:~)tëÚ~>¤Ã1¼q•ëRg^A÷bÞº¼Á«ŸýްŸI€®ìò•+V­@ÒùK¾Ûª É¥YiÆÎð2])?Çl<¾-!I'Ï T, ðØ%ž+ÜVÌZ27Îk^dr“Ê l²¼.gü~ßA¹ÌÚoö…ÛoAW'¬'ú&ëãæçä±}ÿÄ­ùåyß%¬ù~ƒàŠ6+§¡P9™Å)f"Èë7ôêZÑ•7¼K²fòü oÞ÷¸Ðà{p?A$ ¸…¸ZÒ±ú×jòƒ 0±¬ÝúîvCJØ]>%ŒëÉÂmCUÉp;ñ(ÉÝb1>ÈùU©Z’€1±Âoóz€{Zv"‘Þª bW{lˆú>2Å+'²Õ¢üKm˜ån³Cí‘-òß½,›ïªs£rßüQ/ê‡Ï÷¤¥2<üâËðìbÍE•‚VgV*âŽrãØÐ_òø!ßt„ÖÃøDRîAÅÎÔøÔ-祦̂a^3íÐä½#"5lß‚ltZú6¯ävAjиír}8ËbolLþ¼±1+Æ€ø‘ž„Ùà…ÜWLÐ$¶iGÜ%RExæx$î]a ˜BGè &0ª^ó3µÄâ­õ/%bÈÚ‚ŽòÆÇ^’R™ø²šÀÃ-ˆ¾ät‰ëtQ[öÚsAìa´ m]yxiR qê}ýí&¦\\!ŸÀô+œúüé…‚{§Ã:o“ËÞelOÜ—Ùî¦Ã‰A†NνWÊ/1(uMÂÆ„-»S"iî¾`7—ИA n+X}d^oRýÊv»ø²¤ÀöL—à™x§ØF6,f`a”øãx–ªËy®‹d’*£î¬~⹆t¿Úˆt¿T˜}¾öû³ÏgfŸexðoýF^{Þ‚‰‰õ©gœ’Íwݼè°|ÌÚ(b¹/ô 3wõ1B¸ ññy‘½þ–?F”:VÊ=‹½ŽŒ-|rTÇ=£ç Ëã 6ú%躺MX²7Rw°{º‡zuü(a­´>$¬ñS±7H‡ $ºWÍwçÿF–Pª çò ¥îqV¼ò’º89ù%WÝN‘3òÇŸÂÝ %n˜•ÿ™ˆ{uVh-3âqc{íOå‡ÎKÙ|÷àl9Í™—‹²¸f¬gŽËᘤ!‹µd)•T¦‡ÝÁï#“¦!¹ô1¯‚L“%˜}6Á´sC‚©¬5ÌûOô–ôwõVëõVz²ˆË­…²]ådƒ1iÄÙÿ à ·äëÜÿ¿˜U/ƒWc@Ôo_càà5æßŸBÞ!‚¼*!*Ž\‚v—ž :£[9̼íJE°‡øxÐŽÉÙé¬XåŽ7nŠÐ½³‡‰NX¾eÕÙU×â¶{%ÝŸ„NHL?j dzT“ËX­ 퀕ìŽt™1U1‡·þÕÁå7JG¬†ÓD|hõo3@Ç MÜÁrr€£·¾3’@4Þð;ÉŸÄï€q‰Z‚äÔ–Uü¹´]™^ ¤}4¤Wðq èÌõ’T†ÞÁö0Z¡êÊÐF*¤YÏlH³ÖiH³¾Ï|.G»Sú +Ó)‘I‹/ñ3ÕùM $$rC’+™u9h÷Òºȱ€=Ó–,E+cþ:<7x~ì ©ñùª1>{¼ýKÿO¡Ô.ÎixÍÉŠar1ø£Š”cØ!FF¥æUJKT[”)l5ó¹Mups³Ÿ6óxþéãÇó r”Wº‚Åñe©þì>§ƒÿ$í!HúXN×{z|í²wš²¬56æ¬>Òi.wÁû3ì«Í-ž jÃï<²·Ãß)>1ôS-øH¾?²Ö?AÖ_RK÷bË!«>Ù„øÙdœõaJRÍ}«¿Î}8ð9èÿó |¤Ô h°Óaz-oØýQ03ì"Lø„³^Ä ˆ/¥Ut™:5~dñpXÖ Ù(=ÝZãÛæ–¤h[0.!Úb)˜0 »'ž€'÷Äú lÒ)Uõ#ü€¥ƒ?ù¸ð2ÎBI +.‰à6…½ïºÿB}@VžÚB­ÉþcØ’¯‚Н3! æ’>ø´üÌþqh|­C[à Z ^û“@4€ ¿U„jhÝø0ÿnxuÀø~ŸÈ‚,ɯyÉ+.xð’_!2™_!Íî?„– 3ø.V(ˆ Ú\Ð8¬^òè´óðáŽÎ?].ñw®Äñ‡ƒëWÁ8ìÁý$,f‰¿%âZãнüi7ØÕ/òÿhiÔxõÒ¨Ng/zÆüfÅU'âá#Ü©7ÿÁê¸ÿþØÛ±~æ:›c0FmHš!Lš]ÚwäÓI3~F!(ÌøHEÝ îh»ˆ8dËy‡ìûgY­°ª‹V¼Ÿ_ ¡’=Ñû–¤£RT”šY¸Æ6%¸í ×Þ¼NEo^”¿xCƒí>ƒ3¹.±ÛöTçÈùÕçÈ “TÄ饮Yý‚óO'JϱÎâJ¨æÓ™þ œF=¬àÂ?bö?†ª}UŸ8„_³º ¾Uþô‘³ùæç‹"ÈU°8ï"7r¦dîø˜Ø±qóWéLoWñˆ†¥¿¬*þ¬ÒÃF3­o÷5æí¼O¦[þ[™;ˆðö#’ÿċ>ïM}‹ÇÔN!hJÿ|‘[öE^sw€ý(Ô¹ó?†:ÿ*:D¿™eSÃcq-ÃcÀç'‘ê@bõ_<ˆ‹øïÔX¹&X/êD®+'bdz¯!þ/;_.FùóçºG †£™ ¬èÒQVø ÊÀè½âo1¯ïÁ´rš;ÊçN®6ãV7¬ñ"húsè´ü,êê0zOpc« nlPeoÍ”Ž¿1ˆx”Ö›ý7ã/¡E çòÿð'Á?ü;mHÜœßĈPçæñC¨ø?»2£Ñïº~ZÏÿ÷’Eü ¤~&ýàk–Œã9ÐåsEW4!„5¶<ØÿÁU¶2=;ðýl3„­øQ'+ø½ýÈë?W¿lÄùÜÕs0õ6]Q#ºWÙ)L¸¸šÙb‘h»ß)sü-ûè<*Üv:MZ+æìã„"Û’БÂl&ùœ¯bVmEß¡¾›Öl“B“Dîf0© ›ñ!*@GçÞ°?pWg\®m¢9„¬f»XøN ·[4^jÍë³2 -B ùÔQåàB KÁ­JJDpD9˜…Þ…ªfSÀP¥UÊpîm¡<ã§%ܸ¾¬ÿuàßâÞªq%ð”ø©˜(•Ð\Z«Š±äbU ×ô‹™üJço•æ'hN¥\ʪæ2³ßšYëá'ÕTü“ªË¡uEº\(“†RWìZºåçM'vWIC™KW._µ"Âqilä¼È¹áË&¦?cà8<Æ»á_bøžy†R#öô‘îf>m7IóKçJgõDx|[¥ƒO‘Ý9Å,x«ÒĪᤪóÀë£p2—u'Ýý¢ìÏ~·îÜÞMkÓ‘n.ÊŒJž}Èe×h4ù¯ ]lcQ°Å9!y¾¾Ó]-‘•ÓÕƒÿuëâÑŠãòŒÒ} ^KÁ‹  î=ÃeQ´»òUƒÙ–Ìžï¿wìHø¬=ÄeÉQ/€~ b'é¸ ÄSŽ70Å¿ˆÁ±÷cν–jŒuÅ8Á ‚Û.bldFÚC„Ê”D’”óÙ ž¢’ù/¾ÈÀN*Æ!ø ‹ÁàÿÄW33¹ w]XüÍû}ØžÓÃÝÇì˜ýô,U-ƒw¦ƒÞ%e0p‰{A!»Úc}ÔÖßÏh´ÉÀÙ²‚”W¡-ûáÿg«™f!ékòø´ .ûe$¿P[[–ññn;²Ñ/•íÙn…’5S¢ü<‘Ôó;É™#§Ë¯%_'@î'#ì–ßÖ³ÁïÆ"ìÆ=ÙFÙxûw>~T‘s|íÚ­‰³·ŸBÅu¡Ì/†8{ü«/ŒIßµ6>[>uNDš…<ù„¿$!áo‡:á¯>Ú]õ†h*ƒ§¼‘0µ~]·ìÕêwÝêW¨á/ÏóÃK GÐ'䈽;5&‡äâª#¹è–ô=„úù ß!‹¬/ö"Ì>¨ÜI>˜Q·í€–°í€¶lþ?·ñ€,V%µûBþ ”pWnÄ'.´™éÉ7kO-L¾ÅÏpÕ„²×Öfm<ºíÞÁ‚;èáïUXÃüù¬À­o@‹àì8Õhݪ +ùÀÍÒ-ë¿[³ùs›‹A{> ܨgúê¬Íz‘ð_cmöÅÛ9ÿ¯Ê‹R›WåZ6â1ÂÈqø0rî¾ÓañF3ØØ8êO^þcB:@r}æXÝLm—º½I¾¹uø‘V„²ç×íß²åBJFºˆ+høNµ$ý`†ÿAój ¦Š'ƒf¬Ÿ©ÀÝ/„å>ÏÝÿ›I¹¬O¼r<3GÉz½awŠãŒí¬H?RÂ!ÛçÊŽ¤uëwÈs$ÑK¬ˆAR¿È]ié‰GÒ6L<×Ï]k3³!»–OïøÃÓHÃðAûÊdŒ>‚Œ#cXK-Ú²¨ÿá"‹Åþªë_”}_çk{wò·2é¡[×J=«î}CÔ€ýtÆÔÏÎLAO?švðJšâ?íb÷²½ÄYþf–çŸy'ÿa¿zï3ÿÛtœúÔÆ7‚Kü»‰ßÀlåÍú5AR´eeu§>™^®Ã§f±2ꈪ%•(ý„¬²Ø>*—/aþ뉻H™öyçøË{è¬þl‘\á5Jíïò¤5ä+ÏÕ«…ÿì+ ë³(øEhU?Íõ»Óœ±øÕ¤/š‰êª$UZ„j¼…ù)Ýd±½¿XxE£´†¿™&°üKâ ~ˆðýÏÊDgÆÔßv½x«7¸­Oúd…Íч/ïW¦JÔÊ Ž–Bÿ¿vçY,ȾD˜¿´±ÞÏ‹ôl&!D˜&ú®¿šêS&d†}±ò¿9Ï£aô²zßåÅ?è»´VÍ|7ükœñ:æ=.¯ìWü½}Bª¥ öjݺ„øO·ªûtÎGÍZAî ¢Uüq«Këƒq#K¹a(UóCék6“ÅÞÆÿþ’|ùÇÓPúñϵVÂþUO„(¿³¥¶ìÞ_Þf•p)v}>x!l¢•ø/Þ©Axh5¯†z4̼ªâ×± 3@¥O¨=û¿Ÿ(:ƒ¸þõÑÛNU Š„•§«EÜbeGö¶‘1îé=±BâzƉßü ·ç‰1 ›<Á t()Ø[tRas“{q©@‚s°#û¸x$n…›M9 ïÄ»¼p½p÷EÃÊõ·nÛø‰Ùô¡Ã?–ÿ#XÅé7,Ê!løUàú}>öÔÐ(Ùè~K‹ÏÆ>ÄÙ ^ÖGÙ^ü?EÙZ_ƒ¶ìË)’•…;öe¬^³ZçˆdÂjO4ZÚYØ—pàKeü'ôîÿEå^€gf÷õ‹aÉu‘@üÕwãòæ™ýpØâ›ÆëC¤­k6ìWGÆ-‹›ŒÂ¤…>÷w'®Ý"Wëß$´óÀ‘íûÏ)NœØs<¾P:„Q/=ŸJxµ Ï+8UÊâ\fÃ~ k½¾¤Aú¥“?4ù­ºîw¿Ñ^”Ù»Ñní¦f{_Úž¼nývÁ]¸b’úG&TÈÊФìý)Òú-+ëÂ$rÿU3Ç»¹‰ļºä[©…–ë¦ÂV!¹ƒ_hç„poyX};7¨Û){}»nɾwDŒÕÜŒ´ÔoAÝš}¡¥EÉEòu®»‚ÄIeµÓ‚¢C=Û!Ϥ€¬IqiKÑ6´Ýž ÒöòÞcfêÁ“;²·¸ÛÞQØExi6ßõv›®/%ý˜ËEðÌç˜ÏÌÃV䥔åÉÇì–ÈÂÆùúûÎlg[à]-—Åñ+ׯY½~õ†Õ¤E²)K"®œ×~Vpâ…Ìe¦?±·a¯îºE3¿?5Ž,>øbÿ7sh£áߟ4@h|M}X÷÷šßëÁÎzI^·–GHŨ_Ê“Òh)ϹÏ.åéÞx)ÏOñú>ƒ§G=1¢þQbÄâÞ*«/› <€ ëIÕyÙÐ_˜Ð?KýþŒ~Aì‡)ýan÷µz| è´?OQ‹’ÏNo fÔ'ûú;4ªÙë³5ë|¨9¶Juï÷ õ—¶¾hÐ7ì‹-+„­±‹¿¼5v÷·Æ¶|FHrý7‹Ð„æò–ÑŸhíºF €/¿}©uMØ•ñlr,Ó› /¾`¹5ô˜X¨»þ`ŸIj?€¿m±ˆ¯°XäKìJã0O(AŒ(±X_•ð%UÌ«jî¿Cú:(–_½CzÙ3ɰßC/Oµ^þK„oaI=6Â’¸]‰0!Ñ:‰©lú YåúæÍljÞ‚¢þoÿÌ– endstream endobj 130 0 obj 15181 endobj 37 0 obj <> endobj 36 0 obj <>stream xœÌ¼xSǶ/¾eYòNN :Â$’BïÐBï½  ¸ÉÛ²-Y¶šÕûXV±\%[r‘{7c0Ð!ô’Ò““rR.9³ísÞd''Üónî—÷ç~ßÃÒÞ³÷ž™=ë·Öú­™5¢`ÁTŒB¡ Û‘œÆN]—“š(˜AŒ¦¯¯RÉEdÕφŸgÐ^Å6–?7Œà¼€y^ŰúF¼‚_}ùzÄ‹¯ÐN¼„í BY)­”SAXPpа ‘A¯š´ hYÐÚ ÍA;‚öE%eåƒ ‚Jƒ*ƒê‚Zƒºƒú‚Î]ºô^ÐGA_ý5èiÐÏÔ`êóÔ‘ÔW¨¯S'R§Sߦ®¡n¢î FS¨BªŠj æQ ¨¥Tµ™ÚIí¡ž¤^¢Þ Þ¥¾Oý˜úWêÏÁ”à‚Á£‚_ ž<-øÍàÅÁ+ƒ·Gï N Î –«ƒÁÖà²àÚàÎà£"ÂwMœ9+9/œ¶L&ÌàÅ%£‡xâ8^Fà”° ž -Y(DÇaɰDA ?‹–•–ÌKÅšGå éü¬° A:ºž†® ª¶¦ ³„q‚䌬0ÔâÖ•«‡ú˜•“hW˜Œ.‡¥' ;ãÓãD·ù絬˜d¾0,‹'Î ´Ë ‹Of¤ÆHP»¨ª Aò`DÂd~âo­O ðcñ©<á`½Qùíýžy똌ŒTÉà³éƒwý³ýä,!/5aÚæä´X‘0,<=-†¶9}~ØÆ°p^¢(5F6„Íÿý†ßÄöÿO«D‚ô@Çy™¢˜T¡(--&ÐëD/&‹',\ÉK͊Ɉd!ñÄ''$ðÓ³ËSÓ¥<~"’t|r\Lê²Xª4qðsc\Œ ¿'&N”Å‹HOLçóRÖŧgÅÄ¡QÈÚ—Ž:ÞóÏÒ5Ï”n|p{/>955&f°Êui1q¨ÎeC_Â_®…Þ¹n¨‰$ÄíÏÔ³j°ˆ®®¼5|°hóàñª6÷˵ßÝÂnc±ãX'V=Æî`—°“XæÆj±'Ø]ìÖ‡½ƒÂ.``ŸRVJÉC>=Ÿb£Ø)Š“R@qQ )E”bJ ¥”RFqS<”rJÅKñQ*)U”jJ ÅO©¥ÔQê) ”FJ¥™Ò‚8A¥ÒAé¤tQQº)‡)G(=”£”^Ê1ÊqJåå$åå4å å,åå<åÊÊEÊ%ÊeÊÊUÊ5ÊuÊ Ê»”›”[”Û”;”»”{”û””‡”G”÷(ïS> <¦<¡|Hùˆ²Q$î=ØqÊÊÇA ƒ®"Ê@§¿CK }AßAï ‰ 9¿„‹ðžËxŽx^ù§Q’¾°ñ… ÓÿÓðòÇ¿xò¥É/ù_^ñòÍñ#ž0Þdˆ_ü9åÏO™;Fâ#cG’¡C?c°÷°ŒŠ=v´æ•}¯¸^ ~uâ«S^]õjæ«e¯~ÈÉiäœäbÜ×¹ÅÜŽ°°°™aa–ת½Vûzðë³}L昛o4½qòÆ.›>öÑØŸÇiÆOŸ3¾küOÞžpc——LÔOzmÒÀäi“Oé˜=µvê“iÓ¦Oœ¾h6cÅÌ”™ªYSgÙf]ž½höWojßü·Æ¾µvή¹³çÞûÃ<Ƽ)óªç'ÍÏ_¶`æ‚o¿ñöû Ç-\²°hѤEK%-úÛâ˜Å…‹?]2yÉý¥5Ë"—‰–Ï]~t…jEËÊa+-+«WE­ž¶úïk*×bkåë¯{ýŽõßl°møËÆè¥›â6=Ú|`ó?¶dm}uëú­}Û–n#íÛ_Û.ÛÁÞQ1;⋪Ä.åî—w×EŽ‹¼¹'fOýÞ){?ŠÝÇÞ—¹ìþú<Œ¶ÅpbnÆnˆýG\cü^Þ+¼©¼÷Ò7%~’Tœ¼.¹þàúƒRä©£SW¤šS;SßM‹Hs¤H{Ÿ‘.Nÿ{Flæ¨Ì¬Ìá—…—³ºD¹¢»ÙrþœÓ#ž(þRÒ"’~&KÓäy¹‹r*’_)·«(*™úE5ÐP4ïh ºP]»>Mÿ¿ —ŒË¦-¦ŸÍbË*Ë10|–wÏ¿;ÿ¡í ­À¾Àþ™Ãï<àü·k¬ëv¡ºhCÑÅu%Y%+-+{³¬Ý½Ü}×é9ó‡§@ñ/…ßÿ“ôËè—ôeZÀ¹Æ,€|q`3K²M§ß®Æe„#ä<\“ãHZ‘‘r@ÄN’ÆêßøAßi¯¶Wpá‹Ä–²þŠ 6öp/Œm#F¢Š/º™áv}âÎTâ2+“N0-$ÙjUœ–-ƒ[Ü!»íZ;¨ù.OË9HcÁ º— ÍÓäi€– x¹š z\-!lXÆ„“`ɲ„6œØJÌG•O뢖o0KòyEà(%—zÖW“Ï)éerIjlN¦J™-Rj@tùªy±Ê®¸H* *ÅõW`(ªtĸ7à‹u·Áq¼AP“–%“‹ä*¯‚S¡rj@.ˆKX4‡|-â,ù'Ûá|9Àt‹ÅŒ@cIÔïT, S®N˜4½ðé‰ÐÏò~(ãC">ÇÌÎä'Hd¹€­Õ8(=Ë=ciŒwí>[e騶Œšø ·o¾Á¹ù&k„*Ûø¦Œ- 9a)у ·è-†Éä¬{ô^8ËUy䯅/Nôµ¼Ì¥’(õµ©Üä|ãCÅnS®z¯TÖÜã÷}ñ.’ªàú(à#¨¾M…?þÄܱ5^´àáɇo}ØúéÙw¸õ ]å¯*Ó* fƒQÃÕ)Ì: Á…e¹Õµ>¯ÿèþÖ-ä$2ŒGΘrzÇ—wÏ4Þ¿À”0Ñï¥ô à&^F?®/Ö, Ð+seäXòmÖV8^å7z@ Ô¸]gœ¸›ôÈBÎÊÔû~"ݬ„˜ƒñ É%ç¥ vªˆºCöJ]5ež’2.œ —^'ç;%6³_mXg@÷øÝ!« 4Á…±°ˆÁ'Ï7T.eï¿ûKþèÏÛtòÓõBM#×Éè}¦jêšÖ(×KÌF“Ê(·˜,F‹ñµœ•:Fž³+°=‰¶œbP m~»>O¬b]8LóЉaÄy’9pP¶3G¾^ÇìćÆÇZâj ŸU~ÁnÇ…Æ¥ø¬a€xb»¾e|¯ [ép&Ä>€Ï·+[E•Üœªœâ]•·<õÅMu8ã˺겖®Q_­†›î‡2ÄD¤2#6©4R€«µ®¢Ò&8¼qk¿ð½wF쬪D=2+Ò3f§ d…EŸ»û9¥í–¸ãNŽ$ç[ÉI+»¢¯Þ8ÒôÝ ®j·Y²pFI†GRÓ}òГÆnr¼Él0—‰A"NNC.ž,¬í|Üñk79uõíu‹pj™Ÿ÷¿Ì<«Í7yv< +Y›É$i„H¶ÎˆðÔí‘ååæéóâ­¹…Èúœ Õó]Vgž­þ{L‡UM]ΆR¶›Ü& )¶Yl–zS‰Ù¸Œ}ëÇä9z­\¢R@N…‰Á©?¾wäég\iéÌÙÛÒæ6IÝp2៎Áaßç;~¹îøœˆ($±€ÌUÄL¯ÉÆ@ëg¿g‰ Ì*:V—Wâð‹hÉדHVÆxá_µO¡Œ¶ 7‰) ‰’º|¥ž‡Þ»ÜE¹±*€x8 .„³è]¹~oÊ‚mÜúïò]Xò,V¶9Ƙ—g€Ãx`¶ÓD4èFÈ4Wd‚m`ÿ­èM1[÷¦îxzNYeK ­¿Ë­½qþxŸ àâÏUMñ5*üR˜+¶¦ÊÃÚN—YË š¸u68É÷Ó}ð»;ÍI¾AÎ$ç““œÞþðÖƒC×ßá|8ÙòéÝ'î+•e¥ŠSÓ¸ I<É[ÙøØF!~DÒÒ÷‘ã* ¾#Åž »¾úTÉ=ôvKèÂïh¹„5ä4\(ÎOÙ &‹ÙÉ9‘ÚùHoщâ;ÚðþI3ñf xJ,{J%øýÓ˜sÁ̸·—›¶•Èçp2ìó ãá~˜³‹8NøÚÄ¿‘£®9È|Ô·m*‰E‘ãÖOåîX¸)~Àçî»±¿ôÁ‰>æž}ÿbǤ®ý ƒ„C€T*‰ôbtd ƒ'üÒ!ð9ð·Æg¿¹uˆãpIJ®æt¸a+2qeÎ.äúûMÂ㉵ÁB@b1dðš5[·,Hð}â"‰½Òs‹`CòÊáÚSİJä;¡žJŒ&·3¥ô]˜Wòóly68¸ËZN—GÉŽæ¸cYä[äFrÊÊÎý—om‡ŒO¹³È£Š8™v½)¯>dU?Îlög$Ï[C¾¾&œ›)ÊP ž,jè½{R¯^ã666—×£W‡dœxÔŨùëÄšw©­Dó3úìy¢°ƒ;b[©uºòóòóí\›#ϸOâÉΖI²’[3Ž|zó¯pã!Îmx‡)tGÄèõpfû­³/qt&‹Ùdà5fÐ!÷-«¬ª(¯lO¨Û³'^•ÈI‹ÏÙ—6ŸNbgí°¥BX~¤ÂqHçt¥‰h_¶b?ùüÀ"–d‹N?¨ùfwÈF—!´€bkaaÛ)ÁªÑû͇Ààºçpc_{ýðþõÒSä+2Wnc:|ÅÎ:Ð :ÔÞ\¿¤( DõYûd¦Jãµ›ÕÒæeØ]e3ñ¤9€jÿðzõ¿ÐÏ  Ò'$ƒH†kuƒôÓr ΑDmÈÌŒÎa'Hר—|»°°º¨¨·ænÉWsaG«¹ÑR :óêôEj»ÁªAIÍ ƒÈk`Ý€r‰7G£Ÿad+AŠ%Ér 沕E64~pf«b‹Â"·H¹>3rUld³Çz)pØÈ“p±çðÑûÍgë=ÀìF»º@Z`ð¼ÞSÞØ(ö¥geÈ32¹±1q[eq¹‰¬S0Íd]®Ð˜—+ÙÒj{>p¼²D-É@¶†»€ì ¸B2¶~âƒ;;K+G€3Íáä …2þA¤™›é&`°jå yHA©3OÝU™v.“»5N’„@Q ¬È°ïÃW_Ûÿ=ñä/ï=2¥†s (Ó Êð²*‰Õ ,ùœs©ÅpÆŸÿåý‡n“WïåöÑ?“ÈÏ™yÀj±Zò-…&·á§ƒí騺ˆmq‹ßŽê¸Ríð¸+8%žîæôðOp1šÙ^!ŒJR'sE±©¢d€óDu½_œ{ï*©5¹áF¿ª™’7h<`“ŒùÀÞQx¶Nxü=œà,Žžü-É~{f슷9ã¦n%‡!‹æ7¬9ãÏ®TQÏx[£]Q(guø: ;Ôë(/JO«ÛÁpÓ¢«º¼¤Ôß&/bmß+^Кm[R¾«$Ê¥GlÎ Àt¨ëßÉ|ïø¶)¯E‘ã7L´D˾ êâÓ¯ŽÃ‰3Dƒ ö›fJ?;=ƒŒ~U_¬G‘Ï3¬ëW°»C¶åKŠ@(È/sT^‚BV»¹ÒR‰ î´¸ŒeZ§Ñt™Y©OõX÷¡Bbß?Ód!šÙco©ã`Ã…mŠMz€®E,¥ÏÌB@CäÅGL©B®ìË;G{Ékƒã˜9älš›^àvØ A(7z 8#UWé1¹G?¹pú~Gö‘¨ó\^¯¬ÔâÍ>_ëɆ„E…7ñŠri¹tm®Ö˜ t@mÛÑ“¹U6zùÞèµ)¾èînçnOàãûÓRìH=ô•ŒókØB•òR  Z"Ö(U2dÙu.W¡û²ç$·þ«Š» ïʨ_¿r9v¾@ì0Ø·)âu[tl¹?$ ¿¼RGµEL¹†o±˜rõ"rô€ /]pZIK×Å“n\jEÁK‰Ra4)Œ2î2N±G— ”ìL¬öDkíÇ¿ß! ¥C®èŠ›y ?Ç#>9 šY<Í¥mMÍõ(léÁ¿\v‚…쎌ޭ·[ u‡¨€Ò Ôe q+ò$$D“;dsΚAa~‰«õ,ä±®à‹äœ@'‹‰/Ù*q6üñ!Þ² v“/ËTy6aÚ’v¢¿Ù© Ø +¨ý»û'1å6©PªÎl5P拜‘îè‚X¤©‰ä2ŠÌXS¿ªw/÷Äî;ƒOÀ튇Ã-,÷YwñU"eWb¶f“[ $@¤O-­0i•J‘ˆ§Ü*b.¿‹ÓCÆ£'ÜžÞKµ×ÀUp&£aŸ;Ó™m?Pnb!w¢:n¢ÀãÄRæÛôºó¬öÃvšò z“E«çÄïÞ™¢huz4$`Î3áwé+È:³Æb2iØš4mÐâ"Ÿ¬öhsÝ——9 çž2™ °5ú‚â€(ó¹ŸÀhOè¶z ¦Fx)à )LÑiÕ*©T®Ö¶ÎÂü2gäç;­¸5$Ïú ¼g²Žç˜âM(˜=…¬ Ò­I¦ÏÙK®bɶéSAžàÎi8ÚÞðä'›8ÆÌÈÉJK©È®÷WUÕÕgù3>[ÒJ 4#ý€ôOàˇ2æID³ ñÊ,zn¶Æ HâùY8ãK”bO=fÙê‰eü ¸.MI®G\..•;µ½{J2A4¾tû¶åó6Þúª ¯ ÏÉɱ&“BÄaUE…^¤jeF¿æ¨´V߈\BÈÇCÚլΙŸsg~®)ÇñËÝ7ÚB§RPl]7Èf¼ðnXŽèuA€^ý¼®8½ ΠìC1ÙA? wý25â&ý²ßcwÈ–•Ôg^Õy šX°ƒ¾žTÉvý|npäâÔ<‡µ²Ës¾Àq®pŸÚÝK0-~? eì&b&ïZ/ÏEš¬3:ŠTÜæ>‚'iËèáätlßrœÑ3eËžÝ)£•šÂ2°"¡ÿ—É®HÔ…ëØ¹!ÈI¸ ³]ƒ,Šiurù:K²R— $xb¹¸õÖ©Ó0†pøa²Õ gìN+—4ôVy¿¹Áä°çÕY ÕN^qxñkù m³YÖx«Ö…ï©i{×^ämm8õ)œÁª'o[3¬&'`€ÂÂÚæ¼<›Ýf‡¯À¹÷ápoU¦  v­[ÎqËÈèä2”œ›Ÿ²[‹ÌùzƒÉ¬5p3:gº©zªºÉf̸¤2(G#O€|®Ê(44Ú¬4âT(†/25*ô§L‰Ë%WœEÎüb»—›—ŸgϳÂÉÄýÿ¯Nf²èM.ùê@ ƒ؉žœ¦“­õ__ Ð Õñ½^b:2HOàî;¡Œ"1år½A§MKU º½Ãéí†KzáRn~ažÕêÒå³6ëL&Õ^m;ß=M#7³VuÄ^¹y¸¾ô 7g‘I„ÈÔð‹•u]5Ÿßå0JÈ·ámf‹¹R’ÀÜHòùÕË„ÉR>À“²êžîøñð%n×ùÞ¦®@\%Þþ?!£½2 ÿÍ2z¡\ Ä@,Ž>NÆ’k±Å‚lÐRZx9€7½,ä¬Îjò‘/8àaUЉçÒSë.®Ê Ì{ü2ÿ˜¨P £[Šƒ¯6|¯pGĬMä”×Pp°³¬¯ÖûÎï:‚-ÃÖ[ÉCQ—spޱÐêrx>Ö%$žad|uli³ù\NZŽDØz ÎW;NU¾àb¹<'Ó+kh,v]ìãÖ6ùj»Ï7/°Jv—Èš@ðWŸÿ,`'ý“øÕ8çµr_j¥Vm2¦'fKå-G¡ÝævTso@¬[QÙm‚ÚdqŽN.äìI‰Ý»š ª¹_vTà­Y5É›W!¦:sòLÖíÊlã<9[Vâ/ÑÉUY3I7k¾I­ØŒ×ì²ö–“g?¼p¶ÔNL“BÛH*¸æ:ÃÛwâÖñ}GP _äR« f¥AÂÝFJ5 F1P³ÓJeþÞ#ÍwOqìÎÁ©Î*â¥ã‚ò!õ‡2ß1;L@4&¥^dÖ™uƒYÇ"_0ÓŒ!YÒÎÂÉp\gÞÜÓ·vÕ®X2h%ç$ wÖöÀ%;+R“¨_«Åa<éc®=¸sÝî°­›¸ ¼èìh€§Ê‹ª.4|Ó}—{äAODZÀËÝ!pÿÌ `q“Œ~ÚP¤CžH¦(2É-Á¬8bœ¥*-9mG@Ô _e.Ô9÷¸V³È¥ä÷ˆIúN`eƒN$­ôU²f£ËäÒ«lââé—Jþ¡€ØC³Óûöмtx–x¯öD¡«£˜=üç)’Nø\sJ7ÌóÂÍ#ÀcøÂ-âù®PÆ\â ÁÊ-L1 V’–²{Wêb°ߨ¹·¯»ÇßÓÆa<‰v´ñ{GÿõCÄ·ÿ ç’¯CÒþä›È DÛà›ä}ëDÉ‘¿p•õ‹’ö(×#±„‡Á%p |ކsá È$‡“ã¶Ö%ÄsÅbR€l¹¢¬Öžç²:¹W¡¶šÎ¿6Yk.Ë2'èIZøøíO5&)ä“ sié'‡ÚŠ›OrlfÙþÈõ›ÂÙ+6Gf.”âðXÿ«ÌKí{æ-LKãs33c¥<€oL8ñÉÝú÷áV×4–´¦‰óûà;fš 3•_#¨kòW74fúÓ±0kÄi8æ4…àA/s ,ÇОҋNÓ&Ó߃I´Íô·É$9ò™“×éªÚ×ôrÌÐáW¨4™v‰þ&ÓàÈgNžÒgÀHfà>ô| ÞÀ,åË}”À'³oÀ€%Ò;)¤ŽŠCþô3u¨ŸõM5¨ŸÔOÆ»…a¦ )iÕ†@q“ &•ûO‚× GJt‡N R¢þa^Êáš{TBOÌ”ªOT‘û+™.ݸdb…쨌ô(° $§5$ú2¼Ò“ «É>Ö¢ŠÌvÕS™‰•A¾Ø–v2ë’’-šAk¥û>½“ßâìô²ßih½n‚G‚6ò¹ÏÏB5뢰2ɺ¬ÌÌ"·,bnê×ÐSÓÚ]Vátåu<Šü„é0ÜØîáƒ6˜·sßkÚ‰7½0uþt`Y$jßvç¸šÔæúJo­G_$öpä¥DÙAmUíÉÖAÈ>†T |R©mHëáj¢ï¿5¤uý!uð^xD…éŸÇ$g’SH1©$YWfs¸»¬±›ûÝÝp€oàpÖÖ¯&qtéÌÓ ûÞ&GÅ‘óÃÇryëb“÷<"¥ïßN½'¿à¶]él<2È^],nq7Á$Ôædxþ«÷afM(Cyª Â| ¡ûO$þÖ‘ÈûGºÊ››¸§Ï5=÷ñëq‡ÖrŠR˜M‰6¦,Þ»›+òsߎͩî=Vÿ¸å·¶«®¢ ÀϘqôÈ=ÄkA 8”E7+·8Ý• p2ˆÄÈÈ—Ÿ ¿~â˜ÿX·³¯þ>8 JÌn£NÀ’ïÕ–™kÁQPíì®Âu§ÈÿN§õÒ¿'ú™N‘E8I[@Òæ'fUwþí1ä^¶ÙÌz'Ç­pkuHÑß÷4÷BK‰Éý+˜$ ìON}m/¹š%^.nvæ–ä".Tî-Á*ÑRõ¾¬Q`GsΦü"¯H^ÚA™£Ö}g,õUþ |¨•UÄ{®züõ•{àB–ï‘¿þ’;àNÔ^ ñ©šy;d`ÜN ÿ4th'¥´u!ý-ëgz)ÇG¦2}Ova¥ËV^PõX‹Çn["Ôv¶Íœof`±pÊgJÌ@kV™ÙòsÖª¼2%Èa½YmœK™­^ˆÞ³¿Br|ÏI⛦à/pÚû0øÝípS(#–¨…?2Å!&Du—ñ7.I9žú‘ð‡KõµÕ8CÞÚTÑÚ2êÔCÛ¦®›CÓäÉò39yú®*bñEmˆIµq×;Nvœ*òœ¸çtôÙqOC:0ÂÀl#­sZ¢£â£¥‘_¾ãÜÛ—o}×Á}ð˜il°xø¤²»‡Ãˆo*‘ÆíW¤¥ò¹R¹Ù| iSÝéרO%ÌkýK‘WîŸ _¸G]£#™yëˆ<:9*xè 0Ö÷‰ê;ø·¨ÄËFf+"ÜÂít¸ý=Ÿkêר_¯¼;#‰§–¥qv§g$óWøt¬ö«‡ë/üÖé]«²Mb½‚+ŒØ¿qÝ*2ÌbI! éƒ,Ú3áMb-óÉÑ£çþ7õ.Íuæ´2‡œ:êEÊ a&RâU™$….UŽP—1YºD2 d¸ÅÒuR_4o?¹•½0“¿IfR±`08ÚÒøÓ1¸šUq§²úŠ'¾TQ êAuÑɪ–¾»EÇ*GÓɾù¿Àð‰šIØ¡”v á}­!æ‘ÛÐÿ€½Õußu€WÞËø8”ñ.2=W˜­G[}Ý?Õ–“x€ÏáGËgÉqYÈ)Pbñ«qƇ³›w,µ‰¹Â¬¸}éq(dÎ*L«äûdN1ÀÓe¹Þ¡ì[çúŠksí{>·ùG×6âù!¨•a½­Í7FÝÙrúíÕ›â6ä 1ì 1ëÙä fâ÷ÊËàk_¨‡o…Ô¦GM½Wo(ÊXäHòùÝëbÆdnTmKÀâ⥕«K£ËRÛÖ¡A퀛¯YvÀ³ÌÌx©2dƒl»Ô5ë˜Ä±ì©Ùû6œNaù;=ÅÀ|æÓ½åúdM}G¯8¸ò)q´rxºó œt7”ñ¦ÂåLg}éÙ†Ž[çØþ¥·\Än=1kþ¶ýÒÊ$ÕUž2¯Óì0sô%f0ã µå‡OÔ§FìŬ_É™7E)’N@ã%ŸÇäg ùüª¬†ÚššÚza5ÿ/>ë2…ˆ„zäÂá0b -–>ðÖÀŠœµ4XFßC®¦=¢…+ißÑÉ9W™d’ÏÁ[4ý—ƒÑïRëɵLøÄN\锺kÅ—Á]pN{%÷‚ô†¼mÿ{b«eAÙ0ŒdrNd}ZÌæ ^NÿD3³Ì‚ÌäØÄÙ¼yé›Ô© O.•úÛ¼ÍK9ðyϧmp.^#¦<£öZaSY.ª=Ø©)Ô»ô™™õ€M&£Ú¿½m-×—žš™¡Ò°wîáE9nÌ7Ú~ßÙ+UaÁç7çìÛ’¼#ÀG¡ŒhbqŽ™F!_Ø¥h„ìi[¶M@"Œ¨8Ð,(S–êkõ{ÉWXô^Ȧ1|»ØGß§›.Ü“²¶oå‰v£îéó´ùðUb4«ÊR¬J0˜Ö÷LV_×ë¯TVJJ9âR™=)'ŒafT)ºâ»Ýzªõd]åÉ2|øÏ+µMÂÀ½yˆ…2&ü¼;0—N£+€Äš•3Jl©ûlÙ£É8r É#å$û›ñpdE]žµ…ËH² @ÇhøWúU¸@æx› ÚÊ'Çv¸ÄU[È|±:‘ÓËyì“0ü’é‘©L“Å6K-&“Èkf]ƒR‰-v¦Ú@Žl%ý ÌqV» |€ý5ýhP¸’ì²¼\»éŒ’tò3{‰"UÈÏ$äÆ|Êž ðyøÆuøÖ÷¹]-=í]8|pŸ€œåÜÀ<þ·?|K…3ÿ+ÄÀ¨‘ÿŠLÄöÿkq“s\ÿ÷€!ãªáŠH6)½Pˆ ×u‚vïÐÍPÆE„1õrѸxrg9Qy@š*I‘(„—l¿&–8ólÀþkb‰(±9³ç³w¿…›º‡K¦Ó‹ì&Ñ(ËYÉ&§Š,œ_‘SßÕV÷à,Gæ2è z³‰~03[ p½Ánw6×;á®Óo/suXm,›;ωZ`„òÀhQ[ØŒéÆŒ sÆhr½áiY—·±¦£Ás྽Úd1\½Î¬j\à‘V×x<5‡¢ë·lß!ŒOâÄDåĦŽÅߤëRnK_)ºÝT#ºasýPÊ8N„ÁÛLg7|‘Þ ³«NŸÕ HaOµ'95Õ¯)-­íá5îˆˆÌØÃãF®ÏÞ‘CÒç¤kbhFÑqE ìñéq<fgkeéñN.cÇž+¹ÇG_}­5—T.–Z—ž#Òñ;D­¬=ô©Ãí‡A8£†|‰´0•Éü¬4€ Ån_mey“ÏeÌn@»LLª†ÙÈÁÝïPa9òúã&MŸÙqðo¿ûËÇãZù:Óg)”4°+s}"O¡Ò³äåu^ùæ´1€TÂÞC[( ²Z¨ÐÙ¿‹±Äö#Ξéé9}f_Ïnrp{CZb?—ȯoomhhåÿyX`Zl›‡þSaðT¾‘¨,€»è¸¸4A¡Wõ îBÙÄŸê´<“J4'™ UlxBLwcõûï Äìß%–æ6‚Šƒ›Wø-1í8ŒA*o7ÛLf$|Çh1Zäz €mJk®g´Úr„ùÒÑ(ÆÄÇDGeǦMÀgÐõ)´O銭ª£ø ¹1•dg¬4iõ*J!ÉÕ!ú!×@n¹AÐ+ñˆr~ù­ïá¶nλð2ÍÙÄ´{Û฾k·»Ò§R™‘Å1r Z“èѪË×ÛtV½Åd1±É7Õ{Ñ)øßnúÀÞ¿/§@ìsºª7ªV3ú߃{®Ö6>„4æÖíq™¦}ÂÖk•Ö"G÷oÇÊ;jºë|Í ?œZ›,ÙÅ©¼´Ò,Ž–µÉŠ’hEÎâ2vïh?~åh|éCŽQfVƒ\ddWÙ}ùòý#7Îrbò(¼Ã¬µ”ç ļµƒ±bQ– U–H½®´v:á8×<2â’{˜ Ÿ–·´vx½UÅU¯*V·ï_.à* bCú`LK¦µ~ØBœ»Tßd¦K[j/°vm…$3S,OΖڊҸR~·¬ÊPØïöµõJ©Ôê,f5÷È5>üg¹¸öÖk¡ÔßëK«ÏÞ†Ûªî>BKNûw"fðæ±r'ز Ó+•ÀÇMG/>¹åú'˜¤ #R+42]»FúœÓõYlAAc\Ï,kéÕ8 hp1=p6™×Á¬¦.—³éŸù¿…û¯ù¿é{Ö’42T£6êåRåa³SÞ—þõ`pM‘ýÊ`°,äšÖnôD\&ÓYd]Gƒséùꬷiä¼Á³ùôŒéÒÝ|ñF#Û(£Á7]š'G±_¬UQü ÒQ]óÿ5ä.ý#ÀmQ„÷%¡a¶Òá’ŸŠv(f{eîµÖ¨×q È7çJÀ6ÅTÇžŽwá¤+OCßÃvÄnuüÜíi¼•ál’>-'lÆßýéãó=WäåB¡Lž£µìJŽCaÕ-ž–!‰ÞÍo8}ª²ûê-Î㯊*ËÿŠ3.–ÀpfºPÁ¯Ö×WU5ÔgU šCb‰îEva 9›y &xnu|ëï`++^Ð ­Ζ#Àgì’Vh ÌE¯s»ýµ²’T¹Æ¬Îâ&ÈÕæhK᱂ŠúÞŠ:{)(ÇëåîŒ4iN‚ñ7)Ç&ÎS"2—e–h÷Gç©­ e"—:?K¦ÈÈtËêŠ ¬./·Óí¶Še"U# ª·Ê¬CîTLÍ~Ý$ׯiö r†õUDGÔ×SÀMøÍ *±“˜Á$GÐËákÎfwcIUyI%À‹]z­ÑE×H#ÕãÙ’Ê*·¶+©>*.!'!¿G¼KLã$…®K£Á`z<ùµr¬z¿4“­–ËÔÈw)5N—Íj·9¹—Õ È —‹â~|SFïG׿ƒoUrºáYNZz¶= B1yúžY[>^¡“j³ç çsW$*÷ÝnÓ$kRLj6’d)ÈÆ<⦓-Uf…K£Òª4JöÁÉТµ£Ø™_bG`´!~™‡Àø.,ÿ¶¯øh h']¦€‹T¸a3C$@Qž,ð545T¶r…ôH^N 8€ï:}òX·ÿD믨„Í„ŠÙH'q8QáV9_È‘ËÅJ‡ºD=…¥^¸ÝÕJ,aŠçæD'$–î´j‘¨1U—ŒgÒÅ@nK+æÚOi+ºTùˆþñ%2¡Ð+©+)µVsJÊlƒ¶Žœãƒzôú Ê7\žk¿Ø}¾é<ïJ(ã' Z‰×™R§Ø† ²mïöµQÕ;{wrï¿Ù],iì1 [8 R•ìñ:l¶"'×[â,•x­ÄÍOÊÎNÚ|!êþ'7ÞyØ¥öí¼Á±æœæRÀ¾yìĽCòC™M\òE8IêÕøŸ}¢µé‡ñãÒ®Ô`Ôk´\¹B¯B>5³B\Ûäõµœ8´ä­Í»–ð$õmæ0žªx f3htî>¼½4 $ã¼´ƒIÛÂàÈ[í õmƒ >±—˜êÍñÜÇʘB,%N0“é;H:•§3ãhr,9‰œEN/ID¡C™¬DÛ¨Þ@†²ZéáÃcvØkô%p¡öÜÉ›W| îƒZm“¢RÒ .-ÆIéÀ$¦¸BS jÁW=0øÚÍÚúVO3°"ïh·àõJfE¶K’Àò”ñû×'ìä  0 »pêFbqÿDf"|ýõ™Oi ô¯ÉE´£ô_±¼öwMìp˜_†—e‰õþšú_Ù ºÏ\¡œ»{oPE?2û"¿þ¶;½Sq°{AgIgÝ·YÇú&]w¸¨ô²A¯²=ãÐ×ß²ö›8™W_¼°£@‚*:}ò׬ȽßNäÇ)y`/D'ÔÇàpl`>ººfþœõkÌ_wãÃÇׯ=æ"–¥ìŽõ“k²ªF€ÇD&¢YÍÄgO™‹¶ðå<€Hm=î³·ØÝ\[q­ÚzØv·¾«îH£¿ q­î4ÿîˆɦ5FTŸ4¦açh’‰3‡|cîÅMON´yúNpžýÕ­Y=£/ƒ Mwïâäø€ÙV•—¬Ü–½’+Ùš›œ†3¢â32$GÇf¶žý¶â—ßåVVÕûΘ1òÓÿ¤¢­³»ªÆ_ê 5r!/3::…›)Vçg¢0zXÀùÿ<9ÿ¼pþ?¿DÿEN°Éiœ‰ÔI‡¯þÇchmˆxû_ðQÚP‰À~!},Ø,Ú‘µlñî”úì:qîŒYy@—¥Ú¿†t 0*õ2Ó>£!›'ÐaT¿‘vžNFýÝÈoµûÔyê<`'Ùr çøÉTyùpñ«ô˜Ó~ߎ“|Ÿ™ž¯°)‹³½ÊÐ .ÕÝï8T×XWr8€­ƒƒ+nSÿ»·_âÓÅ•ý£‘Ȯò›ð•cß eüfäàC=½àûáöSóÈ—“éÚÆYAÞN#GgØØ*]¾=ªÚ¸ö‚ü"àÄ}Ò²,¡\–™Ð(è}ïÝà«mH%wÀ7Žß=Ø]•é»Ãv,_ 0šÔj‡Ñká2¾9cö'­Öˆ¤Gæ$ Ä™×hN«Õnµq…Öà«åî¬L‰8y¥cGùÚZ9'N5?7ÁQáѤjI±Ìžj È4Ã}íð‡fJÿu¸ˆ¹„¤Dd“žFO’¹¼Å%ÇÎÃXnýŸ&6לkr=Æw; bf¨ äl û"¸š ì½€ çÕ)WéÔ¢àzÌÍp*m TN/ ìæµæ"-¥Ù˜–0@à±önQª…m‰[Ü!;*²ÿU/Þ±Ù ‹‹JqNßC.V&è ›õla¹çѾøúàWSȯg§=dïŒ`¨ˆ1ýÁLÕA…*…¹R{Z)ÎXêáe:E£wt~Îb¼ž^Øä.«P­;-Â*µ¿ÂP<úhn/½Ž„þ#\NÄ0—nݲlÉ…-÷î^¼xûÁÖ ‹ŸV;þ‡–Ä`”ç-œÕ“Z¤^˜ìâfúUXÁ“ýo1Íf]š¡:'.Í6-º!ãØñºŠǹ¹I&5á²bu…¿¬èÌqŽ®Pþ™MlµZ¥¶½‰ÅØm±X€e´ÙœŸŒh^>7¿Ìæó\k†8›Q2VÊ,2È‘»NíÈŒ$¦ç¦Lr½Þ»O õ„n0¯?A!¦ï1ÉÓtÕn<ÐàSl5Ÿ0‚©Ìb‰/£%Þ¥vh¼Ÿï¸ ¡¼0ólâunNW]ƒ¿®ÈÅ>u¼£”á6“ͨŠ·­ãdfiuá3XpŽæ¿¯Ãd×z4åCõü~5¿íønƒ›˜C›¹{¹ç|af¿°¨§öK®«¥Àï¹ _Ì*=NŽ™s®ø½ôåídkÂVÅÞ¿¾AîJpeÿ²U|„ªw(»ŸÃlÜ“¸lñí†K8Ÿ R½™Uüy8z«›{¼~—ÏÕØÏví­–&iÿH&ʼnÃØïÏ“tÃ`/üÎû}7œùêv†Jø¡Ž™¾5Ið™»/Ã`H=~ñ³‹­ü­…\÷»tàÒ(lÆ<–ÁšR˜aOEa>sÖ|òy’þþr8¢Ýo+ëã–Úò­Ö¢²,r>±˜In%'“SÉp2N&'Ãp¸NF›`$9•ìàæÅ0áL8‚|…\DÎ&G¢ï©ätrd ;΃#á«p:÷×}U#À·!çÒ·¡ŒwÿßÚ]Ř@vÂ[pÖµ_£ö~Õ ‡5Âo›FÀ]—ù×COû£àxæú#XLC§š,VÄÐàBzÊë´Ëô†ÿ@n/J˜[ÈÍ4’I‡› ÿoÓ6ëˆ0ëkË]Èw×UŠÒöG¥Ž—p5!µÀ Š8ƒèV×$íµ31n¯Ja/s¤E ‡àR…B.ðçöBìÁÕ/ü:o®›«qYòÒKVãéƒÚj_ç¨Ã±Íûã²x9œ]­„uëèpTðà÷ÊÑ_üíßî~ÊÿCiúÿæ4ýðßÒô/&Âð‡'Â÷qÃhïàVîÇTø€¸ÂìÚU¹³pµÙÂ’6ñ=Mk¯’ãÈ·Èɭݳ¯À¥pÏ—‚ë›ïp¿ïI©›לP¾¿$í–ú¥­Ùä‹Í|ÚO“Ùò=nÿnâ¯[¾ÛOßmøäس[¾K+ž‹ÆPr'”ÑùoÎ,&³ØùÇ3‹/¬[þ(¶çÂnè`’»ÉÈc{án‰ô<òØ122pwïEGè•ïÝûoÙx?è_ùûAìÿôOv\ 6ÿnãh$î\£ë¯Q ÄÆ4Vñ×Ó‡~æðŽ ¦u…2|ÿOýÖG`ÿÁïÏH n¨{à`¿üÈÅÿö·@Îý{ äâ¿þ#,“ðü |é¿åaÿ™þSé®V#F€–ä'´¼‡4¯JõoV½åªgtO£ú?P¾W±:xè­Žü¿²#…t^ÿ]µøwèüÖþÕ¿‹Ñÿi•$¶þ^Ûƒ„ª­¾]iF—]A×á´3T˜Iè˜Ç €hœÔ†€höp9|³,d¯•Æ¿í ©N,”yÒZ·xÄ€_vÑsÊ„µ©ÝáY'}ÿ_uWÖÔ•ö¥›;.Õá6@tLh§ÇZmµjÕÑ™vh«-nmUÀ ØZDE@¶†-NÀQ– T(ˆŽ‚hÔ–¢J]êÒiÅ¶ÎØEkýô{o<8ßwïM€ †1ÁÌŸ<pÏ9ï¾ýÞ²jÔ@_Qó¦¿N€S” ž8XâýNغ╌Ðüh-7‹Å }Àö½æ.ø$&§$¯ðrѹP%^¾ìßàáµ$ÐÃO¬ÈØZYÐö9(„r•/×Ô/ŒáwÍ(dÉáŠd#áIëâ|üðìexŽ?ž>)Á/Î]Á‡ô¯‚úâ ‹8Ü 1 <áÈõFÀíÇÓ›HÎH¯Ðtå©.Z q…ro:kÞŒ,äjJG9Ø¡-WÏÿ¬#Ì– rˆ èXÅg¥[Ýza];ñ)‡A´‘;-Á š]ãÓ&½;¹oµ*zKîzsÕ*ûw]»ÙÜ›¤ý†î†©t’­ý, ¦>û,=º ÖW9 :XUçiº‚Y^^³fŸzûÒ7§Nþãk¯S³Ý|¢Ñgá‰ï¢w%MÍÍ MŸˆõVß™mÐ'Æì«ìËìûÃX4@_Ù&bè{Þ¬f×ÃÎpŸe‘gØÏZ{†r |lÞ©³‘K™ î4ˆ[Û xŽmz±[ª;`)Ct‹âç\z®Ã6I‚¿Ðgp÷È~ݽQ½Ý=ÝtÔ AúÁ˜«.´²µSIÀ¨6 ÈLm…©=2]l.±›)¦”Ë ±ø-¨3ëÃèÜ]›Ì0+ÕñXÙœrë䃧¥¡gª€Ãû!§ˆ©. ®±P1‹’¸,^¿ØKÝÓÒÔ°ä0æ`2?»à‰Ä)ˆÈÚ™Ÿ½ £Ãý2mË*Ë?!>3x0ÑØFqŠßÕf’áæAk-|%ÐB©Žq€ˆÓŽP÷ÒøäÕˆÄC… xâ»+Û Pµð¸Ï¡ùk×lŽEIââÖæ%¹í®ýhG "T¬ ’Ì[ ÆBì‹)ïån,<.<4HÌiëI ¼þêdKbkó±žö1%Ú1BµfE^¥ÇÑÒ¢åŽÝaÙ#Q³[²Ž"wp«²|‰Št.–…àŒxçuÛáyúNéÙŽÿ$=ÛÞ'=k>Cò°™‘½¬&{n¯Ã|K]½”1"6•9FA+{ H™Ûô3qNÆ×@uð™P! Nïg.3O½·à3·Òä’´ýè úâAh¸w ÍEuyžz7qÎw¼„ʼnË)Gµ¨ŽÅ‰‹Ê]–õƉ“£`9(°„ugÌ»±/qíÁƒïktN5Μ~9ïJ¹@Eœ€º™V˜Ÿž?æ6úúï×îÄlwÓcW’ý`W¦¹=sDû à°N<à —Å7ÔÀÜ}w†{®ÔÇt ýš` á[—¯`V¸2¤l¿Z¹=#[Üó¦¯tM Iؽ\¼()’Á¹±%ÊO|§Féù¢ôB”‡rQ¾2WY\´´2L‹´¨±\{2-.=%ÔÂUE‘µu»¶Ø/ÊT‡FÅ%Ç aLâÖ­(#k'›ÖeçE‡·ÂpvÒ‡q2èï DÀ¸’ž|Páá}»‘éiN}{OºÀ§XWï+VMؤÿr/¤…ýôx²Ÿ†PŽ3Ùkå¼§—QÚS9€¬ç¨cçú Âl.<¯žë'Ãh§؃q‘Ìæ]µû*e[Ç@]¶­ö*”¹eæ(³P™‘–©¥H‘žž•*m’Ç(‚ädT?SÉHkJ¢ÔtyêæÉ¸ÖM/—°ÐÕÜü§¡öÇ1‘¢ËË¢Úß^+×þ¼Œj£°ý”ù·$á{Žc¾–bDz·ü«~ÂC›‹ž’MçûìUìòá}³ïÅ•úTÜŸg\Ü×@S™ÍP)³Ñ2S‘‘&ß g„uƒ<:-,•Œªàg+ÕJuâ°n¤]Ìf ²*Ñ8ì°U›¾Š>nŠãºETb"zä&ŽlÏV.gE” Ám#¤L +†ÂÙ«@»Ñ¿3õ¸Œ,'háØQgè´+¥Ò4žªîÔFPë8㚇ÊäU¤àŒkB4k\ÃãÌ×J~–RÁÈëf! yìòJ…ÐÉØË|‚¦aÁÚ5›7mEÅ&ÄöIЬ“Ì A£›!,²@—»j¤$v¥†ÑM¦’ÛzMÐvƒ1Ús¸tÚ/w,t¥nÍè”Ù`¾§[Gte½X%Qfe%1ÇHIÈ¢$ÀV>R¾\¯NØ®»;?Ý£NÎÙHŒ›ó,èõ©4CJUû¸2jÔ$&ú›iqÍÌŽ¿¤ÿÔw®Âz;A¼‰ß˺pÂåæpÂ,Á w1…ðPœpФÿDo3uÂîu2lß6·QæÜÀ7ÊÔl£ sÜ2qš4T›ê?¯¿o+*/_w¥&@>ý¼@ nÞù"[ª–ÏSO¡¨ôØÔH²ÐB /ŠEo–ÉØ rF<ó¿-Ûœ<;#ü4ù6žIúAïóÚy´<*5„\ÊþtYJàg¿CÛšv6îö]°"ô=$œ±ô< ÍE9Êíbx†¨¨çáY„ªtKQV1 ËÙŸŸ¼È"^ÁØ3¹ ÚÏ8B¢n„ ‰¨F ëú’šïñ)"ïpQc¢ãSZ†O  ¯jø>Œ™A$ýê«‚\^„Ó<,㳿àËþÂ_»rø¨.ÜÐ<ËÇSñIü"œäá‘DEú®¨¼`g0–°y¥œù3W ß_•°ý³0>Wýs øÍ$Ž­ÂŒUT1VQç‡G‚“. ÞÞÐ-@1|TQô,¹‹H€™¼ÎŸ ˆë\åx:>q x‰µ3×K1É0ý?ðƒ;<ý×®üf®{8Ñ*æ{ eitÄ!Ë…¾Ià*Ý<œyÿ÷XC/‡EËyOÒ‰ •pó 44°ûVоuü_Ý+‚†’ u-"o4ÇÓÖ+Âä¾â·›Vç{# Z(‘„¼…Þ"ݯL»ÝrlWcè“öZ˸Y$,eâáñø…UI‘ï‰@Û9Yƒ‡Æ-Þà·ÁïÃUˆ|oÍÑ+@¶þøMÕiP…X•ŠÐ–TÆUkIÓÜæ`‰à.œ€g+G4\_X1äájOÈ æâÑ<ìé ãÉ‹ÍÁ'a$ª[qs½DÄðć.ŸàCÅ‹è'x^öÆÿǃP|V€§ÀY˜Í0Ÿdn{ˆvzK/ß |WGÞߊçÓ#ðôÙ¥Þ?5ðŒrþ56-2O¡@k¿ñÖ‹#ÍÆ{/`ˆí_Ü’õÚ|qwÈÀV_Ü–=d÷E7A:Æ\ŒÒ€£1©b«®Þ£žÂ~¡QYÍfá¶6ó)ü—Sߺ@ ¨Å‘>Å|MÊ·u}ü÷ µ9š:Qèú„PDzwOóÆêg~…«Ã‹÷VªKöµ‰+nß³£é[¨u3ÒÉ|¾UZ±>5Õb›}‹x÷¿Å "Yæ‰0×ÄíìtUFçâûa– jÙ±ç‰çÃæ~ð¸Uõ:Ž4œ?äü%æÎ2X+ ÆË9é¹c˜]¢ß1ïE2SW/ûîÌ£¾Ò÷Þù)ÙŠm©ï½ì¦NÊSådä"á.̓®òÝ=®ÄC…ËCi¶»4cš` *æŸGœ)í#¨Ê^¬ÓM%öXþ Gliù=é 㯠õm¿Å‘ý2#p<çw¾ðÇ€O'° ˜ž£Bª1ý†%„ÌT\ò“졉”0…òZQ‘´p¢[wý”úqˆE¨6ö³vè\7ß(ÌXU]$ã*Îjq„±œE5ÇRXÂ`Q%BÈ%}Í`À¦âjGîvq>ß,ûñ»ݺ?®]¨r¥>y¼ÝnÆPmYŸ‰}«õÿ¹m‘m²Ûpý;180< úžójÆñ ŠÅ‡¿)8Ejž;wªòssYîˆ+®éY=( Iq0˜…Ô°_Ñ[új0·Ãâëf‡ì—½Àİr×jm®8Èn×f{$­·_›rÇ®ô3vÏRSî²Dw &M™É­ÕWEД)µÇ±1ãÕ1Œl“÷îñÐhäµ ŠnÜM›@"LŽè¬·8:¶:“tFÜWZômƒ6‘ØH›ÀPú¤#}·KïBc¦OÃ+‚AaÆJ§_ÁðçG„$G3®ÁâýþÚ\ƒ5¡Å»·©ŠÕ%b»Ý¼ÕYcÛ=Æ…ØôßtËLÈæ ô-á7Íõ öƒòh/ežæÜ˜~oo7†d]m³³!]Ç(;IØQîôÓ–çR {éHW#ÏE›5òx2úÑ(ía“l®£Y/Ù ¬{qõ.kÁËÆñø÷Œâ{NšÛÁpú•ö1av ã5ÑôHM¬Vr'˜wÁ•ZBŽ‚Åód,þwB’:wûxr/æÂô ,0!wg•õïì_ _YTb5®wW»ÿm»b÷o½jÝ÷Vê¾ûJ÷mØ'˜îç÷NǸí)j´í2 8² Î-6Ø'Œ³:Ÿ²L½3qÍOq·¥eÀârUyva($X¶­5U? +Þs ¿RÛ,ÎR©²TYd¿<ú$\ÍÇ%ÁV2'§KÙuéŒ>õlaÌ­§QQZº3‰¤®Ç„Ë¥a£õqÕGG{§\«ËT9Õåâò’ü¢=dÝ(‰ ~`µzWŽ•m{+Ã͇Æ–"å…ÃàÞ˜Û²‚9뫞I3’³™W¥£7&mÚ8z©énƒÒìÜÒfª3˜;f×;ú=c»uÏØñà;‡u—ØÙ Ú³ƒhýmj" ýwJ #\ŽÂ_ º°÷DyeÊBªTUBNLŽ\ƒÈÝ…••QÅÂCbC6Šß_ùÁBéq«Ý´œ–៨ðØÌ„E¥ªL”Èy ÑqIçŠÿŒò˜`ºùÝÏÉú.vóšzCïæ0Üc÷»pït˜~M0‹(¿­Ì@H)ÌNË”§¤¥'¥ˆVyÏóY—š”ÌæºÓ‘B™Fž'^ÇåŠÄô´´DabpR J"7KËí-¿~JŸíë%•J‘01%g›)™[|WyWj’ÿ>‹bý$6¥=ÑÔú ›‚©á?˜CS뇛 trá÷_´H[é™Q&ݲ(Æ@(}p`e:Á[0ÝHR"5ôðÓ%C/ +Q>dÈÿugÀë endstream endobj 131 0 obj 21387 endobj 31 0 obj <> endobj 30 0 obj <>stream xœÕ}\Iûÿ†°{kWâjÀ3ÁÞ{ïÁŠ‚Št)¡÷„ÞDP±"D銊 Ø{¯¨g;Ûõôn6Nî}ÿ³ (zzí÷?ç…Í–Ù™§~Ÿgž™ðu>ÁãñºèI\|$2G«!3Ý]lõ­]=½%Ü•ál7û­ÛtЩwOß-$» R~nÇŠÚÝ ",Nã[úd§o©%¾%+:¦jø±x^.oï ªj­Ô5-µ>jCÔF«MR›¡¦«¶PÍPÍDÍVÍC-@mµZœÚ&µdµ µ<µµ}jUjµjçÕ®ªÕ©=P{ªö“TûߊßÏð¿å÷äåOäOçëò ùÆ|;¾”ïÏ坿Çñ7òÓø9ü|þn~%¿–’ÿ€ÿÿ-ÿ¿ê”z;õÎêÝÔ{¨÷S¡>N}–ºžú"uu{uWu™z€z˜z¼z’zŽzAÿeF <ËÝÃßËÑÞA¦=b„ ÚÖþÚõW´gK¤ŽönÚ}ñÄÅÝÃUâ&ªm(‘hË$ÚvŽ.íYú‹ç.ÒÕh™¶®ÄMâe墽ØÔF{£ÄM* mçî¥í¢ú¢mãîfë(stw“Õž!Õ¶Ò–zHlñC?‰wa°¶‡ÄËÕQ*ÅÇÚŽRm{/+7™ÄV[æ®íèfãâm˽Ÿ·sw“i{x¹ãë®ø nj±»T&µñrôiã7.ž=GÕG™ƒ•Œ{¯Ô_Öv·ÃwÚºÛxs£yMfåè&Õ–IüdÜ{¬%Ú¶ŽR+ü^Ü”‡—£² ÞRG7ûÆ·Öö’Ø[yÙºH¤Êv9ª4ŽO»É¨­<<\ü•Ϻ+ïzÿ~G™Tâb7t‘£«µ·TÛÐ ?¶@›“Ií¹2+üt³ œús¼Óñörçú*ñô¶r‘z»ºZqµ÷’XÉ$^Ê“³%.2++/戭£›»LyÞÅ=@âf™k‹uÆe†µnÔ^ù¹ÀÆÊËÝÍÄÊÆ[&Yænïî&qžkë.³²Á—-°qÇ/Q›¼?«Û䬡òAC‰­£‹‹••²É¹®V6¸Íª?ÒúkÊ;çª^± 3ÄÞ°I;:ÊnÌP]¥¼Õ@yj‘òXçýËmê¯5>ºHyßRå§Žê³T6¹ii“cÕ­ªwÍora¶ò‚¾ƒ·– oW+oÙ²¦_fã¶­dºÊAê«Þ´@E8Õç&mI”mÙ*?U—%ïa«lÈEù¬DuÑEy§}“\š¶¦êl“3Žª3Vª§­Tß¼U” K•Ÿï_ê¦:Û¤ oŽ nÊ»5=ÝtÌ^ʧ¼U¯‘)ïõR~º7½KÖäq¯&Çîªç‚ؼ`†¿›ÍŠ…3ÜmÍò˜èÏö´[¬ãe¿dŽÔÁ@Wæh¨çí´t®ó²y¾.VËçû¹ZM3Ðtì m³qƒ{˜ÒÓbÂÐ^–‡õ^9ixŸÀÉ#úMÙ/xê¨þ!ÓFÈx~¢¢0óÅɃEY?œ®,Î~}¦ª4ç×s‡wç²çköì_¨-Ë{wñȾèÁÑý»+Ïvü@A !z&„>1›˜@ %z¦ÄbB‡˜H #zKˆ9Ä$b8ч0 t‰D_ÂÐ#Fýˆ¥Ä\bÑŸXFÌ#FˆåÄ|b 10"c‰AÄ b!1“G &Œ‰EÄ,b<уèB´!&]‰¶˜B‰v„1•Ð$Ú|b¡Et Ô‰éD7¢#A3ˆo‰NE˜Ý ✂&,1Ñ™hEXÚC´&VñDáK¸VÄZbáG¸ÖÄ:"’ð'Üb=Eî„-‘@¬& BBl ¢‰ “°#6kˆ`‹°'61D!%ˆÍD,JÈGa„7áDÄá„áLì"ʈ,"¸Oì NyÄ¢ˆØJ<$ng‰£Ä>"ŸÈ!2‰:â¨ïÂ~ãúí÷¤ìߺÿªƒÌ`:`뀲ãnø|Ú ÝA¿n=xè`›ÁɃO ¡‡ôrlhŸ¡×‡þ6L2¼ÍðGt¡3bˈ½#é‘Å£rF·=|tÀ˜…cv==®ï¸eãvŒ{0~ÁøL(ðóÄÀ‰‡'žtxòÈÉÛ&£)K¦ ©k§žœ6wÚÁ郧ÏX<£læø™7gÍœ5kÏì(5C‹:pÎQݹºt_ëÍÓóŸ»h^ûy+ç=˜ÇÎ7ž¿eAî cM^©?TßG_¾xÎbïÅw–´Y2lÉ^¾Á(Cƒ*CÆò¥!K —þ²l²›ËÖ®˜ºÂ~Å~ã@“Q&RhZfF™y˜=6Ï6h1Ê¢Ä2ØòèJþJƒ•¬zcþ«µµu¥Èf§­À6HÒK’+¹f7Ön½}/û ûÓf—XÇÇãN>N…Î&ÎÁÎç\R]W»¾sïvÛ]Û=Òc’ÇAÏ~ži^”—‘×>é`i¤ô¿2©ìš·ÜÕž…vbï¤ñXFîÊ ö»+ÉFS¹°‰^Síåv `'¸- Å·åÁ~ÌvÔ„C¨rWÍ ƒðøëˆÏn´„‚Ca1Ùž­Fî/§ñc l ƒŒÝíÙî$JÝP”Ä‘–ösBWƒø0‘ ñ×lŽMšûÁî„[ö¥ddŸ…ïäB®‹iì¨î–¦Áކ» Jவo%$ԦΣ¤àâÝ”êCç»Ìñ0 ‰ Žöë¡sÜÅ›ð?ëRã·ƒíšuKœ±Ìcþ2‘`øö»\ßdP¾‚ê<{ñÙïáfmVÜ&°ì Øã²KRjž¢†€ÎF ëX¡V`00Þn’ïPl]ë{ @ütc/Ô¢‘å2ÛÉc õÝ /V'Ï:(Þq¼$§€ìÐDŸAñ¡q¶t{ù0&×Á„ˆfirÍ¢Ð|6†‘hû ÿ Ó > gQp ŒÿÅ“P“ÿZýsQ]`û_$Tü—„=)8Œ£½;…6(Žú²GIäªbwIÈþw¾‹ãfÛüÿØIƒ €ý{Ã]¯îvw¨—àbÖ‘šÊƒù—ÀqPë[ºb-xv£ªìÌE-°;h·g®C±qÊ @£[Ô#´)‚H8ž:•ë·Ò+Ì#ÀOìíåihÁ+€Î3{àΡNåy›yE¸ûˆ1( 5t{v €$<I{óL1’"’„ñzˆÎs‡ìR* ’$Ê¥à}x³6a LåX3‚=Àô#,O6]àÒŒ¡QûûS ÷Þ9)ª8ÿ< aÇq7Pw‘7RgNî6Ÿm¼\j%v14wÁÔ·-¿ 7Þ~/nlŽNS1~@,&*rjSKÑVYU¶.М&˜M7™í6L ‘Æ… oÎWgWÙ±LM¡¥Ò˜ˆ±Ë˯ÀvסÚ=q#‡=a&ï°–$šD!ta¼ÀÂ> Ë%(“„UJÅÝ+?Ê)]O ñ[ÑRv+Ù €ùl\ªH#aîìÌ®‡q§ðå;Yf편-` xÏûhê ½¼ïDÑìQ–¨@ F¿§ÁyP뜶_„zQnÃf ô@ãš·ws•_W\;UTªA™_ºc¢ï:?€¥”…È- ÎÄäy9ÀúbÁ³œ®iShÌﱜF€Eéú{Ý/M83a4‡½ºz†®‹ÍÅ/ÃÔ±˜ƒ˜:c–;”_€× Úq½ºu[׳6Š#þ%èÃl-OØ JÁ€ ÷bûò%Y3Á0ÉÅÌd¾ž9Öº~4êø`–áv¯Î@~­‰(_‰¥—)  $%µ›ÀƵ;Ä0âƒ<¨Mù·'¦dåïIÝŠ@^@¢û† ø0àL×9)ìÄ“{b‚+Ê)Ô‰d[Q 7…TyX®´wŠVëÆJ±ê¤6!7;“œ-’û3¨#èk:¡ÿ”afH oh4 òÎ(ý@tëI9l`kêiÿŠæ‹üPgæå‰¹Hm²Ç¨•úbcSÝwÁÈ»µãÑþ“⪠çŠo`-Qjª²l~×Í.°‹ øn÷ÕW—*ƒ”mΚrÍ¡R*CñŠy…{ »QOË-‡Oöìí¸X¼rº‰ûhð!•¾ 30`’ï ˼9@s<˜d¹lºñlסœ"u¸4ñ× GóŽ—‹ôQÇ]8FK¢¢ÞLM‘%æâtĽ̡ü"ìtCÉEø›âÑÏ~xÃc§°9ÌxjkuB^rR6ÐÜ ÖÇæ®Éx+´ŠˆóÀr+ß¡Áó„Ó(ß¡äMj¨Bkþ«GÞ¥”ª#1Sݹ!§â!ÃB˜È@}ê68–U}´æhÑ}p–UXï²ßa½EÛ¡“õŠ1ºË2ÌèN¡TM±³™[˜mXêà¸(íl£ÑãÁJxž¯©•3ã¬Û^ÅêìzO·WõULµg5ñà´ ûAz3sî!Óï¦*»Û-lŽÝ¾f'ì)\·Dƒù`¾•ÙLZ ù+©¤þ÷oUFÀ¾Ca¯®‚gln˼Ç)ë‹æ40]²|î’ÙvH ¤‘ÚµI¯NíI=~F83xÞb‹™@SðÊÄ.#O‡ÍAo*&46 ¬’I™o±ÿþU§œ ïJ.ì Û°µBÁ3´³7s¤Øtj?­×H#ç}a‡ë¼+nAŠå3aîß=e v ¡.Rƒ<ìƒ:ö7ë7^4m„Rªi•T«AËÇ·ž]œøì‰ìá:fÈÄS3½B#fÿEX†oç>àdøÒé",ÿœœ‹øœ™/+6¬h`Á~ŽWTx⪒ð?*šozÏÒFo¬q€Ý`mØ£ÜVY·»å-ô÷Ój‘Æd=ÉJÑJ‰»0†e¶Ün{ ¯Nû&FÈ´œWÊ9¸lLòoÚ›I£îÔš Ø(,òÌö{í–U„Ÿ4œ ‰»°ó ÛÝã³Åƒv¬HÞ Ò4ó‹Ò«E‚“µ¾ÎQ±Ñ1â÷¸ƒsìp8½8k­ì²v¤Ü©>|hVäx˜p ÃçcÐq{IõèÙ†î –‹ŽÁ,R…¥20a 8‡<C­`}Î)?ÃdÚËÀéÔÑþv¡kB"ìÅ‚W~s"í<µ@h|x‚ GQ ¹!›WoIš !nsüfì°3a‡õEÙZ Ô3×(¥:''%+›<Þ½'ûô|2p·G®s¾MÒ@+Ú½§õ#v$ö×$œL™Q©AI!€puñ÷õts 5æÔˆ8wÕ³Áç³ß2He9áD*Ä:ØËÃÓÂb±n}À¬¿\ÎyR\+>xíBé}ðµÚ8†"*. ;©4Ô@¼hê€xƃ'ˆ¦ 7E¥¨aC…øpö³sù·¯‰"GßSØÆÈÒØùÏðKûñÙ‘ØÊL¡vÁ>œwvA}È9œ=¹Hé ûk‚c‚AˆæÒ=.W ²ÖnÜ!Jû)8fVMYÐæäõñ[×¥ˆOÁ ònræäN¯×;³zÅæü>÷]9(mÎ0Õk VÞþ3±$FÀˆ€}» ®Ê­ØuLÂŽø$FCbè4jà4©±ÈÀÄa:˜ ÆWYÂ6ÒŸ|±>>ñÏó5ÓÒÓ³ì5ܨàèú¸Mq›D¨/µÆ76ƒåiæÅN-/úü°³xVtìüފܫูôpŸ4ÄË ®IõØVªuæÈž'÷+Ü–­Žˆ©„ç æHÇkð;F}ÇñS…]QKP‰Ê¨c0§E ¤.ÁïêA;‹C<ùliø [ÂT]˜hd4h{æT&a’eŠ/Á:îÒ$EÛh¿à¯9é˜Ñ£k5¹gjDAº$&%rƒêrÎpóš/d¾’²?G:‡ºÍ`½VŠøÂ¤è­±©RàHÉö‡´J±8v°[ØW tPYƒ;ª†¼(Ä(^)Ç6%¢Roš¨¬n`MþÒÖpCéO¡ ±++æ¯aÞ*oáž…¿©:Ù ¶¥Pç©Ûh‡f hM¢Q’";²f½â5˜/ï‡í©ˆðal3hN±È¯NŽOZ»Mü–àHÜWáéí¼5ýà 8èÑÝœƒ'EGËól¿‡o*ÚûÖØP®#ß(ŠÃ–:¸.š¶ù›ã¶¬Mo»Éµ4kµwŒ7ðÑxy1luîÒöûD•ùEÇ·ÝÀÜ*bT™ý½ LáÆÜ‡Bãí±?C½¿A£íW³í¹“%œd÷¦àD¶ãzEGò=ᚢ‰ÉåàØTØKöì*¸Èf¥0A)Q‰ [™ ñOÃj,Óë¶Ç'oÕyþE²Tç“­: ÜQv¥Rjw¥ô¡ŒWŸ`oßp±o³Â—DMWÙ»x/—8-ú@²]’'Íö) ߎÊÌ58|XVGjðø¨õa4"QèÊøO05×´©WJAEIÁÙ-âªÛÖnŽß·.NsKüÚ¸­šT½»°}U€ò,ØÜás<È÷(æÂæIœÎs1 e‡Âßá.ìB¿¡«àU²%éb‡Á\†ÃTMÆýBãVÀqÜ!öŽ©(årv€“£ÉÜaûwíÞÇ©rCØŸ‹Sg5áM§^J.ßw¬[i¶Ì!46<&L<ý\1ùJyÙi Y’îk´&X< =«÷& yØì`obT1Bw™—ÁRQp•iþB0˜y-žG †§Ü!›G6ì<¹;5qW[k3–ïó:Q;Æ$pçæÜí¡»Ük™…¸n%kQ9‡ÜgbÁÅ5rït]‰ùÞÍ®Uܺ@9Gh¬,ÞŠòµl9‰FRH¦Ø·–ÝÇ=Ľ©ÃÙÃë‡ÉöïlP÷{eiîMºÇ¦ÝÓ/aç—lѳ®‚~òv=ã±Ø·Ê#Õ+e:g’á\Çé@ŸžtÄðNmmöÁJ‘à;óäé‘nwÁƒªË]Þy|ÎzŸ°¨™sÀ^Ô ñXu…ÚöÑÖGb€º€±…O\˜÷Äjú¸‘tcWèmá×¥a 0„œƒ:½}¿/ùåÔñ#Øv9·à²ûñ{-ÒÁ °ÐSg¥¡Å’Å6V€–&¥'ÅoH)Ãoa)è‡B2»crÜ °öZ"1^¹ÄÈÉÐ6ù¯a¨õ`µ*ÌiÓ¡ú[lÞìý1#äŒÜ˜Q(ÔW!&¡•QX’ºÐÇò–ôÕŸ6q¹Cöîõqã6‰qpí‹=XÝ¿nlûêÑþºc¢½G³®‚‹4TÓ»ˆxf’P3Q ìOÂJ±Ê±xDzeÌè!•+>¯r~ŸÙsHE^B­ì³!MÎÂ7Ý·Øn¶ÙK¹ëKkà F4…Œÿ3†„ÑTúK‘Š™ Iª~ ›°$õQ†]0LǃPgË Ä6õô‹9Ç©=fYy¢å£ÍЀÚÓ¨õ­i°Ýƒº=—«ENì¸.Óoœîidæ/1¥œŠß˜¿ãRÉΣà ÈôßdN£žhSYà°b¨þÔ™+Júæ5LÀ;áiw´å±Ï`9ƒæS»á\µ¡lþ3òBmI8›GÂ6øþ3Ÿsøa*_ù݃¼NÍ”{¨<{’‹ù&qäQ¹—_)d„@C'¡Õ4޲«¡á-ØöƒãN)*Þ¸‘æ &ìË{û2.¨/ù€ ѵ·]j(„jÛNM…jy°»‹„ð]ì¹ç™,"ÏS¿ÁSädÅãžVz±²{!3S¿Cbêûô㨆b­Aï©øê«,²þ†Uu,ìÒUð‚ e»0…i©‰ÛRJK2*ÁAúÉÄÓ¨êƒÚõBVnw­°{yú{ºÒ‚·v–Þ‹—j!Þ½9PóÞ¼êQõ¡‚ëà8!+^TB ^ ÅQwm‰ÛÊù+tV8î,?]]y^,xkˆŠ˜Ú"çc N^fSXñÝÉs·¸ÚÀn<öø‚AÙ”êFÂlÜ]7Ö nåÁ8QQØ$"†<‚ CÂØå£“˜³ìM˜ÉLd§¨…6*¦PÂÁsõ1TMÖŸ4§=˜¢1˜-2nôo¯À ÌšÀØHN»ºà7¨ö¸æÍ ÑÉ_÷Á¶£aÇ)wP[„Æ#‹•."Îê½9R”|ðˆ8Ì4Ì)Ô]º|¥+Fµ‚·fÎùkÁº¸õb85ÄQ“½ÁÀùS&‰ÏL\ «_«Ã¨â?ŒÁЄ‹l5œþ~Ƀ"gæ;¸’|MG+É·wŒEëPêLþÊަ®Àdj6šAönrŒZSÞýÈŸ©…h09“€›ÊV°•8ʜƿV^áò¦}.òØŠiŒâG*hÉþH©úq]«hÖ5ÈgSšÉÛ®`lr ýþ» –Iø»ÜE©°û2¬Ì#a¯éYËùìjf]FÜVìê«ü÷;ïðÈtÜj¸~kP— [f´Ú!\â«9ÅÆd ˜†×@¾»9r Ò-7ùì8¤6€ q©4êBEyÅ0ðŒ>¤Ce=…¨Œ·Gö'îN×¼±÷ð#ðð)“ä¹§;n[š²š ‹‹£2<%8²‰ˆñ£Ñ˜ÙŒõ6ŸlP S‹v¤&mN\—³GÔ±è6³;03¸†vÖóƒ8Ýd1þ°–ud8Ü8‘ÚT•Ÿwlóæ‘‘ó ‚GËOØ”Z½?¯Éulëæ|ÆbÈn®OR)ó'ä "Á°yKQk«a4ô¥Q‡+Ó`kH?=ÛÔŠö>)…3Á+v˜yK¢Rg*v:­X(CZƒÅîýmÚܵàЕЫ ZœUš—Z„£¬wí|‚“Šä>8ÿ8ûe÷ÑU0M¾†³YØ6ܠ؃Ø0+¼Wa$ˆˆváØú··ð›{óOŽû `öæ»I–›˜.³vÎ+©®¬¬ .°ãÐÖ¯x»dö³ÜýgØN¶á€  VíiÔd°ÔØo„²®²òô±t(Mù[K&R…iÁÒ¨˜5AblIÁý5!±!!Zú»­‰nRé?“”Wð¦m›ãצˆ÷B# Ö&ÇoÛ¬rCÒ}6…&¬Š÷Zwuc~Þ¶+eÐH¸¹bóæ@—PJ'À“·fÝEšë‰Ú±ËѼ°+*‡|ø ’*ã΃/Ø`¦—"XÉ ’“C)›qV¢öÀw¨P‰åi6˜“ÝÓ°1¡a'>û†mÅ„¹:ºLÀ̯Éß™‘‘_’~”Ó—V Gm{ÕvI±)^!2–ÉB]¼ç˜ÙÍÓi¤~Mv¼¹/åÜSQ‰> GSCàèãÕn¹ª©hµŒùMškáì4Mlö>–W¹C ;B=Æ¥GìÛé’ÜœÒüÔ@/kw{#Q{X tÜ0…'QÈ»á:nÔ‡a[î?ž\Î(ü•ÞŽõ§S\{ùG<ß=ë¶ÖñØ8XƯ ’o’à“j²Wè›"Ýè &妞é[TbÕ¶äR¶E¦´¦ûg®*u öPæ UN¼/ë;òp,„¥h$4g’ÎmÚraïñâ’i¹»v§5à°ìÍ.‡¼eÉóÁ80Ûu¹íJo¿q4ü–JyTyè «KíWøFù„ù‰ƒ<#" m‡Ìµ5ŒœFC¥Íí*Pê ƒ€f†2Œ&Pè­bŽjMÂRÊ๎ ¯Rh ¤´€‚ñð(YO/¸ì6±£gk.×~…¸D¦üäõf)Æý¨ Ô/i& Ð §¡oíç;›Ní…ÝÆV„]AZÄà¾`ÉËÂ0MÒÆí6KqçvÁ¾\ ؘ2 MÓ¸°S¸ä\9œ{„©0ºæñ ÀŽàת»?ÜzZ Ž…UÉ* ñ£Ðª¼ïRp³ÖxVîn¨èi2~àÔa¦\F•‹—eZ"~a™9ɾd‹™uÞqþÀLôm±ÈXg¾Ã4° Xnw+¤]0Ñ1™ ÜÚñxÿÉJåÁ°Ïo§7 9CÆí¸©5Î,P “vJ]ý>V×ÇÎMzÈ©ë]>y‰ƒxWà#} ûJuw$j;Ò µÂjÝ_°t eu™ÒЭ^8BÃV¤~¢ôœå©y9 Ak¥kS çR~cFEêJLt4uµ±¸LÚ?û‚ç¶È”è¬hï^ÂsTúkØ*á‡;Ű½&Ò¢¤‹=ݬÃéyëûmÁ¹ \ɺS\™œžž”ƒÃûwA˜=SùˆV&å07FËõ¸Œò!UFù*£|[•Cr¦Â°Íˆ;`g³}n·!`¬õ̉ㆢX"0Ìx¡ {œßŸqâˆH`º˜dCTó?Q‚8$®fl$>Ë=|ùé_/¥Ý(<%®xp¦ü¦~wêŠ÷Ô‡Åͨ`Ûf̨†·?AK¿ù‘¡rZå:ìÔë†à¾|Ðg³”hÓtåÌ 6Ÿy ÉIÙݾjî…³„ãàθa{øì5£ÂéP«« €5eqÅÔšäèm…a»c7€$úhuÕÉS»\®a±á"Ø•Z›—RhHëœ@Zu½LD¦. €!ðXï—¾ˆÖ§B—’)l{\hб1 ¯°2=oC È™Ñåa´ 2´2mMn·J°wë™,‡¾Nö H×zbôg»É<øwsÁÑóÝ ÚͲ#à2Æœ 1‰4l‡ÁƒÉuûOC‡ ¼ƒሇXD¹¥† ˜DÂjkÏ,K=ÌÜ$~‹=£Êüö™êìÊQ^IêIp˜¾f\>A¢Ëeº¯œf1o™ƒlǾ›ågj¸ˆ‡ý¾ª®Š*Tòámy³d™‘õN×½Çj-sÝi%7fR“Bü½¼¤¾ÁIÛ³s2sÅXd•CN3tΟûÚÀùÞø¦i.Ê—4ÏÑ¡õ“lØþ VÃI¾i<¶¿Ü’QÜú]JÞ§Ø[r)‰Qgó©Xö;.¼€ƒ_‰…—   l‹%ÅmIÈÃÿPï§gºÙ—fÍ‹¾¿¹‹sѶ©`Ðñ±°qr p YÐb&ÐG™ 4PeeË%Îú`!=ñ˜éOk²¯_í˜Öþ€mä]¨þVøá²:/7ÏþÅmˆ_4·¬]·5fé³ r¡Òo(Ão«Ùå´„cò¨âÁùphÝY›·®Mš9ÛC|¥®¾wÙ†L3±ëŠ#Þù‘å@óû{ÏKÓm‚Bc¢Åe§0U‚|ÒünAí[p÷©qªjÖéÕAaÝ™:ا®« Š÷”û0ŠÛ¿òÅÖÉ©Ç 5f¨^µñ¥Þ~Á¨r–8` S”#uZimcéà™µ³¼¬l¿ú+F`}Èh|óaîæÏ”7Na ëovl¸™en1_t#gllÞðäêð £8Cy÷"Ù3õžvô‰Ã'xìeø–Óf˜ßr`é£ cá’;Õ½åÒü¡ËöåŒ&êK…(%HO•'×ãÒȉ'¸9È-‡¹cÕ4 —vÿ`…s §å1 Ò ú ~ä% þ û5~ãfEWÂŽkôUNHÃÓð)<7"T×z–…½‹·½Ì6x°¤U‹ï.ï xÐV¶Î+D‚ÇV²ÔbΤˆQW*Ò3&ãóÑ–BâÑ•]Ç+EE{Òƒ ,h—SîÁíé‰9´àtv^ÒÞƒZà O‘éN¤~Ih¼Ë'¤ÓEù¹ûD‚K{2|$Ñ 26RŒV¢*Æ-%<d€Âí¹¥iP0M(¨-òÙ,ÕNþÞfÞtc¦cÄ+°Ö®žFìVÌì‘ó¹ ^ƒï÷Ÿ¸]q²à5¸Š¢òCóžÜ:–ña™í¢Œ™Ý¸j&ýɦ œû±ÀaƒS’ëÐ)ÂB’5d[3q‘`5X$–ö®³Œ¬Gà’Mû×0±[Àz° ”'É,ÛuäÀ®jPvnwãø fc ö#§Q½.ú‘œB]ÆúÇI€{ƒräÔî‚ó^ò`&,bzr騷JÔÒï'èüïÞKèô’ÏÆ°ÙŒ×v»­ÀX„:ú-º)¯{j²£•ÏR`¬ ¼×úo”™*¬™óüVºÿþR Y2fŸ.¼wAÿFñ´pH¤®Ù™ùäºpÙE9¢LU±ƒñ,ƒ%³W8U]=rô 7¹ÐÜÉ[q¾¨ª™/ªJÂ&¿¹/R– dé€é`†‡¹…c¹^îdЧ‘ª£iÔáÞ4¨uçfîâ–çÜ®áh«ÁÇœ¥-‰¸¤*cmPëæÞÅ€s}W‹Mí¢9Sû.Zi÷r9ÒŠ1oP¿üxr y‹š9€ *ï}•'ŸÎùóZj0ð4^f°Èy˜ œž÷rõ@……ð' êÉ‘§(¤÷û#²þÛ~ÜjDK©ÕZê’2‹ eirã6v<ì…Úpõ%÷!‚¯™dêz©Ó“渚ݠ¿E}³ 5á1lû8¶B¦h — ªÅ åÅð ;9 Ornz²¢U¿E¾C^ž4DÉMJ÷A ¨ÕÒž+m¼Åùìùj&`¥ƒ÷ @›y¤‹7Z}³Ú?6„Ò ÷Y¾}áäÝ$‘²Ê´Åî7¹/?ÿvþÄÈÚ˽½¯ÜºÝ»}…ê~zÆÎ®ãË…ì,&>%n#ØHß\thè4=§E¦¢•Ë<&€éô€‹~‚Ôƒ3owˆ†Qþ†6®€^êRpòà¶ÚìRqÞÞ’ô€®Î”.K!±±(IÑ*4 ;ÊÎp6&WvË«à,Ôc4qà,jÿÒõ@Fhš‡V íÞo`¸.€óà qó‚·Ë°-Ž¿¦êMÐÆÊ‹?оÛã›öìêÛ[°êŠx™g³^v(`ëÌ$R5±ÁÀ‘¶qr²±óÛ¶+¬‹ß(N­ Œ]…9¤{Ðöä]¿øs~p¦Ûv‘à—Š¼¬ÒZÇÍ 'ö_nÑÇWôÚzd{*–øÜíR G÷屫A\´˜½ç6 Y.)0æ7M ¹¢ÄÀY$ÔáBžçTê3ò”®b_µáD²ynu¼B“¬£œÑ ÷Çï‹aî`Z®œüâ_ªˆh§~>! D /~†‹Ó‚Óð {Ã/ü!û+SêQ$ɲ–¤û&8 çj±b±ž¤€qí½éPüæAÙíc¢Ãw<OìlruùáY™på¾^QëVÇÇÄk î˜çÆÄ9&ë K¥ Ñ9þ£¬…e+IÈ M& äF¤gúo–Œ¤g÷"•nJöy§†çrP•Xµ7ï𾇸²Ñ†b+Jª4Öƒœl±äê?UróÏÖƒ´C؀ϱá›È.fÐÄô…LŸ±¯Pg4 u>7ƒ_!æõwø4Á¹Øzt~ÔTX{$Ðv~7¹)’n¾>BùЫ¯Y$! §±šAó;p—gê̶e”)†²GS¹9Æ“pßß´¦b4&j# l\`qWå{UË,2?^fQû5Ë,zn¿K :Ã\¸ò#/NÿïÜ’/£û«êª4@¥ 쵪3M%¨5D‹’z4ìŸÕcÄŸ–Õ‰D›ü…Y¥†’4N²ŒÍÕ_­Kh+:@›¦"÷©B;˜‡e½QNþÂR ˆ…¼IKØ«Âmw Q÷{•:øÓËI?¬|õK]WÁ/dá9æ Uœ&ŠY ¼%"W»iˆ¸¨u!ôkj}zDš°I3.‘ÄOl½¼6=E d„%¹'ÒyØ™¼‚Š3ZÇvΡjˆbùU70™ _S{’#¤~‘Òˆ0qX” k1zÆ~Øÿ?ì_ï‡ì‡ç4óÃó±6FÚ}T~x¾Ê« ïg5©ÁR®žx[ŸÑ3ÿnÃê‰ÅÍWOtÒ½Ó³qõDu‘ÅåÚÕê‰Nõ«'BÎcJ)P.Œé*¸ùw.hχW›§Gì׸çÔC>,“1qTeôÕÌòª҂ʌK_ºªqÖàƒåUË,Q.¯fëÕº¦†o*Ž4-ÌVæïè÷ù;é†,3±«Ñï‚Èý@óI}þ.04&:Hü÷Öm¢VX;š†Ë-+ÇuN7>Žüþ‚’ìàt¤…XòVpêœæî“Ïv“ÏdÆëêŽaÎÝûÎß¿§{aœ8nsp©±­±™MYEåž=•âF_ÁaìËþ¼Ãh£MÐüaÎ?µn ÚbÙlâ°š,&jЈ(N#~ü—V :¢Aì¤æ0àï”Àœ~, õ¢xYÅÍÉwï†CÍóÊŸ‹_T «Ž}¹ 7öåkâü7r¾\}›}D¼g·¥ÀÊJ:óå…*_ž•Áùrú_ž¾e7‹ `èÈÕ:´fW|²ÎÏå€OËÕù™#GFᇯµ!Y¿Zä²8‰k)±ó·Ž RX暺c•È]VBö¿ }Ððó2„‡àR‡^'{ˆ[¸5>gf¢çäg—¬ÍE'ÉiÊdƒo8ƒJÁÕLÌñù-®aÃåaU üWÊên–÷9sµ–ÔÁ¢+Ž>P‡a% Ød•pp²SÔK‘•-§„™©õ€:1²ÜK¸%*m5v¦‚oÏ€cå%7éÿS1žÍIq ŽóË×ÏÂøp)~ReÒª¿tM­@;ãݰ¬YÇ?°fÚ-Y³æÒZž<¨ìú•2ÛáÛó £,¿YÍS2¯þTJæä¦dE»!AðO ÐðègK+e¶¡ÿ²×7d}Î:rËZÛª–µ¾Ä‚ÉÙÇMP[µ°õhVÍÑš£…ͶÎÅÖn•Û6]€rng*¸õ­CÖ·ûˆ½Ö·6(•+qrY'LJpy²@{¼ÑëàÈà&4iXZ ù¬¦Œ³ãà·oÊà$ºÙzó_ïæ'qûaøšèØH@‡¬Ú˜¼eíöuéâ{¬—ò›…ž„,0²ÑšfnY¥›ð¥Tñeø€»„ÆþÇåj0Çs5Y¿ÀrF§ªÑŒ£Ð6SÆÖÎÞÖ=Ý'owIqÉNŸt7ñøŸ´“à“;ö4œl˜T?¯Ì6}8³.ÐÖÿpÞöƒ@ð/Oדm&LÿêR{ 9o4õM“çÊÜÝ×&Ï{Ë7ãÏbx‘½Ä,D{ÉçÔ÷ìr%56öšB ßgžÏ+y÷7dž§5ŽOÕgÀ¨fó¿ÿÛ ÿ .–Ÿ&üWÅ'ƒ“ž¡ËŸÜt€‡å§q4ªÉÞ§eH®{6›ùþk¦Fþ¾uÀpÑ%-KÞžOÍŽÿ/K 7'€-Aƒ$žàpè{×|öŸuÍp<ý7Ø?-Ä0‚â)ÂI3PFYòÐgüÏ5ýP_ÿ½ÃßÝÓ?vΣ¬kY¾ëÕA•uûاWþAq½r\UMÆ4U‘ÚUäØ?¥"Çÿ´—ï²ÁMûtüƒiŸþ-Mû¼×«ãJÌÿï Þ]8Æþ<ÐoÌÃýq¼*оñùÔܧ·` å;[¨ê‚e¨¨q7Š!gÐÈÏìFácÞ°űuìFa”föçv£øÚ-•Ð|¸°¥ê´ÿ7~Ù×´ØÓ¯ÜÊ Ñpþ§FÜö¼pávÊ]x'àeÆV—¼JÅén4I³Ø9ïšù-°nx˜» ޶r ·ÆÚi_ù”†s©Ò Ü^oë2Ö¥nÌ¥a$µ_Gí}r´ò4ØŠü™\…Œpa}Òl€zÔ©ÿ 46¥ð+ÎP«ÜcÂV»q\òîuÿ¢nÏo‡Lqã*A¨Žñs˜1]ðbÁPƒ„9T6—H°¡žá?ØÑpßfR՟$JW%ÕÍ©¡øÒR~kÏcK¶4ÇN—1 )”¥ !© ÉSÌbiíEg™!ð,ô…gŸ£³øþÝò‘ïú0èàïyHÕFãfnqzsvSDÁ_ßÍþpöëÔ- pðk³`mád¶ÃÔ|5ÙjKùÓúí¶~õv[¿f»­‡ŸÚnK „³á¥/é8'jaPÝWYäØò¶›‚éÐ}ÅH‘:yžŠ²p°·\n.¼‘pþüæ[é?¿ÚüN€÷›%LQpý~ÂêòK>{Mg|"¥Ñž€–ø'íÌØœ•±Sœ±s[òñ·ŽÊøQ915ú²é…V?Ì„Cò3×n®Yùy¹¸:GÚôû㬌µ ;E “Y?1™g½Ø|‚M‡ê'”Zª!Xù)º…mDú_@6Õ[¿Œvm4ƒá¦þ:•ëKIãYª•i~ÿÖY‚0…pɧGùÅ»Xýû¸á ;ƒAªoCú¥1‘Xß×=±£¨ïí øRƼ‰»–qòàɃ{€{­smãp€k\$xþ¾}16{_2ºß>?º…;–¶/트ºtœ0«YîÑέŕD¶AÁÊJ„÷x¦Þ&5b÷£-b÷Óÿv?û§±ûpH³ÑlÇêõ÷iÝÇeC ï4”£„9Îå=­ûúig)ü¹I±²²0…}£‚ŒëîkÀŒ°Ì›ßÞ…‚ÞãF„»QŒ-o~[Ç®ÂNbéî'dù!YQ™`ÙØÄäý‚³£Þ»š‰IH}ÁÊÿÈN€p&›Ú,у=Ç»ŽØküÈoÆöÔc+S`@›p»ž™¿¡P´å°”ûê` é°mÇþÊÓ'ò uÞ—ð ¨Äªñ—'®'¢ÕPö¥uÃê­w‹&òśȷÙD¾hÉD¢cŠ3 ¶ÝÒÁ΢Á¶o¹•¦´í:KsB>¸¥xDî5V,éc4РŸ×)Ë ßp©ÿJ/k`CWº?Ü‘¿af®t•÷O ) HÜYyäø­|ñnþïlb|—5ù°fñAÑβmZæÎ×íýAÅfSi¹øg<–¶˜œúWvM‡;®9lå à'ø)kŸ~ÈOY‹üôúëü„!s…Ûg@ÚW2v\‹y /ÝKökùñf¹比v¦<¥‰kþw4\O|Â)ÅS_\¦hõÙˆAÕ(Gc.ìø,•1Ïû®­Uy6Áì–9ΙûùMÈÅ—ü/àºK½+°t‘ZkÚäWà4ís«J÷>9$nØR»9K¾nNAØÏÐòïÛ2Žú„_üw'¦µ&¦[X@ÿ÷—š7”7·ø¦«À¯éÓUªX ñÇÿZ-äÖñüaó^êêþµ¹èËš†;ð -0¼Ùrƒ¬<­ûÛŠBûÀéÍï¦:ý5û+ ÂLZdÿoŠ`^Ë>¥Þd_Pæë€ªèíïúÍ6Û–š õóˆ¯ë>.épåÖï¦)y’öÿEi\a³Ò¸ÆzÁŠóêieŸ|7„`åþ"Hã=Õ&š/oj¡K•°ÏÈTÒyRŸJ:§¬¼ÒSmU<çãŸ`ùÔ^×0­*nJ­guÿÄ‚ +lªR1ŸŸ×g„?ì¼`:tÆg>‡PÞ'Â5ùÙ‰Ç_ö5yðǟ̃w„œÊdBur.•P^X\¾qóá´(=½°)¾ƒ8¡æì‡|óÇlB½? ž8Ü2 ’M DòÏPÀI–>šÎ¨v@¡ü“w”–9R.¾\³§<§†n‘Aÿ¥>ÇåÖ—;< 5Rã×çŠÆy8ƒôŠJ×ûÜ~+»DÛØ=ŸÿÁø€#ïÅgÆÓQð!y.·Mô|x¦‰z_¥†Ú[#Ú¨ÜåZêZ°© C,׈ձA@Ó%09·¼¸êL¹¸aS0ÏúŸ.x.ë%ú¯0Ncí›ûå$ÅûB¡—?»Õéq‹cúåŸÓãfcºM ØÞ¶Ë—/Ô2ªðx”—¿Û€GºÊg ÐtLÊ«ØwàQ…ø‹7²Çú«g}EÊíŸùòÞ*qøú‚”³T_ S Oã¾=͉›öaÙñŽ”F{ã¾ù'åV•ª+õ\v¼×báÿ7sö°Û­iÆW¿ðí‹)ÐÝ|šçùá9˜×|íuµ*ù1=e_HO¿¿ž¶ôÄ‘ì*ÅÔÏ9U UuCw`—Çýkõ¬Ï|ñ^{ÿ kF_j9ÅRŸhú¾¿ÏákÞ'äLJVüøÇ4þª5‰ÏíÎö—ö Îû`;U¿_×ý=UÎвÙ^5låï=R:…~\óË ´O±Ý?ÃŒ¿L¥Ÿ®tÝl׆u³-0^RJ”?¶´»Å[Ò¡üêé‚ßÓ1W”ŽéþžŽkSħ•tDŠÈÏ‘‘{'ë¤"¤vK„Ü^õ BšcB¦güJ¢-¨5MpÐ?±N :ÃÒ&)ËdKÒà”4ÓL ’­aŸ6LjÛ– þÎ9¦Ú endstream endobj 132 0 obj 16368 endobj 19 0 obj <> endobj 18 0 obj <>stream xœÔ½@GÚ>¾BH»)v0ŽDÇ=ŽkÜ{·±M1Řދ †*º‰Þ{¯î½÷–b;½çœä2K†|ÿÿ,8Žïâ8ÉÝå¾ïÇ’¶ÍîÎ<Ïû>ï;Å,ÂM°X¬ç­}=%oìº1Ûsi3=Ù€~™V ¦•?Îå¼LX”°ÇÑ‚ç‰Ò— ¢ÔÌh2uìÅÉÜ/LætO  ðei¬Vk˜õ“×à3sƒY –¬5Øl°ÃÀÊÀÞÀÅÀÏ Ì Ú Õ@c 5(5¨1h6è648jpÊàšÁƒûŸ|eðÁOl6û6ŸmÆ~•=½½†½‰½ƒmÏvf°åì(v<;•­a²«Ø ì6v/ûûûû:ûmö'ìïØ?r Ÿ7äN2|Åpšá†‹ Wn5Üihmèbh(1TF&fê  Û§ÛìÙ;cÖ¬ÙëEbyˆ¯·Ô|ÞÒ¥KÍÝäæ˜oð”øz™OÅ?Â<Dâ@Ï és+OOs©§¹—o€§ùú]–ö[wn6Ÿ¾y§ùfÏ Ï×sËP·_ws _wÏ ‰ç s/QˆyÀ؆¹»(ÈÃWê+ ’Ì1_+1w5—ˆ=Ý}ñEž2wO1s`¶¹Ø3$ÐW"Á¿Í}%æÞ!®AROs©ÈÜ7È= Ôƒ¹=Þï% ’š‹CDøx >‚‹²I¤÷_±ÔßÑræ±g”ú¸J™ûJ|ñas‘>ÓCäʼͣcRWß ‰¹ÔS&eîãæiîá+¸Êñ}qQâßÑG•øyÿr÷Ùæ!žÞ®!ž’Ñr™ZùåýÌ{kW±8@>z­hô¬G÷÷•J<¼æìô t •˜ÂÐ|§h©¹…ùOïÐ×_ù¥½þµÜ"bžØ38Ô5@èÊ<®wˆ§«Ô3dtçÏ©«Ø5DŠÛÅÃ×Ë+H$Ý Rxyã&öðuw Xë‚ õý´pw 9¸º‡J=mDÞ¢ Oÿ­"©«;~}©…»ßdì·Ã£½›Ûk5z¡•»§‡o@€«ëh‘[]Ýq™kǾ$í=sëØ-lp³x[=VÎÆÑÇX;vtýè©{Fwíý½ñÑÍÝûåÒ£çY~n»çú±K;Éú±ßîc§ŽÝkûc6ŒØå„±à*µy|c.ÛUºyô%wÝÉb¬âÆ6ü+Ës´,ÑO߱Þ^Âc´ €Ñk=ÇŒžéýX —6ö°íñÛã:vµëØVèØ—b´`Éè§âÑMƒÆö>VF(Ó A£7z|÷ãï2zUèØm¤£ç†Œ~Š?KúØå!ý]GD®ÅZy»ÝŽu ‘‡ýÎõbO‡]‚½,7†xïÞ$ñÙ³Yêkµ%ÔÏzk˜¿Í¶ðWÛí²@·½kÍt|k–ù¾Å³_qZòÆ«û—ÎyÍyÙ›S\–Ï}=bż©Ê•ó§©V-˜¹zጲÏNö7•~j ¹â‹3ƒ-•εUýýüÁöjúÂ᎚á‹G:k¼t´»Ý?ÖSÿÁñÞ†OOô5ÄÄ«„±‹Ø@,%毎„%±‘XF¼IL!v›ˆåÄ\âub±™˜GL%¬ˆ-Ä|baMl%Ó b±˜AØÛ‰EÄLb/aA¼EÌ"ìˆÄ:b11›°'vë‰%Ä+ÄDâ9baLñ,áB¤1D8@¸éD,!# 7"ƒˆ#äDáNdñ„‚D‘@Db“Љ„’&¼ˆl"‰P!„7‘C$‘„„ð!r‰"о ¢‰PÂH%ÔDáOÔDQJÜ#jˆ3D-ÑG4ùÄûÄMâqŒè&ˆ*¢œx›¸@&zˆF¢Œø€¸E\!޽D+QLÜ&.G -ÑDTï—ˆãD?ÑBÔwˆËD q€h# =qƒ8K ]DqŸ¸Jœ"‰vBG¼G\#N‰¢ˆ¨&î׉óÄq‚8Dœ$Þ%>d¢•Šy:+ƒ•ÉÊbiXÙ¬V.+•Ï*`²´¬"V1«„¥céY¥¬2V9«‚UɪbUc÷_˪cÕ³X¬&V3«…ÕÊjcµ³:X¬.V7«‡Õ‹B?k€5Èb`dbfaecg`dbfaecg]`]d]b]f]a]e]c]gÝ`ÝdÝbÝfÝa½Íz‡õ.ë=Ö]Ö=Ö}Ö ¬=psÛý¬e¬FCƒö3ìFö7†Ë û9s8Å\#n÷;r%ÙG- ž¡ž‰~ö¹gýž[ûÜ•ç×<sÜŽq7Ç{?ý´NMX5¡åÅ)/¿Ø`ô¼QÇsä=xiÎK—øÓùÝ×Lü›±…ñM“ZÓW'q'ͤŸtlÒÉI÷Ìž7Ûn–aÖ;yùä]“Ó&·¼<ùåÅ/W½ÜýòAàšpžPca~Çœ~eÝ«ÜW'½ºäÕôWO¼öúk_;?ÅhŠõ”‹¯?÷ºåëySSO-úý´Øé§‡Í˜4£kfôÌ£3še1ë«Ù†³¯¿a2ç¥9¯ÍišóÕ›sÞ¬š»tîóÎóšæ‡-Ø´àØ‚÷’ Í,Z³h×"ñ¢ûo¾•½ØfqÅâCKÞXrpÉÅ¥ã—v,›¼ÌbÙ¡å/-ïZ!^9qåü•WVY­ž²z÷êº5ÓÖ¬YóáÚ²uëŸYï²þî†Ò¯nÌÚd¶©nÓO›Ã7·nqßre«ÍÖ÷¶mÝöýöW¶§Y¼hѱcýŽ›;gî<¼kͮ˖‰»ÍwgìynO‰ÕD«fk/ëlfÚ$Ûî°ýhoúÞÓvNv‡ìãLŽ8.p<¹oʾöïÚÿù~äœâ<âò±k¶Û·oÜ-=O#ÏÏ»^3½¬¼‚½ ÷oo•ϳ¾F¾Å~†~:¿¯üeþ·ôûƒV‹Æ‰öˆŽŠóƒWׇì–L—œ–ZI? M {)¬+|~øY¨ì¶$a ¤P g<„‚îÒ§ô,ZDÛò‘™’ÛP‘˜Ÿ'œ‰j ³â  @ž)(ÑjºÓ(-rS‘U‰ÅÑÙ ÈE)&é±ÚÀû"o 4J©…"P*Sx“¦Î”i @IÃÃ%~ !]ŽÂ)‡…p=» !/·"ÝßhéIGXgï wÙEô«ü¬ôÜÔ<@Õä(„(•{¢Uv‰”úhI» e>h¡`9Ð[–ߨÁŠ€­BäI‹H…=s’‡–tȌʃ”“Ÿ9]ë Ø¾Yp‡ŒKsûF[Gà;Zª¯ÒœZ¸Å¦_…sù޽%{5wûÛüöÈ•wZ ¢½r…Y¡Ù¢y)0­*Ó•ÝØ¿ØÁ.ÜÛMhï,Ú VPhâ9ÝÛQTß"¨®ÐU× F›jØ·“ÅðL>Š‘q'Å)PF˃¼ L\Oì¼'ée¦@¯ÍnL­I5Ñ¡#2ò\R‰ò+$„,´ÐÍC6ó_IH´KÄMªÒ‘»3äÙ hµ•­}ð98ÝäsdÞèPâËÔ¶  Ñ‡hüæçè%a¤ˆ÷Ä,ô2âìß¼ÆÃ«¢#L(:qW÷çý§¯˜²‚"úY\Ú}~— ¿Tóá´ƒœ"Rž’ ’å›×'¤Ï’ iŽ õv…i™š²Õš£v¢¹¤gƒ8Ï?;9ÃìUôÒ…Ðàh›¾¿I¸„,C¥Ž–‡‡¨ƒµÄúmøä ^¿yhpŸ­A­n˜­gÁ> +¹"÷`Jq,uBTŒ½†ÂLÐt]_v¸Ó k ë=lmN3^ÿHqëêÛJ ÕA%‚¢à|u1 Êu%å-ÎU»vØŠ‚…ÁαÞ)Ë©¥þï¢ \°.:j=ãn ´äÒô辨ýª³¯³§¿ô86 £H>õž|h Œàc QËåÊå"¯3Éd 2ù ¹õ D0˜—D3ÖdÌ«2°ØºJÁ ø:ù(Væ/Ãw3U—Eéé9úÈ2#p.½lÌ› / üD8™ÍMNމKÁRÏ4¨Ó¢3)^qvhhF°ÙŠ=vë­Üï9 û5‡K@€©³¿ÈÎ7  L&«Œ)Ê–s»“ò“òcµ1YRàB¡·Hÿâõhñ4È…;?«ù¸gPÐ3xºú"8 eíÞu¢"qåNªœ ½9¡Üx™\Ô "]®Ù¯uÊÞŸzYÓËŒê5G-…6}á À}_lîh¦ 3 NäϤÆÃzõAúù#Ðì-îÁll½y—¦b󛂣׸˜ø˜8µ§µ‹cD"Å»—0 $¥&§'S¼K‡Ðaîâ:—ƒm‘ya! u(0õRVŸÂv’wïo\| ÜâÏi›õpÜ£ÓÞÂwù®gôí›Ö%žùi©9À´bÔž)I°^½‰ñj-¹536—©_Hòh;ÆK¥"Q™´¦¶¼¬¶FZ„}Þ!UK¨žF¾z£ÚûPõ7cÞdÚ {û0n¢4:Z«Ç‹Ù¯±ÐË+ÛßÌ8+ü‚|ä®`/XÞc -¯zt«ôÌ‰Ì j‹½ÓºùGàx{”[‡|8e\ž….5¿Pk†M|¢.—¤lëˆí0ƒä‡w¾}×ú2¹"|õ¸k8Léj;ÝÛ%ónÔûYbîŽÊ8Ø[u¬À£ØÐ">–¯àj^Þ- Ö¤õ2òV\^ôÏ>Jµ’¡u½Ž\“…Ñu…‚nð(Úû¤#LtõëRíh8q|ž^V¬*4:}nºËT‹dˆŸÀuŠÆÚ~擼Fy:)_ ì)EQ‚J- ˆ ”‡S—W ï ©*r ©P œ(”I®°»ÖÚ^T]-èîæ,!yÉCú–¼…¦¸•QPÓ°áh#÷F[ùShC;ñÒ-¥ž‘–rcd¦jÓ´©¹À´šþª‹Õ¸Z5Ã$‰oEG/aª©WG.ÍP`'Og&!”ÉË‘UÁ‡«8#§¸ñh§‚[Yå:hˆÍ3ö²c1-.‹däښȨÅIcaðÒôF-0õ}­°à.I ÉÈ{c¡'®l•ž^¡gÑÁŒò*¹ IZ5u²:Q=囼sâ “ Auò4Íé”Ù)ɶdºo |u˜¤Å§Ç¥Çfɳb³@Ðh[áKðºIíÅ,M]:5f4—hY7°fó1]p-R¹‘ŽÂ‘0,ö“’Ö3 RK†§º§aaÓl -HhŽv¥'¦%¥%¥'™f«ÓãA%)a–뜠s=€Þ€¶&µÕWΟî«Í6Õf¦a–­E.*n{J^"PØ•* ›ãMè%dbšgTPìîÓÀØQ•ÝCëX=€?õ°iHçóÁƒü¢wsqõ(eäíø¢P0 «YlÒã<#ÅŽÛÖ€ À¡BÜ/oˆkeâ‘k£~›p V¼ñÀë(tŽDkßY WAÖæ‹í‚Š®œ>p‹qiª6úÿÓ±à2ÜDõô\ËË{‡I-tÈÈwÇ®q'÷G…«â³+ãêæˆ"¬WÄ¡R±kgàqHœº _dÔ‡íu·—’lŠË  Œ—D‹ç¡“ÅPªè˜‚²7ÉÌVeaÇ”]_…C­8“Qt¡WF|0Հ̜¢ÏmRÒ•ž©Ç· Gí$ëÎ]6ŽùYܼÔüT7äªp@LU¤Enãh-i‘• ŽPôg¸5ö*<Õ›£¨c{ŽÓ&Fº÷àôw˜øwçy¾B• ÄlŠ+ìBlA&Ô*+B[\t–€zc­ƒ…T^^Qª/ËHÉLÑ“sR²†ªn(묲ì$ÑœŠXÏÐp•/ð£xv=Χz:Kžð öf–„uš5á—onÇЛ8VHˆ ‹’¨D1a€ò5u 3°£élãz¨Ñ}xœž5¼ƒÉ¸Ê¸G’J¢Dĉ£Ñ´¶ š?ö»[´¦@W˜ËdòR ™Œ€NF&ªºçÔ‘>-†ÐÇïäå ¤›Že ²éyÃÆüü”\ê’óc±$ •ZÛ¡h‘ t%¡¥•Áf~äÏ®+jH5Õ¢ùJ².97“+**4$ !>J®Ò›ˆºäM hêR1žÜ•9d(Ьß÷šb‚¸hi ›:Î/ÉT _×’¢¨Ì‚,¶@/¼_ø™għŃxS Kôc„†ÛŒ—².ß…Ìÿlý*¿ =›I„VåD8 Qƒ*¥U FUˆ–´MSæv 6“ -;W£©,ï.nTO™Ve8HŒŽÞÃxe©–Ü“ª,§)˜IÖu7–ôêX‰x‰y“`Olìî8|’HK§¦E–€vSèFÂg=N®Úm¼ÛF ?æ[mœHµÄ‚ºAÆ¥ÙÉ|£­•L¢n Ÿ;Ã:†À†o ¯ä'¤¹*űû"Mƒ™—•š4€êȉqŽ‘÷üÞ†& | ¾°ú³i;w{;„ l Ûû[ÞZ‰Æ#¶ãö¥{÷—W Æÿ¸a {?.a°ç ãHÀ؃°ø`µ½ˆ>1A&ð³ä̘²”tÓ˜ÒxÈ幇ìée䱔ܘ¦åKMÌQ3šB?W’8š¶*+ÔHǧ$ËÈ ZyëÐf¤‰çz9\8²œ£åÞƒ…¹5ûuóråRã|CÕŸmôï†iz¸»ÞÜ…ã®Ðã:Œyw‡7\ã¯ô±‹Ü‚åÛ*4N€ë>mùìØ áàà…êk€Âby"z͘f1skp¤¶^“š™š%<5œM\µgh§2ϘºŸ__[Û€ÕØò¦Y´; öôW÷6 x³Zƒ̾¾Ù—¢×àKhrFo¡7Ñ^d ¢éÐýòPAÏ—BÞ4´’^ʯIÖJ’=’–ÁûdÞA¡b@yI.jjÖ44ë+’G_+}ì ޾̆[é·ùÐŽ[2ÒÒ5mšÄh”aê„0`Š<¹ˆ…Ô)É $›&d$e7tÄEv éuh˜NÍÚ¹fe¸BS(ð/—æbó¤Š ñì—ܸ{µúÀ°¯·ô¸ ®Êú쇜{ö”£gK™;OѳàÆÓ6üTEZX|P¤¯iœ,9Ñ4áþçØ½´îD:‡ÅyZ«á,ì§8¯ŠBn¨h=æ†ÇÎ l>ƒoÈ®Ñk…¥Eõ9ÍL0{ èá¾ó,(:φi°D[¡‰ÏC1Þ…DP¼KÿtìÕTúažƒ%9”ý´‰s‘‹äÛ˜^¢X=}í:‹¶Áœár-Ñ´âØî‹%G€) ä"‡‘O9ç¸ÐgøU.'^ñÑ7íÆ<—÷Ð+ü ½§ÀIjȧ}¿Dê+à•ú—ËZ²4©©YžKš€T³ì¬øX‘——WbÌô •Ýp¿—æaך MÊj|ýÂ÷Is–æ­äìÊbRˆ0ѬäJ%e¡u åeuu’Ê@á/ Ín²›pC„@ïáÈ;ä>ÙX¤ðþ´ PEFÛax|¸¹ñ:]²¾‰cMØM“ü¯5w‹Ô»ëONC¬e[ænÓ}ÿ¦€÷!"–†lž4óÎfÈÏß:ÿí-ßA4î#| ÿÚÞ o`EmÛ¿Ûj»ãïŸ-ë:Þ/àݼşܻ¥Ž÷vž¹Øí¼ihÿOAB‰I h ía¦°Ûa.ߦœÁŽi6½&³àAz=_ÓQt3ç$¨5-“•H%2¹4B;£xžMŸøGÆÓ¾Ãõ¬Oà[Û.øêbÚq+ÍâìÂ_#,¦9¡º›6¬aOØ'Bùаàˆîâàw7OÁ šQpé›ðÄGÏÍŸŠÌÐø«Ë q¤«¨óÀ -Fls4;˜‚'à0„'ÆDLj$^‘Þ€Zíx>w¬èdi•°X_™W ¨÷{¡¸1Ò£qk¾ø ?0$8 ¨2¤¶¾ª²¶>¸*P8ꀡÝ8é܆ž?¬àOãêá$Î÷Gfrëà~Înn ÚÏA¦ÜúÑfãYkhÀ C“8ˆ²þë‡8ǹ0€'áãÌF=³Áâ"ÜÍgΛÄ-Åe2©³‡XÌ'h$ÉžqÑØ¼¦B6 N¦ý|þú™æìÀ$Ù‚ù1J\xöõïš ÷›^I'ñ!›ô­qÑ.Î¥ÎøZq¢¿`_q¸;pûŠ|:¼jEeÊ+îj&ßHµí—|O)ÑDîI¯®è»IÔ¦÷Éëùõù-µ5ºN0šb[¢ô!b=w™‚)ä]u¯kñ[Ú:‡¿ähx%èGšš.RÍèKþ§»KÅ`ØêíµRÉ€‹Þø|NÏílÎ<°ßþ`e×ìÙÛ\QÞT/Õ{ÇÇ¥¤Ä â’¶öTl|VvcMËáVæEÃÈ6ÂU…é¼åLçKMÝ'Ñ9Ó9ɯLÖúÎ>ÿLç6ú6Ÿ'~RË«ª†ªXà Xð.á[W…—Ïn+ODô @¬FôL¿U«óÉqpt·4?Ò)ÇQÐu.| ’‚ùw{y"OgóE‹œ€Ч²ïã°áz¤>®æ75@ŸÊŠºx=&9 ©’Ê–.ýÅê!sïpm[S½Y&HKÉJ(ŒÌO¨Å¶]:<]Ϻw ¿E«ø›JBë˜lü ¼'«Z£»¡×U÷F·o”Õ]*¡òÈ­)ÁñAò ¹Òì¡Ð&l”K·„_+‘€MÂ۪ȭF^#¯Ž?ŸÂ¸5ff£š•Y­hü—ƒf"g+9ë*¼¢g=¸Ï†=L¿Í–¹™Ÿ™—‘‘V¢)ÎÀ¡oiŽÒ_Èô8ûÅJ#b”1ª$WFÆÖjÉ©¹`€¢¿$±Ž<¸÷ ý^ƒøäâ8ïP 0æv¤WñQ@w(¡P ‹Øfû[V—ü8ß¿ØPY\S_Z^Ð ©+VC+mÞ¼È3Û¿zÀ3ô•vÀbÓÙçöüý“•çox‘ÛÎ 7; ŽuÕ]Qæ™ø»‡b³eöÖ;ê9QÙZ¸ªÏ¤¢SŸ?”ELÊãžQ·^j ¾©¯¯ÉÛÁÊÇe©³€§Û´Žq›­m´Üç.wÔF˳·ÎÖw¿3fߘiçÙTüóÛ°W¥OÁçÏÃIçYt==‘?’º•Nå¢I†c?˜ú»I—_gÁS÷Ù´¾ÌÌôÚ³k°X.\7|øiûMpÛô›e·^³Þêî%ð÷Uú+6”&˜t|ÕÒp PwíY¼ÒiÎâùB´ íæDÑ“˜.úÒw¬oÚÙ§7þ³ûýÅ÷jÒ0UÅpÕOä͸Þ1(}Œ¡4qxÿ’¼,¬¡†Îb]È ÙšpY0X2º½&4p“œŠ&ϧVeÕ–Ô–hÛ™~ ¥Ë%åJ·èåå* ¥£¢QIpÖ–Ô‡PªQóéL¨àœÇÂ_ëIz ²Áû¬j¡?>ikïx^5æ]‚oÀ÷ø'@yrEÌéÐö=‹÷l[+×Tx Kf`‰RæÓzùÖªÎ~agÕqpˆèª/“å;ë(Þ½Ký•­‡'½³ýè›öÎ oA XºK›hÒy­·ñ  Îõ:[x+½CB„"åf c4© 0 0 ×:{9mXè3mÔ*ñZg|ðz§cUèAÿü"“ågDÍâ’ Ñ7Á7àû‚w«Oל®k¹z¿lÜy> 7»5<ÊöPD€0–©È™ß/×ìN Ìiûa“ªöâüzP JŠc>ÜW׋­y}ißY\‚eìð[=ÜXÇÎýPÿ &Á%ü¼ Å­ý}G(,m,h -²EZîÓlYn¨77îXâ^Z_Q\\QŸ¯,F&ä€lª¡¯nðä€í§Hk‰µ@´]æ vHq6ÍÝÆè'ÿ ŸõSHeÐC¿<í,½Roo¯ºeÌû”€ü×éÝÎ\tad7g;lBËIÞßnÁå¸hËY>ŠãÂ8øçaíÁU÷Ùmh#ÿú@]Ukß•÷›G{XàK^_.xà6\¶·!*Âäm‹jŸš5[òVƒiàµÈ%â"‹@ïõ»G•tž>ö NÍüý#¼”¨”HeºW'jjÔ× 4Å^‰º"ˆëïKì„I<ÜÅ÷ ô/—ÔÕUTÖÕJ˜Œã?w,Oá;p×›ooÙ_°sÌMF¯!g í¶*{a‰OQx—çl$4äÞÔi¯¾È XÝÚB3ø*t>§<'Ê›z·6Êe;¿i[˜O!«eؘìvÓõ»Bšù¾g£Ž€(hõ.|é’9õ0]®pÙ°?D* •†V×”—UWKËEÌP”1¢B›vö±'põ‘c}Œ«c~ÆËþÄÙÌ”Ãþ¶ñ ™ ™¦Iiñ™±š˜ÓÀª šäLEiXI< ð‘•nµ>ÂÛœ¨2Qb¼I|ÜšÙ.;pÍ'd$fe¤¥ffŽíh½v†‰èb®m×ÓsêB°kÅ1¡§Ñ7ù>\g4ÃóÉD¦ªÌЄY¯ 3›b›ZwaIˆ6²5ÌÍ4iâB‡WW¡M.6k­…5Íuºê¦Ë‘Ù&{×x‡X¦S’ó7ØcR⡬Te‰®ªY\稢ùèk¾C¯¬\¥¾ønq~r\‰`üãâ[áVXÐØbplÔõ1oö𺄵Â2 lM“§R¼wÒ“€Êl Xlí°ÝÊ Óë ¢nñIË!û‹âë ”¦–§v¤L+Å׷ܸ‚#áÚÍö°HF’MœS¢rA+“¡€¼ôá9+¨RÆMòJPF+•aÞê€z Fsy¥9éG¸ÐTFäϧF^™Äß´ßòÜ#àM†v—°w©ÎÝhÏü×ß|Í>ÿ$¨@ljO€O½ÿ?ܪhQõ%‡°B˜Ú¨ÖC‡J£‹wᮻƼsõô"þEt“ ¶GGZ%c- Ö’V‘…àß½O~‘™d+DÅL&:fGÂÃÙÑà,µ$(åi‡(ÞìÄto_œsP’»š×Í=éõ™Å…Ýíu½ è"+|uâf C©¶¸¬Ë¾fÕêÝÁÞÂ@·h¯øåÔ&ÆùÆÖˆß+i½°¶ÚTÝ»‡ü’~†^äÆ^Lj-ÔÍN¶–(|R©¶Ùª:@Õ––Õ²êX‹ž[=½&I“e Í÷C‚«GÓÒ@âRâ“beQ©J@Ùx:yVK:›ËµýB^ؾ‹ªn³Ð[ÚÐZZQÖŠ©ôä´Ä„Ø„h5ví>J'à|²·UWÀñ©™ 9¥Æ¤Ž#Q6ŠäWÔªcc㣢#…¼j…**>ÜL¢Ð–U”4b~Ÿ¡8jdkpö56\€×Ü»ßZ~ÊòîûçÏÞ½³ëÈ[Â?þ@£Í«§Y~Y”0¢6¦´S½5µÝ úèœ&hÜÄÌ'[,G¾Íþý6VÝÎGôö9²¿×Z˜êËo® ôö òò ªki©«mŽÿQ‰<€q2ö_û„`ÞŸø‡ö!fZœt=¹ÚèÒ]h‰óeýÿ:ÏûãCT1ê8urPòÃüf–*ôQðh‰Þ'ƒ2b/“ùô×’6ê\pQ— i±)щQñ¦²UB Hête&ÅÛ—' Ê’˜íN‘G ‹Ú#qµ ?›ˆ,r¿+ê)Ë—x"]AL¹™d¤e2ݰËF€wq-;qGìq8È }T8^€â:8¡VRaÞ/…/ó† 8‡ï¸ÑC¼¸/½¢.¬=¡!åkŒdn4ä;žŠµ€(z¿/ÅKoô Ìw0›»ÉiGP±¬º¦HW›"L)æä‘€ô”ô„êúò.Pt1U¶23 Ešla²ÈÛÜÙÕ ì2Ý6°ÿâPSñыަ½MmaÇÌúAgQKCu…®¦úÅëF?äï,¯¯Ôê¥Pòmþ^^í'k*à¸Á;‡ù™T¶‡A¹WÚÂQ'ìßüv NºÁþj:_“ž“šLÛ´ê`q˜Â7,"=G$TÔF•'6Ó[ »ý«lÔñ)Éjaå9ŽCCV ûk«¡¢ª»‰+pwÅÑ«pOù-æÃ˜·ú}vØ–ïÌ· "f7@åx׉ˢ²ÂõúÜiˆ³ò€å…¦š‚ÚZa__íU,î Sò“J¢K’ªÀ!P_ØÚ="øiªI?÷Ôð›übyALa\©:#QˆÜ1u£¯´¦ëýž/Ö 2Óó²²3(ÞÉ{ðct•?kÎkæ+íºxÿ6c¯ûtïæ‹øÍU^v¯nºÙ_R×~¡éƒž~aA¡>§„q5Ì%¯¬8´ëÒÝ;.Éñ[+½÷>¼¤ópý‡ÂÒj}~9“tK‚Nƒ,˜nè@' ކJ:¸¸ã£Ø£cÁÄ{l¸nãï`Æá*·0=—I:r{ZD VÎ×àÚ´ö&©)äÀeh*÷hÑz©®ú@ž©í•’u¥Q2u‚"F!D†HŒž…Á±E EL˜¾$»ŸI„'ÊȾ¤âˆ#Ó?GkMÐw¸œ«QqV£uîä/}üLÖŸïÜgÞTŒ~:ƒç|YZSŠLõ‘ù¡Ê˜¹\€¦¡éDMüÍcXö  :¸Q¿ÿ>iøáì6Üûùªer‹µv;$6Àxx—K›}NHê“˧ßëP”„D($ª¬(­B˜¯ÊŒ±”ÿ¾@Ç]އ.ô©8"¨9«ÈJí1ëÉÁÚÊŸåàÃô¶26,B3øðÀç >ª¾Ty |Õœ¤MêŠÐÇé UVTRY©Ð…FÉbÃ…nŠˆDïp8³B7”­Ë,¹T…´L"‘†JÔ™ L ·Ë”¤Øú¦*2܊óå™Ñ84QȃEEÊšüÜôœ a‡¶8£)=uz¤u`@åæô<˜K¡T Ýt[=Œ«e ð«+lz=‹Œ¸øôúÔ¼¬3º³:}^^aV ò³â’’’â… 1I1 ž’—Dè+Kõ•mžuû\]¤žÁO+…cÄk”9WÀln²2zKJb¼U‚­©­Q#J¼Ç–Q1Yšô´Œ 0+/]r¨2Ua¨X& vo ê?ÒÞxµQP¹øí ¸#µ û˜;åç¹z<¿‚ÿÃ_iÃq&oæ ˆ'õuÂòÖ!N¹Ê–ƒÝõ£nψ,òñ~RƼ,=ÊGÙP¾Ž,Sc·F——”ÖW ¸žbàO¹4øuv6•jü ¼ <4 N——Äd*iXd”,"OY%„sfr~nåBzΨÐi6XhYˆ$ô—ËÜ`rÜ`²'7XQFsz꨽µâ|û”¾éÊt×¢pMøèÉŠààbyy^If¶NØY\’Ñ” lCÂíãd  ¦$e¡•ee¹ Åq:AøPb%8Ô’¢MìRèbKòU^\RYQ, Oˆ“ ]#”I¾Ià«Ü®úæÀÖè¾ÔÏ›’Š’:1õ ùÿG|²B‰á8:Æxz)Ì,…ê2˜^jE…KŽF4æýž/ò/ ]>px÷€½ 9áŪZPiÚÕT{ ©F%OJJJHDD©#@¢—W7èôG­»Ö-±²_o£|{«@ŠA(Þ[ì6¯ÜÇ/žu®ôÔ>ß@[/_üÚ™š,AQ¡¦Ra%â©4Àê¤óí÷¸y@V·æœ€7<æñëÁ!ÿ>§&_¦|ü¼<=ËOîø6E•ƒ:ª½¶¦]ðOÃêé­ô߃»±| $™~8\ãω&;å;•z ‹ÄÊ&ñ:dnÒÊ=_hŽ(OhÆÁï‹ï¡p@5 iFTDæ”Qþ»øµÖyÎ`;…(çMk|¥ùu!‚°¾øXÔqp‰ú¬ÿô•ú2upõ(º^ÅÀ¹1üß—‹ÆOAã¾åørá´œsšû3öLŸfôÆÃtø"<óÄD7$ÏÂ#gYÇ.Âþ‹ìPHð‡ì¿øªKÔÙLûA{A{ÍW3L†f}QÛ›ÛLÁ º1¨û‹¯LfÌò¨öÌw¦ÀO½?hÖ&öŽ_Íròަ`_¾W­+7Â:þs›—¾µm˲¥[/¾w÷ü…»L¬® ~¨IŒÀGÆ<Ùðrø:ßv‰#ð>zy]p_LkâûÔp“NÅÖJëEíŽåöÀø„»YÙu×ïöÀEáàä´¬¦xIÈôÞl8îbgõÅ6Ïns]‹ø´Ùm0ØyÔˆ+ìå_ë\‚fy½èy‹Í+ÜîÕ ëK˜ L·Üƒ&ðSß«î<¨¾F7+¡˜Ä:ág_ù£r|Ô Ñ_„Ë9;¸ˆi†&.÷-?“Ü~ø¥2™ŽIé>{þøyc^/Œ~‰ü§f8§Œ»:+jtÀÕ'$OöpȯW‡ŠH4m‡5š¸¬|O¿¿°QR{&™BÇ~« ç[iþ¢ÿb­RØ[[ZRPœÕ‘ŽµÐ–Ñ™¿ýv‡ ׆k‡ùÕF§îÂïïû ×öµ»|`5:5éuº<×ÔuðXÓÞ…ËݶŠ’cA ˆÎI(O¡x•$õlBf“Þ Ýï*‹Í.K$—%—Ë‹Ci°,LìÒxì›;÷!ëhè{“п&(og>~¯ë¯NúdëÉ×6ÛÛ ¼böƒÔè¬Y i¯cbb#úÕ¯y©ÃÇFÃá‘Sáä¹äÊ â“¢ã£QòˆÌÄogT´K<3Œ:’¼J] é’’´ ¬âxÇíšC&pšÍ[£T»âÉ&<¥ŒÖcÁñndŽ@­ænKLÂø:ÙªÕò¼ˆ e¦ÛX„œè•¨T+#Â|b,…ØPÁ-ËÎÖ Þç© \U0—9€Bøp¼ÊAWGÓ˜µGÕGŒxÑðȰ_á%J Ë’åHòMxkò¥!Y¡föÀÛ[¹ªåæÕkËA>(LÔÆ•G›ð¢Ã;µ‰•fG@m]éMÜ‚ßÒ{0¦ÖÑ^ü5–»Ö®>¹ëÆõS§®Þ²<¹j4ós? “‹oþº«¤Aªû­®(Ñý‰³ÇÃZZÐâ#pÆîä»W˜!òåôN>ŽïÕ€ŠNΪB’<ëÓ°q‡“ÈCQ¨*)Òæ¤1A€ %3%dPyåùeåJ± œë'–R¼œÈè˜ððIîu¢ÎºšÂºFA–~T5— 5åå2âƒØ¤¸Ø8ElTR$ ÂúŠªRíåJÆÓ=‡YyôW|xö0Só¿táþýÏwáÒI]0„_/¾º£Óó˜•iFB~d*ûŠ·«¾&e¤€øœòzmIkOmKe( 22âÃäa Ab¼X‡Ÿ4)Ù„É6Ä'RgùŸ-ðŸ¦kf~ oóÚsÈ÷‡8hù£1ýâŸgb†pŸ4—f“ðÍ9ƒ$zs>®|ÒÄN¦r3NÞÂЫžÍ­ Û ¶ß:Õ*ˆ›j§‘èD•>²~pôÈÿ;“÷}Xù‰Æ<ñÕ'Õë/É>žøŸëÿ ¹Áß¹?ã™ÿt‹NUuAŽ~§ÐÅG¾¼EO9¦k àîð•ìÔ‚½çp$e8tæÃ3-–9ÂâË\ IÐĤûzdûa a2zqßY Ç»]\.,¾ÉA‹èµ|d‡f£Y£af£ÙÐ ÿ™ gCkh…fÁ7ÑaŠ+oODæh1ZŠ&"š‹æ!c(€Kà h 'ÃEž4¾Žz‹dÈ_9q$åIGÖ1GxôÍð?˜ùŽQégŽÁõ7­ß‡/ó~vƒÓøÖ0o9#Çn™wù£#$zñáÇ1ƒ›9=ðÛ_’sè ~yz~Ze\QŒiµ²0Pnb±›,:£(T /Œb´n86ÙþõòƒýÞñÛƒÚv— ytO}qyͤ>ÇÖ];<Ä›½•ò†]A+0m*“z‡n”üª? ÖnåBáè÷?Œy_{Ý=ôuÕ]cÿWÞ«~gØsîï {ÞøhØ3ïYô€~ïçViQíGllž¯òOì*wÓ®µë8âv~þÍ)h2ýlœp¨·¤¹Uxä`Ógà p9âjÀ™Ð^y…ÝàÇ&~u³ííê|ò¶f™ºJÆ4©úýLѸíœVòï˜&#Òyój¯ŠÎP¡èPÄeþ:pæ²à±A¢àëåï}ùµã;Ƽú¿`œè¶ÇƉ¦üã8Ñm¿7N”÷Zø£5z FÂ,†»öŽÐÚC{ükÙ3¿ #þ…ÿàýŽŽœ}|7äÁeO‰ÿêùôjÚíi±é)xí<‹ÞvžMûàà<¬gú·q͇z#Þ¡ÿ©ø¶/·°X¾âÌöÛïœ=ýö;g– } Ø[îÚç°ÛjßЉýCÇ„ü­Óãnü¿æqç¢3pן¤ÿA…ßxš·´zsGÞ½¿` Þ„xèðT­ö_eÎƱ=fIƒÁ’ü|ÍŒLûSÔáMw€M4°{ĥˣ©¯{ £x†è~%©¨ß‘TþIRçaÀؤ‚º‰têù‘T.Á懓 ž‡ ™\ð3zmÿcè…+oü–Uøo@q1vŸ&XF±‹!ó@ó5Ìî1æ]ûËÌ›ŽîÓ·þ8Ò˜ìG}Ô=¾øIõwð"¹‘?¯bûGÖ?™óhýd»Ä™„w{øh* çòÂês³;><ûô¥P N%CþC£üAßÙÐ×ÿ`ÁC°ü¬?Ÿ°á „|…F“ 8ˆçÞ¿wêdy'4=cÛ½ÒÝ'J*„ÉÔ²§J•IÙ@uY+–U¾®¶ö6Âæ)Ìz´tÔhõ çþ]&Ì€nÿøègÎØþeœ¹Á˜ûß’ÿíU¨Ð7ŸÊ߇KT½Ë4ÔÃeªªÿ­eª6ýÆ2U £ËTñ&Ì~ðïšä_84ô0ÌÅŸ“³†§þÁ I;–«\wÓGÝ—>ňÿíÄ£¬0ú·÷º%wzˆ7û*åuÝúÂ&`ÚR&ðÝ$y¤•0ÁæaSrsìÃc& àž?ªÓ1ég;öWpÉmƒçÿè1KÙ;à`dëXc«2±aò:÷©+.$«“KR*.Ût¢?Áy ²§]F ˹)缫¡æ¢mü*¦ N9ýêLÿ‹ {ݼó4aùæhp8Ðã¢~¦Ã@ zÞ0æM„Fòy_§äh@¶ä€oúN¾#/1[óí÷—|+çþ±…åÐÖÐD¸\â5ÿ ¡äÓ†ÔF-zhÙêuš¯7ªøÚ~`̤×áØeú€+qw—:j¯ó1!<±`Äœ¡É2µUœ{‚3£œ‹ƒkëµUjj" "‡’s[ëìZ¤ÀÐUÓqšâíÛ‘V.0kå…ÝT6) ‹ŠS*T­ëcÒ·jȆχÏ1óåì!›M×C1«¾­$Ì„ƒ¿õ0²à‰Óç~^`ÆAÏúö_Ö2ôÔ¸ÿaž‘~WWhü 2|%øRÿ1¿gñ»é½ ¹0öéqÏÿmüî<-$ü?³ÈZ=ìþ´$ä!fØ¡w˜¹ý|§ôh ¨¢à¤*=kÍ‘’­d*+->TˆrI UÇ»$QhõKñ0¹ø‡«ñLüU·TõïtKåý^·Ô¦_º¥(´žöÚ뱯ÐÜ?½0jp½N‡Ü{_ÃÆ\ûoZ€éÓ íŸÈo³Ç’‰ ˜ä§þKy%ÞÜ‘UÐê‡æÿ·Äô¡—?i0ülíod6ìðÄü².Ü«7Ê[wêÓ–ÄÍû—ÄÝô󒸺?²$îyâóŽý›Œäú×ÿažyð“gÐIªz(ë<ƒVµLotéScÞB8ƒžôÿwwíAM]i\*¹¹UБÛÈŠ³„eÕºêh­îª»e¥­3¾»¸** EäiE´hx^ŒAyID6ò¨ÄKQÉd«b«ÅǰØÖ÷îèúZëwã vϽÉÔH„@wüÏî9ç÷ïu~ß÷‰äêôêÝ¥ÅW¿ªú]CŸ (Yš½>#8íS2 ì¢`“às">Tºm;DÇ˾ÀÇô´00`OÐHô6ý;D†£?‘>DØÁE"%–þÿ‹¡cS·‘¾ìÿ5ÅhÊÝwa0}…®ÿRõ5Y. òøÄ߃žHϽ.$8ÅGh‘’GgÐ;Ù –ކ<d›Á¯/¬ê/ „8ípÑ ¢‚Þ»%Û‹TÜA¦(ˆ¬šüü/i²#hoš^On†™ áŠ4šfÛ‚Ìœ)Ê$`"|+@!’Ÿ(MLL MÄ?ö綃t!­ÊÊ:&#£„h*ªÃ¹N€ì7Ê”â-YëH´CH{Çn_€ÍQ!ô•Çîam“{²aÊš67aäè&¶qrlã´+ÑP°Õ®=b³´Þ"ØGÔÓ‡%û6å|ž‘áE±0C {@@Œ.%è&´BB kˆàë¢Ãÿ#+á©@ÿÉ’æÎš` l9þ(†œ¡OÚ¤ g¨\‹oЬu˜‚˜U°H· ÿ™¸Øƒð¸ ª«mèÛ}à3,8ÕEÊtM>83½’–à-ž" w9íCûm ôñ ›G/ Ñ[×ÿðSCý±‹ÎÇ®ï‚Kg-FoÃx4vu¨4r‘3Ôê&‹¶ 1Þ~  Œ ¢É%A'¯Áàóÿ¹V^ªËiz'Ë¡>›¤xÂu7ŸàŠæžGc‰ê{Ê…h¨UÌ…Äl¶Óܹ0–ð™xz] @Åy´ï/ŽÆòá?ü +˜Ahó–`–£Ÿ°]¡)p¦Ãi˜ŒêðvÿÎØÎÁûÏg ¡­»Ñ'Œ=šöAÑòûÕùUgzïÅ´˜ù¹[ìíWú³WŸiÄ6HߣݑÒÖþ¢Û´SÄX ׺uzz½²%˜õ±ßW9RË-˜ˆ”Ä;Ìsx>5 -ƒ=fuµé1cu•9l2ÿ€fhîóŒ…%Ȝ՗6F°å¹÷–­_ý6ÿ8 CHÈöØk°ûÓáƒò¿íÜUæ¸>*Œåê&–ÖV:[NÊ;iŒ·€¹¶T¶O°ØN·Û9<¶cÛ°•¢;:ïnaËWšô¶UÚ1F¶Š1um)b{À³!oŒŠ>Äáb÷§’t#u­fS?w3Q8d˜ÊNÖêßk:îá7 yxã%P#Ê €¸óCs—Ÿ‰€ A$A %á‰xÓ#ùM—X¾ëË’ŽÛ.–&”$LávpüØ5GPš’'n!9kÑ_CÈ_U3.ÝQýuóPm>Ëð·e(Ak7ê7Õ½gÔQ[‡b¡À”‹Û_ô TbWÜ(|Vœ,ˆÚÏ~Ïå´±ÂR~*Ç(ot¤ê{r*å‚>IQâ‚^š¦ª ‚•§`säÉË,ygBž(éíV[s™UÍí¹¨“,l ÔlÈïìíBüP͉q_UHÛêÆhÕ¼ØêљӉÑpm9Ð&kTÌï±Dx½‘DŒëD"æéÙ¢R¤D…æY^ý}{tÔῪGì<»7J~îų–`Ð7ž½¢ob˜"ãÌt›Žz"°“ÉÔ ¯7A/Iñ…—¤xVL –â-L õT;wJË) I‡JN˜þÝ<‰íÑ÷³r¨¤ />6OAöÑ`UøF[cü’ö=è‚ VÉFyÖ®œoªv°‹•ö·jnrã±3úÙ¬§ÚÇY;$au'bÔëêvšM£Ui6h|ÈgE^ê’fAšWÎÛp>Í‹¾gŽv]:…} Nìñæ{?4wÁ&XÃo9‰U¿ì?‡†¬úíGcü¨$ðy1ÁL«k…ÊÆÆ¨ñ}h˜m¶-ô­l|tѺoÝ÷Ô;ðn“9Fm¢Ûj I€hŒÂÒtV-ìå)ì3Œ°”,ý±_(·¡oÁf¼…{Ø;Bo™<ÆIF0™üÏò™`×0Û‘}ìun"SpªuÔs—÷Y21‘r¿ýC·j•o«{­ÞSU|w´&,ê¼*K7äëг^1_yW.ÃJå÷ô®ìÂŒæ›è­¨ð뺉ÞANK@ðµy£¹ªÇùë žš‹¹/gÇ®BgÿuÑ =nõoµúp ‚ r ‹³ ŽkN”æ'_J6oîÊÍyÁú¶ÜœàÛ¡aÛÆNë¿Ä×;*‘¤š$Òxi‚”š,KÆv¹©‰iJßÓ5•E§Êœ·eFnÜÊ:ok£œƒ ûIM¥k‰S•Ê“ôWÝ = ˜xö*&ßÁ>ãW­§;L6ÑaÊ´l²Þ} Ž™5lÒ12TàãØ„½ŒM`WØ„5”Miý‹Yžó-½:rcZÂ%‡z¢¤ÆV³’íä°ÝCÀ!Wp3\’Í ÆSK„rÐÍÁÊt;»›{íì øö®‰ endstream endobj 133 0 obj 20198 endobj 16 0 obj <> endobj 15 0 obj <>stream xœÌ}xGúþʲ´›@±²ÁÆ 9„b:Bï½Ó‹mÜ-Ûr“-ɶÜd¹—qï].’‹Ü n`zo!„šJKBBH¿Ì:ãüþÿY8.9rw¹»'²´;;»;ßû~ßûM ‡0ægȉ¯X>u…ÔÇý9ƒ1ç0£Œ˜Ñ\´}ùKø/;x£ «RÞ+Œp(Q9š ošŒ¢Ž¾6Š¿ñÕQ¼Žá„¾,•SÍéæ0œ#žÑ0£‘F"£IF3æ-3Zcde´Íh‘£‘Ä(Ð(ÒeiŒªöí7:jtÊè}£›F·Œ>7úÚ裮w÷uîHî›Ü ÜYÜ¥ÜÕ\+î®×›«äª¸±\ÀÍäpµ\=·…ÛÅ=Â=ŽÀ½Âý€û9÷n¿±±ñcc3c ãñÆSŒç/2^g¼Éx»±£±±Ì8Ä8Ò8Î8˸ÌXoÜj¹sÛ'OY)õ‘I<<oÏŸ?ßÂ%ÄâÑ‹Ub¹ÄÃÏb<þ$ö‘úûŠýÓ,¶‹Å O±…»ÄGl±ró›õÖk-,×Zï´X+öËœ},¶ºøH\-¬$®b?¹x¢…»Tfá3øÃÂUêç&QH¤~òiËåÎr±«_$VºŠýÙS,üÅ2_‰\Ž¿[Hä2g?…ØÍB!µø¹úº±·ÇÇÝ¥~ ™Ÿ÷ÅgpU[¤r…ÜU&ñWXà;nYµfðžÎ ö¾r >m!uÇ%ݤ®ìÛ<9§p–øÉ-b¥‚½‹ØÂM"÷÷qÁ÷ÅUùË$†G”Kü<þz÷)2±‡³ÌÍG,7Ô˶Ê_ßÏâ©·vö÷÷ 1\+5”zr‰B.öqŸf-ñu ”[l“ú:ûYXKç[XYl»I}ÿþÄ_ÍõÏpu LÊ>°8 ÐÙGèëëÌ>­‡Lì¬Ë W‰}ÎþÎ26‹›ÄÝÝOª0÷‘†Šý<°…Ý$®Î>Ë]d¸Rç•«³Lêgëì¨ï”zHýÄÞëݤ gWüö +W)¾ÉàwÛ'G×>ut»áÂí®ø}|œ U®÷uvÅu.ü#tn›¡äúÁ[ìÄVñØþT=« ±|ðìJCÑm†Cֆ﫟ÜÜõѹ¿^jm(·Ãð¹zðž+/}ªÐާ¾»¼×ƧN¬2œØì臡èëã¨ØùôU¸ngÅZÃKn¼“Õ`à þð~ª.±¡.7çdð´øÉK¸*ò1\+<éc(éñT >O×6ø°O‘ q¼ÚyðWààŸPCÅrÃgè“›ú }ªŽ@Ö ~†û=}øéw–® ¼ÂPVfø”>]JñÔå²§¾K¯#"×jyˆŸëžM+B¥n6Ö+ýŶ›W¸oY-óغFî¹m­B²}] ×ŽõAÞ;7û8ïÚ¨ôuÙ½ìIvs&[ì;åMûySÇ8ÌŸö–ã‚écζèíñá‹gNˆX2ËRµtöÄŠ/Oõ6V~uzSÕƒ³šµßŸëkÕýå¡¶jæâ‘öšþwvÔþréXgº}¼K÷Dwýý“= 1•CØ›‰UÄ|bñaGl!V ˆéÄXb+±†XHÌ ÆÛˆµÄÛÄxb;±Ž˜IL vë‰Y„%±“Ø@Ì&&»ˆÄ;Ä$b7aEÌ!&{ˆMÄ b.1…°!¬‰•Ä<âMâ b±ˆA %8Äb”x…0"–fÄ0‚K,%F¯ÆÄ2œNðˆåÄ(â5‚Oì%F&IØBB@P„!"^'^" ‚&^&œˆT"š&|g"ˆ!”„/áB¤±DáG¸DJH 7"“ˆ'ÂBLd D8@¸ÙD"AÈ"‡H"T„œð$r‰d"’Pj"ð"Rˆ("ˆð&ôDQE”·ˆâ,QKôMD>q‡¸Nœ'ŽD=¡#*‰‰‹Ä¢‹h *ˆ»Ä â2q”è&Zˆâ&ñ.qŒ(" -ñq‰8AôÍDññQJ$Z‰BC\#Îû‰}Dq›xŸ8M Úˆ2ââ q†8D´ÅD5ñ)q•¸@ô'‰ÃÄ)âcâ…œËÓ8éœ N&'‹“ÍÉáärò8ùœN!§ˆSÌ)á”rÊ8N9§‚SÉ©âh9:ûk8µœ:ŽžSÏià4rš8ÍœN+§ÓÎéàìãtrº°:èáôröspú89‡8‡9G8G9Ç8Ç9'8'9§8§9g8g9ç8ç989ïr.qÞã\æ¼Ï¹Â¹Ê¹Æ¹Î¹Á¹Éù€ó!ç#ÎÇœO8Ÿrnqnsaéͽ‹8ȱâ1nÔÆqk¸ŸáÀ¯ã™ó”¼¯ù2þû¤))%?¦ÖPu/~)ï¥^n2wHÅÐ7‡f¿bñJå+·‡ÍváÕÕ¯Ö 1Üyxñpøšâµ»&ËLN˜0‚TÁg¯Ëéáô‘7F½Q=ÂoÄYÓjÓKf«Ì$f>fÑfõfGÎé2ò¡9ÏÜÚ<Àüþ(ãQÞ£ÂGµŽ:=Úntáè_„{DKEQŸ…±Åu‹oRoú¾Y;†c9¦bÌ—oÍz«ñ-8v騤q&ã&+÷éxÿ s'xM€–Y÷NÌ™xq’p’~ÒñÉêÉ'§ÜòÃÔ˜©SNóœ>|zÑô;3,g¬{åLzfÒ̪™‡gÞœµuÖ÷³‰Ù£f—Ï>óÎÖ9&sç„ÏùznàÜ„¹gæí™wt3?`~ï÷…¯-<ºð“E‹~^Ü·ø«%+–œZrkiâ²ÕË_[^¶ü‡+g¯ì^e¾J·zúêè5Fk®ù¿µk?Zç¶îÊú„õ]ÞØµñG¬¬j7ÍßÔf½ÂúþæÄÍßoñÞÊÙºõá¶Âí‚í{¶×î°Ýqv§óNÍ.á.ŸÝ£v'ï±°ñ¶5µí±Ûh÷™ÝÏ{ý÷~`ßí°Êá¡c‰#tJuºíœè2Ëe¯K¥Ëy—‡®¾®u®×\ÿâ–.ŽrÙÝËc¨‡Çž+<ÿŸ¤Ý+ËÛÆ[ë3ÚçCßh߯ý²¤nÒý“LÈfˎɧÊT¸+NZÞ ’ý¼;øWå©«ë¡aadØð±á™Ã#N«–ª¾ŽœY¡ž¨VßÚ½&º#fmLt,/¶.N÷Sü¦øû ‹Î%Æ% “ôÉ»“¿nàJÊš”žÔÙ©Mi+ÓŠaÚ°þé@+Ó÷Z“Ûpο ¦ýø^‹ƒ}<½]Ü·‡,”µ² SÄøàZaÁtJ‹¾—‘ï&”†=Ô€’d€=*õŠhJ°EÆ\#‡õ»-\Öå¸]Ãé_­¥øn ¬Ü¾ŒäL¥©”dÝâi‘ávÑf2è¨%·¤+ò€dk˵™Â@~ãâ|‚TQžIñ@•‘DÉà r ªé/aÂw(7ŒIDÎǙۀC¸Œ‚q¦Ñd9¿3)?È:):Z¶í0] 7d›ÂümjqŠiJ““•‰™‰™Ñi {b‰3Šö›†ì µ ðV³è˜ìœš’&JÉHÉéT­\#q÷Û·{o¬Í//–WjÚ›¾„™7MKöåæêÓ¨aÌaPŘ\ô¨29 EPE#ÝГ}¨ír~WlNp¦P/ œc¢¢)9Œ«"Ý3"‹@ 5$HÏÊÍÍ¡7*+ªò+Í›Jü·‹P< ÜUa’\8²ŠtK‹Êû(˜NÞÞutþf{éwá0fKÄEÆL[àM.3rhwç€@ÍÞqŽú¡þì¡â¢u¦(#7€sŠm©¢PûtUmgÖퟅFMxEÂÏ,áðÇôWOˆXËiú‡c›­êŸG£4?'9¤%·'åGã& RíÝ¥ð–yN‚“LUš¤ Êó³›Sñ—” ŒoddsbA”ÞÚ¢.S´øºËU6qØÎiZÒ:38hA…¦þê·­M¿Csò•9ØVf 44Ú3)¨“UÉØÐ÷µ¤$%¼Àî}´6›~¹wáP]ÙÕ,³a¿¬Ú~¾–óù>¦Nçö/`þBd’`{Dä²X|å--¹87*\¦k¼_Tt%?U‰öø ½ŒeÊøWâŠU`75 %ÁfUäâ|JKÎÏT–«ãEÂŒÏyÕüAjÔ3¿ÔÉ´&wál8ÎGB¸l„`R1nA‘Œ¼”Pöˆ`OxäŠJà%ƒ×H¸_ƒ¼ne‡§^äY')Z]D | ÕØÙq}äÓŽ£…Bkt›®ã ¼~èÛ‰Œ&¹Ø,p -é1)ÆÍEmBÏ{õNSÇxIÑ«‰"lePÏLÕp˜yp6-åG{Ç„„y;z©ÊØ <ÝIÆ¢1<_û•®Z$#Õ€¥©Œ˜&zf1‹‘ ðm8 Ó_ ,Ç Qè­¯ÆÂ~ð#†¬Åä-Jñ¡O”í@óдàÝ[·„ãáªÒCgðCŽ8Xɼ| ®­2ÐÎe!¿PÑ=ÚŒ3Yg²M+Iû4UF)ó>ò–“ãsb=…6’N=¾Åö€BFó-Ð8‘ ºnùÓá†â¾^aâ)ÄE…Fª‚Aê@@í’‚HWŸ<Ñ —‹  ÔöÑp`1œÃíßÌ"Ó_Æ¿_ü€2ÂS悸h“) ÓÓâs0‹Ð&ä<ª¢(»C¨MáiÑ]Ù˜¤Sj$p#ºeŠ&`…Z=Ÿµû·ØîÙQ¹ØîЊ„ÛṢʲ¼Æ 3|×M 5“»]ÌÊ®% eoí!ãk@IøþmÔ€ ¶…G`¿'ƒÁZrINH »ñ¤ ›Ù>ÐÁ«anóÁñ‚‚ó¹Þ2òjlYXE¡¬‡Tîï©›d5·œBoÙä-·UúEzÅIÁz`ÕäwÈïpÄûà[ ºžƒFphogˆ¸SØéVéÕ´”ÒB•??ÂS­V‚hž˜»¥Ê.Ï·®šˆ¦!'ä' ñÐõòÉ’–£¢úŠ MwëŸsyP•:«Ž2/Ç~ê6úh9B°ö)?•Ëú©$¸ÄDÛa<¿%‡:RP\NZ§…jÀE ¾Iîß«Su ø#†hÙWˆ»ÅC±ÕG$0Oµ§AVNq~¦¢2¿P‡ª6£h¸tË6/¿ÊÖpÊïÃÍ-p¶žÃŒ‡¯Ñ®¶>!N8*ù•5…ÔÇ4$\¢`?îÓð^ïV¯6{ÍüZ¯ÍµDãÑø'Ãᨿ^„ŠàR: -m?j@YX¶O†2Ušº‡ 'YÎ6õce×? ÆÑ|ÿ© ×½^ùüðÉ€ZÎg^íçñŠÊÉ ä«á.=´LÊOiLiI0ù•gÆÜÀ•”)úM ö?c1£û×ÒHŒ›×¹!Wܼ +þËüé„&ÂÉÈ^”ìEC£sè\Äy2B$"7aã9@Ÿ³‚/ "YÖÄü؈ýÉ'¸ésኂ”¯?§£,xkv2x‰„>p,Ž®ÐYÀ×P˜à FÉÈsqeá˜MØÌ©¤+5ùmïôZÓ(¬ÞU¸ÌS‚ßñvØÛ)6ÊAUÐ-2¼J®… Ž0ãê1cÇã;bÆZÁ¯&Ñ`SLô†HJp@5U¤}Nth§˜/ÂÉÅÛ÷túÚ3ôÆô1ø}G_Ÿ 9½MÅí¢cÆQî²  6ùœÇNüþ½³íÕÞv¢að6Ž|£» žsЏ—™wht›NêHûx»ôUäêÔÈ|pž‚ït͆ÃÈ£EM¥y±‘ ‰±qQÂèð5ˆ¢|tòÆ­¶åä–Ž¹ëvËý…ž±.àj›#–hÂíö)~‹¬Þ‹à1š§4¦u•~¤ï: nPšrûVt/è–‘ïņÕÔ›TÁ{ãAT’šÕw´ä¢\üÊW(Á&¸²$¿á“GDXEŠBy°Wì*@=F l4x,,™Ï°¸Êüçß¡^Ž™â)c>&Û¡OÊ÷Y,õð³wß¶PYñãIÈnùˆ¢tðó~8â»y "…‚ádkAÎ!8÷€™i…Z>ë·«b4&GXƒ]‚~,;·bi—§®á¥vŒÁ[VEZ§G€3ÜJªélÈΉ Ë–ùEëÕ¢«i ftKöÚˆý×í²šÉ¥ƒCïTCŸÃÑzpw M¡¹û#&ÄŒ¡£7HÁWD±£4ÓÕ ™»~ФÀ«R*ª—©zƒù»ŠÁnàRrNA ¾V[E{É\Fn½&&pÁÝCßÜØÔ3N¸¿08«¦®¦¢]ÔÜ ´™3Á{D·®²ãðHÐY'­¡– ì¢WÔGt¡^ö;,gÙWv•gåÕTŠ“‰{L4Ý[&ž6Mé±×.¤ùþ—e-½˜@ehUoÍ_‰Ùï‡^¢½£Ã•`/p(•4*Ë¢ŠBZ>Ò5i:{NŸo¸ ¾¦ ²„‘ vŒ“Ðä6C?÷ÄFa‡}}ðui¹c¾²Rqlû§ÞwÁiЙ}­šBßô·ÓÐøŠyì2ÈcÊr t?_‚|Ñ }‚‹-̇,.Îñ-\„³Úâ .dp@KNOÉG)A~ŸÔâ^ˆA …ŸËø!ˆïé9°li)È=øÅÉPO½°B–ç_hEUa(˜E42ó8©ßBá.¼? á¸@2.<.>Ĩ԰ ¯îÊò‚ÅaAÀLª.iÁ#_’àÞàJ®Áé&]p:؟܇n¬?ÁìŠÎ‰Æ4ø“Ø{56KLé™YZ)Áw«™Ÿi'OOg‡¯®®Æ†®NI“Vp›ŒÔ+5&9˜qpÈÁPÑEUéç³ÎdaU옊]t'½œìKÈNjÆBÑË+H-5w ×Á/Ð9Ù“Í&Š䬾ݟj*î;!Ä @Žzæ/3ÂùØŽcíXÀÚÑAÎ?8X#¤»Â^JUVnFZVf®0·8=äRuþUÞî2™Ç–._:\} FXVŸÝ Nb/ë_M;I°‰ë½º;›;;=Y³‘Ï ¸e¸ a&|‰ËÕêwØüª_KÎÎTç‚ëSEÂWÙ— !T-? Úó¾æ'"{^-¿9Ô‡§cÿa6˜®Ýg+â= MH„!OûAK.ÍP‚CC*/¾š†›ûù~|y8Ž«lÖ¢aÖâœ'ä7y}BXlÈJ´ÁttŒ-KÊ™f (7K›š ²S²S¨§rûÔ”Þ Å.8·?`ªãÃÙŒEYWv¶>ÍÌàÕú©*–\&—­ßKÁÏKÊMNK®JÌ‹*¢V£×Ñë¦ÌJ´YN6&†±Á×¹…‡x%2eoV|&è¥ Ÿ¬¬ú ,‘eE‚3'MÆ%TU¤ħEç£]°ÜôÛŸt¥g1£±ö?ÐÏÑr>†³àµ.n?—9Kƒ“…ÅçØ4Á_FތӃlš€,·¯ACÆ9œ„£„ð Ú3+Š ó±Q÷§â¢ŸcÐÆæ«°·CøÜÄrÛÓŽû=Ï…\WÁ{-Ý­ºëà>ÛŽ“ú´Ø…Q˜®˜#™c4x¿°è‹ïŸdäG‰šìÊ“›”2ÿ‚²ì´Ìœ|a~QZ6(¢Ú%Mnî^±KC›B¨‹hnÇ”´¸z¾Å ÚA#õïfÑ\ÎoIÈ‹ ©r÷Yî)‰êH̺|)¶ä€âÜŒÖ4l"•œlKHI.[Ÿ©4]‹–ÊÏE—Ç–ÅšIßS׃\,»&“ÉI]|z\õzh9ð²i¾Ï~Îò*ùp:3®¸%;[‡35ÖDZÖ<ȺH68m“ó›‹C€»Á`î¡Á’GóJ +ÃB÷¸Eñ0(D£áh¬³ßstTTbbbr<Î!csŠE°ütéa4 ñ–îYæR%ëh¯©j,Œ+ˆ,Fç&bìQå5ÅMBÁý:kÑ  ñ° v—9ùb™ìDY÷:œ;Þ£é;*ÌÛS¡<:¾¸µ³í>NûûGÊåTÝ~bß¾ËE†Œ³ nÌ­ì;HdüËñE±À„%F†:!úØa(»òA‘¨,ÊkMÍ)El·Ë=Ù›£Ýs˜Vó¡’ù´êLaÁ¡,3ƒ_d9x‡MŸsµ´,E¡*B'˜a¦p ÜÕ¬ý:×°OF–$&g$7'Ä€`ããƒ|‘Ÿ)ô"Áå¢â«ƒ »”PúXàì \3èyU¸‡¬Ö (¸LžÍöë¨"â½Ø<ÁöëÜc{#€†™y­¬¢Ã2bÓcó°:Sš~MÊ*5yú ³*´HNæ$g'§Êäì8£B¥ÞqqáÊ𠸬„ÌÄtï}&ù…™ ¯KÈŒ×øÂב©Ÿ»¿WtÄöåÁ¡îIØê‹±ÎHÈE H·¯µ'5-+;+§Ì¯D–]é•«‘,]}Ø’q8ï»ú¸ïè +tç ëãü8./òqÄT*ðX6bªÙˆÉjžÌⲂ\JðQqyIV‰y[‘b³Aõ¸¨U.Á3 ¤ÁÂláŠ\P­Eò-†¢ÎêH1[4ºŠtKUç³ac°Ëo›X±q·Ð÷¬g•°öþâͬ>‹¨gÆaõûÄsÙî>»X}†£»+5ðc>ùÁ±—æ°>`Íîÿ'Bá’ˆkçêæ.Úf\Ò©)nÔý:œª }7ltö×ï û%<\ì×À]Î/¶Ê 2þ‘Ä¢(àTIáñÈ=0E¼UŸPrÌ@UQNWZ*–˜™,"ÏËÈŽ$Mtž¼i²)zFC"¾8)›-Y›ŸsˆíEî•‘ûâr£Kl¡çÀ7¦5|hÍÀ¥< à½Ì7í•å Ø]ÿ2GÙ©^˜­Öm&à 8äójïÁ\æ Æì ÏõŽÀIéíµ{‡÷"°œÚÐas¸sMææ§Y-¾}æßß|h—àÌ}Ú†ÜÑB4Ù£=pš %Wö|-R5Íw·‰\‡“ß•h8WÀmp(ÎŽÀÐ ½ŠÆ¾¹Ér½LU¢ÏLÉJÉ]€¼U|Á„UžtmR‘<É-É!Ô:È%ÐÉWæ (EÃá#¥5 mëubN3±PÀ?Þä‰L õüN(àañ: =ü*¶#®+Âìžôð6°žÚîè¸]áŸ_ç*tª÷-ÀõÈ)*X˜ Â(I™¢¶¶¢²6?1G]. nO(ŠïÎÊ0­ ÏŽÕHëm‹UÕ€ª)¯¨iPîL9¤‡§{”°MlèOÅ2üG.<‚(z!ß%:·SÔoBžÈË?&<Û€T¿¾ U8]JTUÃÿ놀˜ 1…Ëxõ¯¢‘™rSàÒÝÈxÉd …–xÐÿü8 ¾²â&â{&¨|…-pÂ'ÁñuŠBmôÅÊhz9Ò×V’[% mˆºîƒ3™Ç³2²3 Ó nù‹@·ÞÅùá].}4r›…SNñ](ƇÏâƒi8L)5ý3±<”ô|ÙoË›Æt‡Åp4‡ `sÈÙ|G$ãiùeçªÊâ8ëÊG{šy_±5ÄiBà,H½;Bàt­£!u±ï¸M]réÝlãåe#”Û×ywfd‚”L¡À)s1Õ¤çvÚÇ¨ÞææÞcõ‹÷Æ(¼q žˆá9+ª¼±Xçå²ÓÚãð½£yúö“¬Š†K!…‘À…íl—€(˜€ñ:‹KºNÈ=*¨Vi­»8@ꔿ±|ž056]™HÁ#oè¡YÁù¿9oU>W˜›œ„‘p³,®hÛAJ³¥ð¥l}lÇÓk}ö“îH´!á'ÀÅœgc^2¶‹l›Ý÷÷¶¶âc­øaŸèhÿZúm>RÿjËûÌÀ¢¯î»¸Ì2&†o’{k$y‹ ¨ë;“öñq>¡;¼}vá°9³o ¹ŽBéäòB×noH¥š¢äÇ’ª¸3‰”åÑoÈ‹ÚJêõ õ%ÝàØÞPëÙî«™ÔGAoòrX«cí Qý¡CA(Ø ¶øzYERÛ™Eôær¿Ðöëtg‹YŠ@+üؽ˅j¶ÿ˜Zg³¼C­éØ{ª¯¡¡¯Ç·Þ)>$Ç ““@ Ô19ùmû®b¹j`;´„‹1uïœ_÷í38T!$FçVÆä›góóSyÏ,~nv”ÚÍÀúý/Óÿ¿oH Äš~³ŒÂ™ØÎäÂ4ì&7€õŽ.+½wNó(äò%6¢¤`Á`÷N‚“-|wÀ[bGû«ýÂ"€²Qž„–"BÂÉe'öÐlB„X;DôÀ¢åA(imÒÄiL˜éð%¸£a„ «?•¡h„a†£WçÞñaW¦A/:r¬ñSp“zϾ{µP¿‡®«ðqqU9ImD¾;<ýÜåªiîhü¼á€HÛ\Q¬ÔF†¤ÅüxŸè³Ü߸€ LŸ J`Wæ¯È–™# ¡¡èõ…‡·_?uX¢]´ïLñ±”{å ùÉ… ´åì+EßýJ˜å Ö¶ô ètœþåÄåĦ$g&•Gg«@ ° Üà±ËÏÙ_é |ApUj}ZOæCåzmy1Ð…he~ÿgùœŸâBZBÛ|¯êÀº€®¨‡ÉT>¹¨Ø_e¸”ŸÊuS5_jªtàSÃïë:ý‡%¸ÈÌd×Xï IP˜;ØA¡µ$X(Ÿt+¨BV±¡% åæHú9@cßÿñð× $çÍ5(é*F§»‡Ùð ´äÂ÷Ø@—8¼2'-;--µ:W›U(m^à^ÑM‚ùÁ¡–8/e†T‘3RC‹À йÈjÞ0ò:óeš(›iìw9Ðe„@Å\eæÒròdlV<ð®!^[W¢ÉÐËô/m=]à,uuýþñhè2ëIŽùÞík„hÌêV`*5öƒÐøêÝé…‚²õ§š›ëAkAUiqAA±¶£Xgœêª–31•mÿèõ¼âêÎê.ÓÒÚü¬Nœö‘Õ€2£¯!ã ïzg7©L€›_R,Ó9uû‡@K™öh=‡}IïºÔ :¨&Myýέë\‚6¡ØÓûz p—{AIßí·Å˜¹øó]HÝå0Ì[ô@Ê,&…(ãÁ/lSB3fäs`3ÅedЃ–óýVFÆšÌÇ>}Úך.‚ëf?/¹Ž»`O¡›[°DºŒªáëÏ´Ô] AYá‘”-Ű£r‡·ížÅžÎh<šA)˜Ù¬Ãcjá,àܯ!ó[*ÛÚÕútgd°±;-Gn@åeGEŠ=—ãÐýhÁ@›íFƒ¥> C©Hò^J{V}ycyq Û»Œñs¹¢êVùœòÀ*¶¿ÿ>Ö,)÷.wËz;ÿ ¬Ú,£Fàܪ€/ƒ§Ëü1Õ¦¤™ (ç}ІÿL&-ÀÿXçÑǼû‘ ÔÀñË „àÖ FC·žn¨<¨³m®Vë==§øŠBÉOüB›%”à’Þ¯ÔÁnäJ±ýf¹2¯ÞKèÖæ[ŒE±Ø_.ÙyÚã ¸šb=>¾'¼Ó¯ITšïZJ nk+«=9ò¶õÁq–ËlÆî`cvÿVËñ¸ðdÿz“—4ÈÍeÎt{4 ÌÐÎÜ¿´ge§ëÃ-T ¹­Y¦ êö=ñ€£~Wsª¼«JwŠMøKàÊ»ÁwMjfþåÏzŠx§¶ìpìèönØ9Ÿ£¢ÀVe¹];5ðÒ€7z:~;Àïq¼“-²MB­ÙiRÈÕ ÊÊMwNb‰ ú§Ñ^¾¾^î5~M-µ5M;ulë?f/tÀýèc0ÊüC„‡·?8ACG8—N"¸ 9%1-!Í,2/*#PqñqÑÁÕN7‹ ÂóÊÕÑ‘‰ [WyîATlzBvvVZa1;Øqq³†Y®—j°ss„À”YÎÜ¢]q’ñ*Ö ™òðÔ sdfiÞZ]a½ÏITRÕ¶3mç÷B3ž 6¾,?©Ì¼ ´ä6–UiÊ÷…”šJ\¤áN@sý«?†¡¦ù…q¥€j«Öµ¶(««DhºAöDï'¨ï.Ô–†È…‰$ÖñõþMÌMr¶ïm l€ÓG|~‘`wëÏ÷Zäëáçìe¾P["rÚD0üK\wBUÂÏü$ ±H¤`*©)ÈÜwù´:¤VØPì]¸ˆÒAûüx¾ $cÚ®4•9rD"4¹!ã}¯lu¸!¿ AÛ_&°J­lJ9`άÀÅ< ' &$x……Ê£Á:àZî¿_¾/ìsð9ýÏBc8¬¹:*¸PX”V²¸þÒÜ3*__‰g­oSó T.d‡Ž0Ðy‡þ‘¯ËŽ ¡£$pU«<Ö¥ªŠØ9£Èщž€z“~Jo*ª.¨¨Ìk”৺ªÈðääÄäDQ¼:I ")o]`kkµ¶éøÚ&d´b{ˆ‡»ÐÕ5|oÒLj›ãqt›œ¢Ô{ãpõ ¸ú uh3ôÌBôZÝw=pìyØXgêA“oáë#‘ÌëÌK4âó•·‚!—ÍÂ*µ 5ÅáRŒ¬$Ç$±Î¿˜íÓÕt]ÚÚ5ÍÆQ¥ðÙyúmoš,ÏšZ¸á!¿ibzXª{p†*5Pkܽ7ï¬÷9ÖÝXÖÙ äÛ©‰è4oõ%åúr}n[Ö”‚¾Sº øÿL§ââžtØÊ“ “Ë(Èá <0Êdt„mP0–¨^ Mm}…¦±º4F^)ü 󦦕sÀ×ß<äÂùX͵Ú4wÞ™MŸÜ9sêö'Vg抂Œ[ò}&ÌTùº{¨êï}_ßÊRŸiÜ_ÚÏì'.즷ÚÚnßÜkwòäþÞ“'ìl%ÛÑõÕRoÿ/Ÿ]½¾ºFÏöØ©ØX¹Îü÷œ$Þ~ã…Ž=‰MçøãÁßïØÉ÷Hà¡•&Æ$›°™"K,ÍfÌ_”ä^ß•.Ù;Ùz°;X"ööP9$Îx¾Åá= »h$<Ãÿ¾¼á¢®8F•—+ŒS'Å€X–žŸ€)·0RÓo‰ƒ–·ãÀ¦_·ðNð™ý[xìÄÙ­ï±sŠfÔûb¼À±Ø¥ôφ¯ÓnvžJ[@-€¤¨f‘àL|]h“ïië–å`7‡»{P‚œ±¸p½ù˜%»VºUËöµW–7—%䨊Dѹ‰ ‹ÒTµ«Pl.$íìê­póñŽÔêñó'«ffò«6µ¶¾gþ8Zò3JÐ0ð¦7-—…Çâ É=XÛ{Fßp·7a _.m?Ô[ì=MèÅJBä×q£ƒÍîs!5™Î‹ÉKËNÉfµ%Aá¡i9 Q\j˜{³ª:¾˜}Ø×x´ËK·C“œ)ª9Çsæc»‡ÔÀÎu ×—µ›€p¥®î!\­=ó®ÒŽ,½Å\êßEÛñ÷l´õ_<€2KZP®ÌÔ˜éoÁ¡­WZZŠkjDµ7Á%Ÿœ—¤ÑF&–ƒvИßV7`úë[¦ûùï÷O¦3@zRnl^lZrV¢.*3 H( ëñ½B«ºïœtG¢PpêVÿ t„~ó퉈?§oçÖæ¢j¨«§æ xºæÖ½QXæE7j=ím‚Öú9‹^²0?6Å«ì>Xý‰¾GTVSVX¨×è±Ó& Î;}Ûo´5±ut÷ê¸êÖ½A¨¬cOк¿ÖáZÙÓWý1®CSk¨;¸þ3¬2~›IüÌ4i¡¨ïf¼ˆÁ” ßà2»`7݇¸$ « ªJrÓÌtÈ9€<—X¼Adbd¼ A¡¦áµáõáÕ‘Uf»¾SôbP^’y*•Ò¡#dGbeD™|e›ZÚÀáü¼ Þ6dnÍmI°64|;äù©–œ—VÞ¥@ó>d~‘LÏã=¡g§Wp_l`ží9a´ô1>s·^“ *ÍtÊR?eh´2Tx½ýœ3lŒ}3gèQ˜è§}Éö˜Kƒ1Vn3¶ûº€5Ô„×áóÁ©O»üêÝIJqpFd‰R˜¯J‹Q”\æ±ËgÿLJrÎ «z²«@5Ȉ)H.4\ ‡‰´»Aöô´µuïwo1ô6ºØ ÑH:ŽMý¤r«OšTO HMJKH÷Ú|!õtkRvb»RQ˜P (}™¦¾!¸Ü'"2!2@äï§VõÖ¤çƒbª)Hãé¨pO‹ÉVº`×¾Ñ#=2M\&+T¥‡c4(•oM`]InZVÔ¢ÉMÛ—ž8/Næí£Ž !5.-V·¡tRê‚ 4Ö”m¢éu?iaT×qÀgðý{Ü«ŒK7¾j`RÒÚw`¦Vgg§¥¦edвsÓ²@U¨ññ THìš}ÿåò]¸ V˜Ý“ZYƒpŽÚƒ†}ÆÿºâÀ¾ü¼Ø˜¤¤„ÄxaLd|PS2mPM]Uuc¯‹Þz—C “—Pâ¼#t<…†òŸ jÞ3 j2cé¯?äõ‘“ò`Ú&' o¢ræJž yï} ~æH'ö0Ë/qÀ§\8³žNˆKJЉr±Qá|šÚÛ-9Ý·¿¶G+ ,ŒOJNŽI0 ŽR'âfs ¬ì(H/Ë®¥å¦¤¥d„~2† ß+Uæ*Y@P°,8/¢6DÇÌâ=6p#¦ƒRÕé^E~¡™a€ò ö•–Õ¤èDûÊrSÛR“6¨%Îk;Öæ»§Zy¦F¥:iüóÃ2"% ’új‚ëŠJ2 kE5…YE€*å'ïL²Uù'ªA8å]X__U¥/L(ˆ¬*&”&÷¶$$î ÑF&äcÔhÊjõ!¥¾¡ª•Tä¢T%J@ÊÙžúÞŒÌÔt ¸´¤ôø ¿Ö“àDk2¾P©ÌK(báVVW\櫊HPËDNÊÈD÷„”ÞôÒÊCù5é ÒË«¼}½#Ò"ó„{ÒÃRv±þ™V2I•0³Ò\óº Çßr¿Î&„ë˜Yô"G§Eëª%ðMÄ·¯Q䄳½ò]ž^…EéééyYÂÊÂlËu¾:OO©Ô}ÇE‡O¾ºtäÚiÇòCÂ#)ÕY81þªª¬Pß<èckT¾m¬ï\ÓãÙ©ŽÆš5º(uB\ltŒ0$":DPþzßÚF½¾áðºžÅ³7í\jWðñJ¡JA×}þ¬|°ý)‰BîëTpØZ(øn󡨢æ‘õ•UzáßÍgœ™Úž¿y¼g©o–˜:é-d±H»õÔvÑRô:¯—ö§f¥>¦°…?@‹ýOY!oÔF'k@¨¡àºÒCgJC „y[锽)¾@J¡‰Á»¶z—v« i×Ýþô6>2¶DÆßð¶óá0´Š÷&ÂíÛÏuvÃ`| ’§¤ ›+ö1,û˜sú.ÌºË €Cè[<ìhQw³.Вס{0Ñôĉ‰uÍy- × ôD5øw>|hºõØäÉ®Z\{`f<¢\e“˜nÝþpb€›ÚØ›½yž:1×ÀLúò±ÍËVmݼfÕö“W¯;qÙ0!¢Î×0Áy;æ1¾ G„÷σ¯Ñ»ýÃíÁàv"r¨4²§1 —b”Í>'·ë—à«¶{6yî2: pÿ¹%4=ÞQØØ.„Kê"™ Ô¿O¡ ¸œ>B^®lÙ×^â³,M¢R‚Rd” #3zz°‹ývå ¸N*é9ÚWæ>™í˜}  ÿŒÕP[÷8½ Wñ¦óÛ踭bJ· kmÿa-ë9_ö}É…=ý"ºï×›p©–••’ì22’Û’sM[I†![É”\Ж™q Ó,ä¥ä±£À‡I4i59³~Ã)OQ]ˆ.ö`…> Ådrp‰KXk&ƒ+É©Œ?½¬Zrüä´ëJj5ù½ùØïè ne6cI7À±yGþnhæÉÐËáÈ&EU¿ Æä VªoÀÑcàøå{wh`å‹â6沯¼ºµ¯Ümª¥J±-Y(!’Šã‹")V§È·=™F¸îNHÉŒFeEHêÔÅ ¥Àì§O¿€üá]^z‘·^R¼ ê@^E޳²»UWÞºoäÝ9½òÎ ¶}VÖ+ÚáÁ&fœ=BPˬ‚ÇhdE‚åáa+(Ás–ì€<?ÆW²Gâéê¼E9P›Ãò:E0„ƱڀR4|0ç•":* ½ÅN“¬*Ì<òÅ©PÏay@®¼`#¥…ö¿ ä_H(g×çDE+½““âã‘dÀÌTh…x1Ñnq”` º‚Z-šº;3"T›üô‚<Í·p‹iE; ß¼,ÔÉÒéºéwÓD°L‡YŸ^SV¦ ;±SY«2¨cÊ´qóã ¥½òåÄWyD¨ü$¤Èó\KMË ¤òÌ óMÀÃ-äl¾l¾UŒŒ^²Ñjé¢3›>¸yúÌ6Yb è“C—Ší#ùlHåpÿTì¢Îyï³S¾!h]Ìf:..99)9˜Å$¦ç‰à ²Ï¶~ñâ=~ö²âp]¦°<31+&[—‰“4*¿,·B(8Ý\î.r%‘¹§› ØPnuþ]­µùµMÂ,ßBu=¨šœ*-%¸„èF:"Dƒ¡RURÙ¨­ê+2$xgÞçÀOû_£Ñ'+á'üÇ£=Æv¿þ'Æv™ÄJBc츠)Éi‰é‰fùêœø,@eedæh¤]6'D%ê¢ðŠÜ‚Ü‚ôôã—›Ž‚r*+!=&&&A.Ä­€‘CÅ¢y/\KZú‰çÔòâk a/ _½Î;M¢W—òàKÏZ`ˆ5Î[ž5ùÑÚöwk qcj¯³R¾£'ÔÊO¾ çûÞ:õiÊ‘Ÿ¶#KV.ÕzìSGA‡F×Q¢ËÒfdƒö“ÇÐÃ>³Ñ[žjtÿß6ú3úôþÑ%øqþ;ý^ G*AN%d*¿:Ä—?øž¡.s™ ˜C{oðبÅç!ò»Î~p¬Aj]**{Ÿrã2Â2] 2Üq€ÎZˆ†£aŸ,…#êjÒs[D©Y)”eäe§ä_5EKÌÇ=h šö"8½ ·C8 NNÐMÓÑnÑnc8¾ŠÌÑ"´G34MÂÁd\ÃW¡9œ&ú›…Ò.pŽ+¤GÆ>YN‘ó¬ånÿ¦å‚—HfÜ vÓõGGj>¸Éfxo¿ \þ•í5Øøå´û# Óÿ›Ž‡þ‰´¶¥¬@¨6ÜÝUd"Š"?=ðiôÞ:Ò 'Na‘™š ¡¯.&Ý/Í?Z¥JÊ«-è4$n_ºs  ÙF#L'¿´h ÊšFt«[·ÁÎ×ÚCØ?v` v“nö3áåìle¶¾3›|ÿåŽ |Á÷häh4ކ+y¿ê‚u³øp†±áïS“q«/„¢ H«Øél^/8;YÿB³“¯#+æ—î5hKh«ùërÄæ2Ýá¢s)Û–”hP§ÈsÆèLƒDÈâÁXÌÇ|yp×Ũ“A‡D²Óòzë¾/zMmëÞ¶·ÑÙZgšÙËú¢ÛC:}ÌÐK[öûðþ²”>®Ù¦¡yÊÝ[”y*QX]\/øŠ‚ ÊŽœ>5û“F4Ò«Ï=þÏϽü‡æ€^yæP%šÊÌѶ¼åX„¢•hå™Mp%\W¢UgΠUƒß7ÁgV!ü}Ó&Þ??Nƒ3'ñû­õîc’/û¼ÏÝå0³ïr™À,èbÇugóÿ·Vˆ£³Ÿ?·kæñÚñÛ¬öz²~¼ú¯?ùÇÖ ¨åpîß©¼áÿ@åQ«òÑéÛ]möÛÁñeû>&ÔâŸgÔqõ¢Ô âÙœZ@ìbR_° ý?;9­f"Öÿ,gS0eŸƒ´ÿ_Ñ0LØç=+]Ú+ࢊŸYég|øõ-h~™ ]™<º'Ñ…BÙ$pMNvH¤Bà²RÒ!-9´S?µå’ܰRýæâ b@}”ÇÒkýÚ·~lz¸¼ºì§N:¶¬¢|hH7ó;4;·+¼ÝDžüøý¿GÍüf5»þ©…Ô^;ùúWçß,¤Öüƒ…Ô›=[üDÆÏXE=Lj½C éPŠþ®‹æŸ[Òãöïo‹ah‚I2l.ñã}.,UÑ—rè{φ”šþÑm&Æ¡7§Á!j‘û¼ßŽq¸‡E¦åÈž?ÆñŸæäEÌÉç¹é:ˆîÄŒ|f/ˈ—1ŸÝË3–ß ½š±˜†N\¸«Ü…VV Ýxóã³g>úÐêìB‘‡ñÑ^Û­[ìí¶í°?pâDÏc¢'¡«¨!hˆa8|„àÖ;Æ LÑû8ÁúCbô_dÑüÛÏ…ËŸ¼×A!ü=Qô¦Í0L›g#l4—!m’ ig8ÇEÊý?ÄÁO xÀ`UZ¿”Â=ͨ‹†¾¬ïþ4^ ŒÑ Fów Šú Êø7 ê"¸ 7>YB€-!xë.|ëÉä6pžfRî¦+þ;€ n?Çb2n‘>_ ¢–ÍÍöÂY>†Š®‚+2zqÞõ°ÿ¥í#0ìâ»zaÛ£ñùã<ªÙÅÆŸ£HþãÝP’ Q7 #;’²êeuQí Tê[+<ôaûÁ> Éíj£ªÈèøøäX@†”ëØ^U8õÎÝ;p*®‚S¹L#ÓXuÍ"aüˆvõðpunòÜ×ÞÜÒÞîÑì"˜eìâé‰yìkkiÅÇš\DO&u}õ“ºÒ™í¿;½æo¿‚fØü{`ûSðýö‡ÏCÿ¥ÍºÐfXü;Í÷ÏÐp>xÀ…:¸ŸÞ’¢Î=üLM¢yxAdfjFjjJifqz Š³TR mTQ…Á0á?°³L!ãÿ{ÿ‡§&¢ÆÏ~ø¿‡aœ‰4?Q ‚¿ÿð9ºî¿…ßo0~Ÿ×†ÁP&_còÁf¢aô~ÿ68õ™ƒ“÷'zjp2üíˆé˜Ñÿ{@31 ž7¿ì~za4c<;©þ„ÿ%Œþg£qûó-þq¾õïaο&}÷¯æ_ÿ5ºLÃtyv“a²Ä°Ù.Ì6ð%òîA óÞo' ˜ÿq |˜Fdù×Üù þý;Gú4/œ<_„bvÝëcóçSª3ê™ôˆO×!Í&r(’ ö¾Ø†t?¡uÌÇ/Þ·ËÒíQÁS”ûFøÏþ!Êöhäp´ÿ—á?ÈÏGiÜêHÃ,E¯ü›(j‰øÐït‡õyÜù´”%ãéÿTÇ„`ÆÀLø¢øݸ0šÙø¬‰ÏÿŽŒÇü2þYUÿ—wÝÏ {æSý+»œ'>{ö8“(¯…¡}‡û`Šžs“ 7‹Û#é´øÎÛp4¸NÖ:A"½6npØ V€½ŸD ÔüÚ>ÎO.™ ¤Ì”\ Î7ÝÉ/„K:n^ÇDï¨qÔøäJ²vQeP®ä'øE††‚X›¾«.$Ó¼ æm¶›¨t ˆÚA9ó¥6¼ üd¶cð±)‘”˜=6ì—ð~‹*E¥ y&×Âã÷Ùÿw@z¿ÝÃoeÊ|ªò.ú¿Y•üüžÒÒ&@õ 3|à”œl›@)à®JÒ&=9»k’yg%]À‡áA "H¶ùÛ"°ˆ͹9]i” »½L¢ÉhÎÓ÷ñˆ/P*ȺdmH‘…¢H°#&Ê‘½Ø¬’tHÍe7p$ c¦?sS &ÝÅQ&G™~{ŒûÝ;pÝoGÃr>$AMPÙXJÇ‚óyø0bÀÅLáõ“ü#ÐÀ÷šï†(@¡øÐþļßí9[ 7c&ß›š™_5œÌ7˜oø¨±¥ýú %ŒÜ:à€«Šîƒïƒe8àg˜ü÷ÇþôÑšÊÌv@}qôm4Yž˜à)Ú¶Ï£ÐØçP[;éz°žBœ»3!çÜqÝá‰Kmp€£)¸½'¡·ýâü—ÿÿê®Æ)ªëŠC˜ýˆEËìs :‘ÝmSG"µM™1‰6NˆM $“Ä4È4ˆHBÈ(‚«Aà-áËÈÈ®´?!ú°iCÜ6èŒ V͈±:!3ç­šÞûÞ¾ýHÞ[ö»¿àÝ{Îy¿óõ»ç„ÂÀÄCÚ}È?{kzBz⮌dZ½-õÂ0ø ÞþK}NÚ)RY8`ãfPÀ÷dDЦ›H«l¹¶¡9*Ðɵ°_‹Ô ´i-h•I‘Ww0¨€“7Ñ~|9möǨöW%¼Ä.@±ì}Ч•h+ú^{Q-‚|Ð@,DñE/Àè.m›Vß{üÑ*tÿd zX´åáÆ'¾îüA˹kØ«í1õ5\-×u8uïð?Ì®ªƒrªGs=P}Gïù€ê¡Ç< ú3½È€ê{DTSJ?XEžßØÇƒ°$Ž+V0ÁÔÖi¬`ÉhÑQ„M­@«Ø¥ÚñŽúªúRòùçãSwÇÿ©>­µ¤”6–„‹i#­®(7Ü•úê“/ëfÅÛ °fJ÷ ÐÆ¡ë. éu¿Õ’wg†#Yü³³„7k»M•ÍÇu|DÓï¯n)碌Ô`QÍbãï_t?ýñÑÎúøçdЯ‘Gpƒü#¸é“;®ÁG"ó"¬kP¢¹ÂZDxN¹LC¹+å.æ”Û‹¾Dw|®Ü†{~b×4ñ×Ì.á,mÀŒSMÑØíÑíwƒ©{’­ýª´€¾I_ÞÑþ`«Tÿ>Î(”3Ì(Ž®É;whçoBìý#ê;'#Ì«=¥ì2iJ!ö‹Ö#œÛ1ްÊ÷µnmƒÔ´;êV¥ÄÞ¢Ó¦xÊ}¼øhY•FyÙÖýn‚µuÁ·íÁT¿·É5‘¨Úça'œ°kmþDæl^ ·Pš×ûš±ó-˜ì“é|ç¤T!QV \§ìµ‘‚' tNõ äŒ&á9Ùš“x±ãÔÉŽ¶ô†WŽäÑ…GBó óéBZm8TQyúÔÙO;‰q8£¦MÀx(à>´tbƒ<¬ÃÁõWöñwP ³’•_¬‚E%e´±\—ž|ø-z¯›Ð91³¶Ý\ZnzW×óª3=ÇBDÌ1ï¬ÔÎqø7/ÿq&`L^èŠe·qˆ=缡uÛ¡Ä•×im ÄaœR‰àT´ŠºE*ÀiKÝÖÛÎ×põ6ê¿8Y|Rl¡+ßr¹mqm¸0Óo¸üSVÃåŠxÃE‹Øì?p>Qº@ û2Z8å­éŸòÛ)NùΞҜ£9jj4ù僙’2ΦÕÉ»Íu¦ês™®¿¦´èL3a*ŠnxÄá¾Å'ì/êümÌ˶©M+A¶ä¨–Xƒî¹–ªÜ¬¼}t–:NÒ’^ï܇µ'ZKtƒeŠ™Ñ¬Pµô0Î9f•¡8ˆ—v83¹óÄB3{óz:dÏë¹"o^O6HûÔ%<Õ7ñíº"æó»ÁT¤ÏÕ€ý™É5òºð6:ò°­5eÝë]  }%×Cbrm®gÃÊ–ùm±F{Ü‹ò½†!.‹홉ýDk²M/˜ —}¦õ2§DõNþyZõÚ›|É7î ÇpÀ!³æ"9Òì&r‹ÍP¶½]u€Nâ}ëA~««©N]‚8¨†XUwC[cyÅá}U¡¦=Õ†zZ}¶¾¡YGEt¤4ni瞨í¡Á¯¥ 6aŒ[âxÍCq4zfÕAcìvW¹‚Û‡#Ýøs‹™ ÙÙànQ|«*÷PeÖwíXÁKÜ*8373#]÷óz•7å áª8¯w6&` §¤f·¸±"!Øk RÖ`¯ã¢Ý~|çpg¹t»ùÊÄÉB™‘¯€‚´fH}†òtÈ›êE?ŸÜ!/áá4ÁE¶Á W¦ùš\“Û3~ÓÌ&šáE³²qèÖØúÚÀ…~~ÿR; ä endstream endobj 134 0 obj 19707 endobj 13 0 obj <> endobj 12 0 obj <>stream xœÍ}\Çû÷.Çí­ Ë¹¨wgE±&VDÄB *Ø@¤WiR¤‰2Ø@Å "M° RìØ `‰b×XcbñY’ÿ;{‡#Æ´_ÞÏ…soËìÌS¿Ï3ÏLhJ]¢iº¹¹«÷× OgÇ^#ý¼]„S½ù¶4ßNo/Â#ðéó?Œ·§ÆnyÖŒ—5¥ÒÛõnÕŽ-hÙŽѼ8«e+´³‚N¢wÑ?ѯéJ555 5©šL­«Z/µþjCÔ†«™ªU³R³SóT T›¯¶Dm…Z¼Ú&µdµLµ½jùjÅj§Õ.ª]U»©v_í‰Úkµ÷"5+Òq¢¶"]Q?‘¾h¸h¬h’È^ä- …Šæ‹–ˆbED‰¢TÑNÑ~Q±è˜èŒ¨TtSôDôBÄ‹þOQo¦ÞZ]G]¡®§ÞW}¨úu3u+uu7uõ@õ0õ¥êqê‰êiÝ&OšÚ½Gž£üüÃ<Ý=‚ßèëë+œÂÕWÆ®žî¾Š®ä`Ž«·Ÿ¿«oPo…•««"ÈÃUáæéíªe9aúèñfŠnfã'+Ì\}]½‚¼=c=]}]»+ÜüÞª g?_Ï O?ßÀÞŠ GE ¿«³'yÈ5ÔÙÕ_¸ÐSáïàãHŽž ÷Gß WEŸÂÓ×Ù;ØEx=9ïæç¤ðð#×}ÈÒÔ¿À @çOÿ yãcSUƒ<ƒ„÷z’Ë ?7r§‹Ÿs°0šškAŽž¾Š ×Ð á=N® Ï@oÇ0ò^Ò”€§² Áž¾îµoï©puw pñv T¶+P¥v|Š:£vô÷÷S>ë§¼«æýžA®Þn½Ç{ú8*¬Écc‚(Ö;SË¢¿Æ4“à?¡“®³ƒ½ƒ}|…º¸:¹(O»z9ú;V¸xº¹ùú)Ï{û…»úº®ºñá@uW~uv ðóµqtrìçîçë:k´‹_£3qÐXg?òÕ±MÍY³:g­”Z9»ºxz{;:*›íãèLÚ¡ú'°úÚ$å£U¯˜L8ánU§e7F¨®ŽRÞ:Iyj¼òؤæåÎÕ×j¯¼ÏZùm¢zç(Õ£un²®s쬺Uõ®1u.+/Xzûqöñv š\÷‡1iÛ1ÈL9HK՛ƪ§ú1«N[®Ê¶\”ßžªË®5ƒpQ6ä­|ÖUuÑ[y§{¼ë¶¦êl3žª3Žª§U¿‚Uÿ„+T~‡×¼ÔWu¶NÁ|•/ö­{ºî˜”O«^¤¼7@ùíW÷® :Ô9öS=GQÔº±#Â|§îç2}ü(WKãÙnLÜ'šzL2 ò´2ö²=gÖd‹oÇ)cB}œ¦ g;°‡bÆ žì÷ê8S¿w'û!}:;ôí1ô›®s ¿ÕÖ¯Û<£þÝ“8]´{ûó3Å{R~*‘ºK]¥ÎRG¨\j3•NÝ£¾£.R‡¨SÔQê4u‡zD#j#Kü÷Jz½š^CÇÑñôZz½žN 7ÐéMôfz ½•N$~Lo§SèT:N§3èt&Eï$ž7½‡ÞKgÓ9ô>:—Σ÷Óùôº€.¤‹èbú }ˆ>L¡ÒÇèãt }‚>IŸ¢OÓgè³ô9ú<}¾H—Òet9}‰¾L_¡¯ÒßÑ×èët}ƒ¾IߢoÓwè»ô=ú>ý€JàawGÂÐ4ê=„¢³Õº¨YªmP{#ê('ÚIÜÿ,õu꿉lj3Å]f /‘HæIv°ÝÙ–oäÚh[£õ6ÞÝø‡&M›tibÑ$²IISµ¦úM'5½ÝŒn6¨™O³ï4úhx7·o^Üü§ÍZÄ´Øß¢ Åù¿µìÑÒºep+µV𭯵òmu¿H§KgIWK3ZlíÞ:…ëÌ¥k6Öì­9AóC6}ÚÄ´9 ¥£5TëhÑÎÒþ^§½Ž©N¹Î³¶ƒÚZ·ÍiףݤvËÛ=jŸÑþ¥¬‹l†l·ì„|µ¼L¢X®¸ªxÑ¡i‡YÖv¤;öîhßqvÇÝ":ýÒ¹ygEçA³»8w ˩.OººvÍÓU×m¯;[º5ê6 Û¬nIÝÎt×ìþm÷ z ½³z{÷¸Ð3¢gVÏ+½ä½õŠí­Ó»¢Oï>Ö}ûŽï›Þ÷ÿ¾YóÍão¹oÝ¿ÝÖ¯Y?—~7úìÔè;`Õ@z ÏÀŠAúƒâwœ6ø¡þtý³Cô‡¤|c°À rèZC±¡¡‹áo‡å+5Ò2fôÝpëák†?Ñ{ÄÌÿ72w$?jî¨Õ£ˌߙD™\7u2M1baÞÌ|¢y¤ùƒÑÍG÷]8ºÒ¢‡Å‹ÝcF‰sb숱þcóÆþ2.z|ãñù–î–±–7&¬ž(›h3ñ»I³'°jkµÔº½õë-Öxòöɦ´Ÿb7åòÔNS½¦^žÖkZô´ÓgO¿b3Ìæ’íÛ9¶gèÎØn§°gwf¦îÌq3ÛSöí+68¼vŒqé´Ïéçç—F.Ù®2××»nýÜæ¹q×us¿ã1Ìc›ÇÈÒàAKþv@Oá•>ÖûÕ‡_-ñF£Ò %ZÂÖ$è™DóËA—+ƺbèÍàÕ•>b<„Á ¿úˆ¡sÈé¹Ð’Ó˜ç#Öàb¿·•-ÈS2>›ÃêUíq¾½÷fÀ®ê”8F-™æêb³`Qìê0YGɶ脘-hÚ—²nßæ-Û·Ÿ‡€J©–ÐÁ$¾74ñMj…@ö h#-8GZ¬Ê&?+$ÒŠóûËNgz‘áäÌoh2º KFÚø[:ˤƒoHHO‚@ /AL©ñ‰ð„[ZýnⶈÅzuÀc±é³NÐÚ<¹ Ü9ÖaÂLüü'#ÖØáü»Ã늷ì”oÎÌÚœ‹N tÿÍÆ¬Fe”TiB†6ˆg9†J1É`¼·†ÅblÊ@þ ‡W‰Ä0’9¬^#SBÑïTOr“Q’{ó8hSuA z püqÕЫôÁs$¸uUÖâ+Ä8èWrUàaÅDò§- 5ô :ãæÐ¹ôÝM¸ÍÜC%›dÈÎ8‹N¢+.'ô‹Y)¥0cÿYt(à¨Ó^‡ìi› É o0 ‡[r0ˆ)Ïö<ÅÍ×TŽ1¸¥:˜1ÒwWs¼Æwõ)ÇfŒñJ ñx{ꃱV08 —б˜·1N—ÀV(% ‡:d†8Bj8ÆrX¿+¦± 6})ƒß #`L·÷ØP‹Å\Å!Ó]§š 7švéíÛ׮˕ 5‚'䯒²­Ûºk‚‚ÐEc3RÍÉ0¸î¸42yÄÞ©òì©=/¢RT”ºç(‹ó͸ËE¦»Ûš™˜Ø–¿|U|é’¼†m°”PžÛ9ˆàíÅx(ƒåøî×ÄØ€¥UäÜvГ(忚[P(<¯©dŽ^Õbïç «{ ¬ácæA+>Z+5©r?‡[zn^®wžÕwßäašôÖ ·ÆºxžR¬Ky44{kå¸+Õ{”ÞäÖìè.ÿä‡ydÈ7‡Ä‡®ua I°oŒ$$y jh6‚f)~!¿÷0»-‹ýÊ š?‚ ¾|ÝýÜý°ùn d†l}=-Yhì§"Š©©‰mÙë×Åå„(D;ÞCÇgÐü=Íoƒ9\lZâбE‡æå¸¿èJÙ÷>=±:GüÐzA³å¿dɱŒ wp ˜†œÑ¬-!™ó’–¦,?Ì®xÆ­½³'ï,ÑäáI~BÖÌYéÆV›™@hIó׈©*À-ùFLU£ª@19*€–U¬„gù@±Feb´æW«èÈwˆ®SÆuAƒ<Ç™[˜¸uA¤C˜Îî|ÁôœÙ¯ŸÑÏèήseçJ÷ý‚Þ"`ÜÞX\S>dgGÄÆâÖ4¿¡‹¿Å݇tÅMq3ƒ×¤û½n½†fr•6)»$p÷yQ…&ä0 B—Òž:Y–õ’>uï—ËmN™¦buBr]¯ê5Gk+qÉP<÷·ŠÅò8Äw#2xšž)¬f¬õ’öÚÈ÷N+õ<ÊС»N±xî ^)Â"³Ž*¹ýÈ"x@l`ÿgÏßÑ×®_äÓ¸ÁG™Œ„i ›c–'ÈÞIf¯ðˆ Elï™ö}åF½¯W™ƒ‚7¿+QŠ<,&&ïz ë£36p`ɀ΃çÐ º¾…{PZžS'÷*$·²=†pó0PjM­ÙQù‰0(åàà#@ŸoF¸—B|Æ~ò¯œ mÒY« viv±Î•H'ÜÉË»³i]Lt¢ :JÅ.EËÐdåè3’•öýE¢¤âãw*íWqh‹øž¤…ÁÇóvã[÷À-±ú«ƒö¹œÄSGä#%63M¦x$ç-á.L¬ãfß½>ù§Ãï}ôÃUÊù㼆P÷Ò‘‘ºÝ§™mWúâMáå2ùg$®²×[îàé¬WèzïúvLùØ2ý]P'¤ï5ÖlŒ©kg•æt>ODð®×[t •l:¹‡}0äúm1Þ «8£!#ƒæ{-ž…´qÓZ¡›º¸å‚ÉÁör¥cƒ¢ºT ¨z…Põ 9÷¡æZ•Ýü—¼5:‘PÄZ«¼·˜~å¸ ¡Hû¦Xä¾Þ;qŽ<1tKÔ‘p0˜ªµgAÂÌz¹„X¸ûÆ%„Éæ®_²~Ér7³ 7þ~ &ý>±9wgîΔCè(ºäQ`¼ ›ÖrIX’ÙÌIKwÚÄÊj|ðG{<…t¡”¨1éžà‚Ï8—™² x³,!lU$ò`ñ]¥#F¥aÅnYÞi37ÍD¦hºŸË’TF•x®–0©Z$s•Ðös0œ¹1{ü´0fž<&…¡ÈlUp¢ Ò™  Q›ÐÎe0kÙºÞ¹wvæBÐÉ£{½vÛm&‚QÕV%Àߪ“–GKòÑÖe[çn»6y"…~ás#"C–: VÅpHz0û£¹¶åÛq˜%Â,sZ<ÛÝÞzöDBÚfý!=ü¦â9H˜ë»K¾-l}øW:0aćj<ÇÆä.7Ü ÷Á!x6ñÇ`ú‹‹{î”È·ö?fˆîý¿<£ËUþ03„.ĉu1í]Žï3 Ÿf¥®ŒO•½D._³±nQë‹åPDp d²ßV‰<무õ‚"1•>꤉–äˆ(g4%v»)½:Á1è,âæWq¨tî÷\›cCv;ˆGuÕDZø„5tó“¿ yší‡&h·rëÛeRþ¥2âÖâ¾ïÂx¢.@ôÉÄÓ¸mš3ÉŠmÞÛÐQíã÷TQKbW.”auIFôžåIˆý~ïÞ‡òÊó5DRʯ@HÂpâO8þ5žD¿n“˳«^ :&кÚÓ‹À³«”<M0Ã[MÏg‹q7ÓUr܈— Ç0±*[¬¼Iõ4éš-ÜåøNÄ- Úa")9ŽÃ`O‡G0ĸŸ /´æ_«°E–ЭXÁ1FIúÍtìÕkæþ‡2>ŠàŒ( ÒOžxÐþ¨mÅì‡è!ªH;Z|ð@òIt‡å£T榕Bß ­ì•XûúL˜Q*»„õFIÑÖùÎû]KBÊ ‡»ß¯€vr~/QÅDÕàøJMè% ® £_¥1„×c…p4@8êÂ@O2HèÌ<à[Þ®j)®C,A.b)ËÔGÚ` íEü¶-\ÀöÅ›P G% 6¼wÅ]Æá–Q2hËÄ•lßJºt,=Ì=,*bî"yèB„LX-ÔR„MµFzÈnƒkªÖ¬¢ÐbtO;xù­\¸!‚…ž 6nˆ³ñ ßÔÜýÉI'dÅk³ã֬د]‹Ð;hÂJ!RéÁà~U…x _(C ‰ZêÂ;ÁúFs×nÀ"|MLP0¾Æ÷ƒÖbçà«b¸ª’I­D¤r` ÛÙꃄ#0ÆÛ°9NÃPæ) }‚‡ GšÕ‰cäXNè3\õ×Fºçtx¦ôâÞÜÓE;üd¸Jy¦Þo¾•äݘ³˜2³ ´r”Í>=ûõµÆš³,ÂMŽcñÃïZüèRôººñÒN¿«Zg›; õEv˜1<ã|½B¯r^_¸våîùÀ¯ÛçÒ¸‹vš¡¡hbØ$/;ÖËÞÑϱ>¡‰™ ÅgÊoÀ.1ÏÙé2vÚls7y ŸG¨/b§»~sãõ %°†¦¢w‚åy+»ÈÊé\Usfl•\ ­˜M{v&æ#örþ´ƒí§™Œ÷Ì:-Àê¸Åƒ@F¸ÔóçŸ vèòÍ+Üf†Ç|o'ùvè&†BdUN'ØæŠ´ø<μ×I‡ÒJ{Ì7ÿè=Á—0í.vf%˜ÞlJTöžñ¦Òó  Mœtvéo`é¬^é êLuo7 ÑY©¾2ð ×*¾€[\µ=,Íí°Eæ0Ôrq0v4 Š0‡°Æ&£½“òFçrô¶Ã¿@oh7è¬1Ñ%ÜÎ^¾òBk27œÏÍ)A(%lëL¶;¶â.ìŸfhdg=nŒýÑk7»@Hu{a1_Mh°€&">pØ,plA>MÈ9O®Y†šü™D¯œÉ™30ïWoqiµ•>#„©‰—Ãþ ã`7s~ãl:ôÅ=—½‚®• ö¬`Ä «RõÏCWw}-Afþæ³V’¼ÕëÓ·åfmÌF7Xh/xõͰ©Ò‹8ìÆäá³äÕûᬸŠQ'gº*ýÈG:ƒ:!ôV<ƒƒ¥à¥]@ýWO\CçÈç0Ä@Æ,QDwhFþ%–à'¾¯É¥lX·~ÝŽô-ù¨QÛ¸ Öê1«›e8œ÷”IßêÛ{N¤ƒuÞö†îÐíí3йçyLÿ€LúÖ`îl¾«õd{—ñãì÷?–ŸsN.}»ïæÊóíF˜ÙÏ43s(¸tå@a©X€3´¥á0<çp*n ©¤ƒ¾¼$ðd"˜ ˆŠ k2¹˜—árbbR4?=GXÈ'’€ñ†$¤c°~•¡˜ÈHà(ÜQÁG’k ‰ÀæµE9 Ï­ÄôSÐ@OPyÎþ+Ùç’ß“½ ¿3ëèÌë&¹ zé¨×w#üÑ…V{w¯Ûœ,ß°6~íö4·u5j㙾?Zö˜ŸÈ•íŸ2ØÐ~ê˜1·oßÉ=rV^‡Ãà%°¸šEüQþz½¤¡ë,.—¸ã·Œ3v¿c„chòR—É‚^b _~Ã솑⎌')î\ç7éö’ñÁ½ÄzÝ*”¸^Âe’‡Þ*O ©¯‰å$ÒÅM¹ªŸLùŸ•ü@èÇîl®í¿¥Vv¹"ØØI)ÖàTé-´¶šß.»Z"~#¿”àþ–†7q«8ö˜Ùd ææ‰HlŠEåÆÐ֛Ş«uÞyÑ—XÜ&ŠA#3-Kœsü³ç^Âv,{'9¾fÿÆ]ÛŽíÙy P ÷ÉgÁNrxñÇåãYÜÕ˜³ÚŽ Ãi™Ç׳eø&Wžá‰l €÷²Šô†'Ø $‚wi+‚™¼'- $Ë¥í(YÇJ<—Ïš2ËžšÄbZòéØÅ¨m|cõZ^ ðv}5 pðFZ¥g„,f9Lp²í‹p{„[nùv×äýæå®wQ:—uàt§´ˆ­‹xèyܱÌ4{0$±ú^´#d‹ÛFŸxC-†.2XèáèäŒÜ_bøÞÈÌE׈“¸{ÝŽÍù™)¹$VøÐ,$iÞ úrî 0xÙ ½„a/ß _m¤I &r]ëëêÞÕýêÞo‡Üî,ï¦^”ã6c¦‹«Ý ל‚œœ"9ßù=WE0’¸‚áåÄuJÝDãJå£]«ýù㣮5 Sg¼¬ô{I߆F"¸DÔш5m¢¾»KCHèÌv>³¬³*&ÅŬ_¦½}A|r&A‰DÿðÄ+²ë/ÝÏ›Êaª] Nžpm}r*ºÊ’ß¹·dɲ¥ý¥ù4Þ—«ŠÄ£Å¸™„ÄbIªZA¾h«0. ÃDñ‘äFPTNï- 4Òk ¶·D iY~+ÐÄ®iO$ª.¦m¤üv¾·ôu‘O°#1sµÉÈGWØgÆg ý‘½Ü6ºgxÉÖ.X»`ÝüËW-]³ˆ•ÞÇÆ;O饃5Ÿ€Že…[ÏÜ–Z‰aƒ›CïÜ´Û+®k¯–¬—à_'sÐÍpw õFÚ“§ž8½kóŽô­riÅ0禟[RÙŒ”¤Ý{·Íqóñu–iÀ.Á}¢["0'ô4ømÀ-GˆiFœŸÅ÷áªBq>”ÁÍÔ«@K>Œ¯µÐì¾VÈwe¶æ$'ý|š?Þ{ ýH$¸×CÜëèõ– E± d ³¹™]xþlŽƒ±a€7î‹E2ÜTßmìb܆åçšÏ¿VÆymE{Ûò–dÅôÙ¾V Y;Éî;R’v¦oØ…N°@ô©F î¸B<ÌuæÊá“wä@ä!?)± –M`V=e–Åú¡Å± Vi­_´å²à&¹3íä(™Q·lf÷ú9&ò029àÚüá ‚ÐH–üvŽ ÷–¹UËCîBŽ„Ñbh&!̶c‘„o…ÛTµÂJi¨VÌVPAœX#Áy•ƒ\⢵1)KŠæe:¡©ì8û™ãG»ç\]&Ãí˜XÜñÙ·Ð… …?=Ù]÷cûäÒûóÒ .è@ã~×pû!f~Se~ólÑXv>hJbsV&Æmݵ31±%;=';¹–Ï,ª’…Ð\öÉ$x„-–!Ü áÞÅXä7ûŠéNÝ Ð%&h70¿€Ko%Ü¢ùqÇÅøÇ,‹^´(,"*ÍA‘kf'NÚ¯¸ev¼Á~¶KõØLlZ쪕ññ[7¯MAÛЖÅÛÃO8j¥…¥,Ú…n¡¼â5/TùÍ®|4¦Áô2¡ƒˆƒ‡.Æ­?½ÿÙÅôè íºü@¤ÂÜg‚ƒÌË~žmŒ>9µ‚Yv»øìEÄž.˜n1s~è[ùP³ ™+8`]Çe‘€»=°4d«f0Ò¸¼9ÖgpB•©7†lü ±ß|'Á^Àrxã D\M$r…PICÀ"QL%ôBÐÛd˜üfu™_°ÓnÁ…è"ÜÕ30¡<àeÕ&û"Ï‘ðÒq"XÇœq$¸‡gÔÉ™®X˜•ø˜>›ŸÔjèñÝ…D@èáNN¿ð¸:?{¡,çgô=õ{fwîÑK­©ƒûˆ¥§ÌMR{¶í¨L¬6uS&Öº§<>b@O­Ãvb>ŒßÅmrŽ·A3XÜÇ +Ö˜j³5Ó[æXÂ…î_xg¡ïÍ×Т¤(Ô%[&Œ– Òe5TFpX k€š0…ñQ»~" võì'Í/ëMrغŠ1#yým×oŸ‘ 6W ÅÝ"(á͸¢Å©~Ʊ Ã,‚ýîãæ+Øûö$¸Ë\Ã.GxȽ b»x-&«Ý_MY¬ÃÌèg·˜µ_ÉMÞì{=C/wœ>¶‘8£¹„Ôk“±Ä˜¶V&` 4X©.$óGÈÕ[вjÖTFº²ÈÖe˘¶Ø7Çßà`-p?Q–“tö \ê6ŸGx)‘®ÄzG9ßiîÁ“ÛÁø ô„^—_¿?¶'xÚyÒ^¨Ûº–ºÇjÔRú(Ä7D‚4%  ”ùíkвã»V׉¸ŽQaá‚Ï¥¼ðâáBö[zû«òß‚jÙ˜|"AÔ*:¸‚´4”o“îÈ™%›o ßx0:%±GórNd¦G…%ɶ…Ň­±‹] ZÌÒS‹vÍÝá~Ùp_'%[‡;βs󛄬}|pÁPÖÒú# Úì²zN€š8Û}Фã]µ$§Çç 4”²¬x>+]<ÿPò²ô¶QnBÉ.' µœCfEy¡p²rv+uYç²(6¼­/ Y<Öç~iV!:‰’¢7ÌOcAƒ•†M7 ËÀ¹ŒF÷ ç=|Ï8|ÌŽ1¸ïÎuo¡èpÆâ勳~µ ç»ÊÍÔ 3ÇZz;Μé½ÿ왬ý ùï‹ïÓˆ|‰`håznš³óôé¹Î‡æå<ì’;]n«¾}khPPhhp`hâö퉉)$êŸ[ ¢ S”"XZ‹^‰.|öø#KŸ¿ IRrÔTàèm>¿6Y„竦1¤?}#Á „X²••ö\•Á¯âïÞ 2PLðY ˆ±ºr«ˆïU“Þ•3 '7ßÅÞ×¹ ­!Ys·/M¢©ß˜Ø‡V£c‹ÏËv{9à$±|ãÑ”p'/Vºv—ë„-†mqw4lìrÜ‚…6LܱԤsˆ=‘îQ?C…©°iÖ¨;Ûõ˜··Ïî¼zV&56ÛÉýa[h†^”e½g¥»ªŸçô]fŽšá›š——žz4NV—¹:aÕ–uÚÐá·ævöþóèÊvŒ"˜\숆ÑD0Psr‡ÄµëV&!í¬¤È9Aa³üã¶O‘‡N½¼cɤ}·p×é¾é3æÎ_¾t®|Ç9BйÁ ¿†Â7nB‡› Â×%áKý+C8}só!CJÍïÞ.+½yoôÅArõÜ,o×YÂ_Ö¾œY9rxt“«ü+_dxýJ$îSå¢|N¿t4yîâ­úϹº||Žßúªû#áü3̓ó\Õ¹Nü¹j÷ÖÿÔÑS4¸ þm üÌáö XÃ/bÜV˜XÃrˆu{LÎÉ&@—)¸ ùÆD>À:žÂBGUWHÎ}š2¬vÏÊånŘ`]ñ%JA·ö—0ñä‰d½ƒ…Eð”C‹ç[:öío±¸Ý›^ÐíAiæ©|Ù®ŠcïSË™UClÇ™#Öræ¡  ‰§Šå·Ê¶Dßg±â8÷ÑIòG  îÛ tD|Æa3"ã ÂfĈ›Uþ4ÓíG±?Ñ?A7r?ñ\AnÎÄå%\IÙ“‹´7£uÑ;æ%DËaCð*oÔM„;.˜ …ezМ±¬j:op¸ŸÒŽ@k6b‰VVDú’è *Üš™¹{÷¶cîŸâ[iAûÚ¤w‰@¬i<ñò¹ÄÈò+gñPII®âþŸptSp{xÞa=¡æ0¿SÑvâq·G)+ãÒeE’°e¡ËC;%hóîÃ);î ÎBph…õM@OpŽ™$ü¬!Ä–ßVÿ:DîbÉõÀjÂØ¨Òö Qð&ýH¿ºC‡B|QÎûðyÜòƒ‹ÓÂ3¼‹,võ ÍúÒõ^çµ%X¾&jetj+}fu¦¸è´€z¯ dkWÏÔïªÜBLýfj9ûpô!ør`€»Š‘t}ôú‘I°î.;~þJm™á-å\?oÀÁ)¬W%•X‰¿•Ü*ãuüF" "p•1‹ ‡SQH@ߑʜ³È.(ÄÙ¡€ä%X«…ŒÑ‰I×®8qM¦,QSvÿ1Á•?Áã? ïî64@Êàà+7îÂá»7¯ÐèÆË§üÀ"þ ?Š‹Î[”šæY`:š¸ŸV†ßâN¸ão 9¨_=ÿnµ¼³ÔÊÓgbMœŽ?û!¿äòÑ“×Ë{ûãáäã†]a8 Nà FÄîz9FØM3Šƒ¡Ð˱ÛýŽãöБÜeíAŸé\ ¢íjX ôö‚Zé£/ìHunTæ|6𫬠IzvímºÚ ŸyηxÞFúŽ@•YÜfæxÌŽ9ȉõ˜àî²­ ZÖ‡‰í[2õböÇŠ†"^¥#ú,“Â…™Ý°:´‘¶ã+m¸i»ûO]´rÉʘXméO3Ò¢W¸m4Ÿ¡u0pã¢ô{­ýn…9Á™ÞéÚ.›BVÍFÈ~žK ÑL·a«±ØüñI0ô%qÖcaˆ 4Ç=ÞÈìpWqм£îts#£é¥oß*½.¯y¿RoœYÐ^ç3 OÈÖŒŸûy²Ýæõù V~€48ÜZøÜ­…æîÝí>µW?©ÎÀ†ÖC˜£`wæ›×G«·ápÍUˆrù&Ü0Þ{TÀ~É?TØŒ[ÂÕb­Ú2ç;*÷VSìœR·Ø¹ä‹ÅÎnH¤­Á\çÙ?ðŠ­ë{ÅiÊ+¾WÜ Û‚bQ1è Âtò¿¦!ú|Â×¥,þ‘Òšªaà\Oªª "XËÇ¿!€Ð…`–ˆ¯Í·ºýPp6ÐúG0ø4nˆ .rO™ý‰s=åá’˜…hùدˆLbßncæÆ/‹C‰ÑÐzyÜÔ”ƒ)Ûv£Cìõ™F2Ueù#qê@½•ožçä1ÏVL`à?ãT°£~_|6ʤÏofª*å uª”~ÐÀšf¶¾–žòÚúd3¡>ùUu}ò?TVNúûÝ'Ñ(ö?tXÖmk=Á ‚ñbž?X-…Ll¸©¯ß䃼7D$eÌ=‚N CÂz€zË@‡ùt=Á ëÝ@&w˜¸v}MgvØ,ÿÙqÛ§ÉC§žž³{qmÇvî¼åKçýC‚‹õˆàÖ âTb{çSÓÙBÛßG!C€§ òû™¸æ-/=&çh$|‹ ¤r$7ÈÌlðà2Ó;÷ËJïß5+,«^œël;ÝÙeú ç¼¢ƒ¹¹å5†¶Úu_ ÌÑ¿et¥ƒq ØÁ‘ÿ}1#Êð]]»þ?¨®Ç1¼Å'^ðŸ£g‚ýžÕU1]AÏ]à˳º²%}‡Õ?ôþ<¦¬'^Wˆ¯k%}ýg„LÊ‚¹¯qp«¯œz¬%±a¿wpë–¯W:8vQR’ÒÁeí_-8¸ÛÐÜ„Š#c¡â(å-W5‹HÔ,†·VÇÆ`Œ›`còiBŽÈ ä&ãND¦ ò¹øÿß•\")u•JNêÇ  %Ì&û+2Cß-˜Üã ×½nÁ8«U¹<Eð”#ŽTžZ|úxù®·(ôÞëgër›Sæ©X",ºÀç†0¢ z·ˆuGPÆ”‘æše¿i2@CçŽó¶ŸíêaAnnû©Œ]®c=þœ¤i¸ðôgÇ?CömØù½ú 4{.‚›Â}–ÌÆ-kââ׬Y¼9+ùÖñä,tš}0¹XO×jZŸh´8v‘ì)‡V°Éi99ÛgFFt-3œä=„…suDìj- ŒPà©¿&jÒnÄ_ülñp°Ûïàà¿oÄôÑüŒ?ú“k¶ÎüŽ‘§•v¦zWé…†—qIÄýuiñÖEQߺÔÀ\†¾Wügå¯9ßNý«/‘Ç”Ú(](Äø!úý?¢×Jiý`ó…2¨þ‹‚ÚßN70§üQø®ÔÑäûÿš JÛáöD>kÄÅTMU‹©^%Õ]N¥P.§j{ÿtÿ.¤Ä1Oî¼oÚ}Ò™áдÚ)ÂÖß-¬ú-u#È÷ú'ø@‰|§\®6D|s‚|-Vû6ôÙ¯X“˜8¶ÎétÕD^ê’rº Ò" £E^²jeYý)ñº H×gNÄ )ñûûçpHá?+l~'l¿jÔúÛ·dnû«@ÿ6 JógKœMìßX‰{}^«E¶:â U¨^Gz¥ï:4XË÷ûPÄRÈŸú¯2Àݲø¨¿ÊÔý©ú1ïZUÌûïˆ>Á¶g”µ¹l' Ý8ñaŽt0–4”bù–÷‡Ÿ+)ùêm°?X|¶ÿxé»+,ùl·¾vSü ˜74®6ᬬŒ K“>K– —¹@3ñfؤ©Yvæwío¢}hwüÍ4ºK ý:#Kd{xöF3©ebìÃ,_GŸuhcìú›YX̤³«˜”§ÅgQÊ ?7½8­QG7™ Üuìæ†X[†¼ç3E¡ùäµ"R¨T©”ß ¡ýs°x›žiZ9Ú7ªhCh_¥ñœá§iÞ…7büæ ?·— ÂoÀ[1n_5ã ¼aîã7ÂŒÙÂ'4Ÿu›«ŠìËG2•íÕ«„e$¸ég–“TÚöWiRHóU•K¸ªpÆ y¯pZ /ª¦jáUw¯B(ióLʈ޶$áåÚ‚ä;l ½xùÒ˜˜9Ó–, ‰ ^*ìñœ|‚ç“0e#óeÌIíÍ&3Ÿö§*ô¿°¤¡Ò§ºF!^³ÒŽÁ„è|23¶ê5ýÈSý«"ÉçÍÍ‚Ÿó ¸ˆF!ù¦èMå·\üªSikWîEÚEh_XŠçîÛ†£Èoy`”¥éQ¿„)ȹDxzÚÍð3G,¦ï|íl^E¾,»l´AoY˜EÐ÷š9ca˜³ ŽT ä"¿]ìéà?ÔÎ~2b­¼Ž|ìÅoåg;¥’ ©àãRh~„s±øÉª š‰!š`_Fy¨M1{Ît/±ÀÄ87GÆ 7#ìÂM]"‰Ù±N¢a{å\nƒ­«X â³ Xó¬à @øë/qïãý?tápë_wàɼw¹Õë‡BXRµz~0þtÖàxÅŸOê¶æΊ‰² n¨È£ÎÎ %…*4´ÛHŸü»ûƒHµ5Ë¿\€¢4s @=Dè–1ÃÄŠïøt7-é„Wük«—Jb§ûØE±v’Ë+ŸFwØ·’?a)ÛÃýz .<ï0ô¯M÷ë>Ú/`þ° º,lùÄN ز{wÒÞ‚ƒò“gÚ²moÑæC¨œ­Nç6œÞ}B¬OòÊâ Ãlý=-rJö+œ›²(uY:ÚRV¦Ç±ŸL®T¨,«;Ð7¤ÖI ,ê§•JVK'ßÑiõ><îéTýRaFèË“öÅÞÄ´ÖxÇD¡Ùµ€Ôö$èßÛD]Õ|bCcú/v ?¢^P®LYÕtÂàA1é< â`êÚ7t'xGÙiLKÕ[Û’º·ëp×{ÃÀ(Ìñ÷"ÿøäéòЩgæìª7Iº`ù²¹u*]j¬€•^ø¯Piß#üÂ/Z‡j-y|“>óÉ왚N*¬º®o@ÿ…Y±îðÃÇz>åÌ6èªS+9Q– ´w°7ˆÛÊ÷øPJÔ#'°G…z´kQ!×_GX«1}v t wô‘¯ÒgŸËý í;õÖ0üçÝåëÅû8òð‡æIÊ’÷L»Ç srw@SYËÃnw’“W®I“I"¢ç,Ÿ‡X·ÙÛ2ówÈ«ÈÏýX>£V ±‚9ù—¦Õ†à<ðÿÊâ—>*û¦4(JÛF«ŒJ©÷¿oV¤«ñ¸ªó º?•2¨ìþ9ìL\^äa¸S[¢àûXT£+×C?»ihkyÌã‡ô¤qÂÚ„èå¡ÄnÙ{ðÀ¡òL9^%¨“A}uŠÔÉŠùQؼò_ÝÍÏ—·ù´bè?”úa ËÏQùk·>„=¼qC ÞzÐàËe¨Z`T[‡úÏïÙ¹T6 P¤†ðA€@ü6Ò9ÿCòK£{Wù6¨0_Ï[ØÓ@þ[_V¦–ÿuÙøX™RG_â` ØZ¹ñ£úW5ˆ û ˜%[ Íj8ªœòõþ”ïê;Ug†›ª -¾T"ÖÏ‘‘X>mË›ù§¥y$ži‚i´¨odaÚãìì,f€‹‹²Œåóô¤•k” ¹¢• ¹cY”sàrŽ\`®äs¤°û×îš%]ý¤Aêü³;qf4à5þGó"—>Îv}f‘á?S—5ûc}ßgßð¿«²©»‹b~EµøC¨xô‡_ÌÔðøFùŒŠm>Crj÷—¶Ñ.«?ÉU-*›*ˆÐÇ¿‚ X†u0ÿ'ú©ôó«6#$¶K·ê§/¯½úÇò>«´S«7³+«“[QV·‘^ûv„–vƒóp¨¡WOŸ¼•€m…—ÖŸ;y}JXC•0>S¦ò¯Ö¨hÙ×–¨ÔnùWTZXwÃlþ;‰Ç1»T³Òà/psàJ‹Rî‘[ƒ‚vºÔò"VŒÆÚæ’Mxp}¼T.op·ÇËõ*­jÇÿ„¯ÿâÐ[æ;×½˜p臺²!äÝêôQ:á¨ð£Aç^“R<ê5âõ¿É*VÀHÔÍ%1‡’3 ײ…ãåÓ,‘>ÛY¹×éçt¹î¸Vcî hCÈ ö{”J óH|PTyö=ùÛö”}'?y6aëÆÃ¬@~{W%ù½¶„fÎÛ¦$ÿ';%¸¿èWŸÏÐ3cëÊu{åÆ6³ÐLÖ²f58.ãs•¼;§ä]¢ßÆêmÀá00"I"Po°ÿÊÈ»2]@\'©6ú¨uŒôþp{€ßMJX—E Kв…1 Ð\¹j~\øº¥ëQ2+-G; Žå°uöÊ­AaOnÖæ*þ«¼‘¢”w©c¼ në§ê²oßöUšIÞU30jQtd”Ÿr ²Q‡ÖLÒ>*Ê)¸šÍ~Ý&À_=ï6Џ½ú¥:ÿå,âA¾mÝÞ|ÄíÚö—G#í‹{Ay{ÿwÿ—ÄAÔ[|vT•3Rå ‰vvV‘Iˆ›þ§„"f­SÕ°†íµª>âPÝEiƒ„nžüꕜCº~íÆ7ÿ•»•~>$¯Ž)?6®ò:ÊL©û·/¾@ó†D÷ØöW«I|¾´MÊߨܺ|²âQÕ¿W7ké[ñÕ|T×._ç9åëU.|Šjƒ?µÕº´oß¾ABÖŽyíŸó™$àŸYHRþq©Ñg8¥rµÙaj¨âñ'©²¬ZÜ0YªÅø£8Tãëºäéüò´þ…0æ¾,Áuýµr!DÅ_¬/µ½%&h;Ÿ†I¶ÛhÜ:4Æk›6…ëš6£¨ÿ¸´ endstream endobj 135 0 obj 15288 endobj 49 0 obj <> endobj 136 0 obj <> endobj 32 0 obj <> endobj 137 0 obj <> endobj 35 0 obj <> endobj 38 0 obj <> endobj 138 0 obj <> endobj 14 0 obj <> endobj 139 0 obj <> endobj 76 0 obj <> endobj 17 0 obj <> endobj 140 0 obj <> endobj 20 0 obj <> endobj 141 0 obj <> endobj 2 0 obj <>endobj xref 0 142 0000000000 65535 f 0000060844 00000 n 0000319321 00000 n 0000060695 00000 n 0000058321 00000 n 0000000015 00000 n 0000004377 00000 n 0000071845 00000 n 0000071697 00000 n 0000060892 00000 n 0000062577 00000 n 0000060974 00000 n 0000295874 00000 n 0000295655 00000 n 0000315202 00000 n 0000275838 00000 n 0000275623 00000 n 0000316625 00000 n 0000255315 00000 n 0000255099 00000 n 0000317948 00000 n 0000071549 00000 n 0000071581 00000 n 0000071611 00000 n 0000071643 00000 n 0000058532 00000 n 0000004397 00000 n 0000015128 00000 n 0000073595 00000 n 0000071992 00000 n 0000238621 00000 n 0000238393 00000 n 0000312522 00000 n 0000198392 00000 n 0000198190 00000 n 0000313802 00000 n 0000216896 00000 n 0000216677 00000 n 0000313948 00000 n 0000082567 00000 n 0000082599 00000 n 0000082631 00000 n 0000058727 00000 n 0000015150 00000 n 0000019155 00000 n 0000084321 00000 n 0000082718 00000 n 0000201386 00000 n 0000201172 00000 n 0000311272 00000 n 0000093293 00000 n 0000093325 00000 n 0000093357 00000 n 0000058922 00000 n 0000019176 00000 n 0000025208 00000 n 0000095036 00000 n 0000093433 00000 n 0000104008 00000 n 0000104040 00000 n 0000104072 00000 n 0000059117 00000 n 0000025229 00000 n 0000030419 00000 n 0000105751 00000 n 0000104148 00000 n 0000114723 00000 n 0000114755 00000 n 0000114787 00000 n 0000059312 00000 n 0000030440 00000 n 0000035385 00000 n 0000116466 00000 n 0000114863 00000 n 0000190088 00000 n 0000189883 00000 n 0000316479 00000 n 0000125438 00000 n 0000125470 00000 n 0000125502 00000 n 0000059507 00000 n 0000035406 00000 n 0000038321 00000 n 0000127192 00000 n 0000125589 00000 n 0000136164 00000 n 0000136196 00000 n 0000136228 00000 n 0000059702 00000 n 0000038342 00000 n 0000042909 00000 n 0000137896 00000 n 0000136293 00000 n 0000146868 00000 n 0000146900 00000 n 0000146932 00000 n 0000059897 00000 n 0000042930 00000 n 0000047931 00000 n 0000148612 00000 n 0000147008 00000 n 0000157585 00000 n 0000157620 00000 n 0000157653 00000 n 0000060095 00000 n 0000047952 00000 n 0000051781 00000 n 0000159334 00000 n 0000157730 00000 n 0000168308 00000 n 0000168343 00000 n 0000168378 00000 n 0000060295 00000 n 0000051803 00000 n 0000056144 00000 n 0000170059 00000 n 0000168455 00000 n 0000179033 00000 n 0000179068 00000 n 0000179103 00000 n 0000060495 00000 n 0000056166 00000 n 0000058299 00000 n 0000180773 00000 n 0000179169 00000 n 0000189747 00000 n 0000189782 00000 n 0000189817 00000 n 0000198168 00000 n 0000201150 00000 n 0000216654 00000 n 0000238370 00000 n 0000255076 00000 n 0000275600 00000 n 0000295632 00000 n 0000311249 00000 n 0000312446 00000 n 0000313710 00000 n 0000315119 00000 n 0000316380 00000 n 0000317801 00000 n 0000319120 00000 n trailer << /Size 142 /Root 1 0 R /Info 2 0 R >> startxref 319547 %%EOF Node-path: powersupply/itest/Bilt/trunk/libMagnet_V140/TestClass.cpp Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 9120 Text-content-md5: a2b3ecf6c6a762b139b31c55f67aded7 Content-length: 9130 PROPS-END #include #include #include #include "ClassMagnet.h" #include "Exception.h" //g++ -o TestClass TestClass.cpp -L./ -lMagnet using namespace itest; TMagnet *Magnet; void *func1_thread(void *arg); main (int argc, char **argv) { int val=0; struct idata myDataX_Magnet1; struct idata myDataY_Magnet1; struct idata myDataZ_Magnet1; struct mdata mymData_Magnet1; struct fdata myFDataX_Magnet1; try{ std::cout<<"---------------TEST1---------------"<addrIP_magnet()<pole(X).set_current_DC(1); Magnet->pole(Y).set_current_DC(-1); Magnet->pole(Z).set_current_DC(0); Magnet->set_state(1); sleep(2); std::cout<<"STATE :"<get_state()<pole(X).get_idata(&myDataX_Magnet1); Magnet->pole(Y).get_idata(&myDataY_Magnet1); Magnet->get_mdata(&mymData_Magnet1); Magnet->set_state(0); delete Magnet; std::cout<<"---------------IDATA---------------"<pole(X).clear_ferrors(); Magnet->set_state(MAGNET_ON); for(int i=0;i<10;i++) { std::cout<addrIP_magnet()<num_magnet()<pole(X).get_idata(&myDataX_Magnet1); sleep(1); Magnet->pole(X).set_current_DC(1); Magnet->pole(X).get_fdata(&myFDataX_Magnet1); std::cout<<"-----------------"<< "nbr frame:"<set_state(MAGNET_OFF); sleep(2); delete Magnet; } catch(ItestException &e) { for(int i=0;ireason = _src.reason; this->desc = _src.desc; this->origin = _src.origin; this->severity = _src.severity; this->code = _src.code; return *this; } // ============================================================================ // ItestException::ItestException // ============================================================================ ItestException::ItestException (void) : errors(0) { this->push_error(Error()); } // ============================================================================ // ItestException::ItestException // ============================================================================ ItestException::ItestException (const char *_reason, const char *_desc, const char *_origin, int _severity, int _code) : errors(0) { this->push_error(_reason, _desc, _origin, _severity, _code); } // ============================================================================ // ItestException::ItestException // ============================================================================ ItestException::ItestException (const std::string& _reason, const std::string& _desc, const std::string& _origin, int _severity, int _code) : errors(0) { this->push_error(_reason, _desc, _origin, _severity, _code); } // ============================================================================ // ItestException::ItestException // ============================================================================ ItestException::ItestException (const ItestException& _src) : errors(0) { this->errors = _src.errors; } // ============================================================================ // ItestException::ItestException // ============================================================================ ItestException::ItestException (const ErrorList& _errors) { this->errors = _errors; } // ============================================================================ // ItestException::ItestException // ============================================================================ ItestException& ItestException::operator= (const ItestException& _src) { //- no self assignment if (this == &_src) { return *this; } this->errors.clear(); for (size_t i = 0; i < _src.errors.size(); i++) this->push_error(_src.errors[i]); return *this; } // ============================================================================ // ItestException::~ItestException // ============================================================================ ItestException::~ItestException (void) { this->errors.clear(); } // ============================================================================ // ItestException::push_error // ============================================================================ void ItestException::push_error (const char *_reason, const char *_desc, const char *_origin, int _severity, int _err_code) { this->errors.push_back(Error(_reason, _desc, _origin, _severity, _err_code)); } // ============================================================================ // ItestException::push_error // ============================================================================ void ItestException::push_error (const std::string& _reason, const std::string& _desc, const std::string& _origin, int _err_code, int _severity) { this->errors.push_back(Error(_reason, _desc, _origin, _severity, _err_code)); } // ============================================================================ // ItestException::push_error // ============================================================================ void ItestException::push_error (const Error& _error) { this->errors.push_back(_error); } } // namespace itest Node-path: powersupply/itest/Bilt/trunk/libMagnet_V140/makefile Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 700 Text-content-md5: b453ac343324f1452d879ffaf3d40613 Content-length: 710 PROPS-END #extension des fichiers à effacer lors du nettoyage CLEANEXTS = o a #fichier cible et répertoire d'installation OUTPUTFILE = libMagnet.a INSTALLDIR = ../bin .PHONY: all all: $(OUTPUTFILE) libMagnet.a : ClassMagnet.o Exception.o ar ru libMagnet.a ClassMagnet.o Exception.o ranlib libMagnet.a ClassMagnetTest.o : ClassMagnet.cpp ClassMagnet.h g++ -c ClassMagnet.cpp Exception.o : Exception.cpp Exception.h g++ -c Exception.cpp .PHONY: install install: mkdir -p $(INSTALLDIR) cp -p $(OUTPUTFILE) $(INSTALLDIR) .PHONY: clean clean: for file in $(CLEANEXTS); do rm -f *.$$file; done ClassMagnet.o: ClassMagnet.h Exception.h Exception.o: Exception.h Revision-number: 47 Prop-content-length: 123 Content-length: 123 K 10 svn:author V 5 meyer K 8 svn:date V 27 2010-06-21T07:16:52.000000Z K 7 svn:log V 23 Changed version to 3.3 PROPS-END Node-path: powersupply/itest/Bilt/trunk/Makefile Node-kind: file Node-action: change Text-content-length: 6365 Text-content-md5: 05fa1a02392eb3299843a9ab15af10d7 Content-length: 6365 #============================================================================= # # file : Makefile # # description : Include for the Bilt class. # # project : Makefile to generate a Tango server # # $Author: meyer $ # # $Revision: 1.13 $ # # $Log: not supported by cvs2svn $ # Revision 1.12 2010/06/21 07:13:05 meyer # Added a spectrum attribute for the temperature measurements and changed to libMagnet version 1.4. # # Revision 1.11 2010/03/19 15:27:01 meyer # Canged to version 3.2 # # Revision 1.10 2010/03/16 15:03:33 meyer # Excluded Steerer class. # # Revision 1.9 2010/03/16 14:57:56 meyer # Rlease_3_1 # # Revision 1.8 2010-02-11 16:35:27 meyer # Currents settings understand NaN values. # Deleted StePoleCurrent command. # # Revision 1.7 2010/02/10 16:22:15 meyer # Release_3_0 # # Revision 1.6 2010/02/10 12:27:31 meyer # Restructured Bilt class. # Acquistion is now done by a thread and only the multi channel data # gets exported. A single channel class (BiltCh) was created. # # Revision 1.5 2009/12/18 12:02:18 meyer # Changed version number to 2.1 # # Revision 1.4 2009/12/18 10:19:23 meyer # Using libMagnet version 130 now. # # Revision 1.3 2009/11/27 13:49:26 meyer # Modified structure! The pole is no longer a device. # The device is now a magnet with three poles. # # Revision 1.2 2009/11/26 10:46:58 meyer # Updated for libMagnet_V120 # # Revision 1.1.1.1 2009/11/04 16:23:02 meyer # Imported using TkCVS # # # copyleft : European Synchrotron Radiation Facility # BP 220, Grenoble 38043 # FRANCE # #============================================================================= # This file is generated by POGO # (Program Obviously used to Generate tango Object) # # (c) - Software Engineering Group - ESRF #============================================================================= # CLASS = Bilt MAJOR_VERS = 3 MINOR_VERS = 3 RELEASE = Release_$(MAJOR_VERS)_$(MINOR_VERS) OS = $(shell /csadmin/common/scripts/get_os) PROCESSOR = $(shell uname -p) #----------------------------------------- # Set default home directories #----------------------------------------- TANGO_HOME = /segfs/tango/release/$(BIN_DIR) CPP_SERVERS = $(TANGO_HOME)/classes ifdef no_debug DEBUG = -O else DEBUG = -g endif ifdef _solaris CC = CC BIN_DIR=$(OS)_CC AR_SL = $(CC) -mt -G VERS_OPT = -h SL_EXT = so endif ifdef linux CC = c++ CC_SHLIB = $(CC) -fPIC $(PROCESSOR)=1 ifdef x86_64 NBITS=_64 endif BIN_DIR=$(OS)$(NBITS) AR_SL = $(CC) -fPIC -shared SL_EXT = so VERS_OPT = -Wl,-soname, endif INCLUDE_DIRS = -I$(TANGO_HOME)/include -I. \ -I$(CPP_SERVERS)/include \ -I libMagnet_V140 OBJS_DIR = obj/$(BIN_DIR) LIB_DIRS = -L $(CPP_SERVERS)/lib \ -L $(TANGO_HOME)/lib \ -L libMagnet_V140 TARGET_LIB = $(CPP_SERVERS)/lib/libtgclasses.a #----------------------------------------- # Set CXXFLAGS and LFLAGS #----------------------------------------- ifdef _solaris CXXFLAGS = $(DEBUG) -mt -D_PTHREADS $(INCLUDE_DIRS) LFLAGS = $(DEBUG) $(LIB_DIRS) \ -ltango \ -llog4tango \ -lomniORB4 \ -lomniDynamic4 \ -lomnithread \ -lCOS4 \ -lpthread \ -lposix4 -lsocket -lnsl \ -ltgclasses endif ifdef linux CXXFLAGS = -g -D_REENTRANT $(INCLUDE_DIRS) LFLAGS = $(DEBUG) $(LIB_DIRS) \ -ltango \ -llog4tango \ -lomniORB4 \ -lomniDynamic4 \ -lomnithread \ -lCOS4 \ -ldl -lpthread \ -lMagnet \ -ltgclasses endif #----------------------------------------- # Set dependences #----------------------------------------- SVC_OBJS = $(OBJS_DIR)/$(CLASS).o \ $(OBJS_DIR)/$(CLASS)StateMachine.o \ $(OBJS_DIR)/$(CLASS)Class.o \ $(OBJS_DIR)/AcquisitionThread.o \ $(OBJS_DIR)/ClassFactory.o \ $(OBJS_DIR)/main.o SHLIB_OBJS = $(OBJS_DIR)/$(CLASS)Class.so.o \ $(OBJS_DIR)/$(CLASS)StateMachine.so.o \ $(OBJS_DIR)/$(CLASS).so.o \ $(OBJS_DIR)/AcquisitionThread.o SVC_INC = $(CLASS)Class.h \ $(CLASS).h \ AcquisitionThread.h $(OBJS_DIR)/%.o: %.cpp $(SVC_INC) $(CC) $(CXXFLAGS) -c $< -o $(OBJS_DIR)/$*.o $(OBJS_DIR)/%.so.o: %.cpp $(SVC_INC) $(CC_SHLIB) $(CXXFLAGS) -c $< -o $(OBJS_DIR)/$*.so.o #----------------------------------------- # Make Entry #----------------------------------------- all: $(CLASS) $(CLASS): make_obj_dir make_bin_dir $(SVC_OBJS) $(CC) $(SVC_OBJS) -o $(CLASS) $(LFLAGS) @mv $(CLASS) bin/$(BIN_DIR)/$(CLASS) shlib: make_obj_dir make_shlib_dir $(SHLIB_OBJS) $(AR_SL) -o \ shlib/$(BIN_DIR)/$(CLASS).$(SL_EXT).$(MAJOR_VERS).$(MINOR_VERS) \ $(VERS_OPT)$(CLASS).$(SL_EXT).$(MAJOR_VERS) \ $(SHLIB_OBJS) $(LFLAGS) @rm -f shlib/$(BIN_DIR)/$(CLASS).$(SL_EXT) @cd shlib/$(BIN_DIR); \ ln -s $(CLASS).$(SL_EXT).$(MAJOR_VERS).$(MINOR_VERS) $(CLASS).$(SL_EXT) clean: rm -f $(OBJS_DIR)/*.o \ $(OBJS_DIR)/*.so.o \ bin/$(BIN_DIR)/$(CLASS) \ core make_obj_dir: @mkdir -p obj @mkdir -p obj/$(BIN_DIR) make_bin_dir: @mkdir -p bin @mkdir -p bin/$(BIN_DIR) make_shlib_dir: @mkdir -p shlib @mkdir -p shlib/$(BIN_DIR) #----------------------------------------- # Install binary file #----------------------------------------- install: cp bin/$(BIN_DIR)/$(CLASS) $(CPP_SERVERS)/bin #----------------------------------------- # Update class library and header files # recompile without debug mode. #----------------------------------------- lib: clean @make no_debug=1 cp *.h $(CPP_SERVERS)/include ar ruv $(TARGET_LIB) $(OBJS_DIR)/$(CLASS).o ar ruv $(TARGET_LIB) $(OBJS_DIR)/$(CLASS)Class.o ar ruv $(TARGET_LIB) $(OBJS_DIR)/$(CLASS)StateMachine.o ar ruv $(TARGET_LIB) $(OBJS_DIR)/AcquisitionThread.o ident $(TARGET_LIB) | grep $(CLASS) #------------------------------------------------------ # Tag the CVS/SVN module corresponding to this class # copy cvs_tag or svn_tag to tag: entry #------------------------------------------------------ #svn_tag: # svn copy ../trunk ../tags/$(RELEASE) # svn commit ../tags/$(RELEASE) \ # -m "Tagging the $(RELEASE) of the $(CLASS) project." # #cvs_tag: # @cvstag "$(CLASS)-$(RELEASE)" # @make $(CLASS) # @make show_tag #show_cvs_tag: # @cvstag -d # # Only these make options work with the current Pogo version 5.3.x! tag: @cvstag "$(CLASS)-$(RELEASE)" @make $(CLASS) @make show_tag show_tag: @cvstag -d Revision-number: 48 Prop-content-length: 147 Content-length: 147 K 8 svn:date V 27 2010-06-21T07:16:53.000000Z K 7 svn:log V 73 This commit was manufactured by cvs2svn to create tag 'Bilt-Release_3_3'. PROPS-END Node-path: powersupply/itest/Bilt/tags/Bilt-Release_3_3 Node-kind: dir Node-action: add Node-copyfrom-rev: 47 Node-copyfrom-path: powersupply/itest/Bilt/trunk Revision-number: 49 Prop-content-length: 123 Content-length: 123 K 10 svn:author V 5 meyer K 8 svn:date V 27 2010-06-21T07:17:48.000000Z K 7 svn:log V 23 Changed version to 1.4 PROPS-END Node-path: powersupply/itest/BiltCh/trunk/Makefile Node-kind: file Node-action: change Text-content-length: 5250 Text-content-md5: 337183f75cb3243d893de03b58f319a1 Content-length: 5250 #============================================================================= # # file : Makefile # # description : Include for the BiltCh class. # # project : Makefile to generate a Tango server # # $Author: meyer $ # # $Revision: 1.5 $ # # $Log: not supported by cvs2svn $ # Revision 1.4 2010/05/01 16:26:01 meyer # Changed version to 1.3 # # Revision 1.3 2010/03/19 15:28:01 meyer # Canged to version 1.1 # # Revision 1.2 2010-02-11 16:36:31 meyer # Currents attribute of Bilt understand NaN values now. # # Revision 1.1.1.1 2010-02-10 11:49:21 meyer # Imported using TkCVS # # # copyleft : European Synchrotron Radiation Facility # BP 220, Grenoble 38043 # FRANCE # #============================================================================= # This file is generated by POGO # (Program Obviously used to Generate tango Object) # # (c) - Software Engineering Group - ESRF #============================================================================= # CLASS = BiltCh MAJOR_VERS = 1 MINOR_VERS = 4 RELEASE = Release_$(MAJOR_VERS)_$(MINOR_VERS) OS = $(shell /csadmin/common/scripts/get_os) PROCESSOR = $(shell uname -p) #----------------------------------------- # Set default home directories #----------------------------------------- TANGO_HOME = /segfs/tango/release/$(BIN_DIR) CPP_SERVERS = $(TANGO_HOME)/classes ifdef no_debug DEBUG = -O else DEBUG = -g endif ifdef _solaris CC = CC BIN_DIR=$(OS)_CC AR_SL = $(CC) -mt -G VERS_OPT = -h SL_EXT = so endif ifdef linux CC = c++ CC_SHLIB = $(CC) -fPIC $(PROCESSOR)=1 ifdef x86_64 NBITS=_64 endif BIN_DIR=$(OS)$(NBITS) AR_SL = $(CC) -fPIC -shared SL_EXT = so VERS_OPT = -Wl,-soname, endif INCLUDE_DIRS = -I$(TANGO_HOME)/include -I. \ -I$(CPP_SERVERS)/include OBJS_DIR = obj/$(BIN_DIR) LIB_DIRS = -L $(CPP_SERVERS)/lib \ -L $(TANGO_HOME)/lib \ TARGET_LIB = $(CPP_SERVERS)/lib/libtgclasses.a #----------------------------------------- # Set CXXFLAGS and LFLAGS #----------------------------------------- ifdef _solaris CXXFLAGS = $(DEBUG) -mt -D_PTHREADS $(INCLUDE_DIRS) LFLAGS = $(DEBUG) $(LIB_DIRS) \ -ltango \ -llog4tango \ -lomniORB4 \ -lomniDynamic4 \ -lomnithread \ -lCOS4 \ -lpthread \ -lposix4 -lsocket -lnsl endif ifdef linux CXXFLAGS = -g -D_REENTRANT $(INCLUDE_DIRS) LFLAGS = $(DEBUG) $(LIB_DIRS) \ -ltango \ -llog4tango \ -lomniORB4 \ -lomniDynamic4 \ -lomnithread \ -lCOS4 \ -ldl -lpthread endif #----------------------------------------- # Set dependences #----------------------------------------- SVC_OBJS = $(OBJS_DIR)/$(CLASS).o \ $(OBJS_DIR)/$(CLASS)StateMachine.o \ $(OBJS_DIR)/$(CLASS)Class.o \ $(OBJS_DIR)/ClassFactory.o \ $(OBJS_DIR)/main.o SHLIB_OBJS = $(OBJS_DIR)/$(CLASS)Class.so.o \ $(OBJS_DIR)/$(CLASS)StateMachine.so.o \ $(OBJS_DIR)/$(CLASS).so.o SVC_INC = $(CLASS)Class.h \ $(CLASS).h $(OBJS_DIR)/%.o: %.cpp $(SVC_INC) $(CC) $(CXXFLAGS) -c $< -o $(OBJS_DIR)/$*.o $(OBJS_DIR)/%.so.o: %.cpp $(SVC_INC) $(CC_SHLIB) $(CXXFLAGS) -c $< -o $(OBJS_DIR)/$*.so.o #----------------------------------------- # Make Entry #----------------------------------------- all: $(CLASS) $(CLASS): make_obj_dir make_bin_dir $(SVC_OBJS) $(CC) $(SVC_OBJS) -o $(CLASS) $(LFLAGS) @mv $(CLASS) bin/$(BIN_DIR)/$(CLASS) shlib: make_obj_dir make_shlib_dir $(SHLIB_OBJS) $(AR_SL) -o \ shlib/$(BIN_DIR)/$(CLASS).$(SL_EXT).$(MAJOR_VERS).$(MINOR_VERS) \ $(VERS_OPT)$(CLASS).$(SL_EXT).$(MAJOR_VERS) \ $(SHLIB_OBJS) $(LFLAGS) @rm -f shlib/$(BIN_DIR)/$(CLASS).$(SL_EXT) @cd shlib/$(BIN_DIR); \ ln -s $(CLASS).$(SL_EXT).$(MAJOR_VERS).$(MINOR_VERS) $(CLASS).$(SL_EXT) clean: rm -f $(OBJS_DIR)/*.o \ $(OBJS_DIR)/*.so.o \ bin/$(BIN_DIR)/$(CLASS) \ core make_obj_dir: @mkdir -p obj @mkdir -p obj/$(BIN_DIR) make_bin_dir: @mkdir -p bin @mkdir -p bin/$(BIN_DIR) make_shlib_dir: @mkdir -p shlib @mkdir -p shlib/$(BIN_DIR) #----------------------------------------- # Install binary file #----------------------------------------- install: cp bin/$(BIN_DIR)/$(CLASS) $(CPP_SERVERS)/bin #----------------------------------------- # Update class library and header files # recompile without debug mode. #----------------------------------------- lib: clean @make no_debug=1 cp *.h $(CPP_SERVERS)/include ar ruv $(TARGET_LIB) $(OBJS_DIR)/$(CLASS).o ar ruv $(TARGET_LIB) $(OBJS_DIR)/$(CLASS)Class.o ar ruv $(TARGET_LIB) $(OBJS_DIR)/$(CLASS)StateMachine.o ident $(TARGET_LIB) | grep $(CLASS) #------------------------------------------------------ # Tag the CVS/SVN module corresponding to this class # copy cvs_tag or svn_tag to tag: entry #------------------------------------------------------ #svn_tag: # svn copy ../trunk ../tags/$(RELEASE) # svn commit ../tags/$(RELEASE) \ # -m "Tagging the $(RELEASE) of the $(CLASS) project." # #cvs_tag: # @cvstag "$(CLASS)-$(RELEASE)" # @make $(CLASS) # @make show_tag #show_cvs_tag: # @cvstag -d # # Only these make options work with the current Pogo version 5.3.x! tag: @cvstag "$(CLASS)-$(RELEASE)" @make $(CLASS) @make show_tag show_tag: @cvstag -d Revision-number: 50 Prop-content-length: 149 Content-length: 149 K 8 svn:date V 27 2010-06-21T07:17:49.000000Z K 7 svn:log V 75 This commit was manufactured by cvs2svn to create tag 'BiltCh-Release_1_4'. PROPS-END Node-path: powersupply/itest/BiltCh/tags/BiltCh-Release_1_4 Node-kind: dir Node-action: add Node-copyfrom-rev: 49 Node-copyfrom-path: powersupply/itest/BiltCh/trunk Revision-number: 51 Prop-content-length: 171 Content-length: 171 K 10 svn:author V 5 meyer K 8 svn:date V 27 2010-06-24T11:43:10.000000Z K 7 svn:log V 71 Corrected memory leak when the reconnection to the power supply fails. PROPS-END Node-path: powersupply/itest/Bilt/trunk/AcquisitionThread.cpp Node-kind: file Node-action: change Text-content-length: 8459 Text-content-md5: af05eda5d34590119c6d64298fa61895 Content-length: 8459 #include #include namespace Bilt_ns { AcquisitionThread::AcquisitionThread (Bilt *_bilt_ps, omni_mutex &d_m, omni_mutex &bilt_m) : Tango::LogAdapter(_bilt_ps), omni_thread(), data_mutex(d_m), bilt_mutex(bilt_m) { bilt_ps = _bilt_ps; last_update.tv_sec = 0; last_update.tv_usec = 0; last_reconnect.tv_sec = 0; last_reconnect.tv_usec = 0; updatePeriod = bilt_ps->updatePeriod; // cout << "AcquisitionThread::AcquisitionThread(): go to start thread ...\n"; start_undetached(); } //+------------------------------------------------------------------ /** * method: run_undetached() * * description: * */ //+------------------------------------------------------------------ void *AcquisitionThread::run_undetached(void*) { bool exit; INFO_STREAM << " AcquisitionThread::run_undetached() entering endless loop!" << endl; while (1) { { // copy to local variables omni_mutex_lock l(data_mutex); exit = bilt_ps->exit_thread; bilt_connection_lost = bilt_ps->bilt_connection_lost; } /* exit the calculation thread */ if ( exit == true ) { break; } struct timeval now; gettimeofday (&now, NULL); double delay = (now.tv_sec * 1e6 + now.tv_usec) - (last_update.tv_sec * 1e6 + last_update.tv_usec); // only read new data every updatePeriod ms!! if ( delay < (updatePeriod * 1000) ) { // 20 ms struct timespec sleep_time = {0, SLEEP_NS}; nanosleep(&sleep_time, NULL); continue; } else { INFO_STREAM << "delay = " << delay/1000 << "ms" << endl; last_update = now; } // reset error variables mdata_errors.length(0); fdata_errors.length(0); // read_mdata() try { { // testing //mdata.state = -2; //mdata.idata[0].state = -2; //mdata.idata[1].state = -2; //mdata.idata[2].state = -2; //mdata.idata[0].meascurr = -2; //mdata.idata[1].meascurr = -2; //mdata.idata[2].meascurr = -2; omni_mutex_lock l(bilt_mutex); // check for a lost connection and try // to reconnect if necessary if ( bilt_connection_lost ) { bilt_reconnect(); } bilt_ps->BILT->get_mdata (&mdata); // testing //cout << "mag num = " << mdata.magnet << endl; //cout << "mag state = " << mdata.state << endl; //cout << "pole 0 = " << mdata.idata[0].state << " : " << mdata.idata[0].meascurr << endl; //cout << "pole 1 = " << mdata.idata[1].state << " : " << mdata.idata[1].meascurr << endl; //cout << "pole 2 = " << mdata.idata[2].state << " : " << mdata.idata[2].meascurr << endl<< endl; } mdata_errors.length(0); } catch (itest::ItestException &e) { create_tango_error (e, mdata_errors, "Read failure" , "Cannot read the mdata structure", "AcquisitionThread::run_undetached"); } // read_fdata() try { for (int i=0; iBILT->pole(i).get_fdata (&fdata[i]); } fdata_errors.length(0); } catch (itest::ItestException &e) { create_tango_error (e, fdata_errors, "Read failure" , "Cannot read the fdata structure", "AcquisitionThread::run_undetached"); } { struct timeval now; gettimeofday (&now, NULL); // copy the read data omni_mutex_lock l(data_mutex); bilt_ps->mdata_errors = mdata_errors; bilt_ps->fdata_errors = fdata_errors; bilt_ps->mdata.magnet = mdata.magnet; bilt_ps->mdata.state = mdata.state; for (int i=0; imdata.idata[i].magnet = mdata.idata[i].magnet; bilt_ps->mdata.idata[i].pole = mdata.idata[i].pole; bilt_ps->mdata.idata[i].state = mdata.idata[i].state; bilt_ps->mdata.idata[i].fail = mdata.idata[i].fail; bilt_ps->mdata.idata[i].measvolt = mdata.idata[i].measvolt; bilt_ps->mdata.idata[i].meascurr = mdata.idata[i].meascurr; bilt_ps->fdata[i].nbrframe_sec = fdata[i].nbrframe_sec; bilt_ps->fdata[i].nbrferr_sec = fdata[i].nbrferr_sec; bilt_ps->fdata[i].rms_ac_sett_sec = fdata[i].rms_ac_sett_sec; bilt_ps->fdata[i].average_sett_sec = fdata[i].average_sett_sec; bilt_ps->fdata[i].nbrferr = fdata[i].nbrferr; } // store time when data was read bilt_ps->data_read_time = now; } } return NULL; } //+------------------------------------------------------------------ /** * method: AcquisitionThread::create_tango_error() * * description: convert an itest exception into a tango error * * * in : - &e : Reference to itest exception * - errors : Tango error list to use, to store exception info * - reason : Reason of the local Tango exception to be added to the stack * - desc : Description for the local Tango exception to be added to the stack * - origin : Origin if the local Tango exception to be added to the stack */ //+------------------------------------------------------------------ void AcquisitionThread::create_tango_error (itest::ItestException &e, Tango::DevErrorList &errors, string reason, string desc, string origin) { DEBUG_STREAM << "Bilt::create_tango_exception(): entering... !" << endl; errors.length(e.errors.size() + 1); int i; for(i=0; iget_name() << " : " << (long)delay<< endl; // Try to create a new connection try { new_handle = new itest::TMagnet (bilt_ps->iPAddress.c_str(), bilt_ps->magnetNumber); } catch (itest::ItestException &e) { DEBUG_STREAM << "Reconnection failed with error: " << endl; for(int i=0; i #include #include //+---------------------------------------------------------------------------- /** * Create BiltClass singleton and return it in a C function for Python usage */ //+---------------------------------------------------------------------------- extern "C" { #ifdef WIN32 __declspec(dllexport) #endif Tango::DeviceClass *_create_Bilt_class(const char *name) { return Bilt_ns::BiltClass::init(name); } } namespace Bilt_ns { //+---------------------------------------------------------------------------- // // method : SetPoleCurrentCmd::execute() // // description : method to trigger the execution of the command. // PLEASE DO NOT MODIFY this method core without pogo // // in : - device : The device on which the command must be executed // - in_any : The command input data // // returns : The command output data (packed in the Any object) // //----------------------------------------------------------------------------- CORBA::Any *SetPoleCurrentCmd::execute(Tango::DeviceImpl *device,const CORBA::Any &in_any) { cout2 << "SetPoleCurrentCmd::execute(): arrived" << endl; const Tango::DevVarDoubleArray *argin; extract(in_any, argin); ((static_cast(device))->set_pole_current(argin)); return new CORBA::Any(); } //+---------------------------------------------------------------------------- // // method : SetpointCheckCmd::execute() // // description : method to trigger the execution of the command. // PLEASE DO NOT MODIFY this method core without pogo // // in : - device : The device on which the command must be executed // - in_any : The command input data // // returns : The command output data (packed in the Any object) // //----------------------------------------------------------------------------- CORBA::Any *SetpointCheckCmd::execute(Tango::DeviceImpl *device,const CORBA::Any &in_any) { cout2 << "SetpointCheckCmd::execute(): arrived" << endl; const Tango::DevVarDoubleArray *argin; extract(in_any, argin); return insert((static_cast(device))->setpoint_check(argin)); } //+---------------------------------------------------------------------------- // // method : LocalPoleControlCmd::execute() // // description : method to trigger the execution of the command. // PLEASE DO NOT MODIFY this method core without pogo // // in : - device : The device on which the command must be executed // - in_any : The command input data // // returns : The command output data (packed in the Any object) // //----------------------------------------------------------------------------- CORBA::Any *LocalPoleControlCmd::execute(Tango::DeviceImpl *device,const CORBA::Any &in_any) { cout2 << "LocalPoleControlCmd::execute(): arrived" << endl; const Tango::DevVarShortArray *argin; extract(in_any, argin); ((static_cast(device))->local_pole_control(argin)); return new CORBA::Any(); } //+---------------------------------------------------------------------------- // // method : SetPoleAcCurrentCmd::execute() // // description : method to trigger the execution of the command. // PLEASE DO NOT MODIFY this method core without pogo // // in : - device : The device on which the command must be executed // - in_any : The command input data // // returns : The command output data (packed in the Any object) // //----------------------------------------------------------------------------- CORBA::Any *SetPoleAcCurrentCmd::execute(Tango::DeviceImpl *device,const CORBA::Any &in_any) { cout2 << "SetPoleAcCurrentCmd::execute(): arrived" << endl; const Tango::DevVarDoubleArray *argin; extract(in_any, argin); ((static_cast(device))->set_pole_ac_current(argin)); return new CORBA::Any(); } //+---------------------------------------------------------------------------- // // method : OnCmd::execute() // // description : method to trigger the execution of the command. // PLEASE DO NOT MODIFY this method core without pogo // // in : - device : The device on which the command must be executed // - in_any : The command input data // // returns : The command output data (packed in the Any object) // //----------------------------------------------------------------------------- CORBA::Any *OnCmd::execute(Tango::DeviceImpl *device,const CORBA::Any &in_any) { cout2 << "OnCmd::execute(): arrived" << endl; ((static_cast(device))->on()); return new CORBA::Any(); } //+---------------------------------------------------------------------------- // // method : OffCmd::execute() // // description : method to trigger the execution of the command. // PLEASE DO NOT MODIFY this method core without pogo // // in : - device : The device on which the command must be executed // - in_any : The command input data // // returns : The command output data (packed in the Any object) // //----------------------------------------------------------------------------- CORBA::Any *OffCmd::execute(Tango::DeviceImpl *device,const CORBA::Any &in_any) { cout2 << "OffCmd::execute(): arrived" << endl; ((static_cast(device))->off()); return new CORBA::Any(); } //+---------------------------------------------------------------------------- // // method : ResetCmd::execute() // // description : method to trigger the execution of the command. // PLEASE DO NOT MODIFY this method core without pogo // // in : - device : The device on which the command must be executed // - in_any : The command input data // // returns : The command output data (packed in the Any object) // //----------------------------------------------------------------------------- CORBA::Any *ResetCmd::execute(Tango::DeviceImpl *device,const CORBA::Any &in_any) { cout2 << "ResetCmd::execute(): arrived" << endl; ((static_cast(device))->reset()); return new CORBA::Any(); } // //---------------------------------------------------------------- // Initialize pointer for singleton pattern //---------------------------------------------------------------- // BiltClass *BiltClass::_instance = NULL; //+---------------------------------------------------------------------------- // // method : BiltClass::BiltClass(string &s) // // description : constructor for the BiltClass // // in : - s : The class name // //----------------------------------------------------------------------------- BiltClass::BiltClass(string &s):DeviceClass(s) { cout2 << "Entering BiltClass constructor" << endl; set_default_property(); get_class_property(); write_class_property(); cout2 << "Leaving BiltClass constructor" << endl; } //+---------------------------------------------------------------------------- // // method : BiltClass::~BiltClass() // // description : destructor for the BiltClass // //----------------------------------------------------------------------------- BiltClass::~BiltClass() { _instance = NULL; } //+---------------------------------------------------------------------------- // // method : BiltClass::instance // // description : Create the object if not already done. Otherwise, just // return a pointer to the object // // in : - name : The class name // //----------------------------------------------------------------------------- BiltClass *BiltClass::init(const char *name) { if (_instance == NULL) { try { string s(name); _instance = new BiltClass(s); } catch (bad_alloc) { throw; } } return _instance; } BiltClass *BiltClass::instance() { if (_instance == NULL) { cerr << "Class is not initialised !!" << endl; exit(-1); } return _instance; } //+---------------------------------------------------------------------------- // // method : BiltClass::command_factory // // description : Create the command object(s) and store them in the // command list // //----------------------------------------------------------------------------- void BiltClass::command_factory() { command_list.push_back(new OnCmd("On", Tango::DEV_VOID, Tango::DEV_VOID, "", "", Tango::OPERATOR)); command_list.push_back(new OffCmd("Off", Tango::DEV_VOID, Tango::DEV_VOID, "", "", Tango::OPERATOR)); command_list.push_back(new ResetCmd("Reset", Tango::DEV_VOID, Tango::DEV_VOID, "", "", Tango::OPERATOR)); command_list.push_back(new SetPoleAcCurrentCmd("SetPoleAcCurrent", Tango::DEVVAR_DOUBLEARRAY, Tango::DEV_VOID, "", "", Tango::OPERATOR)); command_list.push_back(new LocalPoleControlCmd("LocalPoleControl", Tango::DEVVAR_SHORTARRAY, Tango::DEV_VOID, "", "", Tango::OPERATOR)); command_list.push_back(new SetpointCheckCmd("SetpointCheck", Tango::DEVVAR_DOUBLEARRAY, Tango::DEV_BOOLEAN, "Setpoint values for the Poles", "true when settings are OK", Tango::OPERATOR)); command_list.push_back(new SetPoleCurrentCmd("SetPoleCurrent", Tango::DEVVAR_DOUBLEARRAY, Tango::DEV_VOID, "", "", Tango::OPERATOR)); // add polling if any for (unsigned int i=0 ; ilength() ; i++) { cout4 << "Device name : " << (*devlist_ptr)[i].in() << endl; // Create devices and add it into the device list //---------------------------------------------------- device_list.push_back(new Bilt(this, (*devlist_ptr)[i])); // Export device to the outside world // Check before if database used. //--------------------------------------------- if ((Tango::Util::_UseDb == true) && (Tango::Util::_FileDb == false)) export_device(device_list.back()); else export_device(device_list.back(), (*devlist_ptr)[i]); } // End of Automatic code generation //------------------------------------------------------------- } //+---------------------------------------------------------------------------- // Method: BiltClass::attribute_factory(vector &att_list) //----------------------------------------------------------------------------- void BiltClass::attribute_factory(vector &att_list) { // Attribute : Currents CurrentsAttrib *currents = new CurrentsAttrib(); Tango::UserDefaultAttrProp currents_prop; currents_prop.set_label("Currents"); currents_prop.set_unit("A"); currents_prop.set_format("%6.4f"); currents_prop.set_max_value("1.8"); currents_prop.set_min_value("-1.8"); currents_prop.set_description("The measured currents of the three poles."); currents->set_default_properties(currents_prop); att_list.push_back(currents); // Attribute : Voltages VoltagesAttrib *voltages = new VoltagesAttrib(); Tango::UserDefaultAttrProp voltages_prop; voltages_prop.set_label("Voltages"); voltages_prop.set_unit("V"); voltages_prop.set_format("%6.4"); voltages_prop.set_description("The measured voltages of the three poles."); voltages->set_default_properties(voltages_prop); att_list.push_back(voltages); // Attribute : Impedances ImpedancesAttrib *impedances = new ImpedancesAttrib(); Tango::UserDefaultAttrProp impedances_prop; impedances_prop.set_label("Impedances"); impedances_prop.set_unit("Ohm"); impedances_prop.set_format("%4.2f"); impedances_prop.set_max_alarm("5.0"); impedances_prop.set_min_alarm("2.8"); impedances_prop.set_description("Calculated impedances for the three poles."); impedances->set_default_properties(impedances_prop); att_list.push_back(impedances); // Attribute : SetCurrentsRMS SetCurrentsRMSAttrib *set_currents_rms = new SetCurrentsRMSAttrib(); Tango::UserDefaultAttrProp set_currents_rms_prop; set_currents_rms_prop.set_label("RMS AC current setpoints/s"); set_currents_rms_prop.set_unit("A"); set_currents_rms_prop.set_format("%6.4"); set_currents_rms_prop.set_description("Statistic when driven by the Libera. One RMS value for every pole\nof the magnet.\nRMS value of the AC setpoint applied on the DAC during the last second.\nX=sqr( (sum(setAC)*sum(setAC)) / n - ((sum(setAC)/n) *(sum(setAC)/n)) )"); set_currents_rms->set_default_properties(set_currents_rms_prop); att_list.push_back(set_currents_rms); // Attribute : SetCurrentsAverage SetCurrentsAverageAttrib *set_currents_average = new SetCurrentsAverageAttrib(); Tango::UserDefaultAttrProp set_currents_average_prop; set_currents_average_prop.set_label("Average AC current setpoints/s"); set_currents_average_prop.set_unit("A"); set_currents_average_prop.set_format("%6.4"); set_currents_average_prop.set_description("Statistic when driven by the Libera. One average value for every pole\nof the magnet.\nRMS value of the AC setpoint applied on the DAC during the last second.\nX=sqr( (sum(setAC)*sum(setAC)) / n - ((sum(setAC)/n) *(sum(setAC)/n)) )"); set_currents_average->set_default_properties(set_currents_average_prop); att_list.push_back(set_currents_average); // Attribute : FramesPerSecond FramesPerSecondAttrib *frames_per_second = new FramesPerSecondAttrib(); Tango::UserDefaultAttrProp frames_per_second_prop; frames_per_second_prop.set_label("Frames per second"); frames_per_second_prop.set_display_unit(" "); frames_per_second_prop.set_format("%6d"); frames_per_second->set_default_properties(frames_per_second_prop); att_list.push_back(frames_per_second); // Attribute : ErrorsPerSecond ErrorsPerSecondAttrib *errors_per_second = new ErrorsPerSecondAttrib(); Tango::UserDefaultAttrProp errors_per_second_prop; errors_per_second_prop.set_label("Errors per second"); errors_per_second_prop.set_display_unit(" "); errors_per_second_prop.set_format("%6d"); errors_per_second->set_default_properties(errors_per_second_prop); att_list.push_back(errors_per_second); // Attribute : ErrorCounters ErrorCountersAttrib *error_counters = new ErrorCountersAttrib(); Tango::UserDefaultAttrProp error_counters_prop; error_counters_prop.set_label("Error counters"); error_counters_prop.set_unit(" "); error_counters_prop.set_format("%6d"); error_counters_prop.set_description("Statistic when driven by the Libera.\nThe total number of errors since the last reset for the \nthree poles."); error_counters->set_default_properties(error_counters_prop); att_list.push_back(error_counters); // Attribute : LocalControls LocalControlsAttrib *local_controls = new LocalControlsAttrib(); att_list.push_back(local_controls); // Attribute : Temperatures TemperaturesAttrib *temperatures = new TemperaturesAttrib(); Tango::UserDefaultAttrProp temperatures_prop; temperatures_prop.set_label("Temeratureses"); temperatures_prop.set_unit("C"); temperatures_prop.set_format("%6d"); temperatures_prop.set_description("Temperature measurements for the three poles."); temperatures->set_default_properties(temperatures_prop); temperatures->set_polling_period(30000); att_list.push_back(temperatures); // End of Automatic code generation //------------------------------------------------------------- } //+---------------------------------------------------------------------------- // // method : BiltClass::get_class_property() // // description : Read the class properties from database. // //----------------------------------------------------------------------------- void BiltClass::get_class_property() { // Initialize your default values here (if not done with POGO). //------------------------------------------------------------------ // Read class properties from database.(Automatic code generation) //------------------------------------------------------------------ // Call database and extract values //-------------------------------------------- if (Tango::Util::instance()->_UseDb==true) get_db_class()->get_property(cl_prop); Tango::DbDatum def_prop; int i = -1; // End of Automatic code generation //------------------------------------------------------------------ } //+---------------------------------------------------------------------------- // // method : BiltClass::set_default_property // // description: Set default property (class and device) for wizard. // For each property, add to wizard property name and description // If default value has been set, add it to wizard property and // store it in a DbDatum. // //----------------------------------------------------------------------------- void BiltClass::set_default_property() { string prop_name; string prop_desc; string prop_def; vector vect_data; // Set Default Class Properties // Set Default Device Properties prop_name = "IPAddress"; prop_desc = "IP Address of BILT controller.\nEach controller includes several magnets and\neach magnet includes 3 power supplies,\nfor corrections in the X, Y and Z planes.\n\n"; prop_def = "0.0.0.0"; vect_data.clear(); vect_data.push_back("0.0.0.0"); if (prop_def.length()>0) { Tango::DbDatum data(prop_name); data << vect_data ; dev_def_prop.push_back(data); add_wiz_dev_prop(prop_name, prop_desc, prop_def); } else add_wiz_dev_prop(prop_name, prop_desc); prop_name = "MagnetNumber"; prop_desc = "Magnet number from 1 to 48"; prop_def = "0"; vect_data.clear(); vect_data.push_back("0"); if (prop_def.length()>0) { Tango::DbDatum data(prop_name); data << vect_data ; dev_def_prop.push_back(data); add_wiz_dev_prop(prop_name, prop_desc, prop_def); } else add_wiz_dev_prop(prop_name, prop_desc); prop_name = "UpdatePeriod"; prop_desc = "The update period for the data reading from the power supply in milli seconds."; prop_def = "1000"; vect_data.clear(); vect_data.push_back("1000"); if (prop_def.length()>0) { Tango::DbDatum data(prop_name); data << vect_data ; dev_def_prop.push_back(data); add_wiz_dev_prop(prop_name, prop_desc, prop_def); } else add_wiz_dev_prop(prop_name, prop_desc); } //+---------------------------------------------------------------------------- // // method : BiltClass::write_class_property // // description : Set class description as property in database // //----------------------------------------------------------------------------- void BiltClass::write_class_property() { // First time, check if database used //-------------------------------------------- if (Tango::Util::_UseDb == false) return; Tango::DbData data; string classname = get_name(); string header; string::size_type start, end; // Put title Tango::DbDatum title("ProjectTitle"); string str_title("BILT multi channel power supply"); title << str_title; data.push_back(title); // Put Description Tango::DbDatum description("Description"); vector str_desc; str_desc.push_back("The BILT multi channel power supply will be used with 3 channels for the ESRF fast"); str_desc.push_back("feedback systems."); str_desc.push_back("The power supply can be controlled in 2 ways :"); str_desc.push_back("By this device server for slow or human control or"); str_desc.push_back("by the Libera Beam Position monitors for fast feedback with closed loop control."); str_desc.push_back("The devices are exported as one device per steerer magnet. Every device has three"); str_desc.push_back("channels. The channels (poles) cannot be switched on individually but have their"); str_desc.push_back("individual set points and measurement values."); description << str_desc; data.push_back(description); // put cvs or svn location string filename(classname); filename += "Class.cpp"; // Create a string with the class ID to // get the string into the binary string class_id(ClassId); // check for cvs information string src_path(CvsPath); start = src_path.find("/"); if (start!=string::npos) { end = src_path.find(filename); if (end>start) { string strloc = src_path.substr(start, end-start); // Check if specific repository start = strloc.find("/cvsroot/"); if (start!=string::npos && start>0) { string repository = strloc.substr(0, start); if (repository.find("/segfs/")!=string::npos) strloc = "ESRF:" + strloc.substr(start, strloc.length()-start); } Tango::DbDatum cvs_loc("cvs_location"); cvs_loc << strloc; data.push_back(cvs_loc); } } // check for svn information else { string src_path(SvnPath); start = src_path.find("://"); if (start!=string::npos) { end = src_path.find(filename); if (end>start) { header = "$HeadURL: "; start = header.length(); string strloc = src_path.substr(start, (end-start)); Tango::DbDatum svn_loc("svn_location"); svn_loc << strloc; data.push_back(svn_loc); } } } // Get CVS or SVN revision tag // CVS tag string tagname(TagName); header = "$Name: "; start = header.length(); string endstr(" $"); end = tagname.find(endstr); if (end!=string::npos && end>start) { string strtag = tagname.substr(start, end-start); Tango::DbDatum cvs_tag("cvs_tag"); cvs_tag << strtag; data.push_back(cvs_tag); } // SVN tag string svnpath(SvnPath); header = "$HeadURL: "; start = header.length(); end = svnpath.find(endstr); if (end!=string::npos && end>start) { string strloc = svnpath.substr(start, end-start); string tagstr ("/tags/"); start = strloc.find(tagstr); if ( start!=string::npos ) { start = start + tagstr.length(); end = strloc.find(filename); string strtag = strloc.substr(start, end-start-1); Tango::DbDatum svn_tag("svn_tag"); svn_tag << strtag; data.push_back(svn_tag); } } // Get URL location string httpServ(HttpServer); if (httpServ.length()>0) { Tango::DbDatum db_doc_url("doc_url"); db_doc_url << httpServ; data.push_back(db_doc_url); } // Put inheritance Tango::DbDatum inher_datum("InheritedFrom"); vector inheritance; inheritance.push_back("Device_4Impl"); inher_datum << inheritance; data.push_back(inher_datum); // Call database and and values //-------------------------------------------- get_db_class()->put_property(data); } } // namespace Revision-number: 52 Prop-content-length: 123 Content-length: 123 K 10 svn:author V 5 meyer K 8 svn:date V 27 2010-06-24T11:44:00.000000Z K 7 svn:log V 23 Changed version to 3.4 PROPS-END Node-path: powersupply/itest/Bilt/trunk/Makefile Node-kind: file Node-action: change Text-content-length: 6436 Text-content-md5: a3e1b48f70b50792b1cc64b5550f1801 Content-length: 6436 #============================================================================= # # file : Makefile # # description : Include for the Bilt class. # # project : Makefile to generate a Tango server # # $Author: meyer $ # # $Revision: 1.14 $ # # $Log: not supported by cvs2svn $ # Revision 1.13 2010/06/21 07:16:52 meyer # Changed version to 3.3 # # Revision 1.12 2010/06/21 07:13:05 meyer # Added a spectrum attribute for the temperature measurements and changed to libMagnet version 1.4. # # Revision 1.11 2010/03/19 15:27:01 meyer # Canged to version 3.2 # # Revision 1.10 2010/03/16 15:03:33 meyer # Excluded Steerer class. # # Revision 1.9 2010/03/16 14:57:56 meyer # Rlease_3_1 # # Revision 1.8 2010-02-11 16:35:27 meyer # Currents settings understand NaN values. # Deleted StePoleCurrent command. # # Revision 1.7 2010/02/10 16:22:15 meyer # Release_3_0 # # Revision 1.6 2010/02/10 12:27:31 meyer # Restructured Bilt class. # Acquistion is now done by a thread and only the multi channel data # gets exported. A single channel class (BiltCh) was created. # # Revision 1.5 2009/12/18 12:02:18 meyer # Changed version number to 2.1 # # Revision 1.4 2009/12/18 10:19:23 meyer # Using libMagnet version 130 now. # # Revision 1.3 2009/11/27 13:49:26 meyer # Modified structure! The pole is no longer a device. # The device is now a magnet with three poles. # # Revision 1.2 2009/11/26 10:46:58 meyer # Updated for libMagnet_V120 # # Revision 1.1.1.1 2009/11/04 16:23:02 meyer # Imported using TkCVS # # # copyleft : European Synchrotron Radiation Facility # BP 220, Grenoble 38043 # FRANCE # #============================================================================= # This file is generated by POGO # (Program Obviously used to Generate tango Object) # # (c) - Software Engineering Group - ESRF #============================================================================= # CLASS = Bilt MAJOR_VERS = 3 MINOR_VERS = 4 RELEASE = Release_$(MAJOR_VERS)_$(MINOR_VERS) OS = $(shell /csadmin/common/scripts/get_os) PROCESSOR = $(shell uname -p) #----------------------------------------- # Set default home directories #----------------------------------------- TANGO_HOME = /segfs/tango/release/$(BIN_DIR) CPP_SERVERS = $(TANGO_HOME)/classes ifdef no_debug DEBUG = -O else DEBUG = -g endif ifdef _solaris CC = CC BIN_DIR=$(OS)_CC AR_SL = $(CC) -mt -G VERS_OPT = -h SL_EXT = so endif ifdef linux CC = c++ CC_SHLIB = $(CC) -fPIC $(PROCESSOR)=1 ifdef x86_64 NBITS=_64 endif BIN_DIR=$(OS)$(NBITS) AR_SL = $(CC) -fPIC -shared SL_EXT = so VERS_OPT = -Wl,-soname, endif INCLUDE_DIRS = -I$(TANGO_HOME)/include -I. \ -I$(CPP_SERVERS)/include \ -I libMagnet_V140 OBJS_DIR = obj/$(BIN_DIR) LIB_DIRS = -L $(CPP_SERVERS)/lib \ -L $(TANGO_HOME)/lib \ -L libMagnet_V140 TARGET_LIB = $(CPP_SERVERS)/lib/libtgclasses.a #----------------------------------------- # Set CXXFLAGS and LFLAGS #----------------------------------------- ifdef _solaris CXXFLAGS = $(DEBUG) -mt -D_PTHREADS $(INCLUDE_DIRS) LFLAGS = $(DEBUG) $(LIB_DIRS) \ -ltango \ -llog4tango \ -lomniORB4 \ -lomniDynamic4 \ -lomnithread \ -lCOS4 \ -lpthread \ -lposix4 -lsocket -lnsl \ -ltgclasses endif ifdef linux CXXFLAGS = -g -D_REENTRANT $(INCLUDE_DIRS) LFLAGS = $(DEBUG) $(LIB_DIRS) \ -ltango \ -llog4tango \ -lomniORB4 \ -lomniDynamic4 \ -lomnithread \ -lCOS4 \ -ldl -lpthread \ -lMagnet \ -ltgclasses endif #----------------------------------------- # Set dependences #----------------------------------------- SVC_OBJS = $(OBJS_DIR)/$(CLASS).o \ $(OBJS_DIR)/$(CLASS)StateMachine.o \ $(OBJS_DIR)/$(CLASS)Class.o \ $(OBJS_DIR)/AcquisitionThread.o \ $(OBJS_DIR)/ClassFactory.o \ $(OBJS_DIR)/main.o SHLIB_OBJS = $(OBJS_DIR)/$(CLASS)Class.so.o \ $(OBJS_DIR)/$(CLASS)StateMachine.so.o \ $(OBJS_DIR)/$(CLASS).so.o \ $(OBJS_DIR)/AcquisitionThread.o SVC_INC = $(CLASS)Class.h \ $(CLASS).h \ AcquisitionThread.h $(OBJS_DIR)/%.o: %.cpp $(SVC_INC) $(CC) $(CXXFLAGS) -c $< -o $(OBJS_DIR)/$*.o $(OBJS_DIR)/%.so.o: %.cpp $(SVC_INC) $(CC_SHLIB) $(CXXFLAGS) -c $< -o $(OBJS_DIR)/$*.so.o #----------------------------------------- # Make Entry #----------------------------------------- all: $(CLASS) $(CLASS): make_obj_dir make_bin_dir $(SVC_OBJS) $(CC) $(SVC_OBJS) -o $(CLASS) $(LFLAGS) @mv $(CLASS) bin/$(BIN_DIR)/$(CLASS) shlib: make_obj_dir make_shlib_dir $(SHLIB_OBJS) $(AR_SL) -o \ shlib/$(BIN_DIR)/$(CLASS).$(SL_EXT).$(MAJOR_VERS).$(MINOR_VERS) \ $(VERS_OPT)$(CLASS).$(SL_EXT).$(MAJOR_VERS) \ $(SHLIB_OBJS) $(LFLAGS) @rm -f shlib/$(BIN_DIR)/$(CLASS).$(SL_EXT) @cd shlib/$(BIN_DIR); \ ln -s $(CLASS).$(SL_EXT).$(MAJOR_VERS).$(MINOR_VERS) $(CLASS).$(SL_EXT) clean: rm -f $(OBJS_DIR)/*.o \ $(OBJS_DIR)/*.so.o \ bin/$(BIN_DIR)/$(CLASS) \ core make_obj_dir: @mkdir -p obj @mkdir -p obj/$(BIN_DIR) make_bin_dir: @mkdir -p bin @mkdir -p bin/$(BIN_DIR) make_shlib_dir: @mkdir -p shlib @mkdir -p shlib/$(BIN_DIR) #----------------------------------------- # Install binary file #----------------------------------------- install: cp bin/$(BIN_DIR)/$(CLASS) $(CPP_SERVERS)/bin #----------------------------------------- # Update class library and header files # recompile without debug mode. #----------------------------------------- lib: clean @make no_debug=1 cp *.h $(CPP_SERVERS)/include ar ruv $(TARGET_LIB) $(OBJS_DIR)/$(CLASS).o ar ruv $(TARGET_LIB) $(OBJS_DIR)/$(CLASS)Class.o ar ruv $(TARGET_LIB) $(OBJS_DIR)/$(CLASS)StateMachine.o ar ruv $(TARGET_LIB) $(OBJS_DIR)/AcquisitionThread.o ident $(TARGET_LIB) | grep $(CLASS) #------------------------------------------------------ # Tag the CVS/SVN module corresponding to this class # copy cvs_tag or svn_tag to tag: entry #------------------------------------------------------ #svn_tag: # svn copy ../trunk ../tags/$(RELEASE) # svn commit ../tags/$(RELEASE) \ # -m "Tagging the $(RELEASE) of the $(CLASS) project." # #cvs_tag: # @cvstag "$(CLASS)-$(RELEASE)" # @make $(CLASS) # @make show_tag #show_cvs_tag: # @cvstag -d # # Only these make options work with the current Pogo version 5.3.x! tag: @cvstag "$(CLASS)-$(RELEASE)" @make $(CLASS) @make show_tag show_tag: @cvstag -d Revision-number: 53 Prop-content-length: 147 Content-length: 147 K 8 svn:date V 27 2010-06-24T11:44:01.000000Z K 7 svn:log V 73 This commit was manufactured by cvs2svn to create tag 'Bilt-Release_3_4'. PROPS-END Node-path: powersupply/itest/Bilt/tags/Bilt-Release_3_4 Node-kind: dir Node-action: add Node-copyfrom-rev: 52 Node-copyfrom-path: powersupply/itest/Bilt/trunk Revision-number: 54 Prop-content-length: 143 Content-length: 143 K 10 svn:author V 5 meyer K 8 svn:date V 27 2010-08-31T07:54:48.000000Z K 7 svn:log V 43 Changed impedence alarm calculation limit. PROPS-END Node-path: powersupply/itest/Bilt/trunk/Bilt.h Node-kind: file Node-action: change Text-content-length: 12343 Text-content-md5: 4c29dc79e401f1b09acaaf7cf7edc5f7 Content-length: 12343 //============================================================================= // // file : Bilt.h // // description : Include for the Bilt class. // // project : BILT multi channel power supply // // $Author: meyer $ // // $Revision: 1.11 $ // $Date: 2010-08-31 07:54:48 $ // // SVN only: // $HeadURL: $ // // CVS only: // $Source: /segfs/tango/cvsroot/cppserver/machine/powersupply/SrSteerers/tango/Bilt/Bilt.h,v $ // $Log: not supported by cvs2svn $ // Revision 1.10 2010/06/21 07:13:05 meyer // Added a spectrum attribute for the temperature measurements and changed to libMagnet version 1.4. // // Revision 1.9 2010/05/01 16:58:39 meyer // Changed alarm limits for the impedance attribute. // // Revision 1.8 2010/03/16 14:54:58 meyer // Added reconnection method. // // Revision 1.7 2010-02-12 16:35:13 meyer // Added SetPoleCurrent command again. // // Revision 1.6 2010-02-11 16:35:27 meyer // Currents settings understand NaN values. // Deleted StePoleCurrent command. // // Revision 1.5 2010/02/10 12:27:31 meyer // Restructured Bilt class. // Acquistion is now done by a thread and only the multi channel data // gets exported. A single channel class (BiltCh) was created. // // Revision 1.4 2009/11/27 13:49:26 meyer // Modified structure! The pole is no longer a device. // The device is now a magnet with three poles. // // Revision 1.3 2009/11/26 10:46:58 meyer // Updated for libMagnet_V120 // // Revision 1.2 2009/11/06 12:46:25 meyer // Added impedance attribute and corrected fromatting of attribute values. // // Revision 1.1.1.1 2009/11/04 16:23:02 meyer // Imported using TkCVS // // // copyleft : European Synchrotron Radiation Facility // BP 220, Grenoble 38043 // FRANCE // //============================================================================= // // This file is generated by POGO // (Program Obviously used to Generate tango Object) // // (c) - Software Engineering Group - ESRF //============================================================================= #ifndef _BILT_H #define _BILT_H #include #include #include //using namespace Tango; /** * @author $Author: meyer $ * @version $Revision: 1.11 $ */ // Add your own constant definitions here. //----------------------------------------------- // Number of poles per magnet #define POLES 3 // Current limit for a valid impedeance calculation #define CURRENT_LIMIT 0.05 // define sleep times #define SLEEP_NS 20000000 // 20 ms namespace Bilt_ns { class AcquisitionThread; /** * Class Description: * The BILT multi channel power supply will be used with 3 channels for the ESRF fast * feedback systems. * The power supply can be controlled in 2 ways : * By this device server for slow or human control or * by the Libera Beam Position monitors for fast feedback with closed loop control. * The devices are exported as one device per steerer magnet. Every device has three * channels. The channels (poles) cannot be switched on individually but have their * individual set points and measurement values. */ /* * Device States Description: * Tango::ON : Magnet is ON, all three channels are ON. * Tango::OFF : Magnet is OFF, all three channels are OFF. * Tango::FAULT : Error detected by the BILT magnet. * Tango::ALARM : Alarm detected on one or more channels. * Tango::UNKNOWN : Communication fault */ class Bilt: public Tango::Device_4Impl { public : // Add your own data members here //----------------------------------------- // Here is the Start of the automatic code generation part //------------------------------------------------------------- /** * @name attributes * Attribute member data. */ //@{ Tango::DevDouble *attr_Currents_read; Tango::DevDouble attr_Currents_write; Tango::DevDouble *attr_Voltages_read; Tango::DevDouble *attr_Impedances_read; Tango::DevDouble *attr_SetCurrentsRMS_read; Tango::DevDouble *attr_SetCurrentsAverage_read; Tango::DevULong *attr_FramesPerSecond_read; Tango::DevULong *attr_ErrorsPerSecond_read; Tango::DevULong *attr_ErrorCounters_read; Tango::DevBoolean *attr_LocalControls_read; Tango::DevLong *attr_Temperatures_read; //@} /** * @name Device properties * Device properties member data. */ //@{ /** * IP Address of BILT controller. * Each controller includes several magnets and * each magnet includes 3 power supplies, * for corrections in the X, Y and Z planes. * * */ string iPAddress; /** * Magnet number from 1 to 48 */ Tango::DevShort magnetNumber; /** * The update period for the data reading from the power supply in milli seconds. */ Tango::DevLong updatePeriod; //@} /** * @name Device properties * Device property member data. */ //@{ //@} /**@name Constructors * Miscellaneous constructors */ //@{ /** * Constructs a newly allocated Command object. * * @param cl Class. * @param s Device Name */ Bilt(Tango::DeviceClass *cl,string &s); /** * Constructs a newly allocated Command object. * * @param cl Class. * @param s Device Name */ Bilt(Tango::DeviceClass *cl,const char *s); /** * Constructs a newly allocated Command object. * * @param cl Class. * @param s Device name * @param d Device description. */ Bilt(Tango::DeviceClass *cl,const char *s,const char *d); //@} /**@name Destructor * Only one destructor is defined for this class */ //@{ /** * The object destructor. */ ~Bilt() {delete_device();}; /** * will be called at device destruction or at init command. */ void delete_device(); //@} /**@name Miscellaneous methods */ //@{ /** * Initialize the device */ virtual void init_device(); /** * Always executed method before execution command method. */ virtual void always_executed_hook(); //@} /** * @name Bilt methods prototypes */ //@{ /** * Hardware acquisition for attributes. */ virtual void read_attr_hardware(vector &attr_list); /** * Extract real attribute values for Currents acquisition result. */ virtual void read_Currents(Tango::Attribute &attr); /** * Write Currents attribute values to hardware. */ virtual void write_Currents(Tango::WAttribute &attr); /** * Extract real attribute values for Voltages acquisition result. */ virtual void read_Voltages(Tango::Attribute &attr); /** * Extract real attribute values for Impedances acquisition result. */ virtual void read_Impedances(Tango::Attribute &attr); /** * Extract real attribute values for SetCurrentsRMS acquisition result. */ virtual void read_SetCurrentsRMS(Tango::Attribute &attr); /** * Extract real attribute values for SetCurrentsAverage acquisition result. */ virtual void read_SetCurrentsAverage(Tango::Attribute &attr); /** * Extract real attribute values for FramesPerSecond acquisition result. */ virtual void read_FramesPerSecond(Tango::Attribute &attr); /** * Extract real attribute values for ErrorsPerSecond acquisition result. */ virtual void read_ErrorsPerSecond(Tango::Attribute &attr); /** * Extract real attribute values for ErrorCounters acquisition result. */ virtual void read_ErrorCounters(Tango::Attribute &attr); /** * Extract real attribute values for LocalControls acquisition result. */ virtual void read_LocalControls(Tango::Attribute &attr); /** * Extract real attribute values for Temperatures acquisition result. */ virtual void read_Temperatures(Tango::Attribute &attr); /** * Read/Write allowed for Currents attribute. */ virtual bool is_Currents_allowed(Tango::AttReqType type); /** * Read/Write allowed for Voltages attribute. */ virtual bool is_Voltages_allowed(Tango::AttReqType type); /** * Read/Write allowed for Impedances attribute. */ virtual bool is_Impedances_allowed(Tango::AttReqType type); /** * Read/Write allowed for SetCurrentsRMS attribute. */ virtual bool is_SetCurrentsRMS_allowed(Tango::AttReqType type); /** * Read/Write allowed for SetCurrentsAverage attribute. */ virtual bool is_SetCurrentsAverage_allowed(Tango::AttReqType type); /** * Read/Write allowed for FramesPerSecond attribute. */ virtual bool is_FramesPerSecond_allowed(Tango::AttReqType type); /** * Read/Write allowed for ErrorsPerSecond attribute. */ virtual bool is_ErrorsPerSecond_allowed(Tango::AttReqType type); /** * Read/Write allowed for ErrorCounters attribute. */ virtual bool is_ErrorCounters_allowed(Tango::AttReqType type); /** * Read/Write allowed for LocalControls attribute. */ virtual bool is_LocalControls_allowed(Tango::AttReqType type); /** * Read/Write allowed for Temperatures attribute. */ virtual bool is_Temperatures_allowed(Tango::AttReqType type); /** * Execution allowed for On command. */ virtual bool is_On_allowed(const CORBA::Any &any); /** * Execution allowed for Off command. */ virtual bool is_Off_allowed(const CORBA::Any &any); /** * Execution allowed for Reset command. */ virtual bool is_Reset_allowed(const CORBA::Any &any); /** * Execution allowed for SetPoleAcCurrent command. */ virtual bool is_SetPoleAcCurrent_allowed(const CORBA::Any &any); /** * Execution allowed for LocalPoleControl command. */ virtual bool is_LocalPoleControl_allowed(const CORBA::Any &any); /** * Execution allowed for SetpointCheck command. */ virtual bool is_SetpointCheck_allowed(const CORBA::Any &any); /** * Execution allowed for SetPoleCurrent command. */ virtual bool is_SetPoleCurrent_allowed(const CORBA::Any &any); /** * This command gets the device state (stored in its device_state data member) and returns it to the caller. * @return State Code * @exception DevFailed */ virtual Tango::DevState dev_state(); /** * This command gets the device status (stored in its device_status data member) and returns it to the caller. * @return Status description * @exception DevFailed */ virtual Tango::ConstDevString dev_status(); /** * Turns on power supply. * @exception DevFailed */ void on(); /** * Turns of power supply * @exception DevFailed */ void off(); /** * Reset faults and alarms * @exception DevFailed */ void reset(); /** * Set the AC current for one Pole. * [0] = pole number, [1] = current * @param argin * @exception DevFailed */ void set_pole_ac_current(const Tango::DevVarDoubleArray *); /** * Set the AC current for one Pole. * [0] = pole number, [1] = local control true/false * @param argin * @exception DevFailed */ void local_pole_control(const Tango::DevVarShortArray *); /** * Check the given current values against the specified limits. * @param argin Setpoint values for the Poles * @return true when settings are OK * @exception DevFailed */ Tango::DevBoolean setpoint_check(const Tango::DevVarDoubleArray *); /** * Set the current for one Pole. * [0] = pole number, [1] = current * @param argin * @exception DevFailed */ void set_pole_current(const Tango::DevVarDoubleArray *); /** * Read the device properties from database */ void get_device_property(); //@} // Here is the end of the automatic code generation part //------------------------------------------------------------- protected : // Add your own data members here //----------------------------------------- friend class AcquisitionThread; AcquisitionThread *acquisition_thread; omni_mutex data_mutex; omni_mutex bilt_mutex; short exit_thread; struct timeval data_set_time; struct timeval data_read_time; void create_tango_exception (itest::ItestException &e, string reason, string desc, string origin); void create_tango_exception (itest::ItestException &e, Tango::DevErrorList &errors, string reason, string desc, string origin); itest::TMagnet *BILT; bool bilt_connection_lost; struct itest::mdata mdata; struct itest::fdata fdata[POLES]; Tango::DevErrorList mdata_errors; Tango::DevErrorList fdata_errors; vector currents_dc; vector currents_ac; vector voltages; vector impedances; vector currents_rms; vector currents_average; vector frames_per_sec; vector errors_per_sec; vector error_counters; vector temperatures; bool local_control[3]; }; } // namespace_ns #endif // _BILT_H Revision-number: 55 Prop-content-length: 141 Content-length: 141 K 10 svn:author V 5 meyer K 8 svn:date V 27 2010-11-08T15:29:42.000000Z K 7 svn:log V 41 Linking now with libtango.a version 7.2! PROPS-END Node-path: powersupply/itest/Bilt/trunk/Makefile Node-kind: file Node-action: change Text-content-length: 6546 Text-content-md5: 43d5456f5ab77f267c68264ad20281b4 Content-length: 6546 #============================================================================= # # file : Makefile # # description : Include for the Bilt class. # # project : Makefile to generate a Tango server # # $Author: meyer $ # # $Revision: 1.15 $ # # $Log: not supported by cvs2svn $ # Revision 1.14 2010/06/24 11:44:00 meyer # Changed version to 3.4 # # Revision 1.13 2010/06/21 07:16:52 meyer # Changed version to 3.3 # # Revision 1.12 2010/06/21 07:13:05 meyer # Added a spectrum attribute for the temperature measurements and changed to libMagnet version 1.4. # # Revision 1.11 2010/03/19 15:27:01 meyer # Canged to version 3.2 # # Revision 1.10 2010/03/16 15:03:33 meyer # Excluded Steerer class. # # Revision 1.9 2010/03/16 14:57:56 meyer # Rlease_3_1 # # Revision 1.8 2010-02-11 16:35:27 meyer # Currents settings understand NaN values. # Deleted StePoleCurrent command. # # Revision 1.7 2010/02/10 16:22:15 meyer # Release_3_0 # # Revision 1.6 2010/02/10 12:27:31 meyer # Restructured Bilt class. # Acquistion is now done by a thread and only the multi channel data # gets exported. A single channel class (BiltCh) was created. # # Revision 1.5 2009/12/18 12:02:18 meyer # Changed version number to 2.1 # # Revision 1.4 2009/12/18 10:19:23 meyer # Using libMagnet version 130 now. # # Revision 1.3 2009/11/27 13:49:26 meyer # Modified structure! The pole is no longer a device. # The device is now a magnet with three poles. # # Revision 1.2 2009/11/26 10:46:58 meyer # Updated for libMagnet_V120 # # Revision 1.1.1.1 2009/11/04 16:23:02 meyer # Imported using TkCVS # # # copyleft : European Synchrotron Radiation Facility # BP 220, Grenoble 38043 # FRANCE # #============================================================================= # This file is generated by POGO # (Program Obviously used to Generate tango Object) # # (c) - Software Engineering Group - ESRF #============================================================================= # CLASS = Bilt MAJOR_VERS = 3 MINOR_VERS = 4 RELEASE = Release_$(MAJOR_VERS)_$(MINOR_VERS) OS = $(shell /csadmin/common/scripts/get_os) PROCESSOR = $(shell uname -p) #----------------------------------------- # Set default home directories #----------------------------------------- TANGO_HOME = /segfs/tango/release/$(BIN_DIR) CPP_SERVERS = $(TANGO_HOME)/classes ifdef no_debug DEBUG = -O else DEBUG = -g endif ifdef _solaris CC = CC BIN_DIR=$(OS)_CC AR_SL = $(CC) -mt -G VERS_OPT = -h SL_EXT = so endif ifdef linux CC = c++ CC_SHLIB = $(CC) -fPIC $(PROCESSOR)=1 ifdef x86_64 NBITS=_64 endif BIN_DIR=$(OS)$(NBITS) AR_SL = $(CC) -fPIC -shared SL_EXT = so VERS_OPT = -Wl,-soname, endif INCLUDE_DIRS = -I$(TANGO_HOME)/include -I. \ -I$(CPP_SERVERS)/include \ -I libMagnet_V140 OBJS_DIR = obj/$(BIN_DIR) LIB_DIRS = -L $(CPP_SERVERS)/lib \ -L $(TANGO_HOME)/lib \ -L libMagnet_V140 TARGET_LIB = $(CPP_SERVERS)/lib/libtgclasses.a #----------------------------------------- # Set CXXFLAGS and LFLAGS #----------------------------------------- ifdef _solaris CXXFLAGS = $(DEBUG) -mt -D_PTHREADS $(INCLUDE_DIRS) LFLAGS = $(DEBUG) $(LIB_DIRS) \ -ltango \ -llog4tango \ -lomniORB4 \ -lomniDynamic4 \ -lomnithread \ -lCOS4 \ -lpthread \ -lposix4 -lsocket -lnsl \ -ltgclasses endif ifdef linux CXXFLAGS = -g -D_REENTRANT $(INCLUDE_DIRS) LFLAGS = $(DEBUG) $(LIB_DIRS) \ /segfs/tango/release/redhate5/lib/libtango.7.2.0.a \ -llog4tango \ -lomniORB4 \ -lomniDynamic4 \ -lomnithread \ -lCOS4 \ -ldl -lpthread \ -lMagnet \ -ltgclasses endif #----------------------------------------- # Set dependences #----------------------------------------- SVC_OBJS = $(OBJS_DIR)/$(CLASS).o \ $(OBJS_DIR)/$(CLASS)StateMachine.o \ $(OBJS_DIR)/$(CLASS)Class.o \ $(OBJS_DIR)/AcquisitionThread.o \ $(OBJS_DIR)/ClassFactory.o \ $(OBJS_DIR)/main.o SHLIB_OBJS = $(OBJS_DIR)/$(CLASS)Class.so.o \ $(OBJS_DIR)/$(CLASS)StateMachine.so.o \ $(OBJS_DIR)/$(CLASS).so.o \ $(OBJS_DIR)/AcquisitionThread.o SVC_INC = $(CLASS)Class.h \ $(CLASS).h \ AcquisitionThread.h $(OBJS_DIR)/%.o: %.cpp $(SVC_INC) $(CC) $(CXXFLAGS) -c $< -o $(OBJS_DIR)/$*.o $(OBJS_DIR)/%.so.o: %.cpp $(SVC_INC) $(CC_SHLIB) $(CXXFLAGS) -c $< -o $(OBJS_DIR)/$*.so.o #----------------------------------------- # Make Entry #----------------------------------------- all: $(CLASS) $(CLASS): make_obj_dir make_bin_dir $(SVC_OBJS) $(CC) $(SVC_OBJS) -o $(CLASS) $(LFLAGS) @mv $(CLASS) bin/$(BIN_DIR)/$(CLASS) shlib: make_obj_dir make_shlib_dir $(SHLIB_OBJS) $(AR_SL) -o \ shlib/$(BIN_DIR)/$(CLASS).$(SL_EXT).$(MAJOR_VERS).$(MINOR_VERS) \ $(VERS_OPT)$(CLASS).$(SL_EXT).$(MAJOR_VERS) \ $(SHLIB_OBJS) $(LFLAGS) @rm -f shlib/$(BIN_DIR)/$(CLASS).$(SL_EXT) @cd shlib/$(BIN_DIR); \ ln -s $(CLASS).$(SL_EXT).$(MAJOR_VERS).$(MINOR_VERS) $(CLASS).$(SL_EXT) clean: rm -f $(OBJS_DIR)/*.o \ $(OBJS_DIR)/*.so.o \ bin/$(BIN_DIR)/$(CLASS) \ core make_obj_dir: @mkdir -p obj @mkdir -p obj/$(BIN_DIR) make_bin_dir: @mkdir -p bin @mkdir -p bin/$(BIN_DIR) make_shlib_dir: @mkdir -p shlib @mkdir -p shlib/$(BIN_DIR) #----------------------------------------- # Install binary file #----------------------------------------- install: cp bin/$(BIN_DIR)/$(CLASS) $(CPP_SERVERS)/bin #----------------------------------------- # Update class library and header files # recompile without debug mode. #----------------------------------------- lib: clean @make no_debug=1 cp *.h $(CPP_SERVERS)/include ar ruv $(TARGET_LIB) $(OBJS_DIR)/$(CLASS).o ar ruv $(TARGET_LIB) $(OBJS_DIR)/$(CLASS)Class.o ar ruv $(TARGET_LIB) $(OBJS_DIR)/$(CLASS)StateMachine.o ar ruv $(TARGET_LIB) $(OBJS_DIR)/AcquisitionThread.o ident $(TARGET_LIB) | grep $(CLASS) #------------------------------------------------------ # Tag the CVS/SVN module corresponding to this class # copy cvs_tag or svn_tag to tag: entry #------------------------------------------------------ #svn_tag: # svn copy ../trunk ../tags/$(RELEASE) # svn commit ../tags/$(RELEASE) \ # -m "Tagging the $(RELEASE) of the $(CLASS) project." # #cvs_tag: # @cvstag "$(CLASS)-$(RELEASE)" # @make $(CLASS) # @make show_tag #show_cvs_tag: # @cvstag -d # # Only these make options work with the current Pogo version 5.3.x! tag: @cvstag "$(CLASS)-$(RELEASE)" @make $(CLASS) @make show_tag show_tag: @cvstag -d Revision-number: 56 Prop-content-length: 201 Content-length: 201 K 10 svn:author V 5 meyer K 8 svn:date V 27 2010-11-10T11:59:11.000000Z K 7 svn:log V 100 Changed type of Temperatures attribute from long to double. Added default alarm and polling values. PROPS-END Node-path: powersupply/itest/Bilt/trunk/BiltClass.cpp Node-kind: file Node-action: change Text-content-length: 27205 Text-content-md5: dcdaf416c2c4937ac5721a95e516f76d Content-length: 27205 static const char *ClassId = "$Id: BiltClass.cpp,v 1.15 2010-11-10 11:59:11 meyer Exp $"; static const char *TagName = "$Name: not supported by cvs2svn $"; static const char *CvsPath = "$Source: /segfs/tango/cvsroot/cppserver/machine/powersupply/SrSteerers/tango/Bilt/BiltClass.cpp,v $"; static const char *SvnPath = "$HeadURL: $"; static const char *HttpServer = "http://www.esrf.fr/computing/cs/tango/tango_doc/ds_doc/"; //+============================================================================= // // file : BiltClass.cpp // // description : C++ source for the BiltClass. A singleton // class derived from DeviceClass. It implements the // command list and all properties and methods required // by the Bilt once per process. // // project : TANGO Device Server // // $Author: meyer $ // // $Revision: 1.15 $ // // $Log: not supported by cvs2svn $ // Revision 1.14 2010/06/24 11:43:10 meyer // Corrected memory leak when the reconnection to the power supply fails. // // Revision 1.13 2010/06/21 07:13:05 meyer // Added a spectrum attribute for the temperature measurements and changed to libMagnet version 1.4. // // Revision 1.12 2010/05/01 16:58:39 meyer // Changed alarm limits for the impedance attribute. // // Revision 1.11 2010/03/16 15:03:33 meyer // Excluded Steerer class. // // Revision 1.10 2010-02-12 16:35:13 meyer // Added SetPoleCurrent command again. // // Revision 1.9 2010-02-11 16:35:27 meyer // Currents settings understand NaN values. // Deleted StePoleCurrent command. // // Revision 1.8 2010/02/10 16:22:15 meyer // Release_3_0 // // Revision 1.7 2010/02/10 12:27:31 meyer // Restructured Bilt class. // Acquistion is now done by a thread and only the multi channel data // gets exported. A single channel class (BiltCh) was created. // // Revision 1.6 2009/12/18 12:02:18 meyer // Changed version number to 2.1 // // Revision 1.5 2009/11/27 13:49:26 meyer // Modified structure! The pole is no longer a device. // The device is now a magnet with three poles. // // Revision 1.4 2009/11/26 10:46:58 meyer // Updated for libMagnet_V120 // // Revision 1.3 2009/11/23 16:46:58 meyer // Corrected state, status and exception handling // // Revision 1.2 2009/11/06 12:46:25 meyer // Added impedance attribute and corrected fromatting of attribute values. // // Revision 1.1.1.1 2009/11/04 16:23:02 meyer // Imported using TkCVS // // // copyleft : European Synchrotron Radiation Facility // BP 220, Grenoble 38043 // FRANCE // //-============================================================================= // // This file is generated by POGO // (Program Obviously used to Generate tango Object) // // (c) - Software Engineering Group - ESRF //============================================================================= #include #include #include //+---------------------------------------------------------------------------- /** * Create BiltClass singleton and return it in a C function for Python usage */ //+---------------------------------------------------------------------------- extern "C" { #ifdef WIN32 __declspec(dllexport) #endif Tango::DeviceClass *_create_Bilt_class(const char *name) { return Bilt_ns::BiltClass::init(name); } } namespace Bilt_ns { //+---------------------------------------------------------------------------- // // method : SetPoleCurrentCmd::execute() // // description : method to trigger the execution of the command. // PLEASE DO NOT MODIFY this method core without pogo // // in : - device : The device on which the command must be executed // - in_any : The command input data // // returns : The command output data (packed in the Any object) // //----------------------------------------------------------------------------- CORBA::Any *SetPoleCurrentCmd::execute(Tango::DeviceImpl *device,const CORBA::Any &in_any) { cout2 << "SetPoleCurrentCmd::execute(): arrived" << endl; const Tango::DevVarDoubleArray *argin; extract(in_any, argin); ((static_cast(device))->set_pole_current(argin)); return new CORBA::Any(); } //+---------------------------------------------------------------------------- // // method : SetpointCheckCmd::execute() // // description : method to trigger the execution of the command. // PLEASE DO NOT MODIFY this method core without pogo // // in : - device : The device on which the command must be executed // - in_any : The command input data // // returns : The command output data (packed in the Any object) // //----------------------------------------------------------------------------- CORBA::Any *SetpointCheckCmd::execute(Tango::DeviceImpl *device,const CORBA::Any &in_any) { cout2 << "SetpointCheckCmd::execute(): arrived" << endl; const Tango::DevVarDoubleArray *argin; extract(in_any, argin); return insert((static_cast(device))->setpoint_check(argin)); } //+---------------------------------------------------------------------------- // // method : LocalPoleControlCmd::execute() // // description : method to trigger the execution of the command. // PLEASE DO NOT MODIFY this method core without pogo // // in : - device : The device on which the command must be executed // - in_any : The command input data // // returns : The command output data (packed in the Any object) // //----------------------------------------------------------------------------- CORBA::Any *LocalPoleControlCmd::execute(Tango::DeviceImpl *device,const CORBA::Any &in_any) { cout2 << "LocalPoleControlCmd::execute(): arrived" << endl; const Tango::DevVarShortArray *argin; extract(in_any, argin); ((static_cast(device))->local_pole_control(argin)); return new CORBA::Any(); } //+---------------------------------------------------------------------------- // // method : SetPoleAcCurrentCmd::execute() // // description : method to trigger the execution of the command. // PLEASE DO NOT MODIFY this method core without pogo // // in : - device : The device on which the command must be executed // - in_any : The command input data // // returns : The command output data (packed in the Any object) // //----------------------------------------------------------------------------- CORBA::Any *SetPoleAcCurrentCmd::execute(Tango::DeviceImpl *device,const CORBA::Any &in_any) { cout2 << "SetPoleAcCurrentCmd::execute(): arrived" << endl; const Tango::DevVarDoubleArray *argin; extract(in_any, argin); ((static_cast(device))->set_pole_ac_current(argin)); return new CORBA::Any(); } //+---------------------------------------------------------------------------- // // method : OnCmd::execute() // // description : method to trigger the execution of the command. // PLEASE DO NOT MODIFY this method core without pogo // // in : - device : The device on which the command must be executed // - in_any : The command input data // // returns : The command output data (packed in the Any object) // //----------------------------------------------------------------------------- CORBA::Any *OnCmd::execute(Tango::DeviceImpl *device,const CORBA::Any &in_any) { cout2 << "OnCmd::execute(): arrived" << endl; ((static_cast(device))->on()); return new CORBA::Any(); } //+---------------------------------------------------------------------------- // // method : OffCmd::execute() // // description : method to trigger the execution of the command. // PLEASE DO NOT MODIFY this method core without pogo // // in : - device : The device on which the command must be executed // - in_any : The command input data // // returns : The command output data (packed in the Any object) // //----------------------------------------------------------------------------- CORBA::Any *OffCmd::execute(Tango::DeviceImpl *device,const CORBA::Any &in_any) { cout2 << "OffCmd::execute(): arrived" << endl; ((static_cast(device))->off()); return new CORBA::Any(); } //+---------------------------------------------------------------------------- // // method : ResetCmd::execute() // // description : method to trigger the execution of the command. // PLEASE DO NOT MODIFY this method core without pogo // // in : - device : The device on which the command must be executed // - in_any : The command input data // // returns : The command output data (packed in the Any object) // //----------------------------------------------------------------------------- CORBA::Any *ResetCmd::execute(Tango::DeviceImpl *device,const CORBA::Any &in_any) { cout2 << "ResetCmd::execute(): arrived" << endl; ((static_cast(device))->reset()); return new CORBA::Any(); } // //---------------------------------------------------------------- // Initialize pointer for singleton pattern //---------------------------------------------------------------- // BiltClass *BiltClass::_instance = NULL; //+---------------------------------------------------------------------------- // // method : BiltClass::BiltClass(string &s) // // description : constructor for the BiltClass // // in : - s : The class name // //----------------------------------------------------------------------------- BiltClass::BiltClass(string &s):DeviceClass(s) { cout2 << "Entering BiltClass constructor" << endl; set_default_property(); get_class_property(); write_class_property(); cout2 << "Leaving BiltClass constructor" << endl; } //+---------------------------------------------------------------------------- // // method : BiltClass::~BiltClass() // // description : destructor for the BiltClass // //----------------------------------------------------------------------------- BiltClass::~BiltClass() { _instance = NULL; } //+---------------------------------------------------------------------------- // // method : BiltClass::instance // // description : Create the object if not already done. Otherwise, just // return a pointer to the object // // in : - name : The class name // //----------------------------------------------------------------------------- BiltClass *BiltClass::init(const char *name) { if (_instance == NULL) { try { string s(name); _instance = new BiltClass(s); } catch (bad_alloc) { throw; } } return _instance; } BiltClass *BiltClass::instance() { if (_instance == NULL) { cerr << "Class is not initialised !!" << endl; exit(-1); } return _instance; } //+---------------------------------------------------------------------------- // // method : BiltClass::command_factory // // description : Create the command object(s) and store them in the // command list // //----------------------------------------------------------------------------- void BiltClass::command_factory() { command_list.push_back(new OnCmd("On", Tango::DEV_VOID, Tango::DEV_VOID, "", "", Tango::OPERATOR)); command_list.push_back(new OffCmd("Off", Tango::DEV_VOID, Tango::DEV_VOID, "", "", Tango::OPERATOR)); command_list.push_back(new ResetCmd("Reset", Tango::DEV_VOID, Tango::DEV_VOID, "", "", Tango::OPERATOR)); command_list.push_back(new SetPoleAcCurrentCmd("SetPoleAcCurrent", Tango::DEVVAR_DOUBLEARRAY, Tango::DEV_VOID, "", "", Tango::OPERATOR)); command_list.push_back(new LocalPoleControlCmd("LocalPoleControl", Tango::DEVVAR_SHORTARRAY, Tango::DEV_VOID, "", "", Tango::OPERATOR)); command_list.push_back(new SetpointCheckCmd("SetpointCheck", Tango::DEVVAR_DOUBLEARRAY, Tango::DEV_BOOLEAN, "Setpoint values for the Poles", "true when settings are OK", Tango::OPERATOR)); command_list.push_back(new SetPoleCurrentCmd("SetPoleCurrent", Tango::DEVVAR_DOUBLEARRAY, Tango::DEV_VOID, "", "", Tango::OPERATOR)); // add polling if any for (unsigned int i=0 ; ilength() ; i++) { cout4 << "Device name : " << (*devlist_ptr)[i].in() << endl; // Create devices and add it into the device list //---------------------------------------------------- device_list.push_back(new Bilt(this, (*devlist_ptr)[i])); // Export device to the outside world // Check before if database used. //--------------------------------------------- if ((Tango::Util::_UseDb == true) && (Tango::Util::_FileDb == false)) export_device(device_list.back()); else export_device(device_list.back(), (*devlist_ptr)[i]); } // End of Automatic code generation //------------------------------------------------------------- } //+---------------------------------------------------------------------------- // Method: BiltClass::attribute_factory(vector &att_list) //----------------------------------------------------------------------------- void BiltClass::attribute_factory(vector &att_list) { // Attribute : Currents CurrentsAttrib *currents = new CurrentsAttrib(); Tango::UserDefaultAttrProp currents_prop; currents_prop.set_label("Currents"); currents_prop.set_unit("A"); currents_prop.set_format("%6.4f"); currents_prop.set_max_value("1.8"); currents_prop.set_min_value("-1.8"); currents_prop.set_description("The measured currents of the three poles."); currents->set_default_properties(currents_prop); att_list.push_back(currents); // Attribute : Voltages VoltagesAttrib *voltages = new VoltagesAttrib(); Tango::UserDefaultAttrProp voltages_prop; voltages_prop.set_label("Voltages"); voltages_prop.set_unit("V"); voltages_prop.set_format("%6.4"); voltages_prop.set_description("The measured voltages of the three poles."); voltages->set_default_properties(voltages_prop); att_list.push_back(voltages); // Attribute : Impedances ImpedancesAttrib *impedances = new ImpedancesAttrib(); Tango::UserDefaultAttrProp impedances_prop; impedances_prop.set_label("Impedances"); impedances_prop.set_unit("Ohm"); impedances_prop.set_format("%4.2f"); impedances_prop.set_max_alarm("5.0"); impedances_prop.set_min_alarm("2.8"); impedances_prop.set_description("Calculated impedances for the three poles."); impedances->set_default_properties(impedances_prop); impedances->set_polling_period(3000); att_list.push_back(impedances); // Attribute : SetCurrentsRMS SetCurrentsRMSAttrib *set_currents_rms = new SetCurrentsRMSAttrib(); Tango::UserDefaultAttrProp set_currents_rms_prop; set_currents_rms_prop.set_label("RMS AC current setpoints/s"); set_currents_rms_prop.set_unit("A"); set_currents_rms_prop.set_format("%6.4"); set_currents_rms_prop.set_description("Statistic when driven by the Libera. One RMS value for every pole\nof the magnet.\nRMS value of the AC setpoint applied on the DAC during the last second.\nX=sqr( (sum(setAC)*sum(setAC)) / n - ((sum(setAC)/n) *(sum(setAC)/n)) )"); set_currents_rms->set_default_properties(set_currents_rms_prop); att_list.push_back(set_currents_rms); // Attribute : SetCurrentsAverage SetCurrentsAverageAttrib *set_currents_average = new SetCurrentsAverageAttrib(); Tango::UserDefaultAttrProp set_currents_average_prop; set_currents_average_prop.set_label("Average AC current setpoints/s"); set_currents_average_prop.set_unit("A"); set_currents_average_prop.set_format("%6.4"); set_currents_average_prop.set_description("Statistic when driven by the Libera. One average value for every pole\nof the magnet.\nRMS value of the AC setpoint applied on the DAC during the last second.\nX=sqr( (sum(setAC)*sum(setAC)) / n - ((sum(setAC)/n) *(sum(setAC)/n)) )"); set_currents_average->set_default_properties(set_currents_average_prop); att_list.push_back(set_currents_average); // Attribute : FramesPerSecond FramesPerSecondAttrib *frames_per_second = new FramesPerSecondAttrib(); Tango::UserDefaultAttrProp frames_per_second_prop; frames_per_second_prop.set_label("Frames per second"); frames_per_second_prop.set_display_unit(" "); frames_per_second_prop.set_format("%6d"); frames_per_second->set_default_properties(frames_per_second_prop); att_list.push_back(frames_per_second); // Attribute : ErrorsPerSecond ErrorsPerSecondAttrib *errors_per_second = new ErrorsPerSecondAttrib(); Tango::UserDefaultAttrProp errors_per_second_prop; errors_per_second_prop.set_label("Errors per second"); errors_per_second_prop.set_display_unit(" "); errors_per_second_prop.set_format("%6d"); errors_per_second->set_default_properties(errors_per_second_prop); att_list.push_back(errors_per_second); // Attribute : ErrorCounters ErrorCountersAttrib *error_counters = new ErrorCountersAttrib(); Tango::UserDefaultAttrProp error_counters_prop; error_counters_prop.set_label("Error counters"); error_counters_prop.set_unit(" "); error_counters_prop.set_format("%6d"); error_counters_prop.set_description("Statistic when driven by the Libera.\nThe total number of errors since the last reset for the \nthree poles."); error_counters->set_default_properties(error_counters_prop); att_list.push_back(error_counters); // Attribute : LocalControls LocalControlsAttrib *local_controls = new LocalControlsAttrib(); att_list.push_back(local_controls); // Attribute : Temperatures TemperaturesAttrib *temperatures = new TemperaturesAttrib(); Tango::UserDefaultAttrProp temperatures_prop; temperatures_prop.set_label("Temperatures"); temperatures_prop.set_unit("C"); temperatures_prop.set_format("%6.0f"); temperatures_prop.set_max_alarm("40"); temperatures_prop.set_description("Temperature measurements for the three poles."); temperatures->set_default_properties(temperatures_prop); temperatures->set_polling_period(30000); att_list.push_back(temperatures); // End of Automatic code generation //------------------------------------------------------------- } //+---------------------------------------------------------------------------- // // method : BiltClass::get_class_property() // // description : Read the class properties from database. // //----------------------------------------------------------------------------- void BiltClass::get_class_property() { // Initialize your default values here (if not done with POGO). //------------------------------------------------------------------ // Read class properties from database.(Automatic code generation) //------------------------------------------------------------------ // Call database and extract values //-------------------------------------------- if (Tango::Util::instance()->_UseDb==true) get_db_class()->get_property(cl_prop); Tango::DbDatum def_prop; int i = -1; // End of Automatic code generation //------------------------------------------------------------------ } //+---------------------------------------------------------------------------- // // method : BiltClass::set_default_property // // description: Set default property (class and device) for wizard. // For each property, add to wizard property name and description // If default value has been set, add it to wizard property and // store it in a DbDatum. // //----------------------------------------------------------------------------- void BiltClass::set_default_property() { string prop_name; string prop_desc; string prop_def; vector vect_data; // Set Default Class Properties // Set Default Device Properties prop_name = "IPAddress"; prop_desc = "IP Address of BILT controller.\nEach controller includes several magnets and\neach magnet includes 3 power supplies,\nfor corrections in the X, Y and Z planes.\n\n"; prop_def = "0.0.0.0"; vect_data.clear(); vect_data.push_back("0.0.0.0"); if (prop_def.length()>0) { Tango::DbDatum data(prop_name); data << vect_data ; dev_def_prop.push_back(data); add_wiz_dev_prop(prop_name, prop_desc, prop_def); } else add_wiz_dev_prop(prop_name, prop_desc); prop_name = "MagnetNumber"; prop_desc = "Magnet number from 1 to 48"; prop_def = "0"; vect_data.clear(); vect_data.push_back("0"); if (prop_def.length()>0) { Tango::DbDatum data(prop_name); data << vect_data ; dev_def_prop.push_back(data); add_wiz_dev_prop(prop_name, prop_desc, prop_def); } else add_wiz_dev_prop(prop_name, prop_desc); prop_name = "UpdatePeriod"; prop_desc = "The update period for the data reading from the power supply in milli seconds."; prop_def = "1000"; vect_data.clear(); vect_data.push_back("1000"); if (prop_def.length()>0) { Tango::DbDatum data(prop_name); data << vect_data ; dev_def_prop.push_back(data); add_wiz_dev_prop(prop_name, prop_desc, prop_def); } else add_wiz_dev_prop(prop_name, prop_desc); } //+---------------------------------------------------------------------------- // // method : BiltClass::write_class_property // // description : Set class description as property in database // //----------------------------------------------------------------------------- void BiltClass::write_class_property() { // First time, check if database used //-------------------------------------------- if (Tango::Util::_UseDb == false) return; Tango::DbData data; string classname = get_name(); string header; string::size_type start, end; // Put title Tango::DbDatum title("ProjectTitle"); string str_title("BILT multi channel power supply"); title << str_title; data.push_back(title); // Put Description Tango::DbDatum description("Description"); vector str_desc; str_desc.push_back("The BILT multi channel power supply will be used with 3 channels for the ESRF fast"); str_desc.push_back("feedback systems."); str_desc.push_back("The power supply can be controlled in 2 ways :"); str_desc.push_back("By this device server for slow or human control or"); str_desc.push_back("by the Libera Beam Position monitors for fast feedback with closed loop control."); str_desc.push_back("The devices are exported as one device per steerer magnet. Every device has three"); str_desc.push_back("channels. The channels (poles) cannot be switched on individually but have their"); str_desc.push_back("individual set points and measurement values."); description << str_desc; data.push_back(description); // put cvs or svn location string filename(classname); filename += "Class.cpp"; // Create a string with the class ID to // get the string into the binary string class_id(ClassId); // check for cvs information string src_path(CvsPath); start = src_path.find("/"); if (start!=string::npos) { end = src_path.find(filename); if (end>start) { string strloc = src_path.substr(start, end-start); // Check if specific repository start = strloc.find("/cvsroot/"); if (start!=string::npos && start>0) { string repository = strloc.substr(0, start); if (repository.find("/segfs/")!=string::npos) strloc = "ESRF:" + strloc.substr(start, strloc.length()-start); } Tango::DbDatum cvs_loc("cvs_location"); cvs_loc << strloc; data.push_back(cvs_loc); } } // check for svn information else { string src_path(SvnPath); start = src_path.find("://"); if (start!=string::npos) { end = src_path.find(filename); if (end>start) { header = "$HeadURL: "; start = header.length(); string strloc = src_path.substr(start, (end-start)); Tango::DbDatum svn_loc("svn_location"); svn_loc << strloc; data.push_back(svn_loc); } } } // Get CVS or SVN revision tag // CVS tag string tagname(TagName); header = "$Name: "; start = header.length(); string endstr(" $"); end = tagname.find(endstr); if (end!=string::npos && end>start) { string strtag = tagname.substr(start, end-start); Tango::DbDatum cvs_tag("cvs_tag"); cvs_tag << strtag; data.push_back(cvs_tag); } // SVN tag string svnpath(SvnPath); header = "$HeadURL: "; start = header.length(); end = svnpath.find(endstr); if (end!=string::npos && end>start) { string strloc = svnpath.substr(start, end-start); string tagstr ("/tags/"); start = strloc.find(tagstr); if ( start!=string::npos ) { start = start + tagstr.length(); end = strloc.find(filename); string strtag = strloc.substr(start, end-start-1); Tango::DbDatum svn_tag("svn_tag"); svn_tag << strtag; data.push_back(svn_tag); } } // Get URL location string httpServ(HttpServer); if (httpServ.length()>0) { Tango::DbDatum db_doc_url("doc_url"); db_doc_url << httpServ; data.push_back(db_doc_url); } // Put inheritance Tango::DbDatum inher_datum("InheritedFrom"); vector inheritance; inheritance.push_back("Device_4Impl"); inher_datum << inheritance; data.push_back(inher_datum); // Call database and and values //-------------------------------------------- get_db_class()->put_property(data); } } // namespace Node-path: powersupply/itest/Bilt/trunk/BiltClass.h Node-kind: file Node-action: change Text-content-length: 12968 Text-content-md5: 1bf405e51c4b20c80782db0868666401 Content-length: 12968 //============================================================================= // // file : BiltClass.h // // description : Include for the BiltClass root class. // This class is the singleton class for // the Bilt device class. // It contains all properties and methods which the // Bilt requires only once e.g. the commands. // // project : TANGO Device Server // // $Author: meyer $ // // $Revision: 1.10 $ // $Date: 2010-11-10 11:59:11 $ // // SVN only: // $HeadURL: $ // // CVS only: // $Source: /segfs/tango/cvsroot/cppserver/machine/powersupply/SrSteerers/tango/Bilt/BiltClass.h,v $ // $Log: not supported by cvs2svn $ // Revision 1.9 2010/06/21 07:13:05 meyer // Added a spectrum attribute for the temperature measurements and changed to libMagnet version 1.4. // // Revision 1.8 2010/05/01 16:58:39 meyer // Changed alarm limits for the impedance attribute. // // Revision 1.7 2010-02-12 16:35:13 meyer // Added SetPoleCurrent command again. // // Revision 1.6 2010-02-11 16:35:27 meyer // Currents settings understand NaN values. // Deleted StePoleCurrent command. // // Revision 1.5 2010/02/10 12:27:31 meyer // Restructured Bilt class. // Acquistion is now done by a thread and only the multi channel data // gets exported. A single channel class (BiltCh) was created. // // Revision 1.4 2009/11/27 13:49:26 meyer // Modified structure! The pole is no longer a device. // The device is now a magnet with three poles. // // Revision 1.3 2009/11/26 10:46:58 meyer // Updated for libMagnet_V120 // // Revision 1.2 2009/11/06 12:46:25 meyer // Added impedance attribute and corrected fromatting of attribute values. // // Revision 1.1.1.1 2009/11/04 16:23:02 meyer // Imported using TkCVS // // // copyleft : European Synchrotron Radiation Facility // BP 220, Grenoble 38043 // FRANCE // //============================================================================= // // This file is generated by POGO // (Program Obviously used to Generate tango Object) // // (c) - Software Engineering Group - ESRF //============================================================================= #ifndef _BILTCLASS_H #define _BILTCLASS_H #include #include namespace Bilt_ns {//===================================== // Define classes for attributes //===================================== class TemperaturesAttrib: public Tango::SpectrumAttr { public: TemperaturesAttrib():SpectrumAttr("Temperatures", Tango::DEV_DOUBLE, Tango::READ, 6) {}; ~TemperaturesAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_Temperatures(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_Temperatures_allowed(ty);} }; class LocalControlsAttrib: public Tango::SpectrumAttr { public: LocalControlsAttrib():SpectrumAttr("LocalControls", Tango::DEV_BOOLEAN, Tango::READ, 5) {}; ~LocalControlsAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_LocalControls(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_LocalControls_allowed(ty);} }; class ErrorCountersAttrib: public Tango::SpectrumAttr { public: ErrorCountersAttrib():SpectrumAttr("ErrorCounters", Tango::DEV_ULONG, Tango::READ, 3) {}; ~ErrorCountersAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_ErrorCounters(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_ErrorCounters_allowed(ty);} }; class ErrorsPerSecondAttrib: public Tango::SpectrumAttr { public: ErrorsPerSecondAttrib():SpectrumAttr("ErrorsPerSecond", Tango::DEV_ULONG, Tango::READ, 3) {}; ~ErrorsPerSecondAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_ErrorsPerSecond(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_ErrorsPerSecond_allowed(ty);} }; class FramesPerSecondAttrib: public Tango::SpectrumAttr { public: FramesPerSecondAttrib():SpectrumAttr("FramesPerSecond", Tango::DEV_ULONG, Tango::READ, 3) {}; ~FramesPerSecondAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_FramesPerSecond(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_FramesPerSecond_allowed(ty);} }; class SetCurrentsAverageAttrib: public Tango::SpectrumAttr { public: SetCurrentsAverageAttrib():SpectrumAttr("SetCurrentsAverage", Tango::DEV_DOUBLE, Tango::READ, 3) {}; ~SetCurrentsAverageAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_SetCurrentsAverage(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_SetCurrentsAverage_allowed(ty);} }; class SetCurrentsRMSAttrib: public Tango::SpectrumAttr { public: SetCurrentsRMSAttrib():SpectrumAttr("SetCurrentsRMS", Tango::DEV_DOUBLE, Tango::READ, 3) {}; ~SetCurrentsRMSAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_SetCurrentsRMS(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_SetCurrentsRMS_allowed(ty);} }; class ImpedancesAttrib: public Tango::SpectrumAttr { public: ImpedancesAttrib():SpectrumAttr("Impedances", Tango::DEV_DOUBLE, Tango::READ, 3) {}; ~ImpedancesAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_Impedances(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_Impedances_allowed(ty);} }; class VoltagesAttrib: public Tango::SpectrumAttr { public: VoltagesAttrib():SpectrumAttr("Voltages", Tango::DEV_DOUBLE, Tango::READ, 3) {}; ~VoltagesAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_Voltages(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_Voltages_allowed(ty);} }; class CurrentsAttrib: public Tango::SpectrumAttr { public: CurrentsAttrib():SpectrumAttr("Currents", Tango::DEV_DOUBLE, Tango::READ_WRITE, 3) {}; ~CurrentsAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_Currents(att);} virtual void write(Tango::DeviceImpl *dev,Tango::WAttribute &att) {(static_cast(dev))->write_Currents(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_Currents_allowed(ty);} }; //========================================= // Define classes for commands //========================================= class SetPoleCurrentCmd : public Tango::Command { public: SetPoleCurrentCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out, const char *in_desc, const char *out_desc, Tango::DispLevel level) :Command(name,in,out,in_desc,out_desc, level) {}; SetPoleCurrentCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out) :Command(name,in,out) {}; ~SetPoleCurrentCmd() {}; virtual CORBA::Any *execute (Tango::DeviceImpl *dev, const CORBA::Any &any); virtual bool is_allowed (Tango::DeviceImpl *dev, const CORBA::Any &any) {return (static_cast(dev))->is_SetPoleCurrent_allowed(any);} }; class SetpointCheckCmd : public Tango::Command { public: SetpointCheckCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out, const char *in_desc, const char *out_desc, Tango::DispLevel level) :Command(name,in,out,in_desc,out_desc, level) {}; SetpointCheckCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out) :Command(name,in,out) {}; ~SetpointCheckCmd() {}; virtual CORBA::Any *execute (Tango::DeviceImpl *dev, const CORBA::Any &any); virtual bool is_allowed (Tango::DeviceImpl *dev, const CORBA::Any &any) {return (static_cast(dev))->is_SetpointCheck_allowed(any);} }; class LocalPoleControlCmd : public Tango::Command { public: LocalPoleControlCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out, const char *in_desc, const char *out_desc, Tango::DispLevel level) :Command(name,in,out,in_desc,out_desc, level) {}; LocalPoleControlCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out) :Command(name,in,out) {}; ~LocalPoleControlCmd() {}; virtual CORBA::Any *execute (Tango::DeviceImpl *dev, const CORBA::Any &any); virtual bool is_allowed (Tango::DeviceImpl *dev, const CORBA::Any &any) {return (static_cast(dev))->is_LocalPoleControl_allowed(any);} }; class SetPoleAcCurrentCmd : public Tango::Command { public: SetPoleAcCurrentCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out, const char *in_desc, const char *out_desc, Tango::DispLevel level) :Command(name,in,out,in_desc,out_desc, level) {}; SetPoleAcCurrentCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out) :Command(name,in,out) {}; ~SetPoleAcCurrentCmd() {}; virtual CORBA::Any *execute (Tango::DeviceImpl *dev, const CORBA::Any &any); virtual bool is_allowed (Tango::DeviceImpl *dev, const CORBA::Any &any) {return (static_cast(dev))->is_SetPoleAcCurrent_allowed(any);} }; class ResetCmd : public Tango::Command { public: ResetCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out, const char *in_desc, const char *out_desc, Tango::DispLevel level) :Command(name,in,out,in_desc,out_desc, level) {}; ResetCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out) :Command(name,in,out) {}; ~ResetCmd() {}; virtual CORBA::Any *execute (Tango::DeviceImpl *dev, const CORBA::Any &any); virtual bool is_allowed (Tango::DeviceImpl *dev, const CORBA::Any &any) {return (static_cast(dev))->is_Reset_allowed(any);} }; class OffCmd : public Tango::Command { public: OffCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out, const char *in_desc, const char *out_desc, Tango::DispLevel level) :Command(name,in,out,in_desc,out_desc, level) {}; OffCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out) :Command(name,in,out) {}; ~OffCmd() {}; virtual CORBA::Any *execute (Tango::DeviceImpl *dev, const CORBA::Any &any); virtual bool is_allowed (Tango::DeviceImpl *dev, const CORBA::Any &any) {return (static_cast(dev))->is_Off_allowed(any);} }; class OnCmd : public Tango::Command { public: OnCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out, const char *in_desc, const char *out_desc, Tango::DispLevel level) :Command(name,in,out,in_desc,out_desc, level) {}; OnCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out) :Command(name,in,out) {}; ~OnCmd() {}; virtual CORBA::Any *execute (Tango::DeviceImpl *dev, const CORBA::Any &any); virtual bool is_allowed (Tango::DeviceImpl *dev, const CORBA::Any &any) {return (static_cast(dev))->is_On_allowed(any);} }; // // The BiltClass singleton definition // class #ifdef _TG_WINDOWS_ __declspec(dllexport) #endif BiltClass : public Tango::DeviceClass { public: // properties member data // add your own data members here //------------------------------------ public: Tango::DbData cl_prop; Tango::DbData cl_def_prop; Tango::DbData dev_def_prop; // Method prototypes static BiltClass *init(const char *); static BiltClass *instance(); ~BiltClass(); Tango::DbDatum get_class_property(string &); Tango::DbDatum get_default_device_property(string &); Tango::DbDatum get_default_class_property(string &); protected: BiltClass(string &); static BiltClass *_instance; void command_factory(); void get_class_property(); void attribute_factory(vector &); void write_class_property(); void set_default_property(); string get_cvstag(); string get_cvsroot(); private: void device_factory(const Tango::DevVarStringArray *); }; } // namespace Bilt_ns #endif // _BILTCLASS_H Node-path: powersupply/itest/Bilt/trunk/BiltStateMachine.cpp Node-kind: file Node-action: change Text-content-length: 10123 Text-content-md5: 44267578136bc24dc99c66961f2feb8f Content-length: 10123 static const char *RcsId = "$Id $"; //+============================================================================= // // file : BiltStateMachine.cpp // // description : C++ source for the Bilt and its alowed // methods for commands and attributes // // project : TANGO Device Server // // $Author: meyer $ // // $Revision: 1.10 $ // $Date: 2010-11-10 11:59:11 $ // // SVN only: // $HeadURL: $ // // CVS only: // $Source: /segfs/tango/cvsroot/cppserver/machine/powersupply/SrSteerers/tango/Bilt/BiltStateMachine.cpp,v $ // $Log: not supported by cvs2svn $ // Revision 1.9 2010/06/21 07:13:05 meyer // Added a spectrum attribute for the temperature measurements and changed to libMagnet version 1.4. // // Revision 1.8 2010/05/01 16:58:39 meyer // Changed alarm limits for the impedance attribute. // // Revision 1.7 2010-02-12 16:35:13 meyer // Added SetPoleCurrent command again. // // Revision 1.6 2010-02-11 16:35:27 meyer // Currents settings understand NaN values. // Deleted StePoleCurrent command. // // Revision 1.5 2010/02/10 12:27:31 meyer // Restructured Bilt class. // Acquistion is now done by a thread and only the multi channel data // gets exported. A single channel class (BiltCh) was created. // // Revision 1.4 2009/11/27 13:49:26 meyer // Modified structure! The pole is no longer a device. // The device is now a magnet with three poles. // // Revision 1.3 2009/11/26 10:46:58 meyer // Updated for libMagnet_V120 // // Revision 1.2 2009/11/06 12:46:25 meyer // Added impedance attribute and corrected fromatting of attribute values. // // Revision 1.1.1.1 2009/11/04 16:23:02 meyer // Imported using TkCVS // // // copyleft : European Synchrotron Radiation Facility // BP 220, Grenoble 38043 // FRANCE // //-============================================================================= // // This file is generated by POGO // (Program Obviously used to Generate tango Object) // // (c) - Software Engineering Group - ESRF //============================================================================= #include #include #include /*==================================================================== * This file contains the methods to allow commands and attributes * read or write execution. * * If you wand to add your own code, add it between * the "End/Re-Start of Generated Code" comments. * * If you want, you can also add your own methods. *==================================================================== */ namespace Bilt_ns { //================================================= // Attributes Allowed Methods //================================================= //+---------------------------------------------------------------------------- // // method : Bilt::is_Voltages_allowed // // description : Read/Write allowed for Voltages attribute. // //----------------------------------------------------------------------------- bool Bilt::is_Voltages_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_Impedances_allowed // // description : Read/Write allowed for Impedances attribute. // //----------------------------------------------------------------------------- bool Bilt::is_Impedances_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_SetCurrentsRMS_allowed // // description : Read/Write allowed for SetCurrentsRMS attribute. // //----------------------------------------------------------------------------- bool Bilt::is_SetCurrentsRMS_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_SetCurrentsAverage_allowed // // description : Read/Write allowed for SetCurrentsAverage attribute. // //----------------------------------------------------------------------------- bool Bilt::is_SetCurrentsAverage_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_ErrorCounters_allowed // // description : Read/Write allowed for ErrorCounters attribute. // //----------------------------------------------------------------------------- bool Bilt::is_ErrorCounters_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_LocalControls_allowed // // description : Read/Write allowed for LocalControls attribute. // //----------------------------------------------------------------------------- bool Bilt::is_LocalControls_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_Currents_allowed // // description : Read/Write allowed for Currents attribute. // //----------------------------------------------------------------------------- bool Bilt::is_Currents_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_FramesPerSecond_allowed // // description : Read/Write allowed for FramesPerSecond attribute. // //----------------------------------------------------------------------------- bool Bilt::is_FramesPerSecond_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_ErrorsPerSecond_allowed // // description : Read/Write allowed for ErrorsPerSecond attribute. // //----------------------------------------------------------------------------- bool Bilt::is_ErrorsPerSecond_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_Temperatures_allowed // // description : Read/Write allowed for Temperatures attribute. // //----------------------------------------------------------------------------- bool Bilt::is_Temperatures_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //================================================= // Commands Allowed Methods //================================================= //+---------------------------------------------------------------------------- // // method : Bilt::is_On_allowed // // description : Execution allowed for On command. // //----------------------------------------------------------------------------- bool Bilt::is_On_allowed(const CORBA::Any &any) { if (get_state() == Tango::ON || get_state() == Tango::FAULT || get_state() == Tango::ALARM || get_state() == Tango::UNKNOWN) { // End of Generated Code // Re-Start of Generated Code return false; } return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_Off_allowed // // description : Execution allowed for Off command. // //----------------------------------------------------------------------------- bool Bilt::is_Off_allowed(const CORBA::Any &any) { if (get_state() == Tango::OFF) { // End of Generated Code // Re-Start of Generated Code return false; } return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_Reset_allowed // // description : Execution allowed for Reset command. // //----------------------------------------------------------------------------- bool Bilt::is_Reset_allowed(const CORBA::Any &any) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_SetPoleAcCurrent_allowed // // description : Execution allowed for SetPoleAcCurrent command. // //----------------------------------------------------------------------------- bool Bilt::is_SetPoleAcCurrent_allowed(const CORBA::Any &any) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_LocalPoleControl_allowed // // description : Execution allowed for LocalPoleControl command. // //----------------------------------------------------------------------------- bool Bilt::is_LocalPoleControl_allowed(const CORBA::Any &any) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_SetpointCheck_allowed // // description : Execution allowed for SetpointCheck command. // //----------------------------------------------------------------------------- bool Bilt::is_SetpointCheck_allowed(const CORBA::Any &any) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_SetPoleCurrent_allowed // // description : Execution allowed for SetPoleCurrent command. // //----------------------------------------------------------------------------- bool Bilt::is_SetPoleCurrent_allowed(const CORBA::Any &any) { // End of Generated Code // Re-Start of Generated Code return true; } } // namespace Bilt_ns Revision-number: 57 Prop-content-length: 123 Content-length: 123 K 10 svn:author V 5 meyer K 8 svn:date V 27 2010-11-10T11:59:30.000000Z K 7 svn:log V 23 Changed version to 3.5 PROPS-END Node-path: powersupply/itest/Bilt/trunk/Makefile Node-kind: file Node-action: change Text-content-length: 6635 Text-content-md5: 1a892e50e8f62b2f7ed9511dee02d928 Content-length: 6635 #============================================================================= # # file : Makefile # # description : Include for the Bilt class. # # project : Makefile to generate a Tango server # # $Author: meyer $ # # $Revision: 1.16 $ # # $Log: not supported by cvs2svn $ # Revision 1.15 2010-11-08 15:29:42 meyer # Linking now with libtango.a version 7.2! # # Revision 1.14 2010/06/24 11:44:00 meyer # Changed version to 3.4 # # Revision 1.13 2010/06/21 07:16:52 meyer # Changed version to 3.3 # # Revision 1.12 2010/06/21 07:13:05 meyer # Added a spectrum attribute for the temperature measurements and changed to libMagnet version 1.4. # # Revision 1.11 2010/03/19 15:27:01 meyer # Canged to version 3.2 # # Revision 1.10 2010/03/16 15:03:33 meyer # Excluded Steerer class. # # Revision 1.9 2010/03/16 14:57:56 meyer # Rlease_3_1 # # Revision 1.8 2010-02-11 16:35:27 meyer # Currents settings understand NaN values. # Deleted StePoleCurrent command. # # Revision 1.7 2010/02/10 16:22:15 meyer # Release_3_0 # # Revision 1.6 2010/02/10 12:27:31 meyer # Restructured Bilt class. # Acquistion is now done by a thread and only the multi channel data # gets exported. A single channel class (BiltCh) was created. # # Revision 1.5 2009/12/18 12:02:18 meyer # Changed version number to 2.1 # # Revision 1.4 2009/12/18 10:19:23 meyer # Using libMagnet version 130 now. # # Revision 1.3 2009/11/27 13:49:26 meyer # Modified structure! The pole is no longer a device. # The device is now a magnet with three poles. # # Revision 1.2 2009/11/26 10:46:58 meyer # Updated for libMagnet_V120 # # Revision 1.1.1.1 2009/11/04 16:23:02 meyer # Imported using TkCVS # # # copyleft : European Synchrotron Radiation Facility # BP 220, Grenoble 38043 # FRANCE # #============================================================================= # This file is generated by POGO # (Program Obviously used to Generate tango Object) # # (c) - Software Engineering Group - ESRF #============================================================================= # CLASS = Bilt MAJOR_VERS = 3 MINOR_VERS = 5 RELEASE = Release_$(MAJOR_VERS)_$(MINOR_VERS) OS = $(shell /csadmin/common/scripts/get_os) PROCESSOR = $(shell uname -p) #----------------------------------------- # Set default home directories #----------------------------------------- TANGO_HOME = /segfs/tango/release/$(BIN_DIR) CPP_SERVERS = $(TANGO_HOME)/classes ifdef no_debug DEBUG = -O else DEBUG = -g endif ifdef _solaris CC = CC BIN_DIR=$(OS)_CC AR_SL = $(CC) -mt -G VERS_OPT = -h SL_EXT = so endif ifdef linux CC = c++ CC_SHLIB = $(CC) -fPIC $(PROCESSOR)=1 ifdef x86_64 NBITS=_64 endif BIN_DIR=$(OS)$(NBITS) AR_SL = $(CC) -fPIC -shared SL_EXT = so VERS_OPT = -Wl,-soname, endif INCLUDE_DIRS = -I$(TANGO_HOME)/include -I. \ -I$(CPP_SERVERS)/include \ -I libMagnet_V140 OBJS_DIR = obj/$(BIN_DIR) LIB_DIRS = -L $(CPP_SERVERS)/lib \ -L $(TANGO_HOME)/lib \ -L libMagnet_V140 TARGET_LIB = $(CPP_SERVERS)/lib/libtgclasses.a #----------------------------------------- # Set CXXFLAGS and LFLAGS #----------------------------------------- ifdef _solaris CXXFLAGS = $(DEBUG) -mt -D_PTHREADS $(INCLUDE_DIRS) LFLAGS = $(DEBUG) $(LIB_DIRS) \ -ltango \ -llog4tango \ -lomniORB4 \ -lomniDynamic4 \ -lomnithread \ -lCOS4 \ -lpthread \ -lposix4 -lsocket -lnsl \ -ltgclasses endif ifdef linux CXXFLAGS = -g -D_REENTRANT $(INCLUDE_DIRS) LFLAGS = $(DEBUG) $(LIB_DIRS) \ /segfs/tango/release/redhate5/lib/libtango.7.2.0.a \ -llog4tango \ -lomniORB4 \ -lomniDynamic4 \ -lomnithread \ -lCOS4 \ -ldl -lpthread \ -lMagnet \ -ltgclasses endif #----------------------------------------- # Set dependences #----------------------------------------- SVC_OBJS = $(OBJS_DIR)/$(CLASS).o \ $(OBJS_DIR)/$(CLASS)StateMachine.o \ $(OBJS_DIR)/$(CLASS)Class.o \ $(OBJS_DIR)/AcquisitionThread.o \ $(OBJS_DIR)/ClassFactory.o \ $(OBJS_DIR)/main.o SHLIB_OBJS = $(OBJS_DIR)/$(CLASS)Class.so.o \ $(OBJS_DIR)/$(CLASS)StateMachine.so.o \ $(OBJS_DIR)/$(CLASS).so.o \ $(OBJS_DIR)/AcquisitionThread.o SVC_INC = $(CLASS)Class.h \ $(CLASS).h \ AcquisitionThread.h $(OBJS_DIR)/%.o: %.cpp $(SVC_INC) $(CC) $(CXXFLAGS) -c $< -o $(OBJS_DIR)/$*.o $(OBJS_DIR)/%.so.o: %.cpp $(SVC_INC) $(CC_SHLIB) $(CXXFLAGS) -c $< -o $(OBJS_DIR)/$*.so.o #----------------------------------------- # Make Entry #----------------------------------------- all: $(CLASS) $(CLASS): make_obj_dir make_bin_dir $(SVC_OBJS) $(CC) $(SVC_OBJS) -o $(CLASS) $(LFLAGS) @mv $(CLASS) bin/$(BIN_DIR)/$(CLASS) shlib: make_obj_dir make_shlib_dir $(SHLIB_OBJS) $(AR_SL) -o \ shlib/$(BIN_DIR)/$(CLASS).$(SL_EXT).$(MAJOR_VERS).$(MINOR_VERS) \ $(VERS_OPT)$(CLASS).$(SL_EXT).$(MAJOR_VERS) \ $(SHLIB_OBJS) $(LFLAGS) @rm -f shlib/$(BIN_DIR)/$(CLASS).$(SL_EXT) @cd shlib/$(BIN_DIR); \ ln -s $(CLASS).$(SL_EXT).$(MAJOR_VERS).$(MINOR_VERS) $(CLASS).$(SL_EXT) clean: rm -f $(OBJS_DIR)/*.o \ $(OBJS_DIR)/*.so.o \ bin/$(BIN_DIR)/$(CLASS) \ core make_obj_dir: @mkdir -p obj @mkdir -p obj/$(BIN_DIR) make_bin_dir: @mkdir -p bin @mkdir -p bin/$(BIN_DIR) make_shlib_dir: @mkdir -p shlib @mkdir -p shlib/$(BIN_DIR) #----------------------------------------- # Install binary file #----------------------------------------- install: cp bin/$(BIN_DIR)/$(CLASS) $(CPP_SERVERS)/bin #----------------------------------------- # Update class library and header files # recompile without debug mode. #----------------------------------------- lib: clean @make no_debug=1 cp *.h $(CPP_SERVERS)/include ar ruv $(TARGET_LIB) $(OBJS_DIR)/$(CLASS).o ar ruv $(TARGET_LIB) $(OBJS_DIR)/$(CLASS)Class.o ar ruv $(TARGET_LIB) $(OBJS_DIR)/$(CLASS)StateMachine.o ar ruv $(TARGET_LIB) $(OBJS_DIR)/AcquisitionThread.o ident $(TARGET_LIB) | grep $(CLASS) #------------------------------------------------------ # Tag the CVS/SVN module corresponding to this class # copy cvs_tag or svn_tag to tag: entry #------------------------------------------------------ #svn_tag: # svn copy ../trunk ../tags/$(RELEASE) # svn commit ../tags/$(RELEASE) \ # -m "Tagging the $(RELEASE) of the $(CLASS) project." # #cvs_tag: # @cvstag "$(CLASS)-$(RELEASE)" # @make $(CLASS) # @make show_tag #show_cvs_tag: # @cvstag -d # # Only these make options work with the current Pogo version 5.3.x! tag: @cvstag "$(CLASS)-$(RELEASE)" @make $(CLASS) @make show_tag show_tag: @cvstag -d Revision-number: 58 Prop-content-length: 217 Content-length: 217 K 10 svn:author V 5 meyer K 8 svn:date V 27 2010-11-10T12:01:29.000000Z K 7 svn:log V 116 Changed type of Temperatures attribute from long to double and moved temperature reading to the acquisition thread. PROPS-END Node-path: powersupply/itest/Bilt/trunk/AcquisitionThread.h Node-kind: file Node-action: change Text-content-length: 1023 Text-content-md5: daecac08b46404bdaef21596dfa557cc Content-length: 1023 #ifndef ACQUISITIONTHREAD_H_ #define ACQUISITIONTHREAD_H_ #include #include namespace Bilt_ns { class AcquisitionThread : public omni_thread, public Tango::LogAdapter { public : AcquisitionThread (Bilt *_bilt_ps, omni_mutex &d_m, omni_mutex &bilt_m); private : Bilt *bilt_ps; omni_mutex &data_mutex; omni_mutex &bilt_mutex; bool bilt_connection_lost; struct itest::mdata mdata; struct itest::fdata fdata[POLES]; Tango::DevErrorList mdata_errors; Tango::DevErrorList fdata_errors; vector temperatures; Tango::DevErrorList temp_errors; void *run_undetached(void*); void bilt_reconnect(); void create_tango_error (itest::ItestException &e, Tango::DevErrorList &errors, string reason, string desc, string origin); Tango::DevLong updatePeriod; struct timeval last_update; struct timeval last_temp_update; struct timeval last_reconnect; }; } #endif /*ACQUISITIONTHREAD_H_*/ Node-path: powersupply/itest/Bilt/trunk/Bilt.cpp Node-kind: file Node-action: change Text-content-length: 36062 Text-content-md5: 684f459409604d4237da9905f1860294 Content-length: 36062 static const char *RcsId = "$Id: Bilt.cpp,v 1.15 2010-11-10 12:01:29 meyer Exp $"; //+============================================================================= // // file : Bilt.cpp // // description : C++ source for the Bilt and its commands. // The class is derived from Device. It represents the // CORBA servant object which will be accessed from the // network. All commands which can be executed on the // Bilt are implemented in this file. // // project : TANGO Device Server // // $Author: meyer $ // // $Revision: 1.15 $ // // $Revision: 1.15 $ // $Date: 2010-11-10 12:01:29 $ // // SVN only: // $HeadURL: $ // // CVS only: // $Source: /segfs/tango/cvsroot/cppserver/machine/powersupply/SrSteerers/tango/Bilt/Bilt.cpp,v $ // $Log: not supported by cvs2svn $ // Revision 1.14 2010/06/21 07:13:05 meyer // Added a spectrum attribute for the temperature measurements and changed to libMagnet version 1.4. // // Revision 1.13 2010/05/01 16:58:39 meyer // Changed alarm limits for the impedance attribute. // // Revision 1.12 2010/03/16 14:54:58 meyer // Added reconnection method. // // Revision 1.11 2010-02-18 16:46:31 meyer // Filled-in code for SetpointCheck // // Revision 1.10 2010-02-12 16:35:13 meyer // Added SetPoleCurrent command again. // // Revision 1.9 2010-02-11 16:35:27 meyer // Currents settings understand NaN values. // Deleted StePoleCurrent command. // // Revision 1.8 2010/02/10 12:27:31 meyer // Restructured Bilt class. // Acquistion is now done by a thread and only the multi channel data // gets exported. A single channel class (BiltCh) was created. // // Revision 1.7 2009/12/18 12:01:40 meyer // Corrected alarm handling in dev_state() // // Revision 1.6 2009/11/27 13:49:26 meyer // Modified structure! The pole is no longer a device. // The device is now a magnet with three poles. // // Revision 1.5 2009/11/26 10:46:58 meyer // Updated for libMagnet_V120 // // Revision 1.4 2009/11/24 09:21:46 meyer // Absolut value for impedance // // Revision 1.3 2009/11/23 16:46:58 meyer // Corrected state, status and exception handling // // Revision 1.2 2009/11/06 12:46:25 meyer // Added impedance attribute and corrected fromatting of attribute values. // // Revision 1.1.1.1 2009/11/04 16:23:02 meyer // Imported using TkCVS // // // copyleft : European Synchrotron Radiation Facility // BP 220, Grenoble 38043 // FRANCE // //-============================================================================= // // This file is generated by POGO // (Program Obviously used to Generate tango Object) // // (c) - Software Engineering Group - ESRF //============================================================================= //=================================================================== // // The following table gives the correspondence // between commands and method name. // // Command name | Method name // ---------------------------------------- // State | dev_state() // Status | dev_status() // On | on() // Off | off() // Reset | reset() // SetPoleAcCurrent | set_pole_ac_current() // LocalPoleControl | local_pole_control() // SetpointCheck | setpoint_check() // SetPoleCurrent | set_pole_current() // //=================================================================== #include #include #include #include #include namespace Bilt_ns { //+---------------------------------------------------------------------------- // // method : Bilt::Bilt(string &s) // // description : constructor for simulated Bilt // // in : - cl : Pointer to the DeviceClass object // - s : Device name // //----------------------------------------------------------------------------- Bilt::Bilt(Tango::DeviceClass *cl,string &s) :Tango::Device_4Impl(cl,s.c_str()) { init_device(); } Bilt::Bilt(Tango::DeviceClass *cl,const char *s) :Tango::Device_4Impl(cl,s) { init_device(); } Bilt::Bilt(Tango::DeviceClass *cl,const char *s,const char *d) :Tango::Device_4Impl(cl,s,d) { init_device(); } //+---------------------------------------------------------------------------- // // method : Bilt::delete_device() // // description : will be called at device destruction or at init command. // //----------------------------------------------------------------------------- void Bilt::delete_device() { // Delete device allocated objects if ( acquisition_thread != NULL ) { data_mutex.lock(); exit_thread = true; data_mutex.unlock(); // join now the thread until it exits int *rv; acquisition_thread->join((void **)&rv); cout << "Bilt::delete_device(): Exit acquisition thread !!!" << endl; } // Delete connection to the power supply delete BILT; BILT = NULL; } //+---------------------------------------------------------------------------- // // method : Bilt::init_device() // // description : will be called at device initialization. // //----------------------------------------------------------------------------- void Bilt::init_device() { INFO_STREAM << "Bilt::Bilt() create device " << device_name << endl; // Initialise variables to default values //-------------------------------------------- get_device_property(); set_state (Tango::OFF); try { BILT = new itest::TMagnet (iPAddress.c_str(), magnetNumber); } catch (itest::ItestException &e) { try { create_tango_exception (e, mdata_errors, "Init failure" , "Cannot initialise ITEST libray objects", "Bilt::init_device"); } catch (Tango::DevFailed &e) { set_state (Tango::UNKNOWN); } } // initialise with the actual current set point values try { for (int i=0; ipole(i).get_current_DC(); } Tango::MultiAttribute *attr_list = get_device_attr(); Tango::WAttribute &attr_curr = attr_list->get_w_attr_by_name ("Currents"); attr_curr.set_write_value(¤ts_dc[0], currents_dc.size()); } catch (itest::ItestException &e) { try { create_tango_exception (e, mdata_errors, "Init failure" , "Cannot read the actual current set point values", "Bilt::init_device"); } catch (Tango::DevFailed &e) { set_state (Tango::UNKNOWN); } } // initialise and start the acquisition thread exit_thread = false; acquisition_thread = new AcquisitionThread(this, data_mutex, bilt_mutex); } //+---------------------------------------------------------------------------- // // method : Bilt::get_device_property() // // description : Read the device properties from database. // //----------------------------------------------------------------------------- void Bilt::get_device_property() { // Initialize your default values here (if not done with POGO). //------------------------------------------------------------------ BILT = NULL; bilt_connection_lost = false; acquisition_thread = NULL; struct timeval now; gettimeofday (&now, NULL); data_set_time = now; data_read_time = now; // intitialise mdada structure for magnet read values mdata.magnet = -1; mdata.state = -1; for (int i=0; i_UseDb==true) get_db_device()->get_property(dev_prop); Tango::DbDatum def_prop, cl_prop; BiltClass *ds_class = (static_cast(get_device_class())); int i = -1; // Try to initialize IPAddress from class property cl_prop = ds_class->get_class_property(dev_prop[++i].name); if (cl_prop.is_empty()==false) cl_prop >> iPAddress; else { // Try to initialize IPAddress from default device value def_prop = ds_class->get_default_device_property(dev_prop[i].name); if (def_prop.is_empty()==false) def_prop >> iPAddress; } // And try to extract IPAddress value from database if (dev_prop[i].is_empty()==false) dev_prop[i] >> iPAddress; // Try to initialize MagnetNumber from class property cl_prop = ds_class->get_class_property(dev_prop[++i].name); if (cl_prop.is_empty()==false) cl_prop >> magnetNumber; else { // Try to initialize MagnetNumber from default device value def_prop = ds_class->get_default_device_property(dev_prop[i].name); if (def_prop.is_empty()==false) def_prop >> magnetNumber; } // And try to extract MagnetNumber value from database if (dev_prop[i].is_empty()==false) dev_prop[i] >> magnetNumber; // Try to initialize UpdatePeriod from class property cl_prop = ds_class->get_class_property(dev_prop[++i].name); if (cl_prop.is_empty()==false) cl_prop >> updatePeriod; else { // Try to initialize UpdatePeriod from default device value def_prop = ds_class->get_default_device_property(dev_prop[i].name); if (def_prop.is_empty()==false) def_prop >> updatePeriod; } // And try to extract UpdatePeriod value from database if (dev_prop[i].is_empty()==false) dev_prop[i] >> updatePeriod; // End of Automatic code generation //------------------------------------------------------------------ } //+---------------------------------------------------------------------------- // // method : Bilt::always_executed_hook() // // description : method always executed before any command is executed // //----------------------------------------------------------------------------- void Bilt::always_executed_hook() { } //+---------------------------------------------------------------------------- // // method : Bilt::read_attr_hardware // // description : Hardware acquisition for attributes. // //----------------------------------------------------------------------------- void Bilt::read_attr_hardware(vector &attr_list) { DEBUG_STREAM << "Bilt::read_attr_hardware(vector &attr_list) entering... "<< endl; // Add your own code here } //+---------------------------------------------------------------------------- // // method : Bilt::read_Temperatures // // description : Extract real attribute values for Temperatures acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_Temperatures(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_Temperatures(Tango::Attribute &attr) entering... "<< endl; omni_mutex_lock l(data_mutex); if ( temp_errors.length() != 0 ) attr.set_quality(Tango::ATTR_INVALID); else { attr.set_value (&(temperatures[0]), 2*POLES); } /* try { temperatures.clear(); for (int i=0; ipole(i).get_ctn (&temp1, &temp2); INFO_STREAM << "Pole["<pole(i).get_switch(); } if ( switch_state == 1 ) local_control[i] = false; else local_control[i] = true; } } catch (itest::ItestException &e) { create_tango_exception (e, "Read failure" , "Cannot read the actual switch states", "Bilt::read_LocalControls"); } attr.set_value (&(local_control[0]), POLES); } //+---------------------------------------------------------------------------- // // method : Bilt::read_SetCurrentsRMS // // description : Extract real attribute values for SetCurrentsRMS acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_SetCurrentsRMS(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_SetCurrentsRMS(Tango::Attribute &attr) entering... "<< endl; omni_mutex_lock l(data_mutex); if ( fdata_errors.length() != 0 ) attr.set_quality(Tango::ATTR_INVALID); else { for (int i=0; i CURRENT_LIMIT ) impedances[i] = fabs (mdata.idata[i].measvolt / mdata.idata[i].meascurr); else impedances[i] = nan("NaN"); } } attr.set_value (&(impedances[0]), POLES); } //+---------------------------------------------------------------------------- // // method : Bilt::write_Currents // // description : Write Currents attribute values to hardware. // //----------------------------------------------------------------------------- void Bilt::write_Currents(Tango::WAttribute &attr) { DEBUG_STREAM << "Bilt::write_Currents(Tango::WAttribute &attr) entering... "<< endl; const double *set_currents; // check the correct number of setpoints if ( attr.get_write_value_length() == POLES ) attr.get_write_value(set_currents); else { TangoSys_MemStream tms; tms << "Wrong number of setpoints!" << endl; Tango::Except::throw_exception("WriteError", tms.str(), "Bilt::write_Currents"); } // apply setpoints to the poles try { for (int i=0; ipole(i).set_current_DC (set_currents[i]); } } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot write DC current values", "Bilt::write_Currents"); } // initialise the set time, to be sure that the next // returned read value is newer and contains the changes. struct timeval now; gettimeofday (&now, NULL); data_set_time = now; } //+---------------------------------------------------------------------------- // // method : Bilt::read_Currents // // description : Extract real attribute values for Currents acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_Currents(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_Currents(Tango::Attribute &attr) entering... "<< endl; // wait for the next data acquisition afer a current setpoint change double delay; { omni_mutex_lock l(data_mutex); delay = (data_set_time.tv_sec * 1e6 + data_set_time.tv_usec) - (data_read_time.tv_sec * 1e6 + data_read_time.tv_usec); //cout << "delay = " << delay << endl; } while ( delay > 0 ) { // 20 ms struct timespec sleep_time = {0, SLEEP_NS}; nanosleep(&sleep_time, NULL); omni_mutex_lock l(data_mutex); delay = (data_set_time.tv_sec * 1e6 + data_set_time.tv_usec) - (data_read_time.tv_sec * 1e6 + data_read_time.tv_usec); INFO_STREAM << "read waiting delay = " << delay << endl; } omni_mutex_lock l(data_mutex); if ( mdata_errors.length() != 0 ) attr.set_quality(Tango::ATTR_INVALID); else { for (int i=0; iset_state(1); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot switch on pole", "Bilt::on"); } } //+------------------------------------------------------------------ /** * method: Bilt::off * * description: method to execute "Off" * Turns of power supply * * */ //+------------------------------------------------------------------ void Bilt::off() { DEBUG_STREAM << "Bilt::off(): entering... !" << endl; // Add your own code to control device here try { omni_mutex_lock l(bilt_mutex); BILT->set_state(0); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot switch off pole", "Bilt::off"); } } //+------------------------------------------------------------------ /** * method: Bilt::reset * * description: method to execute "Reset" * Reset faults and alarms * * */ //+------------------------------------------------------------------ void Bilt::reset() { DEBUG_STREAM << "Bilt::reset(): entering... !" << endl; // Add your own code to control device here try { omni_mutex_lock l(bilt_mutex); BILT->clear_all_err(); BILT->clear_alarm(); for (int i=0; ipole(i).clear_ferrors(); } } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot reset pole", "Bilt::reset"); } } //+------------------------------------------------------------------ /** * method: Bilt::set_pole_ac_current * * description: method to execute "SetPoleAcCurrent" * Set the AC current for one Pole. * [0] = pole number, [1] = current * * @param argin * */ //+------------------------------------------------------------------ void Bilt::set_pole_ac_current(const Tango::DevVarDoubleArray *argin) { DEBUG_STREAM << "Bilt::set_pole_ac_current(): entering... !" << endl; // Add your own code to control device here // argin[0] = pole number if ( (*argin)[0] < 0 || (*argin)[0] >= POLES ) { TangoSys_MemStream tms; tms << "The entered Pole number is out of range" << endl; Tango::Except::throw_exception("WriteError", tms.str(), "Bilt::set_pole_ac_current"); } try { omni_mutex_lock l(bilt_mutex); BILT->pole((int)(*argin)[0]).set_current_AC ((*argin)[1]); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot write AC current value", "Bilt::set_pole_ac_current"); } } //+------------------------------------------------------------------ /** * method: Bilt::local_pole_control * * description: method to execute "LocalPoleControl" * Set the AC current for one Pole. * [0] = pole number, [1] = local control true/false * * @param argin * */ //+------------------------------------------------------------------ void Bilt::local_pole_control(const Tango::DevVarShortArray *argin) { DEBUG_STREAM << "Bilt::local_pole_control(): entering... !" << endl; // Add your own code to control device here // argin[0] = pole number if ( (*argin)[0] < 0 || (*argin)[0] >= POLES ) { TangoSys_MemStream tms; tms << "The entered Pole number is out of range" << endl; Tango::Except::throw_exception("WriteError", tms.str(), "Bilt::local_pole_control"); } // argin[1] = true or false (1 or 0 ) if ( (*argin)[1] != 0 && (*argin)[1] != 1 ) { TangoSys_MemStream tms; tms << "Local control can only be choosen as 0 or 1 (false or true)" << endl; Tango::Except::throw_exception("WriteError", tms.str(), "Bilt::local_pole_control"); } try { int switch_state; if ( (*argin)[1] == true ) switch_state = 0; else switch_state = 1; omni_mutex_lock l(bilt_mutex); BILT->pole((*argin)[0]).set_switch (switch_state); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot write switch state", "Bilt::local_pole_control"); } } //+------------------------------------------------------------------ /** * method: Bilt::set_pole_current * * description: method to execute "SetPoleCurrent" * Set the current for one Pole. * [0] = pole number, [1] = current * * @param argin * */ //+------------------------------------------------------------------ void Bilt::set_pole_current(const Tango::DevVarDoubleArray *argin) { DEBUG_STREAM << "Bilt::set_pole_current(): entering... !" << endl; // Add your own code to control device here // argin[0] = pole number if ( (*argin)[0] < 0 || (*argin)[0] >= POLES ) { TangoSys_MemStream tms; tms << "The entered Pole number is out of range" << endl; Tango::Except::throw_exception("WriteError", tms.str(), "Bilt::set_pole_current"); } try { omni_mutex_lock l(bilt_mutex); BILT->pole((int)(*argin)[0]).set_current_DC ((*argin)[1]); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot write current value", "Bilt::set_pole_current"); } // make sure that the current set values are correct! try { omni_mutex_lock l(bilt_mutex); for (int i=0; ipole(i).get_current_DC(); } Tango::MultiAttribute *attr_list = get_device_attr(); Tango::WAttribute &attr_curr = attr_list->get_w_attr_by_name ("Currents"); attr_curr.set_write_value(¤ts_dc[0], currents_dc.size()); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot read the actual current set point values", "Bilt::set_pole_current"); } // initialise the set time, to be sure that the next // returned read value is newer and contains the changes. struct timeval now; gettimeofday (&now, NULL); data_set_time = now; } //+------------------------------------------------------------------ /** * method: Bilt::create_tango_exception() * * description: convert an itest exception into a tango exception * * * in : - &e : Reference to itest exception * - reason : Reason of the local Tango exception to be added to the stack * - desc : Description for the local Tango exception to be added to the stack * - origin : Origin if the local Tango exception to be added to the stack */ //+------------------------------------------------------------------ void Bilt::create_tango_exception (itest::ItestException &e, string reason, string desc, string origin) { Tango::DevErrorList errors; create_tango_exception (e, errors, reason, desc, origin); } //+------------------------------------------------------------------ /** * method: Bilt::create_tango_exception() * * description: convert an itest exception into a tango exception * * * in : - &e : Reference to itest exception * - errors : Tango error list to use, to store exception info * - reason : Reason of the local Tango exception to be added to the stack * - desc : Description for the local Tango exception to be added to the stack * - origin : Origin if the local Tango exception to be added to the stack */ //+------------------------------------------------------------------ void Bilt::create_tango_exception (itest::ItestException &e, Tango::DevErrorList &errors, string reason, string desc, string origin) { DEBUG_STREAM << "Bilt::create_tango_exception(): entering... !" << endl; errors.length(e.errors.size() + 1); int i; for(i=0; idevice_status data member) and returns it to the caller. * * @return Status description * */ //+------------------------------------------------------------------ Tango::ConstDevString Bilt::dev_status() { //Tango::ConstDevString argout = DeviceImpl::dev_status(); DEBUG_STREAM << "Bilt::dev_status(): entering... !" << endl; // Add your own code to control device here stringstream status; Tango::DevState state = dev_state(); switch (state) { case Tango::ON: status << "State : ON" << endl; break; case Tango::OFF: status << "State : OFF" << endl; break; case Tango::ALARM: { status << "State : Alarm" << endl; omni_mutex_lock l(data_mutex); for (int i=0; i 10W in 10ms!" << endl; else { if ( mdata.idata[i].fail == "TEMP" ) status << "Fault descr. : Max. temp on semiconductor reached!" << endl; else { if ( mdata.idata[i].fail == "PWSO" ) status << "Fault descr. : Delivered power > 40W in 100ms!" << endl; else { status << "Fault descr. : Unkown fault code!" << endl; } } } } } } } break; } default: { { omni_mutex_lock l(data_mutex); status << "BILT state : Unknown" << endl; if ( bilt_connection_lost == true ) { status << "Connection lost to BILT power supply, trying to reconnect!" << endl; status << endl; } if ( mdata_errors.length() > 0 ) status << "Error stack : " << endl; for(int i=0; idevice_state data member) and returns it to the caller. * * @return State Code * */ //+------------------------------------------------------------------ Tango::DevState Bilt::dev_state() { Tango::DevState argout = DeviceImpl::dev_state(); DEBUG_STREAM << "Bilt::dev_state(): entering... !" << endl; // Add your own code to control device here int state; int errors; try { omni_mutex_lock l(data_mutex); state = mdata.state; INFO_STREAM << "magnet state for " << get_name() << " = " << state << endl; errors = mdata_errors.length(); INFO_STREAM << "mdata errors = " << mdata_errors.length() << endl; } catch (Tango::DevFailed &e) { // do nothing! // Just avoid exceptions when executing state or status! } if ( errors != 0 ) set_state (Tango::UNKNOWN); else { // set the device state switch (state) { case -1: set_state (Tango::UNKNOWN); bilt_connection_lost = true; break; case 0: set_state (Tango::OFF); break; case 1: set_state (Tango::ON); break; case 2: set_state (Tango::ALARM); break; case 3: set_state (Tango::FAULT); break; default: set_state (Tango::UNKNOWN); break; } } // Check for attribute alarms if ( get_state() == Tango::ON && argout == Tango::ALARM ) set_state (Tango::ALARM); return get_state(); } //+------------------------------------------------------------------ /** * method: Bilt::setpoint_check * * description: method to execute "SetpointCheck" * Check the given current values against the specified limits. * * @param argin Setpoint values for the Poles * @return true when settings are OK * */ //+------------------------------------------------------------------ Tango::DevBoolean Bilt::setpoint_check(const Tango::DevVarDoubleArray *argin) { Tango::DevBoolean argout ; DEBUG_STREAM << "Bilt::setpoint_check(): entering... !" << endl; // Add your own code to control device here // get the min and max values for the current settings Tango::MultiAttribute *attr_list = get_device_attr(); Tango::WAttribute &attr_curr = attr_list->get_w_attr_by_name ("Currents"); double min, max; attr_curr.get_min_value(min); attr_curr.get_max_value(max); INFO_STREAM << "min = " << min << " max = " << max << endl; // check the input values argout = true; for ( int i=0; ilength(); i++ ) { INFO_STREAM << "i = " << i << " curr = " << (*argin)[i] << endl; if ( (*argin)[i] < min || (*argin)[i] > max ) { argout = false; break; } } return argout; } } // namespace Node-path: powersupply/itest/Bilt/trunk/AcquisitionThread.cpp Node-kind: file Node-action: change Text-content-length: 9635 Text-content-md5: d65d2c3b06620ce85c221e0ce0208b7c Content-length: 9635 #include #include namespace Bilt_ns { AcquisitionThread::AcquisitionThread (Bilt *_bilt_ps, omni_mutex &d_m, omni_mutex &bilt_m) : Tango::LogAdapter(_bilt_ps), omni_thread(), data_mutex(d_m), bilt_mutex(bilt_m) { bilt_ps = _bilt_ps; last_update.tv_sec = 0; last_update.tv_usec = 0; last_temp_update.tv_sec = 0; last_temp_update.tv_usec = 0; last_reconnect.tv_sec = 0; last_reconnect.tv_usec = 0; updatePeriod = bilt_ps->updatePeriod; // cout << "AcquisitionThread::AcquisitionThread(): go to start thread ...\n"; start_undetached(); } //+------------------------------------------------------------------ /** * method: run_undetached() * * description: * */ //+------------------------------------------------------------------ void *AcquisitionThread::run_undetached(void*) { bool exit; INFO_STREAM << " AcquisitionThread::run_undetached() entering endless loop!" << endl; while (1) { { // copy to local variables omni_mutex_lock l(data_mutex); exit = bilt_ps->exit_thread; bilt_connection_lost = bilt_ps->bilt_connection_lost; } /* exit the calculation thread */ if ( exit == true ) { break; } struct timeval now; gettimeofday (&now, NULL); double delay = (now.tv_sec * 1e6 + now.tv_usec) - (last_update.tv_sec * 1e6 + last_update.tv_usec); // only read new data every updatePeriod ms!! if ( delay < (updatePeriod * 1000) ) { // 20 ms struct timespec sleep_time = {0, SLEEP_NS}; nanosleep(&sleep_time, NULL); continue; } else { INFO_STREAM << "delay = " << delay/1000 << "ms" << endl; last_update = now; } // reset error variables mdata_errors.length(0); fdata_errors.length(0); // read_mdata() try { { // testing //mdata.state = -2; //mdata.idata[0].state = -2; //mdata.idata[1].state = -2; //mdata.idata[2].state = -2; //mdata.idata[0].meascurr = -2; //mdata.idata[1].meascurr = -2; //mdata.idata[2].meascurr = -2; omni_mutex_lock l(bilt_mutex); // check for a lost connection and try // to reconnect if necessary if ( bilt_connection_lost ) { bilt_reconnect(); } bilt_ps->BILT->get_mdata (&mdata); // testing //cout << "mag num = " << mdata.magnet << endl; //cout << "mag state = " << mdata.state << endl; //cout << "pole 0 = " << mdata.idata[0].state << " : " << mdata.idata[0].meascurr << endl; //cout << "pole 1 = " << mdata.idata[1].state << " : " << mdata.idata[1].meascurr << endl; //cout << "pole 2 = " << mdata.idata[2].state << " : " << mdata.idata[2].meascurr << endl<< endl; } mdata_errors.length(0); } catch (itest::ItestException &e) { create_tango_error (e, mdata_errors, "Read failure" , "Cannot read the mdata structure", "AcquisitionThread::run_undetached"); } // read_fdata() try { for (int i=0; iBILT->pole(i).get_fdata (&fdata[i]); } fdata_errors.length(0); } catch (itest::ItestException &e) { create_tango_error (e, fdata_errors, "Read failure" , "Cannot read the fdata structure", "AcquisitionThread::run_undetached"); } { struct timeval now; gettimeofday (&now, NULL); // copy the read data omni_mutex_lock l(data_mutex); bilt_ps->mdata_errors = mdata_errors; bilt_ps->fdata_errors = fdata_errors; bilt_ps->mdata.magnet = mdata.magnet; bilt_ps->mdata.state = mdata.state; for (int i=0; imdata.idata[i].magnet = mdata.idata[i].magnet; bilt_ps->mdata.idata[i].pole = mdata.idata[i].pole; bilt_ps->mdata.idata[i].state = mdata.idata[i].state; bilt_ps->mdata.idata[i].fail = mdata.idata[i].fail; bilt_ps->mdata.idata[i].measvolt = mdata.idata[i].measvolt; bilt_ps->mdata.idata[i].meascurr = mdata.idata[i].meascurr; bilt_ps->fdata[i].nbrframe_sec = fdata[i].nbrframe_sec; bilt_ps->fdata[i].nbrferr_sec = fdata[i].nbrferr_sec; bilt_ps->fdata[i].rms_ac_sett_sec = fdata[i].rms_ac_sett_sec; bilt_ps->fdata[i].average_sett_sec = fdata[i].average_sett_sec; bilt_ps->fdata[i].nbrferr = fdata[i].nbrferr; } // store time when data was read bilt_ps->data_read_time = now; } // Read the temperature data // Only read every 30 seconds double temp_delay = (now.tv_sec * 1e6 + now.tv_usec) - (last_temp_update.tv_sec * 1e6 + last_temp_update.tv_usec); // only read new data every 30s!! if ( temp_delay > (30 * 1000000) ) { try { temperatures.clear(); for (int i=0; iBILT->pole(i).get_ctn (&temp1, &temp2); INFO_STREAM << "Pole["<temp_errors = temp_errors; for (int i=0; itemperatures[i] = temperatures[i]; } } last_temp_update = now; } } return NULL; } //+------------------------------------------------------------------ /** * method: AcquisitionThread::create_tango_error() * * description: convert an itest exception into a tango error * * * in : - &e : Reference to itest exception * - errors : Tango error list to use, to store exception info * - reason : Reason of the local Tango exception to be added to the stack * - desc : Description for the local Tango exception to be added to the stack * - origin : Origin if the local Tango exception to be added to the stack */ //+------------------------------------------------------------------ void AcquisitionThread::create_tango_error (itest::ItestException &e, Tango::DevErrorList &errors, string reason, string desc, string origin) { DEBUG_STREAM << "Bilt::create_tango_exception(): entering... !" << endl; errors.length(e.errors.size() + 1); int i; for(i=0; iget_name() << " : " << (long)delay<< endl; // Try to create a new connection try { new_handle = new itest::TMagnet (bilt_ps->iPAddress.c_str(), bilt_ps->magnetNumber); } catch (itest::ItestException &e) { DEBUG_STREAM << "Reconnection failed with error: " << endl; for(int i=0; i #include #include #include namespace BiltCh_ns { //+---------------------------------------------------------------------------- // // method : BiltCh::BiltCh(string &s) // // description : constructor for simulated BiltCh // // in : - cl : Pointer to the DeviceClass object // - s : Device name // //----------------------------------------------------------------------------- BiltCh::BiltCh(Tango::DeviceClass *cl,string &s) :Tango::Device_4Impl(cl,s.c_str()) { init_device(); } BiltCh::BiltCh(Tango::DeviceClass *cl,const char *s) :Tango::Device_4Impl(cl,s) { init_device(); } BiltCh::BiltCh(Tango::DeviceClass *cl,const char *s,const char *d) :Tango::Device_4Impl(cl,s,d) { init_device(); } //+---------------------------------------------------------------------------- // // method : BiltCh::delete_device() // // description : will be called at device destruction or at init command. // //----------------------------------------------------------------------------- void BiltCh::delete_device() { // Delete device allocated objects if ( bilt_obj != NULL ) { delete bilt_obj; } } //+---------------------------------------------------------------------------- // // method : BiltCh::init_device() // // description : will be called at device initialization. // //----------------------------------------------------------------------------- void BiltCh::init_device() { INFO_STREAM << "BiltCh::BiltCh() create device " << device_name << endl; // Initialise variables to default values //-------------------------------------------- get_device_property(); set_state (Tango::UNKNOWN); // open proxy to Bilt power supply try { bilt_obj = new Tango::DeviceProxy(biltName); Tango::DeviceAttribute rattr; Tango::DevState bilt_state; rattr = bilt_obj->read_attribute("State"); rattr >> bilt_state; set_state (bilt_state); bilt_init = true; } catch (Tango::DevFailed &e) { bilt_error = e.errors; bilt_init = false; } } //+---------------------------------------------------------------------------- // // method : BiltCh::get_device_property() // // description : Read the device properties from database. // //----------------------------------------------------------------------------- void BiltCh::get_device_property() { // Initialize your default values here (if not done with POGO). //------------------------------------------------------------------ bilt_obj = NULL; current = 0; voltage = 0; impedance = 0; current_rms = 0; current_average = 0; error_counter = 0; errors_per_sec = 0; frames_per_sec = 0; local_control = false; current_ac = 0; temp1 = 0; temp2 = 0; // Read device properties from database.(Automatic code generation) //------------------------------------------------------------------ Tango::DbData dev_prop; dev_prop.push_back(Tango::DbDatum("BiltName")); dev_prop.push_back(Tango::DbDatum("PoleNumber")); // Call database and extract values //-------------------------------------------- if (Tango::Util::instance()->_UseDb==true) get_db_device()->get_property(dev_prop); Tango::DbDatum def_prop, cl_prop; BiltChClass *ds_class = (static_cast(get_device_class())); int i = -1; // Try to initialize BiltName from class property cl_prop = ds_class->get_class_property(dev_prop[++i].name); if (cl_prop.is_empty()==false) cl_prop >> biltName; else { // Try to initialize BiltName from default device value def_prop = ds_class->get_default_device_property(dev_prop[i].name); if (def_prop.is_empty()==false) def_prop >> biltName; } // And try to extract BiltName value from database if (dev_prop[i].is_empty()==false) dev_prop[i] >> biltName; // Try to initialize PoleNumber from class property cl_prop = ds_class->get_class_property(dev_prop[++i].name); if (cl_prop.is_empty()==false) cl_prop >> poleNumber; else { // Try to initialize PoleNumber from default device value def_prop = ds_class->get_default_device_property(dev_prop[i].name); if (def_prop.is_empty()==false) def_prop >> poleNumber; } // And try to extract PoleNumber value from database if (dev_prop[i].is_empty()==false) dev_prop[i] >> poleNumber; // End of Automatic code generation //------------------------------------------------------------------ } //+---------------------------------------------------------------------------- // // method : BiltCh::always_executed_hook() // // description : method always executed before any command is executed // //----------------------------------------------------------------------------- void BiltCh::always_executed_hook() { } //+---------------------------------------------------------------------------- // // method : BiltCh::read_attr_hardware // // description : Hardware acquisition for attributes. // //----------------------------------------------------------------------------- void BiltCh::read_attr_hardware(vector &attr_list) { DEBUG_STREAM << "BiltCh::read_attr_hardware(vector &attr_list) entering... "<< endl; // Add your own code here if ( bilt_init == false ) { TangoSys_MemStream tms; tms << "Device is not correctly initialised! See the device status for more information." << endl; Tango::Except::throw_exception("ReadError", tms.str(), "Bilt::read_attr_hardware"); } } //+---------------------------------------------------------------------------- // // method : BiltCh::read_Temperature1 // // description : Extract real attribute values for Temperature1 acquisition result. // //----------------------------------------------------------------------------- void BiltCh::read_Temperature1(Tango::Attribute &attr) { DEBUG_STREAM << "BiltCh::read_Temperature1(Tango::Attribute &attr) entering... "<< endl; Tango::DeviceAttribute rattr; vector temps; rattr = bilt_obj->read_attribute("Temperatures"); rattr >> temps; temp1 = temps[poleNumber * 2]; attr.set_value (&temp1); } //+---------------------------------------------------------------------------- // // method : BiltCh::read_Temperature2 // // description : Extract real attribute values for Temperature2 acquisition result. // //----------------------------------------------------------------------------- void BiltCh::read_Temperature2(Tango::Attribute &attr) { DEBUG_STREAM << "BiltCh::read_Temperature2(Tango::Attribute &attr) entering... "<< endl; Tango::DeviceAttribute rattr; vector temps; rattr = bilt_obj->read_attribute("Temperatures"); rattr >> temps; temp2 = temps[(poleNumber * 2) + 1]; attr.set_value (&temp2); } //+---------------------------------------------------------------------------- // // method : BiltCh::read_Current // // description : Extract real attribute values for Current acquisition result. // //----------------------------------------------------------------------------- void BiltCh::read_Current(Tango::Attribute &attr) { DEBUG_STREAM << "BiltCh::read_Current(Tango::Attribute &attr) entering... "<< endl; Tango::DeviceAttribute rattr; vector values; rattr = bilt_obj->read_attribute("Currents"); rattr >> values; Tango::MultiAttribute *attr_list = get_device_attr(); Tango::WAttribute &attr_curr = attr_list->get_w_attr_by_name ("Current"); attr_curr.set_write_value( &(values[POLES + poleNumber]) ); current = values[poleNumber]; attr.set_value (¤t); } //+---------------------------------------------------------------------------- // // method : BiltCh::write_Current // // description : Write Current attribute values to hardware. // //----------------------------------------------------------------------------- void BiltCh::write_Current(Tango::WAttribute &attr) { DEBUG_STREAM << "BiltCh::write_Current(Tango::WAttribute &attr) entering... "<< endl; double set_current; attr.get_write_value(set_current); Tango::DeviceData argin; vector cmd_in; cmd_in.push_back (poleNumber); cmd_in.push_back (set_current); argin << cmd_in; bilt_obj->command_inout("SetPoleCurrent", argin); } //+---------------------------------------------------------------------------- // // method : BiltCh::read_Voltage // // description : Extract real attribute values for Voltage acquisition result. // //----------------------------------------------------------------------------- void BiltCh::read_Voltage(Tango::Attribute &attr) { DEBUG_STREAM << "BiltCh::read_Voltage(Tango::Attribute &attr) entering... "<< endl; Tango::DeviceAttribute rattr; vector values; rattr = bilt_obj->read_attribute("Voltages"); rattr >> values; voltage = values[poleNumber]; attr.set_value (&voltage); } //+---------------------------------------------------------------------------- // // method : BiltCh::read_Impedance // // description : Extract real attribute values for Impedance acquisition result. // //----------------------------------------------------------------------------- void BiltCh::read_Impedance(Tango::Attribute &attr) { DEBUG_STREAM << "BiltCh::read_Impedance(Tango::Attribute &attr) entering... "<< endl; Tango::DeviceAttribute rattr; vector values; rattr = bilt_obj->read_attribute("Impedances"); rattr >> values; impedance = values[poleNumber]; attr.set_value (&impedance); } //+---------------------------------------------------------------------------- // // method : BiltCh::read_SetCurrentRMS // // description : Extract real attribute values for SetCurrentRMS acquisition result. // //----------------------------------------------------------------------------- void BiltCh::read_SetCurrentRMS(Tango::Attribute &attr) { DEBUG_STREAM << "BiltCh::read_SetCurrentRMS(Tango::Attribute &attr) entering... "<< endl; Tango::DeviceAttribute rattr; vector values; rattr = bilt_obj->read_attribute("SetCurrentsRMS"); rattr >> values; current_rms = values[poleNumber]; attr.set_value (¤t_rms); } //+---------------------------------------------------------------------------- // // method : BiltCh::read_SetCurrentAverage // // description : Extract real attribute values for SetCurrentAverage acquisition result. // //----------------------------------------------------------------------------- void BiltCh::read_SetCurrentAverage(Tango::Attribute &attr) { DEBUG_STREAM << "BiltCh::read_SetCurrentAverage(Tango::Attribute &attr) entering... "<< endl; Tango::DeviceAttribute rattr; vector values; rattr = bilt_obj->read_attribute("SetCurrentsAverage"); rattr >> values; current_average = values[poleNumber]; attr.set_value (¤t_average); } //+---------------------------------------------------------------------------- // // method : BiltCh::read_FramesPerSec // // description : Extract real attribute values for FramesPerSec acquisition result. // //----------------------------------------------------------------------------- void BiltCh::read_FramesPerSecond(Tango::Attribute &attr) { DEBUG_STREAM << "BiltCh::read_FramesPerSec(Tango::Attribute &attr) entering... "<< endl; Tango::DeviceAttribute rattr; vector values; rattr = bilt_obj->read_attribute("FramesPerSecond"); rattr >> values; frames_per_sec = values[poleNumber]; attr.set_value (&frames_per_sec); } //+---------------------------------------------------------------------------- // // method : BiltCh::read_ErrorPerSec // // description : Extract real attribute values for ErrorPerSec acquisition result. // //----------------------------------------------------------------------------- void BiltCh::read_ErrorPerSecond(Tango::Attribute &attr) { DEBUG_STREAM << "BiltCh::read_ErrorPerSec(Tango::Attribute &attr) entering... "<< endl; Tango::DeviceAttribute rattr; vector values; rattr = bilt_obj->read_attribute("ErrorsPerSecond"); rattr >> values; errors_per_sec = values[poleNumber]; attr.set_value (&errors_per_sec); } //+---------------------------------------------------------------------------- // // method : BiltCh::read_ErrorCounter // // description : Extract real attribute values for ErrorCounter acquisition result. // //----------------------------------------------------------------------------- void BiltCh::read_ErrorCounter(Tango::Attribute &attr) { DEBUG_STREAM << "BiltCh::read_ErrorCounter(Tango::Attribute &attr) entering... "<< endl; Tango::DeviceAttribute rattr; vector values; rattr = bilt_obj->read_attribute("ErrorCounters"); rattr >> values; error_counter = values[poleNumber]; attr.set_value (&error_counter); } //+---------------------------------------------------------------------------- // // method : BiltCh::read_LocalControl // // description : Extract real attribute values for LocalControl acquisition result. // //----------------------------------------------------------------------------- void BiltCh::read_LocalControl(Tango::Attribute &attr) { DEBUG_STREAM << "BiltCh::read_LocalControl(Tango::Attribute &attr) entering... "<< endl; Tango::DeviceAttribute rattr; vector values; rattr = bilt_obj->read_attribute("LocalControls"); rattr >> values; local_control = values[poleNumber]; attr.set_value (&local_control); } //+---------------------------------------------------------------------------- // // method : BiltCh::write_LocalControl // // description : Write LocalControl attribute values to hardware. // //----------------------------------------------------------------------------- void BiltCh::write_LocalControl(Tango::WAttribute &attr) { DEBUG_STREAM << "BiltCh::write_LocalControl(Tango::WAttribute &attr) entering... "<< endl; bool local_control; attr.get_write_value(local_control); Tango::DeviceData argin; vector cmd_in; cmd_in.push_back (poleNumber); if (local_control == true) cmd_in.push_back (1); else { cmd_in.push_back (0); // set back the AC current setpoint to 0! Tango::DeviceData ac_curr; vector ac_in; ac_in.push_back (poleNumber); ac_in.push_back (0); ac_curr << ac_in; bilt_obj->command_inout("SetPoleAcCurrent", ac_curr); current_ac = 0; } argin << cmd_in; bilt_obj->command_inout("LocalPoleControl", argin); } //+---------------------------------------------------------------------------- // // method : BiltCh::read_SetCurrentAC // // description : Extract real attribute values for SetCurrentAC acquisition result. // //----------------------------------------------------------------------------- void BiltCh::read_SetCurrentAC(Tango::Attribute &attr) { DEBUG_STREAM << "BiltCh::read_SetCurrentAC(Tango::Attribute &attr) entering... "<< endl; if ( local_control == false ) { attr.set_quality (Tango::ATTR_INVALID); } else { attr.set_value (¤t_ac); } } //+---------------------------------------------------------------------------- // // method : BiltCh::write_SetCurrentAC // // description : Write SetCurrentAC attribute values to hardware. // //----------------------------------------------------------------------------- void BiltCh::write_SetCurrentAC(Tango::WAttribute &attr) { DEBUG_STREAM << "BiltCh::write_SetCurrentAC(Tango::WAttribute &attr) entering... "<< endl; if ( local_control == false ) { TangoSys_MemStream tms; tms << "Can set AC current only when local control enabled!" << endl; Tango::Except::throw_exception("WriteError", tms.str(), "Bilt::write_SetCurrentAC"); } double set_current; attr.get_write_value(set_current); Tango::DeviceData argin; vector cmd_in; cmd_in.push_back (poleNumber); cmd_in.push_back (set_current); argin << cmd_in; bilt_obj->command_inout("SetPoleAcCurrent", argin); current_ac = set_current; } //+------------------------------------------------------------------ /** * method: BiltCh::dev_state * * description: method to execute "State" * This command gets the device state (stored in its device_state data member) and returns it to the caller. * * @return State Code * */ //+------------------------------------------------------------------ Tango::DevState BiltCh::dev_state() { Tango::DevState argout = DeviceImpl::dev_state(); DEBUG_STREAM << "BiltCh::dev_state(): entering... !" << endl; // Add your own code to control device here if ( bilt_init == true ) { Tango::DeviceAttribute rattr; Tango::DevState bilt_state; rattr = bilt_obj->read_attribute("State"); rattr >> bilt_state; set_state (bilt_state); } return get_state(); } //+------------------------------------------------------------------ /** * method: BiltCh::dev_status * * description: method to execute "Status" * This command gets the device status (stored in its device_status data member) and returns it to the caller. * * @return Status description * */ //+------------------------------------------------------------------ Tango::ConstDevString BiltCh::dev_status() { //Tango::ConstDevString argout = DeviceImpl::dev_status(); DEBUG_STREAM << "BiltCh::dev_status(): entering... !" << endl; // Add your own code to control device here string bilt_status; if ( bilt_init == true ) { Tango::DeviceAttribute rattr; rattr = bilt_obj->read_attribute("Status"); rattr >> bilt_status; set_status (bilt_status); } else { bilt_status = "Error during initialisation: \n"; for (short i = 0; i //using namespace Tango; /** * @author $Author: meyer $ * @version $Revision: 1.4 $ */ // Add your own constant definitions here. //----------------------------------------------- // Number of poles per magnet #define POLES 3 namespace BiltCh_ns { /** * Class Description: * The Bilt multi channel power supply has three individual channels. * This class offers an interface to an individual channel of the power supply. */ /* * Device States Description: * Tango::ON : Magnet is ON, all three channels are ON. * Tango::OFF : Magnet is OFF, all three channels are OFF. * Tango::FAULT : Error detected by the BILT magnet. * Tango::ALARM : Alarm detected on one or more channels. * Tango::UNKNOWN : Communication fault */ class BiltCh: public Tango::Device_4Impl { public : // Add your own data members here //----------------------------------------- // Here is the Start of the automatic code generation part //------------------------------------------------------------- /** * @name attributes * Attribute member data. */ //@{ Tango::DevDouble *attr_Current_read; Tango::DevDouble attr_Current_write; Tango::DevDouble *attr_Voltage_read; Tango::DevDouble *attr_Impedance_read; Tango::DevDouble *attr_SetCurrentRMS_read; Tango::DevDouble *attr_SetCurrentAverage_read; Tango::DevULong *attr_FramesPerSecond_read; Tango::DevULong *attr_ErrorPerSecond_read; Tango::DevULong *attr_ErrorCounter_read; Tango::DevBoolean *attr_LocalControl_read; Tango::DevBoolean attr_LocalControl_write; Tango::DevDouble *attr_SetCurrentAC_read; Tango::DevDouble attr_SetCurrentAC_write; Tango::DevDouble *attr_Temperature1_read; Tango::DevDouble *attr_Temperature2_read; //@} /** * @name Device properties * Device properties member data. */ //@{ /** * Name of the Bilt multi channel power supply device * */ string biltName; /** * The number of the channel or Pole of the Bilt power supply [0 -2] */ Tango::DevShort poleNumber; //@} /** * @name Device properties * Device property member data. */ //@{ //@} /**@name Constructors * Miscellaneous constructors */ //@{ /** * Constructs a newly allocated Command object. * * @param cl Class. * @param s Device Name */ BiltCh(Tango::DeviceClass *cl,string &s); /** * Constructs a newly allocated Command object. * * @param cl Class. * @param s Device Name */ BiltCh(Tango::DeviceClass *cl,const char *s); /** * Constructs a newly allocated Command object. * * @param cl Class. * @param s Device name * @param d Device description. */ BiltCh(Tango::DeviceClass *cl,const char *s,const char *d); //@} /**@name Destructor * Only one destructor is defined for this class */ //@{ /** * The object destructor. */ ~BiltCh() {delete_device();}; /** * will be called at device destruction or at init command. */ void delete_device(); //@} /**@name Miscellaneous methods */ //@{ /** * Initialize the device */ virtual void init_device(); /** * Always executed method before execution command method. */ virtual void always_executed_hook(); //@} /** * @name BiltCh methods prototypes */ //@{ /** * Hardware acquisition for attributes. */ virtual void read_attr_hardware(vector &attr_list); /** * Extract real attribute values for Current acquisition result. */ virtual void read_Current(Tango::Attribute &attr); /** * Write Current attribute values to hardware. */ virtual void write_Current(Tango::WAttribute &attr); /** * Extract real attribute values for Voltage acquisition result. */ virtual void read_Voltage(Tango::Attribute &attr); /** * Extract real attribute values for Impedance acquisition result. */ virtual void read_Impedance(Tango::Attribute &attr); /** * Extract real attribute values for SetCurrentRMS acquisition result. */ virtual void read_SetCurrentRMS(Tango::Attribute &attr); /** * Extract real attribute values for SetCurrentAverage acquisition result. */ virtual void read_SetCurrentAverage(Tango::Attribute &attr); /** * Extract real attribute values for FramesPerSecond acquisition result. */ virtual void read_FramesPerSecond(Tango::Attribute &attr); /** * Extract real attribute values for ErrorPerSecond acquisition result. */ virtual void read_ErrorPerSecond(Tango::Attribute &attr); /** * Extract real attribute values for ErrorCounter acquisition result. */ virtual void read_ErrorCounter(Tango::Attribute &attr); /** * Extract real attribute values for LocalControl acquisition result. */ virtual void read_LocalControl(Tango::Attribute &attr); /** * Write LocalControl attribute values to hardware. */ virtual void write_LocalControl(Tango::WAttribute &attr); /** * Extract real attribute values for SetCurrentAC acquisition result. */ virtual void read_SetCurrentAC(Tango::Attribute &attr); /** * Write SetCurrentAC attribute values to hardware. */ virtual void write_SetCurrentAC(Tango::WAttribute &attr); /** * Extract real attribute values for Temperature1 acquisition result. */ virtual void read_Temperature1(Tango::Attribute &attr); /** * Extract real attribute values for Temperature2 acquisition result. */ virtual void read_Temperature2(Tango::Attribute &attr); /** * Read/Write allowed for Current attribute. */ virtual bool is_Current_allowed(Tango::AttReqType type); /** * Read/Write allowed for Voltage attribute. */ virtual bool is_Voltage_allowed(Tango::AttReqType type); /** * Read/Write allowed for Impedance attribute. */ virtual bool is_Impedance_allowed(Tango::AttReqType type); /** * Read/Write allowed for SetCurrentRMS attribute. */ virtual bool is_SetCurrentRMS_allowed(Tango::AttReqType type); /** * Read/Write allowed for SetCurrentAverage attribute. */ virtual bool is_SetCurrentAverage_allowed(Tango::AttReqType type); /** * Read/Write allowed for FramesPerSecond attribute. */ virtual bool is_FramesPerSecond_allowed(Tango::AttReqType type); /** * Read/Write allowed for ErrorPerSecond attribute. */ virtual bool is_ErrorPerSecond_allowed(Tango::AttReqType type); /** * Read/Write allowed for ErrorCounter attribute. */ virtual bool is_ErrorCounter_allowed(Tango::AttReqType type); /** * Read/Write allowed for LocalControl attribute. */ virtual bool is_LocalControl_allowed(Tango::AttReqType type); /** * Read/Write allowed for SetCurrentAC attribute. */ virtual bool is_SetCurrentAC_allowed(Tango::AttReqType type); /** * Read/Write allowed for Temperature1 attribute. */ virtual bool is_Temperature1_allowed(Tango::AttReqType type); /** * Read/Write allowed for Temperature2 attribute. */ virtual bool is_Temperature2_allowed(Tango::AttReqType type); /** * This command gets the device state (stored in its device_state data member) and returns it to the caller. * @return State Code * @exception DevFailed */ virtual Tango::DevState dev_state(); /** * This command gets the device status (stored in its device_status data member) and returns it to the caller. * @return Status description * @exception DevFailed */ virtual Tango::ConstDevString dev_status(); /** * Read the device properties from database */ void get_device_property(); //@} // Here is the end of the automatic code generation part //------------------------------------------------------------- protected : // Add your own data members here //----------------------------------------- Tango::DeviceProxy *bilt_obj; Tango::DevErrorList bilt_error; bool bilt_init; double current; double voltage; double impedance; double current_rms; double current_average; Tango::DevULong error_counter; Tango::DevULong errors_per_sec; Tango::DevULong frames_per_sec; bool local_control; double current_ac; double temp1; double temp2; }; } // namespace_ns #endif // _BILTCH_H Node-path: powersupply/itest/BiltCh/trunk/BiltChClass.cpp Node-kind: file Node-action: change Text-content-length: 19784 Text-content-md5: 465e148b4b55896aba944e79cb2bacfc Content-length: 19784 static const char *ClassId = "$Id: BiltChClass.cpp,v 1.5 2010-11-10 12:02:30 meyer Exp $"; static const char *TagName = "$Name: not supported by cvs2svn $"; static const char *CvsPath = "$Source: /segfs/tango/cvsroot/cppserver/machine/powersupply/SrSteerers/tango/BiltCh/BiltChClass.cpp,v $"; static const char *SvnPath = "$HeadURL: $"; static const char *HttpServer = "http://www.esrf.fr/computing/cs/tango/tango_doc/ds_doc/"; //+============================================================================= // // file : BiltChClass.cpp // // description : C++ source for the BiltChClass. A singleton // class derived from DeviceClass. It implements the // command list and all properties and methods required // by the BiltCh once per process. // // project : TANGO Device Server // // $Author: meyer $ // // $Revision: 1.5 $ // // $Log: not supported by cvs2svn $ // Revision 1.4 2010/06/21 07:11:03 meyer // Added two attributes for the temperature measurements. // // Revision 1.3 2010/05/01 16:25:41 meyer // Modified impedance alarm limits. // // Revision 1.2 2010-02-10 16:22:40 meyer // Release_1_0 // // Revision 1.1.1.1 2010-02-10 11:49:21 meyer // Imported using TkCVS // // // copyleft : European Synchrotron Radiation Facility // BP 220, Grenoble 38043 // FRANCE // //-============================================================================= // // This file is generated by POGO // (Program Obviously used to Generate tango Object) // // (c) - Software Engineering Group - ESRF //============================================================================= #include #include #include //+---------------------------------------------------------------------------- /** * Create BiltChClass singleton and return it in a C function for Python usage */ //+---------------------------------------------------------------------------- extern "C" { #ifdef WIN32 __declspec(dllexport) #endif Tango::DeviceClass *_create_BiltCh_class(const char *name) { return BiltCh_ns::BiltChClass::init(name); } } namespace BiltCh_ns { // //---------------------------------------------------------------- // Initialize pointer for singleton pattern //---------------------------------------------------------------- // BiltChClass *BiltChClass::_instance = NULL; //+---------------------------------------------------------------------------- // // method : BiltChClass::BiltChClass(string &s) // // description : constructor for the BiltChClass // // in : - s : The class name // //----------------------------------------------------------------------------- BiltChClass::BiltChClass(string &s):DeviceClass(s) { cout2 << "Entering BiltChClass constructor" << endl; set_default_property(); get_class_property(); write_class_property(); cout2 << "Leaving BiltChClass constructor" << endl; } //+---------------------------------------------------------------------------- // // method : BiltChClass::~BiltChClass() // // description : destructor for the BiltChClass // //----------------------------------------------------------------------------- BiltChClass::~BiltChClass() { _instance = NULL; } //+---------------------------------------------------------------------------- // // method : BiltChClass::instance // // description : Create the object if not already done. Otherwise, just // return a pointer to the object // // in : - name : The class name // //----------------------------------------------------------------------------- BiltChClass *BiltChClass::init(const char *name) { if (_instance == NULL) { try { string s(name); _instance = new BiltChClass(s); } catch (bad_alloc) { throw; } } return _instance; } BiltChClass *BiltChClass::instance() { if (_instance == NULL) { cerr << "Class is not initialised !!" << endl; exit(-1); } return _instance; } //+---------------------------------------------------------------------------- // // method : BiltChClass::command_factory // // description : Create the command object(s) and store them in the // command list // //----------------------------------------------------------------------------- void BiltChClass::command_factory() { // add polling if any for (unsigned int i=0 ; ilength() ; i++) { cout4 << "Device name : " << (*devlist_ptr)[i].in() << endl; // Create devices and add it into the device list //---------------------------------------------------- device_list.push_back(new BiltCh(this, (*devlist_ptr)[i])); // Export device to the outside world // Check before if database used. //--------------------------------------------- if ((Tango::Util::_UseDb == true) && (Tango::Util::_FileDb == false)) export_device(device_list.back()); else export_device(device_list.back(), (*devlist_ptr)[i]); } // End of Automatic code generation //------------------------------------------------------------- } //+---------------------------------------------------------------------------- // Method: BiltChClass::attribute_factory(vector &att_list) //----------------------------------------------------------------------------- void BiltChClass::attribute_factory(vector &att_list) { // Attribute : Current CurrentAttrib *current = new CurrentAttrib(); Tango::UserDefaultAttrProp current_prop; current_prop.set_label("DC Current"); current_prop.set_unit("A"); current_prop.set_format("%6.4f"); current_prop.set_max_value("1.8"); current_prop.set_min_value("-1.8"); current_prop.set_description("The DC current of the selected pole."); current->set_default_properties(current_prop); att_list.push_back(current); // Attribute : Voltage VoltageAttrib *voltage = new VoltageAttrib(); Tango::UserDefaultAttrProp voltage_prop; voltage_prop.set_label("Voltage"); voltage_prop.set_unit("V"); voltage_prop.set_format("%6.4f"); voltage_prop.set_description("The measured voltage of the selected pole."); voltage->set_default_properties(voltage_prop); att_list.push_back(voltage); // Attribute : Impedance ImpedanceAttrib *impedance = new ImpedanceAttrib(); Tango::UserDefaultAttrProp impedance_prop; impedance_prop.set_label("Impedance"); impedance_prop.set_unit("Ohm"); impedance_prop.set_format("%4.2f"); impedance_prop.set_max_alarm("5.0"); impedance_prop.set_min_alarm("2.8"); impedance_prop.set_description("Calculated impedance of the selected pole."); impedance->set_default_properties(impedance_prop); att_list.push_back(impedance); // Attribute : SetCurrentRMS SetCurrentRMSAttrib *set_current_rms = new SetCurrentRMSAttrib(); Tango::UserDefaultAttrProp set_current_rms_prop; set_current_rms_prop.set_label("RMS AC current setpoint/s"); set_current_rms_prop.set_unit("A"); set_current_rms_prop.set_format("%6.4f"); set_current_rms_prop.set_description("Statistic when driven by the Libera.\nRMS value of the AC setpoint applied on the DAC during the last second.\nX=sqr( (sum(setAC)*sum(setAC)) / n - ((sum(setAC)/n) *(sum(setAC)/n)) )"); set_current_rms->set_default_properties(set_current_rms_prop); att_list.push_back(set_current_rms); // Attribute : SetCurrentAverage SetCurrentAverageAttrib *set_current_average = new SetCurrentAverageAttrib(); Tango::UserDefaultAttrProp set_current_average_prop; set_current_average_prop.set_label("Average AC current setpoint/s"); set_current_average_prop.set_unit("A"); set_current_average_prop.set_format("%6.4f"); set_current_average_prop.set_description("Statistic when driven by the Libera.\nThe average AC setpoint applied to the DAC during the last second.\nX=SUM(setAC)/n"); set_current_average->set_default_properties(set_current_average_prop); att_list.push_back(set_current_average); // Attribute : FramesPerSecond FramesPerSecondAttrib *frames_per_second = new FramesPerSecondAttrib(); Tango::UserDefaultAttrProp frames_per_second_prop; frames_per_second_prop.set_label("Frames/s"); frames_per_second_prop.set_unit(" "); frames_per_second_prop.set_format("%3d"); frames_per_second_prop.set_description("Statistic when driven by the Libera.\nThe number of setpoints per second."); frames_per_second->set_default_properties(frames_per_second_prop); att_list.push_back(frames_per_second); // Attribute : ErrorPerSecond ErrorPerSecondAttrib *error_per_second = new ErrorPerSecondAttrib(); Tango::UserDefaultAttrProp error_per_second_prop; error_per_second_prop.set_label("Errors/s"); error_per_second_prop.set_unit(" "); error_per_second_prop.set_format("%3d"); error_per_second_prop.set_description("Statistic when driven by the Libera.\nThe number of errors detected per second."); error_per_second->set_default_properties(error_per_second_prop); att_list.push_back(error_per_second); // Attribute : ErrorCounter ErrorCounterAttrib *error_counter = new ErrorCounterAttrib(); Tango::UserDefaultAttrProp error_counter_prop; error_counter_prop.set_label("Error Counter"); error_counter_prop.set_unit(" "); error_counter_prop.set_format("%6d"); error_counter_prop.set_description("Statistic when driven by the Libera.\nThe total number of errors since the last reset."); error_counter->set_default_properties(error_counter_prop); att_list.push_back(error_counter); // Attribute : LocalControl LocalControlAttrib *local_control = new LocalControlAttrib(); Tango::UserDefaultAttrProp local_control_prop; local_control_prop.set_label("Local Control"); local_control_prop.set_unit(" "); local_control_prop.set_description("If true the AC current can be set on the device,\notherwise it is driven by the Libera."); local_control->set_default_properties(local_control_prop); att_list.push_back(local_control); // Attribute : SetCurrentAC SetCurrentACAttrib *set_current_ac = new SetCurrentACAttrib(); Tango::UserDefaultAttrProp set_current_ac_prop; set_current_ac_prop.set_label("AC Current Setpoint"); set_current_ac_prop.set_unit("A"); set_current_ac_prop.set_format("%5.4f"); set_current_ac_prop.set_max_value("0.2"); set_current_ac_prop.set_min_value("-0.2"); set_current_ac_prop.set_description("The AC current setpoint in local mode. If driven by the Libera, the attribute \nattribute value in INVALID."); set_current_ac->set_default_properties(set_current_ac_prop); att_list.push_back(set_current_ac); // Attribute : Temperature1 Temperature1Attrib *temperature1 = new Temperature1Attrib(); Tango::UserDefaultAttrProp temperature1_prop; temperature1_prop.set_label("Temperature 1"); temperature1_prop.set_unit("C"); temperature1_prop.set_format("%6.0f"); temperature1_prop.set_description("Temperature 1 of the pole."); temperature1->set_default_properties(temperature1_prop); att_list.push_back(temperature1); // Attribute : Temperature2 Temperature2Attrib *temperature2 = new Temperature2Attrib(); Tango::UserDefaultAttrProp temperature2_prop; temperature2_prop.set_label("Temperature 2"); temperature2_prop.set_unit("C"); temperature2_prop.set_format("%6.0f"); temperature2_prop.set_description("Temperature 2 of the pole."); temperature2->set_default_properties(temperature2_prop); att_list.push_back(temperature2); // End of Automatic code generation //------------------------------------------------------------- } //+---------------------------------------------------------------------------- // // method : BiltChClass::get_class_property() // // description : Read the class properties from database. // //----------------------------------------------------------------------------- void BiltChClass::get_class_property() { // Initialize your default values here (if not done with POGO). //------------------------------------------------------------------ // Read class properties from database.(Automatic code generation) //------------------------------------------------------------------ // Call database and extract values //-------------------------------------------- if (Tango::Util::instance()->_UseDb==true) get_db_class()->get_property(cl_prop); Tango::DbDatum def_prop; int i = -1; // End of Automatic code generation //------------------------------------------------------------------ } //+---------------------------------------------------------------------------- // // method : BiltChClass::set_default_property // // description: Set default property (class and device) for wizard. // For each property, add to wizard property name and description // If default value has been set, add it to wizard property and // store it in a DbDatum. // //----------------------------------------------------------------------------- void BiltChClass::set_default_property() { string prop_name; string prop_desc; string prop_def; vector vect_data; // Set Default Class Properties // Set Default Device Properties prop_name = "BiltName"; prop_desc = "Name of the Bilt multi channel power supply device\n"; prop_def = "none"; vect_data.clear(); vect_data.push_back("none"); if (prop_def.length()>0) { Tango::DbDatum data(prop_name); data << vect_data ; dev_def_prop.push_back(data); add_wiz_dev_prop(prop_name, prop_desc, prop_def); } else add_wiz_dev_prop(prop_name, prop_desc); prop_name = "PoleNumber"; prop_desc = "The number of the channel or Pole of the Bilt power supply [0 -2]"; prop_def = "-1"; vect_data.clear(); vect_data.push_back("-1"); if (prop_def.length()>0) { Tango::DbDatum data(prop_name); data << vect_data ; dev_def_prop.push_back(data); add_wiz_dev_prop(prop_name, prop_desc, prop_def); } else add_wiz_dev_prop(prop_name, prop_desc); } //+---------------------------------------------------------------------------- // // method : BiltChClass::write_class_property // // description : Set class description as property in database // //----------------------------------------------------------------------------- void BiltChClass::write_class_property() { // First time, check if database used //-------------------------------------------- if (Tango::Util::_UseDb == false) return; Tango::DbData data; string classname = get_name(); string header; string::size_type start, end; // Put title Tango::DbDatum title("ProjectTitle"); string str_title("BILT channel interface"); title << str_title; data.push_back(title); // Put Description Tango::DbDatum description("Description"); vector str_desc; str_desc.push_back("The Bilt multi channel power supply has three individual channels."); str_desc.push_back("This class offers an interface to an individual channel of the power supply."); description << str_desc; data.push_back(description); // put cvs or svn location string filename(classname); filename += "Class.cpp"; // Create a string with the class ID to // get the string into the binary string class_id(ClassId); // check for cvs information string src_path(CvsPath); start = src_path.find("/"); if (start!=string::npos) { end = src_path.find(filename); if (end>start) { string strloc = src_path.substr(start, end-start); // Check if specific repository start = strloc.find("/cvsroot/"); if (start!=string::npos && start>0) { string repository = strloc.substr(0, start); if (repository.find("/segfs/")!=string::npos) strloc = "ESRF:" + strloc.substr(start, strloc.length()-start); } Tango::DbDatum cvs_loc("cvs_location"); cvs_loc << strloc; data.push_back(cvs_loc); } } // check for svn information else { string src_path(SvnPath); start = src_path.find("://"); if (start!=string::npos) { end = src_path.find(filename); if (end>start) { header = "$HeadURL: "; start = header.length(); string strloc = src_path.substr(start, (end-start)); Tango::DbDatum svn_loc("svn_location"); svn_loc << strloc; data.push_back(svn_loc); } } } // Get CVS or SVN revision tag // CVS tag string tagname(TagName); header = "$Name: "; start = header.length(); string endstr(" $"); end = tagname.find(endstr); if (end!=string::npos && end>start) { string strtag = tagname.substr(start, end-start); Tango::DbDatum cvs_tag("cvs_tag"); cvs_tag << strtag; data.push_back(cvs_tag); } // SVN tag string svnpath(SvnPath); header = "$HeadURL: "; start = header.length(); end = svnpath.find(endstr); if (end!=string::npos && end>start) { string strloc = svnpath.substr(start, end-start); string tagstr ("/tags/"); start = strloc.find(tagstr); if ( start!=string::npos ) { start = start + tagstr.length(); end = strloc.find(filename); string strtag = strloc.substr(start, end-start-1); Tango::DbDatum svn_tag("svn_tag"); svn_tag << strtag; data.push_back(svn_tag); } } // Get URL location string httpServ(HttpServer); if (httpServ.length()>0) { Tango::DbDatum db_doc_url("doc_url"); db_doc_url << httpServ; data.push_back(db_doc_url); } // Put inheritance Tango::DbDatum inher_datum("InheritedFrom"); vector inheritance; inheritance.push_back("Device_4Impl"); inher_datum << inheritance; data.push_back(inher_datum); // Call database and and values //-------------------------------------------- get_db_class()->put_property(data); } } // namespace Node-path: powersupply/itest/BiltCh/trunk/BiltChClass.h Node-kind: file Node-action: change Text-content-length: 8279 Text-content-md5: daa221565e7b8ff15298830b5d296569 Content-length: 8279 //============================================================================= // // file : BiltChClass.h // // description : Include for the BiltChClass root class. // This class is the singleton class for // the BiltCh device class. // It contains all properties and methods which the // BiltCh requires only once e.g. the commands. // // project : TANGO Device Server // // $Author: meyer $ // // $Revision: 1.4 $ // $Date: 2010-11-10 12:02:30 $ // // SVN only: // $HeadURL: $ // // CVS only: // $Source: /segfs/tango/cvsroot/cppserver/machine/powersupply/SrSteerers/tango/BiltCh/BiltChClass.h,v $ // $Log: not supported by cvs2svn $ // Revision 1.3 2010/06/21 07:11:03 meyer // Added two attributes for the temperature measurements. // // Revision 1.2 2010/05/01 16:25:41 meyer // Modified impedance alarm limits. // // Revision 1.1.1.1 2010-02-10 11:49:21 meyer // Imported using TkCVS // // // copyleft : European Synchrotron Radiation Facility // BP 220, Grenoble 38043 // FRANCE // //============================================================================= // // This file is generated by POGO // (Program Obviously used to Generate tango Object) // // (c) - Software Engineering Group - ESRF //============================================================================= #ifndef _BILTCHCLASS_H #define _BILTCHCLASS_H #include #include namespace BiltCh_ns {//===================================== // Define classes for attributes //===================================== class Temperature2Attrib: public Tango::Attr { public: Temperature2Attrib():Attr("Temperature2", Tango::DEV_DOUBLE, Tango::READ) {}; ~Temperature2Attrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_Temperature2(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_Temperature2_allowed(ty);} }; class Temperature1Attrib: public Tango::Attr { public: Temperature1Attrib():Attr("Temperature1", Tango::DEV_DOUBLE, Tango::READ) {}; ~Temperature1Attrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_Temperature1(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_Temperature1_allowed(ty);} }; class SetCurrentACAttrib: public Tango::Attr { public: SetCurrentACAttrib():Attr("SetCurrentAC", Tango::DEV_DOUBLE, Tango::READ_WRITE) {}; ~SetCurrentACAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_SetCurrentAC(att);} virtual void write(Tango::DeviceImpl *dev,Tango::WAttribute &att) {(static_cast(dev))->write_SetCurrentAC(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_SetCurrentAC_allowed(ty);} }; class LocalControlAttrib: public Tango::Attr { public: LocalControlAttrib():Attr("LocalControl", Tango::DEV_BOOLEAN, Tango::READ_WRITE) {}; ~LocalControlAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_LocalControl(att);} virtual void write(Tango::DeviceImpl *dev,Tango::WAttribute &att) {(static_cast(dev))->write_LocalControl(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_LocalControl_allowed(ty);} }; class ErrorCounterAttrib: public Tango::Attr { public: ErrorCounterAttrib():Attr("ErrorCounter", Tango::DEV_ULONG, Tango::READ) {}; ~ErrorCounterAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_ErrorCounter(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_ErrorCounter_allowed(ty);} }; class ErrorPerSecondAttrib: public Tango::Attr { public: ErrorPerSecondAttrib():Attr("ErrorPerSecond", Tango::DEV_ULONG, Tango::READ) {}; ~ErrorPerSecondAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_ErrorPerSecond(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_ErrorPerSecond_allowed(ty);} }; class FramesPerSecondAttrib: public Tango::Attr { public: FramesPerSecondAttrib():Attr("FramesPerSecond", Tango::DEV_ULONG, Tango::READ) {}; ~FramesPerSecondAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_FramesPerSecond(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_FramesPerSecond_allowed(ty);} }; class SetCurrentAverageAttrib: public Tango::Attr { public: SetCurrentAverageAttrib():Attr("SetCurrentAverage", Tango::DEV_DOUBLE, Tango::READ) {}; ~SetCurrentAverageAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_SetCurrentAverage(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_SetCurrentAverage_allowed(ty);} }; class SetCurrentRMSAttrib: public Tango::Attr { public: SetCurrentRMSAttrib():Attr("SetCurrentRMS", Tango::DEV_DOUBLE, Tango::READ) {}; ~SetCurrentRMSAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_SetCurrentRMS(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_SetCurrentRMS_allowed(ty);} }; class ImpedanceAttrib: public Tango::Attr { public: ImpedanceAttrib():Attr("Impedance", Tango::DEV_DOUBLE, Tango::READ) {}; ~ImpedanceAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_Impedance(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_Impedance_allowed(ty);} }; class VoltageAttrib: public Tango::Attr { public: VoltageAttrib():Attr("Voltage", Tango::DEV_DOUBLE, Tango::READ) {}; ~VoltageAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_Voltage(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_Voltage_allowed(ty);} }; class CurrentAttrib: public Tango::Attr { public: CurrentAttrib():Attr("Current", Tango::DEV_DOUBLE, Tango::READ_WRITE) {}; ~CurrentAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_Current(att);} virtual void write(Tango::DeviceImpl *dev,Tango::WAttribute &att) {(static_cast(dev))->write_Current(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_Current_allowed(ty);} }; //========================================= // Define classes for commands //========================================= // // The BiltChClass singleton definition // class #ifdef _TG_WINDOWS_ __declspec(dllexport) #endif BiltChClass : public Tango::DeviceClass { public: // properties member data // add your own data members here //------------------------------------ public: Tango::DbData cl_prop; Tango::DbData cl_def_prop; Tango::DbData dev_def_prop; // Method prototypes static BiltChClass *init(const char *); static BiltChClass *instance(); ~BiltChClass(); Tango::DbDatum get_class_property(string &); Tango::DbDatum get_default_device_property(string &); Tango::DbDatum get_default_class_property(string &); protected: BiltChClass(string &); static BiltChClass *_instance; void command_factory(); void get_class_property(); void attribute_factory(vector &); void write_class_property(); void set_default_property(); string get_cvstag(); string get_cvsroot(); private: void device_factory(const Tango::DevVarStringArray *); }; } // namespace BiltCh_ns #endif // _BILTCHCLASS_H Node-path: powersupply/itest/BiltCh/trunk/BiltChStateMachine.cpp Node-kind: file Node-action: change Text-content-length: 7119 Text-content-md5: 3b3530b7a13d617eabcb7693bf9c24b7 Content-length: 7119 static const char *RcsId = "$Id $"; //+============================================================================= // // file : BiltChStateMachine.cpp // // description : C++ source for the BiltCh and its alowed // methods for commands and attributes // // project : TANGO Device Server // // $Author: meyer $ // // $Revision: 1.4 $ // $Date: 2010-11-10 12:02:30 $ // // SVN only: // $HeadURL: $ // // CVS only: // $Source: /segfs/tango/cvsroot/cppserver/machine/powersupply/SrSteerers/tango/BiltCh/BiltChStateMachine.cpp,v $ // $Log: not supported by cvs2svn $ // Revision 1.3 2010/06/21 07:11:03 meyer // Added two attributes for the temperature measurements. // // Revision 1.2 2010/05/01 16:25:41 meyer // Modified impedance alarm limits. // // Revision 1.1.1.1 2010-02-10 11:49:21 meyer // Imported using TkCVS // // // copyleft : European Synchrotron Radiation Facility // BP 220, Grenoble 38043 // FRANCE // //-============================================================================= // // This file is generated by POGO // (Program Obviously used to Generate tango Object) // // (c) - Software Engineering Group - ESRF //============================================================================= #include #include #include /*==================================================================== * This file contains the methods to allow commands and attributes * read or write execution. * * If you wand to add your own code, add it between * the "End/Re-Start of Generated Code" comments. * * If you want, you can also add your own methods. *==================================================================== */ namespace BiltCh_ns { //================================================= // Attributes Allowed Methods //================================================= //+---------------------------------------------------------------------------- // // method : BiltCh::is_Voltage_allowed // // description : Read/Write allowed for Voltage attribute. // //----------------------------------------------------------------------------- bool BiltCh::is_Voltage_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : BiltCh::is_Impedance_allowed // // description : Read/Write allowed for Impedance attribute. // //----------------------------------------------------------------------------- bool BiltCh::is_Impedance_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : BiltCh::is_SetCurrentRMS_allowed // // description : Read/Write allowed for SetCurrentRMS attribute. // //----------------------------------------------------------------------------- bool BiltCh::is_SetCurrentRMS_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : BiltCh::is_SetCurrentAverage_allowed // // description : Read/Write allowed for SetCurrentAverage attribute. // //----------------------------------------------------------------------------- bool BiltCh::is_SetCurrentAverage_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : BiltCh::is_ErrorCounter_allowed // // description : Read/Write allowed for ErrorCounter attribute. // //----------------------------------------------------------------------------- bool BiltCh::is_ErrorCounter_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : BiltCh::is_LocalControl_allowed // // description : Read/Write allowed for LocalControl attribute. // //----------------------------------------------------------------------------- bool BiltCh::is_LocalControl_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : BiltCh::is_SetCurrentAC_allowed // // description : Read/Write allowed for SetCurrentAC attribute. // //----------------------------------------------------------------------------- bool BiltCh::is_SetCurrentAC_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : BiltCh::is_Current_allowed // // description : Read/Write allowed for Current attribute. // //----------------------------------------------------------------------------- bool BiltCh::is_Current_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : BiltCh::is_FramesPerSecond_allowed // // description : Read/Write allowed for FramesPerSecond attribute. // //----------------------------------------------------------------------------- bool BiltCh::is_FramesPerSecond_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : BiltCh::is_ErrorPerSecond_allowed // // description : Read/Write allowed for ErrorPerSecond attribute. // //----------------------------------------------------------------------------- bool BiltCh::is_ErrorPerSecond_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : BiltCh::is_Temperature1_allowed // // description : Read/Write allowed for Temperature1 attribute. // //----------------------------------------------------------------------------- bool BiltCh::is_Temperature1_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : BiltCh::is_Temperature2_allowed // // description : Read/Write allowed for Temperature2 attribute. // //----------------------------------------------------------------------------- bool BiltCh::is_Temperature2_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //================================================= // Commands Allowed Methods //================================================= } // namespace BiltCh_ns Revision-number: 60 Prop-content-length: 123 Content-length: 123 K 10 svn:author V 5 meyer K 8 svn:date V 27 2010-11-10T12:02:59.000000Z K 7 svn:log V 23 Changed version to 1.5 PROPS-END Node-path: powersupply/itest/BiltCh/trunk/Makefile Node-kind: file Node-action: change Text-content-length: 5320 Text-content-md5: f6a73199cee9678d83f0b8dd4321cc73 Content-length: 5320 #============================================================================= # # file : Makefile # # description : Include for the BiltCh class. # # project : Makefile to generate a Tango server # # $Author: meyer $ # # $Revision: 1.6 $ # # $Log: not supported by cvs2svn $ # Revision 1.5 2010/06/21 07:17:48 meyer # Changed version to 1.4 # # Revision 1.4 2010/05/01 16:26:01 meyer # Changed version to 1.3 # # Revision 1.3 2010/03/19 15:28:01 meyer # Canged to version 1.1 # # Revision 1.2 2010-02-11 16:36:31 meyer # Currents attribute of Bilt understand NaN values now. # # Revision 1.1.1.1 2010-02-10 11:49:21 meyer # Imported using TkCVS # # # copyleft : European Synchrotron Radiation Facility # BP 220, Grenoble 38043 # FRANCE # #============================================================================= # This file is generated by POGO # (Program Obviously used to Generate tango Object) # # (c) - Software Engineering Group - ESRF #============================================================================= # CLASS = BiltCh MAJOR_VERS = 1 MINOR_VERS = 5 RELEASE = Release_$(MAJOR_VERS)_$(MINOR_VERS) OS = $(shell /csadmin/common/scripts/get_os) PROCESSOR = $(shell uname -p) #----------------------------------------- # Set default home directories #----------------------------------------- TANGO_HOME = /segfs/tango/release/$(BIN_DIR) CPP_SERVERS = $(TANGO_HOME)/classes ifdef no_debug DEBUG = -O else DEBUG = -g endif ifdef _solaris CC = CC BIN_DIR=$(OS)_CC AR_SL = $(CC) -mt -G VERS_OPT = -h SL_EXT = so endif ifdef linux CC = c++ CC_SHLIB = $(CC) -fPIC $(PROCESSOR)=1 ifdef x86_64 NBITS=_64 endif BIN_DIR=$(OS)$(NBITS) AR_SL = $(CC) -fPIC -shared SL_EXT = so VERS_OPT = -Wl,-soname, endif INCLUDE_DIRS = -I$(TANGO_HOME)/include -I. \ -I$(CPP_SERVERS)/include OBJS_DIR = obj/$(BIN_DIR) LIB_DIRS = -L $(CPP_SERVERS)/lib \ -L $(TANGO_HOME)/lib \ TARGET_LIB = $(CPP_SERVERS)/lib/libtgclasses.a #----------------------------------------- # Set CXXFLAGS and LFLAGS #----------------------------------------- ifdef _solaris CXXFLAGS = $(DEBUG) -mt -D_PTHREADS $(INCLUDE_DIRS) LFLAGS = $(DEBUG) $(LIB_DIRS) \ -ltango \ -llog4tango \ -lomniORB4 \ -lomniDynamic4 \ -lomnithread \ -lCOS4 \ -lpthread \ -lposix4 -lsocket -lnsl endif ifdef linux CXXFLAGS = -g -D_REENTRANT $(INCLUDE_DIRS) LFLAGS = $(DEBUG) $(LIB_DIRS) \ -ltango \ -llog4tango \ -lomniORB4 \ -lomniDynamic4 \ -lomnithread \ -lCOS4 \ -ldl -lpthread endif #----------------------------------------- # Set dependences #----------------------------------------- SVC_OBJS = $(OBJS_DIR)/$(CLASS).o \ $(OBJS_DIR)/$(CLASS)StateMachine.o \ $(OBJS_DIR)/$(CLASS)Class.o \ $(OBJS_DIR)/ClassFactory.o \ $(OBJS_DIR)/main.o SHLIB_OBJS = $(OBJS_DIR)/$(CLASS)Class.so.o \ $(OBJS_DIR)/$(CLASS)StateMachine.so.o \ $(OBJS_DIR)/$(CLASS).so.o SVC_INC = $(CLASS)Class.h \ $(CLASS).h $(OBJS_DIR)/%.o: %.cpp $(SVC_INC) $(CC) $(CXXFLAGS) -c $< -o $(OBJS_DIR)/$*.o $(OBJS_DIR)/%.so.o: %.cpp $(SVC_INC) $(CC_SHLIB) $(CXXFLAGS) -c $< -o $(OBJS_DIR)/$*.so.o #----------------------------------------- # Make Entry #----------------------------------------- all: $(CLASS) $(CLASS): make_obj_dir make_bin_dir $(SVC_OBJS) $(CC) $(SVC_OBJS) -o $(CLASS) $(LFLAGS) @mv $(CLASS) bin/$(BIN_DIR)/$(CLASS) shlib: make_obj_dir make_shlib_dir $(SHLIB_OBJS) $(AR_SL) -o \ shlib/$(BIN_DIR)/$(CLASS).$(SL_EXT).$(MAJOR_VERS).$(MINOR_VERS) \ $(VERS_OPT)$(CLASS).$(SL_EXT).$(MAJOR_VERS) \ $(SHLIB_OBJS) $(LFLAGS) @rm -f shlib/$(BIN_DIR)/$(CLASS).$(SL_EXT) @cd shlib/$(BIN_DIR); \ ln -s $(CLASS).$(SL_EXT).$(MAJOR_VERS).$(MINOR_VERS) $(CLASS).$(SL_EXT) clean: rm -f $(OBJS_DIR)/*.o \ $(OBJS_DIR)/*.so.o \ bin/$(BIN_DIR)/$(CLASS) \ core make_obj_dir: @mkdir -p obj @mkdir -p obj/$(BIN_DIR) make_bin_dir: @mkdir -p bin @mkdir -p bin/$(BIN_DIR) make_shlib_dir: @mkdir -p shlib @mkdir -p shlib/$(BIN_DIR) #----------------------------------------- # Install binary file #----------------------------------------- install: cp bin/$(BIN_DIR)/$(CLASS) $(CPP_SERVERS)/bin #----------------------------------------- # Update class library and header files # recompile without debug mode. #----------------------------------------- lib: clean @make no_debug=1 cp *.h $(CPP_SERVERS)/include ar ruv $(TARGET_LIB) $(OBJS_DIR)/$(CLASS).o ar ruv $(TARGET_LIB) $(OBJS_DIR)/$(CLASS)Class.o ar ruv $(TARGET_LIB) $(OBJS_DIR)/$(CLASS)StateMachine.o ident $(TARGET_LIB) | grep $(CLASS) #------------------------------------------------------ # Tag the CVS/SVN module corresponding to this class # copy cvs_tag or svn_tag to tag: entry #------------------------------------------------------ #svn_tag: # svn copy ../trunk ../tags/$(RELEASE) # svn commit ../tags/$(RELEASE) \ # -m "Tagging the $(RELEASE) of the $(CLASS) project." # #cvs_tag: # @cvstag "$(CLASS)-$(RELEASE)" # @make $(CLASS) # @make show_tag #show_cvs_tag: # @cvstag -d # # Only these make options work with the current Pogo version 5.3.x! tag: @cvstag "$(CLASS)-$(RELEASE)" @make $(CLASS) @make show_tag show_tag: @cvstag -d Revision-number: 61 Prop-content-length: 149 Content-length: 149 K 8 svn:date V 27 2010-11-10T12:03:00.000000Z K 7 svn:log V 75 This commit was manufactured by cvs2svn to create tag 'BiltCh-Release_1_5'. PROPS-END Node-path: powersupply/itest/BiltCh/tags/BiltCh-Release_1_5 Node-kind: dir Node-action: add Node-copyfrom-rev: 60 Node-copyfrom-path: powersupply/itest/BiltCh/trunk Revision-number: 62 Prop-content-length: 155 Content-length: 155 K 10 svn:author V 5 meyer K 8 svn:date V 27 2010-11-10T14:00:29.000000Z K 7 svn:log V 55 Changed unit of AC RMS and average value from A to mA. PROPS-END Node-path: powersupply/itest/BiltCh/trunk/BiltCh.cpp Node-kind: file Node-action: change Text-content-length: 19979 Text-content-md5: f0194e1feff52d59ff1b766efd5d344b Content-length: 19979 static const char *RcsId = "$Id: BiltCh.cpp,v 1.7 2010-11-10 13:59:39 meyer Exp $"; //+============================================================================= // // file : BiltCh.cpp // // description : C++ source for the BiltCh and its commands. // The class is derived from Device. It represents the // CORBA servant object which will be accessed from the // network. All commands which can be executed on the // BiltCh are implemented in this file. // // project : TANGO Device Server // // $Author: meyer $ // // $Revision: 1.7 $ // // $Revision: 1.7 $ // $Date: 2010-11-10 13:59:39 $ // // SVN only: // $HeadURL: $ // // CVS only: // $Source: /segfs/tango/cvsroot/cppserver/machine/powersupply/SrSteerers/tango/BiltCh/BiltCh.cpp,v $ // $Log: not supported by cvs2svn $ // Revision 1.6 2010-11-10 12:02:30 meyer // Changed type of the Temperature attributes from long to double. // // Revision 1.5 2010/06/21 07:11:03 meyer // Added two attributes for the temperature measurements. // // Revision 1.4 2010/05/01 16:25:41 meyer // Modified impedance alarm limits. // // Revision 1.3 2010-02-12 16:31:49 meyer // Added SetPoleCurrent again. // // Revision 1.2 2010-02-11 16:36:31 meyer // Currents attribute of Bilt understand NaN values now. // // Revision 1.1.1.1 2010-02-10 11:49:21 meyer // Imported using TkCVS // // // copyleft : European Synchrotron Radiation Facility // BP 220, Grenoble 38043 // FRANCE // //-============================================================================= // // This file is generated by POGO // (Program Obviously used to Generate tango Object) // // (c) - Software Engineering Group - ESRF //============================================================================= //=================================================================== // // The following table gives the correspondence // between commands and method name. // // Command name| Method name // ---------------------------------------- // State | dev_state() // Status | dev_status() // //=================================================================== #include #include #include #include namespace BiltCh_ns { //+---------------------------------------------------------------------------- // // method : BiltCh::BiltCh(string &s) // // description : constructor for simulated BiltCh // // in : - cl : Pointer to the DeviceClass object // - s : Device name // //----------------------------------------------------------------------------- BiltCh::BiltCh(Tango::DeviceClass *cl,string &s) :Tango::Device_4Impl(cl,s.c_str()) { init_device(); } BiltCh::BiltCh(Tango::DeviceClass *cl,const char *s) :Tango::Device_4Impl(cl,s) { init_device(); } BiltCh::BiltCh(Tango::DeviceClass *cl,const char *s,const char *d) :Tango::Device_4Impl(cl,s,d) { init_device(); } //+---------------------------------------------------------------------------- // // method : BiltCh::delete_device() // // description : will be called at device destruction or at init command. // //----------------------------------------------------------------------------- void BiltCh::delete_device() { // Delete device allocated objects if ( bilt_obj != NULL ) { delete bilt_obj; } } //+---------------------------------------------------------------------------- // // method : BiltCh::init_device() // // description : will be called at device initialization. // //----------------------------------------------------------------------------- void BiltCh::init_device() { INFO_STREAM << "BiltCh::BiltCh() create device " << device_name << endl; // Initialise variables to default values //-------------------------------------------- get_device_property(); set_state (Tango::UNKNOWN); // open proxy to Bilt power supply try { bilt_obj = new Tango::DeviceProxy(biltName); Tango::DeviceAttribute rattr; Tango::DevState bilt_state; rattr = bilt_obj->read_attribute("State"); rattr >> bilt_state; set_state (bilt_state); bilt_init = true; } catch (Tango::DevFailed &e) { bilt_error = e.errors; bilt_init = false; } } //+---------------------------------------------------------------------------- // // method : BiltCh::get_device_property() // // description : Read the device properties from database. // //----------------------------------------------------------------------------- void BiltCh::get_device_property() { // Initialize your default values here (if not done with POGO). //------------------------------------------------------------------ bilt_obj = NULL; current = 0; voltage = 0; impedance = 0; current_rms = 0; current_average = 0; error_counter = 0; errors_per_sec = 0; frames_per_sec = 0; local_control = false; current_ac = 0; temp1 = 0; temp2 = 0; // Read device properties from database.(Automatic code generation) //------------------------------------------------------------------ Tango::DbData dev_prop; dev_prop.push_back(Tango::DbDatum("BiltName")); dev_prop.push_back(Tango::DbDatum("PoleNumber")); // Call database and extract values //-------------------------------------------- if (Tango::Util::instance()->_UseDb==true) get_db_device()->get_property(dev_prop); Tango::DbDatum def_prop, cl_prop; BiltChClass *ds_class = (static_cast(get_device_class())); int i = -1; // Try to initialize BiltName from class property cl_prop = ds_class->get_class_property(dev_prop[++i].name); if (cl_prop.is_empty()==false) cl_prop >> biltName; else { // Try to initialize BiltName from default device value def_prop = ds_class->get_default_device_property(dev_prop[i].name); if (def_prop.is_empty()==false) def_prop >> biltName; } // And try to extract BiltName value from database if (dev_prop[i].is_empty()==false) dev_prop[i] >> biltName; // Try to initialize PoleNumber from class property cl_prop = ds_class->get_class_property(dev_prop[++i].name); if (cl_prop.is_empty()==false) cl_prop >> poleNumber; else { // Try to initialize PoleNumber from default device value def_prop = ds_class->get_default_device_property(dev_prop[i].name); if (def_prop.is_empty()==false) def_prop >> poleNumber; } // And try to extract PoleNumber value from database if (dev_prop[i].is_empty()==false) dev_prop[i] >> poleNumber; // End of Automatic code generation //------------------------------------------------------------------ } //+---------------------------------------------------------------------------- // // method : BiltCh::always_executed_hook() // // description : method always executed before any command is executed // //----------------------------------------------------------------------------- void BiltCh::always_executed_hook() { } //+---------------------------------------------------------------------------- // // method : BiltCh::read_attr_hardware // // description : Hardware acquisition for attributes. // //----------------------------------------------------------------------------- void BiltCh::read_attr_hardware(vector &attr_list) { DEBUG_STREAM << "BiltCh::read_attr_hardware(vector &attr_list) entering... "<< endl; // Add your own code here if ( bilt_init == false ) { TangoSys_MemStream tms; tms << "Device is not correctly initialised! See the device status for more information." << endl; Tango::Except::throw_exception("ReadError", tms.str(), "Bilt::read_attr_hardware"); } } //+---------------------------------------------------------------------------- // // method : BiltCh::read_Temperature1 // // description : Extract real attribute values for Temperature1 acquisition result. // //----------------------------------------------------------------------------- void BiltCh::read_Temperature1(Tango::Attribute &attr) { DEBUG_STREAM << "BiltCh::read_Temperature1(Tango::Attribute &attr) entering... "<< endl; Tango::DeviceAttribute rattr; vector temps; rattr = bilt_obj->read_attribute("Temperatures"); rattr >> temps; temp1 = temps[poleNumber * 2]; attr.set_value (&temp1); } //+---------------------------------------------------------------------------- // // method : BiltCh::read_Temperature2 // // description : Extract real attribute values for Temperature2 acquisition result. // //----------------------------------------------------------------------------- void BiltCh::read_Temperature2(Tango::Attribute &attr) { DEBUG_STREAM << "BiltCh::read_Temperature2(Tango::Attribute &attr) entering... "<< endl; Tango::DeviceAttribute rattr; vector temps; rattr = bilt_obj->read_attribute("Temperatures"); rattr >> temps; temp2 = temps[(poleNumber * 2) + 1]; attr.set_value (&temp2); } //+---------------------------------------------------------------------------- // // method : BiltCh::read_Current // // description : Extract real attribute values for Current acquisition result. // //----------------------------------------------------------------------------- void BiltCh::read_Current(Tango::Attribute &attr) { DEBUG_STREAM << "BiltCh::read_Current(Tango::Attribute &attr) entering... "<< endl; Tango::DeviceAttribute rattr; vector values; rattr = bilt_obj->read_attribute("Currents"); rattr >> values; Tango::MultiAttribute *attr_list = get_device_attr(); Tango::WAttribute &attr_curr = attr_list->get_w_attr_by_name ("Current"); attr_curr.set_write_value( &(values[POLES + poleNumber]) ); current = values[poleNumber]; attr.set_value (¤t); } //+---------------------------------------------------------------------------- // // method : BiltCh::write_Current // // description : Write Current attribute values to hardware. // //----------------------------------------------------------------------------- void BiltCh::write_Current(Tango::WAttribute &attr) { DEBUG_STREAM << "BiltCh::write_Current(Tango::WAttribute &attr) entering... "<< endl; double set_current; attr.get_write_value(set_current); Tango::DeviceData argin; vector cmd_in; cmd_in.push_back (poleNumber); cmd_in.push_back (set_current); argin << cmd_in; bilt_obj->command_inout("SetPoleCurrent", argin); } //+---------------------------------------------------------------------------- // // method : BiltCh::read_Voltage // // description : Extract real attribute values for Voltage acquisition result. // //----------------------------------------------------------------------------- void BiltCh::read_Voltage(Tango::Attribute &attr) { DEBUG_STREAM << "BiltCh::read_Voltage(Tango::Attribute &attr) entering... "<< endl; Tango::DeviceAttribute rattr; vector values; rattr = bilt_obj->read_attribute("Voltages"); rattr >> values; voltage = values[poleNumber]; attr.set_value (&voltage); } //+---------------------------------------------------------------------------- // // method : BiltCh::read_Impedance // // description : Extract real attribute values for Impedance acquisition result. // //----------------------------------------------------------------------------- void BiltCh::read_Impedance(Tango::Attribute &attr) { DEBUG_STREAM << "BiltCh::read_Impedance(Tango::Attribute &attr) entering... "<< endl; Tango::DeviceAttribute rattr; vector values; rattr = bilt_obj->read_attribute("Impedances"); rattr >> values; impedance = values[poleNumber]; attr.set_value (&impedance); } //+---------------------------------------------------------------------------- // // method : BiltCh::read_SetCurrentRMS // // description : Extract real attribute values for SetCurrentRMS acquisition result. // //----------------------------------------------------------------------------- void BiltCh::read_SetCurrentRMS(Tango::Attribute &attr) { DEBUG_STREAM << "BiltCh::read_SetCurrentRMS(Tango::Attribute &attr) entering... "<< endl; Tango::DeviceAttribute rattr; vector values; rattr = bilt_obj->read_attribute("SetCurrentsRMS"); rattr >> values; current_rms = values[poleNumber]; attr.set_value (¤t_rms); } //+---------------------------------------------------------------------------- // // method : BiltCh::read_SetCurrentAverage // // description : Extract real attribute values for SetCurrentAverage acquisition result. // //----------------------------------------------------------------------------- void BiltCh::read_SetCurrentAverage(Tango::Attribute &attr) { DEBUG_STREAM << "BiltCh::read_SetCurrentAverage(Tango::Attribute &attr) entering... "<< endl; Tango::DeviceAttribute rattr; vector values; rattr = bilt_obj->read_attribute("SetCurrentsAverage"); rattr >> values; current_average = values[poleNumber]; attr.set_value (¤t_average); } //+---------------------------------------------------------------------------- // // method : BiltCh::read_FramesPerSec // // description : Extract real attribute values for FramesPerSec acquisition result. // //----------------------------------------------------------------------------- void BiltCh::read_FramesPerSecond(Tango::Attribute &attr) { DEBUG_STREAM << "BiltCh::read_FramesPerSec(Tango::Attribute &attr) entering... "<< endl; Tango::DeviceAttribute rattr; vector values; rattr = bilt_obj->read_attribute("FramesPerSecond"); rattr >> values; frames_per_sec = values[poleNumber]; attr.set_value (&frames_per_sec); } //+---------------------------------------------------------------------------- // // method : BiltCh::read_ErrorPerSec // // description : Extract real attribute values for ErrorPerSec acquisition result. // //----------------------------------------------------------------------------- void BiltCh::read_ErrorPerSecond(Tango::Attribute &attr) { DEBUG_STREAM << "BiltCh::read_ErrorPerSec(Tango::Attribute &attr) entering... "<< endl; Tango::DeviceAttribute rattr; vector values; rattr = bilt_obj->read_attribute("ErrorsPerSecond"); rattr >> values; errors_per_sec = values[poleNumber]; attr.set_value (&errors_per_sec); } //+---------------------------------------------------------------------------- // // method : BiltCh::read_ErrorCounter // // description : Extract real attribute values for ErrorCounter acquisition result. // //----------------------------------------------------------------------------- void BiltCh::read_ErrorCounter(Tango::Attribute &attr) { DEBUG_STREAM << "BiltCh::read_ErrorCounter(Tango::Attribute &attr) entering... "<< endl; Tango::DeviceAttribute rattr; vector values; rattr = bilt_obj->read_attribute("ErrorCounters"); rattr >> values; error_counter = values[poleNumber]; attr.set_value (&error_counter); } //+---------------------------------------------------------------------------- // // method : BiltCh::read_LocalControl // // description : Extract real attribute values for LocalControl acquisition result. // //----------------------------------------------------------------------------- void BiltCh::read_LocalControl(Tango::Attribute &attr) { DEBUG_STREAM << "BiltCh::read_LocalControl(Tango::Attribute &attr) entering... "<< endl; Tango::DeviceAttribute rattr; vector values; rattr = bilt_obj->read_attribute("LocalControls"); rattr >> values; local_control = values[poleNumber]; attr.set_value (&local_control); } //+---------------------------------------------------------------------------- // // method : BiltCh::write_LocalControl // // description : Write LocalControl attribute values to hardware. // //----------------------------------------------------------------------------- void BiltCh::write_LocalControl(Tango::WAttribute &attr) { DEBUG_STREAM << "BiltCh::write_LocalControl(Tango::WAttribute &attr) entering... "<< endl; bool local_control; attr.get_write_value(local_control); Tango::DeviceData argin; vector cmd_in; cmd_in.push_back (poleNumber); if (local_control == true) cmd_in.push_back (1); else { cmd_in.push_back (0); // set back the AC current setpoint to 0! Tango::DeviceData ac_curr; vector ac_in; ac_in.push_back (poleNumber); ac_in.push_back (0); ac_curr << ac_in; bilt_obj->command_inout("SetPoleAcCurrent", ac_curr); current_ac = 0; } argin << cmd_in; bilt_obj->command_inout("LocalPoleControl", argin); } //+---------------------------------------------------------------------------- // // method : BiltCh::read_SetCurrentAC // // description : Extract real attribute values for SetCurrentAC acquisition result. // //----------------------------------------------------------------------------- void BiltCh::read_SetCurrentAC(Tango::Attribute &attr) { DEBUG_STREAM << "BiltCh::read_SetCurrentAC(Tango::Attribute &attr) entering... "<< endl; if ( local_control == false ) { attr.set_quality (Tango::ATTR_INVALID); } else { attr.set_value (¤t_ac); } } //+---------------------------------------------------------------------------- // // method : BiltCh::write_SetCurrentAC // // description : Write SetCurrentAC attribute values to hardware. // //----------------------------------------------------------------------------- void BiltCh::write_SetCurrentAC(Tango::WAttribute &attr) { DEBUG_STREAM << "BiltCh::write_SetCurrentAC(Tango::WAttribute &attr) entering... "<< endl; if ( local_control == false ) { TangoSys_MemStream tms; tms << "Can set AC current only when local control enabled!" << endl; Tango::Except::throw_exception("WriteError", tms.str(), "Bilt::write_SetCurrentAC"); } double set_current; attr.get_write_value(set_current); Tango::DeviceData argin; vector cmd_in; cmd_in.push_back (poleNumber); cmd_in.push_back (set_current); argin << cmd_in; bilt_obj->command_inout("SetPoleAcCurrent", argin); current_ac = set_current; } //+------------------------------------------------------------------ /** * method: BiltCh::dev_state * * description: method to execute "State" * This command gets the device state (stored in its device_state data member) and returns it to the caller. * * @return State Code * */ //+------------------------------------------------------------------ Tango::DevState BiltCh::dev_state() { Tango::DevState argout = DeviceImpl::dev_state(); DEBUG_STREAM << "BiltCh::dev_state(): entering... !" << endl; // Add your own code to control device here if ( bilt_init == true ) { Tango::DeviceAttribute rattr; Tango::DevState bilt_state; rattr = bilt_obj->read_attribute("State"); rattr >> bilt_state; set_state (bilt_state); } return get_state(); } //+------------------------------------------------------------------ /** * method: BiltCh::dev_status * * description: method to execute "Status" * This command gets the device status (stored in its device_status data member) and returns it to the caller. * * @return Status description * */ //+------------------------------------------------------------------ Tango::ConstDevString BiltCh::dev_status() { //Tango::ConstDevString argout = DeviceImpl::dev_status(); DEBUG_STREAM << "BiltCh::dev_status(): entering... !" << endl; // Add your own code to control device here string bilt_status; if ( bilt_init == true ) { Tango::DeviceAttribute rattr; rattr = bilt_obj->read_attribute("Status"); rattr >> bilt_status; set_status (bilt_status); } else { bilt_status = "Error during initialisation: \n"; for (short i = 0; i //using namespace Tango; /** * @author $Author: meyer $ * @version $Revision: 1.5 $ */ // Add your own constant definitions here. //----------------------------------------------- // Number of poles per magnet #define POLES 3 namespace BiltCh_ns { /** * Class Description: * The Bilt multi channel power supply has three individual channels. * This class offers an interface to an individual channel of the power supply. */ /* * Device States Description: * Tango::ON : Magnet is ON, all three channels are ON. * Tango::OFF : Magnet is OFF, all three channels are OFF. * Tango::FAULT : Error detected by the BILT magnet. * Tango::ALARM : Alarm detected on one or more channels. * Tango::UNKNOWN : Communication fault */ class BiltCh: public Tango::Device_4Impl { public : // Add your own data members here //----------------------------------------- // Here is the Start of the automatic code generation part //------------------------------------------------------------- /** * @name attributes * Attribute member data. */ //@{ Tango::DevDouble *attr_Current_read; Tango::DevDouble attr_Current_write; Tango::DevDouble *attr_Voltage_read; Tango::DevDouble *attr_Impedance_read; Tango::DevDouble *attr_SetCurrentRMS_read; Tango::DevDouble *attr_SetCurrentAverage_read; Tango::DevULong *attr_FramesPerSecond_read; Tango::DevULong *attr_ErrorPerSecond_read; Tango::DevULong *attr_ErrorCounter_read; Tango::DevBoolean *attr_LocalControl_read; Tango::DevBoolean attr_LocalControl_write; Tango::DevDouble *attr_SetCurrentAC_read; Tango::DevDouble attr_SetCurrentAC_write; Tango::DevDouble *attr_Temperature1_read; Tango::DevDouble *attr_Temperature2_read; //@} /** * @name Device properties * Device properties member data. */ //@{ /** * Name of the Bilt multi channel power supply device * */ string biltName; /** * The number of the channel or Pole of the Bilt power supply [0 -2] */ Tango::DevShort poleNumber; //@} /** * @name Device properties * Device property member data. */ //@{ //@} /**@name Constructors * Miscellaneous constructors */ //@{ /** * Constructs a newly allocated Command object. * * @param cl Class. * @param s Device Name */ BiltCh(Tango::DeviceClass *cl,string &s); /** * Constructs a newly allocated Command object. * * @param cl Class. * @param s Device Name */ BiltCh(Tango::DeviceClass *cl,const char *s); /** * Constructs a newly allocated Command object. * * @param cl Class. * @param s Device name * @param d Device description. */ BiltCh(Tango::DeviceClass *cl,const char *s,const char *d); //@} /**@name Destructor * Only one destructor is defined for this class */ //@{ /** * The object destructor. */ ~BiltCh() {delete_device();}; /** * will be called at device destruction or at init command. */ void delete_device(); //@} /**@name Miscellaneous methods */ //@{ /** * Initialize the device */ virtual void init_device(); /** * Always executed method before execution command method. */ virtual void always_executed_hook(); //@} /** * @name BiltCh methods prototypes */ //@{ /** * Hardware acquisition for attributes. */ virtual void read_attr_hardware(vector &attr_list); /** * Extract real attribute values for Current acquisition result. */ virtual void read_Current(Tango::Attribute &attr); /** * Write Current attribute values to hardware. */ virtual void write_Current(Tango::WAttribute &attr); /** * Extract real attribute values for Voltage acquisition result. */ virtual void read_Voltage(Tango::Attribute &attr); /** * Extract real attribute values for Impedance acquisition result. */ virtual void read_Impedance(Tango::Attribute &attr); /** * Extract real attribute values for SetCurrentRMS acquisition result. */ virtual void read_SetCurrentRMS(Tango::Attribute &attr); /** * Extract real attribute values for SetCurrentAverage acquisition result. */ virtual void read_SetCurrentAverage(Tango::Attribute &attr); /** * Extract real attribute values for FramesPerSecond acquisition result. */ virtual void read_FramesPerSecond(Tango::Attribute &attr); /** * Extract real attribute values for ErrorPerSecond acquisition result. */ virtual void read_ErrorPerSecond(Tango::Attribute &attr); /** * Extract real attribute values for ErrorCounter acquisition result. */ virtual void read_ErrorCounter(Tango::Attribute &attr); /** * Extract real attribute values for LocalControl acquisition result. */ virtual void read_LocalControl(Tango::Attribute &attr); /** * Write LocalControl attribute values to hardware. */ virtual void write_LocalControl(Tango::WAttribute &attr); /** * Extract real attribute values for SetCurrentAC acquisition result. */ virtual void read_SetCurrentAC(Tango::Attribute &attr); /** * Write SetCurrentAC attribute values to hardware. */ virtual void write_SetCurrentAC(Tango::WAttribute &attr); /** * Extract real attribute values for Temperature1 acquisition result. */ virtual void read_Temperature1(Tango::Attribute &attr); /** * Extract real attribute values for Temperature2 acquisition result. */ virtual void read_Temperature2(Tango::Attribute &attr); /** * Read/Write allowed for Current attribute. */ virtual bool is_Current_allowed(Tango::AttReqType type); /** * Read/Write allowed for Voltage attribute. */ virtual bool is_Voltage_allowed(Tango::AttReqType type); /** * Read/Write allowed for Impedance attribute. */ virtual bool is_Impedance_allowed(Tango::AttReqType type); /** * Read/Write allowed for SetCurrentRMS attribute. */ virtual bool is_SetCurrentRMS_allowed(Tango::AttReqType type); /** * Read/Write allowed for SetCurrentAverage attribute. */ virtual bool is_SetCurrentAverage_allowed(Tango::AttReqType type); /** * Read/Write allowed for FramesPerSecond attribute. */ virtual bool is_FramesPerSecond_allowed(Tango::AttReqType type); /** * Read/Write allowed for ErrorPerSecond attribute. */ virtual bool is_ErrorPerSecond_allowed(Tango::AttReqType type); /** * Read/Write allowed for ErrorCounter attribute. */ virtual bool is_ErrorCounter_allowed(Tango::AttReqType type); /** * Read/Write allowed for LocalControl attribute. */ virtual bool is_LocalControl_allowed(Tango::AttReqType type); /** * Read/Write allowed for SetCurrentAC attribute. */ virtual bool is_SetCurrentAC_allowed(Tango::AttReqType type); /** * Read/Write allowed for Temperature1 attribute. */ virtual bool is_Temperature1_allowed(Tango::AttReqType type); /** * Read/Write allowed for Temperature2 attribute. */ virtual bool is_Temperature2_allowed(Tango::AttReqType type); /** * This command gets the device state (stored in its device_state data member) and returns it to the caller. * @return State Code * @exception DevFailed */ virtual Tango::DevState dev_state(); /** * This command gets the device status (stored in its device_status data member) and returns it to the caller. * @return Status description * @exception DevFailed */ virtual Tango::ConstDevString dev_status(); /** * Read the device properties from database */ void get_device_property(); //@} // Here is the end of the automatic code generation part //------------------------------------------------------------- protected : // Add your own data members here //----------------------------------------- Tango::DeviceProxy *bilt_obj; Tango::DevErrorList bilt_error; bool bilt_init; double current; double voltage; double impedance; double current_rms; double current_average; Tango::DevULong error_counter; Tango::DevULong errors_per_sec; Tango::DevULong frames_per_sec; bool local_control; double current_ac; double temp1; double temp2; }; } // namespace_ns #endif // _BILTCH_H Node-path: powersupply/itest/BiltCh/trunk/BiltChClass.cpp Node-kind: file Node-action: change Text-content-length: 19900 Text-content-md5: e8ced008fd1b0329a5bad4a8ce396e99 Content-length: 19900 static const char *ClassId = "$Id: BiltChClass.cpp,v 1.6 2010-11-10 13:59:39 meyer Exp $"; static const char *TagName = "$Name: not supported by cvs2svn $"; static const char *CvsPath = "$Source: /segfs/tango/cvsroot/cppserver/machine/powersupply/SrSteerers/tango/BiltCh/BiltChClass.cpp,v $"; static const char *SvnPath = "$HeadURL: $"; static const char *HttpServer = "http://www.esrf.fr/computing/cs/tango/tango_doc/ds_doc/"; //+============================================================================= // // file : BiltChClass.cpp // // description : C++ source for the BiltChClass. A singleton // class derived from DeviceClass. It implements the // command list and all properties and methods required // by the BiltCh once per process. // // project : TANGO Device Server // // $Author: meyer $ // // $Revision: 1.6 $ // // $Log: not supported by cvs2svn $ // Revision 1.5 2010-11-10 12:02:30 meyer // Changed type of the Temperature attributes from long to double. // // Revision 1.4 2010/06/21 07:11:03 meyer // Added two attributes for the temperature measurements. // // Revision 1.3 2010/05/01 16:25:41 meyer // Modified impedance alarm limits. // // Revision 1.2 2010-02-10 16:22:40 meyer // Release_1_0 // // Revision 1.1.1.1 2010-02-10 11:49:21 meyer // Imported using TkCVS // // // copyleft : European Synchrotron Radiation Facility // BP 220, Grenoble 38043 // FRANCE // //-============================================================================= // // This file is generated by POGO // (Program Obviously used to Generate tango Object) // // (c) - Software Engineering Group - ESRF //============================================================================= #include #include #include //+---------------------------------------------------------------------------- /** * Create BiltChClass singleton and return it in a C function for Python usage */ //+---------------------------------------------------------------------------- extern "C" { #ifdef WIN32 __declspec(dllexport) #endif Tango::DeviceClass *_create_BiltCh_class(const char *name) { return BiltCh_ns::BiltChClass::init(name); } } namespace BiltCh_ns { // //---------------------------------------------------------------- // Initialize pointer for singleton pattern //---------------------------------------------------------------- // BiltChClass *BiltChClass::_instance = NULL; //+---------------------------------------------------------------------------- // // method : BiltChClass::BiltChClass(string &s) // // description : constructor for the BiltChClass // // in : - s : The class name // //----------------------------------------------------------------------------- BiltChClass::BiltChClass(string &s):DeviceClass(s) { cout2 << "Entering BiltChClass constructor" << endl; set_default_property(); get_class_property(); write_class_property(); cout2 << "Leaving BiltChClass constructor" << endl; } //+---------------------------------------------------------------------------- // // method : BiltChClass::~BiltChClass() // // description : destructor for the BiltChClass // //----------------------------------------------------------------------------- BiltChClass::~BiltChClass() { _instance = NULL; } //+---------------------------------------------------------------------------- // // method : BiltChClass::instance // // description : Create the object if not already done. Otherwise, just // return a pointer to the object // // in : - name : The class name // //----------------------------------------------------------------------------- BiltChClass *BiltChClass::init(const char *name) { if (_instance == NULL) { try { string s(name); _instance = new BiltChClass(s); } catch (bad_alloc) { throw; } } return _instance; } BiltChClass *BiltChClass::instance() { if (_instance == NULL) { cerr << "Class is not initialised !!" << endl; exit(-1); } return _instance; } //+---------------------------------------------------------------------------- // // method : BiltChClass::command_factory // // description : Create the command object(s) and store them in the // command list // //----------------------------------------------------------------------------- void BiltChClass::command_factory() { // add polling if any for (unsigned int i=0 ; ilength() ; i++) { cout4 << "Device name : " << (*devlist_ptr)[i].in() << endl; // Create devices and add it into the device list //---------------------------------------------------- device_list.push_back(new BiltCh(this, (*devlist_ptr)[i])); // Export device to the outside world // Check before if database used. //--------------------------------------------- if ((Tango::Util::_UseDb == true) && (Tango::Util::_FileDb == false)) export_device(device_list.back()); else export_device(device_list.back(), (*devlist_ptr)[i]); } // End of Automatic code generation //------------------------------------------------------------- } //+---------------------------------------------------------------------------- // Method: BiltChClass::attribute_factory(vector &att_list) //----------------------------------------------------------------------------- void BiltChClass::attribute_factory(vector &att_list) { // Attribute : Current CurrentAttrib *current = new CurrentAttrib(); Tango::UserDefaultAttrProp current_prop; current_prop.set_label("DC Current"); current_prop.set_unit("A"); current_prop.set_format("%6.4f"); current_prop.set_max_value("1.8"); current_prop.set_min_value("-1.8"); current_prop.set_description("The DC current of the selected pole."); current->set_default_properties(current_prop); att_list.push_back(current); // Attribute : Voltage VoltageAttrib *voltage = new VoltageAttrib(); Tango::UserDefaultAttrProp voltage_prop; voltage_prop.set_label("Voltage"); voltage_prop.set_unit("V"); voltage_prop.set_format("%6.4f"); voltage_prop.set_description("The measured voltage of the selected pole."); voltage->set_default_properties(voltage_prop); att_list.push_back(voltage); // Attribute : Impedance ImpedanceAttrib *impedance = new ImpedanceAttrib(); Tango::UserDefaultAttrProp impedance_prop; impedance_prop.set_label("Impedance"); impedance_prop.set_unit("Ohm"); impedance_prop.set_format("%4.2f"); impedance_prop.set_max_alarm("5.0"); impedance_prop.set_min_alarm("2.8"); impedance_prop.set_description("Calculated impedance of the selected pole."); impedance->set_default_properties(impedance_prop); att_list.push_back(impedance); // Attribute : SetCurrentRMS SetCurrentRMSAttrib *set_current_rms = new SetCurrentRMSAttrib(); Tango::UserDefaultAttrProp set_current_rms_prop; set_current_rms_prop.set_label("RMS AC current setpoint/s"); set_current_rms_prop.set_unit("mA"); set_current_rms_prop.set_format("%6.3f"); set_current_rms_prop.set_description("Statistic when driven by the Libera.\nRMS value of the AC setpoint applied on the DAC during the last second.\nX=sqr( (sum(setAC)*sum(setAC)) / n - ((sum(setAC)/n) *(sum(setAC)/n)) )"); set_current_rms->set_default_properties(set_current_rms_prop); att_list.push_back(set_current_rms); // Attribute : SetCurrentAverage SetCurrentAverageAttrib *set_current_average = new SetCurrentAverageAttrib(); Tango::UserDefaultAttrProp set_current_average_prop; set_current_average_prop.set_label("Average AC current setpoint/s"); set_current_average_prop.set_unit("mA"); set_current_average_prop.set_format("%6.3f"); set_current_average_prop.set_description("Statistic when driven by the Libera.\nThe average AC setpoint applied to the DAC during the last second.\nX=SUM(setAC)/n"); set_current_average->set_default_properties(set_current_average_prop); att_list.push_back(set_current_average); // Attribute : FramesPerSecond FramesPerSecondAttrib *frames_per_second = new FramesPerSecondAttrib(); Tango::UserDefaultAttrProp frames_per_second_prop; frames_per_second_prop.set_label("Frames/s"); frames_per_second_prop.set_unit(" "); frames_per_second_prop.set_format("%3d"); frames_per_second_prop.set_description("Statistic when driven by the Libera.\nThe number of setpoints per second."); frames_per_second->set_default_properties(frames_per_second_prop); att_list.push_back(frames_per_second); // Attribute : ErrorPerSecond ErrorPerSecondAttrib *error_per_second = new ErrorPerSecondAttrib(); Tango::UserDefaultAttrProp error_per_second_prop; error_per_second_prop.set_label("Errors/s"); error_per_second_prop.set_unit(" "); error_per_second_prop.set_format("%3d"); error_per_second_prop.set_description("Statistic when driven by the Libera.\nThe number of errors detected per second."); error_per_second->set_default_properties(error_per_second_prop); att_list.push_back(error_per_second); // Attribute : ErrorCounter ErrorCounterAttrib *error_counter = new ErrorCounterAttrib(); Tango::UserDefaultAttrProp error_counter_prop; error_counter_prop.set_label("Error Counter"); error_counter_prop.set_unit(" "); error_counter_prop.set_format("%6d"); error_counter_prop.set_description("Statistic when driven by the Libera.\nThe total number of errors since the last reset."); error_counter->set_default_properties(error_counter_prop); att_list.push_back(error_counter); // Attribute : LocalControl LocalControlAttrib *local_control = new LocalControlAttrib(); Tango::UserDefaultAttrProp local_control_prop; local_control_prop.set_label("Local Control"); local_control_prop.set_unit(" "); local_control_prop.set_description("If true the AC current can be set on the device,\notherwise it is driven by the Libera."); local_control->set_default_properties(local_control_prop); att_list.push_back(local_control); // Attribute : SetCurrentAC SetCurrentACAttrib *set_current_ac = new SetCurrentACAttrib(); Tango::UserDefaultAttrProp set_current_ac_prop; set_current_ac_prop.set_label("AC Current Setpoint"); set_current_ac_prop.set_unit("A"); set_current_ac_prop.set_format("%5.4f"); set_current_ac_prop.set_max_value("0.2"); set_current_ac_prop.set_min_value("-0.2"); set_current_ac_prop.set_description("The AC current setpoint in local mode. If driven by the Libera, the attribute \nattribute value in INVALID."); set_current_ac->set_default_properties(set_current_ac_prop); att_list.push_back(set_current_ac); // Attribute : Temperature1 Temperature1Attrib *temperature1 = new Temperature1Attrib(); Tango::UserDefaultAttrProp temperature1_prop; temperature1_prop.set_label("Temperature 1"); temperature1_prop.set_unit("C"); temperature1_prop.set_format("%6.0f"); temperature1_prop.set_description("Temperature 1 of the pole."); temperature1->set_default_properties(temperature1_prop); att_list.push_back(temperature1); // Attribute : Temperature2 Temperature2Attrib *temperature2 = new Temperature2Attrib(); Tango::UserDefaultAttrProp temperature2_prop; temperature2_prop.set_label("Temperature 2"); temperature2_prop.set_unit("C"); temperature2_prop.set_format("%6.0f"); temperature2_prop.set_description("Temperature 2 of the pole."); temperature2->set_default_properties(temperature2_prop); att_list.push_back(temperature2); // End of Automatic code generation //------------------------------------------------------------- } //+---------------------------------------------------------------------------- // // method : BiltChClass::get_class_property() // // description : Read the class properties from database. // //----------------------------------------------------------------------------- void BiltChClass::get_class_property() { // Initialize your default values here (if not done with POGO). //------------------------------------------------------------------ // Read class properties from database.(Automatic code generation) //------------------------------------------------------------------ // Call database and extract values //-------------------------------------------- if (Tango::Util::instance()->_UseDb==true) get_db_class()->get_property(cl_prop); Tango::DbDatum def_prop; int i = -1; // End of Automatic code generation //------------------------------------------------------------------ } //+---------------------------------------------------------------------------- // // method : BiltChClass::set_default_property // // description: Set default property (class and device) for wizard. // For each property, add to wizard property name and description // If default value has been set, add it to wizard property and // store it in a DbDatum. // //----------------------------------------------------------------------------- void BiltChClass::set_default_property() { string prop_name; string prop_desc; string prop_def; vector vect_data; // Set Default Class Properties // Set Default Device Properties prop_name = "BiltName"; prop_desc = "Name of the Bilt multi channel power supply device\n"; prop_def = "none"; vect_data.clear(); vect_data.push_back("none"); if (prop_def.length()>0) { Tango::DbDatum data(prop_name); data << vect_data ; dev_def_prop.push_back(data); add_wiz_dev_prop(prop_name, prop_desc, prop_def); } else add_wiz_dev_prop(prop_name, prop_desc); prop_name = "PoleNumber"; prop_desc = "The number of the channel or Pole of the Bilt power supply [0 -2]"; prop_def = "-1"; vect_data.clear(); vect_data.push_back("-1"); if (prop_def.length()>0) { Tango::DbDatum data(prop_name); data << vect_data ; dev_def_prop.push_back(data); add_wiz_dev_prop(prop_name, prop_desc, prop_def); } else add_wiz_dev_prop(prop_name, prop_desc); } //+---------------------------------------------------------------------------- // // method : BiltChClass::write_class_property // // description : Set class description as property in database // //----------------------------------------------------------------------------- void BiltChClass::write_class_property() { // First time, check if database used //-------------------------------------------- if (Tango::Util::_UseDb == false) return; Tango::DbData data; string classname = get_name(); string header; string::size_type start, end; // Put title Tango::DbDatum title("ProjectTitle"); string str_title("BILT channel interface"); title << str_title; data.push_back(title); // Put Description Tango::DbDatum description("Description"); vector str_desc; str_desc.push_back("The Bilt multi channel power supply has three individual channels."); str_desc.push_back("This class offers an interface to an individual channel of the power supply."); description << str_desc; data.push_back(description); // put cvs or svn location string filename(classname); filename += "Class.cpp"; // Create a string with the class ID to // get the string into the binary string class_id(ClassId); // check for cvs information string src_path(CvsPath); start = src_path.find("/"); if (start!=string::npos) { end = src_path.find(filename); if (end>start) { string strloc = src_path.substr(start, end-start); // Check if specific repository start = strloc.find("/cvsroot/"); if (start!=string::npos && start>0) { string repository = strloc.substr(0, start); if (repository.find("/segfs/")!=string::npos) strloc = "ESRF:" + strloc.substr(start, strloc.length()-start); } Tango::DbDatum cvs_loc("cvs_location"); cvs_loc << strloc; data.push_back(cvs_loc); } } // check for svn information else { string src_path(SvnPath); start = src_path.find("://"); if (start!=string::npos) { end = src_path.find(filename); if (end>start) { header = "$HeadURL: "; start = header.length(); string strloc = src_path.substr(start, (end-start)); Tango::DbDatum svn_loc("svn_location"); svn_loc << strloc; data.push_back(svn_loc); } } } // Get CVS or SVN revision tag // CVS tag string tagname(TagName); header = "$Name: "; start = header.length(); string endstr(" $"); end = tagname.find(endstr); if (end!=string::npos && end>start) { string strtag = tagname.substr(start, end-start); Tango::DbDatum cvs_tag("cvs_tag"); cvs_tag << strtag; data.push_back(cvs_tag); } // SVN tag string svnpath(SvnPath); header = "$HeadURL: "; start = header.length(); end = svnpath.find(endstr); if (end!=string::npos && end>start) { string strloc = svnpath.substr(start, end-start); string tagstr ("/tags/"); start = strloc.find(tagstr); if ( start!=string::npos ) { start = start + tagstr.length(); end = strloc.find(filename); string strtag = strloc.substr(start, end-start-1); Tango::DbDatum svn_tag("svn_tag"); svn_tag << strtag; data.push_back(svn_tag); } } // Get URL location string httpServ(HttpServer); if (httpServ.length()>0) { Tango::DbDatum db_doc_url("doc_url"); db_doc_url << httpServ; data.push_back(db_doc_url); } // Put inheritance Tango::DbDatum inher_datum("InheritedFrom"); vector inheritance; inheritance.push_back("Device_4Impl"); inher_datum << inheritance; data.push_back(inher_datum); // Call database and and values //-------------------------------------------- get_db_class()->put_property(data); } } // namespace Node-path: powersupply/itest/BiltCh/trunk/BiltChClass.h Node-kind: file Node-action: change Text-content-length: 8393 Text-content-md5: e9319c29bbcf83c9f357a1b0bb2e90a0 Content-length: 8393 //============================================================================= // // file : BiltChClass.h // // description : Include for the BiltChClass root class. // This class is the singleton class for // the BiltCh device class. // It contains all properties and methods which the // BiltCh requires only once e.g. the commands. // // project : TANGO Device Server // // $Author: meyer $ // // $Revision: 1.5 $ // $Date: 2010-11-10 13:59:39 $ // // SVN only: // $HeadURL: $ // // CVS only: // $Source: /segfs/tango/cvsroot/cppserver/machine/powersupply/SrSteerers/tango/BiltCh/BiltChClass.h,v $ // $Log: not supported by cvs2svn $ // Revision 1.4 2010-11-10 12:02:30 meyer // Changed type of the Temperature attributes from long to double. // // Revision 1.3 2010/06/21 07:11:03 meyer // Added two attributes for the temperature measurements. // // Revision 1.2 2010/05/01 16:25:41 meyer // Modified impedance alarm limits. // // Revision 1.1.1.1 2010-02-10 11:49:21 meyer // Imported using TkCVS // // // copyleft : European Synchrotron Radiation Facility // BP 220, Grenoble 38043 // FRANCE // //============================================================================= // // This file is generated by POGO // (Program Obviously used to Generate tango Object) // // (c) - Software Engineering Group - ESRF //============================================================================= #ifndef _BILTCHCLASS_H #define _BILTCHCLASS_H #include #include namespace BiltCh_ns {//===================================== // Define classes for attributes //===================================== class Temperature2Attrib: public Tango::Attr { public: Temperature2Attrib():Attr("Temperature2", Tango::DEV_DOUBLE, Tango::READ) {}; ~Temperature2Attrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_Temperature2(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_Temperature2_allowed(ty);} }; class Temperature1Attrib: public Tango::Attr { public: Temperature1Attrib():Attr("Temperature1", Tango::DEV_DOUBLE, Tango::READ) {}; ~Temperature1Attrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_Temperature1(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_Temperature1_allowed(ty);} }; class SetCurrentACAttrib: public Tango::Attr { public: SetCurrentACAttrib():Attr("SetCurrentAC", Tango::DEV_DOUBLE, Tango::READ_WRITE) {}; ~SetCurrentACAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_SetCurrentAC(att);} virtual void write(Tango::DeviceImpl *dev,Tango::WAttribute &att) {(static_cast(dev))->write_SetCurrentAC(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_SetCurrentAC_allowed(ty);} }; class LocalControlAttrib: public Tango::Attr { public: LocalControlAttrib():Attr("LocalControl", Tango::DEV_BOOLEAN, Tango::READ_WRITE) {}; ~LocalControlAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_LocalControl(att);} virtual void write(Tango::DeviceImpl *dev,Tango::WAttribute &att) {(static_cast(dev))->write_LocalControl(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_LocalControl_allowed(ty);} }; class ErrorCounterAttrib: public Tango::Attr { public: ErrorCounterAttrib():Attr("ErrorCounter", Tango::DEV_ULONG, Tango::READ) {}; ~ErrorCounterAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_ErrorCounter(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_ErrorCounter_allowed(ty);} }; class ErrorPerSecondAttrib: public Tango::Attr { public: ErrorPerSecondAttrib():Attr("ErrorPerSecond", Tango::DEV_ULONG, Tango::READ) {}; ~ErrorPerSecondAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_ErrorPerSecond(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_ErrorPerSecond_allowed(ty);} }; class FramesPerSecondAttrib: public Tango::Attr { public: FramesPerSecondAttrib():Attr("FramesPerSecond", Tango::DEV_ULONG, Tango::READ) {}; ~FramesPerSecondAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_FramesPerSecond(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_FramesPerSecond_allowed(ty);} }; class SetCurrentAverageAttrib: public Tango::Attr { public: SetCurrentAverageAttrib():Attr("SetCurrentAverage", Tango::DEV_DOUBLE, Tango::READ) {}; ~SetCurrentAverageAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_SetCurrentAverage(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_SetCurrentAverage_allowed(ty);} }; class SetCurrentRMSAttrib: public Tango::Attr { public: SetCurrentRMSAttrib():Attr("SetCurrentRMS", Tango::DEV_DOUBLE, Tango::READ) {}; ~SetCurrentRMSAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_SetCurrentRMS(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_SetCurrentRMS_allowed(ty);} }; class ImpedanceAttrib: public Tango::Attr { public: ImpedanceAttrib():Attr("Impedance", Tango::DEV_DOUBLE, Tango::READ) {}; ~ImpedanceAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_Impedance(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_Impedance_allowed(ty);} }; class VoltageAttrib: public Tango::Attr { public: VoltageAttrib():Attr("Voltage", Tango::DEV_DOUBLE, Tango::READ) {}; ~VoltageAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_Voltage(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_Voltage_allowed(ty);} }; class CurrentAttrib: public Tango::Attr { public: CurrentAttrib():Attr("Current", Tango::DEV_DOUBLE, Tango::READ_WRITE) {}; ~CurrentAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_Current(att);} virtual void write(Tango::DeviceImpl *dev,Tango::WAttribute &att) {(static_cast(dev))->write_Current(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_Current_allowed(ty);} }; //========================================= // Define classes for commands //========================================= // // The BiltChClass singleton definition // class #ifdef _TG_WINDOWS_ __declspec(dllexport) #endif BiltChClass : public Tango::DeviceClass { public: // properties member data // add your own data members here //------------------------------------ public: Tango::DbData cl_prop; Tango::DbData cl_def_prop; Tango::DbData dev_def_prop; // Method prototypes static BiltChClass *init(const char *); static BiltChClass *instance(); ~BiltChClass(); Tango::DbDatum get_class_property(string &); Tango::DbDatum get_default_device_property(string &); Tango::DbDatum get_default_class_property(string &); protected: BiltChClass(string &); static BiltChClass *_instance; void command_factory(); void get_class_property(); void attribute_factory(vector &); void write_class_property(); void set_default_property(); string get_cvstag(); string get_cvsroot(); private: void device_factory(const Tango::DevVarStringArray *); }; } // namespace BiltCh_ns #endif // _BILTCHCLASS_H Node-path: powersupply/itest/BiltCh/trunk/BiltChStateMachine.cpp Node-kind: file Node-action: change Text-content-length: 7233 Text-content-md5: 266a5edc57b9162087717f5df42527aa Content-length: 7233 static const char *RcsId = "$Id $"; //+============================================================================= // // file : BiltChStateMachine.cpp // // description : C++ source for the BiltCh and its alowed // methods for commands and attributes // // project : TANGO Device Server // // $Author: meyer $ // // $Revision: 1.5 $ // $Date: 2010-11-10 13:59:39 $ // // SVN only: // $HeadURL: $ // // CVS only: // $Source: /segfs/tango/cvsroot/cppserver/machine/powersupply/SrSteerers/tango/BiltCh/BiltChStateMachine.cpp,v $ // $Log: not supported by cvs2svn $ // Revision 1.4 2010-11-10 12:02:30 meyer // Changed type of the Temperature attributes from long to double. // // Revision 1.3 2010/06/21 07:11:03 meyer // Added two attributes for the temperature measurements. // // Revision 1.2 2010/05/01 16:25:41 meyer // Modified impedance alarm limits. // // Revision 1.1.1.1 2010-02-10 11:49:21 meyer // Imported using TkCVS // // // copyleft : European Synchrotron Radiation Facility // BP 220, Grenoble 38043 // FRANCE // //-============================================================================= // // This file is generated by POGO // (Program Obviously used to Generate tango Object) // // (c) - Software Engineering Group - ESRF //============================================================================= #include #include #include /*==================================================================== * This file contains the methods to allow commands and attributes * read or write execution. * * If you wand to add your own code, add it between * the "End/Re-Start of Generated Code" comments. * * If you want, you can also add your own methods. *==================================================================== */ namespace BiltCh_ns { //================================================= // Attributes Allowed Methods //================================================= //+---------------------------------------------------------------------------- // // method : BiltCh::is_Voltage_allowed // // description : Read/Write allowed for Voltage attribute. // //----------------------------------------------------------------------------- bool BiltCh::is_Voltage_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : BiltCh::is_Impedance_allowed // // description : Read/Write allowed for Impedance attribute. // //----------------------------------------------------------------------------- bool BiltCh::is_Impedance_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : BiltCh::is_SetCurrentRMS_allowed // // description : Read/Write allowed for SetCurrentRMS attribute. // //----------------------------------------------------------------------------- bool BiltCh::is_SetCurrentRMS_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : BiltCh::is_SetCurrentAverage_allowed // // description : Read/Write allowed for SetCurrentAverage attribute. // //----------------------------------------------------------------------------- bool BiltCh::is_SetCurrentAverage_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : BiltCh::is_ErrorCounter_allowed // // description : Read/Write allowed for ErrorCounter attribute. // //----------------------------------------------------------------------------- bool BiltCh::is_ErrorCounter_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : BiltCh::is_LocalControl_allowed // // description : Read/Write allowed for LocalControl attribute. // //----------------------------------------------------------------------------- bool BiltCh::is_LocalControl_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : BiltCh::is_SetCurrentAC_allowed // // description : Read/Write allowed for SetCurrentAC attribute. // //----------------------------------------------------------------------------- bool BiltCh::is_SetCurrentAC_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : BiltCh::is_Current_allowed // // description : Read/Write allowed for Current attribute. // //----------------------------------------------------------------------------- bool BiltCh::is_Current_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : BiltCh::is_FramesPerSecond_allowed // // description : Read/Write allowed for FramesPerSecond attribute. // //----------------------------------------------------------------------------- bool BiltCh::is_FramesPerSecond_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : BiltCh::is_ErrorPerSecond_allowed // // description : Read/Write allowed for ErrorPerSecond attribute. // //----------------------------------------------------------------------------- bool BiltCh::is_ErrorPerSecond_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : BiltCh::is_Temperature1_allowed // // description : Read/Write allowed for Temperature1 attribute. // //----------------------------------------------------------------------------- bool BiltCh::is_Temperature1_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : BiltCh::is_Temperature2_allowed // // description : Read/Write allowed for Temperature2 attribute. // //----------------------------------------------------------------------------- bool BiltCh::is_Temperature2_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //================================================= // Commands Allowed Methods //================================================= } // namespace BiltCh_ns Node-path: powersupply/itest/Bilt/trunk/Bilt.cpp Node-kind: file Node-action: change Text-content-length: 36412 Text-content-md5: c24728a75c60d1471768cd1ee675f1bd Content-length: 36412 static const char *RcsId = "$Id: Bilt.cpp,v 1.16 2010-11-10 14:00:29 meyer Exp $"; //+============================================================================= // // file : Bilt.cpp // // description : C++ source for the Bilt and its commands. // The class is derived from Device. It represents the // CORBA servant object which will be accessed from the // network. All commands which can be executed on the // Bilt are implemented in this file. // // project : TANGO Device Server // // $Author: meyer $ // // $Revision: 1.16 $ // // $Revision: 1.16 $ // $Date: 2010-11-10 14:00:29 $ // // SVN only: // $HeadURL: $ // // CVS only: // $Source: /segfs/tango/cvsroot/cppserver/machine/powersupply/SrSteerers/tango/Bilt/Bilt.cpp,v $ // $Log: not supported by cvs2svn $ // Revision 1.15 2010-11-10 12:01:29 meyer // Changed type of Temperatures attribute from long to double and moved // temperature reading to the acquisition thread. // // Revision 1.14 2010/06/21 07:13:05 meyer // Added a spectrum attribute for the temperature measurements and changed to libMagnet version 1.4. // // Revision 1.13 2010/05/01 16:58:39 meyer // Changed alarm limits for the impedance attribute. // // Revision 1.12 2010/03/16 14:54:58 meyer // Added reconnection method. // // Revision 1.11 2010-02-18 16:46:31 meyer // Filled-in code for SetpointCheck // // Revision 1.10 2010-02-12 16:35:13 meyer // Added SetPoleCurrent command again. // // Revision 1.9 2010-02-11 16:35:27 meyer // Currents settings understand NaN values. // Deleted StePoleCurrent command. // // Revision 1.8 2010/02/10 12:27:31 meyer // Restructured Bilt class. // Acquistion is now done by a thread and only the multi channel data // gets exported. A single channel class (BiltCh) was created. // // Revision 1.7 2009/12/18 12:01:40 meyer // Corrected alarm handling in dev_state() // // Revision 1.6 2009/11/27 13:49:26 meyer // Modified structure! The pole is no longer a device. // The device is now a magnet with three poles. // // Revision 1.5 2009/11/26 10:46:58 meyer // Updated for libMagnet_V120 // // Revision 1.4 2009/11/24 09:21:46 meyer // Absolut value for impedance // // Revision 1.3 2009/11/23 16:46:58 meyer // Corrected state, status and exception handling // // Revision 1.2 2009/11/06 12:46:25 meyer // Added impedance attribute and corrected fromatting of attribute values. // // Revision 1.1.1.1 2009/11/04 16:23:02 meyer // Imported using TkCVS // // // copyleft : European Synchrotron Radiation Facility // BP 220, Grenoble 38043 // FRANCE // //-============================================================================= // // This file is generated by POGO // (Program Obviously used to Generate tango Object) // // (c) - Software Engineering Group - ESRF //============================================================================= //=================================================================== // // The following table gives the correspondence // between commands and method name. // // Command name | Method name // ---------------------------------------- // State | dev_state() // Status | dev_status() // On | on() // Off | off() // Reset | reset() // SetPoleAcCurrent | set_pole_ac_current() // LocalPoleControl | local_pole_control() // SetpointCheck | setpoint_check() // SetPoleCurrent | set_pole_current() // //=================================================================== #include #include #include #include #include namespace Bilt_ns { //+---------------------------------------------------------------------------- // // method : Bilt::Bilt(string &s) // // description : constructor for simulated Bilt // // in : - cl : Pointer to the DeviceClass object // - s : Device name // //----------------------------------------------------------------------------- Bilt::Bilt(Tango::DeviceClass *cl,string &s) :Tango::Device_4Impl(cl,s.c_str()) { init_device(); } Bilt::Bilt(Tango::DeviceClass *cl,const char *s) :Tango::Device_4Impl(cl,s) { init_device(); } Bilt::Bilt(Tango::DeviceClass *cl,const char *s,const char *d) :Tango::Device_4Impl(cl,s,d) { init_device(); } //+---------------------------------------------------------------------------- // // method : Bilt::delete_device() // // description : will be called at device destruction or at init command. // //----------------------------------------------------------------------------- void Bilt::delete_device() { // Delete device allocated objects if ( acquisition_thread != NULL ) { data_mutex.lock(); exit_thread = true; data_mutex.unlock(); // join now the thread until it exits int *rv; acquisition_thread->join((void **)&rv); cout << "Bilt::delete_device(): Exit acquisition thread !!!" << endl; } // Delete connection to the power supply delete BILT; BILT = NULL; } //+---------------------------------------------------------------------------- // // method : Bilt::init_device() // // description : will be called at device initialization. // //----------------------------------------------------------------------------- void Bilt::init_device() { INFO_STREAM << "Bilt::Bilt() create device " << device_name << endl; // Initialise variables to default values //-------------------------------------------- get_device_property(); set_state (Tango::OFF); try { BILT = new itest::TMagnet (iPAddress.c_str(), magnetNumber); } catch (itest::ItestException &e) { try { create_tango_exception (e, mdata_errors, "Init failure" , "Cannot initialise ITEST libray objects", "Bilt::init_device"); } catch (Tango::DevFailed &e) { set_state (Tango::UNKNOWN); } } // initialise with the actual current set point values try { for (int i=0; ipole(i).get_current_DC(); } Tango::MultiAttribute *attr_list = get_device_attr(); Tango::WAttribute &attr_curr = attr_list->get_w_attr_by_name ("Currents"); attr_curr.set_write_value(¤ts_dc[0], currents_dc.size()); } catch (itest::ItestException &e) { try { create_tango_exception (e, mdata_errors, "Init failure" , "Cannot read the actual current set point values", "Bilt::init_device"); } catch (Tango::DevFailed &e) { set_state (Tango::UNKNOWN); } } // initialise and start the acquisition thread exit_thread = false; acquisition_thread = new AcquisitionThread(this, data_mutex, bilt_mutex); } //+---------------------------------------------------------------------------- // // method : Bilt::get_device_property() // // description : Read the device properties from database. // //----------------------------------------------------------------------------- void Bilt::get_device_property() { // Initialize your default values here (if not done with POGO). //------------------------------------------------------------------ BILT = NULL; bilt_connection_lost = false; acquisition_thread = NULL; struct timeval now; gettimeofday (&now, NULL); data_set_time = now; data_read_time = now; // intitialise mdada structure for magnet read values mdata.magnet = -1; mdata.state = -1; for (int i=0; i_UseDb==true) get_db_device()->get_property(dev_prop); Tango::DbDatum def_prop, cl_prop; BiltClass *ds_class = (static_cast(get_device_class())); int i = -1; // Try to initialize IPAddress from class property cl_prop = ds_class->get_class_property(dev_prop[++i].name); if (cl_prop.is_empty()==false) cl_prop >> iPAddress; else { // Try to initialize IPAddress from default device value def_prop = ds_class->get_default_device_property(dev_prop[i].name); if (def_prop.is_empty()==false) def_prop >> iPAddress; } // And try to extract IPAddress value from database if (dev_prop[i].is_empty()==false) dev_prop[i] >> iPAddress; // Try to initialize MagnetNumber from class property cl_prop = ds_class->get_class_property(dev_prop[++i].name); if (cl_prop.is_empty()==false) cl_prop >> magnetNumber; else { // Try to initialize MagnetNumber from default device value def_prop = ds_class->get_default_device_property(dev_prop[i].name); if (def_prop.is_empty()==false) def_prop >> magnetNumber; } // And try to extract MagnetNumber value from database if (dev_prop[i].is_empty()==false) dev_prop[i] >> magnetNumber; // Try to initialize UpdatePeriod from class property cl_prop = ds_class->get_class_property(dev_prop[++i].name); if (cl_prop.is_empty()==false) cl_prop >> updatePeriod; else { // Try to initialize UpdatePeriod from default device value def_prop = ds_class->get_default_device_property(dev_prop[i].name); if (def_prop.is_empty()==false) def_prop >> updatePeriod; } // And try to extract UpdatePeriod value from database if (dev_prop[i].is_empty()==false) dev_prop[i] >> updatePeriod; // End of Automatic code generation //------------------------------------------------------------------ } //+---------------------------------------------------------------------------- // // method : Bilt::always_executed_hook() // // description : method always executed before any command is executed // //----------------------------------------------------------------------------- void Bilt::always_executed_hook() { } //+---------------------------------------------------------------------------- // // method : Bilt::read_attr_hardware // // description : Hardware acquisition for attributes. // //----------------------------------------------------------------------------- void Bilt::read_attr_hardware(vector &attr_list) { DEBUG_STREAM << "Bilt::read_attr_hardware(vector &attr_list) entering... "<< endl; // Add your own code here } //+---------------------------------------------------------------------------- // // method : Bilt::read_Temperatures // // description : Extract real attribute values for Temperatures acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_Temperatures(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_Temperatures(Tango::Attribute &attr) entering... "<< endl; omni_mutex_lock l(data_mutex); if ( temp_errors.length() != 0 ) attr.set_quality(Tango::ATTR_INVALID); else { attr.set_value (&(temperatures[0]), 2*POLES); } /* try { temperatures.clear(); for (int i=0; ipole(i).get_ctn (&temp1, &temp2); INFO_STREAM << "Pole["<pole(i).get_switch(); } if ( switch_state == 1 ) local_control[i] = false; else local_control[i] = true; } } catch (itest::ItestException &e) { create_tango_exception (e, "Read failure" , "Cannot read the actual switch states", "Bilt::read_LocalControls"); } attr.set_value (&(local_control[0]), POLES); } //+---------------------------------------------------------------------------- // // method : Bilt::read_SetCurrentsRMS // // description : Extract real attribute values for SetCurrentsRMS acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_SetCurrentsRMS(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_SetCurrentsRMS(Tango::Attribute &attr) entering... "<< endl; omni_mutex_lock l(data_mutex); if ( fdata_errors.length() != 0 ) attr.set_quality(Tango::ATTR_INVALID); else { for (int i=0; i CURRENT_LIMIT ) impedances[i] = fabs (mdata.idata[i].measvolt / mdata.idata[i].meascurr); else impedances[i] = nan("NaN"); } } attr.set_value (&(impedances[0]), POLES); } //+---------------------------------------------------------------------------- // // method : Bilt::write_Currents // // description : Write Currents attribute values to hardware. // //----------------------------------------------------------------------------- void Bilt::write_Currents(Tango::WAttribute &attr) { DEBUG_STREAM << "Bilt::write_Currents(Tango::WAttribute &attr) entering... "<< endl; const double *set_currents; // check the correct number of setpoints if ( attr.get_write_value_length() == POLES ) attr.get_write_value(set_currents); else { TangoSys_MemStream tms; tms << "Wrong number of setpoints!" << endl; Tango::Except::throw_exception("WriteError", tms.str(), "Bilt::write_Currents"); } // apply setpoints to the poles try { for (int i=0; ipole(i).set_current_DC (set_currents[i]); } } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot write DC current values", "Bilt::write_Currents"); } // initialise the set time, to be sure that the next // returned read value is newer and contains the changes. struct timeval now; gettimeofday (&now, NULL); data_set_time = now; } //+---------------------------------------------------------------------------- // // method : Bilt::read_Currents // // description : Extract real attribute values for Currents acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_Currents(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_Currents(Tango::Attribute &attr) entering... "<< endl; // wait for the next data acquisition afer a current setpoint change double delay; { omni_mutex_lock l(data_mutex); delay = (data_set_time.tv_sec * 1e6 + data_set_time.tv_usec) - (data_read_time.tv_sec * 1e6 + data_read_time.tv_usec); //cout << "delay = " << delay << endl; } while ( delay > 0 ) { // 20 ms struct timespec sleep_time = {0, SLEEP_NS}; nanosleep(&sleep_time, NULL); omni_mutex_lock l(data_mutex); delay = (data_set_time.tv_sec * 1e6 + data_set_time.tv_usec) - (data_read_time.tv_sec * 1e6 + data_read_time.tv_usec); INFO_STREAM << "read waiting delay = " << delay << endl; } omni_mutex_lock l(data_mutex); if ( mdata_errors.length() != 0 ) attr.set_quality(Tango::ATTR_INVALID); else { for (int i=0; iset_state(1); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot switch on pole", "Bilt::on"); } } //+------------------------------------------------------------------ /** * method: Bilt::off * * description: method to execute "Off" * Turns of power supply * * */ //+------------------------------------------------------------------ void Bilt::off() { DEBUG_STREAM << "Bilt::off(): entering... !" << endl; // Add your own code to control device here try { omni_mutex_lock l(bilt_mutex); BILT->set_state(0); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot switch off pole", "Bilt::off"); } } //+------------------------------------------------------------------ /** * method: Bilt::reset * * description: method to execute "Reset" * Reset faults and alarms * * */ //+------------------------------------------------------------------ void Bilt::reset() { DEBUG_STREAM << "Bilt::reset(): entering... !" << endl; // Add your own code to control device here try { omni_mutex_lock l(bilt_mutex); BILT->clear_all_err(); BILT->clear_alarm(); for (int i=0; ipole(i).clear_ferrors(); } } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot reset pole", "Bilt::reset"); } } //+------------------------------------------------------------------ /** * method: Bilt::set_pole_ac_current * * description: method to execute "SetPoleAcCurrent" * Set the AC current for one Pole. * [0] = pole number, [1] = current * * @param argin [0] = pole number, [1] = current * */ //+------------------------------------------------------------------ void Bilt::set_pole_ac_current(const Tango::DevVarDoubleArray *argin) { DEBUG_STREAM << "Bilt::set_pole_ac_current(): entering... !" << endl; // Add your own code to control device here // argin[0] = pole number if ( (*argin)[0] < 0 || (*argin)[0] >= POLES ) { TangoSys_MemStream tms; tms << "The entered Pole number is out of range" << endl; Tango::Except::throw_exception("WriteError", tms.str(), "Bilt::set_pole_ac_current"); } try { omni_mutex_lock l(bilt_mutex); BILT->pole((int)(*argin)[0]).set_current_AC ((*argin)[1]); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot write AC current value", "Bilt::set_pole_ac_current"); } } //+------------------------------------------------------------------ /** * method: Bilt::local_pole_control * * description: method to execute "LocalPoleControl" * Set the AC current for one Pole. * [0] = pole number, [1] = local control true/false * * @param argin [0] = pole number, [1] = local control true/false * */ //+------------------------------------------------------------------ void Bilt::local_pole_control(const Tango::DevVarShortArray *argin) { DEBUG_STREAM << "Bilt::local_pole_control(): entering... !" << endl; // Add your own code to control device here // argin[0] = pole number if ( (*argin)[0] < 0 || (*argin)[0] >= POLES ) { TangoSys_MemStream tms; tms << "The entered Pole number is out of range" << endl; Tango::Except::throw_exception("WriteError", tms.str(), "Bilt::local_pole_control"); } // argin[1] = true or false (1 or 0 ) if ( (*argin)[1] != 0 && (*argin)[1] != 1 ) { TangoSys_MemStream tms; tms << "Local control can only be choosen as 0 or 1 (false or true)" << endl; Tango::Except::throw_exception("WriteError", tms.str(), "Bilt::local_pole_control"); } try { int switch_state; if ( (*argin)[1] == true ) switch_state = 0; else switch_state = 1; omni_mutex_lock l(bilt_mutex); BILT->pole((*argin)[0]).set_switch (switch_state); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot write switch state", "Bilt::local_pole_control"); } } //+------------------------------------------------------------------ /** * method: Bilt::set_pole_current * * description: method to execute "SetPoleCurrent" * Set the current for one Pole. * [0] = pole number, [1] = current * * @param argin [0] = pole number, [1] = current * */ //+------------------------------------------------------------------ void Bilt::set_pole_current(const Tango::DevVarDoubleArray *argin) { DEBUG_STREAM << "Bilt::set_pole_current(): entering... !" << endl; // Add your own code to control device here // argin[0] = pole number if ( (*argin)[0] < 0 || (*argin)[0] >= POLES ) { TangoSys_MemStream tms; tms << "The entered Pole number is out of range" << endl; Tango::Except::throw_exception("WriteError", tms.str(), "Bilt::set_pole_current"); } try { omni_mutex_lock l(bilt_mutex); BILT->pole((int)(*argin)[0]).set_current_DC ((*argin)[1]); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot write current value", "Bilt::set_pole_current"); } // make sure that the current set values are correct! try { omni_mutex_lock l(bilt_mutex); for (int i=0; ipole(i).get_current_DC(); } Tango::MultiAttribute *attr_list = get_device_attr(); Tango::WAttribute &attr_curr = attr_list->get_w_attr_by_name ("Currents"); attr_curr.set_write_value(¤ts_dc[0], currents_dc.size()); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot read the actual current set point values", "Bilt::set_pole_current"); } // initialise the set time, to be sure that the next // returned read value is newer and contains the changes. struct timeval now; gettimeofday (&now, NULL); data_set_time = now; } //+------------------------------------------------------------------ /** * method: Bilt::create_tango_exception() * * description: convert an itest exception into a tango exception * * * in : - &e : Reference to itest exception * - reason : Reason of the local Tango exception to be added to the stack * - desc : Description for the local Tango exception to be added to the stack * - origin : Origin if the local Tango exception to be added to the stack */ //+------------------------------------------------------------------ void Bilt::create_tango_exception (itest::ItestException &e, string reason, string desc, string origin) { Tango::DevErrorList errors; create_tango_exception (e, errors, reason, desc, origin); } //+------------------------------------------------------------------ /** * method: Bilt::create_tango_exception() * * description: convert an itest exception into a tango exception * * * in : - &e : Reference to itest exception * - errors : Tango error list to use, to store exception info * - reason : Reason of the local Tango exception to be added to the stack * - desc : Description for the local Tango exception to be added to the stack * - origin : Origin if the local Tango exception to be added to the stack */ //+------------------------------------------------------------------ void Bilt::create_tango_exception (itest::ItestException &e, Tango::DevErrorList &errors, string reason, string desc, string origin) { DEBUG_STREAM << "Bilt::create_tango_exception(): entering... !" << endl; errors.length(e.errors.size() + 1); int i; for(i=0; idevice_status data member) and returns it to the caller. * * @return Status description * */ //+------------------------------------------------------------------ Tango::ConstDevString Bilt::dev_status() { //Tango::ConstDevString argout = DeviceImpl::dev_status(); DEBUG_STREAM << "Bilt::dev_status(): entering... !" << endl; // Add your own code to control device here stringstream status; Tango::DevState state = dev_state(); switch (state) { case Tango::ON: status << "State : ON" << endl; break; case Tango::OFF: status << "State : OFF" << endl; break; case Tango::ALARM: { status << "State : Alarm" << endl; omni_mutex_lock l(data_mutex); for (int i=0; i 10W in 10ms!" << endl; else { if ( mdata.idata[i].fail == "TEMP" ) status << "Fault descr. : Max. temp on semiconductor reached!" << endl; else { if ( mdata.idata[i].fail == "PWSO" ) status << "Fault descr. : Delivered power > 40W in 100ms!" << endl; else { status << "Fault descr. : Unkown fault code!" << endl; } } } } } } } break; } default: { { omni_mutex_lock l(data_mutex); status << "BILT state : Unknown" << endl; if ( bilt_connection_lost == true ) { status << "Connection lost to BILT power supply, trying to reconnect!" << endl; status << endl; } if ( mdata_errors.length() > 0 ) status << "Error stack : " << endl; for(int i=0; idevice_state data member) and returns it to the caller. * * @return State Code * */ //+------------------------------------------------------------------ Tango::DevState Bilt::dev_state() { Tango::DevState argout = DeviceImpl::dev_state(); DEBUG_STREAM << "Bilt::dev_state(): entering... !" << endl; // Add your own code to control device here int state; int errors; try { omni_mutex_lock l(data_mutex); state = mdata.state; INFO_STREAM << "magnet state for " << get_name() << " = " << state << endl; errors = mdata_errors.length(); INFO_STREAM << "mdata errors = " << mdata_errors.length() << endl; } catch (Tango::DevFailed &e) { // do nothing! // Just avoid exceptions when executing state or status! } if ( errors != 0 ) set_state (Tango::UNKNOWN); else { // set the device state switch (state) { case -1: set_state (Tango::UNKNOWN); bilt_connection_lost = true; break; case 0: set_state (Tango::OFF); break; case 1: set_state (Tango::ON); break; case 2: set_state (Tango::ALARM); break; case 3: set_state (Tango::FAULT); break; default: set_state (Tango::UNKNOWN); break; } } // Check for attribute alarms if ( get_state() == Tango::ON && argout == Tango::ALARM ) set_state (Tango::ALARM); return get_state(); } //+------------------------------------------------------------------ /** * method: Bilt::setpoint_check * * description: method to execute "SetpointCheck" * Check the given current values against the specified limits. * * @param argin Setpoint values for the Poles * @return true when settings are OK * */ //+------------------------------------------------------------------ Tango::DevBoolean Bilt::setpoint_check(const Tango::DevVarDoubleArray *argin) { Tango::DevBoolean argout ; DEBUG_STREAM << "Bilt::setpoint_check(): entering... !" << endl; // Add your own code to control device here // get the min and max values for the current settings Tango::MultiAttribute *attr_list = get_device_attr(); Tango::WAttribute &attr_curr = attr_list->get_w_attr_by_name ("Currents"); double min, max; attr_curr.get_min_value(min); attr_curr.get_max_value(max); INFO_STREAM << "min = " << min << " max = " << max << endl; // check the input values argout = true; for ( int i=0; ilength(); i++ ) { INFO_STREAM << "i = " << i << " curr = " << (*argin)[i] << endl; if ( (*argin)[i] < min || (*argin)[i] > max ) { argout = false; break; } } return argout; } } // namespace Node-path: powersupply/itest/Bilt/trunk/Bilt.h Node-kind: file Node-action: change Text-content-length: 12747 Text-content-md5: e6de9dcb2ac30ac59ed441e04da64ff2 Content-length: 12747 //============================================================================= // // file : Bilt.h // // description : Include for the Bilt class. // // project : BILT multi channel power supply // // $Author: meyer $ // // $Revision: 1.13 $ // $Date: 2010-11-10 14:00:29 $ // // SVN only: // $HeadURL: $ // // CVS only: // $Source: /segfs/tango/cvsroot/cppserver/machine/powersupply/SrSteerers/tango/Bilt/Bilt.h,v $ // $Log: not supported by cvs2svn $ // Revision 1.12 2010-11-10 12:01:29 meyer // Changed type of Temperatures attribute from long to double and moved // temperature reading to the acquisition thread. // // Revision 1.11 2010/08/31 07:54:48 meyer // Changed impedence alarm calculation limit. // // Revision 1.10 2010/06/21 07:13:05 meyer // Added a spectrum attribute for the temperature measurements and changed to libMagnet version 1.4. // // Revision 1.9 2010/05/01 16:58:39 meyer // Changed alarm limits for the impedance attribute. // // Revision 1.8 2010/03/16 14:54:58 meyer // Added reconnection method. // // Revision 1.7 2010-02-12 16:35:13 meyer // Added SetPoleCurrent command again. // // Revision 1.6 2010-02-11 16:35:27 meyer // Currents settings understand NaN values. // Deleted StePoleCurrent command. // // Revision 1.5 2010/02/10 12:27:31 meyer // Restructured Bilt class. // Acquistion is now done by a thread and only the multi channel data // gets exported. A single channel class (BiltCh) was created. // // Revision 1.4 2009/11/27 13:49:26 meyer // Modified structure! The pole is no longer a device. // The device is now a magnet with three poles. // // Revision 1.3 2009/11/26 10:46:58 meyer // Updated for libMagnet_V120 // // Revision 1.2 2009/11/06 12:46:25 meyer // Added impedance attribute and corrected fromatting of attribute values. // // Revision 1.1.1.1 2009/11/04 16:23:02 meyer // Imported using TkCVS // // // copyleft : European Synchrotron Radiation Facility // BP 220, Grenoble 38043 // FRANCE // //============================================================================= // // This file is generated by POGO // (Program Obviously used to Generate tango Object) // // (c) - Software Engineering Group - ESRF //============================================================================= #ifndef _BILT_H #define _BILT_H #include #include #include //using namespace Tango; /** * @author $Author: meyer $ * @version $Revision: 1.13 $ */ // Add your own constant definitions here. //----------------------------------------------- // Number of poles per magnet #define POLES 3 // Current limit for a valid impedeance calculation #define CURRENT_LIMIT 0.05 // define sleep times #define SLEEP_NS 20000000 // 20 ms namespace Bilt_ns { class AcquisitionThread; /** * Class Description: * The BILT multi channel power supply will be used with 3 channels for the ESRF fast * feedback systems. * The power supply can be controlled in 2 ways : * By this device server for slow or human control or * by the Libera Beam Position monitors for fast feedback with closed loop control. * The devices are exported as one device per steerer magnet. Every device has three * channels. The channels (poles) cannot be switched on individually but have their * individual set points and measurement values. */ /* * Device States Description: * Tango::ON : Magnet is ON, all three channels are ON. * Tango::OFF : Magnet is OFF, all three channels are OFF. * Tango::FAULT : Error detected by the BILT magnet. * Tango::ALARM : Alarm detected on one or more channels. * Tango::UNKNOWN : Communication fault */ class Bilt: public Tango::Device_4Impl { public : // Add your own data members here //----------------------------------------- // Here is the Start of the automatic code generation part //------------------------------------------------------------- /** * @name attributes * Attribute member data. */ //@{ Tango::DevDouble *attr_Currents_read; Tango::DevDouble attr_Currents_write; Tango::DevDouble *attr_Voltages_read; Tango::DevDouble *attr_Impedances_read; Tango::DevDouble *attr_SetCurrentsRMS_read; Tango::DevDouble *attr_SetCurrentsAverage_read; Tango::DevULong *attr_FramesPerSecond_read; Tango::DevULong *attr_ErrorsPerSecond_read; Tango::DevULong *attr_ErrorCounters_read; Tango::DevBoolean *attr_LocalControls_read; Tango::DevDouble *attr_Temperatures_read; //@} /** * @name Device properties * Device properties member data. */ //@{ /** * IP Address of BILT controller. * Each controller includes several magnets and * each magnet includes 3 power supplies, * for corrections in the X, Y and Z planes. * * */ string iPAddress; /** * Magnet number from 1 to 48 */ Tango::DevShort magnetNumber; /** * The update period for the data reading from the power supply in milli seconds. */ Tango::DevLong updatePeriod; //@} /** * @name Device properties * Device property member data. */ //@{ //@} /**@name Constructors * Miscellaneous constructors */ //@{ /** * Constructs a newly allocated Command object. * * @param cl Class. * @param s Device Name */ Bilt(Tango::DeviceClass *cl,string &s); /** * Constructs a newly allocated Command object. * * @param cl Class. * @param s Device Name */ Bilt(Tango::DeviceClass *cl,const char *s); /** * Constructs a newly allocated Command object. * * @param cl Class. * @param s Device name * @param d Device description. */ Bilt(Tango::DeviceClass *cl,const char *s,const char *d); //@} /**@name Destructor * Only one destructor is defined for this class */ //@{ /** * The object destructor. */ ~Bilt() {delete_device();}; /** * will be called at device destruction or at init command. */ void delete_device(); //@} /**@name Miscellaneous methods */ //@{ /** * Initialize the device */ virtual void init_device(); /** * Always executed method before execution command method. */ virtual void always_executed_hook(); //@} /** * @name Bilt methods prototypes */ //@{ /** * Hardware acquisition for attributes. */ virtual void read_attr_hardware(vector &attr_list); /** * Extract real attribute values for Currents acquisition result. */ virtual void read_Currents(Tango::Attribute &attr); /** * Write Currents attribute values to hardware. */ virtual void write_Currents(Tango::WAttribute &attr); /** * Extract real attribute values for Voltages acquisition result. */ virtual void read_Voltages(Tango::Attribute &attr); /** * Extract real attribute values for Impedances acquisition result. */ virtual void read_Impedances(Tango::Attribute &attr); /** * Extract real attribute values for SetCurrentsRMS acquisition result. */ virtual void read_SetCurrentsRMS(Tango::Attribute &attr); /** * Extract real attribute values for SetCurrentsAverage acquisition result. */ virtual void read_SetCurrentsAverage(Tango::Attribute &attr); /** * Extract real attribute values for FramesPerSecond acquisition result. */ virtual void read_FramesPerSecond(Tango::Attribute &attr); /** * Extract real attribute values for ErrorsPerSecond acquisition result. */ virtual void read_ErrorsPerSecond(Tango::Attribute &attr); /** * Extract real attribute values for ErrorCounters acquisition result. */ virtual void read_ErrorCounters(Tango::Attribute &attr); /** * Extract real attribute values for LocalControls acquisition result. */ virtual void read_LocalControls(Tango::Attribute &attr); /** * Extract real attribute values for Temperatures acquisition result. */ virtual void read_Temperatures(Tango::Attribute &attr); /** * Read/Write allowed for Currents attribute. */ virtual bool is_Currents_allowed(Tango::AttReqType type); /** * Read/Write allowed for Voltages attribute. */ virtual bool is_Voltages_allowed(Tango::AttReqType type); /** * Read/Write allowed for Impedances attribute. */ virtual bool is_Impedances_allowed(Tango::AttReqType type); /** * Read/Write allowed for SetCurrentsRMS attribute. */ virtual bool is_SetCurrentsRMS_allowed(Tango::AttReqType type); /** * Read/Write allowed for SetCurrentsAverage attribute. */ virtual bool is_SetCurrentsAverage_allowed(Tango::AttReqType type); /** * Read/Write allowed for FramesPerSecond attribute. */ virtual bool is_FramesPerSecond_allowed(Tango::AttReqType type); /** * Read/Write allowed for ErrorsPerSecond attribute. */ virtual bool is_ErrorsPerSecond_allowed(Tango::AttReqType type); /** * Read/Write allowed for ErrorCounters attribute. */ virtual bool is_ErrorCounters_allowed(Tango::AttReqType type); /** * Read/Write allowed for LocalControls attribute. */ virtual bool is_LocalControls_allowed(Tango::AttReqType type); /** * Read/Write allowed for Temperatures attribute. */ virtual bool is_Temperatures_allowed(Tango::AttReqType type); /** * Execution allowed for On command. */ virtual bool is_On_allowed(const CORBA::Any &any); /** * Execution allowed for Off command. */ virtual bool is_Off_allowed(const CORBA::Any &any); /** * Execution allowed for Reset command. */ virtual bool is_Reset_allowed(const CORBA::Any &any); /** * Execution allowed for SetPoleAcCurrent command. */ virtual bool is_SetPoleAcCurrent_allowed(const CORBA::Any &any); /** * Execution allowed for LocalPoleControl command. */ virtual bool is_LocalPoleControl_allowed(const CORBA::Any &any); /** * Execution allowed for SetpointCheck command. */ virtual bool is_SetpointCheck_allowed(const CORBA::Any &any); /** * Execution allowed for SetPoleCurrent command. */ virtual bool is_SetPoleCurrent_allowed(const CORBA::Any &any); /** * This command gets the device state (stored in its device_state data member) and returns it to the caller. * @return State Code * @exception DevFailed */ virtual Tango::DevState dev_state(); /** * This command gets the device status (stored in its device_status data member) and returns it to the caller. * @return Status description * @exception DevFailed */ virtual Tango::ConstDevString dev_status(); /** * Turns on power supply. * @exception DevFailed */ void on(); /** * Turns of power supply * @exception DevFailed */ void off(); /** * Reset faults and alarms * @exception DevFailed */ void reset(); /** * Set the AC current for one Pole. * [0] = pole number, [1] = current * @param argin [0] = pole number, [1] = current * @exception DevFailed */ void set_pole_ac_current(const Tango::DevVarDoubleArray *); /** * Set the AC current for one Pole. * [0] = pole number, [1] = local control true/false * @param argin [0] = pole number, [1] = local control true/false * @exception DevFailed */ void local_pole_control(const Tango::DevVarShortArray *); /** * Check the given current values against the specified limits. * @param argin Setpoint values for the Poles * @return true when settings are OK * @exception DevFailed */ Tango::DevBoolean setpoint_check(const Tango::DevVarDoubleArray *); /** * Set the current for one Pole. * [0] = pole number, [1] = current * @param argin [0] = pole number, [1] = current * @exception DevFailed */ void set_pole_current(const Tango::DevVarDoubleArray *); /** * Read the device properties from database */ void get_device_property(); //@} // Here is the end of the automatic code generation part //------------------------------------------------------------- protected : // Add your own data members here //----------------------------------------- friend class AcquisitionThread; AcquisitionThread *acquisition_thread; omni_mutex data_mutex; omni_mutex bilt_mutex; short exit_thread; struct timeval data_set_time; struct timeval data_read_time; void create_tango_exception (itest::ItestException &e, string reason, string desc, string origin); void create_tango_exception (itest::ItestException &e, Tango::DevErrorList &errors, string reason, string desc, string origin); itest::TMagnet *BILT; bool bilt_connection_lost; struct itest::mdata mdata; struct itest::fdata fdata[POLES]; Tango::DevErrorList mdata_errors; Tango::DevErrorList fdata_errors; Tango::DevErrorList temp_errors; vector currents_dc; vector currents_ac; vector voltages; vector impedances; vector currents_rms; vector currents_average; vector frames_per_sec; vector errors_per_sec; vector error_counters; vector temperatures; bool local_control[3]; }; } // namespace_ns #endif // _BILT_H Node-path: powersupply/itest/Bilt/trunk/BiltClass.cpp Node-kind: file Node-action: change Text-content-length: 27864 Text-content-md5: 34f5ebbff43a502767787457e1f25a0a Content-length: 27864 static const char *ClassId = "$Id: BiltClass.cpp,v 1.16 2010-11-10 14:00:29 meyer Exp $"; static const char *TagName = "$Name: not supported by cvs2svn $"; static const char *CvsPath = "$Source: /segfs/tango/cvsroot/cppserver/machine/powersupply/SrSteerers/tango/Bilt/BiltClass.cpp,v $"; static const char *SvnPath = "$HeadURL: $"; static const char *HttpServer = "http://www.esrf.fr/computing/cs/tango/tango_doc/ds_doc/"; //+============================================================================= // // file : BiltClass.cpp // // description : C++ source for the BiltClass. A singleton // class derived from DeviceClass. It implements the // command list and all properties and methods required // by the Bilt once per process. // // project : TANGO Device Server // // $Author: meyer $ // // $Revision: 1.16 $ // // $Log: not supported by cvs2svn $ // Revision 1.15 2010-11-10 11:59:11 meyer // Changed type of Temperatures attribute from long to double. // Added default alarm and polling values. // // Revision 1.14 2010/06/24 11:43:10 meyer // Corrected memory leak when the reconnection to the power supply fails. // // Revision 1.13 2010/06/21 07:13:05 meyer // Added a spectrum attribute for the temperature measurements and changed to libMagnet version 1.4. // // Revision 1.12 2010/05/01 16:58:39 meyer // Changed alarm limits for the impedance attribute. // // Revision 1.11 2010/03/16 15:03:33 meyer // Excluded Steerer class. // // Revision 1.10 2010-02-12 16:35:13 meyer // Added SetPoleCurrent command again. // // Revision 1.9 2010-02-11 16:35:27 meyer // Currents settings understand NaN values. // Deleted StePoleCurrent command. // // Revision 1.8 2010/02/10 16:22:15 meyer // Release_3_0 // // Revision 1.7 2010/02/10 12:27:31 meyer // Restructured Bilt class. // Acquistion is now done by a thread and only the multi channel data // gets exported. A single channel class (BiltCh) was created. // // Revision 1.6 2009/12/18 12:02:18 meyer // Changed version number to 2.1 // // Revision 1.5 2009/11/27 13:49:26 meyer // Modified structure! The pole is no longer a device. // The device is now a magnet with three poles. // // Revision 1.4 2009/11/26 10:46:58 meyer // Updated for libMagnet_V120 // // Revision 1.3 2009/11/23 16:46:58 meyer // Corrected state, status and exception handling // // Revision 1.2 2009/11/06 12:46:25 meyer // Added impedance attribute and corrected fromatting of attribute values. // // Revision 1.1.1.1 2009/11/04 16:23:02 meyer // Imported using TkCVS // // // copyleft : European Synchrotron Radiation Facility // BP 220, Grenoble 38043 // FRANCE // //-============================================================================= // // This file is generated by POGO // (Program Obviously used to Generate tango Object) // // (c) - Software Engineering Group - ESRF //============================================================================= #include #include #include //+---------------------------------------------------------------------------- /** * Create BiltClass singleton and return it in a C function for Python usage */ //+---------------------------------------------------------------------------- extern "C" { #ifdef WIN32 __declspec(dllexport) #endif Tango::DeviceClass *_create_Bilt_class(const char *name) { return Bilt_ns::BiltClass::init(name); } } namespace Bilt_ns { //+---------------------------------------------------------------------------- // // method : SetPoleCurrentCmd::execute() // // description : method to trigger the execution of the command. // PLEASE DO NOT MODIFY this method core without pogo // // in : - device : The device on which the command must be executed // - in_any : The command input data // // returns : The command output data (packed in the Any object) // //----------------------------------------------------------------------------- CORBA::Any *SetPoleCurrentCmd::execute(Tango::DeviceImpl *device,const CORBA::Any &in_any) { cout2 << "SetPoleCurrentCmd::execute(): arrived" << endl; const Tango::DevVarDoubleArray *argin; extract(in_any, argin); ((static_cast(device))->set_pole_current(argin)); return new CORBA::Any(); } //+---------------------------------------------------------------------------- // // method : SetpointCheckCmd::execute() // // description : method to trigger the execution of the command. // PLEASE DO NOT MODIFY this method core without pogo // // in : - device : The device on which the command must be executed // - in_any : The command input data // // returns : The command output data (packed in the Any object) // //----------------------------------------------------------------------------- CORBA::Any *SetpointCheckCmd::execute(Tango::DeviceImpl *device,const CORBA::Any &in_any) { cout2 << "SetpointCheckCmd::execute(): arrived" << endl; const Tango::DevVarDoubleArray *argin; extract(in_any, argin); return insert((static_cast(device))->setpoint_check(argin)); } //+---------------------------------------------------------------------------- // // method : LocalPoleControlCmd::execute() // // description : method to trigger the execution of the command. // PLEASE DO NOT MODIFY this method core without pogo // // in : - device : The device on which the command must be executed // - in_any : The command input data // // returns : The command output data (packed in the Any object) // //----------------------------------------------------------------------------- CORBA::Any *LocalPoleControlCmd::execute(Tango::DeviceImpl *device,const CORBA::Any &in_any) { cout2 << "LocalPoleControlCmd::execute(): arrived" << endl; const Tango::DevVarShortArray *argin; extract(in_any, argin); ((static_cast(device))->local_pole_control(argin)); return new CORBA::Any(); } //+---------------------------------------------------------------------------- // // method : SetPoleAcCurrentCmd::execute() // // description : method to trigger the execution of the command. // PLEASE DO NOT MODIFY this method core without pogo // // in : - device : The device on which the command must be executed // - in_any : The command input data // // returns : The command output data (packed in the Any object) // //----------------------------------------------------------------------------- CORBA::Any *SetPoleAcCurrentCmd::execute(Tango::DeviceImpl *device,const CORBA::Any &in_any) { cout2 << "SetPoleAcCurrentCmd::execute(): arrived" << endl; const Tango::DevVarDoubleArray *argin; extract(in_any, argin); ((static_cast(device))->set_pole_ac_current(argin)); return new CORBA::Any(); } //+---------------------------------------------------------------------------- // // method : OnCmd::execute() // // description : method to trigger the execution of the command. // PLEASE DO NOT MODIFY this method core without pogo // // in : - device : The device on which the command must be executed // - in_any : The command input data // // returns : The command output data (packed in the Any object) // //----------------------------------------------------------------------------- CORBA::Any *OnCmd::execute(Tango::DeviceImpl *device,const CORBA::Any &in_any) { cout2 << "OnCmd::execute(): arrived" << endl; ((static_cast(device))->on()); return new CORBA::Any(); } //+---------------------------------------------------------------------------- // // method : OffCmd::execute() // // description : method to trigger the execution of the command. // PLEASE DO NOT MODIFY this method core without pogo // // in : - device : The device on which the command must be executed // - in_any : The command input data // // returns : The command output data (packed in the Any object) // //----------------------------------------------------------------------------- CORBA::Any *OffCmd::execute(Tango::DeviceImpl *device,const CORBA::Any &in_any) { cout2 << "OffCmd::execute(): arrived" << endl; ((static_cast(device))->off()); return new CORBA::Any(); } //+---------------------------------------------------------------------------- // // method : ResetCmd::execute() // // description : method to trigger the execution of the command. // PLEASE DO NOT MODIFY this method core without pogo // // in : - device : The device on which the command must be executed // - in_any : The command input data // // returns : The command output data (packed in the Any object) // //----------------------------------------------------------------------------- CORBA::Any *ResetCmd::execute(Tango::DeviceImpl *device,const CORBA::Any &in_any) { cout2 << "ResetCmd::execute(): arrived" << endl; ((static_cast(device))->reset()); return new CORBA::Any(); } // //---------------------------------------------------------------- // Initialize pointer for singleton pattern //---------------------------------------------------------------- // BiltClass *BiltClass::_instance = NULL; //+---------------------------------------------------------------------------- // // method : BiltClass::BiltClass(string &s) // // description : constructor for the BiltClass // // in : - s : The class name // //----------------------------------------------------------------------------- BiltClass::BiltClass(string &s):DeviceClass(s) { cout2 << "Entering BiltClass constructor" << endl; set_default_property(); get_class_property(); write_class_property(); cout2 << "Leaving BiltClass constructor" << endl; } //+---------------------------------------------------------------------------- // // method : BiltClass::~BiltClass() // // description : destructor for the BiltClass // //----------------------------------------------------------------------------- BiltClass::~BiltClass() { _instance = NULL; } //+---------------------------------------------------------------------------- // // method : BiltClass::instance // // description : Create the object if not already done. Otherwise, just // return a pointer to the object // // in : - name : The class name // //----------------------------------------------------------------------------- BiltClass *BiltClass::init(const char *name) { if (_instance == NULL) { try { string s(name); _instance = new BiltClass(s); } catch (bad_alloc) { throw; } } return _instance; } BiltClass *BiltClass::instance() { if (_instance == NULL) { cerr << "Class is not initialised !!" << endl; exit(-1); } return _instance; } //+---------------------------------------------------------------------------- // // method : BiltClass::command_factory // // description : Create the command object(s) and store them in the // command list // //----------------------------------------------------------------------------- void BiltClass::command_factory() { command_list.push_back(new OnCmd("On", Tango::DEV_VOID, Tango::DEV_VOID, "", "", Tango::OPERATOR)); command_list.push_back(new OffCmd("Off", Tango::DEV_VOID, Tango::DEV_VOID, "", "", Tango::OPERATOR)); command_list.push_back(new ResetCmd("Reset", Tango::DEV_VOID, Tango::DEV_VOID, "", "", Tango::OPERATOR)); command_list.push_back(new SetPoleAcCurrentCmd("SetPoleAcCurrent", Tango::DEVVAR_DOUBLEARRAY, Tango::DEV_VOID, "[0] = pole number, [1] = current", "", Tango::OPERATOR)); command_list.push_back(new LocalPoleControlCmd("LocalPoleControl", Tango::DEVVAR_SHORTARRAY, Tango::DEV_VOID, "[0] = pole number, [1] = local control true/false", "", Tango::OPERATOR)); command_list.push_back(new SetpointCheckCmd("SetpointCheck", Tango::DEVVAR_DOUBLEARRAY, Tango::DEV_BOOLEAN, "Setpoint values for the Poles", "true when settings are OK", Tango::OPERATOR)); command_list.push_back(new SetPoleCurrentCmd("SetPoleCurrent", Tango::DEVVAR_DOUBLEARRAY, Tango::DEV_VOID, "[0] = pole number, [1] = current", "", Tango::OPERATOR)); // add polling if any for (unsigned int i=0 ; ilength() ; i++) { cout4 << "Device name : " << (*devlist_ptr)[i].in() << endl; // Create devices and add it into the device list //---------------------------------------------------- device_list.push_back(new Bilt(this, (*devlist_ptr)[i])); // Export device to the outside world // Check before if database used. //--------------------------------------------- if ((Tango::Util::_UseDb == true) && (Tango::Util::_FileDb == false)) export_device(device_list.back()); else export_device(device_list.back(), (*devlist_ptr)[i]); } // End of Automatic code generation //------------------------------------------------------------- } //+---------------------------------------------------------------------------- // Method: BiltClass::attribute_factory(vector &att_list) //----------------------------------------------------------------------------- void BiltClass::attribute_factory(vector &att_list) { // Attribute : Currents CurrentsAttrib *currents = new CurrentsAttrib(); Tango::UserDefaultAttrProp currents_prop; currents_prop.set_label("Currents"); currents_prop.set_unit("A"); currents_prop.set_format("%6.4f"); currents_prop.set_max_value("1.8"); currents_prop.set_min_value("-1.8"); currents_prop.set_description("The measured currents of the three poles."); currents->set_default_properties(currents_prop); att_list.push_back(currents); // Attribute : Voltages VoltagesAttrib *voltages = new VoltagesAttrib(); Tango::UserDefaultAttrProp voltages_prop; voltages_prop.set_label("Voltages"); voltages_prop.set_unit("V"); voltages_prop.set_format("%6.4"); voltages_prop.set_description("The measured voltages of the three poles."); voltages->set_default_properties(voltages_prop); att_list.push_back(voltages); // Attribute : Impedances ImpedancesAttrib *impedances = new ImpedancesAttrib(); Tango::UserDefaultAttrProp impedances_prop; impedances_prop.set_label("Impedances"); impedances_prop.set_unit("Ohm"); impedances_prop.set_format("%4.2f"); impedances_prop.set_max_alarm("5.0"); impedances_prop.set_min_alarm("2.8"); impedances_prop.set_description("Calculated impedances for the three poles."); impedances->set_default_properties(impedances_prop); impedances->set_polling_period(3000); att_list.push_back(impedances); // Attribute : SetCurrentsRMS SetCurrentsRMSAttrib *set_currents_rms = new SetCurrentsRMSAttrib(); Tango::UserDefaultAttrProp set_currents_rms_prop; set_currents_rms_prop.set_label("RMS AC current setpoints/s"); set_currents_rms_prop.set_unit("mA"); set_currents_rms_prop.set_format("%6.3"); set_currents_rms_prop.set_description("Statistic when driven by the Libera. One RMS value for every pole\nof the magnet.\nRMS value of the AC setpoint applied on the DAC during the last second.\nX=sqr( (sum(setAC)*sum(setAC)) / n - ((sum(setAC)/n) *(sum(setAC)/n)) )"); set_currents_rms->set_default_properties(set_currents_rms_prop); att_list.push_back(set_currents_rms); // Attribute : SetCurrentsAverage SetCurrentsAverageAttrib *set_currents_average = new SetCurrentsAverageAttrib(); Tango::UserDefaultAttrProp set_currents_average_prop; set_currents_average_prop.set_label("Average AC current setpoints/s"); set_currents_average_prop.set_unit("mA"); set_currents_average_prop.set_format("%6.3"); set_currents_average_prop.set_description("Statistic when driven by the Libera. One average value for every pole\nof the magnet.\nAverage value of the AC setpoint applied on the DAC during the last second."); set_currents_average->set_default_properties(set_currents_average_prop); att_list.push_back(set_currents_average); // Attribute : FramesPerSecond FramesPerSecondAttrib *frames_per_second = new FramesPerSecondAttrib(); Tango::UserDefaultAttrProp frames_per_second_prop; frames_per_second_prop.set_label("Frames per second"); frames_per_second_prop.set_display_unit(" "); frames_per_second_prop.set_format("%6d"); frames_per_second_prop.set_description("Number of settings applied during the last second"); frames_per_second->set_default_properties(frames_per_second_prop); att_list.push_back(frames_per_second); // Attribute : ErrorsPerSecond ErrorsPerSecondAttrib *errors_per_second = new ErrorsPerSecondAttrib(); Tango::UserDefaultAttrProp errors_per_second_prop; errors_per_second_prop.set_label("Errors per second"); errors_per_second_prop.set_display_unit(" "); errors_per_second_prop.set_format("%6d"); errors_per_second_prop.set_description("Errors detected during the last second"); errors_per_second->set_default_properties(errors_per_second_prop); att_list.push_back(errors_per_second); // Attribute : ErrorCounters ErrorCountersAttrib *error_counters = new ErrorCountersAttrib(); Tango::UserDefaultAttrProp error_counters_prop; error_counters_prop.set_label("Error counters"); error_counters_prop.set_unit(" "); error_counters_prop.set_format("%6d"); error_counters_prop.set_description("Statistic when driven by the Libera.\nThe total number of errors since the last reset for the \nthree poles."); error_counters->set_default_properties(error_counters_prop); att_list.push_back(error_counters); // Attribute : LocalControls LocalControlsAttrib *local_controls = new LocalControlsAttrib(); Tango::UserDefaultAttrProp local_controls_prop; local_controls_prop.set_description("Indicated whether the individual channels are in local control mode for the \nAC current control. True = local control activated."); local_controls->set_default_properties(local_controls_prop); att_list.push_back(local_controls); // Attribute : Temperatures TemperaturesAttrib *temperatures = new TemperaturesAttrib(); Tango::UserDefaultAttrProp temperatures_prop; temperatures_prop.set_label("Temperatures"); temperatures_prop.set_unit("C"); temperatures_prop.set_format("%6.0f"); temperatures_prop.set_max_alarm("40"); temperatures_prop.set_description("Temperature measurements for the three poles."); temperatures->set_default_properties(temperatures_prop); temperatures->set_polling_period(30000); att_list.push_back(temperatures); // End of Automatic code generation //------------------------------------------------------------- } //+---------------------------------------------------------------------------- // // method : BiltClass::get_class_property() // // description : Read the class properties from database. // //----------------------------------------------------------------------------- void BiltClass::get_class_property() { // Initialize your default values here (if not done with POGO). //------------------------------------------------------------------ // Read class properties from database.(Automatic code generation) //------------------------------------------------------------------ // Call database and extract values //-------------------------------------------- if (Tango::Util::instance()->_UseDb==true) get_db_class()->get_property(cl_prop); Tango::DbDatum def_prop; int i = -1; // End of Automatic code generation //------------------------------------------------------------------ } //+---------------------------------------------------------------------------- // // method : BiltClass::set_default_property // // description: Set default property (class and device) for wizard. // For each property, add to wizard property name and description // If default value has been set, add it to wizard property and // store it in a DbDatum. // //----------------------------------------------------------------------------- void BiltClass::set_default_property() { string prop_name; string prop_desc; string prop_def; vector vect_data; // Set Default Class Properties // Set Default Device Properties prop_name = "IPAddress"; prop_desc = "IP Address of BILT controller.\nEach controller includes several magnets and\neach magnet includes 3 power supplies,\nfor corrections in the X, Y and Z planes.\n\n"; prop_def = "0.0.0.0"; vect_data.clear(); vect_data.push_back("0.0.0.0"); if (prop_def.length()>0) { Tango::DbDatum data(prop_name); data << vect_data ; dev_def_prop.push_back(data); add_wiz_dev_prop(prop_name, prop_desc, prop_def); } else add_wiz_dev_prop(prop_name, prop_desc); prop_name = "MagnetNumber"; prop_desc = "Magnet number from 1 to 48"; prop_def = "0"; vect_data.clear(); vect_data.push_back("0"); if (prop_def.length()>0) { Tango::DbDatum data(prop_name); data << vect_data ; dev_def_prop.push_back(data); add_wiz_dev_prop(prop_name, prop_desc, prop_def); } else add_wiz_dev_prop(prop_name, prop_desc); prop_name = "UpdatePeriod"; prop_desc = "The update period for the data reading from the power supply in milli seconds."; prop_def = "1000"; vect_data.clear(); vect_data.push_back("1000"); if (prop_def.length()>0) { Tango::DbDatum data(prop_name); data << vect_data ; dev_def_prop.push_back(data); add_wiz_dev_prop(prop_name, prop_desc, prop_def); } else add_wiz_dev_prop(prop_name, prop_desc); } //+---------------------------------------------------------------------------- // // method : BiltClass::write_class_property // // description : Set class description as property in database // //----------------------------------------------------------------------------- void BiltClass::write_class_property() { // First time, check if database used //-------------------------------------------- if (Tango::Util::_UseDb == false) return; Tango::DbData data; string classname = get_name(); string header; string::size_type start, end; // Put title Tango::DbDatum title("ProjectTitle"); string str_title("BILT multi channel power supply"); title << str_title; data.push_back(title); // Put Description Tango::DbDatum description("Description"); vector str_desc; str_desc.push_back("The BILT multi channel power supply will be used with 3 channels for the ESRF fast"); str_desc.push_back("feedback systems."); str_desc.push_back("The power supply can be controlled in 2 ways :"); str_desc.push_back("By this device server for slow or human control or"); str_desc.push_back("by the Libera Beam Position monitors for fast feedback with closed loop control."); str_desc.push_back("The devices are exported as one device per steerer magnet. Every device has three"); str_desc.push_back("channels. The channels (poles) cannot be switched on individually but have their"); str_desc.push_back("individual set points and measurement values."); description << str_desc; data.push_back(description); // put cvs or svn location string filename(classname); filename += "Class.cpp"; // Create a string with the class ID to // get the string into the binary string class_id(ClassId); // check for cvs information string src_path(CvsPath); start = src_path.find("/"); if (start!=string::npos) { end = src_path.find(filename); if (end>start) { string strloc = src_path.substr(start, end-start); // Check if specific repository start = strloc.find("/cvsroot/"); if (start!=string::npos && start>0) { string repository = strloc.substr(0, start); if (repository.find("/segfs/")!=string::npos) strloc = "ESRF:" + strloc.substr(start, strloc.length()-start); } Tango::DbDatum cvs_loc("cvs_location"); cvs_loc << strloc; data.push_back(cvs_loc); } } // check for svn information else { string src_path(SvnPath); start = src_path.find("://"); if (start!=string::npos) { end = src_path.find(filename); if (end>start) { header = "$HeadURL: "; start = header.length(); string strloc = src_path.substr(start, (end-start)); Tango::DbDatum svn_loc("svn_location"); svn_loc << strloc; data.push_back(svn_loc); } } } // Get CVS or SVN revision tag // CVS tag string tagname(TagName); header = "$Name: "; start = header.length(); string endstr(" $"); end = tagname.find(endstr); if (end!=string::npos && end>start) { string strtag = tagname.substr(start, end-start); Tango::DbDatum cvs_tag("cvs_tag"); cvs_tag << strtag; data.push_back(cvs_tag); } // SVN tag string svnpath(SvnPath); header = "$HeadURL: "; start = header.length(); end = svnpath.find(endstr); if (end!=string::npos && end>start) { string strloc = svnpath.substr(start, end-start); string tagstr ("/tags/"); start = strloc.find(tagstr); if ( start!=string::npos ) { start = start + tagstr.length(); end = strloc.find(filename); string strtag = strloc.substr(start, end-start-1); Tango::DbDatum svn_tag("svn_tag"); svn_tag << strtag; data.push_back(svn_tag); } } // Get URL location string httpServ(HttpServer); if (httpServ.length()>0) { Tango::DbDatum db_doc_url("doc_url"); db_doc_url << httpServ; data.push_back(db_doc_url); } // Put inheritance Tango::DbDatum inher_datum("InheritedFrom"); vector inheritance; inheritance.push_back("Device_4Impl"); inher_datum << inheritance; data.push_back(inher_datum); // Call database and and values //-------------------------------------------- get_db_class()->put_property(data); } } // namespace Node-path: powersupply/itest/Bilt/trunk/BiltClass.h Node-kind: file Node-action: change Text-content-length: 13122 Text-content-md5: ee1632399c0200688704be688ac8d3bd Content-length: 13122 //============================================================================= // // file : BiltClass.h // // description : Include for the BiltClass root class. // This class is the singleton class for // the Bilt device class. // It contains all properties and methods which the // Bilt requires only once e.g. the commands. // // project : TANGO Device Server // // $Author: meyer $ // // $Revision: 1.11 $ // $Date: 2010-11-10 14:00:29 $ // // SVN only: // $HeadURL: $ // // CVS only: // $Source: /segfs/tango/cvsroot/cppserver/machine/powersupply/SrSteerers/tango/Bilt/BiltClass.h,v $ // $Log: not supported by cvs2svn $ // Revision 1.10 2010-11-10 11:59:11 meyer // Changed type of Temperatures attribute from long to double. // Added default alarm and polling values. // // Revision 1.9 2010/06/21 07:13:05 meyer // Added a spectrum attribute for the temperature measurements and changed to libMagnet version 1.4. // // Revision 1.8 2010/05/01 16:58:39 meyer // Changed alarm limits for the impedance attribute. // // Revision 1.7 2010-02-12 16:35:13 meyer // Added SetPoleCurrent command again. // // Revision 1.6 2010-02-11 16:35:27 meyer // Currents settings understand NaN values. // Deleted StePoleCurrent command. // // Revision 1.5 2010/02/10 12:27:31 meyer // Restructured Bilt class. // Acquistion is now done by a thread and only the multi channel data // gets exported. A single channel class (BiltCh) was created. // // Revision 1.4 2009/11/27 13:49:26 meyer // Modified structure! The pole is no longer a device. // The device is now a magnet with three poles. // // Revision 1.3 2009/11/26 10:46:58 meyer // Updated for libMagnet_V120 // // Revision 1.2 2009/11/06 12:46:25 meyer // Added impedance attribute and corrected fromatting of attribute values. // // Revision 1.1.1.1 2009/11/04 16:23:02 meyer // Imported using TkCVS // // // copyleft : European Synchrotron Radiation Facility // BP 220, Grenoble 38043 // FRANCE // //============================================================================= // // This file is generated by POGO // (Program Obviously used to Generate tango Object) // // (c) - Software Engineering Group - ESRF //============================================================================= #ifndef _BILTCLASS_H #define _BILTCLASS_H #include #include namespace Bilt_ns {//===================================== // Define classes for attributes //===================================== class TemperaturesAttrib: public Tango::SpectrumAttr { public: TemperaturesAttrib():SpectrumAttr("Temperatures", Tango::DEV_DOUBLE, Tango::READ, 6) {}; ~TemperaturesAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_Temperatures(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_Temperatures_allowed(ty);} }; class LocalControlsAttrib: public Tango::SpectrumAttr { public: LocalControlsAttrib():SpectrumAttr("LocalControls", Tango::DEV_BOOLEAN, Tango::READ, 5) {}; ~LocalControlsAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_LocalControls(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_LocalControls_allowed(ty);} }; class ErrorCountersAttrib: public Tango::SpectrumAttr { public: ErrorCountersAttrib():SpectrumAttr("ErrorCounters", Tango::DEV_ULONG, Tango::READ, 3) {}; ~ErrorCountersAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_ErrorCounters(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_ErrorCounters_allowed(ty);} }; class ErrorsPerSecondAttrib: public Tango::SpectrumAttr { public: ErrorsPerSecondAttrib():SpectrumAttr("ErrorsPerSecond", Tango::DEV_ULONG, Tango::READ, 3) {}; ~ErrorsPerSecondAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_ErrorsPerSecond(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_ErrorsPerSecond_allowed(ty);} }; class FramesPerSecondAttrib: public Tango::SpectrumAttr { public: FramesPerSecondAttrib():SpectrumAttr("FramesPerSecond", Tango::DEV_ULONG, Tango::READ, 3) {}; ~FramesPerSecondAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_FramesPerSecond(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_FramesPerSecond_allowed(ty);} }; class SetCurrentsAverageAttrib: public Tango::SpectrumAttr { public: SetCurrentsAverageAttrib():SpectrumAttr("SetCurrentsAverage", Tango::DEV_DOUBLE, Tango::READ, 3) {}; ~SetCurrentsAverageAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_SetCurrentsAverage(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_SetCurrentsAverage_allowed(ty);} }; class SetCurrentsRMSAttrib: public Tango::SpectrumAttr { public: SetCurrentsRMSAttrib():SpectrumAttr("SetCurrentsRMS", Tango::DEV_DOUBLE, Tango::READ, 3) {}; ~SetCurrentsRMSAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_SetCurrentsRMS(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_SetCurrentsRMS_allowed(ty);} }; class ImpedancesAttrib: public Tango::SpectrumAttr { public: ImpedancesAttrib():SpectrumAttr("Impedances", Tango::DEV_DOUBLE, Tango::READ, 3) {}; ~ImpedancesAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_Impedances(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_Impedances_allowed(ty);} }; class VoltagesAttrib: public Tango::SpectrumAttr { public: VoltagesAttrib():SpectrumAttr("Voltages", Tango::DEV_DOUBLE, Tango::READ, 3) {}; ~VoltagesAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_Voltages(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_Voltages_allowed(ty);} }; class CurrentsAttrib: public Tango::SpectrumAttr { public: CurrentsAttrib():SpectrumAttr("Currents", Tango::DEV_DOUBLE, Tango::READ_WRITE, 3) {}; ~CurrentsAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_Currents(att);} virtual void write(Tango::DeviceImpl *dev,Tango::WAttribute &att) {(static_cast(dev))->write_Currents(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_Currents_allowed(ty);} }; //========================================= // Define classes for commands //========================================= class SetPoleCurrentCmd : public Tango::Command { public: SetPoleCurrentCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out, const char *in_desc, const char *out_desc, Tango::DispLevel level) :Command(name,in,out,in_desc,out_desc, level) {}; SetPoleCurrentCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out) :Command(name,in,out) {}; ~SetPoleCurrentCmd() {}; virtual CORBA::Any *execute (Tango::DeviceImpl *dev, const CORBA::Any &any); virtual bool is_allowed (Tango::DeviceImpl *dev, const CORBA::Any &any) {return (static_cast(dev))->is_SetPoleCurrent_allowed(any);} }; class SetpointCheckCmd : public Tango::Command { public: SetpointCheckCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out, const char *in_desc, const char *out_desc, Tango::DispLevel level) :Command(name,in,out,in_desc,out_desc, level) {}; SetpointCheckCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out) :Command(name,in,out) {}; ~SetpointCheckCmd() {}; virtual CORBA::Any *execute (Tango::DeviceImpl *dev, const CORBA::Any &any); virtual bool is_allowed (Tango::DeviceImpl *dev, const CORBA::Any &any) {return (static_cast(dev))->is_SetpointCheck_allowed(any);} }; class LocalPoleControlCmd : public Tango::Command { public: LocalPoleControlCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out, const char *in_desc, const char *out_desc, Tango::DispLevel level) :Command(name,in,out,in_desc,out_desc, level) {}; LocalPoleControlCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out) :Command(name,in,out) {}; ~LocalPoleControlCmd() {}; virtual CORBA::Any *execute (Tango::DeviceImpl *dev, const CORBA::Any &any); virtual bool is_allowed (Tango::DeviceImpl *dev, const CORBA::Any &any) {return (static_cast(dev))->is_LocalPoleControl_allowed(any);} }; class SetPoleAcCurrentCmd : public Tango::Command { public: SetPoleAcCurrentCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out, const char *in_desc, const char *out_desc, Tango::DispLevel level) :Command(name,in,out,in_desc,out_desc, level) {}; SetPoleAcCurrentCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out) :Command(name,in,out) {}; ~SetPoleAcCurrentCmd() {}; virtual CORBA::Any *execute (Tango::DeviceImpl *dev, const CORBA::Any &any); virtual bool is_allowed (Tango::DeviceImpl *dev, const CORBA::Any &any) {return (static_cast(dev))->is_SetPoleAcCurrent_allowed(any);} }; class ResetCmd : public Tango::Command { public: ResetCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out, const char *in_desc, const char *out_desc, Tango::DispLevel level) :Command(name,in,out,in_desc,out_desc, level) {}; ResetCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out) :Command(name,in,out) {}; ~ResetCmd() {}; virtual CORBA::Any *execute (Tango::DeviceImpl *dev, const CORBA::Any &any); virtual bool is_allowed (Tango::DeviceImpl *dev, const CORBA::Any &any) {return (static_cast(dev))->is_Reset_allowed(any);} }; class OffCmd : public Tango::Command { public: OffCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out, const char *in_desc, const char *out_desc, Tango::DispLevel level) :Command(name,in,out,in_desc,out_desc, level) {}; OffCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out) :Command(name,in,out) {}; ~OffCmd() {}; virtual CORBA::Any *execute (Tango::DeviceImpl *dev, const CORBA::Any &any); virtual bool is_allowed (Tango::DeviceImpl *dev, const CORBA::Any &any) {return (static_cast(dev))->is_Off_allowed(any);} }; class OnCmd : public Tango::Command { public: OnCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out, const char *in_desc, const char *out_desc, Tango::DispLevel level) :Command(name,in,out,in_desc,out_desc, level) {}; OnCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out) :Command(name,in,out) {}; ~OnCmd() {}; virtual CORBA::Any *execute (Tango::DeviceImpl *dev, const CORBA::Any &any); virtual bool is_allowed (Tango::DeviceImpl *dev, const CORBA::Any &any) {return (static_cast(dev))->is_On_allowed(any);} }; // // The BiltClass singleton definition // class #ifdef _TG_WINDOWS_ __declspec(dllexport) #endif BiltClass : public Tango::DeviceClass { public: // properties member data // add your own data members here //------------------------------------ public: Tango::DbData cl_prop; Tango::DbData cl_def_prop; Tango::DbData dev_def_prop; // Method prototypes static BiltClass *init(const char *); static BiltClass *instance(); ~BiltClass(); Tango::DbDatum get_class_property(string &); Tango::DbDatum get_default_device_property(string &); Tango::DbDatum get_default_class_property(string &); protected: BiltClass(string &); static BiltClass *_instance; void command_factory(); void get_class_property(); void attribute_factory(vector &); void write_class_property(); void set_default_property(); string get_cvstag(); string get_cvsroot(); private: void device_factory(const Tango::DevVarStringArray *); }; } // namespace Bilt_ns #endif // _BILTCLASS_H Node-path: powersupply/itest/Bilt/trunk/BiltStateMachine.cpp Node-kind: file Node-action: change Text-content-length: 10277 Text-content-md5: 80e2d67dd9ee76150adcc5f5eac6e242 Content-length: 10277 static const char *RcsId = "$Id $"; //+============================================================================= // // file : BiltStateMachine.cpp // // description : C++ source for the Bilt and its alowed // methods for commands and attributes // // project : TANGO Device Server // // $Author: meyer $ // // $Revision: 1.11 $ // $Date: 2010-11-10 14:00:29 $ // // SVN only: // $HeadURL: $ // // CVS only: // $Source: /segfs/tango/cvsroot/cppserver/machine/powersupply/SrSteerers/tango/Bilt/BiltStateMachine.cpp,v $ // $Log: not supported by cvs2svn $ // Revision 1.10 2010-11-10 11:59:11 meyer // Changed type of Temperatures attribute from long to double. // Added default alarm and polling values. // // Revision 1.9 2010/06/21 07:13:05 meyer // Added a spectrum attribute for the temperature measurements and changed to libMagnet version 1.4. // // Revision 1.8 2010/05/01 16:58:39 meyer // Changed alarm limits for the impedance attribute. // // Revision 1.7 2010-02-12 16:35:13 meyer // Added SetPoleCurrent command again. // // Revision 1.6 2010-02-11 16:35:27 meyer // Currents settings understand NaN values. // Deleted StePoleCurrent command. // // Revision 1.5 2010/02/10 12:27:31 meyer // Restructured Bilt class. // Acquistion is now done by a thread and only the multi channel data // gets exported. A single channel class (BiltCh) was created. // // Revision 1.4 2009/11/27 13:49:26 meyer // Modified structure! The pole is no longer a device. // The device is now a magnet with three poles. // // Revision 1.3 2009/11/26 10:46:58 meyer // Updated for libMagnet_V120 // // Revision 1.2 2009/11/06 12:46:25 meyer // Added impedance attribute and corrected fromatting of attribute values. // // Revision 1.1.1.1 2009/11/04 16:23:02 meyer // Imported using TkCVS // // // copyleft : European Synchrotron Radiation Facility // BP 220, Grenoble 38043 // FRANCE // //-============================================================================= // // This file is generated by POGO // (Program Obviously used to Generate tango Object) // // (c) - Software Engineering Group - ESRF //============================================================================= #include #include #include /*==================================================================== * This file contains the methods to allow commands and attributes * read or write execution. * * If you wand to add your own code, add it between * the "End/Re-Start of Generated Code" comments. * * If you want, you can also add your own methods. *==================================================================== */ namespace Bilt_ns { //================================================= // Attributes Allowed Methods //================================================= //+---------------------------------------------------------------------------- // // method : Bilt::is_Voltages_allowed // // description : Read/Write allowed for Voltages attribute. // //----------------------------------------------------------------------------- bool Bilt::is_Voltages_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_Impedances_allowed // // description : Read/Write allowed for Impedances attribute. // //----------------------------------------------------------------------------- bool Bilt::is_Impedances_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_SetCurrentsRMS_allowed // // description : Read/Write allowed for SetCurrentsRMS attribute. // //----------------------------------------------------------------------------- bool Bilt::is_SetCurrentsRMS_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_SetCurrentsAverage_allowed // // description : Read/Write allowed for SetCurrentsAverage attribute. // //----------------------------------------------------------------------------- bool Bilt::is_SetCurrentsAverage_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_ErrorCounters_allowed // // description : Read/Write allowed for ErrorCounters attribute. // //----------------------------------------------------------------------------- bool Bilt::is_ErrorCounters_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_LocalControls_allowed // // description : Read/Write allowed for LocalControls attribute. // //----------------------------------------------------------------------------- bool Bilt::is_LocalControls_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_Currents_allowed // // description : Read/Write allowed for Currents attribute. // //----------------------------------------------------------------------------- bool Bilt::is_Currents_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_FramesPerSecond_allowed // // description : Read/Write allowed for FramesPerSecond attribute. // //----------------------------------------------------------------------------- bool Bilt::is_FramesPerSecond_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_ErrorsPerSecond_allowed // // description : Read/Write allowed for ErrorsPerSecond attribute. // //----------------------------------------------------------------------------- bool Bilt::is_ErrorsPerSecond_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_Temperatures_allowed // // description : Read/Write allowed for Temperatures attribute. // //----------------------------------------------------------------------------- bool Bilt::is_Temperatures_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //================================================= // Commands Allowed Methods //================================================= //+---------------------------------------------------------------------------- // // method : Bilt::is_On_allowed // // description : Execution allowed for On command. // //----------------------------------------------------------------------------- bool Bilt::is_On_allowed(const CORBA::Any &any) { if (get_state() == Tango::ON || get_state() == Tango::FAULT || get_state() == Tango::ALARM || get_state() == Tango::UNKNOWN) { // End of Generated Code // Re-Start of Generated Code return false; } return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_Off_allowed // // description : Execution allowed for Off command. // //----------------------------------------------------------------------------- bool Bilt::is_Off_allowed(const CORBA::Any &any) { if (get_state() == Tango::OFF) { // End of Generated Code // Re-Start of Generated Code return false; } return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_Reset_allowed // // description : Execution allowed for Reset command. // //----------------------------------------------------------------------------- bool Bilt::is_Reset_allowed(const CORBA::Any &any) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_SetPoleAcCurrent_allowed // // description : Execution allowed for SetPoleAcCurrent command. // //----------------------------------------------------------------------------- bool Bilt::is_SetPoleAcCurrent_allowed(const CORBA::Any &any) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_LocalPoleControl_allowed // // description : Execution allowed for LocalPoleControl command. // //----------------------------------------------------------------------------- bool Bilt::is_LocalPoleControl_allowed(const CORBA::Any &any) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_SetpointCheck_allowed // // description : Execution allowed for SetpointCheck command. // //----------------------------------------------------------------------------- bool Bilt::is_SetpointCheck_allowed(const CORBA::Any &any) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_SetPoleCurrent_allowed // // description : Execution allowed for SetPoleCurrent command. // //----------------------------------------------------------------------------- bool Bilt::is_SetPoleCurrent_allowed(const CORBA::Any &any) { // End of Generated Code // Re-Start of Generated Code return true; } } // namespace Bilt_ns Revision-number: 63 Prop-content-length: 147 Content-length: 147 K 8 svn:date V 27 2010-11-10T14:00:30.000000Z K 7 svn:log V 73 This commit was manufactured by cvs2svn to create tag 'Bilt-Release_3_5'. PROPS-END Node-path: powersupply/itest/Bilt/tags/Bilt-Release_3_5 Node-kind: dir Node-action: add Node-copyfrom-rev: 62 Node-copyfrom-path: powersupply/itest/Bilt/trunk Revision-number: 64 Prop-content-length: 123 Content-length: 123 K 10 svn:author V 5 meyer K 8 svn:date V 27 2010-11-10T14:01:42.000000Z K 7 svn:log V 23 changed version to 1.6 PROPS-END Node-path: powersupply/itest/BiltCh/trunk/Makefile Node-kind: file Node-action: change Text-content-length: 5390 Text-content-md5: 1ba7dd27bac47d9a49bcafe020a2f83b Content-length: 5390 #============================================================================= # # file : Makefile # # description : Include for the BiltCh class. # # project : Makefile to generate a Tango server # # $Author: meyer $ # # $Revision: 1.7 $ # # $Log: not supported by cvs2svn $ # Revision 1.6 2010-11-10 12:02:59 meyer # Changed version to 1.5 # # Revision 1.5 2010/06/21 07:17:48 meyer # Changed version to 1.4 # # Revision 1.4 2010/05/01 16:26:01 meyer # Changed version to 1.3 # # Revision 1.3 2010/03/19 15:28:01 meyer # Canged to version 1.1 # # Revision 1.2 2010-02-11 16:36:31 meyer # Currents attribute of Bilt understand NaN values now. # # Revision 1.1.1.1 2010-02-10 11:49:21 meyer # Imported using TkCVS # # # copyleft : European Synchrotron Radiation Facility # BP 220, Grenoble 38043 # FRANCE # #============================================================================= # This file is generated by POGO # (Program Obviously used to Generate tango Object) # # (c) - Software Engineering Group - ESRF #============================================================================= # CLASS = BiltCh MAJOR_VERS = 1 MINOR_VERS = 6 RELEASE = Release_$(MAJOR_VERS)_$(MINOR_VERS) OS = $(shell /csadmin/common/scripts/get_os) PROCESSOR = $(shell uname -p) #----------------------------------------- # Set default home directories #----------------------------------------- TANGO_HOME = /segfs/tango/release/$(BIN_DIR) CPP_SERVERS = $(TANGO_HOME)/classes ifdef no_debug DEBUG = -O else DEBUG = -g endif ifdef _solaris CC = CC BIN_DIR=$(OS)_CC AR_SL = $(CC) -mt -G VERS_OPT = -h SL_EXT = so endif ifdef linux CC = c++ CC_SHLIB = $(CC) -fPIC $(PROCESSOR)=1 ifdef x86_64 NBITS=_64 endif BIN_DIR=$(OS)$(NBITS) AR_SL = $(CC) -fPIC -shared SL_EXT = so VERS_OPT = -Wl,-soname, endif INCLUDE_DIRS = -I$(TANGO_HOME)/include -I. \ -I$(CPP_SERVERS)/include OBJS_DIR = obj/$(BIN_DIR) LIB_DIRS = -L $(CPP_SERVERS)/lib \ -L $(TANGO_HOME)/lib \ TARGET_LIB = $(CPP_SERVERS)/lib/libtgclasses.a #----------------------------------------- # Set CXXFLAGS and LFLAGS #----------------------------------------- ifdef _solaris CXXFLAGS = $(DEBUG) -mt -D_PTHREADS $(INCLUDE_DIRS) LFLAGS = $(DEBUG) $(LIB_DIRS) \ -ltango \ -llog4tango \ -lomniORB4 \ -lomniDynamic4 \ -lomnithread \ -lCOS4 \ -lpthread \ -lposix4 -lsocket -lnsl endif ifdef linux CXXFLAGS = -g -D_REENTRANT $(INCLUDE_DIRS) LFLAGS = $(DEBUG) $(LIB_DIRS) \ -ltango \ -llog4tango \ -lomniORB4 \ -lomniDynamic4 \ -lomnithread \ -lCOS4 \ -ldl -lpthread endif #----------------------------------------- # Set dependences #----------------------------------------- SVC_OBJS = $(OBJS_DIR)/$(CLASS).o \ $(OBJS_DIR)/$(CLASS)StateMachine.o \ $(OBJS_DIR)/$(CLASS)Class.o \ $(OBJS_DIR)/ClassFactory.o \ $(OBJS_DIR)/main.o SHLIB_OBJS = $(OBJS_DIR)/$(CLASS)Class.so.o \ $(OBJS_DIR)/$(CLASS)StateMachine.so.o \ $(OBJS_DIR)/$(CLASS).so.o SVC_INC = $(CLASS)Class.h \ $(CLASS).h $(OBJS_DIR)/%.o: %.cpp $(SVC_INC) $(CC) $(CXXFLAGS) -c $< -o $(OBJS_DIR)/$*.o $(OBJS_DIR)/%.so.o: %.cpp $(SVC_INC) $(CC_SHLIB) $(CXXFLAGS) -c $< -o $(OBJS_DIR)/$*.so.o #----------------------------------------- # Make Entry #----------------------------------------- all: $(CLASS) $(CLASS): make_obj_dir make_bin_dir $(SVC_OBJS) $(CC) $(SVC_OBJS) -o $(CLASS) $(LFLAGS) @mv $(CLASS) bin/$(BIN_DIR)/$(CLASS) shlib: make_obj_dir make_shlib_dir $(SHLIB_OBJS) $(AR_SL) -o \ shlib/$(BIN_DIR)/$(CLASS).$(SL_EXT).$(MAJOR_VERS).$(MINOR_VERS) \ $(VERS_OPT)$(CLASS).$(SL_EXT).$(MAJOR_VERS) \ $(SHLIB_OBJS) $(LFLAGS) @rm -f shlib/$(BIN_DIR)/$(CLASS).$(SL_EXT) @cd shlib/$(BIN_DIR); \ ln -s $(CLASS).$(SL_EXT).$(MAJOR_VERS).$(MINOR_VERS) $(CLASS).$(SL_EXT) clean: rm -f $(OBJS_DIR)/*.o \ $(OBJS_DIR)/*.so.o \ bin/$(BIN_DIR)/$(CLASS) \ core make_obj_dir: @mkdir -p obj @mkdir -p obj/$(BIN_DIR) make_bin_dir: @mkdir -p bin @mkdir -p bin/$(BIN_DIR) make_shlib_dir: @mkdir -p shlib @mkdir -p shlib/$(BIN_DIR) #----------------------------------------- # Install binary file #----------------------------------------- install: cp bin/$(BIN_DIR)/$(CLASS) $(CPP_SERVERS)/bin #----------------------------------------- # Update class library and header files # recompile without debug mode. #----------------------------------------- lib: clean @make no_debug=1 cp *.h $(CPP_SERVERS)/include ar ruv $(TARGET_LIB) $(OBJS_DIR)/$(CLASS).o ar ruv $(TARGET_LIB) $(OBJS_DIR)/$(CLASS)Class.o ar ruv $(TARGET_LIB) $(OBJS_DIR)/$(CLASS)StateMachine.o ident $(TARGET_LIB) | grep $(CLASS) #------------------------------------------------------ # Tag the CVS/SVN module corresponding to this class # copy cvs_tag or svn_tag to tag: entry #------------------------------------------------------ #svn_tag: # svn copy ../trunk ../tags/$(RELEASE) # svn commit ../tags/$(RELEASE) \ # -m "Tagging the $(RELEASE) of the $(CLASS) project." # #cvs_tag: # @cvstag "$(CLASS)-$(RELEASE)" # @make $(CLASS) # @make show_tag #show_cvs_tag: # @cvstag -d # # Only these make options work with the current Pogo version 5.3.x! tag: @cvstag "$(CLASS)-$(RELEASE)" @make $(CLASS) @make show_tag show_tag: @cvstag -d Revision-number: 65 Prop-content-length: 149 Content-length: 149 K 8 svn:date V 27 2010-11-10T14:01:43.000000Z K 7 svn:log V 75 This commit was manufactured by cvs2svn to create tag 'BiltCh-Release_1_6'. PROPS-END Node-path: powersupply/itest/BiltCh/tags/BiltCh-Release_1_6 Node-kind: dir Node-action: add Node-copyfrom-rev: 64 Node-copyfrom-path: powersupply/itest/BiltCh/trunk Revision-number: 66 Prop-content-length: 143 Content-length: 143 K 10 svn:author V 5 meyer K 8 svn:date V 27 2010-11-16T08:50:37.000000Z K 7 svn:log V 43 Changed temperature alarm from 40 to 40 C. PROPS-END Node-path: powersupply/itest/Bilt/trunk/BiltClass.cpp Node-kind: file Node-action: change Text-content-length: 27970 Text-content-md5: f4c02a864336ee3af2ee67990df9185f Content-length: 27970 static const char *ClassId = "$Id: BiltClass.cpp,v 1.17 2010-11-16 08:50:37 meyer Exp $"; static const char *TagName = "$Name: not supported by cvs2svn $"; static const char *CvsPath = "$Source: /segfs/tango/cvsroot/cppserver/machine/powersupply/SrSteerers/tango/Bilt/BiltClass.cpp,v $"; static const char *SvnPath = "$HeadURL: $"; static const char *HttpServer = "http://www.esrf.fr/computing/cs/tango/tango_doc/ds_doc/"; //+============================================================================= // // file : BiltClass.cpp // // description : C++ source for the BiltClass. A singleton // class derived from DeviceClass. It implements the // command list and all properties and methods required // by the Bilt once per process. // // project : TANGO Device Server // // $Author: meyer $ // // $Revision: 1.17 $ // // $Log: not supported by cvs2svn $ // Revision 1.16 2010/11/10 14:00:29 meyer // Changed unit of AC RMS and average value from A to mA. // // Revision 1.15 2010-11-10 11:59:11 meyer // Changed type of Temperatures attribute from long to double. // Added default alarm and polling values. // // Revision 1.14 2010/06/24 11:43:10 meyer // Corrected memory leak when the reconnection to the power supply fails. // // Revision 1.13 2010/06/21 07:13:05 meyer // Added a spectrum attribute for the temperature measurements and changed to libMagnet version 1.4. // // Revision 1.12 2010/05/01 16:58:39 meyer // Changed alarm limits for the impedance attribute. // // Revision 1.11 2010/03/16 15:03:33 meyer // Excluded Steerer class. // // Revision 1.10 2010-02-12 16:35:13 meyer // Added SetPoleCurrent command again. // // Revision 1.9 2010-02-11 16:35:27 meyer // Currents settings understand NaN values. // Deleted StePoleCurrent command. // // Revision 1.8 2010/02/10 16:22:15 meyer // Release_3_0 // // Revision 1.7 2010/02/10 12:27:31 meyer // Restructured Bilt class. // Acquistion is now done by a thread and only the multi channel data // gets exported. A single channel class (BiltCh) was created. // // Revision 1.6 2009/12/18 12:02:18 meyer // Changed version number to 2.1 // // Revision 1.5 2009/11/27 13:49:26 meyer // Modified structure! The pole is no longer a device. // The device is now a magnet with three poles. // // Revision 1.4 2009/11/26 10:46:58 meyer // Updated for libMagnet_V120 // // Revision 1.3 2009/11/23 16:46:58 meyer // Corrected state, status and exception handling // // Revision 1.2 2009/11/06 12:46:25 meyer // Added impedance attribute and corrected fromatting of attribute values. // // Revision 1.1.1.1 2009/11/04 16:23:02 meyer // Imported using TkCVS // // // copyleft : European Synchrotron Radiation Facility // BP 220, Grenoble 38043 // FRANCE // //-============================================================================= // // This file is generated by POGO // (Program Obviously used to Generate tango Object) // // (c) - Software Engineering Group - ESRF //============================================================================= #include #include #include //+---------------------------------------------------------------------------- /** * Create BiltClass singleton and return it in a C function for Python usage */ //+---------------------------------------------------------------------------- extern "C" { #ifdef WIN32 __declspec(dllexport) #endif Tango::DeviceClass *_create_Bilt_class(const char *name) { return Bilt_ns::BiltClass::init(name); } } namespace Bilt_ns { //+---------------------------------------------------------------------------- // // method : SetPoleCurrentCmd::execute() // // description : method to trigger the execution of the command. // PLEASE DO NOT MODIFY this method core without pogo // // in : - device : The device on which the command must be executed // - in_any : The command input data // // returns : The command output data (packed in the Any object) // //----------------------------------------------------------------------------- CORBA::Any *SetPoleCurrentCmd::execute(Tango::DeviceImpl *device,const CORBA::Any &in_any) { cout2 << "SetPoleCurrentCmd::execute(): arrived" << endl; const Tango::DevVarDoubleArray *argin; extract(in_any, argin); ((static_cast(device))->set_pole_current(argin)); return new CORBA::Any(); } //+---------------------------------------------------------------------------- // // method : SetpointCheckCmd::execute() // // description : method to trigger the execution of the command. // PLEASE DO NOT MODIFY this method core without pogo // // in : - device : The device on which the command must be executed // - in_any : The command input data // // returns : The command output data (packed in the Any object) // //----------------------------------------------------------------------------- CORBA::Any *SetpointCheckCmd::execute(Tango::DeviceImpl *device,const CORBA::Any &in_any) { cout2 << "SetpointCheckCmd::execute(): arrived" << endl; const Tango::DevVarDoubleArray *argin; extract(in_any, argin); return insert((static_cast(device))->setpoint_check(argin)); } //+---------------------------------------------------------------------------- // // method : LocalPoleControlCmd::execute() // // description : method to trigger the execution of the command. // PLEASE DO NOT MODIFY this method core without pogo // // in : - device : The device on which the command must be executed // - in_any : The command input data // // returns : The command output data (packed in the Any object) // //----------------------------------------------------------------------------- CORBA::Any *LocalPoleControlCmd::execute(Tango::DeviceImpl *device,const CORBA::Any &in_any) { cout2 << "LocalPoleControlCmd::execute(): arrived" << endl; const Tango::DevVarShortArray *argin; extract(in_any, argin); ((static_cast(device))->local_pole_control(argin)); return new CORBA::Any(); } //+---------------------------------------------------------------------------- // // method : SetPoleAcCurrentCmd::execute() // // description : method to trigger the execution of the command. // PLEASE DO NOT MODIFY this method core without pogo // // in : - device : The device on which the command must be executed // - in_any : The command input data // // returns : The command output data (packed in the Any object) // //----------------------------------------------------------------------------- CORBA::Any *SetPoleAcCurrentCmd::execute(Tango::DeviceImpl *device,const CORBA::Any &in_any) { cout2 << "SetPoleAcCurrentCmd::execute(): arrived" << endl; const Tango::DevVarDoubleArray *argin; extract(in_any, argin); ((static_cast(device))->set_pole_ac_current(argin)); return new CORBA::Any(); } //+---------------------------------------------------------------------------- // // method : OnCmd::execute() // // description : method to trigger the execution of the command. // PLEASE DO NOT MODIFY this method core without pogo // // in : - device : The device on which the command must be executed // - in_any : The command input data // // returns : The command output data (packed in the Any object) // //----------------------------------------------------------------------------- CORBA::Any *OnCmd::execute(Tango::DeviceImpl *device,const CORBA::Any &in_any) { cout2 << "OnCmd::execute(): arrived" << endl; ((static_cast(device))->on()); return new CORBA::Any(); } //+---------------------------------------------------------------------------- // // method : OffCmd::execute() // // description : method to trigger the execution of the command. // PLEASE DO NOT MODIFY this method core without pogo // // in : - device : The device on which the command must be executed // - in_any : The command input data // // returns : The command output data (packed in the Any object) // //----------------------------------------------------------------------------- CORBA::Any *OffCmd::execute(Tango::DeviceImpl *device,const CORBA::Any &in_any) { cout2 << "OffCmd::execute(): arrived" << endl; ((static_cast(device))->off()); return new CORBA::Any(); } //+---------------------------------------------------------------------------- // // method : ResetCmd::execute() // // description : method to trigger the execution of the command. // PLEASE DO NOT MODIFY this method core without pogo // // in : - device : The device on which the command must be executed // - in_any : The command input data // // returns : The command output data (packed in the Any object) // //----------------------------------------------------------------------------- CORBA::Any *ResetCmd::execute(Tango::DeviceImpl *device,const CORBA::Any &in_any) { cout2 << "ResetCmd::execute(): arrived" << endl; ((static_cast(device))->reset()); return new CORBA::Any(); } // //---------------------------------------------------------------- // Initialize pointer for singleton pattern //---------------------------------------------------------------- // BiltClass *BiltClass::_instance = NULL; //+---------------------------------------------------------------------------- // // method : BiltClass::BiltClass(string &s) // // description : constructor for the BiltClass // // in : - s : The class name // //----------------------------------------------------------------------------- BiltClass::BiltClass(string &s):DeviceClass(s) { cout2 << "Entering BiltClass constructor" << endl; set_default_property(); get_class_property(); write_class_property(); cout2 << "Leaving BiltClass constructor" << endl; } //+---------------------------------------------------------------------------- // // method : BiltClass::~BiltClass() // // description : destructor for the BiltClass // //----------------------------------------------------------------------------- BiltClass::~BiltClass() { _instance = NULL; } //+---------------------------------------------------------------------------- // // method : BiltClass::instance // // description : Create the object if not already done. Otherwise, just // return a pointer to the object // // in : - name : The class name // //----------------------------------------------------------------------------- BiltClass *BiltClass::init(const char *name) { if (_instance == NULL) { try { string s(name); _instance = new BiltClass(s); } catch (bad_alloc) { throw; } } return _instance; } BiltClass *BiltClass::instance() { if (_instance == NULL) { cerr << "Class is not initialised !!" << endl; exit(-1); } return _instance; } //+---------------------------------------------------------------------------- // // method : BiltClass::command_factory // // description : Create the command object(s) and store them in the // command list // //----------------------------------------------------------------------------- void BiltClass::command_factory() { command_list.push_back(new OnCmd("On", Tango::DEV_VOID, Tango::DEV_VOID, "", "", Tango::OPERATOR)); command_list.push_back(new OffCmd("Off", Tango::DEV_VOID, Tango::DEV_VOID, "", "", Tango::OPERATOR)); command_list.push_back(new ResetCmd("Reset", Tango::DEV_VOID, Tango::DEV_VOID, "", "", Tango::OPERATOR)); command_list.push_back(new SetPoleAcCurrentCmd("SetPoleAcCurrent", Tango::DEVVAR_DOUBLEARRAY, Tango::DEV_VOID, "[0] = pole number, [1] = current", "", Tango::OPERATOR)); command_list.push_back(new LocalPoleControlCmd("LocalPoleControl", Tango::DEVVAR_SHORTARRAY, Tango::DEV_VOID, "[0] = pole number, [1] = local control true/false", "", Tango::OPERATOR)); command_list.push_back(new SetpointCheckCmd("SetpointCheck", Tango::DEVVAR_DOUBLEARRAY, Tango::DEV_BOOLEAN, "Setpoint values for the Poles", "true when settings are OK", Tango::OPERATOR)); command_list.push_back(new SetPoleCurrentCmd("SetPoleCurrent", Tango::DEVVAR_DOUBLEARRAY, Tango::DEV_VOID, "[0] = pole number, [1] = current", "", Tango::OPERATOR)); // add polling if any for (unsigned int i=0 ; ilength() ; i++) { cout4 << "Device name : " << (*devlist_ptr)[i].in() << endl; // Create devices and add it into the device list //---------------------------------------------------- device_list.push_back(new Bilt(this, (*devlist_ptr)[i])); // Export device to the outside world // Check before if database used. //--------------------------------------------- if ((Tango::Util::_UseDb == true) && (Tango::Util::_FileDb == false)) export_device(device_list.back()); else export_device(device_list.back(), (*devlist_ptr)[i]); } // End of Automatic code generation //------------------------------------------------------------- } //+---------------------------------------------------------------------------- // Method: BiltClass::attribute_factory(vector &att_list) //----------------------------------------------------------------------------- void BiltClass::attribute_factory(vector &att_list) { // Attribute : Currents CurrentsAttrib *currents = new CurrentsAttrib(); Tango::UserDefaultAttrProp currents_prop; currents_prop.set_label("Currents"); currents_prop.set_unit("A"); currents_prop.set_format("%6.4f"); currents_prop.set_max_value("1.8"); currents_prop.set_min_value("-1.8"); currents_prop.set_description("The measured currents of the three poles."); currents->set_default_properties(currents_prop); att_list.push_back(currents); // Attribute : Voltages VoltagesAttrib *voltages = new VoltagesAttrib(); Tango::UserDefaultAttrProp voltages_prop; voltages_prop.set_label("Voltages"); voltages_prop.set_unit("V"); voltages_prop.set_format("%6.4"); voltages_prop.set_description("The measured voltages of the three poles."); voltages->set_default_properties(voltages_prop); att_list.push_back(voltages); // Attribute : Impedances ImpedancesAttrib *impedances = new ImpedancesAttrib(); Tango::UserDefaultAttrProp impedances_prop; impedances_prop.set_label("Impedances"); impedances_prop.set_unit("Ohm"); impedances_prop.set_format("%4.2f"); impedances_prop.set_max_alarm("5.0"); impedances_prop.set_min_alarm("2.8"); impedances_prop.set_description("Calculated impedances for the three poles."); impedances->set_default_properties(impedances_prop); impedances->set_polling_period(3000); att_list.push_back(impedances); // Attribute : SetCurrentsRMS SetCurrentsRMSAttrib *set_currents_rms = new SetCurrentsRMSAttrib(); Tango::UserDefaultAttrProp set_currents_rms_prop; set_currents_rms_prop.set_label("RMS AC current setpoints/s"); set_currents_rms_prop.set_unit("mA"); set_currents_rms_prop.set_format("%6.3"); set_currents_rms_prop.set_description("Statistic when driven by the Libera. One RMS value for every pole\nof the magnet.\nRMS value of the AC setpoint applied on the DAC during the last second.\nX=sqr( (sum(setAC)*sum(setAC)) / n - ((sum(setAC)/n) *(sum(setAC)/n)) )"); set_currents_rms->set_default_properties(set_currents_rms_prop); att_list.push_back(set_currents_rms); // Attribute : SetCurrentsAverage SetCurrentsAverageAttrib *set_currents_average = new SetCurrentsAverageAttrib(); Tango::UserDefaultAttrProp set_currents_average_prop; set_currents_average_prop.set_label("Average AC current setpoints/s"); set_currents_average_prop.set_unit("mA"); set_currents_average_prop.set_format("%6.3"); set_currents_average_prop.set_description("Statistic when driven by the Libera. One average value for every pole\nof the magnet.\nAverage value of the AC setpoint applied on the DAC during the last second."); set_currents_average->set_default_properties(set_currents_average_prop); att_list.push_back(set_currents_average); // Attribute : FramesPerSecond FramesPerSecondAttrib *frames_per_second = new FramesPerSecondAttrib(); Tango::UserDefaultAttrProp frames_per_second_prop; frames_per_second_prop.set_label("Frames per second"); frames_per_second_prop.set_display_unit(" "); frames_per_second_prop.set_format("%6d"); frames_per_second_prop.set_description("Number of settings applied during the last second"); frames_per_second->set_default_properties(frames_per_second_prop); att_list.push_back(frames_per_second); // Attribute : ErrorsPerSecond ErrorsPerSecondAttrib *errors_per_second = new ErrorsPerSecondAttrib(); Tango::UserDefaultAttrProp errors_per_second_prop; errors_per_second_prop.set_label("Errors per second"); errors_per_second_prop.set_display_unit(" "); errors_per_second_prop.set_format("%6d"); errors_per_second_prop.set_description("Errors detected during the last second"); errors_per_second->set_default_properties(errors_per_second_prop); att_list.push_back(errors_per_second); // Attribute : ErrorCounters ErrorCountersAttrib *error_counters = new ErrorCountersAttrib(); Tango::UserDefaultAttrProp error_counters_prop; error_counters_prop.set_label("Error counters"); error_counters_prop.set_unit(" "); error_counters_prop.set_format("%6d"); error_counters_prop.set_description("Statistic when driven by the Libera.\nThe total number of errors since the last reset for the \nthree poles."); error_counters->set_default_properties(error_counters_prop); att_list.push_back(error_counters); // Attribute : LocalControls LocalControlsAttrib *local_controls = new LocalControlsAttrib(); Tango::UserDefaultAttrProp local_controls_prop; local_controls_prop.set_description("Indicated whether the individual channels are in local control mode for the \nAC current control. True = local control activated."); local_controls->set_default_properties(local_controls_prop); att_list.push_back(local_controls); // Attribute : Temperatures TemperaturesAttrib *temperatures = new TemperaturesAttrib(); Tango::UserDefaultAttrProp temperatures_prop; temperatures_prop.set_label("Temperatures"); temperatures_prop.set_unit("C"); temperatures_prop.set_format("%6.0f"); temperatures_prop.set_max_alarm("45"); temperatures_prop.set_description("Temperature measurements for the three poles."); temperatures->set_default_properties(temperatures_prop); temperatures->set_polling_period(30000); att_list.push_back(temperatures); // End of Automatic code generation //------------------------------------------------------------- } //+---------------------------------------------------------------------------- // // method : BiltClass::get_class_property() // // description : Read the class properties from database. // //----------------------------------------------------------------------------- void BiltClass::get_class_property() { // Initialize your default values here (if not done with POGO). //------------------------------------------------------------------ // Read class properties from database.(Automatic code generation) //------------------------------------------------------------------ // Call database and extract values //-------------------------------------------- if (Tango::Util::instance()->_UseDb==true) get_db_class()->get_property(cl_prop); Tango::DbDatum def_prop; int i = -1; // End of Automatic code generation //------------------------------------------------------------------ } //+---------------------------------------------------------------------------- // // method : BiltClass::set_default_property // // description: Set default property (class and device) for wizard. // For each property, add to wizard property name and description // If default value has been set, add it to wizard property and // store it in a DbDatum. // //----------------------------------------------------------------------------- void BiltClass::set_default_property() { string prop_name; string prop_desc; string prop_def; vector vect_data; // Set Default Class Properties // Set Default Device Properties prop_name = "IPAddress"; prop_desc = "IP Address of BILT controller.\nEach controller includes several magnets and\neach magnet includes 3 power supplies,\nfor corrections in the X, Y and Z planes.\n\n"; prop_def = "0.0.0.0"; vect_data.clear(); vect_data.push_back("0.0.0.0"); if (prop_def.length()>0) { Tango::DbDatum data(prop_name); data << vect_data ; dev_def_prop.push_back(data); add_wiz_dev_prop(prop_name, prop_desc, prop_def); } else add_wiz_dev_prop(prop_name, prop_desc); prop_name = "MagnetNumber"; prop_desc = "Magnet number from 1 to 48"; prop_def = "0"; vect_data.clear(); vect_data.push_back("0"); if (prop_def.length()>0) { Tango::DbDatum data(prop_name); data << vect_data ; dev_def_prop.push_back(data); add_wiz_dev_prop(prop_name, prop_desc, prop_def); } else add_wiz_dev_prop(prop_name, prop_desc); prop_name = "UpdatePeriod"; prop_desc = "The update period for the data reading from the power supply in milli seconds."; prop_def = "1000"; vect_data.clear(); vect_data.push_back("1000"); if (prop_def.length()>0) { Tango::DbDatum data(prop_name); data << vect_data ; dev_def_prop.push_back(data); add_wiz_dev_prop(prop_name, prop_desc, prop_def); } else add_wiz_dev_prop(prop_name, prop_desc); } //+---------------------------------------------------------------------------- // // method : BiltClass::write_class_property // // description : Set class description as property in database // //----------------------------------------------------------------------------- void BiltClass::write_class_property() { // First time, check if database used //-------------------------------------------- if (Tango::Util::_UseDb == false) return; Tango::DbData data; string classname = get_name(); string header; string::size_type start, end; // Put title Tango::DbDatum title("ProjectTitle"); string str_title("BILT multi channel power supply"); title << str_title; data.push_back(title); // Put Description Tango::DbDatum description("Description"); vector str_desc; str_desc.push_back("The BILT multi channel power supply will be used with 3 channels for the ESRF fast"); str_desc.push_back("feedback systems."); str_desc.push_back("The power supply can be controlled in 2 ways :"); str_desc.push_back("By this device server for slow or human control or"); str_desc.push_back("by the Libera Beam Position monitors for fast feedback with closed loop control."); str_desc.push_back("The devices are exported as one device per steerer magnet. Every device has three"); str_desc.push_back("channels. The channels (poles) cannot be switched on individually but have their"); str_desc.push_back("individual set points and measurement values."); description << str_desc; data.push_back(description); // put cvs or svn location string filename(classname); filename += "Class.cpp"; // Create a string with the class ID to // get the string into the binary string class_id(ClassId); // check for cvs information string src_path(CvsPath); start = src_path.find("/"); if (start!=string::npos) { end = src_path.find(filename); if (end>start) { string strloc = src_path.substr(start, end-start); // Check if specific repository start = strloc.find("/cvsroot/"); if (start!=string::npos && start>0) { string repository = strloc.substr(0, start); if (repository.find("/segfs/")!=string::npos) strloc = "ESRF:" + strloc.substr(start, strloc.length()-start); } Tango::DbDatum cvs_loc("cvs_location"); cvs_loc << strloc; data.push_back(cvs_loc); } } // check for svn information else { string src_path(SvnPath); start = src_path.find("://"); if (start!=string::npos) { end = src_path.find(filename); if (end>start) { header = "$HeadURL: "; start = header.length(); string strloc = src_path.substr(start, (end-start)); Tango::DbDatum svn_loc("svn_location"); svn_loc << strloc; data.push_back(svn_loc); } } } // Get CVS or SVN revision tag // CVS tag string tagname(TagName); header = "$Name: "; start = header.length(); string endstr(" $"); end = tagname.find(endstr); if (end!=string::npos && end>start) { string strtag = tagname.substr(start, end-start); Tango::DbDatum cvs_tag("cvs_tag"); cvs_tag << strtag; data.push_back(cvs_tag); } // SVN tag string svnpath(SvnPath); header = "$HeadURL: "; start = header.length(); end = svnpath.find(endstr); if (end!=string::npos && end>start) { string strloc = svnpath.substr(start, end-start); string tagstr ("/tags/"); start = strloc.find(tagstr); if ( start!=string::npos ) { start = start + tagstr.length(); end = strloc.find(filename); string strtag = strloc.substr(start, end-start-1); Tango::DbDatum svn_tag("svn_tag"); svn_tag << strtag; data.push_back(svn_tag); } } // Get URL location string httpServ(HttpServer); if (httpServ.length()>0) { Tango::DbDatum db_doc_url("doc_url"); db_doc_url << httpServ; data.push_back(db_doc_url); } // Put inheritance Tango::DbDatum inher_datum("InheritedFrom"); vector inheritance; inheritance.push_back("Device_4Impl"); inher_datum << inheritance; data.push_back(inher_datum); // Call database and and values //-------------------------------------------- get_db_class()->put_property(data); } } // namespace Revision-number: 67 Prop-content-length: 276 Content-length: 276 K 10 svn:author V 5 meyer K 8 svn:date V 27 2010-11-17T11:42:48.000000Z K 7 svn:log V 175 Replaced the INVALID attribute quality by an exception. This should avoid a bug in the Tango api which does not take the attribute quality into account during alarm checking! PROPS-END Node-path: powersupply/itest/Bilt/trunk/Bilt.cpp Node-kind: file Node-action: change Text-content-length: 36349 Text-content-md5: 3c92762c58e66bfc063ee962627107eb Content-length: 36349 static const char *RcsId = "$Id: Bilt.cpp,v 1.17 2010-11-17 11:42:48 meyer Exp $"; //+============================================================================= // // file : Bilt.cpp // // description : C++ source for the Bilt and its commands. // The class is derived from Device. It represents the // CORBA servant object which will be accessed from the // network. All commands which can be executed on the // Bilt are implemented in this file. // // project : TANGO Device Server // // $Author: meyer $ // // $Revision: 1.17 $ // // $Revision: 1.17 $ // $Date: 2010-11-17 11:42:48 $ // // SVN only: // $HeadURL: $ // // CVS only: // $Source: /segfs/tango/cvsroot/cppserver/machine/powersupply/SrSteerers/tango/Bilt/Bilt.cpp,v $ // $Log: not supported by cvs2svn $ // Revision 1.16 2010/11/10 14:00:29 meyer // Changed unit of AC RMS and average value from A to mA. // // Revision 1.15 2010-11-10 12:01:29 meyer // Changed type of Temperatures attribute from long to double and moved // temperature reading to the acquisition thread. // // Revision 1.14 2010/06/21 07:13:05 meyer // Added a spectrum attribute for the temperature measurements and changed to libMagnet version 1.4. // // Revision 1.13 2010/05/01 16:58:39 meyer // Changed alarm limits for the impedance attribute. // // Revision 1.12 2010/03/16 14:54:58 meyer // Added reconnection method. // // Revision 1.11 2010-02-18 16:46:31 meyer // Filled-in code for SetpointCheck // // Revision 1.10 2010-02-12 16:35:13 meyer // Added SetPoleCurrent command again. // // Revision 1.9 2010-02-11 16:35:27 meyer // Currents settings understand NaN values. // Deleted StePoleCurrent command. // // Revision 1.8 2010/02/10 12:27:31 meyer // Restructured Bilt class. // Acquistion is now done by a thread and only the multi channel data // gets exported. A single channel class (BiltCh) was created. // // Revision 1.7 2009/12/18 12:01:40 meyer // Corrected alarm handling in dev_state() // // Revision 1.6 2009/11/27 13:49:26 meyer // Modified structure! The pole is no longer a device. // The device is now a magnet with three poles. // // Revision 1.5 2009/11/26 10:46:58 meyer // Updated for libMagnet_V120 // // Revision 1.4 2009/11/24 09:21:46 meyer // Absolut value for impedance // // Revision 1.3 2009/11/23 16:46:58 meyer // Corrected state, status and exception handling // // Revision 1.2 2009/11/06 12:46:25 meyer // Added impedance attribute and corrected fromatting of attribute values. // // Revision 1.1.1.1 2009/11/04 16:23:02 meyer // Imported using TkCVS // // // copyleft : European Synchrotron Radiation Facility // BP 220, Grenoble 38043 // FRANCE // //-============================================================================= // // This file is generated by POGO // (Program Obviously used to Generate tango Object) // // (c) - Software Engineering Group - ESRF //============================================================================= //=================================================================== // // The following table gives the correspondence // between commands and method name. // // Command name | Method name // ---------------------------------------- // State | dev_state() // Status | dev_status() // On | on() // Off | off() // Reset | reset() // SetPoleAcCurrent | set_pole_ac_current() // LocalPoleControl | local_pole_control() // SetpointCheck | setpoint_check() // SetPoleCurrent | set_pole_current() // //=================================================================== #include #include #include #include #include namespace Bilt_ns { //+---------------------------------------------------------------------------- // // method : Bilt::Bilt(string &s) // // description : constructor for simulated Bilt // // in : - cl : Pointer to the DeviceClass object // - s : Device name // //----------------------------------------------------------------------------- Bilt::Bilt(Tango::DeviceClass *cl,string &s) :Tango::Device_4Impl(cl,s.c_str()) { init_device(); } Bilt::Bilt(Tango::DeviceClass *cl,const char *s) :Tango::Device_4Impl(cl,s) { init_device(); } Bilt::Bilt(Tango::DeviceClass *cl,const char *s,const char *d) :Tango::Device_4Impl(cl,s,d) { init_device(); } //+---------------------------------------------------------------------------- // // method : Bilt::delete_device() // // description : will be called at device destruction or at init command. // //----------------------------------------------------------------------------- void Bilt::delete_device() { // Delete device allocated objects if ( acquisition_thread != NULL ) { data_mutex.lock(); exit_thread = true; data_mutex.unlock(); // join now the thread until it exits int *rv; acquisition_thread->join((void **)&rv); cout << "Bilt::delete_device(): Exit acquisition thread !!!" << endl; } // Delete connection to the power supply delete BILT; BILT = NULL; } //+---------------------------------------------------------------------------- // // method : Bilt::init_device() // // description : will be called at device initialization. // //----------------------------------------------------------------------------- void Bilt::init_device() { INFO_STREAM << "Bilt::Bilt() create device " << device_name << endl; // Initialise variables to default values //-------------------------------------------- get_device_property(); set_state (Tango::OFF); try { BILT = new itest::TMagnet (iPAddress.c_str(), magnetNumber); } catch (itest::ItestException &e) { try { create_tango_exception (e, mdata_errors, "Init failure" , "Cannot initialise ITEST libray objects", "Bilt::init_device"); } catch (Tango::DevFailed &e) { set_state (Tango::UNKNOWN); } } // initialise with the actual current set point values try { for (int i=0; ipole(i).get_current_DC(); } Tango::MultiAttribute *attr_list = get_device_attr(); Tango::WAttribute &attr_curr = attr_list->get_w_attr_by_name ("Currents"); attr_curr.set_write_value(¤ts_dc[0], currents_dc.size()); } catch (itest::ItestException &e) { try { create_tango_exception (e, mdata_errors, "Init failure" , "Cannot read the actual current set point values", "Bilt::init_device"); } catch (Tango::DevFailed &e) { set_state (Tango::UNKNOWN); } } // initialise and start the acquisition thread exit_thread = false; acquisition_thread = new AcquisitionThread(this, data_mutex, bilt_mutex); } //+---------------------------------------------------------------------------- // // method : Bilt::get_device_property() // // description : Read the device properties from database. // //----------------------------------------------------------------------------- void Bilt::get_device_property() { // Initialize your default values here (if not done with POGO). //------------------------------------------------------------------ BILT = NULL; bilt_connection_lost = false; acquisition_thread = NULL; struct timeval now; gettimeofday (&now, NULL); data_set_time = now; data_read_time = now; // intitialise mdada structure for magnet read values mdata.magnet = -1; mdata.state = -1; for (int i=0; i_UseDb==true) get_db_device()->get_property(dev_prop); Tango::DbDatum def_prop, cl_prop; BiltClass *ds_class = (static_cast(get_device_class())); int i = -1; // Try to initialize IPAddress from class property cl_prop = ds_class->get_class_property(dev_prop[++i].name); if (cl_prop.is_empty()==false) cl_prop >> iPAddress; else { // Try to initialize IPAddress from default device value def_prop = ds_class->get_default_device_property(dev_prop[i].name); if (def_prop.is_empty()==false) def_prop >> iPAddress; } // And try to extract IPAddress value from database if (dev_prop[i].is_empty()==false) dev_prop[i] >> iPAddress; // Try to initialize MagnetNumber from class property cl_prop = ds_class->get_class_property(dev_prop[++i].name); if (cl_prop.is_empty()==false) cl_prop >> magnetNumber; else { // Try to initialize MagnetNumber from default device value def_prop = ds_class->get_default_device_property(dev_prop[i].name); if (def_prop.is_empty()==false) def_prop >> magnetNumber; } // And try to extract MagnetNumber value from database if (dev_prop[i].is_empty()==false) dev_prop[i] >> magnetNumber; // Try to initialize UpdatePeriod from class property cl_prop = ds_class->get_class_property(dev_prop[++i].name); if (cl_prop.is_empty()==false) cl_prop >> updatePeriod; else { // Try to initialize UpdatePeriod from default device value def_prop = ds_class->get_default_device_property(dev_prop[i].name); if (def_prop.is_empty()==false) def_prop >> updatePeriod; } // And try to extract UpdatePeriod value from database if (dev_prop[i].is_empty()==false) dev_prop[i] >> updatePeriod; // End of Automatic code generation //------------------------------------------------------------------ } //+---------------------------------------------------------------------------- // // method : Bilt::always_executed_hook() // // description : method always executed before any command is executed // //----------------------------------------------------------------------------- void Bilt::always_executed_hook() { } //+---------------------------------------------------------------------------- // // method : Bilt::read_attr_hardware // // description : Hardware acquisition for attributes. // //----------------------------------------------------------------------------- void Bilt::read_attr_hardware(vector &attr_list) { DEBUG_STREAM << "Bilt::read_attr_hardware(vector &attr_list) entering... "<< endl; // Add your own code here } //+---------------------------------------------------------------------------- // // method : Bilt::read_Temperatures // // description : Extract real attribute values for Temperatures acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_Temperatures(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_Temperatures(Tango::Attribute &attr) entering... "<< endl; omni_mutex_lock l(data_mutex); if ( temp_errors.length() != 0 ) { //attr.set_quality(Tango::ATTR_INVALID); // 17.11.2020 // The Tango API does not tke into account the attribute // quality factor when checking for alarms!!! // Until the bus is repaired we just return an exception! TangoSys_MemStream tms; tms << "Error on temperatur reading, no data available!" << endl; Tango::Except::throw_exception("ReadError", tms.str(), "Bilt::read_Temperatures"); } else { attr.set_value (&(temperatures[0]), 2*POLES); } } //+---------------------------------------------------------------------------- // // method : Bilt::read_FramesPerSecond // // description : Extract real attribute values for FramesPerSecond acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_FramesPerSecond(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_FramesPerSecond(Tango::Attribute &attr) entering... "<< endl; omni_mutex_lock l(data_mutex); if ( fdata_errors.length() != 0 ) attr.set_quality(Tango::ATTR_INVALID); else { for (int i=0; ipole(i).get_switch(); } if ( switch_state == 1 ) local_control[i] = false; else local_control[i] = true; } } catch (itest::ItestException &e) { create_tango_exception (e, "Read failure" , "Cannot read the actual switch states", "Bilt::read_LocalControls"); } attr.set_value (&(local_control[0]), POLES); } //+---------------------------------------------------------------------------- // // method : Bilt::read_SetCurrentsRMS // // description : Extract real attribute values for SetCurrentsRMS acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_SetCurrentsRMS(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_SetCurrentsRMS(Tango::Attribute &attr) entering... "<< endl; omni_mutex_lock l(data_mutex); if ( fdata_errors.length() != 0 ) attr.set_quality(Tango::ATTR_INVALID); else { for (int i=0; i CURRENT_LIMIT ) impedances[i] = fabs (mdata.idata[i].measvolt / mdata.idata[i].meascurr); else impedances[i] = nan("NaN"); } } attr.set_value (&(impedances[0]), POLES); } //+---------------------------------------------------------------------------- // // method : Bilt::write_Currents // // description : Write Currents attribute values to hardware. // //----------------------------------------------------------------------------- void Bilt::write_Currents(Tango::WAttribute &attr) { DEBUG_STREAM << "Bilt::write_Currents(Tango::WAttribute &attr) entering... "<< endl; const double *set_currents; // check the correct number of setpoints if ( attr.get_write_value_length() == POLES ) attr.get_write_value(set_currents); else { TangoSys_MemStream tms; tms << "Wrong number of setpoints!" << endl; Tango::Except::throw_exception("WriteError", tms.str(), "Bilt::write_Currents"); } // apply setpoints to the poles try { for (int i=0; ipole(i).set_current_DC (set_currents[i]); } } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot write DC current values", "Bilt::write_Currents"); } // initialise the set time, to be sure that the next // returned read value is newer and contains the changes. struct timeval now; gettimeofday (&now, NULL); data_set_time = now; } //+---------------------------------------------------------------------------- // // method : Bilt::read_Currents // // description : Extract real attribute values for Currents acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_Currents(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_Currents(Tango::Attribute &attr) entering... "<< endl; // wait for the next data acquisition afer a current setpoint change double delay; { omni_mutex_lock l(data_mutex); delay = (data_set_time.tv_sec * 1e6 + data_set_time.tv_usec) - (data_read_time.tv_sec * 1e6 + data_read_time.tv_usec); //cout << "delay = " << delay << endl; } while ( delay > 0 ) { // 20 ms struct timespec sleep_time = {0, SLEEP_NS}; nanosleep(&sleep_time, NULL); omni_mutex_lock l(data_mutex); delay = (data_set_time.tv_sec * 1e6 + data_set_time.tv_usec) - (data_read_time.tv_sec * 1e6 + data_read_time.tv_usec); INFO_STREAM << "read waiting delay = " << delay << endl; } omni_mutex_lock l(data_mutex); if ( mdata_errors.length() != 0 ) attr.set_quality(Tango::ATTR_INVALID); else { for (int i=0; iset_state(1); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot switch on pole", "Bilt::on"); } } //+------------------------------------------------------------------ /** * method: Bilt::off * * description: method to execute "Off" * Turns of power supply * * */ //+------------------------------------------------------------------ void Bilt::off() { DEBUG_STREAM << "Bilt::off(): entering... !" << endl; // Add your own code to control device here try { omni_mutex_lock l(bilt_mutex); BILT->set_state(0); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot switch off pole", "Bilt::off"); } } //+------------------------------------------------------------------ /** * method: Bilt::reset * * description: method to execute "Reset" * Reset faults and alarms * * */ //+------------------------------------------------------------------ void Bilt::reset() { DEBUG_STREAM << "Bilt::reset(): entering... !" << endl; // Add your own code to control device here try { omni_mutex_lock l(bilt_mutex); BILT->clear_all_err(); BILT->clear_alarm(); for (int i=0; ipole(i).clear_ferrors(); } } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot reset pole", "Bilt::reset"); } } //+------------------------------------------------------------------ /** * method: Bilt::set_pole_ac_current * * description: method to execute "SetPoleAcCurrent" * Set the AC current for one Pole. * [0] = pole number, [1] = current * * @param argin [0] = pole number, [1] = current * */ //+------------------------------------------------------------------ void Bilt::set_pole_ac_current(const Tango::DevVarDoubleArray *argin) { DEBUG_STREAM << "Bilt::set_pole_ac_current(): entering... !" << endl; // Add your own code to control device here // argin[0] = pole number if ( (*argin)[0] < 0 || (*argin)[0] >= POLES ) { TangoSys_MemStream tms; tms << "The entered Pole number is out of range" << endl; Tango::Except::throw_exception("WriteError", tms.str(), "Bilt::set_pole_ac_current"); } try { omni_mutex_lock l(bilt_mutex); BILT->pole((int)(*argin)[0]).set_current_AC ((*argin)[1]); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot write AC current value", "Bilt::set_pole_ac_current"); } } //+------------------------------------------------------------------ /** * method: Bilt::local_pole_control * * description: method to execute "LocalPoleControl" * Set the AC current for one Pole. * [0] = pole number, [1] = local control true/false * * @param argin [0] = pole number, [1] = local control true/false * */ //+------------------------------------------------------------------ void Bilt::local_pole_control(const Tango::DevVarShortArray *argin) { DEBUG_STREAM << "Bilt::local_pole_control(): entering... !" << endl; // Add your own code to control device here // argin[0] = pole number if ( (*argin)[0] < 0 || (*argin)[0] >= POLES ) { TangoSys_MemStream tms; tms << "The entered Pole number is out of range" << endl; Tango::Except::throw_exception("WriteError", tms.str(), "Bilt::local_pole_control"); } // argin[1] = true or false (1 or 0 ) if ( (*argin)[1] != 0 && (*argin)[1] != 1 ) { TangoSys_MemStream tms; tms << "Local control can only be choosen as 0 or 1 (false or true)" << endl; Tango::Except::throw_exception("WriteError", tms.str(), "Bilt::local_pole_control"); } try { int switch_state; if ( (*argin)[1] == true ) switch_state = 0; else switch_state = 1; omni_mutex_lock l(bilt_mutex); BILT->pole((*argin)[0]).set_switch (switch_state); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot write switch state", "Bilt::local_pole_control"); } } //+------------------------------------------------------------------ /** * method: Bilt::set_pole_current * * description: method to execute "SetPoleCurrent" * Set the current for one Pole. * [0] = pole number, [1] = current * * @param argin [0] = pole number, [1] = current * */ //+------------------------------------------------------------------ void Bilt::set_pole_current(const Tango::DevVarDoubleArray *argin) { DEBUG_STREAM << "Bilt::set_pole_current(): entering... !" << endl; // Add your own code to control device here // argin[0] = pole number if ( (*argin)[0] < 0 || (*argin)[0] >= POLES ) { TangoSys_MemStream tms; tms << "The entered Pole number is out of range" << endl; Tango::Except::throw_exception("WriteError", tms.str(), "Bilt::set_pole_current"); } try { omni_mutex_lock l(bilt_mutex); BILT->pole((int)(*argin)[0]).set_current_DC ((*argin)[1]); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot write current value", "Bilt::set_pole_current"); } // make sure that the current set values are correct! try { omni_mutex_lock l(bilt_mutex); for (int i=0; ipole(i).get_current_DC(); } Tango::MultiAttribute *attr_list = get_device_attr(); Tango::WAttribute &attr_curr = attr_list->get_w_attr_by_name ("Currents"); attr_curr.set_write_value(¤ts_dc[0], currents_dc.size()); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot read the actual current set point values", "Bilt::set_pole_current"); } // initialise the set time, to be sure that the next // returned read value is newer and contains the changes. struct timeval now; gettimeofday (&now, NULL); data_set_time = now; } //+------------------------------------------------------------------ /** * method: Bilt::create_tango_exception() * * description: convert an itest exception into a tango exception * * * in : - &e : Reference to itest exception * - reason : Reason of the local Tango exception to be added to the stack * - desc : Description for the local Tango exception to be added to the stack * - origin : Origin if the local Tango exception to be added to the stack */ //+------------------------------------------------------------------ void Bilt::create_tango_exception (itest::ItestException &e, string reason, string desc, string origin) { Tango::DevErrorList errors; create_tango_exception (e, errors, reason, desc, origin); } //+------------------------------------------------------------------ /** * method: Bilt::create_tango_exception() * * description: convert an itest exception into a tango exception * * * in : - &e : Reference to itest exception * - errors : Tango error list to use, to store exception info * - reason : Reason of the local Tango exception to be added to the stack * - desc : Description for the local Tango exception to be added to the stack * - origin : Origin if the local Tango exception to be added to the stack */ //+------------------------------------------------------------------ void Bilt::create_tango_exception (itest::ItestException &e, Tango::DevErrorList &errors, string reason, string desc, string origin) { DEBUG_STREAM << "Bilt::create_tango_exception(): entering... !" << endl; errors.length(e.errors.size() + 1); int i; for(i=0; idevice_status data member) and returns it to the caller. * * @return Status description * */ //+------------------------------------------------------------------ Tango::ConstDevString Bilt::dev_status() { //Tango::ConstDevString argout = DeviceImpl::dev_status(); DEBUG_STREAM << "Bilt::dev_status(): entering... !" << endl; // Add your own code to control device here stringstream status; Tango::DevState state = dev_state(); switch (state) { case Tango::ON: status << "State : ON" << endl; break; case Tango::OFF: status << "State : OFF" << endl; break; case Tango::ALARM: { status << "State : Alarm" << endl; omni_mutex_lock l(data_mutex); for (int i=0; i 10W in 10ms!" << endl; else { if ( mdata.idata[i].fail == "TEMP" ) status << "Fault descr. : Max. temp on semiconductor reached!" << endl; else { if ( mdata.idata[i].fail == "PWSO" ) status << "Fault descr. : Delivered power > 40W in 100ms!" << endl; else { status << "Fault descr. : Unkown fault code!" << endl; } } } } } } } break; } default: { { omni_mutex_lock l(data_mutex); status << "BILT state : Unknown" << endl; if ( bilt_connection_lost == true ) { status << "Connection lost to BILT power supply, trying to reconnect!" << endl; status << endl; } if ( mdata_errors.length() > 0 ) status << "Error stack : " << endl; for(int i=0; idevice_state data member) and returns it to the caller. * * @return State Code * */ //+------------------------------------------------------------------ Tango::DevState Bilt::dev_state() { Tango::DevState argout = DeviceImpl::dev_state(); DEBUG_STREAM << "Bilt::dev_state(): entering... !" << endl; // Add your own code to control device here int state; int errors; try { omni_mutex_lock l(data_mutex); state = mdata.state; INFO_STREAM << "magnet state for " << get_name() << " = " << state << endl; errors = mdata_errors.length(); INFO_STREAM << "mdata errors = " << mdata_errors.length() << endl; } catch (Tango::DevFailed &e) { // do nothing! // Just avoid exceptions when executing state or status! } if ( errors != 0 ) set_state (Tango::UNKNOWN); else { // set the device state switch (state) { case -1: set_state (Tango::UNKNOWN); bilt_connection_lost = true; break; case 0: set_state (Tango::OFF); break; case 1: set_state (Tango::ON); break; case 2: set_state (Tango::ALARM); break; case 3: set_state (Tango::FAULT); break; default: set_state (Tango::UNKNOWN); break; } } // Check for attribute alarms if ( get_state() == Tango::ON && argout == Tango::ALARM ) set_state (Tango::ALARM); return get_state(); } //+------------------------------------------------------------------ /** * method: Bilt::setpoint_check * * description: method to execute "SetpointCheck" * Check the given current values against the specified limits. * * @param argin Setpoint values for the Poles * @return true when settings are OK * */ //+------------------------------------------------------------------ Tango::DevBoolean Bilt::setpoint_check(const Tango::DevVarDoubleArray *argin) { Tango::DevBoolean argout ; DEBUG_STREAM << "Bilt::setpoint_check(): entering... !" << endl; // Add your own code to control device here // get the min and max values for the current settings Tango::MultiAttribute *attr_list = get_device_attr(); Tango::WAttribute &attr_curr = attr_list->get_w_attr_by_name ("Currents"); double min, max; attr_curr.get_min_value(min); attr_curr.get_max_value(max); INFO_STREAM << "min = " << min << " max = " << max << endl; // check the input values argout = true; for ( int i=0; ilength(); i++ ) { INFO_STREAM << "i = " << i << " curr = " << (*argin)[i] << endl; if ( (*argin)[i] < min || (*argin)[i] > max ) { argout = false; break; } } return argout; } } // namespace Revision-number: 68 Prop-content-length: 150 Content-length: 150 K 10 svn:author V 5 meyer K 8 svn:date V 27 2010-11-23T07:12:39.000000Z K 7 svn:log V 50 Changed placement of bilt_mutex in write_Current. PROPS-END Node-path: powersupply/itest/Bilt/trunk/Bilt.cpp Node-kind: file Node-action: change Text-content-length: 36766 Text-content-md5: fd77ed935b72d4ee40c532c8ce7bad02 Content-length: 36766 static const char *RcsId = "$Id: Bilt.cpp,v 1.18 2010-11-23 07:12:39 meyer Exp $"; //+============================================================================= // // file : Bilt.cpp // // description : C++ source for the Bilt and its commands. // The class is derived from Device. It represents the // CORBA servant object which will be accessed from the // network. All commands which can be executed on the // Bilt are implemented in this file. // // project : TANGO Device Server // // $Author: meyer $ // // $Revision: 1.18 $ // // $Revision: 1.18 $ // $Date: 2010-11-23 07:12:39 $ // // SVN only: // $HeadURL: $ // // CVS only: // $Source: /segfs/tango/cvsroot/cppserver/machine/powersupply/SrSteerers/tango/Bilt/Bilt.cpp,v $ // $Log: not supported by cvs2svn $ // Revision 1.17 2010/11/17 11:42:48 meyer // Replaced the INVALID attribute quality by an exception. // This should avoid a bug in the Tango api which does not take the // attribute quality into account during alarm checking! // // Revision 1.16 2010/11/10 14:00:29 meyer // Changed unit of AC RMS and average value from A to mA. // // Revision 1.15 2010-11-10 12:01:29 meyer // Changed type of Temperatures attribute from long to double and moved // temperature reading to the acquisition thread. // // Revision 1.14 2010/06/21 07:13:05 meyer // Added a spectrum attribute for the temperature measurements and changed to libMagnet version 1.4. // // Revision 1.13 2010/05/01 16:58:39 meyer // Changed alarm limits for the impedance attribute. // // Revision 1.12 2010/03/16 14:54:58 meyer // Added reconnection method. // // Revision 1.11 2010-02-18 16:46:31 meyer // Filled-in code for SetpointCheck // // Revision 1.10 2010-02-12 16:35:13 meyer // Added SetPoleCurrent command again. // // Revision 1.9 2010-02-11 16:35:27 meyer // Currents settings understand NaN values. // Deleted StePoleCurrent command. // // Revision 1.8 2010/02/10 12:27:31 meyer // Restructured Bilt class. // Acquistion is now done by a thread and only the multi channel data // gets exported. A single channel class (BiltCh) was created. // // Revision 1.7 2009/12/18 12:01:40 meyer // Corrected alarm handling in dev_state() // // Revision 1.6 2009/11/27 13:49:26 meyer // Modified structure! The pole is no longer a device. // The device is now a magnet with three poles. // // Revision 1.5 2009/11/26 10:46:58 meyer // Updated for libMagnet_V120 // // Revision 1.4 2009/11/24 09:21:46 meyer // Absolut value for impedance // // Revision 1.3 2009/11/23 16:46:58 meyer // Corrected state, status and exception handling // // Revision 1.2 2009/11/06 12:46:25 meyer // Added impedance attribute and corrected fromatting of attribute values. // // Revision 1.1.1.1 2009/11/04 16:23:02 meyer // Imported using TkCVS // // // copyleft : European Synchrotron Radiation Facility // BP 220, Grenoble 38043 // FRANCE // //-============================================================================= // // This file is generated by POGO // (Program Obviously used to Generate tango Object) // // (c) - Software Engineering Group - ESRF //============================================================================= //=================================================================== // // The following table gives the correspondence // between commands and method name. // // Command name | Method name // ---------------------------------------- // State | dev_state() // Status | dev_status() // On | on() // Off | off() // Reset | reset() // SetPoleAcCurrent | set_pole_ac_current() // LocalPoleControl | local_pole_control() // SetpointCheck | setpoint_check() // SetPoleCurrent | set_pole_current() // //=================================================================== #include #include #include #include #include namespace Bilt_ns { //+---------------------------------------------------------------------------- // // method : Bilt::Bilt(string &s) // // description : constructor for simulated Bilt // // in : - cl : Pointer to the DeviceClass object // - s : Device name // //----------------------------------------------------------------------------- Bilt::Bilt(Tango::DeviceClass *cl,string &s) :Tango::Device_4Impl(cl,s.c_str()) { init_device(); } Bilt::Bilt(Tango::DeviceClass *cl,const char *s) :Tango::Device_4Impl(cl,s) { init_device(); } Bilt::Bilt(Tango::DeviceClass *cl,const char *s,const char *d) :Tango::Device_4Impl(cl,s,d) { init_device(); } //+---------------------------------------------------------------------------- // // method : Bilt::delete_device() // // description : will be called at device destruction or at init command. // //----------------------------------------------------------------------------- void Bilt::delete_device() { // Delete device allocated objects if ( acquisition_thread != NULL ) { data_mutex.lock(); exit_thread = true; data_mutex.unlock(); // join now the thread until it exits int *rv; acquisition_thread->join((void **)&rv); cout << "Bilt::delete_device(): Exit acquisition thread !!!" << endl; } // Delete connection to the power supply delete BILT; BILT = NULL; } //+---------------------------------------------------------------------------- // // method : Bilt::init_device() // // description : will be called at device initialization. // //----------------------------------------------------------------------------- void Bilt::init_device() { INFO_STREAM << "Bilt::Bilt() create device " << device_name << endl; // Initialise variables to default values //-------------------------------------------- get_device_property(); set_state (Tango::OFF); try { BILT = new itest::TMagnet (iPAddress.c_str(), magnetNumber); } catch (itest::ItestException &e) { try { create_tango_exception (e, mdata_errors, "Init failure" , "Cannot initialise ITEST libray objects", "Bilt::init_device"); } catch (Tango::DevFailed &e) { set_state (Tango::UNKNOWN); } } // initialise with the actual current set point values try { for (int i=0; ipole(i).get_current_DC(); } Tango::MultiAttribute *attr_list = get_device_attr(); Tango::WAttribute &attr_curr = attr_list->get_w_attr_by_name ("Currents"); attr_curr.set_write_value(¤ts_dc[0], currents_dc.size()); } catch (itest::ItestException &e) { try { create_tango_exception (e, mdata_errors, "Init failure" , "Cannot read the actual current set point values", "Bilt::init_device"); } catch (Tango::DevFailed &e) { set_state (Tango::UNKNOWN); } } // initialise and start the acquisition thread exit_thread = false; acquisition_thread = new AcquisitionThread(this, data_mutex, bilt_mutex); } //+---------------------------------------------------------------------------- // // method : Bilt::get_device_property() // // description : Read the device properties from database. // //----------------------------------------------------------------------------- void Bilt::get_device_property() { // Initialize your default values here (if not done with POGO). //------------------------------------------------------------------ BILT = NULL; bilt_connection_lost = false; acquisition_thread = NULL; struct timeval now; gettimeofday (&now, NULL); data_set_time = now; data_read_time = now; // intitialise mdada structure for magnet read values mdata.magnet = -1; mdata.state = -1; for (int i=0; i_UseDb==true) get_db_device()->get_property(dev_prop); Tango::DbDatum def_prop, cl_prop; BiltClass *ds_class = (static_cast(get_device_class())); int i = -1; // Try to initialize IPAddress from class property cl_prop = ds_class->get_class_property(dev_prop[++i].name); if (cl_prop.is_empty()==false) cl_prop >> iPAddress; else { // Try to initialize IPAddress from default device value def_prop = ds_class->get_default_device_property(dev_prop[i].name); if (def_prop.is_empty()==false) def_prop >> iPAddress; } // And try to extract IPAddress value from database if (dev_prop[i].is_empty()==false) dev_prop[i] >> iPAddress; // Try to initialize MagnetNumber from class property cl_prop = ds_class->get_class_property(dev_prop[++i].name); if (cl_prop.is_empty()==false) cl_prop >> magnetNumber; else { // Try to initialize MagnetNumber from default device value def_prop = ds_class->get_default_device_property(dev_prop[i].name); if (def_prop.is_empty()==false) def_prop >> magnetNumber; } // And try to extract MagnetNumber value from database if (dev_prop[i].is_empty()==false) dev_prop[i] >> magnetNumber; // Try to initialize UpdatePeriod from class property cl_prop = ds_class->get_class_property(dev_prop[++i].name); if (cl_prop.is_empty()==false) cl_prop >> updatePeriod; else { // Try to initialize UpdatePeriod from default device value def_prop = ds_class->get_default_device_property(dev_prop[i].name); if (def_prop.is_empty()==false) def_prop >> updatePeriod; } // And try to extract UpdatePeriod value from database if (dev_prop[i].is_empty()==false) dev_prop[i] >> updatePeriod; // End of Automatic code generation //------------------------------------------------------------------ } //+---------------------------------------------------------------------------- // // method : Bilt::always_executed_hook() // // description : method always executed before any command is executed // //----------------------------------------------------------------------------- void Bilt::always_executed_hook() { } //+---------------------------------------------------------------------------- // // method : Bilt::read_attr_hardware // // description : Hardware acquisition for attributes. // //----------------------------------------------------------------------------- void Bilt::read_attr_hardware(vector &attr_list) { DEBUG_STREAM << "Bilt::read_attr_hardware(vector &attr_list) entering... "<< endl; // Add your own code here } //+---------------------------------------------------------------------------- // // method : Bilt::read_Temperatures // // description : Extract real attribute values for Temperatures acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_Temperatures(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_Temperatures(Tango::Attribute &attr) entering... "<< endl; omni_mutex_lock l(data_mutex); if ( temp_errors.length() != 0 ) { //attr.set_quality(Tango::ATTR_INVALID); // 17.11.2020 // The Tango API does not tke into account the attribute // quality factor when checking for alarms!!! // Until the bus is repaired we just return an exception! TangoSys_MemStream tms; tms << "Error on temperatur reading, no data available!" << endl; Tango::Except::throw_exception("ReadError", tms.str(), "Bilt::read_Temperatures"); } else { attr.set_value (&(temperatures[0]), 2*POLES); } } //+---------------------------------------------------------------------------- // // method : Bilt::read_FramesPerSecond // // description : Extract real attribute values for FramesPerSecond acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_FramesPerSecond(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_FramesPerSecond(Tango::Attribute &attr) entering... "<< endl; omni_mutex_lock l(data_mutex); if ( fdata_errors.length() != 0 ) attr.set_quality(Tango::ATTR_INVALID); else { for (int i=0; ipole(i).get_switch(); } if ( switch_state == 1 ) local_control[i] = false; else local_control[i] = true; } } catch (itest::ItestException &e) { create_tango_exception (e, "Read failure" , "Cannot read the actual switch states", "Bilt::read_LocalControls"); } attr.set_value (&(local_control[0]), POLES); } //+---------------------------------------------------------------------------- // // method : Bilt::read_SetCurrentsRMS // // description : Extract real attribute values for SetCurrentsRMS acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_SetCurrentsRMS(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_SetCurrentsRMS(Tango::Attribute &attr) entering... "<< endl; omni_mutex_lock l(data_mutex); if ( fdata_errors.length() != 0 ) attr.set_quality(Tango::ATTR_INVALID); else { for (int i=0; i CURRENT_LIMIT ) impedances[i] = fabs (mdata.idata[i].measvolt / mdata.idata[i].meascurr); else impedances[i] = nan("NaN"); } } attr.set_value (&(impedances[0]), POLES); } //+---------------------------------------------------------------------------- // // method : Bilt::write_Currents // // description : Write Currents attribute values to hardware. // //----------------------------------------------------------------------------- void Bilt::write_Currents(Tango::WAttribute &attr) { DEBUG_STREAM << "Bilt::write_Currents(Tango::WAttribute &attr) entering... "<< endl; const double *set_currents; // check the correct number of setpoints if ( attr.get_write_value_length() == POLES ) attr.get_write_value(set_currents); else { TangoSys_MemStream tms; tms << "Wrong number of setpoints!" << endl; Tango::Except::throw_exception("WriteError", tms.str(), "Bilt::write_Currents"); } // apply setpoints to the poles try { omni_mutex_lock l(bilt_mutex); for (int i=0; i 0 ) //{ // sleep for 5 ms between the write requests //struct timespec sleep_time = {0, SHORT_SLEEP_NS}; //nanosleep(&sleep_time, NULL); //} BILT->pole(i).set_current_DC (set_currents[i]); } // initialise the set time, to be sure that the next // returned read value is newer and contains the changes. struct timeval now; gettimeofday (&now, NULL); data_set_time = now; } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot write DC current values", "Bilt::write_Currents"); } } //+---------------------------------------------------------------------------- // // method : Bilt::read_Currents // // description : Extract real attribute values for Currents acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_Currents(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_Currents(Tango::Attribute &attr) entering... "<< endl; // wait for the next data acquisition afer a current setpoint change double delay; { omni_mutex_lock l(data_mutex); delay = (data_set_time.tv_sec * 1e6 + data_set_time.tv_usec) - (data_read_time.tv_sec * 1e6 + data_read_time.tv_usec); //cout << "delay = " << delay << endl; } while ( delay > 0 ) { // 20 ms struct timespec sleep_time = {0, SLEEP_NS}; nanosleep(&sleep_time, NULL); omni_mutex_lock l(data_mutex); delay = (data_set_time.tv_sec * 1e6 + data_set_time.tv_usec) - (data_read_time.tv_sec * 1e6 + data_read_time.tv_usec); INFO_STREAM << "read waiting delay = " << delay << endl; } omni_mutex_lock l(data_mutex); if ( mdata_errors.length() != 0 ) attr.set_quality(Tango::ATTR_INVALID); else { for (int i=0; iset_state(1); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot switch on pole", "Bilt::on"); } } //+------------------------------------------------------------------ /** * method: Bilt::off * * description: method to execute "Off" * Turns of power supply * * */ //+------------------------------------------------------------------ void Bilt::off() { DEBUG_STREAM << "Bilt::off(): entering... !" << endl; // Add your own code to control device here try { omni_mutex_lock l(bilt_mutex); BILT->set_state(0); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot switch off pole", "Bilt::off"); } } //+------------------------------------------------------------------ /** * method: Bilt::reset * * description: method to execute "Reset" * Reset faults and alarms * * */ //+------------------------------------------------------------------ void Bilt::reset() { DEBUG_STREAM << "Bilt::reset(): entering... !" << endl; // Add your own code to control device here try { omni_mutex_lock l(bilt_mutex); BILT->clear_all_err(); BILT->clear_alarm(); for (int i=0; ipole(i).clear_ferrors(); } } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot reset pole", "Bilt::reset"); } } //+------------------------------------------------------------------ /** * method: Bilt::set_pole_ac_current * * description: method to execute "SetPoleAcCurrent" * Set the AC current for one Pole. * [0] = pole number, [1] = current * * @param argin [0] = pole number, [1] = current * */ //+------------------------------------------------------------------ void Bilt::set_pole_ac_current(const Tango::DevVarDoubleArray *argin) { DEBUG_STREAM << "Bilt::set_pole_ac_current(): entering... !" << endl; // Add your own code to control device here // argin[0] = pole number if ( (*argin)[0] < 0 || (*argin)[0] >= POLES ) { TangoSys_MemStream tms; tms << "The entered Pole number is out of range" << endl; Tango::Except::throw_exception("WriteError", tms.str(), "Bilt::set_pole_ac_current"); } try { omni_mutex_lock l(bilt_mutex); BILT->pole((int)(*argin)[0]).set_current_AC ((*argin)[1]); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot write AC current value", "Bilt::set_pole_ac_current"); } } //+------------------------------------------------------------------ /** * method: Bilt::local_pole_control * * description: method to execute "LocalPoleControl" * Set the AC current for one Pole. * [0] = pole number, [1] = local control true/false * * @param argin [0] = pole number, [1] = local control true/false * */ //+------------------------------------------------------------------ void Bilt::local_pole_control(const Tango::DevVarShortArray *argin) { DEBUG_STREAM << "Bilt::local_pole_control(): entering... !" << endl; // Add your own code to control device here // argin[0] = pole number if ( (*argin)[0] < 0 || (*argin)[0] >= POLES ) { TangoSys_MemStream tms; tms << "The entered Pole number is out of range" << endl; Tango::Except::throw_exception("WriteError", tms.str(), "Bilt::local_pole_control"); } // argin[1] = true or false (1 or 0 ) if ( (*argin)[1] != 0 && (*argin)[1] != 1 ) { TangoSys_MemStream tms; tms << "Local control can only be choosen as 0 or 1 (false or true)" << endl; Tango::Except::throw_exception("WriteError", tms.str(), "Bilt::local_pole_control"); } try { int switch_state; if ( (*argin)[1] == true ) switch_state = 0; else switch_state = 1; omni_mutex_lock l(bilt_mutex); BILT->pole((*argin)[0]).set_switch (switch_state); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot write switch state", "Bilt::local_pole_control"); } } //+------------------------------------------------------------------ /** * method: Bilt::set_pole_current * * description: method to execute "SetPoleCurrent" * Set the current for one Pole. * [0] = pole number, [1] = current * * @param argin [0] = pole number, [1] = current * */ //+------------------------------------------------------------------ void Bilt::set_pole_current(const Tango::DevVarDoubleArray *argin) { DEBUG_STREAM << "Bilt::set_pole_current(): entering... !" << endl; // Add your own code to control device here // argin[0] = pole number if ( (*argin)[0] < 0 || (*argin)[0] >= POLES ) { TangoSys_MemStream tms; tms << "The entered Pole number is out of range" << endl; Tango::Except::throw_exception("WriteError", tms.str(), "Bilt::set_pole_current"); } try { omni_mutex_lock l(bilt_mutex); BILT->pole((int)(*argin)[0]).set_current_DC ((*argin)[1]); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot write current value", "Bilt::set_pole_current"); } // make sure that the current set values are correct! try { omni_mutex_lock l(bilt_mutex); for (int i=0; ipole(i).get_current_DC(); } Tango::MultiAttribute *attr_list = get_device_attr(); Tango::WAttribute &attr_curr = attr_list->get_w_attr_by_name ("Currents"); attr_curr.set_write_value(¤ts_dc[0], currents_dc.size()); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot read the actual current set point values", "Bilt::set_pole_current"); } // initialise the set time, to be sure that the next // returned read value is newer and contains the changes. struct timeval now; gettimeofday (&now, NULL); data_set_time = now; } //+------------------------------------------------------------------ /** * method: Bilt::create_tango_exception() * * description: convert an itest exception into a tango exception * * * in : - &e : Reference to itest exception * - reason : Reason of the local Tango exception to be added to the stack * - desc : Description for the local Tango exception to be added to the stack * - origin : Origin if the local Tango exception to be added to the stack */ //+------------------------------------------------------------------ void Bilt::create_tango_exception (itest::ItestException &e, string reason, string desc, string origin) { Tango::DevErrorList errors; create_tango_exception (e, errors, reason, desc, origin); } //+------------------------------------------------------------------ /** * method: Bilt::create_tango_exception() * * description: convert an itest exception into a tango exception * * * in : - &e : Reference to itest exception * - errors : Tango error list to use, to store exception info * - reason : Reason of the local Tango exception to be added to the stack * - desc : Description for the local Tango exception to be added to the stack * - origin : Origin if the local Tango exception to be added to the stack */ //+------------------------------------------------------------------ void Bilt::create_tango_exception (itest::ItestException &e, Tango::DevErrorList &errors, string reason, string desc, string origin) { DEBUG_STREAM << "Bilt::create_tango_exception(): entering... !" << endl; errors.length(e.errors.size() + 1); int i; for(i=0; idevice_status data member) and returns it to the caller. * * @return Status description * */ //+------------------------------------------------------------------ Tango::ConstDevString Bilt::dev_status() { //Tango::ConstDevString argout = DeviceImpl::dev_status(); DEBUG_STREAM << "Bilt::dev_status(): entering... !" << endl; // Add your own code to control device here stringstream status; Tango::DevState state = dev_state(); switch (state) { case Tango::ON: status << "State : ON" << endl; break; case Tango::OFF: status << "State : OFF" << endl; break; case Tango::ALARM: { status << "State : Alarm" << endl; omni_mutex_lock l(data_mutex); for (int i=0; i 10W in 10ms!" << endl; else { if ( mdata.idata[i].fail == "TEMP" ) status << "Fault descr. : Max. temp on semiconductor reached!" << endl; else { if ( mdata.idata[i].fail == "PWSO" ) status << "Fault descr. : Delivered power > 40W in 100ms!" << endl; else { status << "Fault descr. : Unkown fault code!" << endl; } } } } } } } break; } default: { { omni_mutex_lock l(data_mutex); status << "BILT state : Unknown" << endl; if ( bilt_connection_lost == true ) { status << "Connection lost to BILT power supply, trying to reconnect!" << endl; status << endl; } if ( mdata_errors.length() > 0 ) status << "Error stack : " << endl; for(int i=0; idevice_state data member) and returns it to the caller. * * @return State Code * */ //+------------------------------------------------------------------ Tango::DevState Bilt::dev_state() { Tango::DevState argout = DeviceImpl::dev_state(); DEBUG_STREAM << "Bilt::dev_state(): entering... !" << endl; // Add your own code to control device here int state; int errors; try { omni_mutex_lock l(data_mutex); state = mdata.state; INFO_STREAM << "magnet state for " << get_name() << " = " << state << endl; errors = mdata_errors.length(); INFO_STREAM << "mdata errors = " << mdata_errors.length() << endl; } catch (Tango::DevFailed &e) { // do nothing! // Just avoid exceptions when executing state or status! } if ( errors != 0 ) set_state (Tango::UNKNOWN); else { // set the device state switch (state) { case -1: set_state (Tango::UNKNOWN); bilt_connection_lost = true; break; case 0: set_state (Tango::OFF); break; case 1: set_state (Tango::ON); break; case 2: set_state (Tango::ALARM); break; case 3: set_state (Tango::FAULT); break; default: set_state (Tango::UNKNOWN); break; } } // Check for attribute alarms if ( get_state() == Tango::ON && argout == Tango::ALARM ) set_state (Tango::ALARM); return get_state(); } //+------------------------------------------------------------------ /** * method: Bilt::setpoint_check * * description: method to execute "SetpointCheck" * Check the given current values against the specified limits. * * @param argin Setpoint values for the Poles * @return true when settings are OK * */ //+------------------------------------------------------------------ Tango::DevBoolean Bilt::setpoint_check(const Tango::DevVarDoubleArray *argin) { Tango::DevBoolean argout ; DEBUG_STREAM << "Bilt::setpoint_check(): entering... !" << endl; // Add your own code to control device here // get the min and max values for the current settings Tango::MultiAttribute *attr_list = get_device_attr(); Tango::WAttribute &attr_curr = attr_list->get_w_attr_by_name ("Currents"); double min, max; attr_curr.get_min_value(min); attr_curr.get_max_value(max); INFO_STREAM << "min = " << min << " max = " << max << endl; // check the input values argout = true; for ( int i=0; ilength(); i++ ) { INFO_STREAM << "i = " << i << " curr = " << (*argin)[i] << endl; if ( (*argin)[i] < min || (*argin)[i] > max ) { argout = false; break; } } return argout; } } // namespace Node-path: powersupply/itest/Bilt/trunk/Bilt.h Node-kind: file Node-action: change Text-content-length: 12896 Text-content-md5: 956d28bda243be815b1934e407eaba48 Content-length: 12896 //============================================================================= // // file : Bilt.h // // description : Include for the Bilt class. // // project : BILT multi channel power supply // // $Author: meyer $ // // $Revision: 1.14 $ // $Date: 2010-11-23 07:12:39 $ // // SVN only: // $HeadURL: $ // // CVS only: // $Source: /segfs/tango/cvsroot/cppserver/machine/powersupply/SrSteerers/tango/Bilt/Bilt.h,v $ // $Log: not supported by cvs2svn $ // Revision 1.13 2010/11/10 14:00:29 meyer // Changed unit of AC RMS and average value from A to mA. // // Revision 1.12 2010-11-10 12:01:29 meyer // Changed type of Temperatures attribute from long to double and moved // temperature reading to the acquisition thread. // // Revision 1.11 2010/08/31 07:54:48 meyer // Changed impedence alarm calculation limit. // // Revision 1.10 2010/06/21 07:13:05 meyer // Added a spectrum attribute for the temperature measurements and changed to libMagnet version 1.4. // // Revision 1.9 2010/05/01 16:58:39 meyer // Changed alarm limits for the impedance attribute. // // Revision 1.8 2010/03/16 14:54:58 meyer // Added reconnection method. // // Revision 1.7 2010-02-12 16:35:13 meyer // Added SetPoleCurrent command again. // // Revision 1.6 2010-02-11 16:35:27 meyer // Currents settings understand NaN values. // Deleted StePoleCurrent command. // // Revision 1.5 2010/02/10 12:27:31 meyer // Restructured Bilt class. // Acquistion is now done by a thread and only the multi channel data // gets exported. A single channel class (BiltCh) was created. // // Revision 1.4 2009/11/27 13:49:26 meyer // Modified structure! The pole is no longer a device. // The device is now a magnet with three poles. // // Revision 1.3 2009/11/26 10:46:58 meyer // Updated for libMagnet_V120 // // Revision 1.2 2009/11/06 12:46:25 meyer // Added impedance attribute and corrected fromatting of attribute values. // // Revision 1.1.1.1 2009/11/04 16:23:02 meyer // Imported using TkCVS // // // copyleft : European Synchrotron Radiation Facility // BP 220, Grenoble 38043 // FRANCE // //============================================================================= // // This file is generated by POGO // (Program Obviously used to Generate tango Object) // // (c) - Software Engineering Group - ESRF //============================================================================= #ifndef _BILT_H #define _BILT_H #include #include #include //using namespace Tango; /** * @author $Author: meyer $ * @version $Revision: 1.14 $ */ // Add your own constant definitions here. //----------------------------------------------- // Number of poles per magnet #define POLES 3 // Current limit for a valid impedeance calculation #define CURRENT_LIMIT 0.05 // define sleep times #define SLEEP_NS 20000000 // 20 ms #define SHORT_SLEEP_NS 5000000 // 5 ms namespace Bilt_ns { class AcquisitionThread; /** * Class Description: * The BILT multi channel power supply will be used with 3 channels for the ESRF fast * feedback systems. * The power supply can be controlled in 2 ways : * By this device server for slow or human control or * by the Libera Beam Position monitors for fast feedback with closed loop control. * The devices are exported as one device per steerer magnet. Every device has three * channels. The channels (poles) cannot be switched on individually but have their * individual set points and measurement values. */ /* * Device States Description: * Tango::ON : Magnet is ON, all three channels are ON. * Tango::OFF : Magnet is OFF, all three channels are OFF. * Tango::FAULT : Error detected by the BILT magnet. * Tango::ALARM : Alarm detected on one or more channels. * Tango::UNKNOWN : Communication fault */ class Bilt: public Tango::Device_4Impl { public : // Add your own data members here //----------------------------------------- // Here is the Start of the automatic code generation part //------------------------------------------------------------- /** * @name attributes * Attribute member data. */ //@{ Tango::DevDouble *attr_Currents_read; Tango::DevDouble attr_Currents_write; Tango::DevDouble *attr_Voltages_read; Tango::DevDouble *attr_Impedances_read; Tango::DevDouble *attr_SetCurrentsRMS_read; Tango::DevDouble *attr_SetCurrentsAverage_read; Tango::DevULong *attr_FramesPerSecond_read; Tango::DevULong *attr_ErrorsPerSecond_read; Tango::DevULong *attr_ErrorCounters_read; Tango::DevBoolean *attr_LocalControls_read; Tango::DevDouble *attr_Temperatures_read; //@} /** * @name Device properties * Device properties member data. */ //@{ /** * IP Address of BILT controller. * Each controller includes several magnets and * each magnet includes 3 power supplies, * for corrections in the X, Y and Z planes. * * */ string iPAddress; /** * Magnet number from 1 to 48 */ Tango::DevShort magnetNumber; /** * The update period for the data reading from the power supply in milli seconds. */ Tango::DevLong updatePeriod; //@} /** * @name Device properties * Device property member data. */ //@{ //@} /**@name Constructors * Miscellaneous constructors */ //@{ /** * Constructs a newly allocated Command object. * * @param cl Class. * @param s Device Name */ Bilt(Tango::DeviceClass *cl,string &s); /** * Constructs a newly allocated Command object. * * @param cl Class. * @param s Device Name */ Bilt(Tango::DeviceClass *cl,const char *s); /** * Constructs a newly allocated Command object. * * @param cl Class. * @param s Device name * @param d Device description. */ Bilt(Tango::DeviceClass *cl,const char *s,const char *d); //@} /**@name Destructor * Only one destructor is defined for this class */ //@{ /** * The object destructor. */ ~Bilt() {delete_device();}; /** * will be called at device destruction or at init command. */ void delete_device(); //@} /**@name Miscellaneous methods */ //@{ /** * Initialize the device */ virtual void init_device(); /** * Always executed method before execution command method. */ virtual void always_executed_hook(); //@} /** * @name Bilt methods prototypes */ //@{ /** * Hardware acquisition for attributes. */ virtual void read_attr_hardware(vector &attr_list); /** * Extract real attribute values for Currents acquisition result. */ virtual void read_Currents(Tango::Attribute &attr); /** * Write Currents attribute values to hardware. */ virtual void write_Currents(Tango::WAttribute &attr); /** * Extract real attribute values for Voltages acquisition result. */ virtual void read_Voltages(Tango::Attribute &attr); /** * Extract real attribute values for Impedances acquisition result. */ virtual void read_Impedances(Tango::Attribute &attr); /** * Extract real attribute values for SetCurrentsRMS acquisition result. */ virtual void read_SetCurrentsRMS(Tango::Attribute &attr); /** * Extract real attribute values for SetCurrentsAverage acquisition result. */ virtual void read_SetCurrentsAverage(Tango::Attribute &attr); /** * Extract real attribute values for FramesPerSecond acquisition result. */ virtual void read_FramesPerSecond(Tango::Attribute &attr); /** * Extract real attribute values for ErrorsPerSecond acquisition result. */ virtual void read_ErrorsPerSecond(Tango::Attribute &attr); /** * Extract real attribute values for ErrorCounters acquisition result. */ virtual void read_ErrorCounters(Tango::Attribute &attr); /** * Extract real attribute values for LocalControls acquisition result. */ virtual void read_LocalControls(Tango::Attribute &attr); /** * Extract real attribute values for Temperatures acquisition result. */ virtual void read_Temperatures(Tango::Attribute &attr); /** * Read/Write allowed for Currents attribute. */ virtual bool is_Currents_allowed(Tango::AttReqType type); /** * Read/Write allowed for Voltages attribute. */ virtual bool is_Voltages_allowed(Tango::AttReqType type); /** * Read/Write allowed for Impedances attribute. */ virtual bool is_Impedances_allowed(Tango::AttReqType type); /** * Read/Write allowed for SetCurrentsRMS attribute. */ virtual bool is_SetCurrentsRMS_allowed(Tango::AttReqType type); /** * Read/Write allowed for SetCurrentsAverage attribute. */ virtual bool is_SetCurrentsAverage_allowed(Tango::AttReqType type); /** * Read/Write allowed for FramesPerSecond attribute. */ virtual bool is_FramesPerSecond_allowed(Tango::AttReqType type); /** * Read/Write allowed for ErrorsPerSecond attribute. */ virtual bool is_ErrorsPerSecond_allowed(Tango::AttReqType type); /** * Read/Write allowed for ErrorCounters attribute. */ virtual bool is_ErrorCounters_allowed(Tango::AttReqType type); /** * Read/Write allowed for LocalControls attribute. */ virtual bool is_LocalControls_allowed(Tango::AttReqType type); /** * Read/Write allowed for Temperatures attribute. */ virtual bool is_Temperatures_allowed(Tango::AttReqType type); /** * Execution allowed for On command. */ virtual bool is_On_allowed(const CORBA::Any &any); /** * Execution allowed for Off command. */ virtual bool is_Off_allowed(const CORBA::Any &any); /** * Execution allowed for Reset command. */ virtual bool is_Reset_allowed(const CORBA::Any &any); /** * Execution allowed for SetPoleAcCurrent command. */ virtual bool is_SetPoleAcCurrent_allowed(const CORBA::Any &any); /** * Execution allowed for LocalPoleControl command. */ virtual bool is_LocalPoleControl_allowed(const CORBA::Any &any); /** * Execution allowed for SetpointCheck command. */ virtual bool is_SetpointCheck_allowed(const CORBA::Any &any); /** * Execution allowed for SetPoleCurrent command. */ virtual bool is_SetPoleCurrent_allowed(const CORBA::Any &any); /** * This command gets the device state (stored in its device_state data member) and returns it to the caller. * @return State Code * @exception DevFailed */ virtual Tango::DevState dev_state(); /** * This command gets the device status (stored in its device_status data member) and returns it to the caller. * @return Status description * @exception DevFailed */ virtual Tango::ConstDevString dev_status(); /** * Turns on power supply. * @exception DevFailed */ void on(); /** * Turns of power supply * @exception DevFailed */ void off(); /** * Reset faults and alarms * @exception DevFailed */ void reset(); /** * Set the AC current for one Pole. * [0] = pole number, [1] = current * @param argin [0] = pole number, [1] = current * @exception DevFailed */ void set_pole_ac_current(const Tango::DevVarDoubleArray *); /** * Set the AC current for one Pole. * [0] = pole number, [1] = local control true/false * @param argin [0] = pole number, [1] = local control true/false * @exception DevFailed */ void local_pole_control(const Tango::DevVarShortArray *); /** * Check the given current values against the specified limits. * @param argin Setpoint values for the Poles * @return true when settings are OK * @exception DevFailed */ Tango::DevBoolean setpoint_check(const Tango::DevVarDoubleArray *); /** * Set the current for one Pole. * [0] = pole number, [1] = current * @param argin [0] = pole number, [1] = current * @exception DevFailed */ void set_pole_current(const Tango::DevVarDoubleArray *); /** * Read the device properties from database */ void get_device_property(); //@} // Here is the end of the automatic code generation part //------------------------------------------------------------- protected : // Add your own data members here //----------------------------------------- friend class AcquisitionThread; AcquisitionThread *acquisition_thread; omni_mutex data_mutex; omni_mutex bilt_mutex; short exit_thread; struct timeval data_set_time; struct timeval data_read_time; void create_tango_exception (itest::ItestException &e, string reason, string desc, string origin); void create_tango_exception (itest::ItestException &e, Tango::DevErrorList &errors, string reason, string desc, string origin); itest::TMagnet *BILT; bool bilt_connection_lost; struct itest::mdata mdata; struct itest::fdata fdata[POLES]; Tango::DevErrorList mdata_errors; Tango::DevErrorList fdata_errors; Tango::DevErrorList temp_errors; vector currents_dc; vector currents_ac; vector voltages; vector impedances; vector currents_rms; vector currents_average; vector frames_per_sec; vector errors_per_sec; vector error_counters; vector temperatures; bool local_control[3]; }; } // namespace_ns #endif // _BILT_H Revision-number: 69 Prop-content-length: 123 Content-length: 123 K 10 svn:author V 5 meyer K 8 svn:date V 27 2010-11-23T07:13:38.000000Z K 7 svn:log V 23 Changed version to 3.6 PROPS-END Node-path: powersupply/itest/Bilt/trunk/Makefile Node-kind: file Node-action: change Text-content-length: 6706 Text-content-md5: aa9360eec5189c651cff750f31328f54 Content-length: 6706 #============================================================================= # # file : Makefile # # description : Include for the Bilt class. # # project : Makefile to generate a Tango server # # $Author: meyer $ # # $Revision: 1.17 $ # # $Log: not supported by cvs2svn $ # Revision 1.16 2010-11-10 11:59:30 meyer # Changed version to 3.5 # # Revision 1.15 2010-11-08 15:29:42 meyer # Linking now with libtango.a version 7.2! # # Revision 1.14 2010/06/24 11:44:00 meyer # Changed version to 3.4 # # Revision 1.13 2010/06/21 07:16:52 meyer # Changed version to 3.3 # # Revision 1.12 2010/06/21 07:13:05 meyer # Added a spectrum attribute for the temperature measurements and changed to libMagnet version 1.4. # # Revision 1.11 2010/03/19 15:27:01 meyer # Canged to version 3.2 # # Revision 1.10 2010/03/16 15:03:33 meyer # Excluded Steerer class. # # Revision 1.9 2010/03/16 14:57:56 meyer # Rlease_3_1 # # Revision 1.8 2010-02-11 16:35:27 meyer # Currents settings understand NaN values. # Deleted StePoleCurrent command. # # Revision 1.7 2010/02/10 16:22:15 meyer # Release_3_0 # # Revision 1.6 2010/02/10 12:27:31 meyer # Restructured Bilt class. # Acquistion is now done by a thread and only the multi channel data # gets exported. A single channel class (BiltCh) was created. # # Revision 1.5 2009/12/18 12:02:18 meyer # Changed version number to 2.1 # # Revision 1.4 2009/12/18 10:19:23 meyer # Using libMagnet version 130 now. # # Revision 1.3 2009/11/27 13:49:26 meyer # Modified structure! The pole is no longer a device. # The device is now a magnet with three poles. # # Revision 1.2 2009/11/26 10:46:58 meyer # Updated for libMagnet_V120 # # Revision 1.1.1.1 2009/11/04 16:23:02 meyer # Imported using TkCVS # # # copyleft : European Synchrotron Radiation Facility # BP 220, Grenoble 38043 # FRANCE # #============================================================================= # This file is generated by POGO # (Program Obviously used to Generate tango Object) # # (c) - Software Engineering Group - ESRF #============================================================================= # CLASS = Bilt MAJOR_VERS = 3 MINOR_VERS = 6 RELEASE = Release_$(MAJOR_VERS)_$(MINOR_VERS) OS = $(shell /csadmin/common/scripts/get_os) PROCESSOR = $(shell uname -p) #----------------------------------------- # Set default home directories #----------------------------------------- TANGO_HOME = /segfs/tango/release/$(BIN_DIR) CPP_SERVERS = $(TANGO_HOME)/classes ifdef no_debug DEBUG = -O else DEBUG = -g endif ifdef _solaris CC = CC BIN_DIR=$(OS)_CC AR_SL = $(CC) -mt -G VERS_OPT = -h SL_EXT = so endif ifdef linux CC = c++ CC_SHLIB = $(CC) -fPIC $(PROCESSOR)=1 ifdef x86_64 NBITS=_64 endif BIN_DIR=$(OS)$(NBITS) AR_SL = $(CC) -fPIC -shared SL_EXT = so VERS_OPT = -Wl,-soname, endif INCLUDE_DIRS = -I$(TANGO_HOME)/include -I. \ -I$(CPP_SERVERS)/include \ -I libMagnet_V140 OBJS_DIR = obj/$(BIN_DIR) LIB_DIRS = -L $(CPP_SERVERS)/lib \ -L $(TANGO_HOME)/lib \ -L libMagnet_V140 TARGET_LIB = $(CPP_SERVERS)/lib/libtgclasses.a #----------------------------------------- # Set CXXFLAGS and LFLAGS #----------------------------------------- ifdef _solaris CXXFLAGS = $(DEBUG) -mt -D_PTHREADS $(INCLUDE_DIRS) LFLAGS = $(DEBUG) $(LIB_DIRS) \ -ltango \ -llog4tango \ -lomniORB4 \ -lomniDynamic4 \ -lomnithread \ -lCOS4 \ -lpthread \ -lposix4 -lsocket -lnsl \ -ltgclasses endif ifdef linux CXXFLAGS = -g -D_REENTRANT $(INCLUDE_DIRS) LFLAGS = $(DEBUG) $(LIB_DIRS) \ /segfs/tango/release/redhate5/lib/libtango.7.2.0.a \ -llog4tango \ -lomniORB4 \ -lomniDynamic4 \ -lomnithread \ -lCOS4 \ -ldl -lpthread \ -lMagnet \ -ltgclasses endif #----------------------------------------- # Set dependences #----------------------------------------- SVC_OBJS = $(OBJS_DIR)/$(CLASS).o \ $(OBJS_DIR)/$(CLASS)StateMachine.o \ $(OBJS_DIR)/$(CLASS)Class.o \ $(OBJS_DIR)/AcquisitionThread.o \ $(OBJS_DIR)/ClassFactory.o \ $(OBJS_DIR)/main.o SHLIB_OBJS = $(OBJS_DIR)/$(CLASS)Class.so.o \ $(OBJS_DIR)/$(CLASS)StateMachine.so.o \ $(OBJS_DIR)/$(CLASS).so.o \ $(OBJS_DIR)/AcquisitionThread.o SVC_INC = $(CLASS)Class.h \ $(CLASS).h \ AcquisitionThread.h $(OBJS_DIR)/%.o: %.cpp $(SVC_INC) $(CC) $(CXXFLAGS) -c $< -o $(OBJS_DIR)/$*.o $(OBJS_DIR)/%.so.o: %.cpp $(SVC_INC) $(CC_SHLIB) $(CXXFLAGS) -c $< -o $(OBJS_DIR)/$*.so.o #----------------------------------------- # Make Entry #----------------------------------------- all: $(CLASS) $(CLASS): make_obj_dir make_bin_dir $(SVC_OBJS) $(CC) $(SVC_OBJS) -o $(CLASS) $(LFLAGS) @mv $(CLASS) bin/$(BIN_DIR)/$(CLASS) shlib: make_obj_dir make_shlib_dir $(SHLIB_OBJS) $(AR_SL) -o \ shlib/$(BIN_DIR)/$(CLASS).$(SL_EXT).$(MAJOR_VERS).$(MINOR_VERS) \ $(VERS_OPT)$(CLASS).$(SL_EXT).$(MAJOR_VERS) \ $(SHLIB_OBJS) $(LFLAGS) @rm -f shlib/$(BIN_DIR)/$(CLASS).$(SL_EXT) @cd shlib/$(BIN_DIR); \ ln -s $(CLASS).$(SL_EXT).$(MAJOR_VERS).$(MINOR_VERS) $(CLASS).$(SL_EXT) clean: rm -f $(OBJS_DIR)/*.o \ $(OBJS_DIR)/*.so.o \ bin/$(BIN_DIR)/$(CLASS) \ core make_obj_dir: @mkdir -p obj @mkdir -p obj/$(BIN_DIR) make_bin_dir: @mkdir -p bin @mkdir -p bin/$(BIN_DIR) make_shlib_dir: @mkdir -p shlib @mkdir -p shlib/$(BIN_DIR) #----------------------------------------- # Install binary file #----------------------------------------- install: cp bin/$(BIN_DIR)/$(CLASS) $(CPP_SERVERS)/bin #----------------------------------------- # Update class library and header files # recompile without debug mode. #----------------------------------------- lib: clean @make no_debug=1 cp *.h $(CPP_SERVERS)/include ar ruv $(TARGET_LIB) $(OBJS_DIR)/$(CLASS).o ar ruv $(TARGET_LIB) $(OBJS_DIR)/$(CLASS)Class.o ar ruv $(TARGET_LIB) $(OBJS_DIR)/$(CLASS)StateMachine.o ar ruv $(TARGET_LIB) $(OBJS_DIR)/AcquisitionThread.o ident $(TARGET_LIB) | grep $(CLASS) #------------------------------------------------------ # Tag the CVS/SVN module corresponding to this class # copy cvs_tag or svn_tag to tag: entry #------------------------------------------------------ #svn_tag: # svn copy ../trunk ../tags/$(RELEASE) # svn commit ../tags/$(RELEASE) \ # -m "Tagging the $(RELEASE) of the $(CLASS) project." # #cvs_tag: # @cvstag "$(CLASS)-$(RELEASE)" # @make $(CLASS) # @make show_tag #show_cvs_tag: # @cvstag -d # # Only these make options work with the current Pogo version 5.3.x! tag: @cvstag "$(CLASS)-$(RELEASE)" @make $(CLASS) @make show_tag show_tag: @cvstag -d Revision-number: 70 Prop-content-length: 147 Content-length: 147 K 8 svn:date V 27 2010-11-23T07:13:39.000000Z K 7 svn:log V 73 This commit was manufactured by cvs2svn to create tag 'Bilt-Release_3_6'. PROPS-END Node-path: powersupply/itest/Bilt/tags/Bilt-Release_3_6 Node-kind: dir Node-action: add Node-copyfrom-rev: 69 Node-copyfrom-path: powersupply/itest/Bilt/trunk Revision-number: 71 Prop-content-length: 280 Content-length: 280 K 10 svn:author V 5 meyer K 8 svn:date V 27 2010-11-26T08:40:04.000000Z K 7 svn:log V 179 Caught exceptions in in dev_state around DevImp::dev_state. Temperature alarm checking might return an exception. Sleep time between the writing og current settings set to 20ms. PROPS-END Node-path: powersupply/itest/Bilt/trunk/Bilt.cpp Node-kind: file Node-action: change Text-content-length: 37242 Text-content-md5: 6a73de96ed0f57d094fa27ad45836bc7 Content-length: 37242 static const char *RcsId = "$Id: Bilt.cpp,v 1.19 2010-11-26 08:40:04 meyer Exp $"; //+============================================================================= // // file : Bilt.cpp // // description : C++ source for the Bilt and its commands. // The class is derived from Device. It represents the // CORBA servant object which will be accessed from the // network. All commands which can be executed on the // Bilt are implemented in this file. // // project : TANGO Device Server // // $Author: meyer $ // // $Revision: 1.19 $ // // $Revision: 1.19 $ // $Date: 2010-11-26 08:40:04 $ // // SVN only: // $HeadURL: $ // // CVS only: // $Source: /segfs/tango/cvsroot/cppserver/machine/powersupply/SrSteerers/tango/Bilt/Bilt.cpp,v $ // $Log: not supported by cvs2svn $ // Revision 1.18 2010/11/23 07:12:39 meyer // Changed placement of bilt_mutex in write_Current. // // Revision 1.17 2010/11/17 11:42:48 meyer // Replaced the INVALID attribute quality by an exception. // This should avoid a bug in the Tango api which does not take the // attribute quality into account during alarm checking! // // Revision 1.16 2010/11/10 14:00:29 meyer // Changed unit of AC RMS and average value from A to mA. // // Revision 1.15 2010-11-10 12:01:29 meyer // Changed type of Temperatures attribute from long to double and moved // temperature reading to the acquisition thread. // // Revision 1.14 2010/06/21 07:13:05 meyer // Added a spectrum attribute for the temperature measurements and changed to libMagnet version 1.4. // // Revision 1.13 2010/05/01 16:58:39 meyer // Changed alarm limits for the impedance attribute. // // Revision 1.12 2010/03/16 14:54:58 meyer // Added reconnection method. // // Revision 1.11 2010-02-18 16:46:31 meyer // Filled-in code for SetpointCheck // // Revision 1.10 2010-02-12 16:35:13 meyer // Added SetPoleCurrent command again. // // Revision 1.9 2010-02-11 16:35:27 meyer // Currents settings understand NaN values. // Deleted StePoleCurrent command. // // Revision 1.8 2010/02/10 12:27:31 meyer // Restructured Bilt class. // Acquistion is now done by a thread and only the multi channel data // gets exported. A single channel class (BiltCh) was created. // // Revision 1.7 2009/12/18 12:01:40 meyer // Corrected alarm handling in dev_state() // // Revision 1.6 2009/11/27 13:49:26 meyer // Modified structure! The pole is no longer a device. // The device is now a magnet with three poles. // // Revision 1.5 2009/11/26 10:46:58 meyer // Updated for libMagnet_V120 // // Revision 1.4 2009/11/24 09:21:46 meyer // Absolut value for impedance // // Revision 1.3 2009/11/23 16:46:58 meyer // Corrected state, status and exception handling // // Revision 1.2 2009/11/06 12:46:25 meyer // Added impedance attribute and corrected fromatting of attribute values. // // Revision 1.1.1.1 2009/11/04 16:23:02 meyer // Imported using TkCVS // // // copyleft : European Synchrotron Radiation Facility // BP 220, Grenoble 38043 // FRANCE // //-============================================================================= // // This file is generated by POGO // (Program Obviously used to Generate tango Object) // // (c) - Software Engineering Group - ESRF //============================================================================= //=================================================================== // // The following table gives the correspondence // between commands and method name. // // Command name | Method name // ---------------------------------------- // State | dev_state() // Status | dev_status() // On | on() // Off | off() // Reset | reset() // SetPoleAcCurrent | set_pole_ac_current() // LocalPoleControl | local_pole_control() // SetpointCheck | setpoint_check() // SetPoleCurrent | set_pole_current() // //=================================================================== #include #include #include #include #include namespace Bilt_ns { //+---------------------------------------------------------------------------- // // method : Bilt::Bilt(string &s) // // description : constructor for simulated Bilt // // in : - cl : Pointer to the DeviceClass object // - s : Device name // //----------------------------------------------------------------------------- Bilt::Bilt(Tango::DeviceClass *cl,string &s) :Tango::Device_4Impl(cl,s.c_str()) { init_device(); } Bilt::Bilt(Tango::DeviceClass *cl,const char *s) :Tango::Device_4Impl(cl,s) { init_device(); } Bilt::Bilt(Tango::DeviceClass *cl,const char *s,const char *d) :Tango::Device_4Impl(cl,s,d) { init_device(); } //+---------------------------------------------------------------------------- // // method : Bilt::delete_device() // // description : will be called at device destruction or at init command. // //----------------------------------------------------------------------------- void Bilt::delete_device() { // Delete device allocated objects if ( acquisition_thread != NULL ) { data_mutex.lock(); exit_thread = true; data_mutex.unlock(); // join now the thread until it exits int *rv; acquisition_thread->join((void **)&rv); cout << "Bilt::delete_device(): Exit acquisition thread !!!" << endl; } // Delete connection to the power supply delete BILT; BILT = NULL; } //+---------------------------------------------------------------------------- // // method : Bilt::init_device() // // description : will be called at device initialization. // //----------------------------------------------------------------------------- void Bilt::init_device() { INFO_STREAM << "Bilt::Bilt() create device " << device_name << endl; // Initialise variables to default values //-------------------------------------------- get_device_property(); set_state (Tango::OFF); try { BILT = new itest::TMagnet (iPAddress.c_str(), magnetNumber); } catch (itest::ItestException &e) { try { create_tango_exception (e, mdata_errors, "Init failure" , "Cannot initialise ITEST libray objects", "Bilt::init_device"); } catch (Tango::DevFailed &e) { set_state (Tango::UNKNOWN); } } // initialise with the actual current set point values try { for (int i=0; ipole(i).get_current_DC(); } Tango::MultiAttribute *attr_list = get_device_attr(); Tango::WAttribute &attr_curr = attr_list->get_w_attr_by_name ("Currents"); attr_curr.set_write_value(¤ts_dc[0], currents_dc.size()); } catch (itest::ItestException &e) { try { create_tango_exception (e, mdata_errors, "Init failure" , "Cannot read the actual current set point values", "Bilt::init_device"); } catch (Tango::DevFailed &e) { set_state (Tango::UNKNOWN); } } // initialise and start the acquisition thread exit_thread = false; acquisition_thread = new AcquisitionThread(this, data_mutex, bilt_mutex); } //+---------------------------------------------------------------------------- // // method : Bilt::get_device_property() // // description : Read the device properties from database. // //----------------------------------------------------------------------------- void Bilt::get_device_property() { // Initialize your default values here (if not done with POGO). //------------------------------------------------------------------ BILT = NULL; bilt_connection_lost = false; acquisition_thread = NULL; struct timeval now; gettimeofday (&now, NULL); data_set_time = now; data_read_time = now; // intitialise mdada structure for magnet read values mdata.magnet = -1; mdata.state = -1; for (int i=0; i_UseDb==true) get_db_device()->get_property(dev_prop); Tango::DbDatum def_prop, cl_prop; BiltClass *ds_class = (static_cast(get_device_class())); int i = -1; // Try to initialize IPAddress from class property cl_prop = ds_class->get_class_property(dev_prop[++i].name); if (cl_prop.is_empty()==false) cl_prop >> iPAddress; else { // Try to initialize IPAddress from default device value def_prop = ds_class->get_default_device_property(dev_prop[i].name); if (def_prop.is_empty()==false) def_prop >> iPAddress; } // And try to extract IPAddress value from database if (dev_prop[i].is_empty()==false) dev_prop[i] >> iPAddress; // Try to initialize MagnetNumber from class property cl_prop = ds_class->get_class_property(dev_prop[++i].name); if (cl_prop.is_empty()==false) cl_prop >> magnetNumber; else { // Try to initialize MagnetNumber from default device value def_prop = ds_class->get_default_device_property(dev_prop[i].name); if (def_prop.is_empty()==false) def_prop >> magnetNumber; } // And try to extract MagnetNumber value from database if (dev_prop[i].is_empty()==false) dev_prop[i] >> magnetNumber; // Try to initialize UpdatePeriod from class property cl_prop = ds_class->get_class_property(dev_prop[++i].name); if (cl_prop.is_empty()==false) cl_prop >> updatePeriod; else { // Try to initialize UpdatePeriod from default device value def_prop = ds_class->get_default_device_property(dev_prop[i].name); if (def_prop.is_empty()==false) def_prop >> updatePeriod; } // And try to extract UpdatePeriod value from database if (dev_prop[i].is_empty()==false) dev_prop[i] >> updatePeriod; // End of Automatic code generation //------------------------------------------------------------------ } //+---------------------------------------------------------------------------- // // method : Bilt::always_executed_hook() // // description : method always executed before any command is executed // //----------------------------------------------------------------------------- void Bilt::always_executed_hook() { } //+---------------------------------------------------------------------------- // // method : Bilt::read_attr_hardware // // description : Hardware acquisition for attributes. // //----------------------------------------------------------------------------- void Bilt::read_attr_hardware(vector &attr_list) { DEBUG_STREAM << "Bilt::read_attr_hardware(vector &attr_list) entering... "<< endl; // Add your own code here } //+---------------------------------------------------------------------------- // // method : Bilt::read_Temperatures // // description : Extract real attribute values for Temperatures acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_Temperatures(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_Temperatures(Tango::Attribute &attr) entering... "<< endl; omni_mutex_lock l(data_mutex); if ( temp_errors.length() != 0 ) { //attr.set_quality(Tango::ATTR_INVALID); // 17.11.2020 // The Tango API does not tke into account the attribute // quality factor when checking for alarms!!! // Until the bus is repaired we just return an exception! TangoSys_MemStream tms; tms << "Error on temperatur reading, no data available!" << endl; Tango::Except::throw_exception("ReadError", tms.str(), "Bilt::read_Temperatures"); } else { attr.set_value (&(temperatures[0]), 2*POLES); } } //+---------------------------------------------------------------------------- // // method : Bilt::read_FramesPerSecond // // description : Extract real attribute values for FramesPerSecond acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_FramesPerSecond(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_FramesPerSecond(Tango::Attribute &attr) entering... "<< endl; omni_mutex_lock l(data_mutex); if ( fdata_errors.length() != 0 ) attr.set_quality(Tango::ATTR_INVALID); else { for (int i=0; ipole(i).get_switch(); } if ( switch_state == 1 ) local_control[i] = false; else local_control[i] = true; } } catch (itest::ItestException &e) { create_tango_exception (e, "Read failure" , "Cannot read the actual switch states", "Bilt::read_LocalControls"); } attr.set_value (&(local_control[0]), POLES); } //+---------------------------------------------------------------------------- // // method : Bilt::read_SetCurrentsRMS // // description : Extract real attribute values for SetCurrentsRMS acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_SetCurrentsRMS(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_SetCurrentsRMS(Tango::Attribute &attr) entering... "<< endl; omni_mutex_lock l(data_mutex); if ( fdata_errors.length() != 0 ) attr.set_quality(Tango::ATTR_INVALID); else { for (int i=0; i CURRENT_LIMIT ) impedances[i] = fabs (mdata.idata[i].measvolt / mdata.idata[i].meascurr); else impedances[i] = nan("NaN"); } } attr.set_value (&(impedances[0]), POLES); } //+---------------------------------------------------------------------------- // // method : Bilt::write_Currents // // description : Write Currents attribute values to hardware. // //----------------------------------------------------------------------------- void Bilt::write_Currents(Tango::WAttribute &attr) { DEBUG_STREAM << "Bilt::write_Currents(Tango::WAttribute &attr) entering... "<< endl; const double *set_currents; // check the correct number of setpoints if ( attr.get_write_value_length() == POLES ) attr.get_write_value(set_currents); else { TangoSys_MemStream tms; tms << "Wrong number of setpoints!" << endl; Tango::Except::throw_exception("WriteError", tms.str(), "Bilt::write_Currents"); } // apply setpoints to the poles try { omni_mutex_lock l(bilt_mutex); for (int i=0; i 0 ) //{ // sleep for 20 ms between the write requests struct timespec sleep_time = {0, SLEEP_NS}; nanosleep(&sleep_time, NULL); //} BILT->pole(i).set_current_DC (set_currents[i]); } // initialise the set time, to be sure that the next // returned read value is newer and contains the changes. struct timeval now; gettimeofday (&now, NULL); data_set_time = now; } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot write DC current values", "Bilt::write_Currents"); } } //+---------------------------------------------------------------------------- // // method : Bilt::read_Currents // // description : Extract real attribute values for Currents acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_Currents(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_Currents(Tango::Attribute &attr) entering... "<< endl; // wait for the next data acquisition afer a current setpoint change double delay; { omni_mutex_lock l(data_mutex); delay = (data_set_time.tv_sec * 1e6 + data_set_time.tv_usec) - (data_read_time.tv_sec * 1e6 + data_read_time.tv_usec); //cout << "delay = " << delay << endl; } while ( delay > 0 ) { // 20 ms struct timespec sleep_time = {0, SLEEP_NS}; nanosleep(&sleep_time, NULL); omni_mutex_lock l(data_mutex); delay = (data_set_time.tv_sec * 1e6 + data_set_time.tv_usec) - (data_read_time.tv_sec * 1e6 + data_read_time.tv_usec); INFO_STREAM << "read waiting delay = " << delay << endl; } omni_mutex_lock l(data_mutex); if ( mdata_errors.length() != 0 ) attr.set_quality(Tango::ATTR_INVALID); else { for (int i=0; iset_state(1); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot switch on pole", "Bilt::on"); } } //+------------------------------------------------------------------ /** * method: Bilt::off * * description: method to execute "Off" * Turns of power supply * * */ //+------------------------------------------------------------------ void Bilt::off() { DEBUG_STREAM << "Bilt::off(): entering... !" << endl; // Add your own code to control device here try { omni_mutex_lock l(bilt_mutex); BILT->set_state(0); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot switch off pole", "Bilt::off"); } } //+------------------------------------------------------------------ /** * method: Bilt::reset * * description: method to execute "Reset" * Reset faults and alarms * * */ //+------------------------------------------------------------------ void Bilt::reset() { DEBUG_STREAM << "Bilt::reset(): entering... !" << endl; // Add your own code to control device here try { omni_mutex_lock l(bilt_mutex); BILT->clear_all_err(); BILT->clear_alarm(); for (int i=0; ipole(i).clear_ferrors(); } } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot reset pole", "Bilt::reset"); } } //+------------------------------------------------------------------ /** * method: Bilt::set_pole_ac_current * * description: method to execute "SetPoleAcCurrent" * Set the AC current for one Pole. * [0] = pole number, [1] = current * * @param argin [0] = pole number, [1] = current * */ //+------------------------------------------------------------------ void Bilt::set_pole_ac_current(const Tango::DevVarDoubleArray *argin) { DEBUG_STREAM << "Bilt::set_pole_ac_current(): entering... !" << endl; // Add your own code to control device here // argin[0] = pole number if ( (*argin)[0] < 0 || (*argin)[0] >= POLES ) { TangoSys_MemStream tms; tms << "The entered Pole number is out of range" << endl; Tango::Except::throw_exception("WriteError", tms.str(), "Bilt::set_pole_ac_current"); } try { omni_mutex_lock l(bilt_mutex); BILT->pole((int)(*argin)[0]).set_current_AC ((*argin)[1]); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot write AC current value", "Bilt::set_pole_ac_current"); } } //+------------------------------------------------------------------ /** * method: Bilt::local_pole_control * * description: method to execute "LocalPoleControl" * Set the AC current for one Pole. * [0] = pole number, [1] = local control true/false * * @param argin [0] = pole number, [1] = local control true/false * */ //+------------------------------------------------------------------ void Bilt::local_pole_control(const Tango::DevVarShortArray *argin) { DEBUG_STREAM << "Bilt::local_pole_control(): entering... !" << endl; // Add your own code to control device here // argin[0] = pole number if ( (*argin)[0] < 0 || (*argin)[0] >= POLES ) { TangoSys_MemStream tms; tms << "The entered Pole number is out of range" << endl; Tango::Except::throw_exception("WriteError", tms.str(), "Bilt::local_pole_control"); } // argin[1] = true or false (1 or 0 ) if ( (*argin)[1] != 0 && (*argin)[1] != 1 ) { TangoSys_MemStream tms; tms << "Local control can only be choosen as 0 or 1 (false or true)" << endl; Tango::Except::throw_exception("WriteError", tms.str(), "Bilt::local_pole_control"); } try { int switch_state; if ( (*argin)[1] == true ) switch_state = 0; else switch_state = 1; omni_mutex_lock l(bilt_mutex); BILT->pole((*argin)[0]).set_switch (switch_state); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot write switch state", "Bilt::local_pole_control"); } } //+------------------------------------------------------------------ /** * method: Bilt::set_pole_current * * description: method to execute "SetPoleCurrent" * Set the current for one Pole. * [0] = pole number, [1] = current * * @param argin [0] = pole number, [1] = current * */ //+------------------------------------------------------------------ void Bilt::set_pole_current(const Tango::DevVarDoubleArray *argin) { DEBUG_STREAM << "Bilt::set_pole_current(): entering... !" << endl; // Add your own code to control device here // argin[0] = pole number if ( (*argin)[0] < 0 || (*argin)[0] >= POLES ) { TangoSys_MemStream tms; tms << "The entered Pole number is out of range" << endl; Tango::Except::throw_exception("WriteError", tms.str(), "Bilt::set_pole_current"); } try { omni_mutex_lock l(bilt_mutex); BILT->pole((int)(*argin)[0]).set_current_DC ((*argin)[1]); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot write current value", "Bilt::set_pole_current"); } // make sure that the current set values are correct! try { omni_mutex_lock l(bilt_mutex); for (int i=0; ipole(i).get_current_DC(); } Tango::MultiAttribute *attr_list = get_device_attr(); Tango::WAttribute &attr_curr = attr_list->get_w_attr_by_name ("Currents"); attr_curr.set_write_value(¤ts_dc[0], currents_dc.size()); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot read the actual current set point values", "Bilt::set_pole_current"); } // initialise the set time, to be sure that the next // returned read value is newer and contains the changes. struct timeval now; gettimeofday (&now, NULL); data_set_time = now; } //+------------------------------------------------------------------ /** * method: Bilt::create_tango_exception() * * description: convert an itest exception into a tango exception * * * in : - &e : Reference to itest exception * - reason : Reason of the local Tango exception to be added to the stack * - desc : Description for the local Tango exception to be added to the stack * - origin : Origin if the local Tango exception to be added to the stack */ //+------------------------------------------------------------------ void Bilt::create_tango_exception (itest::ItestException &e, string reason, string desc, string origin) { Tango::DevErrorList errors; create_tango_exception (e, errors, reason, desc, origin); } //+------------------------------------------------------------------ /** * method: Bilt::create_tango_exception() * * description: convert an itest exception into a tango exception * * * in : - &e : Reference to itest exception * - errors : Tango error list to use, to store exception info * - reason : Reason of the local Tango exception to be added to the stack * - desc : Description for the local Tango exception to be added to the stack * - origin : Origin if the local Tango exception to be added to the stack */ //+------------------------------------------------------------------ void Bilt::create_tango_exception (itest::ItestException &e, Tango::DevErrorList &errors, string reason, string desc, string origin) { DEBUG_STREAM << "Bilt::create_tango_exception(): entering... !" << endl; errors.length(e.errors.size() + 1); int i; for(i=0; idevice_status data member) and returns it to the caller. * * @return Status description * */ //+------------------------------------------------------------------ Tango::ConstDevString Bilt::dev_status() { //Tango::ConstDevString argout = DeviceImpl::dev_status(); DEBUG_STREAM << "Bilt::dev_status(): entering... !" << endl; // Add your own code to control device here stringstream status; Tango::DevState state = dev_state(); switch (state) { case Tango::ON: status << "State : ON" << endl; break; case Tango::OFF: status << "State : OFF" << endl; break; case Tango::ALARM: { status << "State : Alarm" << endl; omni_mutex_lock l(data_mutex); for (int i=0; i 10W in 10ms!" << endl; else { if ( mdata.idata[i].fail == "TEMP" ) status << "Fault descr. : Max. temp on semiconductor reached!" << endl; else { if ( mdata.idata[i].fail == "PWSO" ) status << "Fault descr. : Delivered power > 40W in 100ms!" << endl; else { status << "Fault descr. : Unkown fault code!" << endl; } } } } } } } break; } default: { { omni_mutex_lock l(data_mutex); status << "BILT state : Unknown" << endl; if ( bilt_connection_lost == true ) { status << "Connection lost to BILT power supply, trying to reconnect!" << endl; status << endl; } if ( mdata_errors.length() > 0 ) status << "Error stack : " << endl; for(int i=0; idevice_state data member) and returns it to the caller. * * @return State Code * */ //+------------------------------------------------------------------ Tango::DevState Bilt::dev_state() { // 17.11.2020 // Because an INVALID quality factor is not possible for // Temperature spectrum reading, an exception might be returned // during alarm checking! Tango::DevState argout; try { argout = DeviceImpl::dev_state(); } catch (Tango::DevFailed &e) { // just ignore temperature reading exception! } DEBUG_STREAM << "Bilt::dev_state(): entering... !" << endl; // Add your own code to control device here int state; int errors; try { omni_mutex_lock l(data_mutex); state = mdata.state; INFO_STREAM << "magnet state for " << get_name() << " = " << state << endl; errors = mdata_errors.length(); INFO_STREAM << "mdata errors = " << mdata_errors.length() << endl; } catch (Tango::DevFailed &e) { // do nothing! // Just avoid exceptions when executing state or status! } if ( errors != 0 ) set_state (Tango::UNKNOWN); else { // set the device state switch (state) { case -1: set_state (Tango::UNKNOWN); bilt_connection_lost = true; break; case 0: set_state (Tango::OFF); break; case 1: set_state (Tango::ON); break; case 2: set_state (Tango::ALARM); break; case 3: set_state (Tango::FAULT); break; default: set_state (Tango::UNKNOWN); break; } } // Check for attribute alarms if ( get_state() == Tango::ON && argout == Tango::ALARM ) set_state (Tango::ALARM); return get_state(); } //+------------------------------------------------------------------ /** * method: Bilt::setpoint_check * * description: method to execute "SetpointCheck" * Check the given current values against the specified limits. * * @param argin Setpoint values for the Poles * @return true when settings are OK * */ //+------------------------------------------------------------------ Tango::DevBoolean Bilt::setpoint_check(const Tango::DevVarDoubleArray *argin) { Tango::DevBoolean argout ; DEBUG_STREAM << "Bilt::setpoint_check(): entering... !" << endl; // Add your own code to control device here // get the min and max values for the current settings Tango::MultiAttribute *attr_list = get_device_attr(); Tango::WAttribute &attr_curr = attr_list->get_w_attr_by_name ("Currents"); double min, max; attr_curr.get_min_value(min); attr_curr.get_max_value(max); INFO_STREAM << "min = " << min << " max = " << max << endl; // check the input values argout = true; for ( int i=0; ilength(); i++ ) { INFO_STREAM << "i = " << i << " curr = " << (*argin)[i] << endl; if ( (*argin)[i] < min || (*argin)[i] > max ) { argout = false; break; } } return argout; } } // namespace Revision-number: 72 Prop-content-length: 202 Content-length: 202 K 10 svn:author V 5 meyer K 8 svn:date V 27 2011-01-12T08:50:06.000000Z K 7 svn:log V 101 Deleted the wait time for the next reading after writing. Deleted sleep time during current writing. PROPS-END Node-path: powersupply/itest/Bilt/trunk/Bilt.cpp Node-kind: file Node-action: change Text-content-length: 37500 Text-content-md5: fec4c1162b74524cc36252cc8c5b9353 Content-length: 37500 static const char *RcsId = "$Id: Bilt.cpp,v 1.20 2011-01-12 08:50:06 meyer Exp $"; //+============================================================================= // // file : Bilt.cpp // // description : C++ source for the Bilt and its commands. // The class is derived from Device. It represents the // CORBA servant object which will be accessed from the // network. All commands which can be executed on the // Bilt are implemented in this file. // // project : TANGO Device Server // // $Author: meyer $ // // $Revision: 1.20 $ // // $Revision: 1.20 $ // $Date: 2011-01-12 08:50:06 $ // // SVN only: // $HeadURL: $ // // CVS only: // $Source: /segfs/tango/cvsroot/cppserver/machine/powersupply/SrSteerers/tango/Bilt/Bilt.cpp,v $ // $Log: not supported by cvs2svn $ // Revision 1.19 2010/11/26 08:40:04 meyer // Caught exceptions in in dev_state around DevImp::dev_state. // Temperature alarm checking might return an exception. // // Sleep time between the writing og current settings set to 20ms. // // Revision 1.18 2010/11/23 07:12:39 meyer // Changed placement of bilt_mutex in write_Current. // // Revision 1.17 2010/11/17 11:42:48 meyer // Replaced the INVALID attribute quality by an exception. // This should avoid a bug in the Tango api which does not take the // attribute quality into account during alarm checking! // // Revision 1.16 2010/11/10 14:00:29 meyer // Changed unit of AC RMS and average value from A to mA. // // Revision 1.15 2010-11-10 12:01:29 meyer // Changed type of Temperatures attribute from long to double and moved // temperature reading to the acquisition thread. // // Revision 1.14 2010/06/21 07:13:05 meyer // Added a spectrum attribute for the temperature measurements and changed to libMagnet version 1.4. // // Revision 1.13 2010/05/01 16:58:39 meyer // Changed alarm limits for the impedance attribute. // // Revision 1.12 2010/03/16 14:54:58 meyer // Added reconnection method. // // Revision 1.11 2010-02-18 16:46:31 meyer // Filled-in code for SetpointCheck // // Revision 1.10 2010-02-12 16:35:13 meyer // Added SetPoleCurrent command again. // // Revision 1.9 2010-02-11 16:35:27 meyer // Currents settings understand NaN values. // Deleted StePoleCurrent command. // // Revision 1.8 2010/02/10 12:27:31 meyer // Restructured Bilt class. // Acquistion is now done by a thread and only the multi channel data // gets exported. A single channel class (BiltCh) was created. // // Revision 1.7 2009/12/18 12:01:40 meyer // Corrected alarm handling in dev_state() // // Revision 1.6 2009/11/27 13:49:26 meyer // Modified structure! The pole is no longer a device. // The device is now a magnet with three poles. // // Revision 1.5 2009/11/26 10:46:58 meyer // Updated for libMagnet_V120 // // Revision 1.4 2009/11/24 09:21:46 meyer // Absolut value for impedance // // Revision 1.3 2009/11/23 16:46:58 meyer // Corrected state, status and exception handling // // Revision 1.2 2009/11/06 12:46:25 meyer // Added impedance attribute and corrected fromatting of attribute values. // // Revision 1.1.1.1 2009/11/04 16:23:02 meyer // Imported using TkCVS // // // copyleft : European Synchrotron Radiation Facility // BP 220, Grenoble 38043 // FRANCE // //-============================================================================= // // This file is generated by POGO // (Program Obviously used to Generate tango Object) // // (c) - Software Engineering Group - ESRF //============================================================================= //=================================================================== // // The following table gives the correspondence // between commands and method name. // // Command name | Method name // ---------------------------------------- // State | dev_state() // Status | dev_status() // On | on() // Off | off() // Reset | reset() // SetPoleAcCurrent | set_pole_ac_current() // LocalPoleControl | local_pole_control() // SetpointCheck | setpoint_check() // SetPoleCurrent | set_pole_current() // //=================================================================== #include #include #include #include #include namespace Bilt_ns { //+---------------------------------------------------------------------------- // // method : Bilt::Bilt(string &s) // // description : constructor for simulated Bilt // // in : - cl : Pointer to the DeviceClass object // - s : Device name // //----------------------------------------------------------------------------- Bilt::Bilt(Tango::DeviceClass *cl,string &s) :Tango::Device_4Impl(cl,s.c_str()) { init_device(); } Bilt::Bilt(Tango::DeviceClass *cl,const char *s) :Tango::Device_4Impl(cl,s) { init_device(); } Bilt::Bilt(Tango::DeviceClass *cl,const char *s,const char *d) :Tango::Device_4Impl(cl,s,d) { init_device(); } //+---------------------------------------------------------------------------- // // method : Bilt::delete_device() // // description : will be called at device destruction or at init command. // //----------------------------------------------------------------------------- void Bilt::delete_device() { // Delete device allocated objects if ( acquisition_thread != NULL ) { data_mutex.lock(); exit_thread = true; data_mutex.unlock(); // join now the thread until it exits int *rv; acquisition_thread->join((void **)&rv); cout << "Bilt::delete_device(): Exit acquisition thread !!!" << endl; } // Delete connection to the power supply delete BILT; BILT = NULL; } //+---------------------------------------------------------------------------- // // method : Bilt::init_device() // // description : will be called at device initialization. // //----------------------------------------------------------------------------- void Bilt::init_device() { INFO_STREAM << "Bilt::Bilt() create device " << device_name << endl; // Initialise variables to default values //-------------------------------------------- get_device_property(); set_state (Tango::OFF); try { BILT = new itest::TMagnet (iPAddress.c_str(), magnetNumber); } catch (itest::ItestException &e) { try { create_tango_exception (e, mdata_errors, "Init failure" , "Cannot initialise ITEST libray objects", "Bilt::init_device"); } catch (Tango::DevFailed &e) { set_state (Tango::UNKNOWN); } } // initialise with the actual current set point values try { for (int i=0; ipole(i).get_current_DC(); } Tango::MultiAttribute *attr_list = get_device_attr(); Tango::WAttribute &attr_curr = attr_list->get_w_attr_by_name ("Currents"); attr_curr.set_write_value(¤ts_dc[0], currents_dc.size()); } catch (itest::ItestException &e) { try { create_tango_exception (e, mdata_errors, "Init failure" , "Cannot read the actual current set point values", "Bilt::init_device"); } catch (Tango::DevFailed &e) { set_state (Tango::UNKNOWN); } } // initialise and start the acquisition thread exit_thread = false; acquisition_thread = new AcquisitionThread(this, data_mutex, bilt_mutex); } //+---------------------------------------------------------------------------- // // method : Bilt::get_device_property() // // description : Read the device properties from database. // //----------------------------------------------------------------------------- void Bilt::get_device_property() { // Initialize your default values here (if not done with POGO). //------------------------------------------------------------------ BILT = NULL; bilt_connection_lost = false; acquisition_thread = NULL; struct timeval now; gettimeofday (&now, NULL); data_set_time = now; data_read_time = now; // intitialise mdada structure for magnet read values mdata.magnet = -1; mdata.state = -1; for (int i=0; i_UseDb==true) get_db_device()->get_property(dev_prop); Tango::DbDatum def_prop, cl_prop; BiltClass *ds_class = (static_cast(get_device_class())); int i = -1; // Try to initialize IPAddress from class property cl_prop = ds_class->get_class_property(dev_prop[++i].name); if (cl_prop.is_empty()==false) cl_prop >> iPAddress; else { // Try to initialize IPAddress from default device value def_prop = ds_class->get_default_device_property(dev_prop[i].name); if (def_prop.is_empty()==false) def_prop >> iPAddress; } // And try to extract IPAddress value from database if (dev_prop[i].is_empty()==false) dev_prop[i] >> iPAddress; // Try to initialize MagnetNumber from class property cl_prop = ds_class->get_class_property(dev_prop[++i].name); if (cl_prop.is_empty()==false) cl_prop >> magnetNumber; else { // Try to initialize MagnetNumber from default device value def_prop = ds_class->get_default_device_property(dev_prop[i].name); if (def_prop.is_empty()==false) def_prop >> magnetNumber; } // And try to extract MagnetNumber value from database if (dev_prop[i].is_empty()==false) dev_prop[i] >> magnetNumber; // Try to initialize UpdatePeriod from class property cl_prop = ds_class->get_class_property(dev_prop[++i].name); if (cl_prop.is_empty()==false) cl_prop >> updatePeriod; else { // Try to initialize UpdatePeriod from default device value def_prop = ds_class->get_default_device_property(dev_prop[i].name); if (def_prop.is_empty()==false) def_prop >> updatePeriod; } // And try to extract UpdatePeriod value from database if (dev_prop[i].is_empty()==false) dev_prop[i] >> updatePeriod; // End of Automatic code generation //------------------------------------------------------------------ } //+---------------------------------------------------------------------------- // // method : Bilt::always_executed_hook() // // description : method always executed before any command is executed // //----------------------------------------------------------------------------- void Bilt::always_executed_hook() { } //+---------------------------------------------------------------------------- // // method : Bilt::read_attr_hardware // // description : Hardware acquisition for attributes. // //----------------------------------------------------------------------------- void Bilt::read_attr_hardware(vector &attr_list) { DEBUG_STREAM << "Bilt::read_attr_hardware(vector &attr_list) entering... "<< endl; // Add your own code here } //+---------------------------------------------------------------------------- // // method : Bilt::read_Temperatures // // description : Extract real attribute values for Temperatures acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_Temperatures(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_Temperatures(Tango::Attribute &attr) entering... "<< endl; omni_mutex_lock l(data_mutex); if ( temp_errors.length() != 0 ) { //attr.set_quality(Tango::ATTR_INVALID); // 17.11.2020 // The Tango API does not tke into account the attribute // quality factor when checking for alarms!!! // Until the bus is repaired we just return an exception! TangoSys_MemStream tms; tms << "Error on temperatur reading, no data available!" << endl; Tango::Except::throw_exception("ReadError", tms.str(), "Bilt::read_Temperatures"); } else { attr.set_value (&(temperatures[0]), 2*POLES); } } //+---------------------------------------------------------------------------- // // method : Bilt::read_FramesPerSecond // // description : Extract real attribute values for FramesPerSecond acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_FramesPerSecond(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_FramesPerSecond(Tango::Attribute &attr) entering... "<< endl; omni_mutex_lock l(data_mutex); if ( fdata_errors.length() != 0 ) attr.set_quality(Tango::ATTR_INVALID); else { for (int i=0; ipole(i).get_switch(); } if ( switch_state == 1 ) local_control[i] = false; else local_control[i] = true; } } catch (itest::ItestException &e) { create_tango_exception (e, "Read failure" , "Cannot read the actual switch states", "Bilt::read_LocalControls"); } attr.set_value (&(local_control[0]), POLES); } //+---------------------------------------------------------------------------- // // method : Bilt::read_SetCurrentsRMS // // description : Extract real attribute values for SetCurrentsRMS acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_SetCurrentsRMS(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_SetCurrentsRMS(Tango::Attribute &attr) entering... "<< endl; omni_mutex_lock l(data_mutex); if ( fdata_errors.length() != 0 ) attr.set_quality(Tango::ATTR_INVALID); else { for (int i=0; i CURRENT_LIMIT ) impedances[i] = fabs (mdata.idata[i].measvolt / mdata.idata[i].meascurr); else impedances[i] = nan("NaN"); } } attr.set_value (&(impedances[0]), POLES); } //+---------------------------------------------------------------------------- // // method : Bilt::write_Currents // // description : Write Currents attribute values to hardware. // //----------------------------------------------------------------------------- void Bilt::write_Currents(Tango::WAttribute &attr) { DEBUG_STREAM << "Bilt::write_Currents(Tango::WAttribute &attr) entering... "<< endl; const double *set_currents; // check the correct number of setpoints if ( attr.get_write_value_length() == POLES ) attr.get_write_value(set_currents); else { TangoSys_MemStream tms; tms << "Wrong number of setpoints!" << endl; Tango::Except::throw_exception("WriteError", tms.str(), "Bilt::write_Currents"); } // apply setpoints to the poles try { omni_mutex_lock l(bilt_mutex); for (int i=0; i 0 ) //{ // sleep for 20 ms between the write requests //struct timespec sleep_time = {0, SLEEP_NS}; //nanosleep(&sleep_time, NULL); //} BILT->pole(i).set_current_DC (set_currents[i]); } // initialise the set time, to be sure that the next // returned read value is newer and contains the changes. struct timeval now; gettimeofday (&now, NULL); data_set_time = now; } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot write DC current values", "Bilt::write_Currents"); } } //+---------------------------------------------------------------------------- // // method : Bilt::read_Currents // // description : Extract real attribute values for Currents acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_Currents(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_Currents(Tango::Attribute &attr) entering... "<< endl; // wait for the next data acquisition afer a current setpoint change /* double delay; { omni_mutex_lock l(data_mutex); delay = (data_set_time.tv_sec * 1e6 + data_set_time.tv_usec) - (data_read_time.tv_sec * 1e6 + data_read_time.tv_usec); //cout << "delay = " << delay << endl; } while ( delay > 0 ) { // 20 ms struct timespec sleep_time = {0, SLEEP_NS}; nanosleep(&sleep_time, NULL); omni_mutex_lock l(data_mutex); delay = (data_set_time.tv_sec * 1e6 + data_set_time.tv_usec) - (data_read_time.tv_sec * 1e6 + data_read_time.tv_usec); INFO_STREAM << "read waiting delay = " << delay << endl; } */ omni_mutex_lock l(data_mutex); if ( mdata_errors.length() != 0 ) attr.set_quality(Tango::ATTR_INVALID); else { for (int i=0; iset_state(1); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot switch on pole", "Bilt::on"); } } //+------------------------------------------------------------------ /** * method: Bilt::off * * description: method to execute "Off" * Turns of power supply * * */ //+------------------------------------------------------------------ void Bilt::off() { DEBUG_STREAM << "Bilt::off(): entering... !" << endl; // Add your own code to control device here try { omni_mutex_lock l(bilt_mutex); BILT->set_state(0); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot switch off pole", "Bilt::off"); } } //+------------------------------------------------------------------ /** * method: Bilt::reset * * description: method to execute "Reset" * Reset faults and alarms * * */ //+------------------------------------------------------------------ void Bilt::reset() { DEBUG_STREAM << "Bilt::reset(): entering... !" << endl; // Add your own code to control device here try { omni_mutex_lock l(bilt_mutex); BILT->clear_all_err(); BILT->clear_alarm(); for (int i=0; ipole(i).clear_ferrors(); } } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot reset pole", "Bilt::reset"); } } //+------------------------------------------------------------------ /** * method: Bilt::set_pole_ac_current * * description: method to execute "SetPoleAcCurrent" * Set the AC current for one Pole. * [0] = pole number, [1] = current * * @param argin [0] = pole number, [1] = current * */ //+------------------------------------------------------------------ void Bilt::set_pole_ac_current(const Tango::DevVarDoubleArray *argin) { DEBUG_STREAM << "Bilt::set_pole_ac_current(): entering... !" << endl; // Add your own code to control device here // argin[0] = pole number if ( (*argin)[0] < 0 || (*argin)[0] >= POLES ) { TangoSys_MemStream tms; tms << "The entered Pole number is out of range" << endl; Tango::Except::throw_exception("WriteError", tms.str(), "Bilt::set_pole_ac_current"); } try { omni_mutex_lock l(bilt_mutex); BILT->pole((int)(*argin)[0]).set_current_AC ((*argin)[1]); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot write AC current value", "Bilt::set_pole_ac_current"); } } //+------------------------------------------------------------------ /** * method: Bilt::local_pole_control * * description: method to execute "LocalPoleControl" * Set the AC current for one Pole. * [0] = pole number, [1] = local control true/false * * @param argin [0] = pole number, [1] = local control true/false * */ //+------------------------------------------------------------------ void Bilt::local_pole_control(const Tango::DevVarShortArray *argin) { DEBUG_STREAM << "Bilt::local_pole_control(): entering... !" << endl; // Add your own code to control device here // argin[0] = pole number if ( (*argin)[0] < 0 || (*argin)[0] >= POLES ) { TangoSys_MemStream tms; tms << "The entered Pole number is out of range" << endl; Tango::Except::throw_exception("WriteError", tms.str(), "Bilt::local_pole_control"); } // argin[1] = true or false (1 or 0 ) if ( (*argin)[1] != 0 && (*argin)[1] != 1 ) { TangoSys_MemStream tms; tms << "Local control can only be choosen as 0 or 1 (false or true)" << endl; Tango::Except::throw_exception("WriteError", tms.str(), "Bilt::local_pole_control"); } try { int switch_state; if ( (*argin)[1] == true ) switch_state = 0; else switch_state = 1; omni_mutex_lock l(bilt_mutex); BILT->pole((*argin)[0]).set_switch (switch_state); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot write switch state", "Bilt::local_pole_control"); } } //+------------------------------------------------------------------ /** * method: Bilt::set_pole_current * * description: method to execute "SetPoleCurrent" * Set the current for one Pole. * [0] = pole number, [1] = current * * @param argin [0] = pole number, [1] = current * */ //+------------------------------------------------------------------ void Bilt::set_pole_current(const Tango::DevVarDoubleArray *argin) { DEBUG_STREAM << "Bilt::set_pole_current(): entering... !" << endl; // Add your own code to control device here // argin[0] = pole number if ( (*argin)[0] < 0 || (*argin)[0] >= POLES ) { TangoSys_MemStream tms; tms << "The entered Pole number is out of range" << endl; Tango::Except::throw_exception("WriteError", tms.str(), "Bilt::set_pole_current"); } try { omni_mutex_lock l(bilt_mutex); BILT->pole((int)(*argin)[0]).set_current_DC ((*argin)[1]); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot write current value", "Bilt::set_pole_current"); } // make sure that the current set values are correct! try { omni_mutex_lock l(bilt_mutex); for (int i=0; ipole(i).get_current_DC(); } Tango::MultiAttribute *attr_list = get_device_attr(); Tango::WAttribute &attr_curr = attr_list->get_w_attr_by_name ("Currents"); attr_curr.set_write_value(¤ts_dc[0], currents_dc.size()); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot read the actual current set point values", "Bilt::set_pole_current"); } // initialise the set time, to be sure that the next // returned read value is newer and contains the changes. struct timeval now; gettimeofday (&now, NULL); data_set_time = now; } //+------------------------------------------------------------------ /** * method: Bilt::create_tango_exception() * * description: convert an itest exception into a tango exception * * * in : - &e : Reference to itest exception * - reason : Reason of the local Tango exception to be added to the stack * - desc : Description for the local Tango exception to be added to the stack * - origin : Origin if the local Tango exception to be added to the stack */ //+------------------------------------------------------------------ void Bilt::create_tango_exception (itest::ItestException &e, string reason, string desc, string origin) { Tango::DevErrorList errors; create_tango_exception (e, errors, reason, desc, origin); } //+------------------------------------------------------------------ /** * method: Bilt::create_tango_exception() * * description: convert an itest exception into a tango exception * * * in : - &e : Reference to itest exception * - errors : Tango error list to use, to store exception info * - reason : Reason of the local Tango exception to be added to the stack * - desc : Description for the local Tango exception to be added to the stack * - origin : Origin if the local Tango exception to be added to the stack */ //+------------------------------------------------------------------ void Bilt::create_tango_exception (itest::ItestException &e, Tango::DevErrorList &errors, string reason, string desc, string origin) { DEBUG_STREAM << "Bilt::create_tango_exception(): entering... !" << endl; errors.length(e.errors.size() + 1); int i; for(i=0; idevice_status data member) and returns it to the caller. * * @return Status description * */ //+------------------------------------------------------------------ Tango::ConstDevString Bilt::dev_status() { //Tango::ConstDevString argout = DeviceImpl::dev_status(); DEBUG_STREAM << "Bilt::dev_status(): entering... !" << endl; // Add your own code to control device here stringstream status; Tango::DevState state = dev_state(); switch (state) { case Tango::ON: status << "State : ON" << endl; break; case Tango::OFF: status << "State : OFF" << endl; break; case Tango::ALARM: { status << "State : Alarm" << endl; omni_mutex_lock l(data_mutex); for (int i=0; i 10W in 10ms!" << endl; else { if ( mdata.idata[i].fail == "TEMP" ) status << "Fault descr. : Max. temp on semiconductor reached!" << endl; else { if ( mdata.idata[i].fail == "PWSO" ) status << "Fault descr. : Delivered power > 40W in 100ms!" << endl; else { status << "Fault descr. : Unkown fault code!" << endl; } } } } } } } break; } default: { { omni_mutex_lock l(data_mutex); status << "BILT state : Unknown" << endl; if ( bilt_connection_lost == true ) { status << "Connection lost to BILT power supply, trying to reconnect!" << endl; status << endl; } if ( mdata_errors.length() > 0 ) status << "Error stack : " << endl; for(int i=0; idevice_state data member) and returns it to the caller. * * @return State Code * */ //+------------------------------------------------------------------ Tango::DevState Bilt::dev_state() { // 17.11.2020 // Because an INVALID quality factor is not possible for // Temperature spectrum reading, an exception might be returned // during alarm checking! Tango::DevState argout; try { argout = DeviceImpl::dev_state(); } catch (Tango::DevFailed &e) { // just ignore temperature reading exception! } DEBUG_STREAM << "Bilt::dev_state(): entering... !" << endl; // Add your own code to control device here int state; int errors; try { omni_mutex_lock l(data_mutex); state = mdata.state; INFO_STREAM << "magnet state for " << get_name() << " = " << state << endl; errors = mdata_errors.length(); INFO_STREAM << "mdata errors = " << mdata_errors.length() << endl; } catch (Tango::DevFailed &e) { // do nothing! // Just avoid exceptions when executing state or status! } if ( errors != 0 ) set_state (Tango::UNKNOWN); else { // set the device state switch (state) { case -1: set_state (Tango::UNKNOWN); //bilt_connection_lost = true; break; case 0: set_state (Tango::OFF); break; case 1: set_state (Tango::ON); break; case 2: set_state (Tango::ALARM); break; case 3: set_state (Tango::FAULT); break; default: set_state (Tango::UNKNOWN); break; } } // Check for attribute alarms if ( get_state() == Tango::ON && argout == Tango::ALARM ) set_state (Tango::ALARM); return get_state(); } //+------------------------------------------------------------------ /** * method: Bilt::setpoint_check * * description: method to execute "SetpointCheck" * Check the given current values against the specified limits. * * @param argin Setpoint values for the Poles * @return true when settings are OK * */ //+------------------------------------------------------------------ Tango::DevBoolean Bilt::setpoint_check(const Tango::DevVarDoubleArray *argin) { Tango::DevBoolean argout ; DEBUG_STREAM << "Bilt::setpoint_check(): entering... !" << endl; // Add your own code to control device here // get the min and max values for the current settings Tango::MultiAttribute *attr_list = get_device_attr(); Tango::WAttribute &attr_curr = attr_list->get_w_attr_by_name ("Currents"); double min, max; attr_curr.get_min_value(min); attr_curr.get_max_value(max); INFO_STREAM << "min = " << min << " max = " << max << endl; // check the input values argout = true; for ( int i=0; ilength(); i++ ) { INFO_STREAM << "i = " << i << " curr = " << (*argin)[i] << endl; if ( (*argin)[i] < min || (*argin)[i] > max ) { argout = false; break; } } return argout; } } // namespace Revision-number: 73 Prop-content-length: 155 Content-length: 155 K 10 svn:author V 5 meyer K 8 svn:date V 27 2011-01-12T12:34:00.000000Z K 7 svn:log V 55 Added attribute to indicate the power supply location. PROPS-END Node-path: powersupply/itest/Bilt/trunk/Bilt.cpp Node-kind: file Node-action: change Text-content-length: 39004 Text-content-md5: 365e4728ed55ff0e35dff561c5a7b817 Content-length: 39004 static const char *RcsId = "$Id: Bilt.cpp,v 1.21 2011-01-12 12:33:59 meyer Exp $"; //+============================================================================= // // file : Bilt.cpp // // description : C++ source for the Bilt and its commands. // The class is derived from Device. It represents the // CORBA servant object which will be accessed from the // network. All commands which can be executed on the // Bilt are implemented in this file. // // project : TANGO Device Server // // $Author: meyer $ // // $Revision: 1.21 $ // // $Revision: 1.21 $ // $Date: 2011-01-12 12:33:59 $ // // SVN only: // $HeadURL: $ // // CVS only: // $Source: /segfs/tango/cvsroot/cppserver/machine/powersupply/SrSteerers/tango/Bilt/Bilt.cpp,v $ // $Log: not supported by cvs2svn $ // Revision 1.20 2011-01-12 08:50:06 meyer // Deleted the wait time for the next reading after writing. // Deleted sleep time during current writing. // // Revision 1.19 2010/11/26 08:40:04 meyer // Caught exceptions in in dev_state around DevImp::dev_state. // Temperature alarm checking might return an exception. // // Sleep time between the writing og current settings set to 20ms. // // Revision 1.18 2010/11/23 07:12:39 meyer // Changed placement of bilt_mutex in write_Current. // // Revision 1.17 2010/11/17 11:42:48 meyer // Replaced the INVALID attribute quality by an exception. // This should avoid a bug in the Tango api which does not take the // attribute quality into account during alarm checking! // // Revision 1.16 2010/11/10 14:00:29 meyer // Changed unit of AC RMS and average value from A to mA. // // Revision 1.15 2010-11-10 12:01:29 meyer // Changed type of Temperatures attribute from long to double and moved // temperature reading to the acquisition thread. // // Revision 1.14 2010/06/21 07:13:05 meyer // Added a spectrum attribute for the temperature measurements and changed to libMagnet version 1.4. // // Revision 1.13 2010/05/01 16:58:39 meyer // Changed alarm limits for the impedance attribute. // // Revision 1.12 2010/03/16 14:54:58 meyer // Added reconnection method. // // Revision 1.11 2010-02-18 16:46:31 meyer // Filled-in code for SetpointCheck // // Revision 1.10 2010-02-12 16:35:13 meyer // Added SetPoleCurrent command again. // // Revision 1.9 2010-02-11 16:35:27 meyer // Currents settings understand NaN values. // Deleted StePoleCurrent command. // // Revision 1.8 2010/02/10 12:27:31 meyer // Restructured Bilt class. // Acquistion is now done by a thread and only the multi channel data // gets exported. A single channel class (BiltCh) was created. // // Revision 1.7 2009/12/18 12:01:40 meyer // Corrected alarm handling in dev_state() // // Revision 1.6 2009/11/27 13:49:26 meyer // Modified structure! The pole is no longer a device. // The device is now a magnet with three poles. // // Revision 1.5 2009/11/26 10:46:58 meyer // Updated for libMagnet_V120 // // Revision 1.4 2009/11/24 09:21:46 meyer // Absolut value for impedance // // Revision 1.3 2009/11/23 16:46:58 meyer // Corrected state, status and exception handling // // Revision 1.2 2009/11/06 12:46:25 meyer // Added impedance attribute and corrected fromatting of attribute values. // // Revision 1.1.1.1 2009/11/04 16:23:02 meyer // Imported using TkCVS // // // copyleft : European Synchrotron Radiation Facility // BP 220, Grenoble 38043 // FRANCE // //-============================================================================= // // This file is generated by POGO // (Program Obviously used to Generate tango Object) // // (c) - Software Engineering Group - ESRF //============================================================================= //=================================================================== // // The following table gives the correspondence // between commands and method name. // // Command name | Method name // ---------------------------------------- // State | dev_state() // Status | dev_status() // On | on() // Off | off() // Reset | reset() // SetPoleAcCurrent | set_pole_ac_current() // LocalPoleControl | local_pole_control() // SetpointCheck | setpoint_check() // SetPoleCurrent | set_pole_current() // //=================================================================== #include #include #include #include #include namespace Bilt_ns { //+---------------------------------------------------------------------------- // // method : Bilt::Bilt(string &s) // // description : constructor for simulated Bilt // // in : - cl : Pointer to the DeviceClass object // - s : Device name // //----------------------------------------------------------------------------- Bilt::Bilt(Tango::DeviceClass *cl,string &s) :Tango::Device_4Impl(cl,s.c_str()) { init_device(); } Bilt::Bilt(Tango::DeviceClass *cl,const char *s) :Tango::Device_4Impl(cl,s) { init_device(); } Bilt::Bilt(Tango::DeviceClass *cl,const char *s,const char *d) :Tango::Device_4Impl(cl,s,d) { init_device(); } //+---------------------------------------------------------------------------- // // method : Bilt::delete_device() // // description : will be called at device destruction or at init command. // //----------------------------------------------------------------------------- void Bilt::delete_device() { // Delete device allocated objects if ( acquisition_thread != NULL ) { data_mutex.lock(); exit_thread = true; data_mutex.unlock(); // join now the thread until it exits int *rv; acquisition_thread->join((void **)&rv); cout << "Bilt::delete_device(): Exit acquisition thread !!!" << endl; } // Delete connection to the power supply delete BILT; BILT = NULL; } //+---------------------------------------------------------------------------- // // method : Bilt::init_device() // // description : will be called at device initialization. // //----------------------------------------------------------------------------- void Bilt::init_device() { INFO_STREAM << "Bilt::Bilt() create device " << device_name << endl; // Initialise variables to default values //-------------------------------------------- get_device_property(); set_state (Tango::OFF); // set the power supply location string // Bilt device naming = room-rack-nu.ch. string dev_name = get_name(); int pos = dev_name.rfind ('/'); string room = dev_name.substr (pos+1, string::npos); pos = room.find ('-'); string rack = room.substr (pos+1, string::npos); room = room.substr (0, pos); pos = rack.find ('-'); string number = rack.substr (pos+1, string::npos); rack = rack.substr (0, pos); string channels; if ( number.find ('a') != string::npos ) { channels = "1,2,3"; } else { channels = "4,5,6"; } number = number.substr (0, 1); ps_location = "Room: " + room + " Rack: " + rack + " Nu.: " + number + " Ch.: " + channels; DEBUG_STREAM << "Power supply location : " << ps_location << endl; // Create the access to the power supply try { BILT = new itest::TMagnet (iPAddress.c_str(), magnetNumber); } catch (itest::ItestException &e) { try { create_tango_exception (e, mdata_errors, "Init failure" , "Cannot initialise ITEST libray objects", "Bilt::init_device"); } catch (Tango::DevFailed &e) { set_state (Tango::UNKNOWN); } } // initialise with the actual current set point values try { for (int i=0; ipole(i).get_current_DC(); } Tango::MultiAttribute *attr_list = get_device_attr(); Tango::WAttribute &attr_curr = attr_list->get_w_attr_by_name ("Currents"); attr_curr.set_write_value(¤ts_dc[0], currents_dc.size()); } catch (itest::ItestException &e) { try { create_tango_exception (e, mdata_errors, "Init failure" , "Cannot read the actual current set point values", "Bilt::init_device"); } catch (Tango::DevFailed &e) { set_state (Tango::UNKNOWN); } } // initialise and start the acquisition thread exit_thread = false; acquisition_thread = new AcquisitionThread(this, data_mutex, bilt_mutex); } //+---------------------------------------------------------------------------- // // method : Bilt::get_device_property() // // description : Read the device properties from database. // //----------------------------------------------------------------------------- void Bilt::get_device_property() { // Initialize your default values here (if not done with POGO). //------------------------------------------------------------------ BILT = NULL; bilt_connection_lost = false; acquisition_thread = NULL; struct timeval now; gettimeofday (&now, NULL); data_set_time = now; data_read_time = now; // intitialise mdada structure for magnet read values mdata.magnet = -1; mdata.state = -1; for (int i=0; i_UseDb==true) get_db_device()->get_property(dev_prop); Tango::DbDatum def_prop, cl_prop; BiltClass *ds_class = (static_cast(get_device_class())); int i = -1; // Try to initialize IPAddress from class property cl_prop = ds_class->get_class_property(dev_prop[++i].name); if (cl_prop.is_empty()==false) cl_prop >> iPAddress; else { // Try to initialize IPAddress from default device value def_prop = ds_class->get_default_device_property(dev_prop[i].name); if (def_prop.is_empty()==false) def_prop >> iPAddress; } // And try to extract IPAddress value from database if (dev_prop[i].is_empty()==false) dev_prop[i] >> iPAddress; // Try to initialize MagnetNumber from class property cl_prop = ds_class->get_class_property(dev_prop[++i].name); if (cl_prop.is_empty()==false) cl_prop >> magnetNumber; else { // Try to initialize MagnetNumber from default device value def_prop = ds_class->get_default_device_property(dev_prop[i].name); if (def_prop.is_empty()==false) def_prop >> magnetNumber; } // And try to extract MagnetNumber value from database if (dev_prop[i].is_empty()==false) dev_prop[i] >> magnetNumber; // Try to initialize UpdatePeriod from class property cl_prop = ds_class->get_class_property(dev_prop[++i].name); if (cl_prop.is_empty()==false) cl_prop >> updatePeriod; else { // Try to initialize UpdatePeriod from default device value def_prop = ds_class->get_default_device_property(dev_prop[i].name); if (def_prop.is_empty()==false) def_prop >> updatePeriod; } // And try to extract UpdatePeriod value from database if (dev_prop[i].is_empty()==false) dev_prop[i] >> updatePeriod; // End of Automatic code generation //------------------------------------------------------------------ } //+---------------------------------------------------------------------------- // // method : Bilt::always_executed_hook() // // description : method always executed before any command is executed // //----------------------------------------------------------------------------- void Bilt::always_executed_hook() { } //+---------------------------------------------------------------------------- // // method : Bilt::read_attr_hardware // // description : Hardware acquisition for attributes. // //----------------------------------------------------------------------------- void Bilt::read_attr_hardware(vector &attr_list) { DEBUG_STREAM << "Bilt::read_attr_hardware(vector &attr_list) entering... "<< endl; // Add your own code here } //+---------------------------------------------------------------------------- // // method : Bilt::read_Location // // description : Extract real attribute values for Location acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_Location(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_Location(Tango::Attribute &attr) entering... "<< endl; location = const_cast (ps_location.c_str()); attr.set_value (&location); } //+---------------------------------------------------------------------------- // // method : Bilt::read_Temperatures // // description : Extract real attribute values for Temperatures acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_Temperatures(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_Temperatures(Tango::Attribute &attr) entering... "<< endl; omni_mutex_lock l(data_mutex); if ( temp_errors.length() != 0 ) { //attr.set_quality(Tango::ATTR_INVALID); // 17.11.2020 // The Tango API does not tke into account the attribute // quality factor when checking for alarms!!! // Until the bus is repaired we just return an exception! TangoSys_MemStream tms; tms << "Error on temperatur reading, no data available!" << endl; Tango::Except::throw_exception("ReadError", tms.str(), "Bilt::read_Temperatures"); } else { attr.set_value (&(temperatures[0]), 2*POLES); } } //+---------------------------------------------------------------------------- // // method : Bilt::read_FramesPerSecond // // description : Extract real attribute values for FramesPerSecond acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_FramesPerSecond(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_FramesPerSecond(Tango::Attribute &attr) entering... "<< endl; omni_mutex_lock l(data_mutex); if ( fdata_errors.length() != 0 ) attr.set_quality(Tango::ATTR_INVALID); else { for (int i=0; ipole(i).get_switch(); } if ( switch_state == 1 ) local_control[i] = false; else local_control[i] = true; } } catch (itest::ItestException &e) { create_tango_exception (e, "Read failure" , "Cannot read the actual switch states", "Bilt::read_LocalControls"); } attr.set_value (&(local_control[0]), POLES); } //+---------------------------------------------------------------------------- // // method : Bilt::read_SetCurrentsRMS // // description : Extract real attribute values for SetCurrentsRMS acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_SetCurrentsRMS(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_SetCurrentsRMS(Tango::Attribute &attr) entering... "<< endl; omni_mutex_lock l(data_mutex); if ( fdata_errors.length() != 0 ) attr.set_quality(Tango::ATTR_INVALID); else { for (int i=0; i CURRENT_LIMIT ) impedances[i] = fabs (mdata.idata[i].measvolt / mdata.idata[i].meascurr); else impedances[i] = nan("NaN"); } } attr.set_value (&(impedances[0]), POLES); } //+---------------------------------------------------------------------------- // // method : Bilt::write_Currents // // description : Write Currents attribute values to hardware. // //----------------------------------------------------------------------------- void Bilt::write_Currents(Tango::WAttribute &attr) { DEBUG_STREAM << "Bilt::write_Currents(Tango::WAttribute &attr) entering... "<< endl; const double *set_currents; // check the correct number of setpoints if ( attr.get_write_value_length() == POLES ) attr.get_write_value(set_currents); else { TangoSys_MemStream tms; tms << "Wrong number of setpoints!" << endl; Tango::Except::throw_exception("WriteError", tms.str(), "Bilt::write_Currents"); } // apply setpoints to the poles try { omni_mutex_lock l(bilt_mutex); for (int i=0; i 0 ) //{ // sleep for 20 ms between the write requests //struct timespec sleep_time = {0, SLEEP_NS}; //nanosleep(&sleep_time, NULL); //} BILT->pole(i).set_current_DC (set_currents[i]); } // initialise the set time, to be sure that the next // returned read value is newer and contains the changes. struct timeval now; gettimeofday (&now, NULL); data_set_time = now; } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot write DC current values", "Bilt::write_Currents"); } } //+---------------------------------------------------------------------------- // // method : Bilt::read_Currents // // description : Extract real attribute values for Currents acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_Currents(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_Currents(Tango::Attribute &attr) entering... "<< endl; // wait for the next data acquisition afer a current setpoint change /* double delay; { omni_mutex_lock l(data_mutex); delay = (data_set_time.tv_sec * 1e6 + data_set_time.tv_usec) - (data_read_time.tv_sec * 1e6 + data_read_time.tv_usec); //cout << "delay = " << delay << endl; } while ( delay > 0 ) { // 20 ms struct timespec sleep_time = {0, SLEEP_NS}; nanosleep(&sleep_time, NULL); omni_mutex_lock l(data_mutex); delay = (data_set_time.tv_sec * 1e6 + data_set_time.tv_usec) - (data_read_time.tv_sec * 1e6 + data_read_time.tv_usec); INFO_STREAM << "read waiting delay = " << delay << endl; } */ omni_mutex_lock l(data_mutex); if ( mdata_errors.length() != 0 ) attr.set_quality(Tango::ATTR_INVALID); else { for (int i=0; iset_state(1); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot switch on pole", "Bilt::on"); } } //+------------------------------------------------------------------ /** * method: Bilt::off * * description: method to execute "Off" * Turns of power supply * * */ //+------------------------------------------------------------------ void Bilt::off() { DEBUG_STREAM << "Bilt::off(): entering... !" << endl; // Add your own code to control device here try { omni_mutex_lock l(bilt_mutex); BILT->set_state(0); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot switch off pole", "Bilt::off"); } } //+------------------------------------------------------------------ /** * method: Bilt::reset * * description: method to execute "Reset" * Reset faults and alarms * * */ //+------------------------------------------------------------------ void Bilt::reset() { DEBUG_STREAM << "Bilt::reset(): entering... !" << endl; // Add your own code to control device here try { omni_mutex_lock l(bilt_mutex); BILT->clear_all_err(); BILT->clear_alarm(); for (int i=0; ipole(i).clear_ferrors(); } } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot reset pole", "Bilt::reset"); } } //+------------------------------------------------------------------ /** * method: Bilt::set_pole_ac_current * * description: method to execute "SetPoleAcCurrent" * Set the AC current for one Pole. * [0] = pole number, [1] = current * * @param argin [0] = pole number, [1] = current * */ //+------------------------------------------------------------------ void Bilt::set_pole_ac_current(const Tango::DevVarDoubleArray *argin) { DEBUG_STREAM << "Bilt::set_pole_ac_current(): entering... !" << endl; // Add your own code to control device here // argin[0] = pole number if ( (*argin)[0] < 0 || (*argin)[0] >= POLES ) { TangoSys_MemStream tms; tms << "The entered Pole number is out of range" << endl; Tango::Except::throw_exception("WriteError", tms.str(), "Bilt::set_pole_ac_current"); } try { omni_mutex_lock l(bilt_mutex); BILT->pole((int)(*argin)[0]).set_current_AC ((*argin)[1]); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot write AC current value", "Bilt::set_pole_ac_current"); } } //+------------------------------------------------------------------ /** * method: Bilt::local_pole_control * * description: method to execute "LocalPoleControl" * Set the AC current for one Pole. * [0] = pole number, [1] = local control true/false * * @param argin [0] = pole number, [1] = local control true/false * */ //+------------------------------------------------------------------ void Bilt::local_pole_control(const Tango::DevVarShortArray *argin) { DEBUG_STREAM << "Bilt::local_pole_control(): entering... !" << endl; // Add your own code to control device here // argin[0] = pole number if ( (*argin)[0] < 0 || (*argin)[0] >= POLES ) { TangoSys_MemStream tms; tms << "The entered Pole number is out of range" << endl; Tango::Except::throw_exception("WriteError", tms.str(), "Bilt::local_pole_control"); } // argin[1] = true or false (1 or 0 ) if ( (*argin)[1] != 0 && (*argin)[1] != 1 ) { TangoSys_MemStream tms; tms << "Local control can only be choosen as 0 or 1 (false or true)" << endl; Tango::Except::throw_exception("WriteError", tms.str(), "Bilt::local_pole_control"); } try { int switch_state; if ( (*argin)[1] == true ) switch_state = 0; else switch_state = 1; omni_mutex_lock l(bilt_mutex); BILT->pole((*argin)[0]).set_switch (switch_state); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot write switch state", "Bilt::local_pole_control"); } } //+------------------------------------------------------------------ /** * method: Bilt::set_pole_current * * description: method to execute "SetPoleCurrent" * Set the current for one Pole. * [0] = pole number, [1] = current * * @param argin [0] = pole number, [1] = current * */ //+------------------------------------------------------------------ void Bilt::set_pole_current(const Tango::DevVarDoubleArray *argin) { DEBUG_STREAM << "Bilt::set_pole_current(): entering... !" << endl; // Add your own code to control device here // argin[0] = pole number if ( (*argin)[0] < 0 || (*argin)[0] >= POLES ) { TangoSys_MemStream tms; tms << "The entered Pole number is out of range" << endl; Tango::Except::throw_exception("WriteError", tms.str(), "Bilt::set_pole_current"); } try { omni_mutex_lock l(bilt_mutex); BILT->pole((int)(*argin)[0]).set_current_DC ((*argin)[1]); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot write current value", "Bilt::set_pole_current"); } // make sure that the current set values are correct! try { omni_mutex_lock l(bilt_mutex); for (int i=0; ipole(i).get_current_DC(); } Tango::MultiAttribute *attr_list = get_device_attr(); Tango::WAttribute &attr_curr = attr_list->get_w_attr_by_name ("Currents"); attr_curr.set_write_value(¤ts_dc[0], currents_dc.size()); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot read the actual current set point values", "Bilt::set_pole_current"); } // initialise the set time, to be sure that the next // returned read value is newer and contains the changes. struct timeval now; gettimeofday (&now, NULL); data_set_time = now; } //+------------------------------------------------------------------ /** * method: Bilt::create_tango_exception() * * description: convert an itest exception into a tango exception * * * in : - &e : Reference to itest exception * - reason : Reason of the local Tango exception to be added to the stack * - desc : Description for the local Tango exception to be added to the stack * - origin : Origin if the local Tango exception to be added to the stack */ //+------------------------------------------------------------------ void Bilt::create_tango_exception (itest::ItestException &e, string reason, string desc, string origin) { Tango::DevErrorList errors; create_tango_exception (e, errors, reason, desc, origin); } //+------------------------------------------------------------------ /** * method: Bilt::create_tango_exception() * * description: convert an itest exception into a tango exception * * * in : - &e : Reference to itest exception * - errors : Tango error list to use, to store exception info * - reason : Reason of the local Tango exception to be added to the stack * - desc : Description for the local Tango exception to be added to the stack * - origin : Origin if the local Tango exception to be added to the stack */ //+------------------------------------------------------------------ void Bilt::create_tango_exception (itest::ItestException &e, Tango::DevErrorList &errors, string reason, string desc, string origin) { DEBUG_STREAM << "Bilt::create_tango_exception(): entering... !" << endl; errors.length(e.errors.size() + 1); int i; for(i=0; idevice_status data member) and returns it to the caller. * * @return Status description * */ //+------------------------------------------------------------------ Tango::ConstDevString Bilt::dev_status() { //Tango::ConstDevString argout = DeviceImpl::dev_status(); DEBUG_STREAM << "Bilt::dev_status(): entering... !" << endl; // Add your own code to control device here stringstream status; status << "PS Location : " << ps_location << endl; Tango::DevState state = dev_state(); switch (state) { case Tango::ON: status << "State : ON" << endl; break; case Tango::OFF: status << "State : OFF" << endl; break; case Tango::ALARM: { status << "State : Alarm" << endl; omni_mutex_lock l(data_mutex); for (int i=0; i 10W in 10ms!" << endl; else { if ( mdata.idata[i].fail == "TEMP" ) status << "Fault descr. : Max. temp on semiconductor reached!" << endl; else { if ( mdata.idata[i].fail == "PWSO" ) status << "Fault descr. : Delivered power > 40W in 100ms!" << endl; else { status << "Fault descr. : Unkown fault code!" << endl; } } } } } } } break; } default: { { omni_mutex_lock l(data_mutex); status << "State : Unknown" << endl; if ( bilt_connection_lost == true ) { status << "Connection lost to BILT power supply, trying to reconnect!" << endl; status << endl; } if ( mdata_errors.length() > 0 ) status << "Error stack : " << endl; for(int i=0; idevice_state data member) and returns it to the caller. * * @return State Code * */ //+------------------------------------------------------------------ Tango::DevState Bilt::dev_state() { // 17.11.2020 // Because an INVALID quality factor is not possible for // Temperature spectrum reading, an exception might be returned // during alarm checking! Tango::DevState argout; try { argout = DeviceImpl::dev_state(); } catch (Tango::DevFailed &e) { // just ignore temperature reading exception! } DEBUG_STREAM << "Bilt::dev_state(): entering... !" << endl; // Add your own code to control device here int state; int errors; try { omni_mutex_lock l(data_mutex); state = mdata.state; INFO_STREAM << "magnet state for " << get_name() << " = " << state << endl; errors = mdata_errors.length(); INFO_STREAM << "mdata errors = " << mdata_errors.length() << endl; } catch (Tango::DevFailed &e) { // do nothing! // Just avoid exceptions when executing state or status! } if ( errors != 0 ) set_state (Tango::UNKNOWN); else { // set the device state switch (state) { case -1: set_state (Tango::UNKNOWN); //bilt_connection_lost = true; break; case 0: set_state (Tango::OFF); break; case 1: set_state (Tango::ON); break; case 2: set_state (Tango::ALARM); break; case 3: set_state (Tango::FAULT); break; default: set_state (Tango::UNKNOWN); break; } } // Check for attribute alarms if ( get_state() == Tango::ON && argout == Tango::ALARM ) set_state (Tango::ALARM); return get_state(); } //+------------------------------------------------------------------ /** * method: Bilt::setpoint_check * * description: method to execute "SetpointCheck" * Check the given current values against the specified limits. * * @param argin Setpoint values for the Poles * @return true when settings are OK * */ //+------------------------------------------------------------------ Tango::DevBoolean Bilt::setpoint_check(const Tango::DevVarDoubleArray *argin) { Tango::DevBoolean argout ; DEBUG_STREAM << "Bilt::setpoint_check(): entering... !" << endl; // Add your own code to control device here // get the min and max values for the current settings Tango::MultiAttribute *attr_list = get_device_attr(); Tango::WAttribute &attr_curr = attr_list->get_w_attr_by_name ("Currents"); double min, max; attr_curr.get_min_value(min); attr_curr.get_max_value(max); INFO_STREAM << "min = " << min << " max = " << max << endl; // check the input values argout = true; for ( int i=0; ilength(); i++ ) { INFO_STREAM << "i = " << i << " curr = " << (*argin)[i] << endl; if ( (*argin)[i] < min || (*argin)[i] > max ) { argout = false; break; } } return argout; } } // namespace Node-path: powersupply/itest/Bilt/trunk/Bilt.h Node-kind: file Node-action: change Text-content-length: 13334 Text-content-md5: a6428486ee7da3ff27e36c985dfa351c Content-length: 13334 //============================================================================= // // file : Bilt.h // // description : Include for the Bilt class. // // project : BILT multi channel power supply // // $Author: meyer $ // // $Revision: 1.15 $ // $Date: 2011-01-12 12:34:00 $ // // SVN only: // $HeadURL: $ // // CVS only: // $Source: /segfs/tango/cvsroot/cppserver/machine/powersupply/SrSteerers/tango/Bilt/Bilt.h,v $ // $Log: not supported by cvs2svn $ // Revision 1.14 2010/11/23 07:12:39 meyer // Changed placement of bilt_mutex in write_Current. // // Revision 1.13 2010/11/10 14:00:29 meyer // Changed unit of AC RMS and average value from A to mA. // // Revision 1.12 2010-11-10 12:01:29 meyer // Changed type of Temperatures attribute from long to double and moved // temperature reading to the acquisition thread. // // Revision 1.11 2010/08/31 07:54:48 meyer // Changed impedence alarm calculation limit. // // Revision 1.10 2010/06/21 07:13:05 meyer // Added a spectrum attribute for the temperature measurements and changed to libMagnet version 1.4. // // Revision 1.9 2010/05/01 16:58:39 meyer // Changed alarm limits for the impedance attribute. // // Revision 1.8 2010/03/16 14:54:58 meyer // Added reconnection method. // // Revision 1.7 2010-02-12 16:35:13 meyer // Added SetPoleCurrent command again. // // Revision 1.6 2010-02-11 16:35:27 meyer // Currents settings understand NaN values. // Deleted StePoleCurrent command. // // Revision 1.5 2010/02/10 12:27:31 meyer // Restructured Bilt class. // Acquistion is now done by a thread and only the multi channel data // gets exported. A single channel class (BiltCh) was created. // // Revision 1.4 2009/11/27 13:49:26 meyer // Modified structure! The pole is no longer a device. // The device is now a magnet with three poles. // // Revision 1.3 2009/11/26 10:46:58 meyer // Updated for libMagnet_V120 // // Revision 1.2 2009/11/06 12:46:25 meyer // Added impedance attribute and corrected fromatting of attribute values. // // Revision 1.1.1.1 2009/11/04 16:23:02 meyer // Imported using TkCVS // // // copyleft : European Synchrotron Radiation Facility // BP 220, Grenoble 38043 // FRANCE // //============================================================================= // // This file is generated by POGO // (Program Obviously used to Generate tango Object) // // (c) - Software Engineering Group - ESRF //============================================================================= #ifndef _BILT_H #define _BILT_H #include #include #include //using namespace Tango; /** * @author $Author: meyer $ * @version $Revision: 1.15 $ */ // Add your own constant definitions here. //----------------------------------------------- // Number of poles per magnet #define POLES 3 // Current limit for a valid impedeance calculation #define CURRENT_LIMIT 0.05 // define sleep times #define SLEEP_NS 20000000 // 20 ms #define SHORT_SLEEP_NS 5000000 // 5 ms namespace Bilt_ns { class AcquisitionThread; /** * Class Description: * The BILT multi channel power supply will be used with 3 channels for the ESRF fast * feedback systems. * The power supply can be controlled in 2 ways : * By this device server for slow or human control or * by the Libera Beam Position monitors for fast feedback with closed loop control. * The devices are exported as one device per steerer magnet. Every device has three * channels. The channels (poles) cannot be switched on individually but have their * individual set points and measurement values. */ /* * Device States Description: * Tango::ON : Magnet is ON, all three channels are ON. * Tango::OFF : Magnet is OFF, all three channels are OFF. * Tango::FAULT : Error detected by the BILT magnet. * Tango::ALARM : Alarm detected on one or more channels. * Tango::UNKNOWN : Communication fault */ class Bilt: public Tango::Device_4Impl { public : // Add your own data members here //----------------------------------------- // Here is the Start of the automatic code generation part //------------------------------------------------------------- /** * @name attributes * Attribute member data. */ //@{ Tango::DevString *attr_Location_read; Tango::DevDouble *attr_Currents_read; Tango::DevDouble attr_Currents_write; Tango::DevDouble *attr_Voltages_read; Tango::DevDouble *attr_Impedances_read; Tango::DevDouble *attr_SetCurrentsRMS_read; Tango::DevDouble *attr_SetCurrentsAverage_read; Tango::DevULong *attr_FramesPerSecond_read; Tango::DevULong *attr_ErrorsPerSecond_read; Tango::DevULong *attr_ErrorCounters_read; Tango::DevBoolean *attr_LocalControls_read; Tango::DevDouble *attr_Temperatures_read; //@} /** * @name Device properties * Device properties member data. */ //@{ /** * IP Address of BILT controller. * Each controller includes several magnets and * each magnet includes 3 power supplies, * for corrections in the X, Y and Z planes. * * */ string iPAddress; /** * Magnet number from 1 to 48 */ Tango::DevShort magnetNumber; /** * The update period for the data reading from the power supply in milli seconds. */ Tango::DevLong updatePeriod; //@} /** * @name Device properties * Device property member data. */ //@{ //@} /**@name Constructors * Miscellaneous constructors */ //@{ /** * Constructs a newly allocated Command object. * * @param cl Class. * @param s Device Name */ Bilt(Tango::DeviceClass *cl,string &s); /** * Constructs a newly allocated Command object. * * @param cl Class. * @param s Device Name */ Bilt(Tango::DeviceClass *cl,const char *s); /** * Constructs a newly allocated Command object. * * @param cl Class. * @param s Device name * @param d Device description. */ Bilt(Tango::DeviceClass *cl,const char *s,const char *d); //@} /**@name Destructor * Only one destructor is defined for this class */ //@{ /** * The object destructor. */ ~Bilt() {delete_device();}; /** * will be called at device destruction or at init command. */ void delete_device(); //@} /**@name Miscellaneous methods */ //@{ /** * Initialize the device */ virtual void init_device(); /** * Always executed method before execution command method. */ virtual void always_executed_hook(); //@} /** * @name Bilt methods prototypes */ //@{ /** * Hardware acquisition for attributes. */ virtual void read_attr_hardware(vector &attr_list); /** * Extract real attribute values for Location acquisition result. */ virtual void read_Location(Tango::Attribute &attr); /** * Extract real attribute values for Currents acquisition result. */ virtual void read_Currents(Tango::Attribute &attr); /** * Write Currents attribute values to hardware. */ virtual void write_Currents(Tango::WAttribute &attr); /** * Extract real attribute values for Voltages acquisition result. */ virtual void read_Voltages(Tango::Attribute &attr); /** * Extract real attribute values for Impedances acquisition result. */ virtual void read_Impedances(Tango::Attribute &attr); /** * Extract real attribute values for SetCurrentsRMS acquisition result. */ virtual void read_SetCurrentsRMS(Tango::Attribute &attr); /** * Extract real attribute values for SetCurrentsAverage acquisition result. */ virtual void read_SetCurrentsAverage(Tango::Attribute &attr); /** * Extract real attribute values for FramesPerSecond acquisition result. */ virtual void read_FramesPerSecond(Tango::Attribute &attr); /** * Extract real attribute values for ErrorsPerSecond acquisition result. */ virtual void read_ErrorsPerSecond(Tango::Attribute &attr); /** * Extract real attribute values for ErrorCounters acquisition result. */ virtual void read_ErrorCounters(Tango::Attribute &attr); /** * Extract real attribute values for LocalControls acquisition result. */ virtual void read_LocalControls(Tango::Attribute &attr); /** * Extract real attribute values for Temperatures acquisition result. */ virtual void read_Temperatures(Tango::Attribute &attr); /** * Read/Write allowed for Location attribute. */ virtual bool is_Location_allowed(Tango::AttReqType type); /** * Read/Write allowed for Currents attribute. */ virtual bool is_Currents_allowed(Tango::AttReqType type); /** * Read/Write allowed for Voltages attribute. */ virtual bool is_Voltages_allowed(Tango::AttReqType type); /** * Read/Write allowed for Impedances attribute. */ virtual bool is_Impedances_allowed(Tango::AttReqType type); /** * Read/Write allowed for SetCurrentsRMS attribute. */ virtual bool is_SetCurrentsRMS_allowed(Tango::AttReqType type); /** * Read/Write allowed for SetCurrentsAverage attribute. */ virtual bool is_SetCurrentsAverage_allowed(Tango::AttReqType type); /** * Read/Write allowed for FramesPerSecond attribute. */ virtual bool is_FramesPerSecond_allowed(Tango::AttReqType type); /** * Read/Write allowed for ErrorsPerSecond attribute. */ virtual bool is_ErrorsPerSecond_allowed(Tango::AttReqType type); /** * Read/Write allowed for ErrorCounters attribute. */ virtual bool is_ErrorCounters_allowed(Tango::AttReqType type); /** * Read/Write allowed for LocalControls attribute. */ virtual bool is_LocalControls_allowed(Tango::AttReqType type); /** * Read/Write allowed for Temperatures attribute. */ virtual bool is_Temperatures_allowed(Tango::AttReqType type); /** * Execution allowed for On command. */ virtual bool is_On_allowed(const CORBA::Any &any); /** * Execution allowed for Off command. */ virtual bool is_Off_allowed(const CORBA::Any &any); /** * Execution allowed for Reset command. */ virtual bool is_Reset_allowed(const CORBA::Any &any); /** * Execution allowed for SetPoleAcCurrent command. */ virtual bool is_SetPoleAcCurrent_allowed(const CORBA::Any &any); /** * Execution allowed for LocalPoleControl command. */ virtual bool is_LocalPoleControl_allowed(const CORBA::Any &any); /** * Execution allowed for SetpointCheck command. */ virtual bool is_SetpointCheck_allowed(const CORBA::Any &any); /** * Execution allowed for SetPoleCurrent command. */ virtual bool is_SetPoleCurrent_allowed(const CORBA::Any &any); /** * This command gets the device state (stored in its device_state data member) and returns it to the caller. * @return State Code * @exception DevFailed */ virtual Tango::DevState dev_state(); /** * This command gets the device status (stored in its device_status data member) and returns it to the caller. * @return Status description * @exception DevFailed */ virtual Tango::ConstDevString dev_status(); /** * Turns on power supply. * @exception DevFailed */ void on(); /** * Turns of power supply * @exception DevFailed */ void off(); /** * Reset faults and alarms * @exception DevFailed */ void reset(); /** * Set the AC current for one Pole. * [0] = pole number, [1] = current * @param argin [0] = pole number, [1] = current * @exception DevFailed */ void set_pole_ac_current(const Tango::DevVarDoubleArray *); /** * Set the AC current for one Pole. * [0] = pole number, [1] = local control true/false * @param argin [0] = pole number, [1] = local control true/false * @exception DevFailed */ void local_pole_control(const Tango::DevVarShortArray *); /** * Check the given current values against the specified limits. * @param argin Setpoint values for the Poles * @return true when settings are OK * @exception DevFailed */ Tango::DevBoolean setpoint_check(const Tango::DevVarDoubleArray *); /** * Set the current for one Pole. * [0] = pole number, [1] = current * @param argin [0] = pole number, [1] = current * @exception DevFailed */ void set_pole_current(const Tango::DevVarDoubleArray *); /** * Read the device properties from database */ void get_device_property(); //@} // Here is the end of the automatic code generation part //------------------------------------------------------------- protected : // Add your own data members here //----------------------------------------- friend class AcquisitionThread; AcquisitionThread *acquisition_thread; omni_mutex data_mutex; omni_mutex bilt_mutex; short exit_thread; struct timeval data_set_time; struct timeval data_read_time; void create_tango_exception (itest::ItestException &e, string reason, string desc, string origin); void create_tango_exception (itest::ItestException &e, Tango::DevErrorList &errors, string reason, string desc, string origin); itest::TMagnet *BILT; bool bilt_connection_lost; struct itest::mdata mdata; struct itest::fdata fdata[POLES]; Tango::DevErrorList mdata_errors; Tango::DevErrorList fdata_errors; Tango::DevErrorList temp_errors; vector currents_dc; vector currents_ac; vector voltages; vector impedances; vector currents_rms; vector currents_average; vector frames_per_sec; vector errors_per_sec; vector error_counters; vector temperatures; bool local_control[3]; string ps_location; Tango::DevString location; }; } // namespace_ns #endif // _BILT_H Node-path: powersupply/itest/Bilt/trunk/BiltClass.cpp Node-kind: file Node-action: change Text-content-length: 28510 Text-content-md5: 4f51679ddad30aba3f4b7f27186cc7a1 Content-length: 28510 static const char *ClassId = "$Id: BiltClass.cpp,v 1.18 2011-01-12 12:34:00 meyer Exp $"; static const char *TagName = "$Name: not supported by cvs2svn $"; static const char *CvsPath = "$Source: /segfs/tango/cvsroot/cppserver/machine/powersupply/SrSteerers/tango/Bilt/BiltClass.cpp,v $"; static const char *SvnPath = "$HeadURL: $"; static const char *HttpServer = "http://www.esrf.fr/computing/cs/tango/tango_doc/ds_doc/"; //+============================================================================= // // file : BiltClass.cpp // // description : C++ source for the BiltClass. A singleton // class derived from DeviceClass. It implements the // command list and all properties and methods required // by the Bilt once per process. // // project : TANGO Device Server // // $Author: meyer $ // // $Revision: 1.18 $ // // $Log: not supported by cvs2svn $ // Revision 1.17 2010/11/16 08:50:37 meyer // Changed temperature alarm from 40 to 40 C. // // Revision 1.16 2010/11/10 14:00:29 meyer // Changed unit of AC RMS and average value from A to mA. // // Revision 1.15 2010-11-10 11:59:11 meyer // Changed type of Temperatures attribute from long to double. // Added default alarm and polling values. // // Revision 1.14 2010/06/24 11:43:10 meyer // Corrected memory leak when the reconnection to the power supply fails. // // Revision 1.13 2010/06/21 07:13:05 meyer // Added a spectrum attribute for the temperature measurements and changed to libMagnet version 1.4. // // Revision 1.12 2010/05/01 16:58:39 meyer // Changed alarm limits for the impedance attribute. // // Revision 1.11 2010/03/16 15:03:33 meyer // Excluded Steerer class. // // Revision 1.10 2010-02-12 16:35:13 meyer // Added SetPoleCurrent command again. // // Revision 1.9 2010-02-11 16:35:27 meyer // Currents settings understand NaN values. // Deleted StePoleCurrent command. // // Revision 1.8 2010/02/10 16:22:15 meyer // Release_3_0 // // Revision 1.7 2010/02/10 12:27:31 meyer // Restructured Bilt class. // Acquistion is now done by a thread and only the multi channel data // gets exported. A single channel class (BiltCh) was created. // // Revision 1.6 2009/12/18 12:02:18 meyer // Changed version number to 2.1 // // Revision 1.5 2009/11/27 13:49:26 meyer // Modified structure! The pole is no longer a device. // The device is now a magnet with three poles. // // Revision 1.4 2009/11/26 10:46:58 meyer // Updated for libMagnet_V120 // // Revision 1.3 2009/11/23 16:46:58 meyer // Corrected state, status and exception handling // // Revision 1.2 2009/11/06 12:46:25 meyer // Added impedance attribute and corrected fromatting of attribute values. // // Revision 1.1.1.1 2009/11/04 16:23:02 meyer // Imported using TkCVS // // // copyleft : European Synchrotron Radiation Facility // BP 220, Grenoble 38043 // FRANCE // //-============================================================================= // // This file is generated by POGO // (Program Obviously used to Generate tango Object) // // (c) - Software Engineering Group - ESRF //============================================================================= #include #include #include //+---------------------------------------------------------------------------- /** * Create BiltClass singleton and return it in a C function for Python usage */ //+---------------------------------------------------------------------------- extern "C" { #ifdef WIN32 __declspec(dllexport) #endif Tango::DeviceClass *_create_Bilt_class(const char *name) { return Bilt_ns::BiltClass::init(name); } } namespace Bilt_ns { //+---------------------------------------------------------------------------- // // method : SetPoleCurrentCmd::execute() // // description : method to trigger the execution of the command. // PLEASE DO NOT MODIFY this method core without pogo // // in : - device : The device on which the command must be executed // - in_any : The command input data // // returns : The command output data (packed in the Any object) // //----------------------------------------------------------------------------- CORBA::Any *SetPoleCurrentCmd::execute(Tango::DeviceImpl *device,const CORBA::Any &in_any) { cout2 << "SetPoleCurrentCmd::execute(): arrived" << endl; const Tango::DevVarDoubleArray *argin; extract(in_any, argin); ((static_cast(device))->set_pole_current(argin)); return new CORBA::Any(); } //+---------------------------------------------------------------------------- // // method : SetpointCheckCmd::execute() // // description : method to trigger the execution of the command. // PLEASE DO NOT MODIFY this method core without pogo // // in : - device : The device on which the command must be executed // - in_any : The command input data // // returns : The command output data (packed in the Any object) // //----------------------------------------------------------------------------- CORBA::Any *SetpointCheckCmd::execute(Tango::DeviceImpl *device,const CORBA::Any &in_any) { cout2 << "SetpointCheckCmd::execute(): arrived" << endl; const Tango::DevVarDoubleArray *argin; extract(in_any, argin); return insert((static_cast(device))->setpoint_check(argin)); } //+---------------------------------------------------------------------------- // // method : LocalPoleControlCmd::execute() // // description : method to trigger the execution of the command. // PLEASE DO NOT MODIFY this method core without pogo // // in : - device : The device on which the command must be executed // - in_any : The command input data // // returns : The command output data (packed in the Any object) // //----------------------------------------------------------------------------- CORBA::Any *LocalPoleControlCmd::execute(Tango::DeviceImpl *device,const CORBA::Any &in_any) { cout2 << "LocalPoleControlCmd::execute(): arrived" << endl; const Tango::DevVarShortArray *argin; extract(in_any, argin); ((static_cast(device))->local_pole_control(argin)); return new CORBA::Any(); } //+---------------------------------------------------------------------------- // // method : SetPoleAcCurrentCmd::execute() // // description : method to trigger the execution of the command. // PLEASE DO NOT MODIFY this method core without pogo // // in : - device : The device on which the command must be executed // - in_any : The command input data // // returns : The command output data (packed in the Any object) // //----------------------------------------------------------------------------- CORBA::Any *SetPoleAcCurrentCmd::execute(Tango::DeviceImpl *device,const CORBA::Any &in_any) { cout2 << "SetPoleAcCurrentCmd::execute(): arrived" << endl; const Tango::DevVarDoubleArray *argin; extract(in_any, argin); ((static_cast(device))->set_pole_ac_current(argin)); return new CORBA::Any(); } //+---------------------------------------------------------------------------- // // method : OnCmd::execute() // // description : method to trigger the execution of the command. // PLEASE DO NOT MODIFY this method core without pogo // // in : - device : The device on which the command must be executed // - in_any : The command input data // // returns : The command output data (packed in the Any object) // //----------------------------------------------------------------------------- CORBA::Any *OnCmd::execute(Tango::DeviceImpl *device,const CORBA::Any &in_any) { cout2 << "OnCmd::execute(): arrived" << endl; ((static_cast(device))->on()); return new CORBA::Any(); } //+---------------------------------------------------------------------------- // // method : OffCmd::execute() // // description : method to trigger the execution of the command. // PLEASE DO NOT MODIFY this method core without pogo // // in : - device : The device on which the command must be executed // - in_any : The command input data // // returns : The command output data (packed in the Any object) // //----------------------------------------------------------------------------- CORBA::Any *OffCmd::execute(Tango::DeviceImpl *device,const CORBA::Any &in_any) { cout2 << "OffCmd::execute(): arrived" << endl; ((static_cast(device))->off()); return new CORBA::Any(); } //+---------------------------------------------------------------------------- // // method : ResetCmd::execute() // // description : method to trigger the execution of the command. // PLEASE DO NOT MODIFY this method core without pogo // // in : - device : The device on which the command must be executed // - in_any : The command input data // // returns : The command output data (packed in the Any object) // //----------------------------------------------------------------------------- CORBA::Any *ResetCmd::execute(Tango::DeviceImpl *device,const CORBA::Any &in_any) { cout2 << "ResetCmd::execute(): arrived" << endl; ((static_cast(device))->reset()); return new CORBA::Any(); } // //---------------------------------------------------------------- // Initialize pointer for singleton pattern //---------------------------------------------------------------- // BiltClass *BiltClass::_instance = NULL; //+---------------------------------------------------------------------------- // // method : BiltClass::BiltClass(string &s) // // description : constructor for the BiltClass // // in : - s : The class name // //----------------------------------------------------------------------------- BiltClass::BiltClass(string &s):DeviceClass(s) { cout2 << "Entering BiltClass constructor" << endl; set_default_property(); get_class_property(); write_class_property(); cout2 << "Leaving BiltClass constructor" << endl; } //+---------------------------------------------------------------------------- // // method : BiltClass::~BiltClass() // // description : destructor for the BiltClass // //----------------------------------------------------------------------------- BiltClass::~BiltClass() { _instance = NULL; } //+---------------------------------------------------------------------------- // // method : BiltClass::instance // // description : Create the object if not already done. Otherwise, just // return a pointer to the object // // in : - name : The class name // //----------------------------------------------------------------------------- BiltClass *BiltClass::init(const char *name) { if (_instance == NULL) { try { string s(name); _instance = new BiltClass(s); } catch (bad_alloc) { throw; } } return _instance; } BiltClass *BiltClass::instance() { if (_instance == NULL) { cerr << "Class is not initialised !!" << endl; exit(-1); } return _instance; } //+---------------------------------------------------------------------------- // // method : BiltClass::command_factory // // description : Create the command object(s) and store them in the // command list // //----------------------------------------------------------------------------- void BiltClass::command_factory() { command_list.push_back(new OnCmd("On", Tango::DEV_VOID, Tango::DEV_VOID, "", "", Tango::OPERATOR)); command_list.push_back(new OffCmd("Off", Tango::DEV_VOID, Tango::DEV_VOID, "", "", Tango::OPERATOR)); command_list.push_back(new ResetCmd("Reset", Tango::DEV_VOID, Tango::DEV_VOID, "", "", Tango::OPERATOR)); command_list.push_back(new SetPoleAcCurrentCmd("SetPoleAcCurrent", Tango::DEVVAR_DOUBLEARRAY, Tango::DEV_VOID, "[0] = pole number, [1] = current", "", Tango::OPERATOR)); command_list.push_back(new LocalPoleControlCmd("LocalPoleControl", Tango::DEVVAR_SHORTARRAY, Tango::DEV_VOID, "[0] = pole number, [1] = local control true/false", "", Tango::OPERATOR)); command_list.push_back(new SetpointCheckCmd("SetpointCheck", Tango::DEVVAR_DOUBLEARRAY, Tango::DEV_BOOLEAN, "Setpoint values for the Poles", "true when settings are OK", Tango::OPERATOR)); command_list.push_back(new SetPoleCurrentCmd("SetPoleCurrent", Tango::DEVVAR_DOUBLEARRAY, Tango::DEV_VOID, "[0] = pole number, [1] = current", "", Tango::OPERATOR)); // add polling if any for (unsigned int i=0 ; ilength() ; i++) { cout4 << "Device name : " << (*devlist_ptr)[i].in() << endl; // Create devices and add it into the device list //---------------------------------------------------- device_list.push_back(new Bilt(this, (*devlist_ptr)[i])); // Export device to the outside world // Check before if database used. //--------------------------------------------- if ((Tango::Util::_UseDb == true) && (Tango::Util::_FileDb == false)) export_device(device_list.back()); else export_device(device_list.back(), (*devlist_ptr)[i]); } // End of Automatic code generation //------------------------------------------------------------- } //+---------------------------------------------------------------------------- // Method: BiltClass::attribute_factory(vector &att_list) //----------------------------------------------------------------------------- void BiltClass::attribute_factory(vector &att_list) { // Attribute : Location LocationAttrib *location = new LocationAttrib(); Tango::UserDefaultAttrProp location_prop; location_prop.set_label("Location"); location_prop.set_unit(" "); location_prop.set_format("%s"); location_prop.set_description("The pysical location of the power supply in the form:\n"); location->set_default_properties(location_prop); att_list.push_back(location); // Attribute : Currents CurrentsAttrib *currents = new CurrentsAttrib(); Tango::UserDefaultAttrProp currents_prop; currents_prop.set_label("Currents"); currents_prop.set_unit("A"); currents_prop.set_format("%6.4f"); currents_prop.set_max_value("1.8"); currents_prop.set_min_value("-1.8"); currents_prop.set_description("The measured currents of the three poles."); currents->set_default_properties(currents_prop); att_list.push_back(currents); // Attribute : Voltages VoltagesAttrib *voltages = new VoltagesAttrib(); Tango::UserDefaultAttrProp voltages_prop; voltages_prop.set_label("Voltages"); voltages_prop.set_unit("V"); voltages_prop.set_format("%6.4"); voltages_prop.set_description("The measured voltages of the three poles."); voltages->set_default_properties(voltages_prop); att_list.push_back(voltages); // Attribute : Impedances ImpedancesAttrib *impedances = new ImpedancesAttrib(); Tango::UserDefaultAttrProp impedances_prop; impedances_prop.set_label("Impedances"); impedances_prop.set_unit("Ohm"); impedances_prop.set_format("%4.2f"); impedances_prop.set_max_alarm("5.0"); impedances_prop.set_min_alarm("2.8"); impedances_prop.set_description("Calculated impedances for the three poles."); impedances->set_default_properties(impedances_prop); impedances->set_polling_period(3000); att_list.push_back(impedances); // Attribute : SetCurrentsRMS SetCurrentsRMSAttrib *set_currents_rms = new SetCurrentsRMSAttrib(); Tango::UserDefaultAttrProp set_currents_rms_prop; set_currents_rms_prop.set_label("RMS AC current setpoints/s"); set_currents_rms_prop.set_unit("mA"); set_currents_rms_prop.set_format("%6.3"); set_currents_rms_prop.set_description("Statistic when driven by the Libera. One RMS value for every pole\nof the magnet.\nRMS value of the AC setpoint applied on the DAC during the last second.\nX=sqr( (sum(setAC)*sum(setAC)) / n - ((sum(setAC)/n) *(sum(setAC)/n)) )"); set_currents_rms->set_default_properties(set_currents_rms_prop); att_list.push_back(set_currents_rms); // Attribute : SetCurrentsAverage SetCurrentsAverageAttrib *set_currents_average = new SetCurrentsAverageAttrib(); Tango::UserDefaultAttrProp set_currents_average_prop; set_currents_average_prop.set_label("Average AC current setpoints/s"); set_currents_average_prop.set_unit("mA"); set_currents_average_prop.set_format("%6.3"); set_currents_average_prop.set_description("Statistic when driven by the Libera. One average value for every pole\nof the magnet.\nAverage value of the AC setpoint applied on the DAC during the last second."); set_currents_average->set_default_properties(set_currents_average_prop); att_list.push_back(set_currents_average); // Attribute : FramesPerSecond FramesPerSecondAttrib *frames_per_second = new FramesPerSecondAttrib(); Tango::UserDefaultAttrProp frames_per_second_prop; frames_per_second_prop.set_label("Frames per second"); frames_per_second_prop.set_display_unit(" "); frames_per_second_prop.set_format("%6d"); frames_per_second_prop.set_description("Number of settings applied during the last second"); frames_per_second->set_default_properties(frames_per_second_prop); att_list.push_back(frames_per_second); // Attribute : ErrorsPerSecond ErrorsPerSecondAttrib *errors_per_second = new ErrorsPerSecondAttrib(); Tango::UserDefaultAttrProp errors_per_second_prop; errors_per_second_prop.set_label("Errors per second"); errors_per_second_prop.set_display_unit(" "); errors_per_second_prop.set_format("%6d"); errors_per_second_prop.set_description("Errors detected during the last second"); errors_per_second->set_default_properties(errors_per_second_prop); att_list.push_back(errors_per_second); // Attribute : ErrorCounters ErrorCountersAttrib *error_counters = new ErrorCountersAttrib(); Tango::UserDefaultAttrProp error_counters_prop; error_counters_prop.set_label("Error counters"); error_counters_prop.set_unit(" "); error_counters_prop.set_format("%6d"); error_counters_prop.set_description("Statistic when driven by the Libera.\nThe total number of errors since the last reset for the \nthree poles."); error_counters->set_default_properties(error_counters_prop); att_list.push_back(error_counters); // Attribute : LocalControls LocalControlsAttrib *local_controls = new LocalControlsAttrib(); Tango::UserDefaultAttrProp local_controls_prop; local_controls_prop.set_description("Indicated whether the individual channels are in local control mode for the \nAC current control. True = local control activated."); local_controls->set_default_properties(local_controls_prop); att_list.push_back(local_controls); // Attribute : Temperatures TemperaturesAttrib *temperatures = new TemperaturesAttrib(); Tango::UserDefaultAttrProp temperatures_prop; temperatures_prop.set_label("Temperatures"); temperatures_prop.set_unit("C"); temperatures_prop.set_format("%6.0f"); temperatures_prop.set_max_alarm("45"); temperatures_prop.set_description("Temperature measurements for the three poles."); temperatures->set_default_properties(temperatures_prop); temperatures->set_polling_period(30000); att_list.push_back(temperatures); // End of Automatic code generation //------------------------------------------------------------- } //+---------------------------------------------------------------------------- // // method : BiltClass::get_class_property() // // description : Read the class properties from database. // //----------------------------------------------------------------------------- void BiltClass::get_class_property() { // Initialize your default values here (if not done with POGO). //------------------------------------------------------------------ // Read class properties from database.(Automatic code generation) //------------------------------------------------------------------ // Call database and extract values //-------------------------------------------- if (Tango::Util::instance()->_UseDb==true) get_db_class()->get_property(cl_prop); Tango::DbDatum def_prop; int i = -1; // End of Automatic code generation //------------------------------------------------------------------ } //+---------------------------------------------------------------------------- // // method : BiltClass::set_default_property // // description: Set default property (class and device) for wizard. // For each property, add to wizard property name and description // If default value has been set, add it to wizard property and // store it in a DbDatum. // //----------------------------------------------------------------------------- void BiltClass::set_default_property() { string prop_name; string prop_desc; string prop_def; vector vect_data; // Set Default Class Properties // Set Default Device Properties prop_name = "IPAddress"; prop_desc = "IP Address of BILT controller.\nEach controller includes several magnets and\neach magnet includes 3 power supplies,\nfor corrections in the X, Y and Z planes.\n\n"; prop_def = "0.0.0.0"; vect_data.clear(); vect_data.push_back("0.0.0.0"); if (prop_def.length()>0) { Tango::DbDatum data(prop_name); data << vect_data ; dev_def_prop.push_back(data); add_wiz_dev_prop(prop_name, prop_desc, prop_def); } else add_wiz_dev_prop(prop_name, prop_desc); prop_name = "MagnetNumber"; prop_desc = "Magnet number from 1 to 48"; prop_def = "0"; vect_data.clear(); vect_data.push_back("0"); if (prop_def.length()>0) { Tango::DbDatum data(prop_name); data << vect_data ; dev_def_prop.push_back(data); add_wiz_dev_prop(prop_name, prop_desc, prop_def); } else add_wiz_dev_prop(prop_name, prop_desc); prop_name = "UpdatePeriod"; prop_desc = "The update period for the data reading from the power supply in milli seconds."; prop_def = "1000"; vect_data.clear(); vect_data.push_back("1000"); if (prop_def.length()>0) { Tango::DbDatum data(prop_name); data << vect_data ; dev_def_prop.push_back(data); add_wiz_dev_prop(prop_name, prop_desc, prop_def); } else add_wiz_dev_prop(prop_name, prop_desc); } //+---------------------------------------------------------------------------- // // method : BiltClass::write_class_property // // description : Set class description as property in database // //----------------------------------------------------------------------------- void BiltClass::write_class_property() { // First time, check if database used //-------------------------------------------- if (Tango::Util::_UseDb == false) return; Tango::DbData data; string classname = get_name(); string header; string::size_type start, end; // Put title Tango::DbDatum title("ProjectTitle"); string str_title("BILT multi channel power supply"); title << str_title; data.push_back(title); // Put Description Tango::DbDatum description("Description"); vector str_desc; str_desc.push_back("The BILT multi channel power supply will be used with 3 channels for the ESRF fast"); str_desc.push_back("feedback systems."); str_desc.push_back("The power supply can be controlled in 2 ways :"); str_desc.push_back("By this device server for slow or human control or"); str_desc.push_back("by the Libera Beam Position monitors for fast feedback with closed loop control."); str_desc.push_back("The devices are exported as one device per steerer magnet. Every device has three"); str_desc.push_back("channels. The channels (poles) cannot be switched on individually but have their"); str_desc.push_back("individual set points and measurement values."); description << str_desc; data.push_back(description); // put cvs or svn location string filename(classname); filename += "Class.cpp"; // Create a string with the class ID to // get the string into the binary string class_id(ClassId); // check for cvs information string src_path(CvsPath); start = src_path.find("/"); if (start!=string::npos) { end = src_path.find(filename); if (end>start) { string strloc = src_path.substr(start, end-start); // Check if specific repository start = strloc.find("/cvsroot/"); if (start!=string::npos && start>0) { string repository = strloc.substr(0, start); if (repository.find("/segfs/")!=string::npos) strloc = "ESRF:" + strloc.substr(start, strloc.length()-start); } Tango::DbDatum cvs_loc("cvs_location"); cvs_loc << strloc; data.push_back(cvs_loc); } } // check for svn information else { string src_path(SvnPath); start = src_path.find("://"); if (start!=string::npos) { end = src_path.find(filename); if (end>start) { header = "$HeadURL: "; start = header.length(); string strloc = src_path.substr(start, (end-start)); Tango::DbDatum svn_loc("svn_location"); svn_loc << strloc; data.push_back(svn_loc); } } } // Get CVS or SVN revision tag // CVS tag string tagname(TagName); header = "$Name: "; start = header.length(); string endstr(" $"); end = tagname.find(endstr); if (end!=string::npos && end>start) { string strtag = tagname.substr(start, end-start); Tango::DbDatum cvs_tag("cvs_tag"); cvs_tag << strtag; data.push_back(cvs_tag); } // SVN tag string svnpath(SvnPath); header = "$HeadURL: "; start = header.length(); end = svnpath.find(endstr); if (end!=string::npos && end>start) { string strloc = svnpath.substr(start, end-start); string tagstr ("/tags/"); start = strloc.find(tagstr); if ( start!=string::npos ) { start = start + tagstr.length(); end = strloc.find(filename); string strtag = strloc.substr(start, end-start-1); Tango::DbDatum svn_tag("svn_tag"); svn_tag << strtag; data.push_back(svn_tag); } } // Get URL location string httpServ(HttpServer); if (httpServ.length()>0) { Tango::DbDatum db_doc_url("doc_url"); db_doc_url << httpServ; data.push_back(db_doc_url); } // Put inheritance Tango::DbDatum inher_datum("InheritedFrom"); vector inheritance; inheritance.push_back("Device_4Impl"); inher_datum << inheritance; data.push_back(inher_datum); // Call database and and values //-------------------------------------------- get_db_class()->put_property(data); } } // namespace Node-path: powersupply/itest/Bilt/trunk/BiltClass.h Node-kind: file Node-action: change Text-content-length: 13628 Text-content-md5: b6ec08bfb2b6a5d26d31a67194dae90b Content-length: 13628 //============================================================================= // // file : BiltClass.h // // description : Include for the BiltClass root class. // This class is the singleton class for // the Bilt device class. // It contains all properties and methods which the // Bilt requires only once e.g. the commands. // // project : TANGO Device Server // // $Author: meyer $ // // $Revision: 1.12 $ // $Date: 2011-01-12 12:34:00 $ // // SVN only: // $HeadURL: $ // // CVS only: // $Source: /segfs/tango/cvsroot/cppserver/machine/powersupply/SrSteerers/tango/Bilt/BiltClass.h,v $ // $Log: not supported by cvs2svn $ // Revision 1.11 2010/11/10 14:00:29 meyer // Changed unit of AC RMS and average value from A to mA. // // Revision 1.10 2010-11-10 11:59:11 meyer // Changed type of Temperatures attribute from long to double. // Added default alarm and polling values. // // Revision 1.9 2010/06/21 07:13:05 meyer // Added a spectrum attribute for the temperature measurements and changed to libMagnet version 1.4. // // Revision 1.8 2010/05/01 16:58:39 meyer // Changed alarm limits for the impedance attribute. // // Revision 1.7 2010-02-12 16:35:13 meyer // Added SetPoleCurrent command again. // // Revision 1.6 2010-02-11 16:35:27 meyer // Currents settings understand NaN values. // Deleted StePoleCurrent command. // // Revision 1.5 2010/02/10 12:27:31 meyer // Restructured Bilt class. // Acquistion is now done by a thread and only the multi channel data // gets exported. A single channel class (BiltCh) was created. // // Revision 1.4 2009/11/27 13:49:26 meyer // Modified structure! The pole is no longer a device. // The device is now a magnet with three poles. // // Revision 1.3 2009/11/26 10:46:58 meyer // Updated for libMagnet_V120 // // Revision 1.2 2009/11/06 12:46:25 meyer // Added impedance attribute and corrected fromatting of attribute values. // // Revision 1.1.1.1 2009/11/04 16:23:02 meyer // Imported using TkCVS // // // copyleft : European Synchrotron Radiation Facility // BP 220, Grenoble 38043 // FRANCE // //============================================================================= // // This file is generated by POGO // (Program Obviously used to Generate tango Object) // // (c) - Software Engineering Group - ESRF //============================================================================= #ifndef _BILTCLASS_H #define _BILTCLASS_H #include #include namespace Bilt_ns {//===================================== // Define classes for attributes //===================================== class TemperaturesAttrib: public Tango::SpectrumAttr { public: TemperaturesAttrib():SpectrumAttr("Temperatures", Tango::DEV_DOUBLE, Tango::READ, 6) {}; ~TemperaturesAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_Temperatures(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_Temperatures_allowed(ty);} }; class LocalControlsAttrib: public Tango::SpectrumAttr { public: LocalControlsAttrib():SpectrumAttr("LocalControls", Tango::DEV_BOOLEAN, Tango::READ, 5) {}; ~LocalControlsAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_LocalControls(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_LocalControls_allowed(ty);} }; class ErrorCountersAttrib: public Tango::SpectrumAttr { public: ErrorCountersAttrib():SpectrumAttr("ErrorCounters", Tango::DEV_ULONG, Tango::READ, 3) {}; ~ErrorCountersAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_ErrorCounters(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_ErrorCounters_allowed(ty);} }; class ErrorsPerSecondAttrib: public Tango::SpectrumAttr { public: ErrorsPerSecondAttrib():SpectrumAttr("ErrorsPerSecond", Tango::DEV_ULONG, Tango::READ, 3) {}; ~ErrorsPerSecondAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_ErrorsPerSecond(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_ErrorsPerSecond_allowed(ty);} }; class FramesPerSecondAttrib: public Tango::SpectrumAttr { public: FramesPerSecondAttrib():SpectrumAttr("FramesPerSecond", Tango::DEV_ULONG, Tango::READ, 3) {}; ~FramesPerSecondAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_FramesPerSecond(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_FramesPerSecond_allowed(ty);} }; class SetCurrentsAverageAttrib: public Tango::SpectrumAttr { public: SetCurrentsAverageAttrib():SpectrumAttr("SetCurrentsAverage", Tango::DEV_DOUBLE, Tango::READ, 3) {}; ~SetCurrentsAverageAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_SetCurrentsAverage(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_SetCurrentsAverage_allowed(ty);} }; class SetCurrentsRMSAttrib: public Tango::SpectrumAttr { public: SetCurrentsRMSAttrib():SpectrumAttr("SetCurrentsRMS", Tango::DEV_DOUBLE, Tango::READ, 3) {}; ~SetCurrentsRMSAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_SetCurrentsRMS(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_SetCurrentsRMS_allowed(ty);} }; class ImpedancesAttrib: public Tango::SpectrumAttr { public: ImpedancesAttrib():SpectrumAttr("Impedances", Tango::DEV_DOUBLE, Tango::READ, 3) {}; ~ImpedancesAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_Impedances(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_Impedances_allowed(ty);} }; class VoltagesAttrib: public Tango::SpectrumAttr { public: VoltagesAttrib():SpectrumAttr("Voltages", Tango::DEV_DOUBLE, Tango::READ, 3) {}; ~VoltagesAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_Voltages(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_Voltages_allowed(ty);} }; class CurrentsAttrib: public Tango::SpectrumAttr { public: CurrentsAttrib():SpectrumAttr("Currents", Tango::DEV_DOUBLE, Tango::READ_WRITE, 3) {}; ~CurrentsAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_Currents(att);} virtual void write(Tango::DeviceImpl *dev,Tango::WAttribute &att) {(static_cast(dev))->write_Currents(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_Currents_allowed(ty);} }; class LocationAttrib: public Tango::Attr { public: LocationAttrib():Attr("Location", Tango::DEV_STRING, Tango::READ) {}; ~LocationAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_Location(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_Location_allowed(ty);} }; //========================================= // Define classes for commands //========================================= class SetPoleCurrentCmd : public Tango::Command { public: SetPoleCurrentCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out, const char *in_desc, const char *out_desc, Tango::DispLevel level) :Command(name,in,out,in_desc,out_desc, level) {}; SetPoleCurrentCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out) :Command(name,in,out) {}; ~SetPoleCurrentCmd() {}; virtual CORBA::Any *execute (Tango::DeviceImpl *dev, const CORBA::Any &any); virtual bool is_allowed (Tango::DeviceImpl *dev, const CORBA::Any &any) {return (static_cast(dev))->is_SetPoleCurrent_allowed(any);} }; class SetpointCheckCmd : public Tango::Command { public: SetpointCheckCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out, const char *in_desc, const char *out_desc, Tango::DispLevel level) :Command(name,in,out,in_desc,out_desc, level) {}; SetpointCheckCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out) :Command(name,in,out) {}; ~SetpointCheckCmd() {}; virtual CORBA::Any *execute (Tango::DeviceImpl *dev, const CORBA::Any &any); virtual bool is_allowed (Tango::DeviceImpl *dev, const CORBA::Any &any) {return (static_cast(dev))->is_SetpointCheck_allowed(any);} }; class LocalPoleControlCmd : public Tango::Command { public: LocalPoleControlCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out, const char *in_desc, const char *out_desc, Tango::DispLevel level) :Command(name,in,out,in_desc,out_desc, level) {}; LocalPoleControlCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out) :Command(name,in,out) {}; ~LocalPoleControlCmd() {}; virtual CORBA::Any *execute (Tango::DeviceImpl *dev, const CORBA::Any &any); virtual bool is_allowed (Tango::DeviceImpl *dev, const CORBA::Any &any) {return (static_cast(dev))->is_LocalPoleControl_allowed(any);} }; class SetPoleAcCurrentCmd : public Tango::Command { public: SetPoleAcCurrentCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out, const char *in_desc, const char *out_desc, Tango::DispLevel level) :Command(name,in,out,in_desc,out_desc, level) {}; SetPoleAcCurrentCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out) :Command(name,in,out) {}; ~SetPoleAcCurrentCmd() {}; virtual CORBA::Any *execute (Tango::DeviceImpl *dev, const CORBA::Any &any); virtual bool is_allowed (Tango::DeviceImpl *dev, const CORBA::Any &any) {return (static_cast(dev))->is_SetPoleAcCurrent_allowed(any);} }; class ResetCmd : public Tango::Command { public: ResetCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out, const char *in_desc, const char *out_desc, Tango::DispLevel level) :Command(name,in,out,in_desc,out_desc, level) {}; ResetCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out) :Command(name,in,out) {}; ~ResetCmd() {}; virtual CORBA::Any *execute (Tango::DeviceImpl *dev, const CORBA::Any &any); virtual bool is_allowed (Tango::DeviceImpl *dev, const CORBA::Any &any) {return (static_cast(dev))->is_Reset_allowed(any);} }; class OffCmd : public Tango::Command { public: OffCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out, const char *in_desc, const char *out_desc, Tango::DispLevel level) :Command(name,in,out,in_desc,out_desc, level) {}; OffCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out) :Command(name,in,out) {}; ~OffCmd() {}; virtual CORBA::Any *execute (Tango::DeviceImpl *dev, const CORBA::Any &any); virtual bool is_allowed (Tango::DeviceImpl *dev, const CORBA::Any &any) {return (static_cast(dev))->is_Off_allowed(any);} }; class OnCmd : public Tango::Command { public: OnCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out, const char *in_desc, const char *out_desc, Tango::DispLevel level) :Command(name,in,out,in_desc,out_desc, level) {}; OnCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out) :Command(name,in,out) {}; ~OnCmd() {}; virtual CORBA::Any *execute (Tango::DeviceImpl *dev, const CORBA::Any &any); virtual bool is_allowed (Tango::DeviceImpl *dev, const CORBA::Any &any) {return (static_cast(dev))->is_On_allowed(any);} }; // // The BiltClass singleton definition // class #ifdef _TG_WINDOWS_ __declspec(dllexport) #endif BiltClass : public Tango::DeviceClass { public: // properties member data // add your own data members here //------------------------------------ public: Tango::DbData cl_prop; Tango::DbData cl_def_prop; Tango::DbData dev_def_prop; // Method prototypes static BiltClass *init(const char *); static BiltClass *instance(); ~BiltClass(); Tango::DbDatum get_class_property(string &); Tango::DbDatum get_default_device_property(string &); Tango::DbDatum get_default_class_property(string &); protected: BiltClass(string &); static BiltClass *_instance; void command_factory(); void get_class_property(); void attribute_factory(vector &); void write_class_property(); void set_default_property(); string get_cvstag(); string get_cvsroot(); private: void device_factory(const Tango::DevVarStringArray *); }; } // namespace Bilt_ns #endif // _BILTCLASS_H Node-path: powersupply/itest/Bilt/trunk/BiltStateMachine.cpp Node-kind: file Node-action: change Text-content-length: 10787 Text-content-md5: 5c14bac0042285bec9ce535565f56eeb Content-length: 10787 static const char *RcsId = "$Id $"; //+============================================================================= // // file : BiltStateMachine.cpp // // description : C++ source for the Bilt and its alowed // methods for commands and attributes // // project : TANGO Device Server // // $Author: meyer $ // // $Revision: 1.12 $ // $Date: 2011-01-12 12:34:00 $ // // SVN only: // $HeadURL: $ // // CVS only: // $Source: /segfs/tango/cvsroot/cppserver/machine/powersupply/SrSteerers/tango/Bilt/BiltStateMachine.cpp,v $ // $Log: not supported by cvs2svn $ // Revision 1.11 2010/11/10 14:00:29 meyer // Changed unit of AC RMS and average value from A to mA. // // Revision 1.10 2010-11-10 11:59:11 meyer // Changed type of Temperatures attribute from long to double. // Added default alarm and polling values. // // Revision 1.9 2010/06/21 07:13:05 meyer // Added a spectrum attribute for the temperature measurements and changed to libMagnet version 1.4. // // Revision 1.8 2010/05/01 16:58:39 meyer // Changed alarm limits for the impedance attribute. // // Revision 1.7 2010-02-12 16:35:13 meyer // Added SetPoleCurrent command again. // // Revision 1.6 2010-02-11 16:35:27 meyer // Currents settings understand NaN values. // Deleted StePoleCurrent command. // // Revision 1.5 2010/02/10 12:27:31 meyer // Restructured Bilt class. // Acquistion is now done by a thread and only the multi channel data // gets exported. A single channel class (BiltCh) was created. // // Revision 1.4 2009/11/27 13:49:26 meyer // Modified structure! The pole is no longer a device. // The device is now a magnet with three poles. // // Revision 1.3 2009/11/26 10:46:58 meyer // Updated for libMagnet_V120 // // Revision 1.2 2009/11/06 12:46:25 meyer // Added impedance attribute and corrected fromatting of attribute values. // // Revision 1.1.1.1 2009/11/04 16:23:02 meyer // Imported using TkCVS // // // copyleft : European Synchrotron Radiation Facility // BP 220, Grenoble 38043 // FRANCE // //-============================================================================= // // This file is generated by POGO // (Program Obviously used to Generate tango Object) // // (c) - Software Engineering Group - ESRF //============================================================================= #include #include #include /*==================================================================== * This file contains the methods to allow commands and attributes * read or write execution. * * If you wand to add your own code, add it between * the "End/Re-Start of Generated Code" comments. * * If you want, you can also add your own methods. *==================================================================== */ namespace Bilt_ns { //================================================= // Attributes Allowed Methods //================================================= //+---------------------------------------------------------------------------- // // method : Bilt::is_Voltages_allowed // // description : Read/Write allowed for Voltages attribute. // //----------------------------------------------------------------------------- bool Bilt::is_Voltages_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_Impedances_allowed // // description : Read/Write allowed for Impedances attribute. // //----------------------------------------------------------------------------- bool Bilt::is_Impedances_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_SetCurrentsRMS_allowed // // description : Read/Write allowed for SetCurrentsRMS attribute. // //----------------------------------------------------------------------------- bool Bilt::is_SetCurrentsRMS_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_SetCurrentsAverage_allowed // // description : Read/Write allowed for SetCurrentsAverage attribute. // //----------------------------------------------------------------------------- bool Bilt::is_SetCurrentsAverage_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_ErrorCounters_allowed // // description : Read/Write allowed for ErrorCounters attribute. // //----------------------------------------------------------------------------- bool Bilt::is_ErrorCounters_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_LocalControls_allowed // // description : Read/Write allowed for LocalControls attribute. // //----------------------------------------------------------------------------- bool Bilt::is_LocalControls_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_Currents_allowed // // description : Read/Write allowed for Currents attribute. // //----------------------------------------------------------------------------- bool Bilt::is_Currents_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_FramesPerSecond_allowed // // description : Read/Write allowed for FramesPerSecond attribute. // //----------------------------------------------------------------------------- bool Bilt::is_FramesPerSecond_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_ErrorsPerSecond_allowed // // description : Read/Write allowed for ErrorsPerSecond attribute. // //----------------------------------------------------------------------------- bool Bilt::is_ErrorsPerSecond_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_Temperatures_allowed // // description : Read/Write allowed for Temperatures attribute. // //----------------------------------------------------------------------------- bool Bilt::is_Temperatures_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_Location_allowed // // description : Read/Write allowed for Location attribute. // //----------------------------------------------------------------------------- bool Bilt::is_Location_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //================================================= // Commands Allowed Methods //================================================= //+---------------------------------------------------------------------------- // // method : Bilt::is_On_allowed // // description : Execution allowed for On command. // //----------------------------------------------------------------------------- bool Bilt::is_On_allowed(const CORBA::Any &any) { if (get_state() == Tango::ON || get_state() == Tango::FAULT || get_state() == Tango::ALARM || get_state() == Tango::UNKNOWN) { // End of Generated Code // Re-Start of Generated Code return false; } return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_Off_allowed // // description : Execution allowed for Off command. // //----------------------------------------------------------------------------- bool Bilt::is_Off_allowed(const CORBA::Any &any) { if (get_state() == Tango::OFF) { // End of Generated Code // Re-Start of Generated Code return false; } return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_Reset_allowed // // description : Execution allowed for Reset command. // //----------------------------------------------------------------------------- bool Bilt::is_Reset_allowed(const CORBA::Any &any) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_SetPoleAcCurrent_allowed // // description : Execution allowed for SetPoleAcCurrent command. // //----------------------------------------------------------------------------- bool Bilt::is_SetPoleAcCurrent_allowed(const CORBA::Any &any) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_LocalPoleControl_allowed // // description : Execution allowed for LocalPoleControl command. // //----------------------------------------------------------------------------- bool Bilt::is_LocalPoleControl_allowed(const CORBA::Any &any) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_SetpointCheck_allowed // // description : Execution allowed for SetpointCheck command. // //----------------------------------------------------------------------------- bool Bilt::is_SetpointCheck_allowed(const CORBA::Any &any) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_SetPoleCurrent_allowed // // description : Execution allowed for SetPoleCurrent command. // //----------------------------------------------------------------------------- bool Bilt::is_SetPoleCurrent_allowed(const CORBA::Any &any) { // End of Generated Code // Re-Start of Generated Code return true; } } // namespace Bilt_ns Revision-number: 74 Prop-content-length: 123 Content-length: 123 K 10 svn:author V 5 meyer K 8 svn:date V 27 2011-01-12T12:35:00.000000Z K 7 svn:log V 23 Changed version to 3.7 PROPS-END Node-path: powersupply/itest/Bilt/trunk/Makefile Node-kind: file Node-action: change Text-content-length: 6777 Text-content-md5: 5d505570fd9ee49e024d00d7f1c6809d Content-length: 6777 #============================================================================= # # file : Makefile # # description : Include for the Bilt class. # # project : Makefile to generate a Tango server # # $Author: meyer $ # # $Revision: 1.18 $ # # $Log: not supported by cvs2svn $ # Revision 1.17 2010/11/23 07:13:38 meyer # Changed version to 3.6 # # Revision 1.16 2010-11-10 11:59:30 meyer # Changed version to 3.5 # # Revision 1.15 2010-11-08 15:29:42 meyer # Linking now with libtango.a version 7.2! # # Revision 1.14 2010/06/24 11:44:00 meyer # Changed version to 3.4 # # Revision 1.13 2010/06/21 07:16:52 meyer # Changed version to 3.3 # # Revision 1.12 2010/06/21 07:13:05 meyer # Added a spectrum attribute for the temperature measurements and changed to libMagnet version 1.4. # # Revision 1.11 2010/03/19 15:27:01 meyer # Canged to version 3.2 # # Revision 1.10 2010/03/16 15:03:33 meyer # Excluded Steerer class. # # Revision 1.9 2010/03/16 14:57:56 meyer # Rlease_3_1 # # Revision 1.8 2010-02-11 16:35:27 meyer # Currents settings understand NaN values. # Deleted StePoleCurrent command. # # Revision 1.7 2010/02/10 16:22:15 meyer # Release_3_0 # # Revision 1.6 2010/02/10 12:27:31 meyer # Restructured Bilt class. # Acquistion is now done by a thread and only the multi channel data # gets exported. A single channel class (BiltCh) was created. # # Revision 1.5 2009/12/18 12:02:18 meyer # Changed version number to 2.1 # # Revision 1.4 2009/12/18 10:19:23 meyer # Using libMagnet version 130 now. # # Revision 1.3 2009/11/27 13:49:26 meyer # Modified structure! The pole is no longer a device. # The device is now a magnet with three poles. # # Revision 1.2 2009/11/26 10:46:58 meyer # Updated for libMagnet_V120 # # Revision 1.1.1.1 2009/11/04 16:23:02 meyer # Imported using TkCVS # # # copyleft : European Synchrotron Radiation Facility # BP 220, Grenoble 38043 # FRANCE # #============================================================================= # This file is generated by POGO # (Program Obviously used to Generate tango Object) # # (c) - Software Engineering Group - ESRF #============================================================================= # CLASS = Bilt MAJOR_VERS = 3 MINOR_VERS = 7 RELEASE = Release_$(MAJOR_VERS)_$(MINOR_VERS) OS = $(shell /csadmin/common/scripts/get_os) PROCESSOR = $(shell uname -p) #----------------------------------------- # Set default home directories #----------------------------------------- TANGO_HOME = /segfs/tango/release/$(BIN_DIR) CPP_SERVERS = $(TANGO_HOME)/classes ifdef no_debug DEBUG = -O else DEBUG = -g endif ifdef _solaris CC = CC BIN_DIR=$(OS)_CC AR_SL = $(CC) -mt -G VERS_OPT = -h SL_EXT = so endif ifdef linux CC = c++ CC_SHLIB = $(CC) -fPIC $(PROCESSOR)=1 ifdef x86_64 NBITS=_64 endif BIN_DIR=$(OS)$(NBITS) AR_SL = $(CC) -fPIC -shared SL_EXT = so VERS_OPT = -Wl,-soname, endif INCLUDE_DIRS = -I$(TANGO_HOME)/include -I. \ -I$(CPP_SERVERS)/include \ -I libMagnet_V140 OBJS_DIR = obj/$(BIN_DIR) LIB_DIRS = -L $(CPP_SERVERS)/lib \ -L $(TANGO_HOME)/lib \ -L libMagnet_V140 TARGET_LIB = $(CPP_SERVERS)/lib/libtgclasses.a #----------------------------------------- # Set CXXFLAGS and LFLAGS #----------------------------------------- ifdef _solaris CXXFLAGS = $(DEBUG) -mt -D_PTHREADS $(INCLUDE_DIRS) LFLAGS = $(DEBUG) $(LIB_DIRS) \ -ltango \ -llog4tango \ -lomniORB4 \ -lomniDynamic4 \ -lomnithread \ -lCOS4 \ -lpthread \ -lposix4 -lsocket -lnsl \ -ltgclasses endif ifdef linux CXXFLAGS = -g -D_REENTRANT $(INCLUDE_DIRS) LFLAGS = $(DEBUG) $(LIB_DIRS) \ /segfs/tango/release/redhate5/lib/libtango.7.2.0.a \ -llog4tango \ -lomniORB4 \ -lomniDynamic4 \ -lomnithread \ -lCOS4 \ -ldl -lpthread \ -lMagnet \ -ltgclasses endif #----------------------------------------- # Set dependences #----------------------------------------- SVC_OBJS = $(OBJS_DIR)/$(CLASS).o \ $(OBJS_DIR)/$(CLASS)StateMachine.o \ $(OBJS_DIR)/$(CLASS)Class.o \ $(OBJS_DIR)/AcquisitionThread.o \ $(OBJS_DIR)/ClassFactory.o \ $(OBJS_DIR)/main.o SHLIB_OBJS = $(OBJS_DIR)/$(CLASS)Class.so.o \ $(OBJS_DIR)/$(CLASS)StateMachine.so.o \ $(OBJS_DIR)/$(CLASS).so.o \ $(OBJS_DIR)/AcquisitionThread.o SVC_INC = $(CLASS)Class.h \ $(CLASS).h \ AcquisitionThread.h $(OBJS_DIR)/%.o: %.cpp $(SVC_INC) $(CC) $(CXXFLAGS) -c $< -o $(OBJS_DIR)/$*.o $(OBJS_DIR)/%.so.o: %.cpp $(SVC_INC) $(CC_SHLIB) $(CXXFLAGS) -c $< -o $(OBJS_DIR)/$*.so.o #----------------------------------------- # Make Entry #----------------------------------------- all: $(CLASS) $(CLASS): make_obj_dir make_bin_dir $(SVC_OBJS) $(CC) $(SVC_OBJS) -o $(CLASS) $(LFLAGS) @mv $(CLASS) bin/$(BIN_DIR)/$(CLASS) shlib: make_obj_dir make_shlib_dir $(SHLIB_OBJS) $(AR_SL) -o \ shlib/$(BIN_DIR)/$(CLASS).$(SL_EXT).$(MAJOR_VERS).$(MINOR_VERS) \ $(VERS_OPT)$(CLASS).$(SL_EXT).$(MAJOR_VERS) \ $(SHLIB_OBJS) $(LFLAGS) @rm -f shlib/$(BIN_DIR)/$(CLASS).$(SL_EXT) @cd shlib/$(BIN_DIR); \ ln -s $(CLASS).$(SL_EXT).$(MAJOR_VERS).$(MINOR_VERS) $(CLASS).$(SL_EXT) clean: rm -f $(OBJS_DIR)/*.o \ $(OBJS_DIR)/*.so.o \ bin/$(BIN_DIR)/$(CLASS) \ core make_obj_dir: @mkdir -p obj @mkdir -p obj/$(BIN_DIR) make_bin_dir: @mkdir -p bin @mkdir -p bin/$(BIN_DIR) make_shlib_dir: @mkdir -p shlib @mkdir -p shlib/$(BIN_DIR) #----------------------------------------- # Install binary file #----------------------------------------- install: cp bin/$(BIN_DIR)/$(CLASS) $(CPP_SERVERS)/bin #----------------------------------------- # Update class library and header files # recompile without debug mode. #----------------------------------------- lib: clean @make no_debug=1 cp *.h $(CPP_SERVERS)/include ar ruv $(TARGET_LIB) $(OBJS_DIR)/$(CLASS).o ar ruv $(TARGET_LIB) $(OBJS_DIR)/$(CLASS)Class.o ar ruv $(TARGET_LIB) $(OBJS_DIR)/$(CLASS)StateMachine.o ar ruv $(TARGET_LIB) $(OBJS_DIR)/AcquisitionThread.o ident $(TARGET_LIB) | grep $(CLASS) #------------------------------------------------------ # Tag the CVS/SVN module corresponding to this class # copy cvs_tag or svn_tag to tag: entry #------------------------------------------------------ #svn_tag: # svn copy ../trunk ../tags/$(RELEASE) # svn commit ../tags/$(RELEASE) \ # -m "Tagging the $(RELEASE) of the $(CLASS) project." # #cvs_tag: # @cvstag "$(CLASS)-$(RELEASE)" # @make $(CLASS) # @make show_tag #show_cvs_tag: # @cvstag -d # # Only these make options work with the current Pogo version 5.3.x! tag: @cvstag "$(CLASS)-$(RELEASE)" @make $(CLASS) @make show_tag show_tag: @cvstag -d Revision-number: 75 Prop-content-length: 147 Content-length: 147 K 8 svn:date V 27 2011-01-12T12:35:01.000000Z K 7 svn:log V 73 This commit was manufactured by cvs2svn to create tag 'Bilt-Release_3_7'. PROPS-END Node-path: powersupply/itest/Bilt/tags/Bilt-Release_3_7 Node-kind: dir Node-action: add Node-copyfrom-rev: 74 Node-copyfrom-path: powersupply/itest/Bilt/trunk Revision-number: 76 Prop-content-length: 170 Content-length: 170 K 10 svn:author V 5 meyer K 8 svn:date V 27 2011-01-24T14:43:06.000000Z K 7 svn:log V 70 Added time-out exception and changed the time-out value to 2 seconds. PROPS-END Node-path: powersupply/itest/Bilt/trunk/libMagnet_V140/ClassMagnet.h Node-kind: file Node-action: change Text-content-length: 6765 Text-content-md5: c53472b2eff3829eab4ef95134893824 Content-length: 6765 // ============================================================================ // // = CONTEXT // ITest Power Supplies - C++ Interface // // = FILENAME // ClassMagnet.h // // = AUTHOR // Sebastien Laurent - ITEST // // = VERSION // 1.40 // // ============================================================================ #ifndef _ITEST_CLASSMAGNET_H_ #define _ITEST_CLASSMAGNET_H_ //--------------------------------------------------------------------------- #include #include "Exception.h" namespace itest{ #define MAGNET1 #define MAGNET2 #define NBRPOLE 3 #define INST_MAGN1_POLE_X 1 //Instrument du pole X de l'aimant 1 #define INST_MAGN2_POLE_X 7 //Instrument du pole X de l'aimant 2 #define P1 1 //groupe de BILT de l'aimant 1 #define P2 2 //groupe de BILT de l'aimant 2 #define BUFFSIZE 130 //taille buffer de caractère de réception #define SOCK_PORT 5025 //Port de communication socket #define MAXTIME_CONNECT_READ 2 //temps max d'attente pour une connexion et une lecture sur BILT modif V201 #define X 0 #define Y 1 #define Z 2 #define CONF 0 #define RS485 1 #define MAGNET_OFF 0 #define MAGNET_ON 1 #define Q_SYSTERR ":syst:err?" #define Q_MCURRAVER ";:meas:curr:aver?" //modif V130 #define Q_MVOLTAVER ";:meas:volt:aver?" //modif V130 #define Q_MCURR ";:meas:curr?" #define Q_MVOLT ";:meas:volt?" #define Q_IDATA ";:idata?" #define Q_MDATA ";:mdata?" #define Q_SWITCH ";:switch?" #define Q_CURR_DC ";:curr:dc?" #define Q_FAIL ";:lim:fail?" #define Q_FAILSTR ";:lim:fail:str?" #define Q_STAT ":stat?" #define SWITCH ";:switch " #define CURR_DC ";:curr:dc " #define CURR_AC ";:curr:ac " #define STAT ":stat " #define STATCLEAR ":stat:clear" #define SYSTVERS ":syst:vers?" //comptage #define Q_FDATA ";:fdata?" #define FRST ";:frst" //test #define Q_CTN ";:test:temp1?;:test:temp2?" //modif V140 //--------------------------------------------------------------------------- #define ITEST_EXCEPT_TRY_STR "ItestException exception caught while trying " #define ITEST_EXCEPT_TIMEOUT "ItestException timeout on socket" #define ITEST_EXCEPT_MAGN_STR "ItestException exception caught on magnet" #define UNKNOW_EXCEPT_MAGN_STR "Unknown exception caugth on magnet" #define SOCK_ERROR_STR "Socket error" #define CONNECT_FAILED_STR "Connection failed" //--------------------------------------------------------------------------- class Socket{ private: int Sockfd; char R_Buff[BUFFSIZE]; bool init_device_done; //modif V202 07/06/07 pas d'exception dans constructeur mais dans fonctions membres protected: public: Socket(const char *StrIP); ~Socket(void); char *query(const std::string& Str); void write(const std::string& Str); }; //---------------------------------- class TBilt : private Socket //public Socket modif V202 05/06/07 { private: char BuffLastErr[50]; int NumLastErr; const char *StrLastErr; //modif V202 07/06/07 passage en private protected: public: TBilt(const char *StrIP); ~TBilt(void); void write(const std::string& _Str) throw (itest::ItestException); char *query(const std::string& _Str) throw (itest::ItestException); //ajout de const modif V202 05/06/07 }; //---------------------------------- class TPole{ private: // int Group; int Inst; int *PtrSock; char *Ptr_R_Buff; int NumMagnet; int Pole; TBilt *Bilt; public: TPole(TBilt *_Bilt, int _NumMagnet, int _Pole); double get_measure_current_aver(void) throw (itest::ItestException); //modif V130 double get_measure_voltage_aver(void) throw (itest::ItestException); //modif V130 double get_measure_current(void) throw (itest::ItestException); double get_measure_voltage(void) throw (itest::ItestException); void get_idata(struct idata *) throw (itest::ItestException); int get_switch(void) throw (itest::ItestException); double get_current_DC(void) throw (itest::ItestException); int get_state(void) throw (itest::ItestException); int get_num_alarm(void) throw (itest::ItestException); const char * get_str_alarm(void) throw (itest::ItestException); void set_current_DC(double ValF) throw (itest::ItestException); void set_current_AC(double ValF) throw (itest::ItestException); void set_switch(bool val) throw (itest::ItestException); // void clear_alarm(void) throw (itest::ItestException); //taux de comptage void get_fdata(struct fdata *) throw (itest::ItestException); void clear_ferrors(void) throw (itest::ItestException); //test ctn modif V140 void get_ctn(int *ctn1,int *ctn2) throw (itest::ItestException); }; //---------------------------------- class TMagnet { protected: private: int Group; char StrAddrIp[20]; TBilt *Bilt; TPole *Pole[NBRPOLE]; int NumMagnet; //passe en private modif V202 05/06/07 const char *AddrIP; //passe en private modif V202 05/06/07 public: TMagnet(const char *_AddrIp,int NumMagnet) throw (itest::ItestException); ~TMagnet(void); TMagnet(const TMagnet & Magn) throw (itest::ItestException); TMagnet & operator=(const TMagnet & Magn) throw (itest::ItestException); //modif V201 07/03/07 int num_magnet(void){return NumMagnet;} //modif V202 05/06/07 const char *addrIP_magnet(void){return AddrIP;} //modif V202 05/06/07 TPole & pole(int Num); void clear_all_err(void) throw (itest::ItestException); void clear_alarm(void) throw (itest::ItestException); void set_switch(bool val) throw (itest::ItestException); void set_state(bool val) throw (itest::ItestException); void get_mdata(struct mdata *) throw (itest::ItestException); int get_state(void) throw (itest::ItestException); const char * get_bilt_vers(void) throw (itest::ItestException); }; //--------------------------------------------------------------------------- //Structure de données de idata struct idata{ int magnet; int pole; int state; std::string fail; double measvolt; double meascurr; }; //--------------------------------------------------------------------------- //Structure de données de Mdata struct mdata{ int magnet; int state; struct idata idata[NBRPOLE]; }; //--------------------------------------------------------------------------- //Structure de données de Fdata struct fdata{ unsigned int nbrframe_sec; unsigned int nbrferr_sec; double rms_ac_sett_sec; double average_sett_sec; unsigned int nbrferr; }; //--------------------------------------------------------------------------- } //end namespace //--------------------------------------------------------------------------- #endif //_ITEST_CLASSMAGNET_H_ Revision-number: 77 Prop-content-length: 195 Content-length: 195 K 10 svn:author V 5 meyer K 8 svn:date V 27 2011-01-24T14:45:33.000000Z K 7 svn:log V 95 Added an exception in case of time-outs and changed the teperature reading (patch from ITEST). PROPS-END Node-path: powersupply/itest/Bilt/trunk/libMagnet_V140/ClassMagnet.cpp Node-kind: file Node-action: change Text-content-length: 37821 Text-content-md5: d6afcd37b927c46dd4334c9e66454e27 Content-length: 37821 // ============================================================================ // // = CONTEXT // ITest Power Supplies - C++ Interface // // = FILENAME // ClassMagnet.cpp // // = AUTHOR // Sebastien Laurent - ITEST // // = VERSION // 1.40 // // ============================================================================ // V140 // get_ctn for measurement : get 2 CTN measures per pole // V130 // idata modified : return average value of voltage and current // get_measre_current_aver and get_measure_voltage_aver added // V120 // fdata modified : RMS value // V110 // first library for BE549 // ============================================================================ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "ClassMagnet.h" #include "Exception.h" namespace itest{ //--------------------------------------------------------------------------- //#define __ITEST_DEBUG //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //---------------------------CLASSE SOCKET---------------------------------- //--------------------------------------------------------------------------- //SOCKET //Création de la socket, connexion au BILT Socket::Socket(const char *StrIP):init_device_done(false) { struct sockaddr_in adresse; int resultat,flag; struct timeval Tv; fd_set myset; #ifdef __ITEST_DEBUG std::cout<<"CREATE SOCKET"<init_device_done=true; //modif V202 07/06/07 //Set blocking // fcntl(Sockfd, F_SETFL, flag); #ifdef __ITEST_DEBUG std::cout<<"END CREATED: "<init_device_done) //modif V202 07/06/07 { std::ostringstream Desc; Desc<"<init_device_done) //modif V202 07/06/07 { std::ostringstream Desc; Desc<"<"<NumLastErr=atoi(Ptr))!=0) { std::ostringstream Desc; this->StrLastErr=strchr(Ptr,','); strcpy(&BuffLastErr[0],++this->StrLastErr); this->StrLastErr=&BuffLastErr[0]; Desc<"<StrLastErr<NumLastErr); throw e; } } //---------------------------------- char *TBilt::query(const std::string& _Str) throw (itest::ItestException) { std::ostringstream oss; oss<<_Str<NumMagnet<NumMagnet<NumMagnet<NBRPOLE) { std::ostringstream Desc; Desc<NumMagnet<Pole[Num]; } //--------------------------------------------------------------------------- //GROUPE //Allume ou éteind le groupe //Allume ou éteind l'aimant //0=OFF;1=ON //---------------------------------- void TMagnet::set_state(bool val) throw (itest::ItestException) { try{ std::ostringstream oss; oss<<":p"<Group<write(oss.str()); } catch(ItestException &e) { std::ostringstream Desc; Desc<NumMagnet<NumMagnet<Group<query(oss.str()))-1); //-1 pour avoir meme numero pour groupe et instrument } catch(ItestException &e) { std::ostringstream Desc; Desc<NumMagnet<NumMagnet<magnet=_magnet; mymdata->state=atoi(TabRes[2].c_str())-1; //-1 pour avoir state inst = state group parse_fill_idata(Tabsplit[1].c_str(), &(mymdata->idata[X]),_magnet); parse_fill_idata(Tabsplit[2].c_str(), &(mymdata->idata[Y]),_magnet); parse_fill_idata(Tabsplit[3].c_str(), &(mymdata->idata[Z]),_magnet); } //---------------------------------- void TMagnet::get_mdata(struct mdata * mymdata) throw (itest::ItestException) { try{ std::ostringstream oss; char *Ptr; oss<<":p"<Group<query(oss.str()); #ifdef __ITEST_DEBUG std::cout<<"GET_MDATA: "<NumMagnet); } catch(ItestException &e) { std::ostringstream Desc; Desc<NumMagnet<NumMagnet<Group<Group<write(oss.str()); } catch(ItestException &e) { std::ostringstream Desc; Desc<NumMagnet<NumMagnet<Pole[i]->set_switch(val); } catch(ItestException &e) { std::ostringstream Desc; Desc<query(oss.str())); #ifdef __ITEST_DEBUG std::cout<<"BOUCLE ERR"<NumMagnet<NumMagnet<query(oss.str()); return Ptr; } catch(ItestException &e) { std::ostringstream Desc; Desc<NumMagnet<NumMagnet<Inst<query(oss.str()))); } catch(ItestException &e) { std::ostringstream Desc; Desc<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<Inst<query(oss.str()); return atof(Ptr); } catch(ItestException &e) { std::ostringstream Desc; Desc<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<Inst<query(oss.str()); return atof(Ptr); } catch(ItestException &e) { std::ostringstream Desc; Desc<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<Inst<query(oss.str()); return atof(Ptr); } catch(ItestException &e) { std::ostringstream Desc; Desc<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<Inst<query(oss.str()); return atof(Ptr); } catch(ItestException &e) { std::ostringstream Desc; Desc<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<magnet=_magnet; int var=atoi(TabRes[0].c_str()+1); myidata->pole=(var>5?(var-7):(var-1))/2; myidata->state=atoi(TabRes[1].c_str()); myidata->fail=TabRes[2]; myidata->measvolt=atof(TabRes[3].c_str()); myidata->meascurr=atof(TabRes[4].c_str()); } //--------------------------------------------------------------------------- //INSTRUMENT BE549 //Lecture de idata : NoModule,State,Fail,MeasU,MeasI //State : 0=OFF,1=ON,2=WARNING,3=ALARM //Lecture de l'état et des paramètres de l'alimentation du pole void TPole::get_idata(struct idata *myidata) throw (itest::ItestException) { try{ std::ostringstream oss; char *Ptr; oss<<":i"<Inst<query(oss.str()); #ifdef __ITEST_DEBUG std::cout<<"GET_IADATA: "<NumMagnet); } catch(ItestException &e) { std::ostringstream Desc; Desc<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<Inst<query(oss.str()); return atoi(Ptr); } catch(ItestException &e) { std::ostringstream Desc; Desc<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<Inst<query(oss.str()); return atof(Ptr); } catch(ItestException &e) { std::ostringstream Desc; Desc<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<Inst<query(oss.str()); return atoi(Ptr); } catch(ItestException &e) { std::ostringstream Desc; Desc<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<Inst<query(oss.str()); return Ptr; } catch(ItestException &e) { std::ostringstream Desc; Desc<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<Inst<write(oss.str()); } catch(ItestException &e) { std::ostringstream Desc; Desc<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<Inst<write(oss.str()); } catch(ItestException &e) { std::ostringstream Desc; Desc<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<Inst<write(oss.str()); } catch(ItestException &e) { std::ostringstream Desc; Desc<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<Inst<query(oss.str()); #ifdef __ITEST_DEBUG std::cout<<"GET_FDATA: "<nbrframe_sec=atoi(data.substr(start,end-start).c_str()); break; case ERRSEC: mydata->nbrferr_sec=atoi(data.substr(start,end-start).c_str()); break; case RMS: mydata->rms_ac_sett_sec=atof(data.substr(start,end-start).c_str()); break; case AVERAGES: mydata->average_sett_sec=atof(data.substr(start,end-start).c_str()); break; default : break; } start=i+1; i++;} mydata->nbrferr=atoi(data.substr(start,end-start).c_str()); } catch(ItestException &e) { std::ostringstream Desc; Desc<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<Inst<write(oss.str()); } catch(ItestException &e) { std::ostringstream Desc; Desc<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<Inst<<";:test:temp1?"; Ptr=Bilt->query(oss.str()); *ctn1=(int)(atof(Ptr)+0.5); oss.str(""); oss<<":i"<Inst<<";:test:temp2?"; Ptr=Bilt->query(oss.str()); *ctn2=(int)(atof(Ptr)+0.5); } catch(ItestException &e) { std::ostringstream Desc; Desc<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"<NumMagnet<<"/Pole "<<(this->Pole?(this->Pole==2?"Z":"Y"):"X")<<"(I"<Inst<<")"< #include namespace Bilt_ns { AcquisitionThread::AcquisitionThread (Bilt *_bilt_ps, omni_mutex &d_m, omni_mutex &bilt_m) : Tango::LogAdapter(_bilt_ps), omni_thread(), data_mutex(d_m), bilt_mutex(bilt_m) { bilt_ps = _bilt_ps; last_update.tv_sec = 0; last_update.tv_usec = 0; last_temp_update.tv_sec = 0; last_temp_update.tv_usec = 0; last_reconnect.tv_sec = 0; last_reconnect.tv_usec = 0; updatePeriod = bilt_ps->updatePeriod; // cout << "AcquisitionThread::AcquisitionThread(): go to start thread ...\n"; start_undetached(); } //+------------------------------------------------------------------ /** * method: run_undetached() * * description: * */ //+------------------------------------------------------------------ void *AcquisitionThread::run_undetached(void*) { bool exit; INFO_STREAM << " AcquisitionThread::run_undetached() entering endless loop!" << endl; while (1) { { // copy to local variables omni_mutex_lock l(data_mutex); exit = bilt_ps->exit_thread; bilt_connection_lost = bilt_ps->bilt_connection_lost; } /* exit the calculation thread */ if ( exit == true ) { break; } struct timeval now; gettimeofday (&now, NULL); double delay = (now.tv_sec * 1e6 + now.tv_usec) - (last_update.tv_sec * 1e6 + last_update.tv_usec); // only read new data every updatePeriod ms!! if ( delay < (updatePeriod * 1000) ) { // 20 ms struct timespec sleep_time = {0, SLEEP_NS}; nanosleep(&sleep_time, NULL); continue; } else { INFO_STREAM << "delay = " << delay/1000 << "ms" << endl; last_update = now; } // reset error variables mdata_errors.length(0); fdata_errors.length(0); // read_mdata() try { { // testing //mdata.state = -2; //mdata.idata[0].state = -2; //mdata.idata[1].state = -2; //mdata.idata[2].state = -2; //mdata.idata[0].meascurr = -2; //mdata.idata[1].meascurr = -2; //mdata.idata[2].meascurr = -2; omni_mutex_lock l(bilt_mutex); // check for a lost connection and try // to reconnect if necessary if ( bilt_connection_lost ) { bilt_reconnect(); } bilt_ps->BILT->get_mdata (&mdata); // testing //cout << "bilt name = " << bilt_ps->get_name() << endl; //cout << "mag num = " << mdata.magnet << endl; //cout << "mag state = " << mdata.state << endl; //cout << "pole 0 = " << mdata.idata[0].state << " : " << mdata.idata[0].meascurr << endl; //cout << "pole 1 = " << mdata.idata[1].state << " : " << mdata.idata[1].meascurr << endl; //cout << "pole 2 = " << mdata.idata[2].state << " : " << mdata.idata[2].meascurr << endl<< endl; } mdata_errors.length(0); } catch (itest::ItestException &e) { create_tango_error (e, mdata_errors, "Read failure" , "Cannot read the mdata structure", "AcquisitionThread::run_undetached"); } // read_fdata() try { for (int i=0; iBILT->pole(i).get_fdata (&fdata[i]); } fdata_errors.length(0); } catch (itest::ItestException &e) { create_tango_error (e, fdata_errors, "Read failure" , "Cannot read the fdata structure", "AcquisitionThread::run_undetached"); } { struct timeval now; gettimeofday (&now, NULL); // copy the read data omni_mutex_lock l(data_mutex); bilt_ps->mdata_errors = mdata_errors; bilt_ps->fdata_errors = fdata_errors; bilt_ps->mdata.magnet = mdata.magnet; bilt_ps->mdata.state = mdata.state; for (int i=0; imdata.idata[i].magnet = mdata.idata[i].magnet; bilt_ps->mdata.idata[i].pole = mdata.idata[i].pole; bilt_ps->mdata.idata[i].state = mdata.idata[i].state; bilt_ps->mdata.idata[i].fail = mdata.idata[i].fail; bilt_ps->mdata.idata[i].measvolt = mdata.idata[i].measvolt; bilt_ps->mdata.idata[i].meascurr = mdata.idata[i].meascurr; bilt_ps->fdata[i].nbrframe_sec = fdata[i].nbrframe_sec; bilt_ps->fdata[i].nbrferr_sec = fdata[i].nbrferr_sec; bilt_ps->fdata[i].rms_ac_sett_sec = fdata[i].rms_ac_sett_sec; bilt_ps->fdata[i].average_sett_sec = fdata[i].average_sett_sec; bilt_ps->fdata[i].nbrferr = fdata[i].nbrferr; } // store time when data was read bilt_ps->data_read_time = now; } // Read the temperature data // Only read every 30 seconds double temp_delay = (now.tv_sec * 1e6 + now.tv_usec) - (last_temp_update.tv_sec * 1e6 + last_temp_update.tv_usec); // only read new data every 30s!! if ( temp_delay > (30 * 1000000) ) { try { temperatures.clear(); for (int i=0; iBILT->pole(i).get_ctn (&temp1, &temp2); INFO_STREAM << "Pole["<temp_errors = temp_errors; for (int i=0; itemperatures[i] = temperatures[i]; } } last_temp_update = now; } } return NULL; } //+------------------------------------------------------------------ /** * method: AcquisitionThread::create_tango_error() * * description: convert an itest exception into a tango error * * * in : - &e : Reference to itest exception * - errors : Tango error list to use, to store exception info * - reason : Reason of the local Tango exception to be added to the stack * - desc : Description for the local Tango exception to be added to the stack * - origin : Origin if the local Tango exception to be added to the stack */ //+------------------------------------------------------------------ void AcquisitionThread::create_tango_error (itest::ItestException &e, Tango::DevErrorList &errors, string reason, string desc, string origin) { DEBUG_STREAM << "Bilt::create_tango_exception(): entering... !" << endl; errors.length(e.errors.size() + 1); int i; for(i=0; iget_name() << " : " << (long)delay<< endl; // Try to create a new connection try { new_handle = new itest::TMagnet (bilt_ps->iPAddress.c_str(), bilt_ps->magnetNumber); } catch (itest::ItestException &e) { DEBUG_STREAM << "Reconnection failed with error: " << endl; for(int i=0; i #include #include #include #include namespace Bilt_ns { //+---------------------------------------------------------------------------- // // method : Bilt::Bilt(string &s) // // description : constructor for simulated Bilt // // in : - cl : Pointer to the DeviceClass object // - s : Device name // //----------------------------------------------------------------------------- Bilt::Bilt(Tango::DeviceClass *cl,string &s) :Tango::Device_4Impl(cl,s.c_str()) { init_device(); } Bilt::Bilt(Tango::DeviceClass *cl,const char *s) :Tango::Device_4Impl(cl,s) { init_device(); } Bilt::Bilt(Tango::DeviceClass *cl,const char *s,const char *d) :Tango::Device_4Impl(cl,s,d) { init_device(); } //+---------------------------------------------------------------------------- // // method : Bilt::delete_device() // // description : will be called at device destruction or at init command. // //----------------------------------------------------------------------------- void Bilt::delete_device() { // Delete device allocated objects if ( acquisition_thread != NULL ) { data_mutex.lock(); exit_thread = true; data_mutex.unlock(); // join now the thread until it exits int *rv; acquisition_thread->join((void **)&rv); cout << "Bilt::delete_device(): Exit acquisition thread !!!" << endl; } // Delete connection to the power supply delete BILT; BILT = NULL; } //+---------------------------------------------------------------------------- // // method : Bilt::init_device() // // description : will be called at device initialization. // //----------------------------------------------------------------------------- void Bilt::init_device() { INFO_STREAM << "Bilt::Bilt() create device " << device_name << endl; // Initialise variables to default values //-------------------------------------------- get_device_property(); set_state (Tango::OFF); // set the power supply location string // Bilt device naming = room-rack-nu.ch. string dev_name = get_name(); int pos = dev_name.rfind ('/'); string room = dev_name.substr (pos+1, string::npos); pos = room.find ('-'); string rack = room.substr (pos+1, string::npos); room = room.substr (0, pos); pos = rack.find ('-'); string number = rack.substr (pos+1, string::npos); rack = rack.substr (0, pos); string channels; if ( number.find ('a') != string::npos ) { channels = "1,2,3"; } else { channels = "4,5,6"; } number = number.substr (0, 1); ps_location = "Room: " + room + " Cubicle: " + rack + " Crate pos.: " + number + " Ch.: " + channels; DEBUG_STREAM << "Power supply location : " << ps_location << endl; // Create the access to the power supply try { BILT = new itest::TMagnet (iPAddress.c_str(), magnetNumber); } catch (itest::ItestException &e) { try { create_tango_exception (e, mdata_errors, "Init failure" , "Cannot initialise ITEST libray objects", "Bilt::init_device"); } catch (Tango::DevFailed &e) { set_state (Tango::UNKNOWN); } } // initialise with the actual current set point values try { for (int i=0; ipole(i).get_current_DC(); } Tango::MultiAttribute *attr_list = get_device_attr(); Tango::WAttribute &attr_curr = attr_list->get_w_attr_by_name ("Currents"); attr_curr.set_write_value(¤ts_dc[0], currents_dc.size()); } catch (itest::ItestException &e) { try { create_tango_exception (e, mdata_errors, "Init failure" , "Cannot read the actual current set point values", "Bilt::init_device"); } catch (Tango::DevFailed &e) { set_state (Tango::UNKNOWN); } } // initialise and start the acquisition thread exit_thread = false; acquisition_thread = new AcquisitionThread(this, data_mutex, bilt_mutex); } //+---------------------------------------------------------------------------- // // method : Bilt::get_device_property() // // description : Read the device properties from database. // //----------------------------------------------------------------------------- void Bilt::get_device_property() { // Initialize your default values here (if not done with POGO). //------------------------------------------------------------------ BILT = NULL; bilt_connection_lost = false; acquisition_thread = NULL; struct timeval now; gettimeofday (&now, NULL); data_set_time = now; data_read_time = now; // intitialise mdada structure for magnet read values mdata.magnet = -1; mdata.state = -1; for (int i=0; i_UseDb==true) get_db_device()->get_property(dev_prop); Tango::DbDatum def_prop, cl_prop; BiltClass *ds_class = (static_cast(get_device_class())); int i = -1; // Try to initialize IPAddress from class property cl_prop = ds_class->get_class_property(dev_prop[++i].name); if (cl_prop.is_empty()==false) cl_prop >> iPAddress; else { // Try to initialize IPAddress from default device value def_prop = ds_class->get_default_device_property(dev_prop[i].name); if (def_prop.is_empty()==false) def_prop >> iPAddress; } // And try to extract IPAddress value from database if (dev_prop[i].is_empty()==false) dev_prop[i] >> iPAddress; // Try to initialize MagnetNumber from class property cl_prop = ds_class->get_class_property(dev_prop[++i].name); if (cl_prop.is_empty()==false) cl_prop >> magnetNumber; else { // Try to initialize MagnetNumber from default device value def_prop = ds_class->get_default_device_property(dev_prop[i].name); if (def_prop.is_empty()==false) def_prop >> magnetNumber; } // And try to extract MagnetNumber value from database if (dev_prop[i].is_empty()==false) dev_prop[i] >> magnetNumber; // Try to initialize UpdatePeriod from class property cl_prop = ds_class->get_class_property(dev_prop[++i].name); if (cl_prop.is_empty()==false) cl_prop >> updatePeriod; else { // Try to initialize UpdatePeriod from default device value def_prop = ds_class->get_default_device_property(dev_prop[i].name); if (def_prop.is_empty()==false) def_prop >> updatePeriod; } // And try to extract UpdatePeriod value from database if (dev_prop[i].is_empty()==false) dev_prop[i] >> updatePeriod; // End of Automatic code generation //------------------------------------------------------------------ } //+---------------------------------------------------------------------------- // // method : Bilt::always_executed_hook() // // description : method always executed before any command is executed // //----------------------------------------------------------------------------- void Bilt::always_executed_hook() { } //+---------------------------------------------------------------------------- // // method : Bilt::read_attr_hardware // // description : Hardware acquisition for attributes. // //----------------------------------------------------------------------------- void Bilt::read_attr_hardware(vector &attr_list) { DEBUG_STREAM << "Bilt::read_attr_hardware(vector &attr_list) entering... "<< endl; // Add your own code here } //+---------------------------------------------------------------------------- // // method : Bilt::read_Location // // description : Extract real attribute values for Location acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_Location(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_Location(Tango::Attribute &attr) entering... "<< endl; location = const_cast (ps_location.c_str()); attr.set_value (&location); } //+---------------------------------------------------------------------------- // // method : Bilt::read_Temperatures // // description : Extract real attribute values for Temperatures acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_Temperatures(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_Temperatures(Tango::Attribute &attr) entering... "<< endl; omni_mutex_lock l(data_mutex); if ( temp_errors.length() != 0 ) { attr.set_quality(Tango::ATTR_INVALID); } else { attr.set_value (&(temperatures[0]), 2*POLES); } } //+---------------------------------------------------------------------------- // // method : Bilt::read_FramesPerSecond // // description : Extract real attribute values for FramesPerSecond acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_FramesPerSecond(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_FramesPerSecond(Tango::Attribute &attr) entering... "<< endl; omni_mutex_lock l(data_mutex); if ( fdata_errors.length() != 0 ) attr.set_quality(Tango::ATTR_INVALID); else { for (int i=0; ipole(i).get_switch(); } if ( switch_state == 1 ) local_control[i] = false; else local_control[i] = true; } } catch (itest::ItestException &e) { create_tango_exception (e, "Read failure" , "Cannot read the actual switch states", "Bilt::read_LocalControls"); } attr.set_value (&(local_control[0]), POLES); } //+---------------------------------------------------------------------------- // // method : Bilt::read_SetCurrentsRMS // // description : Extract real attribute values for SetCurrentsRMS acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_SetCurrentsRMS(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_SetCurrentsRMS(Tango::Attribute &attr) entering... "<< endl; omni_mutex_lock l(data_mutex); if ( fdata_errors.length() != 0 ) attr.set_quality(Tango::ATTR_INVALID); else { for (int i=0; i CURRENT_LIMIT ) { if ( isnan(impedances[i]) ) { impedances[i] = fabs (mdata.idata[i].measvolt / mdata.idata[i].meascurr); //cout << "nan " << i << " : " << impedances[i] << endl; } else { // Averaging to avoid impedance alarms when changing the // current settings. /* An = p * Yn + (1 - p)An-1 */ /* with 0 < p < 1 */ /* p = 1 / nu_average */ double p = 1.0 / 3; // Averaging over three values impedances[i] = p * (fabs (mdata.idata[i].measvolt / mdata.idata[i].meascurr)) + (1 - p) * impedances[i]; //cout << "average " << i << " : " << impedances[i] << endl; } } else { //cout << "limit" << i << " : " << mdata.idata[i].meascurr << endl; impedances[i] = nan("NaN"); } } } attr.set_value (&(impedances[0]), POLES); } //+---------------------------------------------------------------------------- // // method : Bilt::write_Currents // // description : Write Currents attribute values to hardware. // //----------------------------------------------------------------------------- void Bilt::write_Currents(Tango::WAttribute &attr) { DEBUG_STREAM << "Bilt::write_Currents(Tango::WAttribute &attr) entering... "<< endl; const double *set_currents; // check the correct number of setpoints if ( attr.get_write_value_length() == POLES ) attr.get_write_value(set_currents); else { TangoSys_MemStream tms; tms << "Wrong number of setpoints!" << endl; Tango::Except::throw_exception("WriteError", tms.str(), "Bilt::write_Currents"); } // apply setpoints to the poles try { omni_mutex_lock l(bilt_mutex); for (int i=0; ipole(i).set_current_DC (set_currents[i]); } // initialise the set time, to be sure that the next // returned read value is newer and contains the changes. struct timeval now; gettimeofday (&now, NULL); data_set_time = now; } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot write DC current values", "Bilt::write_Currents"); } } //+---------------------------------------------------------------------------- // // method : Bilt::read_Currents // // description : Extract real attribute values for Currents acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_Currents(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_Currents(Tango::Attribute &attr) entering... "<< endl; omni_mutex_lock l(data_mutex); if ( mdata_errors.length() != 0 ) attr.set_quality(Tango::ATTR_INVALID); else { for (int i=0; iset_state(1); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot switch on pole", "Bilt::on"); } } //+------------------------------------------------------------------ /** * method: Bilt::off * * description: method to execute "Off" * Turns of power supply * * */ //+------------------------------------------------------------------ void Bilt::off() { DEBUG_STREAM << "Bilt::off(): entering... !" << endl; // Add your own code to control device here try { omni_mutex_lock l(bilt_mutex); BILT->set_state(0); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot switch off pole", "Bilt::off"); } } //+------------------------------------------------------------------ /** * method: Bilt::reset * * description: method to execute "Reset" * Reset faults and alarms * * */ //+------------------------------------------------------------------ void Bilt::reset() { DEBUG_STREAM << "Bilt::reset(): entering... !" << endl; // Add your own code to control device here try { omni_mutex_lock l(bilt_mutex); BILT->clear_all_err(); BILT->clear_alarm(); for (int i=0; ipole(i).clear_ferrors(); } } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot reset pole", "Bilt::reset"); } } //+------------------------------------------------------------------ /** * method: Bilt::set_pole_ac_current * * description: method to execute "SetPoleAcCurrent" * Set the AC current for one Pole. * [0] = pole number, [1] = current * * @param argin [0] = pole number, [1] = current * */ //+------------------------------------------------------------------ void Bilt::set_pole_ac_current(const Tango::DevVarDoubleArray *argin) { DEBUG_STREAM << "Bilt::set_pole_ac_current(): entering... !" << endl; // Add your own code to control device here // argin[0] = pole number if ( (*argin)[0] < 0 || (*argin)[0] >= POLES ) { TangoSys_MemStream tms; tms << "The entered Pole number is out of range" << endl; Tango::Except::throw_exception("WriteError", tms.str(), "Bilt::set_pole_ac_current"); } try { omni_mutex_lock l(bilt_mutex); BILT->pole((int)(*argin)[0]).set_current_AC ((*argin)[1]); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot write AC current value", "Bilt::set_pole_ac_current"); } } //+------------------------------------------------------------------ /** * method: Bilt::local_pole_control * * description: method to execute "LocalPoleControl" * Set the AC current for one Pole. * [0] = pole number, [1] = local control true/false * * @param argin [0] = pole number, [1] = local control true/false * */ //+------------------------------------------------------------------ void Bilt::local_pole_control(const Tango::DevVarShortArray *argin) { DEBUG_STREAM << "Bilt::local_pole_control(): entering... !" << endl; // Add your own code to control device here // argin[0] = pole number if ( (*argin)[0] < 0 || (*argin)[0] >= POLES ) { TangoSys_MemStream tms; tms << "The entered Pole number is out of range" << endl; Tango::Except::throw_exception("WriteError", tms.str(), "Bilt::local_pole_control"); } // argin[1] = true or false (1 or 0 ) if ( (*argin)[1] != 0 && (*argin)[1] != 1 ) { TangoSys_MemStream tms; tms << "Local control can only be choosen as 0 or 1 (false or true)" << endl; Tango::Except::throw_exception("WriteError", tms.str(), "Bilt::local_pole_control"); } try { int switch_state; if ( (*argin)[1] == true ) switch_state = 0; else switch_state = 1; omni_mutex_lock l(bilt_mutex); BILT->pole((*argin)[0]).set_switch (switch_state); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot write switch state", "Bilt::local_pole_control"); } } //+------------------------------------------------------------------ /** * method: Bilt::set_pole_current * * description: method to execute "SetPoleCurrent" * Set the current for one Pole. * [0] = pole number, [1] = current * * @param argin [0] = pole number, [1] = current * */ //+------------------------------------------------------------------ void Bilt::set_pole_current(const Tango::DevVarDoubleArray *argin) { DEBUG_STREAM << "Bilt::set_pole_current(): entering... !" << endl; // Add your own code to control device here // argin[0] = pole number if ( (*argin)[0] < 0 || (*argin)[0] >= POLES ) { TangoSys_MemStream tms; tms << "The entered Pole number is out of range" << endl; Tango::Except::throw_exception("WriteError", tms.str(), "Bilt::set_pole_current"); } try { omni_mutex_lock l(bilt_mutex); BILT->pole((int)(*argin)[0]).set_current_DC ((*argin)[1]); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot write current value", "Bilt::set_pole_current"); } // make sure that the current set values are correct! try { omni_mutex_lock l(bilt_mutex); for (int i=0; ipole(i).get_current_DC(); } Tango::MultiAttribute *attr_list = get_device_attr(); Tango::WAttribute &attr_curr = attr_list->get_w_attr_by_name ("Currents"); attr_curr.set_write_value(¤ts_dc[0], currents_dc.size()); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot read the actual current set point values", "Bilt::set_pole_current"); } // initialise the set time, to be sure that the next // returned read value is newer and contains the changes. struct timeval now; gettimeofday (&now, NULL); data_set_time = now; } //+------------------------------------------------------------------ /** * method: Bilt::create_tango_exception() * * description: convert an itest exception into a tango exception * * * in : - &e : Reference to itest exception * - reason : Reason of the local Tango exception to be added to the stack * - desc : Description for the local Tango exception to be added to the stack * - origin : Origin if the local Tango exception to be added to the stack */ //+------------------------------------------------------------------ void Bilt::create_tango_exception (itest::ItestException &e, string reason, string desc, string origin) { Tango::DevErrorList errors; create_tango_exception (e, errors, reason, desc, origin); } //+------------------------------------------------------------------ /** * method: Bilt::create_tango_exception() * * description: convert an itest exception into a tango exception * * * in : - &e : Reference to itest exception * - errors : Tango error list to use, to store exception info * - reason : Reason of the local Tango exception to be added to the stack * - desc : Description for the local Tango exception to be added to the stack * - origin : Origin if the local Tango exception to be added to the stack */ //+------------------------------------------------------------------ void Bilt::create_tango_exception (itest::ItestException &e, Tango::DevErrorList &errors, string reason, string desc, string origin) { DEBUG_STREAM << "Bilt::create_tango_exception(): entering... !" << endl; errors.length(e.errors.size() + 1); int i; for(i=0; idevice_status data member) and returns it to the caller. * * @return Status description * */ //+------------------------------------------------------------------ Tango::ConstDevString Bilt::dev_status() { //Tango::ConstDevString argout = DeviceImpl::dev_status(); DEBUG_STREAM << "Bilt::dev_status(): entering... !" << endl; // Add your own code to control device here stringstream status; status << "PS Location : " << ps_location << endl; Tango::DevState state = dev_state(); switch (state) { case Tango::ON: status << "State : ON" << endl; break; case Tango::OFF: status << "State : OFF" << endl; break; case Tango::ALARM: { status << "State : Alarm" << endl; omni_mutex_lock l(data_mutex); for (int i=0; i 10W in 10ms!" << endl; else { if ( mdata.idata[i].fail == "TEMP" ) status << "Fault descr. : Max. temp on semiconductor reached!" << endl; else { if ( mdata.idata[i].fail == "PWSO" ) status << "Fault descr. : Delivered power > 40W in 100ms!" << endl; else { status << "Fault descr. : Unkown fault code!" << endl; } } } } } } } break; } default: { { omni_mutex_lock l(data_mutex); status << "State : Unknown" << endl; if ( bilt_connection_lost == true ) { status << "Connection lost to BILT power supply, trying to reconnect!" << endl; status << endl; } if ( mdata_errors.length() > 0 ) status << "Error stack : " << endl; for(int i=0; idevice_state data member) and returns it to the caller. * * @return State Code * */ //+------------------------------------------------------------------ Tango::DevState Bilt::dev_state() { Tango::DevState argout; try { argout = DeviceImpl::dev_state(); } catch (Tango::DevFailed &e) { // just ignore reading exceptions! } DEBUG_STREAM << "Bilt::dev_state(): entering... !" << endl; // Add your own code to control device here int state; int errors; try { omni_mutex_lock l(data_mutex); state = mdata.state; INFO_STREAM << "magnet state for " << get_name() << " = " << state << endl; errors = mdata_errors.length(); INFO_STREAM << "mdata errors = " << mdata_errors.length() << endl; } catch (Tango::DevFailed &e) { // do nothing! // Just avoid exceptions when executing state or status! } if ( errors != 0 ) set_state (Tango::UNKNOWN); else { // set the device state switch (state) { case -1: set_state (Tango::UNKNOWN); //bilt_connection_lost = true; break; case 0: set_state (Tango::OFF); break; case 1: set_state (Tango::ON); break; case 2: set_state (Tango::ALARM); break; case 3: set_state (Tango::FAULT); break; default: set_state (Tango::UNKNOWN); break; } } // Check for attribute alarms if ( get_state() == Tango::ON && argout == Tango::ALARM ) set_state (Tango::ALARM); return get_state(); } //+------------------------------------------------------------------ /** * method: Bilt::setpoint_check * * description: method to execute "SetpointCheck" * Check the given current values against the specified limits. * * @param argin Setpoint values for the Poles * @return true when settings are OK * */ //+------------------------------------------------------------------ Tango::DevBoolean Bilt::setpoint_check(const Tango::DevVarDoubleArray *argin) { Tango::DevBoolean argout ; DEBUG_STREAM << "Bilt::setpoint_check(): entering... !" << endl; // Add your own code to control device here // get the min and max values for the current settings Tango::MultiAttribute *attr_list = get_device_attr(); Tango::WAttribute &attr_curr = attr_list->get_w_attr_by_name ("Currents"); double min, max; attr_curr.get_min_value(min); attr_curr.get_max_value(max); INFO_STREAM << "min = " << min << " max = " << max << endl; // check the input values argout = true; for ( int i=0; ilength(); i++ ) { INFO_STREAM << "i = " << i << " curr = " << (*argin)[i] << endl; if ( (*argin)[i] < min || (*argin)[i] > max ) { argout = false; break; } } return argout; } } // namespace Revision-number: 82 Prop-content-length: 126 Content-length: 126 K 8 svn:date V 27 2011-08-04T14:42:06.000000Z K 7 svn:log V 52 Standard project directories initialized by cvs2svn. PROPS-END Node-path: powersupply/itest/MchBilt Node-kind: dir Node-action: add Node-path: powersupply/itest/MchBilt/trunk Node-kind: dir Node-action: add Node-path: powersupply/itest/MchBilt/branches Node-kind: dir Node-action: add Node-path: powersupply/itest/MchBilt/tags Node-kind: dir Node-action: add Revision-number: 83 Prop-content-length: 121 Content-length: 121 K 10 svn:author V 5 meyer K 8 svn:date V 27 2011-08-04T14:42:06.000000Z K 7 svn:log V 21 Imported using TkCVS PROPS-END Node-path: powersupply/itest/MchBilt/trunk/AcquisitionThread.cpp Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 6502 Text-content-md5: 0fa88a4b64d7392e561fd994b5eca637 Content-length: 6512 PROPS-END #include #include namespace MchBilt_ns { AcquisitionThread::AcquisitionThread (MchBilt *_mch_bilt, omni_mutex &d_m, omni_mutex &g_m) : Tango::LogAdapter(_mch_bilt), omni_thread(), data_mutex(d_m), group_mutex(g_m) { mch_bilt = _mch_bilt; last_update.tv_sec = 0; last_update.tv_usec = 0; updatePeriod = mch_bilt->updatePeriod; nu_attributes = mch_bilt->attributes.size(); nu_channels = mch_bilt->mchBiltChannels; // cout << "AcquisitionThread::AcquisitionThread(): go to start thread ...\n"; start_undetached(); } //+------------------------------------------------------------------ /** * method: run_undetached() * * description: * */ //+------------------------------------------------------------------ void *AcquisitionThread::run_undetached(void*) { bool exit; INFO_STREAM << " AcquisitionThread::run_undetached() entering endless loop!" << endl; while (1) { { // copy to local variables omni_mutex_lock l(data_mutex); exit = mch_bilt->exit_thread; } /* exit the calculation thread */ if ( exit == true ) { break; } struct timeval now; gettimeofday (&now, NULL); double delay = (now.tv_sec * 1e6 + now.tv_usec) - (last_update.tv_sec * 1e6 + last_update.tv_usec); // only read new data every updatePeriod ms!! if ( delay < (updatePeriod * 1000) ) { // 50 ms struct timespec sleep_time = {0, 50000000}; nanosleep(&sleep_time, NULL); continue; } else { INFO_STREAM << "delay = " << delay/1000 << "ms" << endl; last_update = now; } try { // prepare data with default values Tango::GroupAttrReplyList bilt_data; current.clear(); current_set.clear(); voltage.clear(); current_average.clear(); current_rms.clear(); states.clear(); dev_error_list.clear(); current.assign(3*nu_channels, nan("NaN")); current_set.assign(3*nu_channels, nan("NaN")); voltage.assign(3*nu_channels, nan("NaN")); current_average.assign(3*nu_channels, nan("NaN")); current_rms.assign(3*nu_channels, nan("NaN")); states.assign(nu_channels, Tango::DISABLE); { struct timeval st_group; gettimeofday (&st_group, NULL); // group reading of all bilts omni_mutex_lock l(group_mutex); Tango::GroupReply::enable_exception(true); bilt_data = mch_bilt->bilts->read_attributes (mch_bilt->attributes, true); struct timeval sp_group; gettimeofday (&sp_group, NULL); double g_time = (sp_group.tv_sec * 1e6 + sp_group.tv_usec) - (st_group.tv_sec * 1e6 + st_group.tv_usec); INFO_STREAM << "Time in group call = " << g_time/1000 << "ms" << endl; } // check for errors if ( bilt_data.has_failed() ) { for (long i=0; i> states[index]; // get the current read and setpoints Tango::DeviceAttribute res; res = bilt_data[i + 1].get_data(); vector values; res >> values; current[3*index] = values[0]; current[3*index + 1] = values[1]; current[3*index + 2] = values[2]; current_set[3*index] = values[3]; current_set[3*index + 1] = values[4]; current_set[3*index + 2] = values[5]; vector ch_voltage; bilt_data[i+2] >> ch_voltage; voltage[3*index] = ch_voltage[0]; voltage[3*index + 1] = ch_voltage[1]; voltage[3*index + 2] = ch_voltage[2]; vector ch_current_average; bilt_data[i+2] >> ch_current_average; current_average[3*index] = ch_current_average[0]; current_average[3*index + 1] = ch_current_average[1]; current_average[3*index + 2] = ch_current_average[2]; vector ch_current_rms; bilt_data[i+2] >> ch_current_rms; current_rms[3*index] = ch_current_rms[0]; current_rms[3*index + 1] = ch_current_rms[1]; current_rms[3*index + 2] = ch_current_rms[2]; } catch (const Tango::DevFailed &e) { // set data values states[index] = Tango::UNKNOWN; for (long ch=0; ch<3; ch++ ) { current[3*index + ch] = nan("NaN"); voltage[3*index + ch] = nan("NaN"); current_average[3*index + ch] = nan("NaN"); current_rms[3*index + ch] = nan("NaN"); } DeviceError dev_error; dev_error.dev_name = bilt_data[i].dev_name(); dev_error.err_list = e.errors; dev_error_list.push_back (dev_error); } } // copy data after acquisition { omni_mutex_lock l(data_mutex); mch_bilt->acquisition_state = Tango::ON; mch_bilt->states = states; mch_bilt->current = current; mch_bilt->current_set = current_set; mch_bilt->voltage = voltage; mch_bilt->current_average = current_average; mch_bilt->current_rms = current_rms; mch_bilt->dev_error_list.clear(); for (long i=0; idev_error_list.push_back (dev_error_list[i]); } // store time when data was read struct timeval now; gettimeofday (&now, NULL); mch_bilt->data_read_time = now; } bilt_data.reset(); } catch (const Tango::DevFailed &e) { omni_mutex_lock l(data_mutex); mch_bilt->acquisition_state = Tango::UNKNOWN; mch_bilt->acquisition_error = e.errors; ERROR_STREAM << "Problem in aquisition loop : " << endl; const Tango::DevErrorList& el = e.errors; for (int err = 0; err < el.length(); err++) { ERROR_STREAM << el[err].desc.in() << endl; } } } return NULL; } } // namespace Node-path: powersupply/itest/MchBilt/trunk/AcquisitionThread.h Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 861 Text-content-md5: f6de5e3f987f8c8ed01c164f4301896b Content-length: 871 PROPS-END #ifndef ACQUISITIONTHREAD_H_ #define ACQUISITIONTHREAD_H_ #include #include #include namespace MchBilt_ns { class AcquisitionThread : public omni_thread, public Tango::LogAdapter { public : AcquisitionThread (MchBilt *_mch_bilt, omni_mutex &d_m, omni_mutex &g_m); private : MchBilt *mch_bilt; omni_mutex &data_mutex; omni_mutex &group_mutex; void *run_undetached(void*); Tango::DevLong updatePeriod; struct timeval last_update; long nu_attributes; long nu_channels; vector current; vector current_set; vector voltage; vector current_average; vector current_rms; vector states; vector dev_error_list; }; } #endif /*ACQUISITIONTHREAD_H_*/ Node-path: powersupply/itest/MchBilt/trunk/ClassFactory.cpp Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 1507 Text-content-md5: d967da7e1633545db17ded15a5f31be9 Content-length: 1517 PROPS-END /*----- PROTECTED REGION ID(MchBilt::ClassFactory.cpp) ENABLED START -----*/ static const char *RcsId = "$Id: ClassFactory.cpp,v 1.1.1.1 2011-08-04 14:42:06 meyer Exp $"; //============================================================================= // // file : ClassFactory.cpp // // description : C++ source for the class_factory method of the DServer // device class. This method is responsible for the creation of // all class singleton for a device server. It is called // at device server startup. // // project : Multi channel Bilt class for the ESRF storage ring. // // $Author: meyer $ // // $Revision: 1.1.1.1 $ // $Date: 2011-08-04 14:42:06 $ // // SVN only: // $HeadURL: $ // // CVS only: // $Source: /segfs/tango/cvsroot/cppserver/machine/powersupply/SrSteerers/tango/MchBilt/ClassFactory.cpp,v $ // $Log: not supported by cvs2svn $ // //============================================================================= // This file is generated by POGO // (Program Obviously used to Generate tango Object) //============================================================================= #include #include // Add class header files if needed /** * Create MchBilt Class singleton and store it in DServer object. */ void Tango::DServer::class_factory() { // Add method class init if needed add_class(MchBilt_ns::MchBiltClass::init("MchBilt")); } /*----- PROTECTED REGION END -----*/ Node-path: powersupply/itest/MchBilt/trunk/Makefile Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 5178 Text-content-md5: 23f940eaaf6cb03a60686e4fd5daace9 Content-length: 5188 PROPS-END #PROTECTED REGION ID(MchBiltMakefile) ENABLED START# #============================================================================= # # file : Makefile # # description : Include for the MchBilt class. # # project : Makefile to generate a Tango server # # $Author: meyer $ # # $Revision: 1.1.1.1 $ # # $Log: not supported by cvs2svn $ # # copyleft : European Synchrotron Radiation Facility # BP 220, Grenoble 38043 # FRANCE # #============================================================================= # This file is generated by POGO # (Program Obviously used to Generate tango Object) # # (c) - Software Engineering Group - ESRF #============================================================================= # CLASS = MchBilt MAJOR_VERS = 1 MINOR_VERS = 1 RELEASE = Release_$(MAJOR_VERS)_$(MINOR_VERS) OS = $(shell /csadmin/common/scripts/get_os) PROCESSOR = $(shell uname -p) #----------------------------------------- # Set default home directories #----------------------------------------- TANGO_HOME = /segfs/tango/release/$(BIN_DIR) CPP_SERVERS = $(TANGO_HOME)/classes ifdef no_debug DEBUG = -O else DEBUG = -g endif ifdef _solaris CC = CC BIN_DIR=$(OS)_CC AR_SL = $(CC) -mt -G VERS_OPT = -h SL_EXT = so endif ifdef linux CC = c++ CC_SHLIB = $(CC) -fPIC $(PROCESSOR)=1 ifdef x86_64 NBITS=_64 endif BIN_DIR=$(OS)$(NBITS) AR_SL = $(CC) -fPIC -shared SL_EXT = so VERS_OPT = -Wl,-soname, endif INCLUDE_DIRS = -I$(TANGO_HOME)/include\ -I. \ -I$(CPP_SERVERS)/include OBJS_DIR = obj/$(BIN_DIR) LIB_DIRS = -L $(CPP_SERVERS)/lib \ -L $(TANGO_HOME)/lib TARGET_LIB = $(CPP_SERVERS)/lib/libtgclasses.a #----------------------------------------- # Set CXXFLAGS and LFLAGS #----------------------------------------- ifdef _solaris CXXFLAGS = $(DEBUG) -mt -D_PTHREADS $(INCLUDE_DIRS) LFLAGS = $(DEBUG) $(LIB_DIRS) \ -ltango \ -llog4tango \ -lomniORB4 \ -lomniDynamic4 \ -lomnithread \ -lCOS4 \ -lpthread \ -lposix4 -lsocket -lnsl \ -ltgclasses endif ifdef linux CXXFLAGS = $(DEBUG) -D_REENTRANT $(INCLUDE_DIRS) LFLAGS = $(DEBUG) $(LIB_DIRS) \ -ltango \ -llog4tango \ -lomniORB4 \ -lomniDynamic4 \ -lomnithread \ -lCOS4 \ -ldl -lpthread \ -ltgclasses endif #----------------------------------------- # Set dependences #----------------------------------------- SVC_OBJS = $(OBJS_DIR)/$(CLASS).o \ $(OBJS_DIR)/$(CLASS)StateMachine.o \ $(OBJS_DIR)/$(CLASS)Class.o \ $(OBJS_DIR)/AcquisitionThread.o \ $(OBJS_DIR)/ClassFactory.o \ $(OBJS_DIR)/main.o SHLIB_OBJS = $(OBJS_DIR)/$(CLASS)Class.so.o \ $(OBJS_DIR)/$(CLASS)StateMachine.so.o \ $(OBJS_DIR)/$(CLASS).so.o \ $(OBJS_DIR)/AcquisitionThread.o SVC_INC = $(CLASS)Class.h \ $(CLASS).h \ AcquisitionThread.h $(OBJS_DIR)/%.o: %.cpp $(SVC_INC) $(CC) $(CXXFLAGS) -c $< -o $(OBJS_DIR)/$*.o $(OBJS_DIR)/%.so.o: %.cpp $(SVC_INC) $(CC_SHLIB) $(CXXFLAGS) -c $< -o $(OBJS_DIR)/$*.so.o #----------------------------------------- # Make Entry #----------------------------------------- all: $(CLASS) $(CLASS): make_obj_dir make_bin_dir $(SVC_OBJS) $(CC) $(SVC_OBJS) -o $(CLASS) $(LFLAGS) @mv $(CLASS) bin/$(BIN_DIR)/$(CLASS) shlib: make_obj_dir make_shlib_dir $(SHLIB_OBJS) $(AR_SL) -o \ shlib/$(BIN_DIR)/$(CLASS).$(SL_EXT).$(MAJOR_VERS).$(MINOR_VERS) \ $(VERS_OPT)$(CLASS).$(SL_EXT).$(MAJOR_VERS) \ $(SHLIB_OBJS) $(LFLAGS) @rm -f shlib/$(BIN_DIR)/$(CLASS).$(SL_EXT) @cd shlib/$(BIN_DIR); \ ln -s $(CLASS).$(SL_EXT).$(MAJOR_VERS).$(MINOR_VERS) $(CLASS).$(SL_EXT) clean: rm -f $(OBJS_DIR)/*.o \ $(OBJS_DIR)/*.so.o \ bin/$(BIN_DIR)/$(CLASS) \ core make_obj_dir: @mkdir -p obj @mkdir -p obj/$(BIN_DIR) make_bin_dir: @mkdir -p bin @mkdir -p bin/$(BIN_DIR) make_shlib_dir: @mkdir -p shlib @mkdir -p shlib/$(BIN_DIR) #----------------------------------------- # Install binary file #----------------------------------------- install: cp bin/$(BIN_DIR)/$(CLASS) $(TANGO_HOME)/$(BIN_DIR)/bin #----------------------------------------- # Update class library and header files # recompile without debug mode. #----------------------------------------- lib: clean @make no_debug=1 cp *.h $(CPP_SERVERS)/include ar ruv $(TARGET_LIB) $(OBJS_DIR)/$(CLASS).o ar ruv $(TARGET_LIB) $(OBJS_DIR)/$(CLASS)Class.o ar ruv $(TARGET_LIB) $(OBJS_DIR)/$(CLASS)StateMachine.o ident $(TARGET_LIB) | grep $(CLASS) #------------------------------------------------------ # Tag the CVS/SVN module corresponding to this class # copy cvs_tag or svn_tag to tag: entry #------------------------------------------------------ #svn_tag: # svn copy ../trunk ../tags/$(RELEASE) # svn commit ../tags/$(RELEASE) \ # -m "Tagging the $(RELEASE) of the $(CLASS) project." # #cvs_tag: # @cvstag "$(CLASS)-$(RELEASE)" # @make $(CLASS) # @make show_tag #show_cvs_tag: # @cvstag -d # # Only these make options work with the current Pogo version 5.3.x! tag: @cvstag "$(CLASS)-$(RELEASE)" @make $(CLASS) @make show_tag show_tag: @cvstag -d #PROTECTED REGION END# Node-path: powersupply/itest/MchBilt/trunk/MchBilt.cpp Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 33940 Text-content-md5: c64290aa2cd8b3c8f47eeefbfa86d6b1 Content-length: 33950 PROPS-END /*----- PROTECTED REGION ID(MchBilt.cpp) ENABLED START -----*/ static const char *RcsId = "$Id: MchBilt.cpp,v 1.1.1.1 2011-08-04 14:42:06 meyer Exp $"; //============================================================================= // // file : MchBilt.cpp // // description : C++ source for the MchBilt and its commands. // The class is derived from Device. It represents the // CORBA servant object which will be accessed from the // network. All commands which can be executed on the // MchBilt are implemented in this file. // // project : Multi channel Bilt class for the ESRF storage ring. // // $Author: meyer $ // // $Revision: 1.1.1.1 $ // $Date: 2011-08-04 14:42:06 $ // // SVN only: // $HeadURL: $ // // CVS only: // $Source: /segfs/tango/cvsroot/cppserver/machine/powersupply/SrSteerers/tango/MchBilt/MchBilt.cpp,v $ // $Log: not supported by cvs2svn $ // //============================================================================= // This file is generated by POGO // (Program Obviously used to Generate tango Object) //============================================================================= #include #include #include #include #include /*----- PROTECTED REGION END -----*/ /** * MchBilt class description: * The multi channel Bilt device regroups all Bilt powersupply device used for * the ESRF storage ring steerers * Reading and setting of currents and voltages is done by spectrum attributes, which * contain the values of the individual Bilt devices. */ //================================================================ // // The following table gives the correspondence // between command and method names. // // Command name | Method name //---------------------------------------------------------------- // State | dev_state // Status | dev_status // On | on // Off | off // Reset | reset // SetpointCheck | setpoint_check //================================================================ // Attributes managed are: // Current: // Voltage: // SetCurrentAverage: // SetCurrentRMS: // BiltStates: // BiltNames: // BiltLocations: namespace MchBilt_ns { /*----- PROTECTED REGION ID(MchBilt::namespace_starting) ENABLED START -----*/ // static initializations /*----- PROTECTED REGION END -----*/ // MchBilt::namespace_starting //-------------------------------------------------------- /** * Method : MchBilt::MchBilt() * Description : Constructors for a Tango device * implementing the class MchBilt */ //-------------------------------------------------------- MchBilt::MchBilt(Tango::DeviceClass *cl, string &s) : Tango::Device_4Impl(cl, s.c_str()) { /*----- PROTECTED REGION ID(MchBilt::constructor_1) ENABLED START -----*/ init_device(); /*----- PROTECTED REGION END -----*/ // MchBilt::constructor_1 } //-------------------------------------------------------- MchBilt::MchBilt(Tango::DeviceClass *cl, const char *s) : Tango::Device_4Impl(cl, s) { /*----- PROTECTED REGION ID(MchBilt::constructor_2) ENABLED START -----*/ init_device(); /*----- PROTECTED REGION END -----*/ // MchBilt::constructor_2 } //-------------------------------------------------------- MchBilt::MchBilt(Tango::DeviceClass *cl, const char *s, const char *d) : Tango::Device_4Impl(cl, s, d) { /*----- PROTECTED REGION ID(MchBilt::constructor_3) ENABLED START -----*/ init_device(); /*----- PROTECTED REGION END -----*/ // MchBilt::constructor_3 } //-------------------------------------------------------- /** * Method : MchBilt::delete_device()() * Description : will be called at device destruction or at init command */ //-------------------------------------------------------- void MchBilt::delete_device() { /*----- PROTECTED REGION ID(MchBilt::delete_device) ENABLED START -----*/ // Delete device allocated objects // Delete device allocated objects if ( acquisition_thread != NULL ) { data_mutex.lock(); exit_thread = true; data_mutex.unlock(); // join now the thread until it exits int *rv; acquisition_thread->join((void **)&rv); cout << "MchBilt::delete_device(): Exit acquisition thread !!!" << endl; } if ( bilts != NULL ) { delete (bilts); bilts = NULL; } /*----- PROTECTED REGION END -----*/ // MchBilt::delete_device } //-------------------------------------------------------- /** * Method : MchBilt::init_device() * Description : // will be called at device initialization. */ //-------------------------------------------------------- void MchBilt::init_device() { DEBUG_STREAM << "MchBilt::init_device() create device " << device_name << endl; /*----- PROTECTED REGION ID(MchBilt::init_device_before) ENABLED START -----*/ // Initialization before get_device_property() call /*----- PROTECTED REGION END -----*/ // MchBilt::init_device_before // Get the device properties (if any) from database get_device_property(); /*----- PROTECTED REGION ID(MchBilt::init_device) ENABLED START -----*/ // Initialize device try { // initialise the group bilts = new Tango::Group ("Bilts"); bilts->add (biltNames); // initialise the list of attributes to be read attributes.push_back("State"); attributes.push_back("Currents"); attributes.push_back("Voltages"); attributes.push_back("SetCurrentsAverage"); attributes.push_back("SetCurrentsRMS"); // specify the group timeout bilts->set_timeout_millis (updatePeriod); // do a first call to create all network connections // which is very time consuming! bilt_data = bilts->read_attributes (attributes, true); cout << "Read data from " << (bilt_data.size() / attributes.size()) << " bilts!" << endl; // read the location strings of the available bilt devices read_locations(); // create the acquisition thread exit_thread = false; acquisition_thread = new AcquisitionThread(this, data_mutex, group_mutex); } catch (const Tango::DevFailed &e) { acquisition_state = Tango::UNKNOWN; acquisition_error = e.errors; } /*----- PROTECTED REGION END -----*/ // MchBilt::init_device } //-------------------------------------------------------- /** * Method : MchBilt::get_device_property() * Description : Read database to initialize property data members. */ //-------------------------------------------------------- void MchBilt::get_device_property() { /*----- PROTECTED REGION ID(MchBilt::get_device_property_before) ENABLED START -----*/ // Initialize property data members acquisition_thread = NULL; acquisition_state = Tango::UNKNOWN; bilts = NULL; mchBiltChannels = 0; struct timeval now; gettimeofday (&now, NULL); data_set_time = now; data_read_time = now; /*----- PROTECTED REGION END -----*/ // MchBilt::get_device_property_before // Read device properties from database. Tango::DbData dev_prop; dev_prop.push_back(Tango::DbDatum("BiltNames")); dev_prop.push_back(Tango::DbDatum("UpdatePeriod")); // is there at least one property to be read ? if (dev_prop.size()>0) { // Call database and extract values if (Tango::Util::instance()->_UseDb==true) get_db_device()->get_property(dev_prop); // get instance on MchBiltClass to get class property Tango::DbDatum def_prop, cl_prop; MchBiltClass *ds_class = (static_cast(get_device_class())); int i = -1; // Try to initialize BiltNames from class property cl_prop = ds_class->get_class_property(dev_prop[++i].name); if (cl_prop.is_empty()==false) cl_prop >> biltNames; else { // Try to initialize BiltNames from default device value def_prop = ds_class->get_default_device_property(dev_prop[i].name); if (def_prop.is_empty()==false) def_prop >> biltNames; } // And try to extract BiltNames value from database if (dev_prop[i].is_empty()==false) dev_prop[i] >> biltNames; // Try to initialize UpdatePeriod from class property cl_prop = ds_class->get_class_property(dev_prop[++i].name); if (cl_prop.is_empty()==false) cl_prop >> updatePeriod; else { // Try to initialize UpdatePeriod from default device value def_prop = ds_class->get_default_device_property(dev_prop[i].name); if (def_prop.is_empty()==false) def_prop >> updatePeriod; } // And try to extract UpdatePeriod value from database if (dev_prop[i].is_empty()==false) dev_prop[i] >> updatePeriod; } /*----- PROTECTED REGION ID(MchBilt::get_device_property_after) ENABLED START -----*/ // Check device property data members init // the number of channels is defined by the given number of // bilt names mchBiltChannels = biltNames.size(); // assign the data vectors with the given number of channels current.assign(3*mchBiltChannels, nan("NaN")); current_set.assign(3*mchBiltChannels, nan("NaN")); voltage.assign(3*mchBiltChannels, nan("NaN")); current_average.assign(3*mchBiltChannels, nan("NaN")); current_rms.assign(3*mchBiltChannels, nan("NaN")); states.assign(mchBiltChannels, Tango::DISABLE); locations.assign(mchBiltChannels, "unknown"); // initialise the names array for (int i=0; iget_database()->put_device_attribute_property(get_name(), db_data); /*----- PROTECTED REGION END -----*/ // MchBilt::get_device_property_after } //-------------------------------------------------------- /** * Method : MchBilt::always_executed_hook() * Description : method always executed before any command is executed */ //-------------------------------------------------------- void MchBilt::always_executed_hook() { INFO_STREAM << "MchBilt::always_executed_hook() " << device_name << endl; /*----- PROTECTED REGION ID(MchBilt::always_executed_hook) ENABLED START -----*/ // code always executed before all requests /*----- PROTECTED REGION END -----*/ // MchBilt::always_executed_hook } //-------------------------------------------------------- /** * Method : MchBilt::read_attr_hardware() * Description : Hardware acquisition for attributes. */ //-------------------------------------------------------- void MchBilt::read_attr_hardware(vector &attr_list) { DEBUG_STREAM << "MchBilt::read_attr_hardware(vector &attr_list) entering... " << endl; /*----- PROTECTED REGION ID(MchBilt::read_attr_hardware) ENABLED START -----*/ // Add your own code // Add your own code here double delay; // wait for the next data acquisition after applying a new setpoint { omni_mutex_lock l(data_mutex); delay = (data_set_time.tv_sec * 1e6 + data_set_time.tv_usec) - (data_read_time.tv_sec * 1e6 + data_read_time.tv_usec); // cout << "delay = " << delay << endl; } while ( delay > 0 ) { // 50 ms struct timespec sleep_time = {0, 50000000}; nanosleep(&sleep_time, NULL); omni_mutex_lock l(data_mutex); delay = (data_set_time.tv_sec * 1e6 + data_set_time.tv_usec) - (data_read_time.tv_sec * 1e6 + data_read_time.tv_usec); INFO_STREAM << "MchBilt::read_attr_hardware() : waiting delay = " << delay << endl; } /*----- PROTECTED REGION END -----*/ // MchBilt::read_attr_hardware } //-------------------------------------------------------- /** * Read Current attribute * Description: Array of current values. Not yet available channels are filled \nwith NaN values. * * Data type: Tango::DevDouble * Attr type: Spectrum max = 256 */ //-------------------------------------------------------- void MchBilt::read_Current(Tango::Attribute &attr) { DEBUG_STREAM << "MchBilt::read_Current(Tango::Attribute &attr) entering... " << endl; /*----- PROTECTED REGION ID(MchBilt::read_Current) ENABLED START -----*/ omni_mutex_lock l(data_mutex); if ( acquisition_state == Tango::UNKNOWN ) { attr.set_quality(Tango::ATTR_INVALID); } else { // initialise the setpoint value Tango::MultiAttribute *attr_list = get_device_attr(); Tango::WAttribute &attr_curr = attr_list->get_w_attr_by_name ("Current"); attr_curr.set_write_value(¤t_set[0], current_set.size()); // initialise the read value attr.set_value (¤t[0], current.size()); } /*----- PROTECTED REGION END -----*/ // MchBilt::read_Current } //-------------------------------------------------------- /** * Write Current attribute values to hardware. * * Data type: Tango::DevDouble * Attr type: Spectrum max = 256 */ //-------------------------------------------------------- void MchBilt::write_Current(Tango::WAttribute &attr) { DEBUG_STREAM << "MchBilt::write_Current(Tango::Attribute &attr) entering... " << endl; // Retrieve number of write values int w_length = attr.get_write_value_length(); // Retrieve pointer on write values (Do not delete !) const Tango::DevDouble *w_val; attr.get_write_value(w_val); /*----- PROTECTED REGION ID(MchBilt::write_Current) ENABLED START -----*/ if ( attr.get_write_value_length() != mchBiltChannels ) { // raise exception Tango::Except::throw_exception ( (const char *)"WriteError", (const char *)"Incorrect number of input values!\nIt doesn't correspond to the number of bilt channels.", (const char *)"MchBilt::write_Current"); } const double *argin; attr.get_write_value (argin); // copy the setpoint values to the enabled bilts vector st_set; for ( long i=0; iwrite_attribute ("Current", st_set, true); // initialise the set time, to be sure that the next // returned read value is newer and contains the changes. struct timeval now; gettimeofday (&now, NULL); data_set_time = now; // check for errors during the setpoint writing if ( bilt_data.has_failed() ) { TangoSys_OMemStream o; o << "The following current settings could not be applied : " << endl; for (long i=0; idevice_state data member) and returns it to the caller. * * @param argin none. * @returns State Code */ //-------------------------------------------------------- Tango::DevState MchBilt::dev_state() { DEBUG_STREAM << "MchBilt::State() - " << device_name << endl; /*----- PROTECTED REGION ID(MchBilt::dev_state) ENABLED START -----*/ Tango::DevState argout; // Add your own state management // get the last state value Tango::DevState last_state = get_state(); // Problems on data acquisition? if ( acquisition_state == Tango::UNKNOWN ) { argout = Tango::UNKNOWN; } else { int nunknown = 0; int nfault = 0; int nalarm = 0; int noff = 0; int non = 0; int ndisable = 0; omni_mutex_lock l(data_mutex); for (int i=0; idevice_status data member) and returns it to the caller. * * @param argin none. * @returns Status description */ //-------------------------------------------------------- Tango::ConstDevString MchBilt::dev_status() { DEBUG_STREAM << "MchBilt::Status() - " << device_name << endl; /*----- PROTECTED REGION ID(MchBilt::dev_status) ENABLED START -----*/ // Add your own status management Tango::DevState state = dev_state(); string status; if ( acquisition_state == Tango::UNKNOWN ) { status = "Data acquisition problem: \n"; for (short i = 0; iget_device(names_arr[i]); status += dev->status() + "\n"; } } break; } case Tango::DISABLE: // When in disable state, no bilt devices are configured! break; default: // loop over all bilt states and get the names // of bilt devices in UNKNOWN state. status += "One or more bilts are in an UNKNOWN state:\n"; { omni_mutex_lock l(data_mutex); //cout << "Error list size : " << dev_error_list.size() << endl; for (long i=0; icommand_inout ("On", true); if ( bilt_data.has_failed() ) { TangoSys_OMemStream o; o << "Switching ON failed on "; for (long i=0; icommand_inout ("Off", true); if ( bilt_data.has_failed() ) { TangoSys_OMemStream o; o << "Switching OFF failed on "; for (long i=0; icommand_inout ("Reset", true); if ( bilt_data.has_failed() ) { TangoSys_OMemStream o; o << "Reset failed on "; for (long i=0; ilength() != mchBiltChannels ) { // raise exception Tango::Except::throw_exception ( (const char *)"WriteError", (const char *)"Incorrect number of input values!\nIt doesn't correspond to the number of bilt channels.", (const char *)"MchBilt::setpoint_check"); } // copy the setpoint values to the enabled bilts vector st_set; for ( long i=0; icommand_inout ("SetpointCheck", st_set, true); } // check the results argout = 0; for (long i=0; i> res; if ( res == (-1) ) { argout = (-1); break; } } bilt_data.reset(); /*----- PROTECTED REGION END -----*/ // MchBilt::setpoint_check return argout; } /*----- PROTECTED REGION ID(MchBilt::namespace_ending) ENABLED START -----*/ // Additional Methods //+------------------------------------------------------------------ /** * method: MchBilt::read_locations * * description: Read the location strings of all bilt devices used. * The location strings, contains the location of the Bilt * power supply which drives the bilt. * @param * @return */ //+------------------------------------------------------------------ void MchBilt::read_locations() { DEBUG_STREAM << "MchBilt::read_locations(): entering... !" << endl; Tango::GroupAttrReplyList bilt_data; omni_mutex_lock l(group_mutex); Tango::GroupReply::enable_exception(true); bilt_data = bilts->read_attribute ("Location", true); for (long i=0; i < bilt_data.size(); i++) { try { bilt_data[i] >> locations[i]; } catch (const Tango::DevFailed &e) { // Ignore missing data. Keep the old location string! } } } /*----- PROTECTED REGION END -----*/ // MchBilt::namespace_ending } // namespace Node-path: powersupply/itest/MchBilt/trunk/MchBilt.h Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 8306 Text-content-md5: bc06195a26f6974b3fa00639dc5997c8 Content-length: 8316 PROPS-END /*----- PROTECTED REGION ID(MchBilt.h) ENABLED START -----*/ //============================================================================= // // file : MchBilt.h // // description : Include for the MchBilt class. // // project : Multi channel Bilt class for the ESRF storage ring. // // $Author: meyer $ // // $Revision: 1.1.1.1 $ // $Date: 2011-08-04 14:42:06 $ // // SVN only: // $HeadURL: $ // // CVS only: // $Source: /segfs/tango/cvsroot/cppserver/machine/powersupply/SrSteerers/tango/MchBilt/MchBilt.h,v $ // $Log: not supported by cvs2svn $ // //============================================================================= // This file is generated by POGO // (Program Obviously used to Generate tango Object) //============================================================================= #ifndef MCHBILT_H #define MCHBILT_H #include typedef struct { string dev_name; Tango::DevErrorList err_list; } DeviceError; /*----- PROTECTED REGION END -----*/ /** * MchBilt class Description: * The multi channel Bilt device regroups all Bilt powersupply device used for * the ESRF storage ring steerers * Reading and setting of currents and voltages is done by spectrum attributes, which * contain the values of the individual Bilt devices. */ namespace MchBilt_ns { /*----- PROTECTED REGION ID(MchBilt::Additional Class Declarations) ENABLED START -----*/ // Additional Class Declarations class AcquisitionThread; /*----- PROTECTED REGION END -----*/ // MchBilt::Additional Class Declarations class MchBilt : public Tango::Device_4Impl { /*----- PROTECTED REGION ID(MchBilt::Data Members) ENABLED START -----*/ // Add your own data members public: /*----- PROTECTED REGION END -----*/ // MchBilt::Data Members // Device property data members public: // BiltNames: The list of available bilt device names in the order the values have to be arranged // in the Current and Voltage spectra. vector biltNames; // UpdatePeriod: The update period of all aquired values from the bilt devices in milli seconds. Tango::DevLong updatePeriod; // Attribute data members public: Tango::DevDouble *attr_Current_read; Tango::DevDouble *attr_Voltage_read; Tango::DevDouble *attr_SetCurrentAverage_read; Tango::DevDouble *attr_SetCurrentRMS_read; Tango::DevState *attr_BiltStates_read; Tango::DevString *attr_BiltNames_read; Tango::DevString *attr_BiltLocations_read; // Constructors and destructors public: /** * Constructs a newly allocated Command object. * * @param cl Class. * @param s Device Name */ MchBilt(Tango::DeviceClass *cl,string &s); /** * Constructs a newly allocated Command object. * * @param cl Class. * @param s Device Name */ MchBilt(Tango::DeviceClass *cl,const char *s); /** * Constructs a newly allocated Command object. * * @param cl Class. * @param s Device name * @param d Device description. */ MchBilt(Tango::DeviceClass *cl,const char *s,const char *d); /** * The object destructor. */ ~MchBilt() {delete_device();}; // Miscellaneous methods public: /** * will be called at device destruction or at init command. */ void delete_device(); /** * Initialize the device */ virtual void init_device(); /** * Read the device properties from database */ void get_device_property(); /** * Always executed method before execution command method. */ virtual void always_executed_hook(); // Attribute methods public: /** * Method : MchBilt::read_attr_hardware() * Description : Hardware acquisition for attributes. */ virtual void read_attr_hardware(vector &attr_list); /** * Current attribute related methods. * Description: Array of current values. Not yet available channels are filled \nwith NaN values. * * Data type: Tango::DevDouble * Attr type: Spectrum max = 256 */ virtual void read_Current(Tango::Attribute &attr); virtual void write_Current(Tango::WAttribute &attr); virtual bool is_Current_allowed(Tango::AttReqType type); /** * Voltage attribute related methods. * Description: Array of voltage values. Not yet available channels are filled \nwith NaN values. * * Data type: Tango::DevDouble * Attr type: Spectrum max = 256 */ virtual void read_Voltage(Tango::Attribute &attr); virtual bool is_Voltage_allowed(Tango::AttReqType type); /** * SetCurrentAverage attribute related methods. * Description: Array of calculated average AC current setpoint values per second.. When not yet available, the channels are filled \nwith NaN values. * * Data type: Tango::DevDouble * Attr type: Spectrum max = 256 */ virtual void read_SetCurrentAverage(Tango::Attribute &attr); virtual bool is_SetCurrentAverage_allowed(Tango::AttReqType type); /** * SetCurrentRMS attribute related methods. * Description: Array of calculated RMS AC current setpoint values per second.. When not yet available, the channels are filled \nwith NaN values. * * Data type: Tango::DevDouble * Attr type: Spectrum max = 256 */ virtual void read_SetCurrentRMS(Tango::Attribute &attr); virtual bool is_SetCurrentRMS_allowed(Tango::AttReqType type); /** * BiltStates attribute related methods. * Description: The states of the individual bilt devices. * * Data type: Tango::DevState * Attr type: Spectrum max = 256 */ virtual void read_BiltStates(Tango::Attribute &attr); virtual bool is_BiltStates_allowed(Tango::AttReqType type); /** * BiltNames attribute related methods. * Description: The names of the individual bilt devices. * * Data type: Tango::DevString * Attr type: Spectrum max = 256 */ virtual void read_BiltNames(Tango::Attribute &attr); virtual bool is_BiltNames_allowed(Tango::AttReqType type); /** * BiltLocations attribute related methods. * Description: The locations of the individual Bilt power supply devices used \nfor every bilt. * * Data type: Tango::DevString * Attr type: Spectrum max = 256 */ virtual void read_BiltLocations(Tango::Attribute &attr); virtual bool is_BiltLocations_allowed(Tango::AttReqType type); /** * Method : MchBilt::add_dynamic_attributes() * Description : Add dynamic attributes if any. */ void add_dynamic_attributes(); // Command related methods public: /** * Command State related methods. */ Tango::DevState dev_state(); /** * Command Status related methods. */ Tango::ConstDevString dev_status(); /** * Command On related methods. */ void on(); virtual bool is_On_allowed(const CORBA::Any &any); /** * Command Off related methods. */ void off(); virtual bool is_Off_allowed(const CORBA::Any &any); /** * Command Reset related methods. */ void reset(); virtual bool is_Reset_allowed(const CORBA::Any &any); /** * Command SetpointCheck related methods. */ Tango::DevShort setpoint_check(const Tango::DevVarDoubleArray *argin); virtual bool is_SetpointCheck_allowed(const CORBA::Any &any); /*----- PROTECTED REGION ID(MchBilt::Additional Method prototypes) ENABLED START -----*/ // Additional Method prototypes protected : void read_locations(); friend class AcquisitionThread; AcquisitionThread *acquisition_thread; omni_mutex data_mutex; omni_mutex group_mutex; short exit_thread; Tango::DevErrorList acquisition_error; Tango::DevState acquisition_state; bool bilt_init; struct timeval data_set_time; struct timeval data_read_time; Tango::Group *bilts; Tango::GroupAttrReplyList bilt_data; vector attributes; vector current; vector current_set; vector voltage; vector current_average; vector current_rms; vector states; Tango::DevString names_arr[100]; int mchBiltChannels; vector dev_error_list; vector locations; Tango::DevString locations_arr[100]; /*----- PROTECTED REGION END -----*/ // MchBilt::Additional Method prototypes }; /*----- PROTECTED REGION ID(MchBilt::Additional Classes Definitions) ENABLED START -----*/ // Additional Classes definitions /*----- PROTECTED REGION END -----*/ // MchBilt::Additional Classes Definitions } // namespace #endif // MCHBILT_H Node-path: powersupply/itest/MchBilt/trunk/MchBilt.xmi Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 11182 Text-content-md5: dbd6c84799455968b636e0295c5ccc17 Content-length: 11192 PROPS-END 500 ON FAULT UNKNOWN FAULT UNKNOWN Node-path: powersupply/itest/MchBilt/trunk/MchBiltClass.cpp Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 28381 Text-content-md5: 9915d459226684b6d9c8a9f4fdf8c018 Content-length: 28391 PROPS-END /*----- PROTECTED REGION ID(MchBiltClass.cpp) ENABLED START -----*/ static const char *RcsId = "$Id: MchBiltClass.cpp,v 1.1.1.1 2011-08-04 14:42:06 meyer Exp $"; static const char *TagName = "$Name: not supported by cvs2svn $"; static const char *CvsPath = "$Source: /segfs/tango/cvsroot/cppserver/machine/powersupply/SrSteerers/tango/MchBilt/MchBiltClass.cpp,v $"; static const char *SvnPath = "$HeadURL: $"; static const char *HttpServer = "http://www.esrf.eu/computing/cs/tango/tango_doc/ds_doc/"; //============================================================================= // // file : MchBiltClass.cpp // // description : C++ source for the MchBiltClass. A singleton // class derived from DeviceClass. It implements the // command list and all properties and methods required // by the «name» once per process. // // project : Multi channel Bilt class for the ESRF storage ring. // // $Author: meyer $ // // $Revision: 1.1.1.1 $ // $Date: 2011-08-04 14:42:06 $ // // SVN only: // $HeadURL: $ // // CVS only: // $Source: /segfs/tango/cvsroot/cppserver/machine/powersupply/SrSteerers/tango/MchBilt/MchBiltClass.cpp,v $ // $Log: not supported by cvs2svn $ // //============================================================================= // This file is generated by POGO // (Program Obviously used to Generate tango Object) //============================================================================= #include /*----- PROTECTED REGION END -----*/ //------------------------------------------------------------------- /** * Create MchBiltClass singleton and * return it in a C function for Python usage */ //------------------------------------------------------------------- extern "C" { #ifdef _TG_WINDOWS_ __declspec(dllexport) #endif Tango::DeviceClass *_create_MchBilt_class(const char *name) { return MchBilt_ns::MchBiltClass::init(name); } } namespace MchBilt_ns { //=================================================================== // Initialize pointer for singleton pattern //=================================================================== MchBiltClass *MchBiltClass::_instance = NULL; //-------------------------------------------------------- /** * method : MchBiltClass::MchBiltClass(string &s) * description : constructor for the MchBiltClass * * @param s The class name */ //-------------------------------------------------------- MchBiltClass::MchBiltClass(string &s):DeviceClass(s) { cout2 << "Entering MchBiltClass constructor" << endl; set_default_property(); get_class_property(); write_class_property(); /*----- PROTECTED REGION ID(MchBilt::Class::constructor) ENABLED START -----*/ /*----- PROTECTED REGION END -----*/ // MchBilt::Class::constructor cout2 << "Leaving MchBiltClass constructor" << endl; } //-------------------------------------------------------- /** * method : MchBiltClass::~MchBiltClass() * description : destructor for the MchBiltClass */ //-------------------------------------------------------- MchBiltClass::~MchBiltClass() { /*----- PROTECTED REGION ID(MchBilt::Class::destructor) ENABLED START -----*/ /*----- PROTECTED REGION END -----*/ // MchBilt::Class::destructor _instance = NULL; } //-------------------------------------------------------- /** * method : MchBiltClass::init * description : Create the object if not already done. * Otherwise, just return a pointer to the object * * @param name The class name */ //-------------------------------------------------------- MchBiltClass *MchBiltClass::init(const char *name) { if (_instance == NULL) { try { string s(name); _instance = new MchBiltClass(s); } catch (bad_alloc) { throw; } } return _instance; } //-------------------------------------------------------- /** * method : MchBiltClass::instance * description : Check if object already created, * and return a pointer to the object */ //-------------------------------------------------------- MchBiltClass *MchBiltClass::instance() { if (_instance == NULL) { cerr << "Class is not initialised !!" << endl; exit(-1); } return _instance; } //=================================================================== // Command execution method calls //=================================================================== //-------------------------------------------------------- /** * method : OnClass::execute() * description : method to trigger the execution of the command. * * @param device The device on which the command must be executed * @param in_any The command input data * * returns The command output data (packed in the Any object) */ //-------------------------------------------------------- CORBA::Any *OnClass::execute(Tango::DeviceImpl *device, const CORBA::Any &in_any) { cout2 << "OnClass::execute(): arrived" << endl; ((static_cast(device))->on()); return new CORBA::Any(); } //-------------------------------------------------------- /** * method : OffClass::execute() * description : method to trigger the execution of the command. * * @param device The device on which the command must be executed * @param in_any The command input data * * returns The command output data (packed in the Any object) */ //-------------------------------------------------------- CORBA::Any *OffClass::execute(Tango::DeviceImpl *device, const CORBA::Any &in_any) { cout2 << "OffClass::execute(): arrived" << endl; ((static_cast(device))->off()); return new CORBA::Any(); } //-------------------------------------------------------- /** * method : ResetClass::execute() * description : method to trigger the execution of the command. * * @param device The device on which the command must be executed * @param in_any The command input data * * returns The command output data (packed in the Any object) */ //-------------------------------------------------------- CORBA::Any *ResetClass::execute(Tango::DeviceImpl *device, const CORBA::Any &in_any) { cout2 << "ResetClass::execute(): arrived" << endl; ((static_cast(device))->reset()); return new CORBA::Any(); } //-------------------------------------------------------- /** * method : SetpointCheckClass::execute() * description : method to trigger the execution of the command. * * @param device The device on which the command must be executed * @param in_any The command input data * * returns The command output data (packed in the Any object) */ //-------------------------------------------------------- CORBA::Any *SetpointCheckClass::execute(Tango::DeviceImpl *device, const CORBA::Any &in_any) { cout2 << "SetpointCheckClass::execute(): arrived" << endl; const Tango::DevVarDoubleArray *argin; extract(in_any, argin); return insert((static_cast(device))->setpoint_check(argin)); } //=================================================================== // Properties management //=================================================================== //-------------------------------------------------------- /** * method : MchBiltClass::get_class_property * description : Get the class property for specified name. * * @param name The property name */ //-------------------------------------------------------- Tango::DbDatum MchBiltClass::get_class_property(string &prop_name) { for (unsigned int i=0 ; i vect_data; // Set Default Class Properties // Set Default Device Properties prop_name = "BiltNames"; prop_desc = "The list of available bilt device names in the order the values have to be arranged in the Current and Voltage spectra."; prop_def = ""; vect_data.clear(); if (prop_def.length()>0) { Tango::DbDatum data(prop_name); data << vect_data ; dev_def_prop.push_back(data); add_wiz_dev_prop(prop_name, prop_desc, prop_def); } else add_wiz_dev_prop(prop_name, prop_desc); prop_name = "UpdatePeriod"; prop_desc = "The update period of all aquired values from the bilt devices in milli seconds."; prop_def = "500\n"; vect_data.clear(); vect_data.push_back("500"); if (prop_def.length()>0) { Tango::DbDatum data(prop_name); data << vect_data ; dev_def_prop.push_back(data); add_wiz_dev_prop(prop_name, prop_desc, prop_def); } else add_wiz_dev_prop(prop_name, prop_desc); } //-------------------------------------------------------- /** * Method : MchBilt::MchBiltClass::write_class_property() * Description : Set class description fields as property in database */ //-------------------------------------------------------- void MchBiltClass::write_class_property() { // First time, check if database used if (Tango::Util::_UseDb == false) return; Tango::DbData data; string classname = get_name(); string header; string::size_type start, end; // Put title Tango::DbDatum title("ProjectTitle"); string str_title("Multi channel class for the Bilt power supplies"); title << str_title; data.push_back(title); // Put Description Tango::DbDatum description("Description"); vector str_desc; str_desc.push_back("The multi channel Bilt device regroups all Bilt powersupply device used for"); str_desc.push_back("the ESRF storage ring steerers"); str_desc.push_back("Reading and setting of currents and voltages is done by spectrum attributes, which "); str_desc.push_back("contain the values of the individual Bilt devices."); description << str_desc; data.push_back(description); // put cvs or svn location string filename("MchBilt"); filename += "Class.cpp"; // check for cvs information string src_path(CvsPath); start = src_path.find("/"); if (start!=string::npos) { end = src_path.find(filename); if (end>start) { string strloc = src_path.substr(start, end-start); // Check if specific repository start = strloc.find("/cvsroot/"); if (start!=string::npos && start>0) { string repository = strloc.substr(0, start); if (repository.find("/segfs/")!=string::npos) strloc = "ESRF:" + strloc.substr(start, strloc.length()-start); } Tango::DbDatum cvs_loc("cvs_location"); cvs_loc << strloc; data.push_back(cvs_loc); } } // check for svn information else { string src_path(SvnPath); start = src_path.find("://"); if (start!=string::npos) { end = src_path.find(filename); if (end>start) { header = "$HeadURL: "; start = header.length(); string strloc = src_path.substr(start, (end-start)); Tango::DbDatum svn_loc("svn_location"); svn_loc << strloc; data.push_back(svn_loc); } } } // Get CVS or SVN revision tag // CVS tag string tagname(TagName); header = "$Name: "; start = header.length(); string endstr(" $"); end = tagname.find(endstr); if (end!=string::npos && end>start) { string strtag = tagname.substr(start, end-start); Tango::DbDatum cvs_tag("cvs_tag"); cvs_tag << strtag; data.push_back(cvs_tag); } // SVN tag string svnpath(SvnPath); header = "$HeadURL: "; start = header.length(); end = svnpath.find(endstr); if (end!=string::npos && end>start) { string strloc = svnpath.substr(start, end-start); string tagstr ("/tags/"); start = strloc.find(tagstr); if ( start!=string::npos ) { start = start + tagstr.length(); end = strloc.find(filename); string strtag = strloc.substr(start, end-start-1); Tango::DbDatum svn_tag("svn_tag"); svn_tag << strtag; data.push_back(svn_tag); } } // Get URL location string httpServ(HttpServer); if (httpServ.length()>0) { Tango::DbDatum db_doc_url("doc_url"); db_doc_url << httpServ; data.push_back(db_doc_url); } // Put inheritance Tango::DbDatum inher_datum("InheritedFrom"); vector inheritance; inheritance.push_back("Device_4Impl"); inher_datum << inheritance; data.push_back(inher_datum); // Call database and and values get_db_class()->put_property(data); } //=================================================================== // Factory methods //=================================================================== //-------------------------------------------------------- /** * method : MchBiltClass::device_factory * description : Create the device object(s) * and store them in the device list * * @param *devlist_ptr The device name list */ //-------------------------------------------------------- void MchBiltClass::device_factory(const Tango::DevVarStringArray *devlist_ptr) { /*----- PROTECTED REGION ID(MchBilt::Class::device_factory_before) ENABLED START -----*/ // Add your own code /*----- PROTECTED REGION END -----*/ // MchBilt::Class::device_factory_before // Create devices and add it into the device list for (unsigned long i=0 ; ilength() ; i++) { cout4 << "Device name : " << (*devlist_ptr)[i].in() << endl; device_list.push_back(new MchBilt(this, (*devlist_ptr)[i])); } // Manage dynamic attributes if any erase_dynamic_attributes(devlist_ptr, get_class_attr()->get_attr_list()); // Export devices to the outside world for (unsigned long i=1 ; i<=devlist_ptr->length() ; i++) { // Add dynamic attributes if any MchBilt *dev = static_cast(device_list[device_list.size()-i]); dev->add_dynamic_attributes(); // Check before if database used. if ((Tango::Util::_UseDb == true) && (Tango::Util::_FileDb == false)) export_device(dev); else export_device(dev, dev->get_name().c_str()); } /*----- PROTECTED REGION ID(MchBilt::Class::device_factory_after) ENABLED START -----*/ // Add your own code /*----- PROTECTED REGION END -----*/ // MchBilt::Class::device_factory_after } //-------------------------------------------------------- /** * Method : MchBilt::MchBiltClass::attribute_factory() * Description : Create the attribute object(s) * and store them in the attribute list */ //-------------------------------------------------------- void MchBiltClass::attribute_factory(vector &att_list) { /*----- PROTECTED REGION ID(MchBilt::Class::attribute_factory_before) ENABLED START -----*/ // Add your own code /*----- PROTECTED REGION END -----*/ // MchBilt::Class::attribute_factory_before // Attribute : Current CurrentAttrib *current = new CurrentAttrib(); Tango::UserDefaultAttrProp current_prop; current_prop.set_description("Array of current values. Not yet available channels are filled \nwith NaN values."); current_prop.set_label("Current"); current_prop.set_unit("A"); // standard_unit not set for Current // display_unit not set for Current current_prop.set_format("%5.4f"); // max_value not set for Current // min_value not set for Current // max_alarm not set for Current // min_alarm not set for Current // max_warning not set for Current // min_warning not set for Current // delta_t not set for Current // delta_val not set for Current current->set_default_properties(current_prop); // Not Polled current->set_disp_level(Tango::OPERATOR); // Not memorized // Current does not fire change event // Current does not fire archive event // Current does not fire data_ready event att_list.push_back(current); // Attribute : Voltage VoltageAttrib *voltage = new VoltageAttrib(); Tango::UserDefaultAttrProp voltage_prop; voltage_prop.set_description("Array of voltage values. Not yet available channels are filled \nwith NaN values."); voltage_prop.set_label("Voltage"); voltage_prop.set_unit("A"); // standard_unit not set for Voltage // display_unit not set for Voltage voltage_prop.set_format("%6.4f"); // max_value not set for Voltage // min_value not set for Voltage // max_alarm not set for Voltage // min_alarm not set for Voltage // max_warning not set for Voltage // min_warning not set for Voltage // delta_t not set for Voltage // delta_val not set for Voltage voltage->set_default_properties(voltage_prop); // Not Polled voltage->set_disp_level(Tango::OPERATOR); // Not memorized // Voltage does not fire change event // Voltage does not fire archive event // Voltage does not fire data_ready event att_list.push_back(voltage); // Attribute : SetCurrentAverage SetCurrentAverageAttrib *setcurrentaverage = new SetCurrentAverageAttrib(); Tango::UserDefaultAttrProp setcurrentaverage_prop; setcurrentaverage_prop.set_description("Array of calculated average AC current setpoint values per second.. When not yet available, the channels are filled \nwith NaN values."); setcurrentaverage_prop.set_label("Average AC current set./s"); setcurrentaverage_prop.set_unit("mA"); // standard_unit not set for SetCurrentAverage // display_unit not set for SetCurrentAverage setcurrentaverage_prop.set_format("%6.3f"); // max_value not set for SetCurrentAverage // min_value not set for SetCurrentAverage // max_alarm not set for SetCurrentAverage // min_alarm not set for SetCurrentAverage // max_warning not set for SetCurrentAverage // min_warning not set for SetCurrentAverage // delta_t not set for SetCurrentAverage // delta_val not set for SetCurrentAverage setcurrentaverage->set_default_properties(setcurrentaverage_prop); // Not Polled setcurrentaverage->set_disp_level(Tango::OPERATOR); // Not memorized // SetCurrentAverage does not fire change event // SetCurrentAverage does not fire archive event // SetCurrentAverage does not fire data_ready event att_list.push_back(setcurrentaverage); // Attribute : SetCurrentRMS SetCurrentRMSAttrib *setcurrentrms = new SetCurrentRMSAttrib(); Tango::UserDefaultAttrProp setcurrentrms_prop; setcurrentrms_prop.set_description("Array of calculated RMS AC current setpoint values per second.. When not yet available, the channels are filled \nwith NaN values."); setcurrentrms_prop.set_label("RMS AC current set./s"); setcurrentrms_prop.set_unit("mA"); // standard_unit not set for SetCurrentRMS // display_unit not set for SetCurrentRMS setcurrentrms_prop.set_format("%6.3f"); // max_value not set for SetCurrentRMS // min_value not set for SetCurrentRMS // max_alarm not set for SetCurrentRMS // min_alarm not set for SetCurrentRMS // max_warning not set for SetCurrentRMS // min_warning not set for SetCurrentRMS // delta_t not set for SetCurrentRMS // delta_val not set for SetCurrentRMS setcurrentrms->set_default_properties(setcurrentrms_prop); // Not Polled setcurrentrms->set_disp_level(Tango::OPERATOR); // Not memorized // SetCurrentRMS does not fire change event // SetCurrentRMS does not fire archive event // SetCurrentRMS does not fire data_ready event att_list.push_back(setcurrentrms); // Attribute : BiltStates BiltStatesAttrib *biltstates = new BiltStatesAttrib(); Tango::UserDefaultAttrProp biltstates_prop; biltstates_prop.set_description("The states of the individual bilt devices."); // label not set for BiltStates // unit not set for BiltStates // standard_unit not set for BiltStates // display_unit not set for BiltStates // format not set for BiltStates // max_value not set for BiltStates // min_value not set for BiltStates // max_alarm not set for BiltStates // min_alarm not set for BiltStates // max_warning not set for BiltStates // min_warning not set for BiltStates // delta_t not set for BiltStates // delta_val not set for BiltStates biltstates->set_default_properties(biltstates_prop); // Not Polled biltstates->set_disp_level(Tango::OPERATOR); // Not memorized // BiltStates does not fire change event // BiltStates does not fire archive event // BiltStates does not fire data_ready event att_list.push_back(biltstates); // Attribute : BiltNames BiltNamesAttrib *biltnames = new BiltNamesAttrib(); Tango::UserDefaultAttrProp biltnames_prop; biltnames_prop.set_description("The names of the individual bilt devices."); // label not set for BiltNames // unit not set for BiltNames // standard_unit not set for BiltNames // display_unit not set for BiltNames // format not set for BiltNames // max_value not set for BiltNames // min_value not set for BiltNames // max_alarm not set for BiltNames // min_alarm not set for BiltNames // max_warning not set for BiltNames // min_warning not set for BiltNames // delta_t not set for BiltNames // delta_val not set for BiltNames biltnames->set_default_properties(biltnames_prop); // Not Polled biltnames->set_disp_level(Tango::OPERATOR); // Not memorized // BiltNames does not fire change event // BiltNames does not fire archive event // BiltNames does not fire data_ready event att_list.push_back(biltnames); // Attribute : BiltLocations BiltLocationsAttrib *biltlocations = new BiltLocationsAttrib(); Tango::UserDefaultAttrProp biltlocations_prop; biltlocations_prop.set_description("The locations of the individual Bilt power supply devices used \nfor every bilt."); // label not set for BiltLocations // unit not set for BiltLocations // standard_unit not set for BiltLocations // display_unit not set for BiltLocations // format not set for BiltLocations // max_value not set for BiltLocations // min_value not set for BiltLocations // max_alarm not set for BiltLocations // min_alarm not set for BiltLocations // max_warning not set for BiltLocations // min_warning not set for BiltLocations // delta_t not set for BiltLocations // delta_val not set for BiltLocations biltlocations->set_default_properties(biltlocations_prop); // Not Polled biltlocations->set_disp_level(Tango::OPERATOR); // Not memorized // BiltLocations does not fire change event // BiltLocations does not fire archive event // BiltLocations does not fire data_ready event att_list.push_back(biltlocations); // Create a list of static attributes create_static_attribute_list(get_class_attr()->get_attr_list()); /*----- PROTECTED REGION ID(MchBilt::Class::attribute_factory_after) ENABLED START -----*/ // Add your own code /*----- PROTECTED REGION END -----*/ // MchBilt::Class::attribute_factory_after } //-------------------------------------------------------- /** * Method : MchBilt::MchBiltClass::command_factory() * Description : Create the command object(s) * and store them in the command list */ //-------------------------------------------------------- void MchBiltClass::command_factory() { /*----- PROTECTED REGION ID(MchBilt::Class::command_factory_before) ENABLED START -----*/ /*----- PROTECTED REGION END -----*/ // MchBilt::Class::command_factory_before OnClass *pOnCmd = new OnClass("On", Tango::DEV_VOID, Tango::DEV_VOID, "", "", Tango::OPERATOR); command_list.push_back(pOnCmd); OffClass *pOffCmd = new OffClass("Off", Tango::DEV_VOID, Tango::DEV_VOID, "", "", Tango::OPERATOR); command_list.push_back(pOffCmd); ResetClass *pResetCmd = new ResetClass("Reset", Tango::DEV_VOID, Tango::DEV_VOID, "", "", Tango::OPERATOR); command_list.push_back(pResetCmd); SetpointCheckClass *pSetpointCheckCmd = new SetpointCheckClass("SetpointCheck", Tango::DEVVAR_DOUBLEARRAY, Tango::DEV_SHORT, "", "", Tango::OPERATOR); command_list.push_back(pSetpointCheckCmd); /*----- PROTECTED REGION ID(MchBilt::Class::command_factory_after) ENABLED START -----*/ /*----- PROTECTED REGION END -----*/ // MchBilt::Class::command_factory_after } //=================================================================== // Dynamic attributes related methods //=================================================================== //-------------------------------------------------------- /** * method : MchBiltClass::create_static_attribute_list * description : Create the a list of static attributes * * @param att_list the ceated attribute list */ //-------------------------------------------------------- void MchBiltClass::create_static_attribute_list(vector &att_list) { for (unsigned long i=0 ; iget_name()); transform(att_name.begin(), att_name.end(), att_name.begin(), ::tolower); defaultAttList.push_back(att_name); } cout2 << defaultAttList.size() << " attributes in default list" << endl; /*----- PROTECTED REGION ID(MchBilt::Class::create_static_att_list) ENABLED START -----*/ /*----- PROTECTED REGION END -----*/ // MchBilt::Class::create_static_att_list } //-------------------------------------------------------- /** * method : MchBiltClass::erase_dynamic_attributes * description : delete the dynamic attributes if any. * * @param devlist_ptr the device list pointer * @param list of all attributes */ //-------------------------------------------------------- void MchBiltClass::erase_dynamic_attributes(const Tango::DevVarStringArray *devlist_ptr, vector &att_list) { Tango::Util *tg = Tango::Util::instance(); for (unsigned long i=0 ; ilength() ; i++) { Tango::DeviceImpl *dev_impl = tg->get_device_by_name(((string)(*devlist_ptr)[i]).c_str()); MchBilt *dev = static_cast (dev_impl); vector &dev_att_list = dev->get_device_attr()->get_attribute_list(); vector::iterator ite_att; for (ite_att=dev_att_list.begin() ; ite_att != dev_att_list.end() ; ++ite_att) { string att_name((*ite_att)->get_name_lower()); if ((att_name == "state") || (att_name == "status")) continue; vector::iterator ite_str = find(defaultAttList.begin(), defaultAttList.end(), att_name); if (ite_str == defaultAttList.end()) { cout2 << att_name << " is a UNWANTED dynamic attribute for device " << (*devlist_ptr)[i] << endl; Tango::Attribute &att = dev->get_device_attr()->get_attr_by_name(att_name.c_str()); dev->remove_attribute(att_list[att.get_attr_idx()],true); --ite_att; } } } /*----- PROTECTED REGION ID(MchBilt::Class::erase_dynamic_attributes) ENABLED START -----*/ /*----- PROTECTED REGION END -----*/ // MchBilt::Class::erase_dynamic_attributes } /*----- PROTECTED REGION ID(MchBilt::Class::Additional Methods) ENABLED START -----*/ /*----- PROTECTED REGION END -----*/ // MchBilt::Class::Additional Methods } // namespace Node-path: powersupply/itest/MchBilt/trunk/MchBiltClass.h Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 9516 Text-content-md5: dd774ac7c414861c2d9460e7f096099b Content-length: 9526 PROPS-END /*----- PROTECTED REGION ID(MchBiltClass.h) ENABLED START -----*/ //============================================================================= // // file : MchBiltClass.h // // description : Include for the MchBiltClass root class. // This class is the singleton class for. // the MchBilt device class.. // It contains all properties and methods which the . // MchBilt requires only once e.g. the commands. // // project : Multi channel Bilt class for the ESRF storage ring. // // $Author: meyer $ // // $Revision: 1.1.1.1 $ // $Date: 2011-08-04 14:42:06 $ // // SVN only: // $HeadURL: $ // // CVS only: // $Source: /segfs/tango/cvsroot/cppserver/machine/powersupply/SrSteerers/tango/MchBilt/MchBiltClass.h,v $ // $Log: not supported by cvs2svn $ // //============================================================================= // This file is generated by POGO // (Program Obviously used to Generate tango Object) //============================================================================= #ifndef MCHBILTCLASS_H #define MCHBILTCLASS_H #include #include /*----- PROTECTED REGION END -----*/ namespace MchBilt_ns { /*----- PROTECTED REGION ID(MchBilt::classes for dynamic creation) ENABLED START -----*/ /*----- PROTECTED REGION END -----*/ // MchBilt::classes for dynamic creation //========================================= // Define classes for attributes //========================================= // Attribute Current class definition class CurrentAttrib: public Tango::SpectrumAttr { public: CurrentAttrib():SpectrumAttr("Current", Tango::DEV_DOUBLE, Tango::READ_WRITE, 256) {}; ~CurrentAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_Current(att);} virtual void write(Tango::DeviceImpl *dev,Tango::WAttribute &att) {(static_cast(dev))->write_Current(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_Current_allowed(ty);} }; // Attribute Voltage class definition class VoltageAttrib: public Tango::SpectrumAttr { public: VoltageAttrib():SpectrumAttr("Voltage", Tango::DEV_DOUBLE, Tango::READ, 256) {}; ~VoltageAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_Voltage(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_Voltage_allowed(ty);} }; // Attribute SetCurrentAverage class definition class SetCurrentAverageAttrib: public Tango::SpectrumAttr { public: SetCurrentAverageAttrib():SpectrumAttr("SetCurrentAverage", Tango::DEV_DOUBLE, Tango::READ, 256) {}; ~SetCurrentAverageAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_SetCurrentAverage(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_SetCurrentAverage_allowed(ty);} }; // Attribute SetCurrentRMS class definition class SetCurrentRMSAttrib: public Tango::SpectrumAttr { public: SetCurrentRMSAttrib():SpectrumAttr("SetCurrentRMS", Tango::DEV_DOUBLE, Tango::READ, 256) {}; ~SetCurrentRMSAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_SetCurrentRMS(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_SetCurrentRMS_allowed(ty);} }; // Attribute BiltStates class definition class BiltStatesAttrib: public Tango::SpectrumAttr { public: BiltStatesAttrib():SpectrumAttr("BiltStates", Tango::DEV_STATE, Tango::READ, 256) {}; ~BiltStatesAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_BiltStates(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_BiltStates_allowed(ty);} }; // Attribute BiltNames class definition class BiltNamesAttrib: public Tango::SpectrumAttr { public: BiltNamesAttrib():SpectrumAttr("BiltNames", Tango::DEV_STRING, Tango::READ, 256) {}; ~BiltNamesAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_BiltNames(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_BiltNames_allowed(ty);} }; // Attribute BiltLocations class definition class BiltLocationsAttrib: public Tango::SpectrumAttr { public: BiltLocationsAttrib():SpectrumAttr("BiltLocations", Tango::DEV_STRING, Tango::READ, 256) {}; ~BiltLocationsAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_BiltLocations(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_BiltLocations_allowed(ty);} }; //========================================= // Define classes for commands //========================================= // Command On class definition class OnClass : public Tango::Command { public: OnClass(const char *name, Tango::CmdArgType in, Tango::CmdArgType out, const char *in_desc, const char *out_desc, Tango::DispLevel level) :Command(name,in,out,in_desc,out_desc, level) {}; OnClass(const char *name, Tango::CmdArgType in, Tango::CmdArgType out) :Command(name,in,out) {}; ~OnClass() {}; virtual CORBA::Any *execute (Tango::DeviceImpl *dev, const CORBA::Any &any); virtual bool is_allowed (Tango::DeviceImpl *dev, const CORBA::Any &any) {return (static_cast(dev))->is_On_allowed(any);} }; // Command Off class definition class OffClass : public Tango::Command { public: OffClass(const char *name, Tango::CmdArgType in, Tango::CmdArgType out, const char *in_desc, const char *out_desc, Tango::DispLevel level) :Command(name,in,out,in_desc,out_desc, level) {}; OffClass(const char *name, Tango::CmdArgType in, Tango::CmdArgType out) :Command(name,in,out) {}; ~OffClass() {}; virtual CORBA::Any *execute (Tango::DeviceImpl *dev, const CORBA::Any &any); virtual bool is_allowed (Tango::DeviceImpl *dev, const CORBA::Any &any) {return (static_cast(dev))->is_Off_allowed(any);} }; // Command Reset class definition class ResetClass : public Tango::Command { public: ResetClass(const char *name, Tango::CmdArgType in, Tango::CmdArgType out, const char *in_desc, const char *out_desc, Tango::DispLevel level) :Command(name,in,out,in_desc,out_desc, level) {}; ResetClass(const char *name, Tango::CmdArgType in, Tango::CmdArgType out) :Command(name,in,out) {}; ~ResetClass() {}; virtual CORBA::Any *execute (Tango::DeviceImpl *dev, const CORBA::Any &any); virtual bool is_allowed (Tango::DeviceImpl *dev, const CORBA::Any &any) {return (static_cast(dev))->is_Reset_allowed(any);} }; // Command SetpointCheck class definition class SetpointCheckClass : public Tango::Command { public: SetpointCheckClass(const char *name, Tango::CmdArgType in, Tango::CmdArgType out, const char *in_desc, const char *out_desc, Tango::DispLevel level) :Command(name,in,out,in_desc,out_desc, level) {}; SetpointCheckClass(const char *name, Tango::CmdArgType in, Tango::CmdArgType out) :Command(name,in,out) {}; ~SetpointCheckClass() {}; virtual CORBA::Any *execute (Tango::DeviceImpl *dev, const CORBA::Any &any); virtual bool is_allowed (Tango::DeviceImpl *dev, const CORBA::Any &any) {return (static_cast(dev))->is_SetpointCheck_allowed(any);} }; /** * The TemplateDevServClass singleton definition */ class #ifdef _TG_WINDOWS_ __declspec(dllexport) #endif MchBiltClass : public Tango::DeviceClass { /*----- PROTECTED REGION ID(MchBilt::Additionnal DServer data members) ENABLED START -----*/ public: /*----- PROTECTED REGION END -----*/ // MchBilt::Additionnal DServer data members public: // write class properties data members Tango::DbData cl_prop; Tango::DbData cl_def_prop; Tango::DbData dev_def_prop; // Method prototypes static MchBiltClass *init(const char *); static MchBiltClass *instance(); ~MchBiltClass(); Tango::DbDatum get_class_property(string &); Tango::DbDatum get_default_device_property(string &); Tango::DbDatum get_default_class_property(string &); protected: MchBiltClass(string &); static MchBiltClass *_instance; void command_factory(); void attribute_factory(vector &); void write_class_property(); void set_default_property(); void get_class_property(); string get_cvstag(); string get_cvsroot(); private: void device_factory(const Tango::DevVarStringArray *); void create_static_attribute_list(vector &); void erase_dynamic_attributes(const Tango::DevVarStringArray *,vector &); vector defaultAttList; }; } // namespace #endif // MCHBILTCLASS_H Node-path: powersupply/itest/MchBilt/trunk/MchBiltStateMachine.cpp Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 8964 Text-content-md5: 1c40c33f19d56357d6dbd87c79d3da36 Content-length: 8974 PROPS-END /*----- PROTECTED REGION ID(MchBiltStateMachine.cpp) ENABLED START -----*/ static const char *RcsId = "$Id: MchBiltStateMachine.cpp,v 1.1.1.1 2011-08-04 14:42:06 meyer Exp $"; //============================================================================= // // file : MchBiltStateMachine.cpp // // description : C++ source for the MchBilt and its alowed // methods for commands and attributes // // project : Multi channel Bilt class for the ESRF storage ring. // // $Author: meyer $ // // $Revision: 1.1.1.1 $ // $Date: 2011-08-04 14:42:06 $ // // SVN only: // $HeadURL: $ // // CVS only: // $Source: /segfs/tango/cvsroot/cppserver/machine/powersupply/SrSteerers/tango/MchBilt/MchBiltStateMachine.cpp,v $ // $Log: not supported by cvs2svn $ // //============================================================================= // This file is generated by POGO // (Program Obviously used to Generate tango Object) //============================================================================= #include #include /*----- PROTECTED REGION END -----*/ /* * MchBilt states description: * * ON : All bilts switched on. * OFF : One or more bilts are off. * ALARM : Alarm detected on one or more bilts. * FAULT : Fault detected on one or more bilts. * UNKNOWN : Connection problems with one or more bilts. */ namespace MchBilt_ns { //================================================= // Attributes Allowed Methods //================================================= //-------------------------------------------------------- /** * Method : MchBilt::is_CurrentState_allowed() * Description : Execution allowed for Current attribute. */ //-------------------------------------------------------- bool MchBilt::is_Current_allowed(Tango::AttReqType type) { // Check if access type. if ( type!=Tango::READ_REQ ) { // Not any excluded states for Current attribute in WRITE access. /*----- PROTECTED REGION ID(MchBilt::CurrentStateAllowed_WRITE) ENABLED START -----*/ /*----- PROTECTED REGION END -----*/ // MchBilt::CurrentStateAllowed_WRITE return true; } else // Not any excluded states for Current attribute in READ access. /*----- PROTECTED REGION ID(MchBilt::read_CurrentStateAllowed_READ) ENABLED START -----*/ /*----- PROTECTED REGION END -----*/ // MchBilt::read_CurrentStateAllowed_READ return true; } //-------------------------------------------------------- /** * Method : MchBilt::is_VoltageState_allowed() * Description : Execution allowed for Voltage attribute. */ //-------------------------------------------------------- bool MchBilt::is_Voltage_allowed(Tango::AttReqType type) { // Not any excluded states for Voltage attribute in READ access. /*----- PROTECTED REGION ID(MchBilt::read_VoltageStateAllowed_READ) ENABLED START -----*/ /*----- PROTECTED REGION END -----*/ // MchBilt::read_VoltageStateAllowed_READ return true; } //-------------------------------------------------------- /** * Method : MchBilt::is_SetCurrentAverageState_allowed() * Description : Execution allowed for SetCurrentAverage attribute. */ //-------------------------------------------------------- bool MchBilt::is_SetCurrentAverage_allowed(Tango::AttReqType type) { // Not any excluded states for SetCurrentAverage attribute in READ access. /*----- PROTECTED REGION ID(MchBilt::read_SetCurrentAverageStateAllowed_READ) ENABLED START -----*/ /*----- PROTECTED REGION END -----*/ // MchBilt::read_SetCurrentAverageStateAllowed_READ return true; } //-------------------------------------------------------- /** * Method : MchBilt::is_SetCurrentRMSState_allowed() * Description : Execution allowed for SetCurrentRMS attribute. */ //-------------------------------------------------------- bool MchBilt::is_SetCurrentRMS_allowed(Tango::AttReqType type) { // Not any excluded states for SetCurrentRMS attribute in READ access. /*----- PROTECTED REGION ID(MchBilt::read_SetCurrentRMSStateAllowed_READ) ENABLED START -----*/ /*----- PROTECTED REGION END -----*/ // MchBilt::read_SetCurrentRMSStateAllowed_READ return true; } //-------------------------------------------------------- /** * Method : MchBilt::is_BiltStatesState_allowed() * Description : Execution allowed for BiltStates attribute. */ //-------------------------------------------------------- bool MchBilt::is_BiltStates_allowed(Tango::AttReqType type) { // Not any excluded states for BiltStates attribute in READ access. /*----- PROTECTED REGION ID(MchBilt::read_BiltStatesStateAllowed_READ) ENABLED START -----*/ /*----- PROTECTED REGION END -----*/ // MchBilt::read_BiltStatesStateAllowed_READ return true; } //-------------------------------------------------------- /** * Method : MchBilt::is_BiltNamesState_allowed() * Description : Execution allowed for BiltNames attribute. */ //-------------------------------------------------------- bool MchBilt::is_BiltNames_allowed(Tango::AttReqType type) { // Not any excluded states for BiltNames attribute in READ access. /*----- PROTECTED REGION ID(MchBilt::read_BiltNamesStateAllowed_READ) ENABLED START -----*/ /*----- PROTECTED REGION END -----*/ // MchBilt::read_BiltNamesStateAllowed_READ return true; } //-------------------------------------------------------- /** * Method : MchBilt::is_BiltLocationsState_allowed() * Description : Execution allowed for BiltLocations attribute. */ //-------------------------------------------------------- bool MchBilt::is_BiltLocations_allowed(Tango::AttReqType type) { // Not any excluded states for BiltLocations attribute in READ access. /*----- PROTECTED REGION ID(MchBilt::read_BiltLocationsStateAllowed_READ) ENABLED START -----*/ /*----- PROTECTED REGION END -----*/ // MchBilt::read_BiltLocationsStateAllowed_READ return true; } //================================================= // Dynamic Attributes Allowed Methods //================================================= /*----- PROTECTED REGION ID(MchBilt::are_dynamic_attributes_allowed) ENABLED START -----*/ // Add your code to check if dynamic attributes are alowed /*----- PROTECTED REGION END -----*/ // MchBilt::are_dynamic_attributes_allowed //================================================= // Commands Allowed Methods //================================================= //-------------------------------------------------------- /** * Method : MchBilt::is_OnState_allowed() * Description : Execution allowed for On command. */ //-------------------------------------------------------- bool MchBilt::is_On_allowed(const CORBA::Any &any) { if ( // Compare device state with not allowed states for command get_state() == Tango::ON || get_state() == Tango::FAULT || get_state() == Tango::UNKNOWN) { /*----- PROTECTED REGION ID(MchBilt::OnStateAllowed) ENABLED START -----*/ /*----- PROTECTED REGION END -----*/ // MchBilt::OnStateAllowed return false; } return true; } //-------------------------------------------------------- /** * Method : MchBilt::is_OffState_allowed() * Description : Execution allowed for Off command. */ //-------------------------------------------------------- bool MchBilt::is_Off_allowed(const CORBA::Any &any) { // Not any excluded states for Off command. /*----- PROTECTED REGION ID(MchBilt::OffStateAllowed) ENABLED START -----*/ /*----- PROTECTED REGION END -----*/ // MchBilt::OffStateAllowed return true; } //-------------------------------------------------------- /** * Method : MchBilt::is_ResetState_allowed() * Description : Execution allowed for Reset command. */ //-------------------------------------------------------- bool MchBilt::is_Reset_allowed(const CORBA::Any &any) { // Not any excluded states for Reset command. /*----- PROTECTED REGION ID(MchBilt::ResetStateAllowed) ENABLED START -----*/ /*----- PROTECTED REGION END -----*/ // MchBilt::ResetStateAllowed return true; } //-------------------------------------------------------- /** * Method : MchBilt::is_SetpointCheckState_allowed() * Description : Execution allowed for SetpointCheck command. */ //-------------------------------------------------------- bool MchBilt::is_SetpointCheck_allowed(const CORBA::Any &any) { if ( // Compare device state with not allowed states for command get_state() == Tango::FAULT || get_state() == Tango::UNKNOWN) { /*----- PROTECTED REGION ID(MchBilt::SetpointCheckStateAllowed) ENABLED START -----*/ /*----- PROTECTED REGION END -----*/ // MchBilt::SetpointCheckStateAllowed return false; } return true; } /*----- PROTECTED REGION ID(MchBilt::are_dynamic_commands_allowed) ENABLED START -----*/ // Add your code to check if dynamic commands are alowed /*----- PROTECTED REGION END -----*/ // MchBilt::are_dynamic_commands_allowed } // namespace MchBilt_ns Node-path: powersupply/itest/MchBilt/trunk/main.cpp Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 2052 Text-content-md5: 81018138a047139f57b299b87951a6d1 Content-length: 2062 PROPS-END /*PROTECTED REGION ID(MchBilt::main.cpp) ENABLED START*/ static const char *RcsId = "$Id: main.cpp,v 1.1.1.1 2011-08-04 14:42:06 meyer Exp $"; //============================================================================= // // file : MchBilt.cpp // // description : C++ source for the MchBilt device server main. // The main rule is to initialise (and create) the Tango // system and to create the DServerClass singleton. // The main should be the same for every Tango device server. // // project : Multi channel Bilt class for the ESRF storage ring. // // $Author: meyer $ // // $Revision: 1.1.1.1 $ // $Date: 2011-08-04 14:42:06 $ // // SVN only: // $HeadURL: $ // // CVS only: // $Source: /segfs/tango/cvsroot/cppserver/machine/powersupply/SrSteerers/tango/MchBilt/main.cpp,v $ // $Log: not supported by cvs2svn $ // //============================================================================= // This file is generated by POGO // (Program Obviously used to Generate tango Object) //============================================================================= #include int main(int argc,char *argv[]) { Tango::Util *tg = NULL; try { // Initialise the device server //---------------------------------------- tg = Tango::Util::init(argc,argv); // Create the device server singleton // which will create everything //---------------------------------------- tg->server_init(false); // Run the endless loop //---------------------------------------- cout << "Ready to accept request" << endl; tg->server_run(); } catch (bad_alloc) { cout << "Can't allocate memory to store device object !!!" << endl; cout << "Exiting" << endl; } catch (CORBA::Exception &e) { Tango::Except::print_exception(e); cout << "Received a CORBA_Exception" << endl; cout << "Exiting" << endl; } if (tg!=NULL) tg->server_cleanup(); return(0); } /*PROTECTED REGION END*/ //======================================================== Revision-number: 84 Prop-content-length: 145 Content-length: 145 K 8 svn:date V 27 2011-08-04T14:42:07.000000Z K 7 svn:log V 71 This commit was manufactured by cvs2svn to create tag 'baseline-1_1_1'. PROPS-END Node-path: powersupply/itest/MchBilt/tags/baseline-1_1_1 Node-kind: dir Node-action: add Node-copyfrom-rev: 83 Node-copyfrom-path: powersupply/itest/MchBilt/trunk Revision-number: 85 Prop-content-length: 177 Content-length: 177 K 10 svn:author V 5 meyer K 8 svn:date V 27 2011-08-04T15:48:33.000000Z K 7 svn:log V 77 Added the missing commands and attributes. Made the acquisition thread work. PROPS-END Node-path: powersupply/itest/MchBilt/trunk/AcquisitionThread.cpp Node-kind: file Node-action: change Text-content-length: 5852 Text-content-md5: 8e53c8c9430a08d0e936e1bbe8d93a6c Content-length: 5852 #include #include namespace MchBilt_ns { AcquisitionThread::AcquisitionThread (MchBilt *_mch_bilt, omni_mutex &d_m, omni_mutex &g_m) : Tango::LogAdapter(_mch_bilt), omni_thread(), data_mutex(d_m), group_mutex(g_m) { mch_bilt = _mch_bilt; last_update.tv_sec = 0; last_update.tv_usec = 0; updatePeriod = mch_bilt->updatePeriod; nu_attributes = mch_bilt->attributes.size(); nu_channels = mch_bilt->mchBiltChannels; // cout << "AcquisitionThread::AcquisitionThread(): go to start thread ...\n"; start_undetached(); } //+------------------------------------------------------------------ /** * method: run_undetached() * * description: * */ //+------------------------------------------------------------------ void *AcquisitionThread::run_undetached(void*) { bool exit; INFO_STREAM << " AcquisitionThread::run_undetached() entering endless loop!" << endl; while (1) { { // copy to local variables omni_mutex_lock l(data_mutex); exit = mch_bilt->exit_thread; } /* exit the calculation thread */ if ( exit == true ) { break; } struct timeval now; gettimeofday (&now, NULL); double delay = (now.tv_sec * 1e6 + now.tv_usec) - (last_update.tv_sec * 1e6 + last_update.tv_usec); // only read new data every updatePeriod ms!! if ( delay < (updatePeriod * 1000) ) { // 50 ms struct timespec sleep_time = {0, 50000000}; nanosleep(&sleep_time, NULL); continue; } else { INFO_STREAM << "delay = " << delay/1000 << "ms" << endl; last_update = now; } try { // prepare data with default values Tango::GroupAttrReplyList bilt_data; current.clear(); voltage.clear(); current_average.clear(); current_rms.clear(); states.clear(); dev_error_list.clear(); current.assign(3*nu_channels, nan("NaN")); voltage.assign(3*nu_channels, nan("NaN")); current_average.assign(3*nu_channels, nan("NaN")); current_rms.assign(3*nu_channels, nan("NaN")); states.assign(nu_channels, Tango::DISABLE); { struct timeval st_group; gettimeofday (&st_group, NULL); // group reading of all bilts omni_mutex_lock l(group_mutex); Tango::GroupReply::enable_exception(true); bilt_data = mch_bilt->bilts->read_attributes (mch_bilt->attributes, true); struct timeval sp_group; gettimeofday (&sp_group, NULL); double g_time = (sp_group.tv_sec * 1e6 + sp_group.tv_usec) - (st_group.tv_sec * 1e6 + st_group.tv_usec); INFO_STREAM << "Time in group call = " << g_time/1000 << "ms" << endl; } // check for errors if ( bilt_data.has_failed() ) { for (long i=0; i> states[index]; // extract the read spectra vector ch_current; bilt_data[i + 1] >> ch_current; vector ch_voltage; bilt_data[i+2] >> ch_voltage; vector ch_current_average; bilt_data[i+3] >> ch_current_average; vector ch_current_rms; bilt_data[i+4] >> ch_current_rms; for ( long ch=0; ch<3; ch++ ) { current[3*index + ch] = ch_current[ch]; voltage[3*index + ch] = ch_voltage[ch]; current_average[3*index + ch] = ch_current_average[ch]; current_rms[3*index + ch] = ch_current_rms[ch]; } } catch (const Tango::DevFailed &e) { // set data values states[index] = Tango::UNKNOWN; for (long ch=0; ch<3; ch++ ) { current[3*index + ch] = nan("NaN"); voltage[3*index + ch] = nan("NaN"); current_average[3*index + ch] = nan("NaN"); current_rms[3*index + ch] = nan("NaN"); } DeviceError dev_error; dev_error.dev_name = bilt_data[i].dev_name(); dev_error.err_list = e.errors; dev_error_list.push_back (dev_error); } } // copy data after acquisition { omni_mutex_lock l(data_mutex); mch_bilt->acquisition_state = Tango::ON; mch_bilt->states = states; mch_bilt->current = current; mch_bilt->voltage = voltage; mch_bilt->current_average = current_average; mch_bilt->current_rms = current_rms; mch_bilt->dev_error_list.clear(); for (long i=0; idev_error_list.push_back (dev_error_list[i]); } // store time when data was read struct timeval now; gettimeofday (&now, NULL); mch_bilt->data_read_time = now; } bilt_data.reset(); } catch (const Tango::DevFailed &e) { omni_mutex_lock l(data_mutex); mch_bilt->acquisition_state = Tango::UNKNOWN; mch_bilt->acquisition_error = e.errors; ERROR_STREAM << "Problem in aquisition loop : " << endl; const Tango::DevErrorList& el = e.errors; for (int err = 0; err < el.length(); err++) { ERROR_STREAM << el[err].desc.in() << endl; } } } return NULL; } } // namespace Node-path: powersupply/itest/MchBilt/trunk/MchBilt.cpp Node-kind: file Node-action: change Text-content-length: 34962 Text-content-md5: 6a24382a82934a060523f4725d7635bf Content-length: 34962 /*----- PROTECTED REGION ID(MchBilt.cpp) ENABLED START -----*/ static const char *RcsId = "$Id: MchBilt.cpp,v 1.2 2011-08-04 15:48:33 meyer Exp $"; //============================================================================= // // file : MchBilt.cpp // // description : C++ source for the MchBilt and its commands. // The class is derived from Device. It represents the // CORBA servant object which will be accessed from the // network. All commands which can be executed on the // MchBilt are implemented in this file. // // project : Multi channel Bilt class for the ESRF storage ring. // // $Author: meyer $ // // $Revision: 1.2 $ // $Date: 2011-08-04 15:48:33 $ // // SVN only: // $HeadURL: $ // // CVS only: // $Source: /segfs/tango/cvsroot/cppserver/machine/powersupply/SrSteerers/tango/MchBilt/MchBilt.cpp,v $ // $Log: not supported by cvs2svn $ // Revision 1.1.1.1 2011/08/04 14:42:06 meyer // Imported using TkCVS // // //============================================================================= // This file is generated by POGO // (Program Obviously used to Generate tango Object) //============================================================================= #include #include #include #include #include /*----- PROTECTED REGION END -----*/ /** * MchBilt class description: * The multi channel Bilt device regroups all Bilt powersupply device used for * the ESRF storage ring steerers * Reading and setting of currents and voltages is done by spectrum attributes, which * contain the values of the individual Bilt devices. */ //================================================================ // // The following table gives the correspondence // between command and method names. // // Command name | Method name //---------------------------------------------------------------- // State | dev_state // Status | dev_status // On | on // Off | off // Reset | reset // EnableAcCurrent | enable_ac_current // DisableAcCurrent | disable_ac_current //================================================================ // Attributes managed are: // Current: // Voltage: // SetCurrentAverage: // SetCurrentRMS: // FramesPerSecond: // ErrorsPerSecond: // ErrorCounter: // Impedance: // Temperature: // BiltStates: // BiltNames: // BiltLocations: // DisableACCurrent: namespace MchBilt_ns { /*----- PROTECTED REGION ID(MchBilt::namespace_starting) ENABLED START -----*/ // static initializations /*----- PROTECTED REGION END -----*/ // MchBilt::namespace_starting //-------------------------------------------------------- /** * Method : MchBilt::MchBilt() * Description : Constructors for a Tango device * implementing the class MchBilt */ //-------------------------------------------------------- MchBilt::MchBilt(Tango::DeviceClass *cl, string &s) : Tango::Device_4Impl(cl, s.c_str()) { /*----- PROTECTED REGION ID(MchBilt::constructor_1) ENABLED START -----*/ init_device(); /*----- PROTECTED REGION END -----*/ // MchBilt::constructor_1 } //-------------------------------------------------------- MchBilt::MchBilt(Tango::DeviceClass *cl, const char *s) : Tango::Device_4Impl(cl, s) { /*----- PROTECTED REGION ID(MchBilt::constructor_2) ENABLED START -----*/ init_device(); /*----- PROTECTED REGION END -----*/ // MchBilt::constructor_2 } //-------------------------------------------------------- MchBilt::MchBilt(Tango::DeviceClass *cl, const char *s, const char *d) : Tango::Device_4Impl(cl, s, d) { /*----- PROTECTED REGION ID(MchBilt::constructor_3) ENABLED START -----*/ init_device(); /*----- PROTECTED REGION END -----*/ // MchBilt::constructor_3 } //-------------------------------------------------------- /** * Method : MchBilt::delete_device()() * Description : will be called at device destruction or at init command */ //-------------------------------------------------------- void MchBilt::delete_device() { /*----- PROTECTED REGION ID(MchBilt::delete_device) ENABLED START -----*/ // Delete device allocated objects // Delete device allocated objects if ( acquisition_thread != NULL ) { data_mutex.lock(); exit_thread = true; data_mutex.unlock(); // join now the thread until it exits int *rv; acquisition_thread->join((void **)&rv); cout << "MchBilt::delete_device(): Exit acquisition thread !!!" << endl; } if ( bilts != NULL ) { delete (bilts); bilts = NULL; } /*----- PROTECTED REGION END -----*/ // MchBilt::delete_device } //-------------------------------------------------------- /** * Method : MchBilt::init_device() * Description : // will be called at device initialization. */ //-------------------------------------------------------- void MchBilt::init_device() { DEBUG_STREAM << "MchBilt::init_device() create device " << device_name << endl; /*----- PROTECTED REGION ID(MchBilt::init_device_before) ENABLED START -----*/ // Initialization before get_device_property() call /*----- PROTECTED REGION END -----*/ // MchBilt::init_device_before // Get the device properties (if any) from database get_device_property(); /*----- PROTECTED REGION ID(MchBilt::init_device) ENABLED START -----*/ // Initialize device try { // initialise the group bilts = new Tango::Group ("Bilts"); bilts->add (biltNames); // initialise the list of attributes to be read attributes.push_back("State"); attributes.push_back("Currents"); attributes.push_back("Voltages"); attributes.push_back("SetCurrentsAverage"); attributes.push_back("SetCurrentsRMS"); // specify the group timeout bilts->set_timeout_millis (updatePeriod); // do a first call to create all network connections // which is very time consuming! bilt_data = bilts->read_attributes (attributes, true); cout << "Read data from " << (bilt_data.size() / attributes.size()) << " bilts!" << endl; // read the location strings of the available bilt devices read_locations(); // create the acquisition thread exit_thread = false; acquisition_thread = new AcquisitionThread(this, data_mutex, group_mutex); } catch (const Tango::DevFailed &e) { acquisition_state = Tango::UNKNOWN; acquisition_error = e.errors; } /*----- PROTECTED REGION END -----*/ // MchBilt::init_device } //-------------------------------------------------------- /** * Method : MchBilt::get_device_property() * Description : Read database to initialize property data members. */ //-------------------------------------------------------- void MchBilt::get_device_property() { /*----- PROTECTED REGION ID(MchBilt::get_device_property_before) ENABLED START -----*/ // Initialize property data members acquisition_thread = NULL; acquisition_state = Tango::UNKNOWN; bilts = NULL; mchBiltChannels = 0; struct timeval now; gettimeofday (&now, NULL); data_set_time = now; data_read_time = now; /*----- PROTECTED REGION END -----*/ // MchBilt::get_device_property_before // Read device properties from database. Tango::DbData dev_prop; dev_prop.push_back(Tango::DbDatum("BiltNames")); dev_prop.push_back(Tango::DbDatum("UpdatePeriod")); // is there at least one property to be read ? if (dev_prop.size()>0) { // Call database and extract values if (Tango::Util::instance()->_UseDb==true) get_db_device()->get_property(dev_prop); // get instance on MchBiltClass to get class property Tango::DbDatum def_prop, cl_prop; MchBiltClass *ds_class = (static_cast(get_device_class())); int i = -1; // Try to initialize BiltNames from class property cl_prop = ds_class->get_class_property(dev_prop[++i].name); if (cl_prop.is_empty()==false) cl_prop >> biltNames; else { // Try to initialize BiltNames from default device value def_prop = ds_class->get_default_device_property(dev_prop[i].name); if (def_prop.is_empty()==false) def_prop >> biltNames; } // And try to extract BiltNames value from database if (dev_prop[i].is_empty()==false) dev_prop[i] >> biltNames; // Try to initialize UpdatePeriod from class property cl_prop = ds_class->get_class_property(dev_prop[++i].name); if (cl_prop.is_empty()==false) cl_prop >> updatePeriod; else { // Try to initialize UpdatePeriod from default device value def_prop = ds_class->get_default_device_property(dev_prop[i].name); if (def_prop.is_empty()==false) def_prop >> updatePeriod; } // And try to extract UpdatePeriod value from database if (dev_prop[i].is_empty()==false) dev_prop[i] >> updatePeriod; } /*----- PROTECTED REGION ID(MchBilt::get_device_property_after) ENABLED START -----*/ // Check device property data members init // the number of channels is defined by the given number of // bilt names mchBiltChannels = biltNames.size(); // assign the data vectors with the given number of channels current.assign(3*mchBiltChannels, nan("NaN")); voltage.assign(3*mchBiltChannels, nan("NaN")); current_average.assign(3*mchBiltChannels, nan("NaN")); current_rms.assign(3*mchBiltChannels, nan("NaN")); states.assign(mchBiltChannels, Tango::DISABLE); locations.assign(mchBiltChannels, "unknown"); // initialise the names array for (int i=0; iget_database()->put_device_attribute_property(get_name(), db_data); /*----- PROTECTED REGION END -----*/ // MchBilt::get_device_property_after } //-------------------------------------------------------- /** * Method : MchBilt::always_executed_hook() * Description : method always executed before any command is executed */ //-------------------------------------------------------- void MchBilt::always_executed_hook() { INFO_STREAM << "MchBilt::always_executed_hook() " << device_name << endl; /*----- PROTECTED REGION ID(MchBilt::always_executed_hook) ENABLED START -----*/ // code always executed before all requests /*----- PROTECTED REGION END -----*/ // MchBilt::always_executed_hook } //-------------------------------------------------------- /** * Method : MchBilt::read_attr_hardware() * Description : Hardware acquisition for attributes. */ //-------------------------------------------------------- void MchBilt::read_attr_hardware(vector &attr_list) { DEBUG_STREAM << "MchBilt::read_attr_hardware(vector &attr_list) entering... " << endl; /*----- PROTECTED REGION ID(MchBilt::read_attr_hardware) ENABLED START -----*/ // Add your own code // Add your own code here double delay; // wait for the next data acquisition after applying a new setpoint { omni_mutex_lock l(data_mutex); delay = (data_set_time.tv_sec * 1e6 + data_set_time.tv_usec) - (data_read_time.tv_sec * 1e6 + data_read_time.tv_usec); // cout << "delay = " << delay << endl; } while ( delay > 0 ) { // 50 ms struct timespec sleep_time = {0, 50000000}; nanosleep(&sleep_time, NULL); omni_mutex_lock l(data_mutex); delay = (data_set_time.tv_sec * 1e6 + data_set_time.tv_usec) - (data_read_time.tv_sec * 1e6 + data_read_time.tv_usec); INFO_STREAM << "MchBilt::read_attr_hardware() : waiting delay = " << delay << endl; } /*----- PROTECTED REGION END -----*/ // MchBilt::read_attr_hardware } //-------------------------------------------------------- /** * Read Current attribute * Description: Array of current values. Not yet available channels are filled * with NaN values. * * Data type: Tango::DevDouble * Attr type: Spectrum max = 500 */ //-------------------------------------------------------- void MchBilt::read_Current(Tango::Attribute &attr) { DEBUG_STREAM << "MchBilt::read_Current(Tango::Attribute &attr) entering... " << endl; /*----- PROTECTED REGION ID(MchBilt::read_Current) ENABLED START -----*/ omni_mutex_lock l(data_mutex); if ( acquisition_state == Tango::UNKNOWN ) { attr.set_quality(Tango::ATTR_INVALID); } else { // initialise the read value attr.set_value (¤t[0], current.size()); } /*----- PROTECTED REGION END -----*/ // MchBilt::read_Current } //-------------------------------------------------------- /** * Read Voltage attribute * Description: Array of voltage values. Not yet available channels are filled * with NaN values. * * Data type: Tango::DevDouble * Attr type: Spectrum max = 500 */ //-------------------------------------------------------- void MchBilt::read_Voltage(Tango::Attribute &attr) { DEBUG_STREAM << "MchBilt::read_Voltage(Tango::Attribute &attr) entering... " << endl; /*----- PROTECTED REGION ID(MchBilt::read_Voltage) ENABLED START -----*/ omni_mutex_lock l(data_mutex); if ( acquisition_state == Tango::UNKNOWN ) { attr.set_quality(Tango::ATTR_INVALID); } else { attr.set_value (&voltage[0], voltage.size()); } /*----- PROTECTED REGION END -----*/ // MchBilt::read_Voltage } //-------------------------------------------------------- /** * Read SetCurrentAverage attribute * Description: Array of calculated average AC current setpoint values per second.. When not yet available, the channels are filled * with NaN values. * * Data type: Tango::DevDouble * Attr type: Spectrum max = 500 */ //-------------------------------------------------------- void MchBilt::read_SetCurrentAverage(Tango::Attribute &attr) { DEBUG_STREAM << "MchBilt::read_SetCurrentAverage(Tango::Attribute &attr) entering... " << endl; /*----- PROTECTED REGION ID(MchBilt::read_SetCurrentAverage) ENABLED START -----*/ omni_mutex_lock l(data_mutex); if ( acquisition_state == Tango::UNKNOWN ) { attr.set_quality(Tango::ATTR_INVALID); } else { attr.set_value (¤t_average[0], current_average.size()); } /*----- PROTECTED REGION END -----*/ // MchBilt::read_SetCurrentAverage } //-------------------------------------------------------- /** * Read SetCurrentRMS attribute * Description: Array of calculated RMS AC current setpoint values per second.. When not yet available, the channels are filled * with NaN values. * * Data type: Tango::DevDouble * Attr type: Spectrum max = 500 */ //-------------------------------------------------------- void MchBilt::read_SetCurrentRMS(Tango::Attribute &attr) { DEBUG_STREAM << "MchBilt::read_SetCurrentRMS(Tango::Attribute &attr) entering... " << endl; /*----- PROTECTED REGION ID(MchBilt::read_SetCurrentRMS) ENABLED START -----*/ omni_mutex_lock l(data_mutex); if ( acquisition_state == Tango::UNKNOWN ) { attr.set_quality(Tango::ATTR_INVALID); } else { attr.set_value (¤t_rms[0], current_rms.size()); } /*----- PROTECTED REGION END -----*/ // MchBilt::read_SetCurrentRMS } //-------------------------------------------------------- /** * Read FramesPerSecond attribute * Description: Array of error frames per second values. Not yet available channels are filled * with NaN values. * * Data type: Tango::DevULong * Attr type: Spectrum max = 500 */ //-------------------------------------------------------- void MchBilt::read_FramesPerSecond(Tango::Attribute &attr) { DEBUG_STREAM << "MchBilt::read_FramesPerSecond(Tango::Attribute &attr) entering... " << endl; /*----- PROTECTED REGION ID(MchBilt::read_FramesPerSecond) ENABLED START -----*/ // Set the attribute value attr.set_value(attr_FramesPerSecond_read, 500); /*----- PROTECTED REGION END -----*/ // MchBilt::read_FramesPerSecond } //-------------------------------------------------------- /** * Read ErrorsPerSecond attribute * Description: Array of error errors per second values. Not yet available channels are filled * with NaN values. * * Data type: Tango::DevULong * Attr type: Spectrum max = 500 */ //-------------------------------------------------------- void MchBilt::read_ErrorsPerSecond(Tango::Attribute &attr) { DEBUG_STREAM << "MchBilt::read_ErrorsPerSecond(Tango::Attribute &attr) entering... " << endl; /*----- PROTECTED REGION ID(MchBilt::read_ErrorsPerSecond) ENABLED START -----*/ // Set the attribute value attr.set_value(attr_ErrorsPerSecond_read, 500); /*----- PROTECTED REGION END -----*/ // MchBilt::read_ErrorsPerSecond } //-------------------------------------------------------- /** * Read ErrorCounter attribute * Description: Array of error counter values. Not yet available channels are filled * with NaN values. * * Data type: Tango::DevULong * Attr type: Spectrum max = 500 */ //-------------------------------------------------------- void MchBilt::read_ErrorCounter(Tango::Attribute &attr) { DEBUG_STREAM << "MchBilt::read_ErrorCounter(Tango::Attribute &attr) entering... " << endl; /*----- PROTECTED REGION ID(MchBilt::read_ErrorCounter) ENABLED START -----*/ // Set the attribute value attr.set_value(attr_ErrorCounter_read, 500); /*----- PROTECTED REGION END -----*/ // MchBilt::read_ErrorCounter } //-------------------------------------------------------- /** * Read Impedance attribute * Description: Array of impedance values. Not yet available channels are filled * with NaN values. * * Data type: Tango::DevDouble * Attr type: Spectrum max = 500 */ //-------------------------------------------------------- void MchBilt::read_Impedance(Tango::Attribute &attr) { DEBUG_STREAM << "MchBilt::read_Impedance(Tango::Attribute &attr) entering... " << endl; /*----- PROTECTED REGION ID(MchBilt::read_Impedance) ENABLED START -----*/ // Set the attribute value attr.set_value(attr_Impedance_read, 500); /*----- PROTECTED REGION END -----*/ // MchBilt::read_Impedance } //-------------------------------------------------------- /** * Read Temperature attribute * Description: Array of temperature values. Not yet available channels are filled * with NaN values. * * Data type: Tango::DevDouble * Attr type: Spectrum max = 1000 */ //-------------------------------------------------------- void MchBilt::read_Temperature(Tango::Attribute &attr) { DEBUG_STREAM << "MchBilt::read_Temperature(Tango::Attribute &attr) entering... " << endl; /*----- PROTECTED REGION ID(MchBilt::read_Temperature) ENABLED START -----*/ // Set the attribute value attr.set_value(attr_Temperature_read, 1000); /*----- PROTECTED REGION END -----*/ // MchBilt::read_Temperature } //-------------------------------------------------------- /** * Read BiltStates attribute * Description: The states of the individual bilt devices. * * Data type: Tango::DevState * Attr type: Spectrum max = 256 */ //-------------------------------------------------------- void MchBilt::read_BiltStates(Tango::Attribute &attr) { DEBUG_STREAM << "MchBilt::read_BiltStates(Tango::Attribute &attr) entering... " << endl; /*----- PROTECTED REGION ID(MchBilt::read_BiltStates) ENABLED START -----*/ omni_mutex_lock l(data_mutex); if ( acquisition_state == Tango::UNKNOWN ) { attr.set_quality(Tango::ATTR_INVALID); } else { attr.set_value (&states[0], states.size()); } /*----- PROTECTED REGION END -----*/ // MchBilt::read_BiltStates } //-------------------------------------------------------- /** * Read BiltNames attribute * Description: The names of the individual bilt devices. * * Data type: Tango::DevString * Attr type: Spectrum max = 256 */ //-------------------------------------------------------- void MchBilt::read_BiltNames(Tango::Attribute &attr) { DEBUG_STREAM << "MchBilt::read_BiltNames(Tango::Attribute &attr) entering... " << endl; /*----- PROTECTED REGION ID(MchBilt::read_BiltNames) ENABLED START -----*/ attr.set_value (names_arr, mchBiltChannels); /*----- PROTECTED REGION END -----*/ // MchBilt::read_BiltNames } //-------------------------------------------------------- /** * Read BiltLocations attribute * Description: The locations of the individual Bilt power supply devices used \nfor every bilt. * * Data type: Tango::DevString * Attr type: Spectrum max = 256 */ //-------------------------------------------------------- void MchBilt::read_BiltLocations(Tango::Attribute &attr) { DEBUG_STREAM << "MchBilt::read_BiltLocations(Tango::Attribute &attr) entering... " << endl; /*----- PROTECTED REGION ID(MchBilt::read_BiltLocations) ENABLED START -----*/ // read the locations read_locations(); // initialise the locations array for (int i=0; idevice_state data member) and returns it to the caller. * * @param argin none. * @returns State Code */ //-------------------------------------------------------- Tango::DevState MchBilt::dev_state() { DEBUG_STREAM << "MchBilt::State() - " << device_name << endl; /*----- PROTECTED REGION ID(MchBilt::dev_state) ENABLED START -----*/ Tango::DevState argout; // Add your own state management // get the last state value Tango::DevState last_state = get_state(); // Problems on data acquisition? if ( acquisition_state == Tango::UNKNOWN ) { argout = Tango::UNKNOWN; } else { int nunknown = 0; int nfault = 0; int nalarm = 0; int noff = 0; int non = 0; int ndisable = 0; omni_mutex_lock l(data_mutex); for (int i=0; idevice_status data member) and returns it to the caller. * * @param argin none. * @returns Status description */ //-------------------------------------------------------- Tango::ConstDevString MchBilt::dev_status() { DEBUG_STREAM << "MchBilt::Status() - " << device_name << endl; /*----- PROTECTED REGION ID(MchBilt::dev_status) ENABLED START -----*/ // Add your own status management Tango::DevState state = dev_state(); string status; if ( acquisition_state == Tango::UNKNOWN ) { status = "Data acquisition problem: \n"; for (short i = 0; iget_device(names_arr[i]); status += dev->status() + "\n"; } } break; } case Tango::DISABLE: // When in disable state, no bilt devices are configured! break; default: // loop over all bilt states and get the names // of bilt devices in UNKNOWN state. status += "One or more bilts are in an UNKNOWN state:\n"; { omni_mutex_lock l(data_mutex); //cout << "Error list size : " << dev_error_list.size() << endl; for (long i=0; icommand_inout ("On", true); if ( bilt_data.has_failed() ) { TangoSys_OMemStream o; o << "Switching ON failed on "; for (long i=0; icommand_inout ("Off", true); if ( bilt_data.has_failed() ) { TangoSys_OMemStream o; o << "Switching OFF failed on "; for (long i=0; icommand_inout ("Reset", true); if ( bilt_data.has_failed() ) { TangoSys_OMemStream o; o << "Reset failed on "; for (long i=0; iread_attribute ("Location", true); for (long i=0; i < bilt_data.size(); i++) { try { bilt_data[i] >> locations[i]; } catch (const Tango::DevFailed &e) { // Ignore missing data. Keep the old location string! } } } /*----- PROTECTED REGION END -----*/ // MchBilt::namespace_ending } // namespace Node-path: powersupply/itest/MchBilt/trunk/MchBilt.h Node-kind: file Node-action: change Text-content-length: 11027 Text-content-md5: 065a18e839129dd08f87be6034eb81b3 Content-length: 11027 /*----- PROTECTED REGION ID(MchBilt.h) ENABLED START -----*/ //============================================================================= // // file : MchBilt.h // // description : Include for the MchBilt class. // // project : Multi channel Bilt class for the ESRF storage ring. // // $Author: meyer $ // // $Revision: 1.2 $ // $Date: 2011-08-04 15:48:33 $ // // SVN only: // $HeadURL: $ // // CVS only: // $Source: /segfs/tango/cvsroot/cppserver/machine/powersupply/SrSteerers/tango/MchBilt/MchBilt.h,v $ // $Log: not supported by cvs2svn $ // Revision 1.1.1.1 2011/08/04 14:42:06 meyer // Imported using TkCVS // // //============================================================================= // This file is generated by POGO // (Program Obviously used to Generate tango Object) //============================================================================= #ifndef MCHBILT_H #define MCHBILT_H #include typedef struct { string dev_name; Tango::DevErrorList err_list; } DeviceError; /*----- PROTECTED REGION END -----*/ /** * MchBilt class Description: * The multi channel Bilt device regroups all Bilt powersupply device used for * the ESRF storage ring steerers * Reading and setting of currents and voltages is done by spectrum attributes, which * contain the values of the individual Bilt devices. */ namespace MchBilt_ns { /*----- PROTECTED REGION ID(MchBilt::Additional Class Declarations) ENABLED START -----*/ // Additional Class Declarations class AcquisitionThread; /*----- PROTECTED REGION END -----*/ // MchBilt::Additional Class Declarations class MchBilt : public Tango::Device_4Impl { /*----- PROTECTED REGION ID(MchBilt::Data Members) ENABLED START -----*/ // Add your own data members public: /*----- PROTECTED REGION END -----*/ // MchBilt::Data Members // Device property data members public: // BiltNames: The list of available bilt device names in the order the values have to be arranged // in the Current and Voltage spectra. vector biltNames; // UpdatePeriod: The update period of all aquired values from the bilt devices in milli seconds. Tango::DevLong updatePeriod; // Attribute data members public: Tango::DevDouble *attr_Current_read; Tango::DevDouble *attr_Voltage_read; Tango::DevDouble *attr_SetCurrentAverage_read; Tango::DevDouble *attr_SetCurrentRMS_read; Tango::DevULong *attr_FramesPerSecond_read; Tango::DevULong *attr_ErrorsPerSecond_read; Tango::DevULong *attr_ErrorCounter_read; Tango::DevDouble *attr_Impedance_read; Tango::DevDouble *attr_Temperature_read; Tango::DevState *attr_BiltStates_read; Tango::DevString *attr_BiltNames_read; Tango::DevString *attr_BiltLocations_read; Tango::DevBoolean *attr_DisableACCurrent_read; // Constructors and destructors public: /** * Constructs a newly allocated Command object. * * @param cl Class. * @param s Device Name */ MchBilt(Tango::DeviceClass *cl,string &s); /** * Constructs a newly allocated Command object. * * @param cl Class. * @param s Device Name */ MchBilt(Tango::DeviceClass *cl,const char *s); /** * Constructs a newly allocated Command object. * * @param cl Class. * @param s Device name * @param d Device description. */ MchBilt(Tango::DeviceClass *cl,const char *s,const char *d); /** * The object destructor. */ ~MchBilt() {delete_device();}; // Miscellaneous methods public: /** * will be called at device destruction or at init command. */ void delete_device(); /** * Initialize the device */ virtual void init_device(); /** * Read the device properties from database */ void get_device_property(); /** * Always executed method before execution command method. */ virtual void always_executed_hook(); // Attribute methods public: /** * Method : MchBilt::read_attr_hardware() * Description : Hardware acquisition for attributes. */ virtual void read_attr_hardware(vector &attr_list); /** * Current attribute related methods. * Description: Array of current values. Not yet available channels are filled * with NaN values. * * Data type: Tango::DevDouble * Attr type: Spectrum max = 500 */ virtual void read_Current(Tango::Attribute &attr); virtual bool is_Current_allowed(Tango::AttReqType type); /** * Voltage attribute related methods. * Description: Array of voltage values. Not yet available channels are filled * with NaN values. * * Data type: Tango::DevDouble * Attr type: Spectrum max = 500 */ virtual void read_Voltage(Tango::Attribute &attr); virtual bool is_Voltage_allowed(Tango::AttReqType type); /** * SetCurrentAverage attribute related methods. * Description: Array of calculated average AC current setpoint values per second.. When not yet available, the channels are filled * with NaN values. * * Data type: Tango::DevDouble * Attr type: Spectrum max = 500 */ virtual void read_SetCurrentAverage(Tango::Attribute &attr); virtual bool is_SetCurrentAverage_allowed(Tango::AttReqType type); /** * SetCurrentRMS attribute related methods. * Description: Array of calculated RMS AC current setpoint values per second.. When not yet available, the channels are filled * with NaN values. * * Data type: Tango::DevDouble * Attr type: Spectrum max = 500 */ virtual void read_SetCurrentRMS(Tango::Attribute &attr); virtual bool is_SetCurrentRMS_allowed(Tango::AttReqType type); /** * FramesPerSecond attribute related methods. * Description: Array of error frames per second values. Not yet available channels are filled * with NaN values. * * Data type: Tango::DevULong * Attr type: Spectrum max = 500 */ virtual void read_FramesPerSecond(Tango::Attribute &attr); virtual bool is_FramesPerSecond_allowed(Tango::AttReqType type); /** * ErrorsPerSecond attribute related methods. * Description: Array of error errors per second values. Not yet available channels are filled * with NaN values. * * Data type: Tango::DevULong * Attr type: Spectrum max = 500 */ virtual void read_ErrorsPerSecond(Tango::Attribute &attr); virtual bool is_ErrorsPerSecond_allowed(Tango::AttReqType type); /** * ErrorCounter attribute related methods. * Description: Array of error counter values. Not yet available channels are filled * with NaN values. * * Data type: Tango::DevULong * Attr type: Spectrum max = 500 */ virtual void read_ErrorCounter(Tango::Attribute &attr); virtual bool is_ErrorCounter_allowed(Tango::AttReqType type); /** * Impedance attribute related methods. * Description: Array of impedance values. Not yet available channels are filled * with NaN values. * * Data type: Tango::DevDouble * Attr type: Spectrum max = 500 */ virtual void read_Impedance(Tango::Attribute &attr); virtual bool is_Impedance_allowed(Tango::AttReqType type); /** * Temperature attribute related methods. * Description: Array of temperature values. Not yet available channels are filled * with NaN values. * * Data type: Tango::DevDouble * Attr type: Spectrum max = 1000 */ virtual void read_Temperature(Tango::Attribute &attr); virtual bool is_Temperature_allowed(Tango::AttReqType type); /** * BiltStates attribute related methods. * Description: The states of the individual bilt devices. * * Data type: Tango::DevState * Attr type: Spectrum max = 256 */ virtual void read_BiltStates(Tango::Attribute &attr); virtual bool is_BiltStates_allowed(Tango::AttReqType type); /** * BiltNames attribute related methods. * Description: The names of the individual bilt devices. * * Data type: Tango::DevString * Attr type: Spectrum max = 256 */ virtual void read_BiltNames(Tango::Attribute &attr); virtual bool is_BiltNames_allowed(Tango::AttReqType type); /** * BiltLocations attribute related methods. * Description: The locations of the individual Bilt power supply devices used \nfor every bilt. * * Data type: Tango::DevString * Attr type: Spectrum max = 256 */ virtual void read_BiltLocations(Tango::Attribute &attr); virtual bool is_BiltLocations_allowed(Tango::AttReqType type); /** * DisableACCurrent attribute related methods. * Description: Array of boolean values which indicate whether the dynamic * 10kHz AC current settings from the Liberas are disabled. * * Data type: Tango::DevBoolean * Attr type: Spectrum max = 500 */ virtual void read_DisableACCurrent(Tango::Attribute &attr); virtual bool is_DisableACCurrent_allowed(Tango::AttReqType type); /** * Method : MchBilt::add_dynamic_attributes() * Description : Add dynamic attributes if any. */ void add_dynamic_attributes(); // Command related methods public: /** * Command State related methods. */ Tango::DevState dev_state(); /** * Command Status related methods. */ Tango::ConstDevString dev_status(); /** * Command On related methods. */ void on(); virtual bool is_On_allowed(const CORBA::Any &any); /** * Command Off related methods. */ void off(); virtual bool is_Off_allowed(const CORBA::Any &any); /** * Command Reset related methods. */ void reset(); virtual bool is_Reset_allowed(const CORBA::Any &any); /** * Command EnableAcCurrent related methods. */ void enable_ac_current(); virtual bool is_EnableAcCurrent_allowed(const CORBA::Any &any); /** * Command DisableAcCurrent related methods. */ void disable_ac_current(); virtual bool is_DisableAcCurrent_allowed(const CORBA::Any &any); /*----- PROTECTED REGION ID(MchBilt::Additional Method prototypes) ENABLED START -----*/ // Additional Method prototypes protected : void read_locations(); friend class AcquisitionThread; AcquisitionThread *acquisition_thread; omni_mutex data_mutex; omni_mutex group_mutex; short exit_thread; Tango::DevErrorList acquisition_error; Tango::DevState acquisition_state; bool bilt_init; struct timeval data_set_time; struct timeval data_read_time; Tango::Group *bilts; Tango::GroupAttrReplyList bilt_data; vector attributes; vector current; //vector current_set; vector voltage; vector current_average; vector current_rms; vector states; Tango::DevString names_arr[100]; int mchBiltChannels; vector dev_error_list; vector locations; Tango::DevString locations_arr[100]; /*----- PROTECTED REGION END -----*/ // MchBilt::Additional Method prototypes }; /*----- PROTECTED REGION ID(MchBilt::Additional Classes Definitions) ENABLED START -----*/ // Additional Classes definitions /*----- PROTECTED REGION END -----*/ // MchBilt::Additional Classes Definitions } // namespace #endif // MCHBILT_H Node-path: powersupply/itest/MchBilt/trunk/MchBilt.xmi Node-kind: file Node-action: change Text-content-length: 16801 Text-content-md5: 5df3e50ec4c6ebab31d129184003468d Content-length: 16801 500 Node-path: powersupply/itest/MchBilt/trunk/MchBiltClass.cpp Node-kind: file Node-action: change Text-content-length: 36081 Text-content-md5: fa0a55eca92fa2c817bb78300a7c251c Content-length: 36081 /*----- PROTECTED REGION ID(MchBiltClass.cpp) ENABLED START -----*/ static const char *RcsId = "$Id: MchBiltClass.cpp,v 1.2 2011-08-04 15:48:33 meyer Exp $"; static const char *TagName = "$Name: not supported by cvs2svn $"; static const char *CvsPath = "$Source: /segfs/tango/cvsroot/cppserver/machine/powersupply/SrSteerers/tango/MchBilt/MchBiltClass.cpp,v $"; static const char *SvnPath = "$HeadURL: $"; static const char *HttpServer = "http://www.esrf.eu/computing/cs/tango/tango_doc/ds_doc/"; //============================================================================= // // file : MchBiltClass.cpp // // description : C++ source for the MchBiltClass. A singleton // class derived from DeviceClass. It implements the // command list and all properties and methods required // by the «name» once per process. // // project : Multi channel Bilt class for the ESRF storage ring. // // $Author: meyer $ // // $Revision: 1.2 $ // $Date: 2011-08-04 15:48:33 $ // // SVN only: // $HeadURL: $ // // CVS only: // $Source: /segfs/tango/cvsroot/cppserver/machine/powersupply/SrSteerers/tango/MchBilt/MchBiltClass.cpp,v $ // $Log: not supported by cvs2svn $ // Revision 1.1.1.1 2011/08/04 14:42:06 meyer // Imported using TkCVS // // //============================================================================= // This file is generated by POGO // (Program Obviously used to Generate tango Object) //============================================================================= #include /*----- PROTECTED REGION END -----*/ //------------------------------------------------------------------- /** * Create MchBiltClass singleton and * return it in a C function for Python usage */ //------------------------------------------------------------------- extern "C" { #ifdef _TG_WINDOWS_ __declspec(dllexport) #endif Tango::DeviceClass *_create_MchBilt_class(const char *name) { return MchBilt_ns::MchBiltClass::init(name); } } namespace MchBilt_ns { //=================================================================== // Initialize pointer for singleton pattern //=================================================================== MchBiltClass *MchBiltClass::_instance = NULL; //-------------------------------------------------------- /** * method : MchBiltClass::MchBiltClass(string &s) * description : constructor for the MchBiltClass * * @param s The class name */ //-------------------------------------------------------- MchBiltClass::MchBiltClass(string &s):DeviceClass(s) { cout2 << "Entering MchBiltClass constructor" << endl; set_default_property(); get_class_property(); write_class_property(); /*----- PROTECTED REGION ID(MchBilt::Class::constructor) ENABLED START -----*/ /*----- PROTECTED REGION END -----*/ // MchBilt::Class::constructor cout2 << "Leaving MchBiltClass constructor" << endl; } //-------------------------------------------------------- /** * method : MchBiltClass::~MchBiltClass() * description : destructor for the MchBiltClass */ //-------------------------------------------------------- MchBiltClass::~MchBiltClass() { /*----- PROTECTED REGION ID(MchBilt::Class::destructor) ENABLED START -----*/ /*----- PROTECTED REGION END -----*/ // MchBilt::Class::destructor _instance = NULL; } //-------------------------------------------------------- /** * method : MchBiltClass::init * description : Create the object if not already done. * Otherwise, just return a pointer to the object * * @param name The class name */ //-------------------------------------------------------- MchBiltClass *MchBiltClass::init(const char *name) { if (_instance == NULL) { try { string s(name); _instance = new MchBiltClass(s); } catch (bad_alloc) { throw; } } return _instance; } //-------------------------------------------------------- /** * method : MchBiltClass::instance * description : Check if object already created, * and return a pointer to the object */ //-------------------------------------------------------- MchBiltClass *MchBiltClass::instance() { if (_instance == NULL) { cerr << "Class is not initialised !!" << endl; exit(-1); } return _instance; } //=================================================================== // Command execution method calls //=================================================================== //-------------------------------------------------------- /** * method : OnClass::execute() * description : method to trigger the execution of the command. * * @param device The device on which the command must be executed * @param in_any The command input data * * returns The command output data (packed in the Any object) */ //-------------------------------------------------------- CORBA::Any *OnClass::execute(Tango::DeviceImpl *device, const CORBA::Any &in_any) { cout2 << "OnClass::execute(): arrived" << endl; ((static_cast(device))->on()); return new CORBA::Any(); } //-------------------------------------------------------- /** * method : OffClass::execute() * description : method to trigger the execution of the command. * * @param device The device on which the command must be executed * @param in_any The command input data * * returns The command output data (packed in the Any object) */ //-------------------------------------------------------- CORBA::Any *OffClass::execute(Tango::DeviceImpl *device, const CORBA::Any &in_any) { cout2 << "OffClass::execute(): arrived" << endl; ((static_cast(device))->off()); return new CORBA::Any(); } //-------------------------------------------------------- /** * method : ResetClass::execute() * description : method to trigger the execution of the command. * * @param device The device on which the command must be executed * @param in_any The command input data * * returns The command output data (packed in the Any object) */ //-------------------------------------------------------- CORBA::Any *ResetClass::execute(Tango::DeviceImpl *device, const CORBA::Any &in_any) { cout2 << "ResetClass::execute(): arrived" << endl; ((static_cast(device))->reset()); return new CORBA::Any(); } //-------------------------------------------------------- /** * method : EnableAcCurrentClass::execute() * description : method to trigger the execution of the command. * * @param device The device on which the command must be executed * @param in_any The command input data * * returns The command output data (packed in the Any object) */ //-------------------------------------------------------- CORBA::Any *EnableAcCurrentClass::execute(Tango::DeviceImpl *device, const CORBA::Any &in_any) { cout2 << "EnableAcCurrentClass::execute(): arrived" << endl; ((static_cast(device))->enable_ac_current()); return new CORBA::Any(); } //-------------------------------------------------------- /** * method : DisableAcCurrentClass::execute() * description : method to trigger the execution of the command. * * @param device The device on which the command must be executed * @param in_any The command input data * * returns The command output data (packed in the Any object) */ //-------------------------------------------------------- CORBA::Any *DisableAcCurrentClass::execute(Tango::DeviceImpl *device, const CORBA::Any &in_any) { cout2 << "DisableAcCurrentClass::execute(): arrived" << endl; ((static_cast(device))->disable_ac_current()); return new CORBA::Any(); } //=================================================================== // Properties management //=================================================================== //-------------------------------------------------------- /** * method : MchBiltClass::get_class_property * description : Get the class property for specified name. * * @param name The property name */ //-------------------------------------------------------- Tango::DbDatum MchBiltClass::get_class_property(string &prop_name) { for (unsigned int i=0 ; i vect_data; // Set Default Class Properties // Set Default Device Properties prop_name = "BiltNames"; prop_desc = "The list of available bilt device names in the order the values have to be arranged in the Current and Voltage spectra."; prop_def = ""; vect_data.clear(); if (prop_def.length()>0) { Tango::DbDatum data(prop_name); data << vect_data ; dev_def_prop.push_back(data); add_wiz_dev_prop(prop_name, prop_desc, prop_def); } else add_wiz_dev_prop(prop_name, prop_desc); prop_name = "UpdatePeriod"; prop_desc = "The update period of all aquired values from the bilt devices in milli seconds."; prop_def = "500\n"; vect_data.clear(); vect_data.push_back("500"); if (prop_def.length()>0) { Tango::DbDatum data(prop_name); data << vect_data ; dev_def_prop.push_back(data); add_wiz_dev_prop(prop_name, prop_desc, prop_def); } else add_wiz_dev_prop(prop_name, prop_desc); } //-------------------------------------------------------- /** * Method : MchBilt::MchBiltClass::write_class_property() * Description : Set class description fields as property in database */ //-------------------------------------------------------- void MchBiltClass::write_class_property() { // First time, check if database used if (Tango::Util::_UseDb == false) return; Tango::DbData data; string classname = get_name(); string header; string::size_type start, end; // Put title Tango::DbDatum title("ProjectTitle"); string str_title("Multi channel class for the Bilt power supplies"); title << str_title; data.push_back(title); // Put Description Tango::DbDatum description("Description"); vector str_desc; str_desc.push_back("The multi channel Bilt device regroups all Bilt powersupply device used for"); str_desc.push_back("the ESRF storage ring steerers"); str_desc.push_back("Reading and setting of currents and voltages is done by spectrum attributes, which "); str_desc.push_back("contain the values of the individual Bilt devices."); description << str_desc; data.push_back(description); // put cvs or svn location string filename("MchBilt"); filename += "Class.cpp"; // check for cvs information string src_path(CvsPath); start = src_path.find("/"); if (start!=string::npos) { end = src_path.find(filename); if (end>start) { string strloc = src_path.substr(start, end-start); // Check if specific repository start = strloc.find("/cvsroot/"); if (start!=string::npos && start>0) { string repository = strloc.substr(0, start); if (repository.find("/segfs/")!=string::npos) strloc = "ESRF:" + strloc.substr(start, strloc.length()-start); } Tango::DbDatum cvs_loc("cvs_location"); cvs_loc << strloc; data.push_back(cvs_loc); } } // check for svn information else { string src_path(SvnPath); start = src_path.find("://"); if (start!=string::npos) { end = src_path.find(filename); if (end>start) { header = "$HeadURL: "; start = header.length(); string strloc = src_path.substr(start, (end-start)); Tango::DbDatum svn_loc("svn_location"); svn_loc << strloc; data.push_back(svn_loc); } } } // Get CVS or SVN revision tag // CVS tag string tagname(TagName); header = "$Name: "; start = header.length(); string endstr(" $"); end = tagname.find(endstr); if (end!=string::npos && end>start) { string strtag = tagname.substr(start, end-start); Tango::DbDatum cvs_tag("cvs_tag"); cvs_tag << strtag; data.push_back(cvs_tag); } // SVN tag string svnpath(SvnPath); header = "$HeadURL: "; start = header.length(); end = svnpath.find(endstr); if (end!=string::npos && end>start) { string strloc = svnpath.substr(start, end-start); string tagstr ("/tags/"); start = strloc.find(tagstr); if ( start!=string::npos ) { start = start + tagstr.length(); end = strloc.find(filename); string strtag = strloc.substr(start, end-start-1); Tango::DbDatum svn_tag("svn_tag"); svn_tag << strtag; data.push_back(svn_tag); } } // Get URL location string httpServ(HttpServer); if (httpServ.length()>0) { Tango::DbDatum db_doc_url("doc_url"); db_doc_url << httpServ; data.push_back(db_doc_url); } // Put inheritance Tango::DbDatum inher_datum("InheritedFrom"); vector inheritance; inheritance.push_back("Device_4Impl"); inher_datum << inheritance; data.push_back(inher_datum); // Call database and and values get_db_class()->put_property(data); } //=================================================================== // Factory methods //=================================================================== //-------------------------------------------------------- /** * method : MchBiltClass::device_factory * description : Create the device object(s) * and store them in the device list * * @param *devlist_ptr The device name list */ //-------------------------------------------------------- void MchBiltClass::device_factory(const Tango::DevVarStringArray *devlist_ptr) { /*----- PROTECTED REGION ID(MchBilt::Class::device_factory_before) ENABLED START -----*/ // Add your own code /*----- PROTECTED REGION END -----*/ // MchBilt::Class::device_factory_before // Create devices and add it into the device list for (unsigned long i=0 ; ilength() ; i++) { cout4 << "Device name : " << (*devlist_ptr)[i].in() << endl; device_list.push_back(new MchBilt(this, (*devlist_ptr)[i])); } // Manage dynamic attributes if any erase_dynamic_attributes(devlist_ptr, get_class_attr()->get_attr_list()); // Export devices to the outside world for (unsigned long i=1 ; i<=devlist_ptr->length() ; i++) { // Add dynamic attributes if any MchBilt *dev = static_cast(device_list[device_list.size()-i]); dev->add_dynamic_attributes(); // Check before if database used. if ((Tango::Util::_UseDb == true) && (Tango::Util::_FileDb == false)) export_device(dev); else export_device(dev, dev->get_name().c_str()); } /*----- PROTECTED REGION ID(MchBilt::Class::device_factory_after) ENABLED START -----*/ // Add your own code /*----- PROTECTED REGION END -----*/ // MchBilt::Class::device_factory_after } //-------------------------------------------------------- /** * Method : MchBilt::MchBiltClass::attribute_factory() * Description : Create the attribute object(s) * and store them in the attribute list */ //-------------------------------------------------------- void MchBiltClass::attribute_factory(vector &att_list) { /*----- PROTECTED REGION ID(MchBilt::Class::attribute_factory_before) ENABLED START -----*/ // Add your own code /*----- PROTECTED REGION END -----*/ // MchBilt::Class::attribute_factory_before // Attribute : Current CurrentAttrib *current = new CurrentAttrib(); Tango::UserDefaultAttrProp current_prop; current_prop.set_description("Array of current values. Not yet available channels are filled \nwith NaN values."); current_prop.set_label("Current"); current_prop.set_unit("A"); // standard_unit not set for Current // display_unit not set for Current current_prop.set_format("%5.4f"); // max_value not set for Current // min_value not set for Current // max_alarm not set for Current // min_alarm not set for Current // max_warning not set for Current // min_warning not set for Current // delta_t not set for Current // delta_val not set for Current current->set_default_properties(current_prop); // Not Polled current->set_disp_level(Tango::OPERATOR); // Not memorized // Current does not fire change event // Current does not fire archive event // Current does not fire data_ready event att_list.push_back(current); // Attribute : Voltage VoltageAttrib *voltage = new VoltageAttrib(); Tango::UserDefaultAttrProp voltage_prop; voltage_prop.set_description("Array of voltage values. Not yet available channels are filled \nwith NaN values."); voltage_prop.set_label("Voltage"); voltage_prop.set_unit("A"); // standard_unit not set for Voltage // display_unit not set for Voltage voltage_prop.set_format("%6.4f"); // max_value not set for Voltage // min_value not set for Voltage // max_alarm not set for Voltage // min_alarm not set for Voltage // max_warning not set for Voltage // min_warning not set for Voltage // delta_t not set for Voltage // delta_val not set for Voltage voltage->set_default_properties(voltage_prop); // Not Polled voltage->set_disp_level(Tango::OPERATOR); // Not memorized // Voltage does not fire change event // Voltage does not fire archive event // Voltage does not fire data_ready event att_list.push_back(voltage); // Attribute : SetCurrentAverage SetCurrentAverageAttrib *setcurrentaverage = new SetCurrentAverageAttrib(); Tango::UserDefaultAttrProp setcurrentaverage_prop; setcurrentaverage_prop.set_description("Array of calculated average AC current setpoint values per second.. When not yet available, the channels are filled \nwith NaN values."); setcurrentaverage_prop.set_label("Average AC current set./s"); setcurrentaverage_prop.set_unit("mA"); // standard_unit not set for SetCurrentAverage // display_unit not set for SetCurrentAverage setcurrentaverage_prop.set_format("%6.3f"); // max_value not set for SetCurrentAverage // min_value not set for SetCurrentAverage // max_alarm not set for SetCurrentAverage // min_alarm not set for SetCurrentAverage // max_warning not set for SetCurrentAverage // min_warning not set for SetCurrentAverage // delta_t not set for SetCurrentAverage // delta_val not set for SetCurrentAverage setcurrentaverage->set_default_properties(setcurrentaverage_prop); // Not Polled setcurrentaverage->set_disp_level(Tango::OPERATOR); // Not memorized // SetCurrentAverage does not fire change event // SetCurrentAverage does not fire archive event // SetCurrentAverage does not fire data_ready event att_list.push_back(setcurrentaverage); // Attribute : SetCurrentRMS SetCurrentRMSAttrib *setcurrentrms = new SetCurrentRMSAttrib(); Tango::UserDefaultAttrProp setcurrentrms_prop; setcurrentrms_prop.set_description("Array of calculated RMS AC current setpoint values per second.. When not yet available, the channels are filled \nwith NaN values."); setcurrentrms_prop.set_label("RMS AC current set./s"); setcurrentrms_prop.set_unit("mA"); // standard_unit not set for SetCurrentRMS // display_unit not set for SetCurrentRMS setcurrentrms_prop.set_format("%6.3f"); // max_value not set for SetCurrentRMS // min_value not set for SetCurrentRMS // max_alarm not set for SetCurrentRMS // min_alarm not set for SetCurrentRMS // max_warning not set for SetCurrentRMS // min_warning not set for SetCurrentRMS // delta_t not set for SetCurrentRMS // delta_val not set for SetCurrentRMS setcurrentrms->set_default_properties(setcurrentrms_prop); // Not Polled setcurrentrms->set_disp_level(Tango::OPERATOR); // Not memorized // SetCurrentRMS does not fire change event // SetCurrentRMS does not fire archive event // SetCurrentRMS does not fire data_ready event att_list.push_back(setcurrentrms); // Attribute : FramesPerSecond FramesPerSecondAttrib *framespersecond = new FramesPerSecondAttrib(); Tango::UserDefaultAttrProp framespersecond_prop; framespersecond_prop.set_description("Array of error frames per second values. Not yet available channels are filled \nwith NaN values."); framespersecond_prop.set_label("Frames per second"); // unit not set for FramesPerSecond // standard_unit not set for FramesPerSecond // display_unit not set for FramesPerSecond framespersecond_prop.set_format("%6d"); // max_value not set for FramesPerSecond // min_value not set for FramesPerSecond // max_alarm not set for FramesPerSecond // min_alarm not set for FramesPerSecond // max_warning not set for FramesPerSecond // min_warning not set for FramesPerSecond // delta_t not set for FramesPerSecond // delta_val not set for FramesPerSecond framespersecond->set_default_properties(framespersecond_prop); // Not Polled framespersecond->set_disp_level(Tango::OPERATOR); // Not memorized // FramesPerSecond does not fire change event // FramesPerSecond does not fire archive event // FramesPerSecond does not fire data_ready event att_list.push_back(framespersecond); // Attribute : ErrorsPerSecond ErrorsPerSecondAttrib *errorspersecond = new ErrorsPerSecondAttrib(); Tango::UserDefaultAttrProp errorspersecond_prop; errorspersecond_prop.set_description("Array of error errors per second values. Not yet available channels are filled \nwith NaN values."); errorspersecond_prop.set_label("Errors per second"); // unit not set for ErrorsPerSecond // standard_unit not set for ErrorsPerSecond // display_unit not set for ErrorsPerSecond errorspersecond_prop.set_format("%6d"); // max_value not set for ErrorsPerSecond // min_value not set for ErrorsPerSecond // max_alarm not set for ErrorsPerSecond // min_alarm not set for ErrorsPerSecond // max_warning not set for ErrorsPerSecond // min_warning not set for ErrorsPerSecond // delta_t not set for ErrorsPerSecond // delta_val not set for ErrorsPerSecond errorspersecond->set_default_properties(errorspersecond_prop); // Not Polled errorspersecond->set_disp_level(Tango::OPERATOR); // Not memorized // ErrorsPerSecond does not fire change event // ErrorsPerSecond does not fire archive event // ErrorsPerSecond does not fire data_ready event att_list.push_back(errorspersecond); // Attribute : ErrorCounter ErrorCounterAttrib *errorcounter = new ErrorCounterAttrib(); Tango::UserDefaultAttrProp errorcounter_prop; errorcounter_prop.set_description("Array of error counter values. Not yet available channels are filled \nwith NaN values."); errorcounter_prop.set_label("Error Counter"); // unit not set for ErrorCounter // standard_unit not set for ErrorCounter // display_unit not set for ErrorCounter errorcounter_prop.set_format("%6d"); // max_value not set for ErrorCounter // min_value not set for ErrorCounter // max_alarm not set for ErrorCounter // min_alarm not set for ErrorCounter // max_warning not set for ErrorCounter // min_warning not set for ErrorCounter // delta_t not set for ErrorCounter // delta_val not set for ErrorCounter errorcounter->set_default_properties(errorcounter_prop); // Not Polled errorcounter->set_disp_level(Tango::OPERATOR); // Not memorized // ErrorCounter does not fire change event // ErrorCounter does not fire archive event // ErrorCounter does not fire data_ready event att_list.push_back(errorcounter); // Attribute : Impedance ImpedanceAttrib *impedance = new ImpedanceAttrib(); Tango::UserDefaultAttrProp impedance_prop; impedance_prop.set_description("Array of impedance values. Not yet available channels are filled \nwith NaN values."); impedance_prop.set_label("Impedance"); impedance_prop.set_unit("Ohm"); // standard_unit not set for Impedance // display_unit not set for Impedance impedance_prop.set_format("%4.2f"); // max_value not set for Impedance // min_value not set for Impedance // max_alarm not set for Impedance // min_alarm not set for Impedance // max_warning not set for Impedance // min_warning not set for Impedance // delta_t not set for Impedance // delta_val not set for Impedance impedance->set_default_properties(impedance_prop); // Not Polled impedance->set_disp_level(Tango::OPERATOR); // Not memorized // Impedance does not fire change event // Impedance does not fire archive event // Impedance does not fire data_ready event att_list.push_back(impedance); // Attribute : Temperature TemperatureAttrib *temperature = new TemperatureAttrib(); Tango::UserDefaultAttrProp temperature_prop; temperature_prop.set_description("Array of temperature values. Not yet available channels are filled \nwith NaN values."); temperature_prop.set_label("Temperature"); temperature_prop.set_unit("C"); // standard_unit not set for Temperature // display_unit not set for Temperature temperature_prop.set_format("%6d"); // max_value not set for Temperature // min_value not set for Temperature // max_alarm not set for Temperature // min_alarm not set for Temperature // max_warning not set for Temperature // min_warning not set for Temperature // delta_t not set for Temperature // delta_val not set for Temperature temperature->set_default_properties(temperature_prop); // Not Polled temperature->set_disp_level(Tango::OPERATOR); // Not memorized // Temperature does not fire change event // Temperature does not fire archive event // Temperature does not fire data_ready event att_list.push_back(temperature); // Attribute : BiltStates BiltStatesAttrib *biltstates = new BiltStatesAttrib(); Tango::UserDefaultAttrProp biltstates_prop; biltstates_prop.set_description("The states of the individual bilt devices."); // label not set for BiltStates // unit not set for BiltStates // standard_unit not set for BiltStates // display_unit not set for BiltStates // format not set for BiltStates // max_value not set for BiltStates // min_value not set for BiltStates // max_alarm not set for BiltStates // min_alarm not set for BiltStates // max_warning not set for BiltStates // min_warning not set for BiltStates // delta_t not set for BiltStates // delta_val not set for BiltStates biltstates->set_default_properties(biltstates_prop); // Not Polled biltstates->set_disp_level(Tango::OPERATOR); // Not memorized // BiltStates does not fire change event // BiltStates does not fire archive event // BiltStates does not fire data_ready event att_list.push_back(biltstates); // Attribute : BiltNames BiltNamesAttrib *biltnames = new BiltNamesAttrib(); Tango::UserDefaultAttrProp biltnames_prop; biltnames_prop.set_description("The names of the individual bilt devices."); // label not set for BiltNames // unit not set for BiltNames // standard_unit not set for BiltNames // display_unit not set for BiltNames // format not set for BiltNames // max_value not set for BiltNames // min_value not set for BiltNames // max_alarm not set for BiltNames // min_alarm not set for BiltNames // max_warning not set for BiltNames // min_warning not set for BiltNames // delta_t not set for BiltNames // delta_val not set for BiltNames biltnames->set_default_properties(biltnames_prop); // Not Polled biltnames->set_disp_level(Tango::OPERATOR); // Not memorized // BiltNames does not fire change event // BiltNames does not fire archive event // BiltNames does not fire data_ready event att_list.push_back(biltnames); // Attribute : BiltLocations BiltLocationsAttrib *biltlocations = new BiltLocationsAttrib(); Tango::UserDefaultAttrProp biltlocations_prop; biltlocations_prop.set_description("The locations of the individual Bilt power supply devices used \nfor every bilt."); // label not set for BiltLocations // unit not set for BiltLocations // standard_unit not set for BiltLocations // display_unit not set for BiltLocations // format not set for BiltLocations // max_value not set for BiltLocations // min_value not set for BiltLocations // max_alarm not set for BiltLocations // min_alarm not set for BiltLocations // max_warning not set for BiltLocations // min_warning not set for BiltLocations // delta_t not set for BiltLocations // delta_val not set for BiltLocations biltlocations->set_default_properties(biltlocations_prop); // Not Polled biltlocations->set_disp_level(Tango::OPERATOR); // Not memorized // BiltLocations does not fire change event // BiltLocations does not fire archive event // BiltLocations does not fire data_ready event att_list.push_back(biltlocations); // Attribute : DisableACCurrent DisableACCurrentAttrib *disableaccurrent = new DisableACCurrentAttrib(); Tango::UserDefaultAttrProp disableaccurrent_prop; disableaccurrent_prop.set_description("Array of boolean values which indicate whether the dynamic \n10kHz AC current settings from the Liberas are disabled."); disableaccurrent_prop.set_label("Disabled AC current settings"); // unit not set for DisableACCurrent // standard_unit not set for DisableACCurrent // display_unit not set for DisableACCurrent // format not set for DisableACCurrent // max_value not set for DisableACCurrent // min_value not set for DisableACCurrent // max_alarm not set for DisableACCurrent // min_alarm not set for DisableACCurrent // max_warning not set for DisableACCurrent // min_warning not set for DisableACCurrent // delta_t not set for DisableACCurrent // delta_val not set for DisableACCurrent disableaccurrent->set_default_properties(disableaccurrent_prop); // Not Polled disableaccurrent->set_disp_level(Tango::OPERATOR); // Not memorized // DisableACCurrent does not fire change event // DisableACCurrent does not fire archive event // DisableACCurrent does not fire data_ready event att_list.push_back(disableaccurrent); // Create a list of static attributes create_static_attribute_list(get_class_attr()->get_attr_list()); /*----- PROTECTED REGION ID(MchBilt::Class::attribute_factory_after) ENABLED START -----*/ // Add your own code /*----- PROTECTED REGION END -----*/ // MchBilt::Class::attribute_factory_after } //-------------------------------------------------------- /** * Method : MchBilt::MchBiltClass::command_factory() * Description : Create the command object(s) * and store them in the command list */ //-------------------------------------------------------- void MchBiltClass::command_factory() { /*----- PROTECTED REGION ID(MchBilt::Class::command_factory_before) ENABLED START -----*/ /*----- PROTECTED REGION END -----*/ // MchBilt::Class::command_factory_before OnClass *pOnCmd = new OnClass("On", Tango::DEV_VOID, Tango::DEV_VOID, "", "", Tango::OPERATOR); command_list.push_back(pOnCmd); OffClass *pOffCmd = new OffClass("Off", Tango::DEV_VOID, Tango::DEV_VOID, "", "", Tango::OPERATOR); command_list.push_back(pOffCmd); ResetClass *pResetCmd = new ResetClass("Reset", Tango::DEV_VOID, Tango::DEV_VOID, "", "", Tango::OPERATOR); command_list.push_back(pResetCmd); EnableAcCurrentClass *pEnableAcCurrentCmd = new EnableAcCurrentClass("EnableAcCurrent", Tango::DEV_VOID, Tango::DEV_VOID, "", "", Tango::OPERATOR); command_list.push_back(pEnableAcCurrentCmd); DisableAcCurrentClass *pDisableAcCurrentCmd = new DisableAcCurrentClass("DisableAcCurrent", Tango::DEV_VOID, Tango::DEV_VOID, "", "", Tango::OPERATOR); command_list.push_back(pDisableAcCurrentCmd); /*----- PROTECTED REGION ID(MchBilt::Class::command_factory_after) ENABLED START -----*/ /*----- PROTECTED REGION END -----*/ // MchBilt::Class::command_factory_after } //=================================================================== // Dynamic attributes related methods //=================================================================== //-------------------------------------------------------- /** * method : MchBiltClass::create_static_attribute_list * description : Create the a list of static attributes * * @param att_list the ceated attribute list */ //-------------------------------------------------------- void MchBiltClass::create_static_attribute_list(vector &att_list) { for (unsigned long i=0 ; iget_name()); transform(att_name.begin(), att_name.end(), att_name.begin(), ::tolower); defaultAttList.push_back(att_name); } cout2 << defaultAttList.size() << " attributes in default list" << endl; /*----- PROTECTED REGION ID(MchBilt::Class::create_static_att_list) ENABLED START -----*/ /*----- PROTECTED REGION END -----*/ // MchBilt::Class::create_static_att_list } //-------------------------------------------------------- /** * method : MchBiltClass::erase_dynamic_attributes * description : delete the dynamic attributes if any. * * @param devlist_ptr the device list pointer * @param list of all attributes */ //-------------------------------------------------------- void MchBiltClass::erase_dynamic_attributes(const Tango::DevVarStringArray *devlist_ptr, vector &att_list) { Tango::Util *tg = Tango::Util::instance(); for (unsigned long i=0 ; ilength() ; i++) { Tango::DeviceImpl *dev_impl = tg->get_device_by_name(((string)(*devlist_ptr)[i]).c_str()); MchBilt *dev = static_cast (dev_impl); vector &dev_att_list = dev->get_device_attr()->get_attribute_list(); vector::iterator ite_att; for (ite_att=dev_att_list.begin() ; ite_att != dev_att_list.end() ; ++ite_att) { string att_name((*ite_att)->get_name_lower()); if ((att_name == "state") || (att_name == "status")) continue; vector::iterator ite_str = find(defaultAttList.begin(), defaultAttList.end(), att_name); if (ite_str == defaultAttList.end()) { cout2 << att_name << " is a UNWANTED dynamic attribute for device " << (*devlist_ptr)[i] << endl; Tango::Attribute &att = dev->get_device_attr()->get_attr_by_name(att_name.c_str()); dev->remove_attribute(att_list[att.get_attr_idx()],true); --ite_att; } } } /*----- PROTECTED REGION ID(MchBilt::Class::erase_dynamic_attributes) ENABLED START -----*/ /*----- PROTECTED REGION END -----*/ // MchBilt::Class::erase_dynamic_attributes } /*----- PROTECTED REGION ID(MchBilt::Class::Additional Methods) ENABLED START -----*/ /*----- PROTECTED REGION END -----*/ // MchBilt::Class::Additional Methods } // namespace Node-path: powersupply/itest/MchBilt/trunk/MchBiltClass.h Node-kind: file Node-action: change Text-content-length: 13381 Text-content-md5: e9e4eed9090285043537db56eb48c2e4 Content-length: 13381 /*----- PROTECTED REGION ID(MchBiltClass.h) ENABLED START -----*/ //============================================================================= // // file : MchBiltClass.h // // description : Include for the MchBiltClass root class. // This class is the singleton class for. // the MchBilt device class.. // It contains all properties and methods which the . // MchBilt requires only once e.g. the commands. // // project : Multi channel Bilt class for the ESRF storage ring. // // $Author: meyer $ // // $Revision: 1.2 $ // $Date: 2011-08-04 15:48:33 $ // // SVN only: // $HeadURL: $ // // CVS only: // $Source: /segfs/tango/cvsroot/cppserver/machine/powersupply/SrSteerers/tango/MchBilt/MchBiltClass.h,v $ // $Log: not supported by cvs2svn $ // Revision 1.1.1.1 2011/08/04 14:42:06 meyer // Imported using TkCVS // // //============================================================================= // This file is generated by POGO // (Program Obviously used to Generate tango Object) //============================================================================= #ifndef MCHBILTCLASS_H #define MCHBILTCLASS_H #include #include /*----- PROTECTED REGION END -----*/ namespace MchBilt_ns { /*----- PROTECTED REGION ID(MchBilt::classes for dynamic creation) ENABLED START -----*/ /*----- PROTECTED REGION END -----*/ // MchBilt::classes for dynamic creation //========================================= // Define classes for attributes //========================================= // Attribute Current class definition class CurrentAttrib: public Tango::SpectrumAttr { public: CurrentAttrib():SpectrumAttr("Current", Tango::DEV_DOUBLE, Tango::READ, 500) {}; ~CurrentAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_Current(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_Current_allowed(ty);} }; // Attribute Voltage class definition class VoltageAttrib: public Tango::SpectrumAttr { public: VoltageAttrib():SpectrumAttr("Voltage", Tango::DEV_DOUBLE, Tango::READ, 500) {}; ~VoltageAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_Voltage(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_Voltage_allowed(ty);} }; // Attribute SetCurrentAverage class definition class SetCurrentAverageAttrib: public Tango::SpectrumAttr { public: SetCurrentAverageAttrib():SpectrumAttr("SetCurrentAverage", Tango::DEV_DOUBLE, Tango::READ, 500) {}; ~SetCurrentAverageAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_SetCurrentAverage(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_SetCurrentAverage_allowed(ty);} }; // Attribute SetCurrentRMS class definition class SetCurrentRMSAttrib: public Tango::SpectrumAttr { public: SetCurrentRMSAttrib():SpectrumAttr("SetCurrentRMS", Tango::DEV_DOUBLE, Tango::READ, 500) {}; ~SetCurrentRMSAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_SetCurrentRMS(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_SetCurrentRMS_allowed(ty);} }; // Attribute FramesPerSecond class definition class FramesPerSecondAttrib: public Tango::SpectrumAttr { public: FramesPerSecondAttrib():SpectrumAttr("FramesPerSecond", Tango::DEV_ULONG, Tango::READ, 500) {}; ~FramesPerSecondAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_FramesPerSecond(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_FramesPerSecond_allowed(ty);} }; // Attribute ErrorsPerSecond class definition class ErrorsPerSecondAttrib: public Tango::SpectrumAttr { public: ErrorsPerSecondAttrib():SpectrumAttr("ErrorsPerSecond", Tango::DEV_ULONG, Tango::READ, 500) {}; ~ErrorsPerSecondAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_ErrorsPerSecond(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_ErrorsPerSecond_allowed(ty);} }; // Attribute ErrorCounter class definition class ErrorCounterAttrib: public Tango::SpectrumAttr { public: ErrorCounterAttrib():SpectrumAttr("ErrorCounter", Tango::DEV_ULONG, Tango::READ, 500) {}; ~ErrorCounterAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_ErrorCounter(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_ErrorCounter_allowed(ty);} }; // Attribute Impedance class definition class ImpedanceAttrib: public Tango::SpectrumAttr { public: ImpedanceAttrib():SpectrumAttr("Impedance", Tango::DEV_DOUBLE, Tango::READ, 500) {}; ~ImpedanceAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_Impedance(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_Impedance_allowed(ty);} }; // Attribute Temperature class definition class TemperatureAttrib: public Tango::SpectrumAttr { public: TemperatureAttrib():SpectrumAttr("Temperature", Tango::DEV_DOUBLE, Tango::READ, 1000) {}; ~TemperatureAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_Temperature(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_Temperature_allowed(ty);} }; // Attribute BiltStates class definition class BiltStatesAttrib: public Tango::SpectrumAttr { public: BiltStatesAttrib():SpectrumAttr("BiltStates", Tango::DEV_STATE, Tango::READ, 256) {}; ~BiltStatesAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_BiltStates(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_BiltStates_allowed(ty);} }; // Attribute BiltNames class definition class BiltNamesAttrib: public Tango::SpectrumAttr { public: BiltNamesAttrib():SpectrumAttr("BiltNames", Tango::DEV_STRING, Tango::READ, 256) {}; ~BiltNamesAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_BiltNames(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_BiltNames_allowed(ty);} }; // Attribute BiltLocations class definition class BiltLocationsAttrib: public Tango::SpectrumAttr { public: BiltLocationsAttrib():SpectrumAttr("BiltLocations", Tango::DEV_STRING, Tango::READ, 256) {}; ~BiltLocationsAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_BiltLocations(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_BiltLocations_allowed(ty);} }; // Attribute DisableACCurrent class definition class DisableACCurrentAttrib: public Tango::SpectrumAttr { public: DisableACCurrentAttrib():SpectrumAttr("DisableACCurrent", Tango::DEV_BOOLEAN, Tango::READ, 500) {}; ~DisableACCurrentAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_DisableACCurrent(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_DisableACCurrent_allowed(ty);} }; //========================================= // Define classes for commands //========================================= // Command On class definition class OnClass : public Tango::Command { public: OnClass(const char *name, Tango::CmdArgType in, Tango::CmdArgType out, const char *in_desc, const char *out_desc, Tango::DispLevel level) :Command(name,in,out,in_desc,out_desc, level) {}; OnClass(const char *name, Tango::CmdArgType in, Tango::CmdArgType out) :Command(name,in,out) {}; ~OnClass() {}; virtual CORBA::Any *execute (Tango::DeviceImpl *dev, const CORBA::Any &any); virtual bool is_allowed (Tango::DeviceImpl *dev, const CORBA::Any &any) {return (static_cast(dev))->is_On_allowed(any);} }; // Command Off class definition class OffClass : public Tango::Command { public: OffClass(const char *name, Tango::CmdArgType in, Tango::CmdArgType out, const char *in_desc, const char *out_desc, Tango::DispLevel level) :Command(name,in,out,in_desc,out_desc, level) {}; OffClass(const char *name, Tango::CmdArgType in, Tango::CmdArgType out) :Command(name,in,out) {}; ~OffClass() {}; virtual CORBA::Any *execute (Tango::DeviceImpl *dev, const CORBA::Any &any); virtual bool is_allowed (Tango::DeviceImpl *dev, const CORBA::Any &any) {return (static_cast(dev))->is_Off_allowed(any);} }; // Command Reset class definition class ResetClass : public Tango::Command { public: ResetClass(const char *name, Tango::CmdArgType in, Tango::CmdArgType out, const char *in_desc, const char *out_desc, Tango::DispLevel level) :Command(name,in,out,in_desc,out_desc, level) {}; ResetClass(const char *name, Tango::CmdArgType in, Tango::CmdArgType out) :Command(name,in,out) {}; ~ResetClass() {}; virtual CORBA::Any *execute (Tango::DeviceImpl *dev, const CORBA::Any &any); virtual bool is_allowed (Tango::DeviceImpl *dev, const CORBA::Any &any) {return (static_cast(dev))->is_Reset_allowed(any);} }; // Command EnableAcCurrent class definition class EnableAcCurrentClass : public Tango::Command { public: EnableAcCurrentClass(const char *name, Tango::CmdArgType in, Tango::CmdArgType out, const char *in_desc, const char *out_desc, Tango::DispLevel level) :Command(name,in,out,in_desc,out_desc, level) {}; EnableAcCurrentClass(const char *name, Tango::CmdArgType in, Tango::CmdArgType out) :Command(name,in,out) {}; ~EnableAcCurrentClass() {}; virtual CORBA::Any *execute (Tango::DeviceImpl *dev, const CORBA::Any &any); virtual bool is_allowed (Tango::DeviceImpl *dev, const CORBA::Any &any) {return (static_cast(dev))->is_EnableAcCurrent_allowed(any);} }; // Command DisableAcCurrent class definition class DisableAcCurrentClass : public Tango::Command { public: DisableAcCurrentClass(const char *name, Tango::CmdArgType in, Tango::CmdArgType out, const char *in_desc, const char *out_desc, Tango::DispLevel level) :Command(name,in,out,in_desc,out_desc, level) {}; DisableAcCurrentClass(const char *name, Tango::CmdArgType in, Tango::CmdArgType out) :Command(name,in,out) {}; ~DisableAcCurrentClass() {}; virtual CORBA::Any *execute (Tango::DeviceImpl *dev, const CORBA::Any &any); virtual bool is_allowed (Tango::DeviceImpl *dev, const CORBA::Any &any) {return (static_cast(dev))->is_DisableAcCurrent_allowed(any);} }; /** * The TemplateDevServClass singleton definition */ class #ifdef _TG_WINDOWS_ __declspec(dllexport) #endif MchBiltClass : public Tango::DeviceClass { /*----- PROTECTED REGION ID(MchBilt::Additionnal DServer data members) ENABLED START -----*/ public: /*----- PROTECTED REGION END -----*/ // MchBilt::Additionnal DServer data members public: // write class properties data members Tango::DbData cl_prop; Tango::DbData cl_def_prop; Tango::DbData dev_def_prop; // Method prototypes static MchBiltClass *init(const char *); static MchBiltClass *instance(); ~MchBiltClass(); Tango::DbDatum get_class_property(string &); Tango::DbDatum get_default_device_property(string &); Tango::DbDatum get_default_class_property(string &); protected: MchBiltClass(string &); static MchBiltClass *_instance; void command_factory(); void attribute_factory(vector &); void write_class_property(); void set_default_property(); void get_class_property(); string get_cvstag(); string get_cvsroot(); private: void device_factory(const Tango::DevVarStringArray *); void create_static_attribute_list(vector &); void erase_dynamic_attributes(const Tango::DevVarStringArray *,vector &); vector defaultAttList; }; } // namespace #endif // MCHBILTCLASS_H Node-path: powersupply/itest/MchBilt/trunk/MchBiltStateMachine.cpp Node-kind: file Node-action: change Text-content-length: 12592 Text-content-md5: 167a18ac0bf59bea04b285e50477421b Content-length: 12592 /*----- PROTECTED REGION ID(MchBiltStateMachine.cpp) ENABLED START -----*/ static const char *RcsId = "$Id: MchBiltStateMachine.cpp,v 1.2 2011-08-04 15:48:33 meyer Exp $"; //============================================================================= // // file : MchBiltStateMachine.cpp // // description : C++ source for the MchBilt and its alowed // methods for commands and attributes // // project : Multi channel Bilt class for the ESRF storage ring. // // $Author: meyer $ // // $Revision: 1.2 $ // $Date: 2011-08-04 15:48:33 $ // // SVN only: // $HeadURL: $ // // CVS only: // $Source: /segfs/tango/cvsroot/cppserver/machine/powersupply/SrSteerers/tango/MchBilt/MchBiltStateMachine.cpp,v $ // $Log: not supported by cvs2svn $ // Revision 1.1.1.1 2011/08/04 14:42:06 meyer // Imported using TkCVS // // //============================================================================= // This file is generated by POGO // (Program Obviously used to Generate tango Object) //============================================================================= #include #include /*----- PROTECTED REGION END -----*/ /* * MchBilt states description: * * ON : All bilts switched on. * OFF : One or more bilts are off. * ALARM : Alarm detected on one or more bilts. * FAULT : Fault detected on one or more bilts. * UNKNOWN : Connection problems with one or more bilts. */ namespace MchBilt_ns { //================================================= // Attributes Allowed Methods //================================================= //-------------------------------------------------------- /** * Method : MchBilt::is_CurrentState_allowed() * Description : Execution allowed for Current attribute. */ //-------------------------------------------------------- bool MchBilt::is_Current_allowed(Tango::AttReqType type) { // Not any excluded states for Current attribute in READ access. /*----- PROTECTED REGION ID(MchBilt::read_CurrentStateAllowed_READ) ENABLED START -----*/ /*----- PROTECTED REGION END -----*/ // MchBilt::read_CurrentStateAllowed_READ return true; } //-------------------------------------------------------- /** * Method : MchBilt::is_VoltageState_allowed() * Description : Execution allowed for Voltage attribute. */ //-------------------------------------------------------- bool MchBilt::is_Voltage_allowed(Tango::AttReqType type) { // Not any excluded states for Voltage attribute in READ access. /*----- PROTECTED REGION ID(MchBilt::read_VoltageStateAllowed_READ) ENABLED START -----*/ /*----- PROTECTED REGION END -----*/ // MchBilt::read_VoltageStateAllowed_READ return true; } //-------------------------------------------------------- /** * Method : MchBilt::is_SetCurrentAverageState_allowed() * Description : Execution allowed for SetCurrentAverage attribute. */ //-------------------------------------------------------- bool MchBilt::is_SetCurrentAverage_allowed(Tango::AttReqType type) { // Not any excluded states for SetCurrentAverage attribute in READ access. /*----- PROTECTED REGION ID(MchBilt::read_SetCurrentAverageStateAllowed_READ) ENABLED START -----*/ /*----- PROTECTED REGION END -----*/ // MchBilt::read_SetCurrentAverageStateAllowed_READ return true; } //-------------------------------------------------------- /** * Method : MchBilt::is_SetCurrentRMSState_allowed() * Description : Execution allowed for SetCurrentRMS attribute. */ //-------------------------------------------------------- bool MchBilt::is_SetCurrentRMS_allowed(Tango::AttReqType type) { // Not any excluded states for SetCurrentRMS attribute in READ access. /*----- PROTECTED REGION ID(MchBilt::read_SetCurrentRMSStateAllowed_READ) ENABLED START -----*/ /*----- PROTECTED REGION END -----*/ // MchBilt::read_SetCurrentRMSStateAllowed_READ return true; } //-------------------------------------------------------- /** * Method : MchBilt::is_FramesPerSecondState_allowed() * Description : Execution allowed for FramesPerSecond attribute. */ //-------------------------------------------------------- bool MchBilt::is_FramesPerSecond_allowed(Tango::AttReqType type) { // Not any excluded states for FramesPerSecond attribute in READ access. /*----- PROTECTED REGION ID(MchBilt::read_FramesPerSecondStateAllowed_READ) ENABLED START -----*/ /*----- PROTECTED REGION END -----*/ // MchBilt::read_FramesPerSecondStateAllowed_READ return true; } //-------------------------------------------------------- /** * Method : MchBilt::is_ErrorsPerSecondState_allowed() * Description : Execution allowed for ErrorsPerSecond attribute. */ //-------------------------------------------------------- bool MchBilt::is_ErrorsPerSecond_allowed(Tango::AttReqType type) { // Not any excluded states for ErrorsPerSecond attribute in READ access. /*----- PROTECTED REGION ID(MchBilt::read_ErrorsPerSecondStateAllowed_READ) ENABLED START -----*/ /*----- PROTECTED REGION END -----*/ // MchBilt::read_ErrorsPerSecondStateAllowed_READ return true; } //-------------------------------------------------------- /** * Method : MchBilt::is_ErrorCounterState_allowed() * Description : Execution allowed for ErrorCounter attribute. */ //-------------------------------------------------------- bool MchBilt::is_ErrorCounter_allowed(Tango::AttReqType type) { // Not any excluded states for ErrorCounter attribute in READ access. /*----- PROTECTED REGION ID(MchBilt::read_ErrorCounterStateAllowed_READ) ENABLED START -----*/ /*----- PROTECTED REGION END -----*/ // MchBilt::read_ErrorCounterStateAllowed_READ return true; } //-------------------------------------------------------- /** * Method : MchBilt::is_ImpedanceState_allowed() * Description : Execution allowed for Impedance attribute. */ //-------------------------------------------------------- bool MchBilt::is_Impedance_allowed(Tango::AttReqType type) { // Not any excluded states for Impedance attribute in READ access. /*----- PROTECTED REGION ID(MchBilt::read_ImpedanceStateAllowed_READ) ENABLED START -----*/ /*----- PROTECTED REGION END -----*/ // MchBilt::read_ImpedanceStateAllowed_READ return true; } //-------------------------------------------------------- /** * Method : MchBilt::is_TemperatureState_allowed() * Description : Execution allowed for Temperature attribute. */ //-------------------------------------------------------- bool MchBilt::is_Temperature_allowed(Tango::AttReqType type) { // Not any excluded states for Temperature attribute in READ access. /*----- PROTECTED REGION ID(MchBilt::read_TemperatureStateAllowed_READ) ENABLED START -----*/ /*----- PROTECTED REGION END -----*/ // MchBilt::read_TemperatureStateAllowed_READ return true; } //-------------------------------------------------------- /** * Method : MchBilt::is_BiltStatesState_allowed() * Description : Execution allowed for BiltStates attribute. */ //-------------------------------------------------------- bool MchBilt::is_BiltStates_allowed(Tango::AttReqType type) { // Not any excluded states for BiltStates attribute in READ access. /*----- PROTECTED REGION ID(MchBilt::read_BiltStatesStateAllowed_READ) ENABLED START -----*/ /*----- PROTECTED REGION END -----*/ // MchBilt::read_BiltStatesStateAllowed_READ return true; } //-------------------------------------------------------- /** * Method : MchBilt::is_BiltNamesState_allowed() * Description : Execution allowed for BiltNames attribute. */ //-------------------------------------------------------- bool MchBilt::is_BiltNames_allowed(Tango::AttReqType type) { // Not any excluded states for BiltNames attribute in READ access. /*----- PROTECTED REGION ID(MchBilt::read_BiltNamesStateAllowed_READ) ENABLED START -----*/ /*----- PROTECTED REGION END -----*/ // MchBilt::read_BiltNamesStateAllowed_READ return true; } //-------------------------------------------------------- /** * Method : MchBilt::is_BiltLocationsState_allowed() * Description : Execution allowed for BiltLocations attribute. */ //-------------------------------------------------------- bool MchBilt::is_BiltLocations_allowed(Tango::AttReqType type) { // Not any excluded states for BiltLocations attribute in READ access. /*----- PROTECTED REGION ID(MchBilt::read_BiltLocationsStateAllowed_READ) ENABLED START -----*/ /*----- PROTECTED REGION END -----*/ // MchBilt::read_BiltLocationsStateAllowed_READ return true; } //-------------------------------------------------------- /** * Method : MchBilt::is_DisableACCurrentState_allowed() * Description : Execution allowed for DisableACCurrent attribute. */ //-------------------------------------------------------- bool MchBilt::is_DisableACCurrent_allowed(Tango::AttReqType type) { // Not any excluded states for DisableACCurrent attribute in READ access. /*----- PROTECTED REGION ID(MchBilt::read_DisableACCurrentStateAllowed_READ) ENABLED START -----*/ /*----- PROTECTED REGION END -----*/ // MchBilt::read_DisableACCurrentStateAllowed_READ return true; } //================================================= // Dynamic Attributes Allowed Methods //================================================= /*----- PROTECTED REGION ID(MchBilt::are_dynamic_attributes_allowed) ENABLED START -----*/ // Add your code to check if dynamic attributes are alowed /*----- PROTECTED REGION END -----*/ // MchBilt::are_dynamic_attributes_allowed //================================================= // Commands Allowed Methods //================================================= //-------------------------------------------------------- /** * Method : MchBilt::is_OnState_allowed() * Description : Execution allowed for On command. */ //-------------------------------------------------------- bool MchBilt::is_On_allowed(const CORBA::Any &any) { // Not any excluded states for On command. /*----- PROTECTED REGION ID(MchBilt::OnStateAllowed) ENABLED START -----*/ /*----- PROTECTED REGION END -----*/ // MchBilt::OnStateAllowed return true; } //-------------------------------------------------------- /** * Method : MchBilt::is_OffState_allowed() * Description : Execution allowed for Off command. */ //-------------------------------------------------------- bool MchBilt::is_Off_allowed(const CORBA::Any &any) { // Not any excluded states for Off command. /*----- PROTECTED REGION ID(MchBilt::OffStateAllowed) ENABLED START -----*/ /*----- PROTECTED REGION END -----*/ // MchBilt::OffStateAllowed return true; } //-------------------------------------------------------- /** * Method : MchBilt::is_ResetState_allowed() * Description : Execution allowed for Reset command. */ //-------------------------------------------------------- bool MchBilt::is_Reset_allowed(const CORBA::Any &any) { // Not any excluded states for Reset command. /*----- PROTECTED REGION ID(MchBilt::ResetStateAllowed) ENABLED START -----*/ /*----- PROTECTED REGION END -----*/ // MchBilt::ResetStateAllowed return true; } //-------------------------------------------------------- /** * Method : MchBilt::is_EnableAcCurrentState_allowed() * Description : Execution allowed for EnableAcCurrent command. */ //-------------------------------------------------------- bool MchBilt::is_EnableAcCurrent_allowed(const CORBA::Any &any) { // Not any excluded states for EnableAcCurrent command. /*----- PROTECTED REGION ID(MchBilt::EnableAcCurrentStateAllowed) ENABLED START -----*/ /*----- PROTECTED REGION END -----*/ // MchBilt::EnableAcCurrentStateAllowed return true; } //-------------------------------------------------------- /** * Method : MchBilt::is_DisableAcCurrentState_allowed() * Description : Execution allowed for DisableAcCurrent command. */ //-------------------------------------------------------- bool MchBilt::is_DisableAcCurrent_allowed(const CORBA::Any &any) { // Not any excluded states for DisableAcCurrent command. /*----- PROTECTED REGION ID(MchBilt::DisableAcCurrentStateAllowed) ENABLED START -----*/ /*----- PROTECTED REGION END -----*/ // MchBilt::DisableAcCurrentStateAllowed return true; } /*----- PROTECTED REGION ID(MchBilt::are_dynamic_commands_allowed) ENABLED START -----*/ // Add your code to check if dynamic commands are alowed /*----- PROTECTED REGION END -----*/ // MchBilt::are_dynamic_commands_allowed } // namespace MchBilt_ns Revision-number: 86 Prop-content-length: 248 Content-length: 248 K 10 svn:author V 5 meyer K 8 svn:date V 27 2011-08-05T13:41:08.000000Z K 7 svn:log V 147 Added the commands EnableAcCurrent and DisableAcCurrent. These commands allow to enable or disable the remote AC current settings from the Liberas PROPS-END Node-path: powersupply/itest/Bilt/trunk/Bilt.cpp Node-kind: file Node-action: change Text-content-length: 39171 Text-content-md5: dda6fce477314f30cebc374a65107236 Content-length: 39171 static const char *RcsId = "$Id: Bilt.cpp,v 1.23 2011-08-05 13:41:08 meyer Exp $"; //+============================================================================= // // file : Bilt.cpp // // description : C++ source for the Bilt and its commands. // The class is derived from Device. It represents the // CORBA servant object which will be accessed from the // network. All commands which can be executed on the // Bilt are implemented in this file. // // project : TANGO Device Server // // $Author: meyer $ // // $Revision: 1.23 $ // // $Revision: 1.23 $ // $Date: 2011-08-05 13:41:08 $ // // SVN only: // $HeadURL: $ // // CVS only: // $Source: /segfs/tango/cvsroot/cppserver/machine/powersupply/SrSteerers/tango/Bilt/Bilt.cpp,v $ // $Log: not supported by cvs2svn $ // Revision 1.22 2011-03-17 14:53:40 meyer // Cleaned-up the code and added an averaging for the impedance calculation. // // Revision 1.21 2011-01-12 12:33:59 meyer // Added attribute to indicate the power supply location. // // Revision 1.20 2011-01-12 08:50:06 meyer // Deleted the wait time for the next reading after writing. // Deleted sleep time during current writing. // // Revision 1.19 2010/11/26 08:40:04 meyer // Caught exceptions in in dev_state around DevImp::dev_state. // Temperature alarm checking might return an exception. // // Sleep time between the writing og current settings set to 20ms. // // Revision 1.18 2010/11/23 07:12:39 meyer // Changed placement of bilt_mutex in write_Current. // // Revision 1.17 2010/11/17 11:42:48 meyer // Replaced the INVALID attribute quality by an exception. // This should avoid a bug in the Tango api which does not take the // attribute quality into account during alarm checking! // // Revision 1.16 2010/11/10 14:00:29 meyer // Changed unit of AC RMS and average value from A to mA. // // Revision 1.15 2010-11-10 12:01:29 meyer // Changed type of Temperatures attribute from long to double and moved // temperature reading to the acquisition thread. // // Revision 1.14 2010/06/21 07:13:05 meyer // Added a spectrum attribute for the temperature measurements and changed to libMagnet version 1.4. // // Revision 1.13 2010/05/01 16:58:39 meyer // Changed alarm limits for the impedance attribute. // // Revision 1.12 2010/03/16 14:54:58 meyer // Added reconnection method. // // Revision 1.11 2010-02-18 16:46:31 meyer // Filled-in code for SetpointCheck // // Revision 1.10 2010-02-12 16:35:13 meyer // Added SetPoleCurrent command again. // // Revision 1.9 2010-02-11 16:35:27 meyer // Currents settings understand NaN values. // Deleted StePoleCurrent command. // // Revision 1.8 2010/02/10 12:27:31 meyer // Restructured Bilt class. // Acquistion is now done by a thread and only the multi channel data // gets exported. A single channel class (BiltCh) was created. // // Revision 1.7 2009/12/18 12:01:40 meyer // Corrected alarm handling in dev_state() // // Revision 1.6 2009/11/27 13:49:26 meyer // Modified structure! The pole is no longer a device. // The device is now a magnet with three poles. // // Revision 1.5 2009/11/26 10:46:58 meyer // Updated for libMagnet_V120 // // Revision 1.4 2009/11/24 09:21:46 meyer // Absolut value for impedance // // Revision 1.3 2009/11/23 16:46:58 meyer // Corrected state, status and exception handling // // Revision 1.2 2009/11/06 12:46:25 meyer // Added impedance attribute and corrected fromatting of attribute values. // // Revision 1.1.1.1 2009/11/04 16:23:02 meyer // Imported using TkCVS // // // copyleft : European Synchrotron Radiation Facility // BP 220, Grenoble 38043 // FRANCE // //-============================================================================= // // This file is generated by POGO // (Program Obviously used to Generate tango Object) // // (c) - Software Engineering Group - ESRF //============================================================================= //=================================================================== // // The following table gives the correspondence // between commands and method name. // // Command name | Method name // ---------------------------------------- // State | dev_state() // Status | dev_status() // On | on() // Off | off() // Reset | reset() // SetPoleAcCurrent | set_pole_ac_current() // LocalPoleControl | local_pole_control() // SetpointCheck | setpoint_check() // SetPoleCurrent | set_pole_current() // EnableAcCurrent | enable_ac_current() // DisableAcCurrent | disable_ac_current() // //=================================================================== #include #include #include #include #include namespace Bilt_ns { //+---------------------------------------------------------------------------- // // method : Bilt::Bilt(string &s) // // description : constructor for simulated Bilt // // in : - cl : Pointer to the DeviceClass object // - s : Device name // //----------------------------------------------------------------------------- Bilt::Bilt(Tango::DeviceClass *cl,string &s) :Tango::Device_4Impl(cl,s.c_str()) { init_device(); } Bilt::Bilt(Tango::DeviceClass *cl,const char *s) :Tango::Device_4Impl(cl,s) { init_device(); } Bilt::Bilt(Tango::DeviceClass *cl,const char *s,const char *d) :Tango::Device_4Impl(cl,s,d) { init_device(); } //+---------------------------------------------------------------------------- // // method : Bilt::delete_device() // // description : will be called at device destruction or at init command. // //----------------------------------------------------------------------------- void Bilt::delete_device() { // Delete device allocated objects if ( acquisition_thread != NULL ) { data_mutex.lock(); exit_thread = true; data_mutex.unlock(); // join now the thread until it exits int *rv; acquisition_thread->join((void **)&rv); cout << "Bilt::delete_device(): Exit acquisition thread !!!" << endl; } // Delete connection to the power supply delete BILT; BILT = NULL; } //+---------------------------------------------------------------------------- // // method : Bilt::init_device() // // description : will be called at device initialization. // //----------------------------------------------------------------------------- void Bilt::init_device() { INFO_STREAM << "Bilt::Bilt() create device " << device_name << endl; // Initialise variables to default values //-------------------------------------------- get_device_property(); set_state (Tango::OFF); // set the power supply location string // Bilt device naming = room-rack-nu.ch. string dev_name = get_name(); int pos = dev_name.rfind ('/'); string room = dev_name.substr (pos+1, string::npos); pos = room.find ('-'); string rack = room.substr (pos+1, string::npos); room = room.substr (0, pos); pos = rack.find ('-'); string number = rack.substr (pos+1, string::npos); rack = rack.substr (0, pos); string channels; if ( number.find ('a') != string::npos ) { channels = "1,2,3"; } else { channels = "4,5,6"; } number = number.substr (0, 1); ps_location = "Room: " + room + " Cubicle: " + rack + " Crate pos.: " + number + " Ch.: " + channels; DEBUG_STREAM << "Power supply location : " << ps_location << endl; // Create the access to the power supply try { BILT = new itest::TMagnet (iPAddress.c_str(), magnetNumber); } catch (itest::ItestException &e) { try { create_tango_exception (e, mdata_errors, "Init failure" , "Cannot initialise ITEST libray objects", "Bilt::init_device"); } catch (Tango::DevFailed &e) { set_state (Tango::UNKNOWN); } } // initialise with the actual current set point values try { for (int i=0; ipole(i).get_current_DC(); } Tango::MultiAttribute *attr_list = get_device_attr(); Tango::WAttribute &attr_curr = attr_list->get_w_attr_by_name ("Currents"); attr_curr.set_write_value(¤ts_dc[0], currents_dc.size()); } catch (itest::ItestException &e) { try { create_tango_exception (e, mdata_errors, "Init failure" , "Cannot read the actual current set point values", "Bilt::init_device"); } catch (Tango::DevFailed &e) { set_state (Tango::UNKNOWN); } } // initialise and start the acquisition thread exit_thread = false; acquisition_thread = new AcquisitionThread(this, data_mutex, bilt_mutex); } //+---------------------------------------------------------------------------- // // method : Bilt::get_device_property() // // description : Read the device properties from database. // //----------------------------------------------------------------------------- void Bilt::get_device_property() { // Initialize your default values here (if not done with POGO). //------------------------------------------------------------------ BILT = NULL; bilt_connection_lost = false; acquisition_thread = NULL; struct timeval now; gettimeofday (&now, NULL); data_set_time = now; data_read_time = now; // intitialise mdada structure for magnet read values mdata.magnet = -1; mdata.state = -1; for (int i=0; i_UseDb==true) get_db_device()->get_property(dev_prop); Tango::DbDatum def_prop, cl_prop; BiltClass *ds_class = (static_cast(get_device_class())); int i = -1; // Try to initialize IPAddress from class property cl_prop = ds_class->get_class_property(dev_prop[++i].name); if (cl_prop.is_empty()==false) cl_prop >> iPAddress; else { // Try to initialize IPAddress from default device value def_prop = ds_class->get_default_device_property(dev_prop[i].name); if (def_prop.is_empty()==false) def_prop >> iPAddress; } // And try to extract IPAddress value from database if (dev_prop[i].is_empty()==false) dev_prop[i] >> iPAddress; // Try to initialize MagnetNumber from class property cl_prop = ds_class->get_class_property(dev_prop[++i].name); if (cl_prop.is_empty()==false) cl_prop >> magnetNumber; else { // Try to initialize MagnetNumber from default device value def_prop = ds_class->get_default_device_property(dev_prop[i].name); if (def_prop.is_empty()==false) def_prop >> magnetNumber; } // And try to extract MagnetNumber value from database if (dev_prop[i].is_empty()==false) dev_prop[i] >> magnetNumber; // Try to initialize UpdatePeriod from class property cl_prop = ds_class->get_class_property(dev_prop[++i].name); if (cl_prop.is_empty()==false) cl_prop >> updatePeriod; else { // Try to initialize UpdatePeriod from default device value def_prop = ds_class->get_default_device_property(dev_prop[i].name); if (def_prop.is_empty()==false) def_prop >> updatePeriod; } // And try to extract UpdatePeriod value from database if (dev_prop[i].is_empty()==false) dev_prop[i] >> updatePeriod; // End of Automatic code generation //------------------------------------------------------------------ } //+---------------------------------------------------------------------------- // // method : Bilt::always_executed_hook() // // description : method always executed before any command is executed // //----------------------------------------------------------------------------- void Bilt::always_executed_hook() { } //+---------------------------------------------------------------------------- // // method : Bilt::read_attr_hardware // // description : Hardware acquisition for attributes. // //----------------------------------------------------------------------------- void Bilt::read_attr_hardware(vector &attr_list) { DEBUG_STREAM << "Bilt::read_attr_hardware(vector &attr_list) entering... "<< endl; // Add your own code here } //+---------------------------------------------------------------------------- // // method : Bilt::read_Location // // description : Extract real attribute values for Location acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_Location(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_Location(Tango::Attribute &attr) entering... "<< endl; location = const_cast (ps_location.c_str()); attr.set_value (&location); } //+---------------------------------------------------------------------------- // // method : Bilt::read_Temperatures // // description : Extract real attribute values for Temperatures acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_Temperatures(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_Temperatures(Tango::Attribute &attr) entering... "<< endl; omni_mutex_lock l(data_mutex); if ( temp_errors.length() != 0 ) { attr.set_quality(Tango::ATTR_INVALID); } else { attr.set_value (&(temperatures[0]), 2*POLES); } } //+---------------------------------------------------------------------------- // // method : Bilt::read_FramesPerSecond // // description : Extract real attribute values for FramesPerSecond acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_FramesPerSecond(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_FramesPerSecond(Tango::Attribute &attr) entering... "<< endl; omni_mutex_lock l(data_mutex); if ( fdata_errors.length() != 0 ) attr.set_quality(Tango::ATTR_INVALID); else { for (int i=0; ipole(i).get_switch(); } if ( switch_state == 1 ) local_control[i] = false; else local_control[i] = true; } } catch (itest::ItestException &e) { create_tango_exception (e, "Read failure" , "Cannot read the actual switch states", "Bilt::read_LocalControls"); } attr.set_value (&(local_control[0]), POLES); } //+---------------------------------------------------------------------------- // // method : Bilt::read_SetCurrentsRMS // // description : Extract real attribute values for SetCurrentsRMS acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_SetCurrentsRMS(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_SetCurrentsRMS(Tango::Attribute &attr) entering... "<< endl; omni_mutex_lock l(data_mutex); if ( fdata_errors.length() != 0 ) attr.set_quality(Tango::ATTR_INVALID); else { for (int i=0; i CURRENT_LIMIT ) { if ( isnan(impedances[i]) ) { impedances[i] = fabs (mdata.idata[i].measvolt / mdata.idata[i].meascurr); //cout << "nan " << i << " : " << impedances[i] << endl; } else { // Averaging to avoid impedance alarms when changing the // current settings. /* An = p * Yn + (1 - p)An-1 */ /* with 0 < p < 1 */ /* p = 1 / nu_average */ double p = 1.0 / 3; // Averaging over three values impedances[i] = p * (fabs (mdata.idata[i].measvolt / mdata.idata[i].meascurr)) + (1 - p) * impedances[i]; //cout << "average " << i << " : " << impedances[i] << endl; } } else { //cout << "limit" << i << " : " << mdata.idata[i].meascurr << endl; impedances[i] = nan("NaN"); } } } attr.set_value (&(impedances[0]), POLES); } //+---------------------------------------------------------------------------- // // method : Bilt::write_Currents // // description : Write Currents attribute values to hardware. // //----------------------------------------------------------------------------- void Bilt::write_Currents(Tango::WAttribute &attr) { DEBUG_STREAM << "Bilt::write_Currents(Tango::WAttribute &attr) entering... "<< endl; const double *set_currents; // check the correct number of setpoints if ( attr.get_write_value_length() == POLES ) attr.get_write_value(set_currents); else { TangoSys_MemStream tms; tms << "Wrong number of setpoints!" << endl; Tango::Except::throw_exception("WriteError", tms.str(), "Bilt::write_Currents"); } // apply setpoints to the poles try { omni_mutex_lock l(bilt_mutex); for (int i=0; ipole(i).set_current_DC (set_currents[i]); } // initialise the set time, to be sure that the next // returned read value is newer and contains the changes. struct timeval now; gettimeofday (&now, NULL); data_set_time = now; } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot write DC current values", "Bilt::write_Currents"); } } //+---------------------------------------------------------------------------- // // method : Bilt::read_Currents // // description : Extract real attribute values for Currents acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_Currents(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_Currents(Tango::Attribute &attr) entering... "<< endl; omni_mutex_lock l(data_mutex); if ( mdata_errors.length() != 0 ) attr.set_quality(Tango::ATTR_INVALID); else { for (int i=0; iset_state(1); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot switch on pole", "Bilt::on"); } } //+------------------------------------------------------------------ /** * method: Bilt::off * * description: method to execute "Off" * Turns of power supply * * */ //+------------------------------------------------------------------ void Bilt::off() { DEBUG_STREAM << "Bilt::off(): entering... !" << endl; // Add your own code to control device here try { omni_mutex_lock l(bilt_mutex); BILT->set_state(0); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot switch off pole", "Bilt::off"); } } //+------------------------------------------------------------------ /** * method: Bilt::reset * * description: method to execute "Reset" * Reset faults and alarms * * */ //+------------------------------------------------------------------ void Bilt::reset() { DEBUG_STREAM << "Bilt::reset(): entering... !" << endl; // Add your own code to control device here try { omni_mutex_lock l(bilt_mutex); BILT->clear_all_err(); BILT->clear_alarm(); for (int i=0; ipole(i).clear_ferrors(); } } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot reset pole", "Bilt::reset"); } } //+------------------------------------------------------------------ /** * method: Bilt::set_pole_ac_current * * description: method to execute "SetPoleAcCurrent" * Set the AC current for one Pole. * [0] = pole number, [1] = current * * @param argin [0] = pole number, [1] = current * */ //+------------------------------------------------------------------ void Bilt::set_pole_ac_current(const Tango::DevVarDoubleArray *argin) { DEBUG_STREAM << "Bilt::set_pole_ac_current(): entering... !" << endl; // Add your own code to control device here // argin[0] = pole number if ( (*argin)[0] < 0 || (*argin)[0] >= POLES ) { TangoSys_MemStream tms; tms << "The entered Pole number is out of range" << endl; Tango::Except::throw_exception("WriteError", tms.str(), "Bilt::set_pole_ac_current"); } try { omni_mutex_lock l(bilt_mutex); BILT->pole((int)(*argin)[0]).set_current_AC ((*argin)[1]); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot write AC current value", "Bilt::set_pole_ac_current"); } } //+------------------------------------------------------------------ /** * method: Bilt::local_pole_control * * description: method to execute "LocalPoleControl" * Set the AC current for one Pole. * [0] = pole number, [1] = local control true/false * * @param argin [0] = pole number, [1] = local control true/false * */ //+------------------------------------------------------------------ void Bilt::local_pole_control(const Tango::DevVarShortArray *argin) { DEBUG_STREAM << "Bilt::local_pole_control(): entering... !" << endl; // Add your own code to control device here // argin[0] = pole number if ( (*argin)[0] < 0 || (*argin)[0] >= POLES ) { TangoSys_MemStream tms; tms << "The entered Pole number is out of range" << endl; Tango::Except::throw_exception("WriteError", tms.str(), "Bilt::local_pole_control"); } // argin[1] = true or false (1 or 0 ) if ( (*argin)[1] != 0 && (*argin)[1] != 1 ) { TangoSys_MemStream tms; tms << "Local control can only be choosen as 0 or 1 (false or true)" << endl; Tango::Except::throw_exception("WriteError", tms.str(), "Bilt::local_pole_control"); } try { int switch_state; if ( (*argin)[1] == true ) switch_state = 0; else switch_state = 1; omni_mutex_lock l(bilt_mutex); BILT->pole((*argin)[0]).set_switch (switch_state); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot write switch state", "Bilt::local_pole_control"); } } //+------------------------------------------------------------------ /** * method: Bilt::set_pole_current * * description: method to execute "SetPoleCurrent" * Set the current for one Pole. * [0] = pole number, [1] = current * * @param argin [0] = pole number, [1] = current * */ //+------------------------------------------------------------------ void Bilt::set_pole_current(const Tango::DevVarDoubleArray *argin) { DEBUG_STREAM << "Bilt::set_pole_current(): entering... !" << endl; // Add your own code to control device here // argin[0] = pole number if ( (*argin)[0] < 0 || (*argin)[0] >= POLES ) { TangoSys_MemStream tms; tms << "The entered Pole number is out of range" << endl; Tango::Except::throw_exception("WriteError", tms.str(), "Bilt::set_pole_current"); } try { omni_mutex_lock l(bilt_mutex); BILT->pole((int)(*argin)[0]).set_current_DC ((*argin)[1]); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot write current value", "Bilt::set_pole_current"); } // make sure that the current set values are correct! try { omni_mutex_lock l(bilt_mutex); for (int i=0; ipole(i).get_current_DC(); } Tango::MultiAttribute *attr_list = get_device_attr(); Tango::WAttribute &attr_curr = attr_list->get_w_attr_by_name ("Currents"); attr_curr.set_write_value(¤ts_dc[0], currents_dc.size()); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot read the actual current set point values", "Bilt::set_pole_current"); } // initialise the set time, to be sure that the next // returned read value is newer and contains the changes. struct timeval now; gettimeofday (&now, NULL); data_set_time = now; } //+------------------------------------------------------------------ /** * method: Bilt::create_tango_exception() * * description: convert an itest exception into a tango exception * * * in : - &e : Reference to itest exception * - reason : Reason of the local Tango exception to be added to the stack * - desc : Description for the local Tango exception to be added to the stack * - origin : Origin if the local Tango exception to be added to the stack */ //+------------------------------------------------------------------ void Bilt::create_tango_exception (itest::ItestException &e, string reason, string desc, string origin) { Tango::DevErrorList errors; create_tango_exception (e, errors, reason, desc, origin); } //+------------------------------------------------------------------ /** * method: Bilt::create_tango_exception() * * description: convert an itest exception into a tango exception * * * in : - &e : Reference to itest exception * - errors : Tango error list to use, to store exception info * - reason : Reason of the local Tango exception to be added to the stack * - desc : Description for the local Tango exception to be added to the stack * - origin : Origin if the local Tango exception to be added to the stack */ //+------------------------------------------------------------------ void Bilt::create_tango_exception (itest::ItestException &e, Tango::DevErrorList &errors, string reason, string desc, string origin) { DEBUG_STREAM << "Bilt::create_tango_exception(): entering... !" << endl; errors.length(e.errors.size() + 1); int i; for(i=0; idevice_status data member) and returns it to the caller. * * @return Status description * */ //+------------------------------------------------------------------ Tango::ConstDevString Bilt::dev_status() { //Tango::ConstDevString argout = DeviceImpl::dev_status(); DEBUG_STREAM << "Bilt::dev_status(): entering... !" << endl; // Add your own code to control device here stringstream status; status << "PS Location : " << ps_location << endl; Tango::DevState state = dev_state(); switch (state) { case Tango::ON: status << "State : ON" << endl; break; case Tango::OFF: status << "State : OFF" << endl; break; case Tango::ALARM: { status << "State : Alarm" << endl; omni_mutex_lock l(data_mutex); for (int i=0; i 10W in 10ms!" << endl; else { if ( mdata.idata[i].fail == "TEMP" ) status << "Fault descr. : Max. temp on semiconductor reached!" << endl; else { if ( mdata.idata[i].fail == "PWSO" ) status << "Fault descr. : Delivered power > 40W in 100ms!" << endl; else { status << "Fault descr. : Unkown fault code!" << endl; } } } } } } } break; } default: { { omni_mutex_lock l(data_mutex); status << "State : Unknown" << endl; if ( bilt_connection_lost == true ) { status << "Connection lost to BILT power supply, trying to reconnect!" << endl; status << endl; } if ( mdata_errors.length() > 0 ) status << "Error stack : " << endl; for(int i=0; idevice_state data member) and returns it to the caller. * * @return State Code * */ //+------------------------------------------------------------------ Tango::DevState Bilt::dev_state() { Tango::DevState argout; try { argout = DeviceImpl::dev_state(); } catch (Tango::DevFailed &e) { // just ignore reading exceptions! } DEBUG_STREAM << "Bilt::dev_state(): entering... !" << endl; // Add your own code to control device here int state; int errors; try { omni_mutex_lock l(data_mutex); state = mdata.state; INFO_STREAM << "magnet state for " << get_name() << " = " << state << endl; errors = mdata_errors.length(); INFO_STREAM << "mdata errors = " << mdata_errors.length() << endl; } catch (Tango::DevFailed &e) { // do nothing! // Just avoid exceptions when executing state or status! } if ( errors != 0 ) set_state (Tango::UNKNOWN); else { // set the device state switch (state) { case -1: set_state (Tango::UNKNOWN); //bilt_connection_lost = true; break; case 0: set_state (Tango::OFF); break; case 1: set_state (Tango::ON); break; case 2: set_state (Tango::ALARM); break; case 3: set_state (Tango::FAULT); break; default: set_state (Tango::UNKNOWN); break; } } // Check for attribute alarms if ( get_state() == Tango::ON && argout == Tango::ALARM ) set_state (Tango::ALARM); return get_state(); } //+------------------------------------------------------------------ /** * method: Bilt::setpoint_check * * description: method to execute "SetpointCheck" * Check the given current values against the specified limits. * * @param argin Setpoint values for the Poles * @return true when settings are OK * */ //+------------------------------------------------------------------ Tango::DevBoolean Bilt::setpoint_check(const Tango::DevVarDoubleArray *argin) { Tango::DevBoolean argout ; DEBUG_STREAM << "Bilt::setpoint_check(): entering... !" << endl; // Add your own code to control device here // get the min and max values for the current settings Tango::MultiAttribute *attr_list = get_device_attr(); Tango::WAttribute &attr_curr = attr_list->get_w_attr_by_name ("Currents"); double min, max; attr_curr.get_min_value(min); attr_curr.get_max_value(max); INFO_STREAM << "min = " << min << " max = " << max << endl; // check the input values argout = true; for ( int i=0; ilength(); i++ ) { INFO_STREAM << "i = " << i << " curr = " << (*argin)[i] << endl; if ( (*argin)[i] < min || (*argin)[i] > max ) { argout = false; break; } } return argout; } //+------------------------------------------------------------------ /** * method: Bilt::enable_ac_current * * description: method to execute "EnableAcCurrent" * Enables the dynamic 10kHz AC current settings from the Liberas. * * */ //+------------------------------------------------------------------ void Bilt::enable_ac_current() { DEBUG_STREAM << "Bilt::enable_ac_current(): entering... !" << endl; // Add your own code to control device here omni_mutex_lock l(bilt_mutex); int switch_state = 1; for ( unsigned int i=0; ipole(i).set_current_AC (0.0); BILT->pole(i).set_switch (switch_state); } } //+------------------------------------------------------------------ /** * method: Bilt::disable_ac_current * * description: method to execute "DisableAcCurrent" * Disables the dynamic 10kHz AC current settings from the Liberas. * * */ //+------------------------------------------------------------------ void Bilt::disable_ac_current() { DEBUG_STREAM << "Bilt::disable_ac_current(): entering... !" << endl; // Add your own code to control device here omni_mutex_lock l(bilt_mutex); int switch_state = 0; for ( unsigned int i=0; ipole(i).set_current_AC (0.0); BILT->pole(i).set_switch (switch_state); } } } // namespace Node-path: powersupply/itest/Bilt/trunk/Bilt.h Node-kind: file Node-action: change Text-content-length: 13942 Text-content-md5: 61a87e823bdb74dd3eacd78176e21e4b Content-length: 13942 //============================================================================= // // file : Bilt.h // // description : Include for the Bilt class. // // project : BILT multi channel power supply // // $Author: meyer $ // // $Revision: 1.16 $ // $Date: 2011-08-05 13:41:08 $ // // SVN only: // $HeadURL: $ // // CVS only: // $Source: /segfs/tango/cvsroot/cppserver/machine/powersupply/SrSteerers/tango/Bilt/Bilt.h,v $ // $Log: not supported by cvs2svn $ // Revision 1.15 2011-01-12 12:34:00 meyer // Added attribute to indicate the power supply location. // // Revision 1.14 2010/11/23 07:12:39 meyer // Changed placement of bilt_mutex in write_Current. // // Revision 1.13 2010/11/10 14:00:29 meyer // Changed unit of AC RMS and average value from A to mA. // // Revision 1.12 2010-11-10 12:01:29 meyer // Changed type of Temperatures attribute from long to double and moved // temperature reading to the acquisition thread. // // Revision 1.11 2010/08/31 07:54:48 meyer // Changed impedence alarm calculation limit. // // Revision 1.10 2010/06/21 07:13:05 meyer // Added a spectrum attribute for the temperature measurements and changed to libMagnet version 1.4. // // Revision 1.9 2010/05/01 16:58:39 meyer // Changed alarm limits for the impedance attribute. // // Revision 1.8 2010/03/16 14:54:58 meyer // Added reconnection method. // // Revision 1.7 2010-02-12 16:35:13 meyer // Added SetPoleCurrent command again. // // Revision 1.6 2010-02-11 16:35:27 meyer // Currents settings understand NaN values. // Deleted StePoleCurrent command. // // Revision 1.5 2010/02/10 12:27:31 meyer // Restructured Bilt class. // Acquistion is now done by a thread and only the multi channel data // gets exported. A single channel class (BiltCh) was created. // // Revision 1.4 2009/11/27 13:49:26 meyer // Modified structure! The pole is no longer a device. // The device is now a magnet with three poles. // // Revision 1.3 2009/11/26 10:46:58 meyer // Updated for libMagnet_V120 // // Revision 1.2 2009/11/06 12:46:25 meyer // Added impedance attribute and corrected fromatting of attribute values. // // Revision 1.1.1.1 2009/11/04 16:23:02 meyer // Imported using TkCVS // // // copyleft : European Synchrotron Radiation Facility // BP 220, Grenoble 38043 // FRANCE // //============================================================================= // // This file is generated by POGO // (Program Obviously used to Generate tango Object) // // (c) - Software Engineering Group - ESRF //============================================================================= #ifndef _BILT_H #define _BILT_H #include #include #include //using namespace Tango; /** * @author $Author: meyer $ * @version $Revision: 1.16 $ */ // Add your own constant definitions here. //----------------------------------------------- // Number of poles per magnet #define POLES 3 // Current limit for a valid impedeance calculation #define CURRENT_LIMIT 0.05 // define sleep times #define SLEEP_NS 20000000 // 20 ms #define SHORT_SLEEP_NS 5000000 // 5 ms namespace Bilt_ns { class AcquisitionThread; /** * Class Description: * The BILT multi channel power supply will be used with 3 channels for the ESRF fast * feedback systems. * The power supply can be controlled in 2 ways : * By this device server for slow or human control or * by the Libera Beam Position monitors for fast feedback with closed loop control. * The devices are exported as one device per steerer magnet. Every device has three * channels. The channels (poles) cannot be switched on individually but have their * individual set points and measurement values. */ /* * Device States Description: * Tango::ON : Magnet is ON, all three channels are ON. * Tango::OFF : Magnet is OFF, all three channels are OFF. * Tango::FAULT : Error detected by the BILT magnet. * Tango::ALARM : Alarm detected on one or more channels. * Tango::UNKNOWN : Communication fault */ class Bilt: public Tango::Device_4Impl { public : // Add your own data members here //----------------------------------------- // Here is the Start of the automatic code generation part //------------------------------------------------------------- /** * @name attributes * Attribute member data. */ //@{ Tango::DevString *attr_Location_read; Tango::DevDouble *attr_Currents_read; Tango::DevDouble attr_Currents_write; Tango::DevDouble *attr_Voltages_read; Tango::DevDouble *attr_Impedances_read; Tango::DevDouble *attr_SetCurrentsRMS_read; Tango::DevDouble *attr_SetCurrentsAverage_read; Tango::DevULong *attr_FramesPerSecond_read; Tango::DevULong *attr_ErrorsPerSecond_read; Tango::DevULong *attr_ErrorCounters_read; Tango::DevBoolean *attr_LocalControls_read; Tango::DevDouble *attr_Temperatures_read; //@} /** * @name Device properties * Device properties member data. */ //@{ /** * IP Address of BILT controller. * Each controller includes several magnets and * each magnet includes 3 power supplies, * for corrections in the X, Y and Z planes. * * */ string iPAddress; /** * Magnet number from 1 to 48 */ Tango::DevShort magnetNumber; /** * The update period for the data reading from the power supply in milli seconds. */ Tango::DevLong updatePeriod; //@} /** * @name Device properties * Device property member data. */ //@{ //@} /**@name Constructors * Miscellaneous constructors */ //@{ /** * Constructs a newly allocated Command object. * * @param cl Class. * @param s Device Name */ Bilt(Tango::DeviceClass *cl,string &s); /** * Constructs a newly allocated Command object. * * @param cl Class. * @param s Device Name */ Bilt(Tango::DeviceClass *cl,const char *s); /** * Constructs a newly allocated Command object. * * @param cl Class. * @param s Device name * @param d Device description. */ Bilt(Tango::DeviceClass *cl,const char *s,const char *d); //@} /**@name Destructor * Only one destructor is defined for this class */ //@{ /** * The object destructor. */ ~Bilt() {delete_device();}; /** * will be called at device destruction or at init command. */ void delete_device(); //@} /**@name Miscellaneous methods */ //@{ /** * Initialize the device */ virtual void init_device(); /** * Always executed method before execution command method. */ virtual void always_executed_hook(); //@} /** * @name Bilt methods prototypes */ //@{ /** * Hardware acquisition for attributes. */ virtual void read_attr_hardware(vector &attr_list); /** * Extract real attribute values for Location acquisition result. */ virtual void read_Location(Tango::Attribute &attr); /** * Extract real attribute values for Currents acquisition result. */ virtual void read_Currents(Tango::Attribute &attr); /** * Write Currents attribute values to hardware. */ virtual void write_Currents(Tango::WAttribute &attr); /** * Extract real attribute values for Voltages acquisition result. */ virtual void read_Voltages(Tango::Attribute &attr); /** * Extract real attribute values for Impedances acquisition result. */ virtual void read_Impedances(Tango::Attribute &attr); /** * Extract real attribute values for SetCurrentsRMS acquisition result. */ virtual void read_SetCurrentsRMS(Tango::Attribute &attr); /** * Extract real attribute values for SetCurrentsAverage acquisition result. */ virtual void read_SetCurrentsAverage(Tango::Attribute &attr); /** * Extract real attribute values for FramesPerSecond acquisition result. */ virtual void read_FramesPerSecond(Tango::Attribute &attr); /** * Extract real attribute values for ErrorsPerSecond acquisition result. */ virtual void read_ErrorsPerSecond(Tango::Attribute &attr); /** * Extract real attribute values for ErrorCounters acquisition result. */ virtual void read_ErrorCounters(Tango::Attribute &attr); /** * Extract real attribute values for LocalControls acquisition result. */ virtual void read_LocalControls(Tango::Attribute &attr); /** * Extract real attribute values for Temperatures acquisition result. */ virtual void read_Temperatures(Tango::Attribute &attr); /** * Read/Write allowed for Location attribute. */ virtual bool is_Location_allowed(Tango::AttReqType type); /** * Read/Write allowed for Currents attribute. */ virtual bool is_Currents_allowed(Tango::AttReqType type); /** * Read/Write allowed for Voltages attribute. */ virtual bool is_Voltages_allowed(Tango::AttReqType type); /** * Read/Write allowed for Impedances attribute. */ virtual bool is_Impedances_allowed(Tango::AttReqType type); /** * Read/Write allowed for SetCurrentsRMS attribute. */ virtual bool is_SetCurrentsRMS_allowed(Tango::AttReqType type); /** * Read/Write allowed for SetCurrentsAverage attribute. */ virtual bool is_SetCurrentsAverage_allowed(Tango::AttReqType type); /** * Read/Write allowed for FramesPerSecond attribute. */ virtual bool is_FramesPerSecond_allowed(Tango::AttReqType type); /** * Read/Write allowed for ErrorsPerSecond attribute. */ virtual bool is_ErrorsPerSecond_allowed(Tango::AttReqType type); /** * Read/Write allowed for ErrorCounters attribute. */ virtual bool is_ErrorCounters_allowed(Tango::AttReqType type); /** * Read/Write allowed for LocalControls attribute. */ virtual bool is_LocalControls_allowed(Tango::AttReqType type); /** * Read/Write allowed for Temperatures attribute. */ virtual bool is_Temperatures_allowed(Tango::AttReqType type); /** * Execution allowed for On command. */ virtual bool is_On_allowed(const CORBA::Any &any); /** * Execution allowed for Off command. */ virtual bool is_Off_allowed(const CORBA::Any &any); /** * Execution allowed for Reset command. */ virtual bool is_Reset_allowed(const CORBA::Any &any); /** * Execution allowed for SetPoleAcCurrent command. */ virtual bool is_SetPoleAcCurrent_allowed(const CORBA::Any &any); /** * Execution allowed for LocalPoleControl command. */ virtual bool is_LocalPoleControl_allowed(const CORBA::Any &any); /** * Execution allowed for SetpointCheck command. */ virtual bool is_SetpointCheck_allowed(const CORBA::Any &any); /** * Execution allowed for SetPoleCurrent command. */ virtual bool is_SetPoleCurrent_allowed(const CORBA::Any &any); /** * Execution allowed for EnableAcCurrent command. */ virtual bool is_EnableAcCurrent_allowed(const CORBA::Any &any); /** * Execution allowed for DisableAcCurrent command. */ virtual bool is_DisableAcCurrent_allowed(const CORBA::Any &any); /** * This command gets the device state (stored in its device_state data member) and returns it to the caller. * @return State Code * @exception DevFailed */ virtual Tango::DevState dev_state(); /** * This command gets the device status (stored in its device_status data member) and returns it to the caller. * @return Status description * @exception DevFailed */ virtual Tango::ConstDevString dev_status(); /** * Turns on power supply. * @exception DevFailed */ void on(); /** * Turns of power supply * @exception DevFailed */ void off(); /** * Reset faults and alarms * @exception DevFailed */ void reset(); /** * Set the AC current for one Pole. * [0] = pole number, [1] = current * @param argin [0] = pole number, [1] = current * @exception DevFailed */ void set_pole_ac_current(const Tango::DevVarDoubleArray *); /** * Set the AC current for one Pole. * [0] = pole number, [1] = local control true/false * @param argin [0] = pole number, [1] = local control true/false * @exception DevFailed */ void local_pole_control(const Tango::DevVarShortArray *); /** * Check the given current values against the specified limits. * @param argin Setpoint values for the Poles * @return true when settings are OK * @exception DevFailed */ Tango::DevBoolean setpoint_check(const Tango::DevVarDoubleArray *); /** * Set the current for one Pole. * [0] = pole number, [1] = current * @param argin [0] = pole number, [1] = current * @exception DevFailed */ void set_pole_current(const Tango::DevVarDoubleArray *); /** * Enables the dynamic 10kHz AC current settings from the Liberas. * @exception DevFailed */ void enable_ac_current(); /** * Disables the dynamic 10kHz AC current settings from the Liberas. * @exception DevFailed */ void disable_ac_current(); /** * Read the device properties from database */ void get_device_property(); //@} // Here is the end of the automatic code generation part //------------------------------------------------------------- protected : // Add your own data members here //----------------------------------------- friend class AcquisitionThread; AcquisitionThread *acquisition_thread; omni_mutex data_mutex; omni_mutex bilt_mutex; short exit_thread; struct timeval data_set_time; struct timeval data_read_time; void create_tango_exception (itest::ItestException &e, string reason, string desc, string origin); void create_tango_exception (itest::ItestException &e, Tango::DevErrorList &errors, string reason, string desc, string origin); itest::TMagnet *BILT; bool bilt_connection_lost; struct itest::mdata mdata; struct itest::fdata fdata[POLES]; Tango::DevErrorList mdata_errors; Tango::DevErrorList fdata_errors; Tango::DevErrorList temp_errors; vector currents_dc; vector currents_ac; vector voltages; vector impedances; vector currents_rms; vector currents_average; vector frames_per_sec; vector errors_per_sec; vector error_counters; vector temperatures; bool local_control[3]; string ps_location; Tango::DevString location; }; } // namespace_ns #endif // _BILT_H Node-path: powersupply/itest/Bilt/trunk/BiltClass.cpp Node-kind: file Node-action: change Text-content-length: 30430 Text-content-md5: 598849d1aa63ef202e6e8adc2738ce0b Content-length: 30430 static const char *ClassId = "$Id: BiltClass.cpp,v 1.19 2011-08-05 13:41:08 meyer Exp $"; static const char *TagName = "$Name: not supported by cvs2svn $"; static const char *CvsPath = "$Source: /segfs/tango/cvsroot/cppserver/machine/powersupply/SrSteerers/tango/Bilt/BiltClass.cpp,v $"; static const char *SvnPath = "$HeadURL: $"; static const char *HttpServer = "http://www.esrf.fr/computing/cs/tango/tango_doc/ds_doc/"; //+============================================================================= // // file : BiltClass.cpp // // description : C++ source for the BiltClass. A singleton // class derived from DeviceClass. It implements the // command list and all properties and methods required // by the Bilt once per process. // // project : TANGO Device Server // // $Author: meyer $ // // $Revision: 1.19 $ // // $Log: not supported by cvs2svn $ // Revision 1.18 2011-01-12 12:34:00 meyer // Added attribute to indicate the power supply location. // // Revision 1.17 2010/11/16 08:50:37 meyer // Changed temperature alarm from 40 to 40 C. // // Revision 1.16 2010/11/10 14:00:29 meyer // Changed unit of AC RMS and average value from A to mA. // // Revision 1.15 2010-11-10 11:59:11 meyer // Changed type of Temperatures attribute from long to double. // Added default alarm and polling values. // // Revision 1.14 2010/06/24 11:43:10 meyer // Corrected memory leak when the reconnection to the power supply fails. // // Revision 1.13 2010/06/21 07:13:05 meyer // Added a spectrum attribute for the temperature measurements and changed to libMagnet version 1.4. // // Revision 1.12 2010/05/01 16:58:39 meyer // Changed alarm limits for the impedance attribute. // // Revision 1.11 2010/03/16 15:03:33 meyer // Excluded Steerer class. // // Revision 1.10 2010-02-12 16:35:13 meyer // Added SetPoleCurrent command again. // // Revision 1.9 2010-02-11 16:35:27 meyer // Currents settings understand NaN values. // Deleted StePoleCurrent command. // // Revision 1.8 2010/02/10 16:22:15 meyer // Release_3_0 // // Revision 1.7 2010/02/10 12:27:31 meyer // Restructured Bilt class. // Acquistion is now done by a thread and only the multi channel data // gets exported. A single channel class (BiltCh) was created. // // Revision 1.6 2009/12/18 12:02:18 meyer // Changed version number to 2.1 // // Revision 1.5 2009/11/27 13:49:26 meyer // Modified structure! The pole is no longer a device. // The device is now a magnet with three poles. // // Revision 1.4 2009/11/26 10:46:58 meyer // Updated for libMagnet_V120 // // Revision 1.3 2009/11/23 16:46:58 meyer // Corrected state, status and exception handling // // Revision 1.2 2009/11/06 12:46:25 meyer // Added impedance attribute and corrected fromatting of attribute values. // // Revision 1.1.1.1 2009/11/04 16:23:02 meyer // Imported using TkCVS // // // copyleft : European Synchrotron Radiation Facility // BP 220, Grenoble 38043 // FRANCE // //-============================================================================= // // This file is generated by POGO // (Program Obviously used to Generate tango Object) // // (c) - Software Engineering Group - ESRF //============================================================================= #include #include #include //+---------------------------------------------------------------------------- /** * Create BiltClass singleton and return it in a C function for Python usage */ //+---------------------------------------------------------------------------- extern "C" { #ifdef WIN32 __declspec(dllexport) #endif Tango::DeviceClass *_create_Bilt_class(const char *name) { return Bilt_ns::BiltClass::init(name); } } namespace Bilt_ns { //+---------------------------------------------------------------------------- // // method : DisableAcCurrentCmd::execute() // // description : method to trigger the execution of the command. // PLEASE DO NOT MODIFY this method core without pogo // // in : - device : The device on which the command must be executed // - in_any : The command input data // // returns : The command output data (packed in the Any object) // //----------------------------------------------------------------------------- CORBA::Any *DisableAcCurrentCmd::execute(Tango::DeviceImpl *device,const CORBA::Any &in_any) { cout2 << "DisableAcCurrentCmd::execute(): arrived" << endl; ((static_cast(device))->disable_ac_current()); return new CORBA::Any(); } //+---------------------------------------------------------------------------- // // method : EnableAcCurrentClass::execute() // // description : method to trigger the execution of the command. // PLEASE DO NOT MODIFY this method core without pogo // // in : - device : The device on which the command must be executed // - in_any : The command input data // // returns : The command output data (packed in the Any object) // //----------------------------------------------------------------------------- CORBA::Any *EnableAcCurrentClass::execute(Tango::DeviceImpl *device,const CORBA::Any &in_any) { cout2 << "EnableAcCurrentClass::execute(): arrived" << endl; ((static_cast(device))->enable_ac_current()); return new CORBA::Any(); } //+---------------------------------------------------------------------------- // // method : SetPoleCurrentCmd::execute() // // description : method to trigger the execution of the command. // PLEASE DO NOT MODIFY this method core without pogo // // in : - device : The device on which the command must be executed // - in_any : The command input data // // returns : The command output data (packed in the Any object) // //----------------------------------------------------------------------------- CORBA::Any *SetPoleCurrentCmd::execute(Tango::DeviceImpl *device,const CORBA::Any &in_any) { cout2 << "SetPoleCurrentCmd::execute(): arrived" << endl; const Tango::DevVarDoubleArray *argin; extract(in_any, argin); ((static_cast(device))->set_pole_current(argin)); return new CORBA::Any(); } //+---------------------------------------------------------------------------- // // method : SetpointCheckCmd::execute() // // description : method to trigger the execution of the command. // PLEASE DO NOT MODIFY this method core without pogo // // in : - device : The device on which the command must be executed // - in_any : The command input data // // returns : The command output data (packed in the Any object) // //----------------------------------------------------------------------------- CORBA::Any *SetpointCheckCmd::execute(Tango::DeviceImpl *device,const CORBA::Any &in_any) { cout2 << "SetpointCheckCmd::execute(): arrived" << endl; const Tango::DevVarDoubleArray *argin; extract(in_any, argin); return insert((static_cast(device))->setpoint_check(argin)); } //+---------------------------------------------------------------------------- // // method : LocalPoleControlCmd::execute() // // description : method to trigger the execution of the command. // PLEASE DO NOT MODIFY this method core without pogo // // in : - device : The device on which the command must be executed // - in_any : The command input data // // returns : The command output data (packed in the Any object) // //----------------------------------------------------------------------------- CORBA::Any *LocalPoleControlCmd::execute(Tango::DeviceImpl *device,const CORBA::Any &in_any) { cout2 << "LocalPoleControlCmd::execute(): arrived" << endl; const Tango::DevVarShortArray *argin; extract(in_any, argin); ((static_cast(device))->local_pole_control(argin)); return new CORBA::Any(); } //+---------------------------------------------------------------------------- // // method : SetPoleAcCurrentCmd::execute() // // description : method to trigger the execution of the command. // PLEASE DO NOT MODIFY this method core without pogo // // in : - device : The device on which the command must be executed // - in_any : The command input data // // returns : The command output data (packed in the Any object) // //----------------------------------------------------------------------------- CORBA::Any *SetPoleAcCurrentCmd::execute(Tango::DeviceImpl *device,const CORBA::Any &in_any) { cout2 << "SetPoleAcCurrentCmd::execute(): arrived" << endl; const Tango::DevVarDoubleArray *argin; extract(in_any, argin); ((static_cast(device))->set_pole_ac_current(argin)); return new CORBA::Any(); } //+---------------------------------------------------------------------------- // // method : OnCmd::execute() // // description : method to trigger the execution of the command. // PLEASE DO NOT MODIFY this method core without pogo // // in : - device : The device on which the command must be executed // - in_any : The command input data // // returns : The command output data (packed in the Any object) // //----------------------------------------------------------------------------- CORBA::Any *OnCmd::execute(Tango::DeviceImpl *device,const CORBA::Any &in_any) { cout2 << "OnCmd::execute(): arrived" << endl; ((static_cast(device))->on()); return new CORBA::Any(); } //+---------------------------------------------------------------------------- // // method : OffCmd::execute() // // description : method to trigger the execution of the command. // PLEASE DO NOT MODIFY this method core without pogo // // in : - device : The device on which the command must be executed // - in_any : The command input data // // returns : The command output data (packed in the Any object) // //----------------------------------------------------------------------------- CORBA::Any *OffCmd::execute(Tango::DeviceImpl *device,const CORBA::Any &in_any) { cout2 << "OffCmd::execute(): arrived" << endl; ((static_cast(device))->off()); return new CORBA::Any(); } //+---------------------------------------------------------------------------- // // method : ResetCmd::execute() // // description : method to trigger the execution of the command. // PLEASE DO NOT MODIFY this method core without pogo // // in : - device : The device on which the command must be executed // - in_any : The command input data // // returns : The command output data (packed in the Any object) // //----------------------------------------------------------------------------- CORBA::Any *ResetCmd::execute(Tango::DeviceImpl *device,const CORBA::Any &in_any) { cout2 << "ResetCmd::execute(): arrived" << endl; ((static_cast(device))->reset()); return new CORBA::Any(); } // //---------------------------------------------------------------- // Initialize pointer for singleton pattern //---------------------------------------------------------------- // BiltClass *BiltClass::_instance = NULL; //+---------------------------------------------------------------------------- // // method : BiltClass::BiltClass(string &s) // // description : constructor for the BiltClass // // in : - s : The class name // //----------------------------------------------------------------------------- BiltClass::BiltClass(string &s):DeviceClass(s) { cout2 << "Entering BiltClass constructor" << endl; set_default_property(); get_class_property(); write_class_property(); cout2 << "Leaving BiltClass constructor" << endl; } //+---------------------------------------------------------------------------- // // method : BiltClass::~BiltClass() // // description : destructor for the BiltClass // //----------------------------------------------------------------------------- BiltClass::~BiltClass() { _instance = NULL; } //+---------------------------------------------------------------------------- // // method : BiltClass::instance // // description : Create the object if not already done. Otherwise, just // return a pointer to the object // // in : - name : The class name // //----------------------------------------------------------------------------- BiltClass *BiltClass::init(const char *name) { if (_instance == NULL) { try { string s(name); _instance = new BiltClass(s); } catch (bad_alloc) { throw; } } return _instance; } BiltClass *BiltClass::instance() { if (_instance == NULL) { cerr << "Class is not initialised !!" << endl; exit(-1); } return _instance; } //+---------------------------------------------------------------------------- // // method : BiltClass::command_factory // // description : Create the command object(s) and store them in the // command list // //----------------------------------------------------------------------------- void BiltClass::command_factory() { command_list.push_back(new OnCmd("On", Tango::DEV_VOID, Tango::DEV_VOID, "", "", Tango::OPERATOR)); command_list.push_back(new OffCmd("Off", Tango::DEV_VOID, Tango::DEV_VOID, "", "", Tango::OPERATOR)); command_list.push_back(new ResetCmd("Reset", Tango::DEV_VOID, Tango::DEV_VOID, "", "", Tango::OPERATOR)); command_list.push_back(new SetPoleAcCurrentCmd("SetPoleAcCurrent", Tango::DEVVAR_DOUBLEARRAY, Tango::DEV_VOID, "[0] = pole number, [1] = current", "", Tango::EXPERT)); command_list.push_back(new LocalPoleControlCmd("LocalPoleControl", Tango::DEVVAR_SHORTARRAY, Tango::DEV_VOID, "[0] = pole number, [1] = local control true/false", "", Tango::EXPERT)); command_list.push_back(new SetpointCheckCmd("SetpointCheck", Tango::DEVVAR_DOUBLEARRAY, Tango::DEV_BOOLEAN, "Setpoint values for the Poles", "true when settings are OK", Tango::OPERATOR)); command_list.push_back(new SetPoleCurrentCmd("SetPoleCurrent", Tango::DEVVAR_DOUBLEARRAY, Tango::DEV_VOID, "[0] = pole number, [1] = current", "", Tango::EXPERT)); command_list.push_back(new EnableAcCurrentClass("EnableAcCurrent", Tango::DEV_VOID, Tango::DEV_VOID, "", "", Tango::OPERATOR)); command_list.push_back(new DisableAcCurrentCmd("DisableAcCurrent", Tango::DEV_VOID, Tango::DEV_VOID, "", "", Tango::OPERATOR)); // add polling if any for (unsigned int i=0 ; ilength() ; i++) { cout4 << "Device name : " << (*devlist_ptr)[i].in() << endl; // Create devices and add it into the device list //---------------------------------------------------- device_list.push_back(new Bilt(this, (*devlist_ptr)[i])); // Export device to the outside world // Check before if database used. //--------------------------------------------- if ((Tango::Util::_UseDb == true) && (Tango::Util::_FileDb == false)) export_device(device_list.back()); else export_device(device_list.back(), (*devlist_ptr)[i]); } // End of Automatic code generation //------------------------------------------------------------- } //+---------------------------------------------------------------------------- // Method: BiltClass::attribute_factory(vector &att_list) //----------------------------------------------------------------------------- void BiltClass::attribute_factory(vector &att_list) { // Attribute : Location LocationAttrib *location = new LocationAttrib(); Tango::UserDefaultAttrProp location_prop; location_prop.set_label("Location"); location_prop.set_unit(" "); location_prop.set_format("%s"); location_prop.set_description("The pysical location of the power supply in the form:\n"); location->set_default_properties(location_prop); att_list.push_back(location); // Attribute : Currents CurrentsAttrib *currents = new CurrentsAttrib(); Tango::UserDefaultAttrProp currents_prop; currents_prop.set_label("Currents"); currents_prop.set_unit("A"); currents_prop.set_format("%6.4f"); currents_prop.set_max_value("1.8"); currents_prop.set_min_value("-1.8"); currents_prop.set_description("The measured currents of the three poles."); currents->set_default_properties(currents_prop); att_list.push_back(currents); // Attribute : Voltages VoltagesAttrib *voltages = new VoltagesAttrib(); Tango::UserDefaultAttrProp voltages_prop; voltages_prop.set_label("Voltages"); voltages_prop.set_unit("V"); voltages_prop.set_format("%6.4"); voltages_prop.set_description("The measured voltages of the three poles."); voltages->set_default_properties(voltages_prop); att_list.push_back(voltages); // Attribute : Impedances ImpedancesAttrib *impedances = new ImpedancesAttrib(); Tango::UserDefaultAttrProp impedances_prop; impedances_prop.set_label("Impedances"); impedances_prop.set_unit("Ohm"); impedances_prop.set_format("%4.2f"); impedances_prop.set_max_alarm("5.0"); impedances_prop.set_min_alarm("2.8"); impedances_prop.set_description("Calculated impedances for the three poles."); impedances->set_default_properties(impedances_prop); impedances->set_polling_period(3000); att_list.push_back(impedances); // Attribute : SetCurrentsRMS SetCurrentsRMSAttrib *set_currents_rms = new SetCurrentsRMSAttrib(); Tango::UserDefaultAttrProp set_currents_rms_prop; set_currents_rms_prop.set_label("RMS AC current setpoints/s"); set_currents_rms_prop.set_unit("mA"); set_currents_rms_prop.set_format("%6.3"); set_currents_rms_prop.set_description("Statistic when driven by the Libera. One RMS value for every pole\nof the magnet.\nRMS value of the AC setpoint applied on the DAC during the last second.\nX=sqr( (sum(setAC)*sum(setAC)) / n - ((sum(setAC)/n) *(sum(setAC)/n)) )"); set_currents_rms->set_default_properties(set_currents_rms_prop); att_list.push_back(set_currents_rms); // Attribute : SetCurrentsAverage SetCurrentsAverageAttrib *set_currents_average = new SetCurrentsAverageAttrib(); Tango::UserDefaultAttrProp set_currents_average_prop; set_currents_average_prop.set_label("Average AC current setpoints/s"); set_currents_average_prop.set_unit("mA"); set_currents_average_prop.set_format("%6.3"); set_currents_average_prop.set_description("Statistic when driven by the Libera. One average value for every pole\nof the magnet.\nAverage value of the AC setpoint applied on the DAC during the last second."); set_currents_average->set_default_properties(set_currents_average_prop); att_list.push_back(set_currents_average); // Attribute : FramesPerSecond FramesPerSecondAttrib *frames_per_second = new FramesPerSecondAttrib(); Tango::UserDefaultAttrProp frames_per_second_prop; frames_per_second_prop.set_label("Frames per second"); frames_per_second_prop.set_display_unit(" "); frames_per_second_prop.set_format("%6d"); frames_per_second_prop.set_description("Number of settings applied during the last second"); frames_per_second->set_default_properties(frames_per_second_prop); att_list.push_back(frames_per_second); // Attribute : ErrorsPerSecond ErrorsPerSecondAttrib *errors_per_second = new ErrorsPerSecondAttrib(); Tango::UserDefaultAttrProp errors_per_second_prop; errors_per_second_prop.set_label("Errors per second"); errors_per_second_prop.set_display_unit(" "); errors_per_second_prop.set_format("%6d"); errors_per_second_prop.set_description("Errors detected during the last second"); errors_per_second->set_default_properties(errors_per_second_prop); att_list.push_back(errors_per_second); // Attribute : ErrorCounters ErrorCountersAttrib *error_counters = new ErrorCountersAttrib(); Tango::UserDefaultAttrProp error_counters_prop; error_counters_prop.set_label("Error counters"); error_counters_prop.set_unit(" "); error_counters_prop.set_format("%6d"); error_counters_prop.set_description("Statistic when driven by the Libera.\nThe total number of errors since the last reset for the \nthree poles."); error_counters->set_default_properties(error_counters_prop); att_list.push_back(error_counters); // Attribute : LocalControls LocalControlsAttrib *local_controls = new LocalControlsAttrib(); Tango::UserDefaultAttrProp local_controls_prop; local_controls_prop.set_description("Indicated whether the individual channels are in local control mode for the \nAC current control. True = local control activated."); local_controls->set_default_properties(local_controls_prop); att_list.push_back(local_controls); // Attribute : Temperatures TemperaturesAttrib *temperatures = new TemperaturesAttrib(); Tango::UserDefaultAttrProp temperatures_prop; temperatures_prop.set_label("Temperatures"); temperatures_prop.set_unit("C"); temperatures_prop.set_format("%6.0f"); temperatures_prop.set_max_alarm("45"); temperatures_prop.set_description("Temperature measurements for the three poles."); temperatures->set_default_properties(temperatures_prop); temperatures->set_polling_period(30000); att_list.push_back(temperatures); // End of Automatic code generation //------------------------------------------------------------- } //+---------------------------------------------------------------------------- // // method : BiltClass::get_class_property() // // description : Read the class properties from database. // //----------------------------------------------------------------------------- void BiltClass::get_class_property() { // Initialize your default values here (if not done with POGO). //------------------------------------------------------------------ // Read class properties from database.(Automatic code generation) //------------------------------------------------------------------ // Call database and extract values //-------------------------------------------- if (Tango::Util::instance()->_UseDb==true) get_db_class()->get_property(cl_prop); Tango::DbDatum def_prop; int i = -1; // End of Automatic code generation //------------------------------------------------------------------ } //+---------------------------------------------------------------------------- // // method : BiltClass::set_default_property // // description: Set default property (class and device) for wizard. // For each property, add to wizard property name and description // If default value has been set, add it to wizard property and // store it in a DbDatum. // //----------------------------------------------------------------------------- void BiltClass::set_default_property() { string prop_name; string prop_desc; string prop_def; vector vect_data; // Set Default Class Properties // Set Default Device Properties prop_name = "IPAddress"; prop_desc = "IP Address of BILT controller.\nEach controller includes several magnets and\neach magnet includes 3 power supplies,\nfor corrections in the X, Y and Z planes.\n\n"; prop_def = "0.0.0.0"; vect_data.clear(); vect_data.push_back("0.0.0.0"); if (prop_def.length()>0) { Tango::DbDatum data(prop_name); data << vect_data ; dev_def_prop.push_back(data); add_wiz_dev_prop(prop_name, prop_desc, prop_def); } else add_wiz_dev_prop(prop_name, prop_desc); prop_name = "MagnetNumber"; prop_desc = "Magnet number from 1 to 48"; prop_def = "0"; vect_data.clear(); vect_data.push_back("0"); if (prop_def.length()>0) { Tango::DbDatum data(prop_name); data << vect_data ; dev_def_prop.push_back(data); add_wiz_dev_prop(prop_name, prop_desc, prop_def); } else add_wiz_dev_prop(prop_name, prop_desc); prop_name = "UpdatePeriod"; prop_desc = "The update period for the data reading from the power supply in milli seconds."; prop_def = "1000"; vect_data.clear(); vect_data.push_back("1000"); if (prop_def.length()>0) { Tango::DbDatum data(prop_name); data << vect_data ; dev_def_prop.push_back(data); add_wiz_dev_prop(prop_name, prop_desc, prop_def); } else add_wiz_dev_prop(prop_name, prop_desc); } //+---------------------------------------------------------------------------- // // method : BiltClass::write_class_property // // description : Set class description as property in database // //----------------------------------------------------------------------------- void BiltClass::write_class_property() { // First time, check if database used //-------------------------------------------- if (Tango::Util::_UseDb == false) return; Tango::DbData data; string classname = get_name(); string header; string::size_type start, end; // Put title Tango::DbDatum title("ProjectTitle"); string str_title("BILT multi channel power supply"); title << str_title; data.push_back(title); // Put Description Tango::DbDatum description("Description"); vector str_desc; str_desc.push_back("The BILT multi channel power supply will be used with 3 channels for the ESRF fast"); str_desc.push_back("feedback systems."); str_desc.push_back("The power supply can be controlled in 2 ways :"); str_desc.push_back("By this device server for slow or human control or"); str_desc.push_back("by the Libera Beam Position monitors for fast feedback with closed loop control."); str_desc.push_back("The devices are exported as one device per steerer magnet. Every device has three"); str_desc.push_back("channels. The channels (poles) cannot be switched on individually but have their"); str_desc.push_back("individual set points and measurement values."); description << str_desc; data.push_back(description); // put cvs or svn location string filename(classname); filename += "Class.cpp"; // Create a string with the class ID to // get the string into the binary string class_id(ClassId); // check for cvs information string src_path(CvsPath); start = src_path.find("/"); if (start!=string::npos) { end = src_path.find(filename); if (end>start) { string strloc = src_path.substr(start, end-start); // Check if specific repository start = strloc.find("/cvsroot/"); if (start!=string::npos && start>0) { string repository = strloc.substr(0, start); if (repository.find("/segfs/")!=string::npos) strloc = "ESRF:" + strloc.substr(start, strloc.length()-start); } Tango::DbDatum cvs_loc("cvs_location"); cvs_loc << strloc; data.push_back(cvs_loc); } } // check for svn information else { string src_path(SvnPath); start = src_path.find("://"); if (start!=string::npos) { end = src_path.find(filename); if (end>start) { header = "$HeadURL: "; start = header.length(); string strloc = src_path.substr(start, (end-start)); Tango::DbDatum svn_loc("svn_location"); svn_loc << strloc; data.push_back(svn_loc); } } } // Get CVS or SVN revision tag // CVS tag string tagname(TagName); header = "$Name: "; start = header.length(); string endstr(" $"); end = tagname.find(endstr); if (end!=string::npos && end>start) { string strtag = tagname.substr(start, end-start); Tango::DbDatum cvs_tag("cvs_tag"); cvs_tag << strtag; data.push_back(cvs_tag); } // SVN tag string svnpath(SvnPath); header = "$HeadURL: "; start = header.length(); end = svnpath.find(endstr); if (end!=string::npos && end>start) { string strloc = svnpath.substr(start, end-start); string tagstr ("/tags/"); start = strloc.find(tagstr); if ( start!=string::npos ) { start = start + tagstr.length(); end = strloc.find(filename); string strtag = strloc.substr(start, end-start-1); Tango::DbDatum svn_tag("svn_tag"); svn_tag << strtag; data.push_back(svn_tag); } } // Get URL location string httpServ(HttpServer); if (httpServ.length()>0) { Tango::DbDatum db_doc_url("doc_url"); db_doc_url << httpServ; data.push_back(db_doc_url); } // Put inheritance Tango::DbDatum inher_datum("InheritedFrom"); vector inheritance; inheritance.push_back("Device_4Impl"); inher_datum << inheritance; data.push_back(inher_datum); // Call database and and values //-------------------------------------------- get_db_class()->put_property(data); } } // namespace Node-path: powersupply/itest/Bilt/trunk/BiltClass.h Node-kind: file Node-action: change Text-content-length: 15175 Text-content-md5: 129ebd78fd158db40723a5d4bfb624e2 Content-length: 15175 //============================================================================= // // file : BiltClass.h // // description : Include for the BiltClass root class. // This class is the singleton class for // the Bilt device class. // It contains all properties and methods which the // Bilt requires only once e.g. the commands. // // project : TANGO Device Server // // $Author: meyer $ // // $Revision: 1.13 $ // $Date: 2011-08-05 13:41:08 $ // // SVN only: // $HeadURL: $ // // CVS only: // $Source: /segfs/tango/cvsroot/cppserver/machine/powersupply/SrSteerers/tango/Bilt/BiltClass.h,v $ // $Log: not supported by cvs2svn $ // Revision 1.12 2011-01-12 12:34:00 meyer // Added attribute to indicate the power supply location. // // Revision 1.11 2010/11/10 14:00:29 meyer // Changed unit of AC RMS and average value from A to mA. // // Revision 1.10 2010-11-10 11:59:11 meyer // Changed type of Temperatures attribute from long to double. // Added default alarm and polling values. // // Revision 1.9 2010/06/21 07:13:05 meyer // Added a spectrum attribute for the temperature measurements and changed to libMagnet version 1.4. // // Revision 1.8 2010/05/01 16:58:39 meyer // Changed alarm limits for the impedance attribute. // // Revision 1.7 2010-02-12 16:35:13 meyer // Added SetPoleCurrent command again. // // Revision 1.6 2010-02-11 16:35:27 meyer // Currents settings understand NaN values. // Deleted StePoleCurrent command. // // Revision 1.5 2010/02/10 12:27:31 meyer // Restructured Bilt class. // Acquistion is now done by a thread and only the multi channel data // gets exported. A single channel class (BiltCh) was created. // // Revision 1.4 2009/11/27 13:49:26 meyer // Modified structure! The pole is no longer a device. // The device is now a magnet with three poles. // // Revision 1.3 2009/11/26 10:46:58 meyer // Updated for libMagnet_V120 // // Revision 1.2 2009/11/06 12:46:25 meyer // Added impedance attribute and corrected fromatting of attribute values. // // Revision 1.1.1.1 2009/11/04 16:23:02 meyer // Imported using TkCVS // // // copyleft : European Synchrotron Radiation Facility // BP 220, Grenoble 38043 // FRANCE // //============================================================================= // // This file is generated by POGO // (Program Obviously used to Generate tango Object) // // (c) - Software Engineering Group - ESRF //============================================================================= #ifndef _BILTCLASS_H #define _BILTCLASS_H #include #include namespace Bilt_ns {//===================================== // Define classes for attributes //===================================== class TemperaturesAttrib: public Tango::SpectrumAttr { public: TemperaturesAttrib():SpectrumAttr("Temperatures", Tango::DEV_DOUBLE, Tango::READ, 6) {}; ~TemperaturesAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_Temperatures(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_Temperatures_allowed(ty);} }; class LocalControlsAttrib: public Tango::SpectrumAttr { public: LocalControlsAttrib():SpectrumAttr("LocalControls", Tango::DEV_BOOLEAN, Tango::READ, 5) {}; ~LocalControlsAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_LocalControls(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_LocalControls_allowed(ty);} }; class ErrorCountersAttrib: public Tango::SpectrumAttr { public: ErrorCountersAttrib():SpectrumAttr("ErrorCounters", Tango::DEV_ULONG, Tango::READ, 3) {}; ~ErrorCountersAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_ErrorCounters(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_ErrorCounters_allowed(ty);} }; class ErrorsPerSecondAttrib: public Tango::SpectrumAttr { public: ErrorsPerSecondAttrib():SpectrumAttr("ErrorsPerSecond", Tango::DEV_ULONG, Tango::READ, 3) {}; ~ErrorsPerSecondAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_ErrorsPerSecond(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_ErrorsPerSecond_allowed(ty);} }; class FramesPerSecondAttrib: public Tango::SpectrumAttr { public: FramesPerSecondAttrib():SpectrumAttr("FramesPerSecond", Tango::DEV_ULONG, Tango::READ, 3) {}; ~FramesPerSecondAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_FramesPerSecond(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_FramesPerSecond_allowed(ty);} }; class SetCurrentsAverageAttrib: public Tango::SpectrumAttr { public: SetCurrentsAverageAttrib():SpectrumAttr("SetCurrentsAverage", Tango::DEV_DOUBLE, Tango::READ, 3) {}; ~SetCurrentsAverageAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_SetCurrentsAverage(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_SetCurrentsAverage_allowed(ty);} }; class SetCurrentsRMSAttrib: public Tango::SpectrumAttr { public: SetCurrentsRMSAttrib():SpectrumAttr("SetCurrentsRMS", Tango::DEV_DOUBLE, Tango::READ, 3) {}; ~SetCurrentsRMSAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_SetCurrentsRMS(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_SetCurrentsRMS_allowed(ty);} }; class ImpedancesAttrib: public Tango::SpectrumAttr { public: ImpedancesAttrib():SpectrumAttr("Impedances", Tango::DEV_DOUBLE, Tango::READ, 3) {}; ~ImpedancesAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_Impedances(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_Impedances_allowed(ty);} }; class VoltagesAttrib: public Tango::SpectrumAttr { public: VoltagesAttrib():SpectrumAttr("Voltages", Tango::DEV_DOUBLE, Tango::READ, 3) {}; ~VoltagesAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_Voltages(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_Voltages_allowed(ty);} }; class CurrentsAttrib: public Tango::SpectrumAttr { public: CurrentsAttrib():SpectrumAttr("Currents", Tango::DEV_DOUBLE, Tango::READ_WRITE, 3) {}; ~CurrentsAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_Currents(att);} virtual void write(Tango::DeviceImpl *dev,Tango::WAttribute &att) {(static_cast(dev))->write_Currents(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_Currents_allowed(ty);} }; class LocationAttrib: public Tango::Attr { public: LocationAttrib():Attr("Location", Tango::DEV_STRING, Tango::READ) {}; ~LocationAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_Location(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_Location_allowed(ty);} }; //========================================= // Define classes for commands //========================================= class DisableAcCurrentCmd : public Tango::Command { public: DisableAcCurrentCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out, const char *in_desc, const char *out_desc, Tango::DispLevel level) :Command(name,in,out,in_desc,out_desc, level) {}; DisableAcCurrentCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out) :Command(name,in,out) {}; ~DisableAcCurrentCmd() {}; virtual CORBA::Any *execute (Tango::DeviceImpl *dev, const CORBA::Any &any); virtual bool is_allowed (Tango::DeviceImpl *dev, const CORBA::Any &any) {return (static_cast(dev))->is_DisableAcCurrent_allowed(any);} }; class EnableAcCurrentClass : public Tango::Command { public: EnableAcCurrentClass(const char *name, Tango::CmdArgType in, Tango::CmdArgType out, const char *in_desc, const char *out_desc, Tango::DispLevel level) :Command(name,in,out,in_desc,out_desc, level) {}; EnableAcCurrentClass(const char *name, Tango::CmdArgType in, Tango::CmdArgType out) :Command(name,in,out) {}; ~EnableAcCurrentClass() {}; virtual CORBA::Any *execute (Tango::DeviceImpl *dev, const CORBA::Any &any); virtual bool is_allowed (Tango::DeviceImpl *dev, const CORBA::Any &any) {return (static_cast(dev))->is_EnableAcCurrent_allowed(any);} }; class SetPoleCurrentCmd : public Tango::Command { public: SetPoleCurrentCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out, const char *in_desc, const char *out_desc, Tango::DispLevel level) :Command(name,in,out,in_desc,out_desc, level) {}; SetPoleCurrentCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out) :Command(name,in,out) {}; ~SetPoleCurrentCmd() {}; virtual CORBA::Any *execute (Tango::DeviceImpl *dev, const CORBA::Any &any); virtual bool is_allowed (Tango::DeviceImpl *dev, const CORBA::Any &any) {return (static_cast(dev))->is_SetPoleCurrent_allowed(any);} }; class SetpointCheckCmd : public Tango::Command { public: SetpointCheckCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out, const char *in_desc, const char *out_desc, Tango::DispLevel level) :Command(name,in,out,in_desc,out_desc, level) {}; SetpointCheckCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out) :Command(name,in,out) {}; ~SetpointCheckCmd() {}; virtual CORBA::Any *execute (Tango::DeviceImpl *dev, const CORBA::Any &any); virtual bool is_allowed (Tango::DeviceImpl *dev, const CORBA::Any &any) {return (static_cast(dev))->is_SetpointCheck_allowed(any);} }; class LocalPoleControlCmd : public Tango::Command { public: LocalPoleControlCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out, const char *in_desc, const char *out_desc, Tango::DispLevel level) :Command(name,in,out,in_desc,out_desc, level) {}; LocalPoleControlCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out) :Command(name,in,out) {}; ~LocalPoleControlCmd() {}; virtual CORBA::Any *execute (Tango::DeviceImpl *dev, const CORBA::Any &any); virtual bool is_allowed (Tango::DeviceImpl *dev, const CORBA::Any &any) {return (static_cast(dev))->is_LocalPoleControl_allowed(any);} }; class SetPoleAcCurrentCmd : public Tango::Command { public: SetPoleAcCurrentCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out, const char *in_desc, const char *out_desc, Tango::DispLevel level) :Command(name,in,out,in_desc,out_desc, level) {}; SetPoleAcCurrentCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out) :Command(name,in,out) {}; ~SetPoleAcCurrentCmd() {}; virtual CORBA::Any *execute (Tango::DeviceImpl *dev, const CORBA::Any &any); virtual bool is_allowed (Tango::DeviceImpl *dev, const CORBA::Any &any) {return (static_cast(dev))->is_SetPoleAcCurrent_allowed(any);} }; class ResetCmd : public Tango::Command { public: ResetCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out, const char *in_desc, const char *out_desc, Tango::DispLevel level) :Command(name,in,out,in_desc,out_desc, level) {}; ResetCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out) :Command(name,in,out) {}; ~ResetCmd() {}; virtual CORBA::Any *execute (Tango::DeviceImpl *dev, const CORBA::Any &any); virtual bool is_allowed (Tango::DeviceImpl *dev, const CORBA::Any &any) {return (static_cast(dev))->is_Reset_allowed(any);} }; class OffCmd : public Tango::Command { public: OffCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out, const char *in_desc, const char *out_desc, Tango::DispLevel level) :Command(name,in,out,in_desc,out_desc, level) {}; OffCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out) :Command(name,in,out) {}; ~OffCmd() {}; virtual CORBA::Any *execute (Tango::DeviceImpl *dev, const CORBA::Any &any); virtual bool is_allowed (Tango::DeviceImpl *dev, const CORBA::Any &any) {return (static_cast(dev))->is_Off_allowed(any);} }; class OnCmd : public Tango::Command { public: OnCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out, const char *in_desc, const char *out_desc, Tango::DispLevel level) :Command(name,in,out,in_desc,out_desc, level) {}; OnCmd(const char *name, Tango::CmdArgType in, Tango::CmdArgType out) :Command(name,in,out) {}; ~OnCmd() {}; virtual CORBA::Any *execute (Tango::DeviceImpl *dev, const CORBA::Any &any); virtual bool is_allowed (Tango::DeviceImpl *dev, const CORBA::Any &any) {return (static_cast(dev))->is_On_allowed(any);} }; // // The BiltClass singleton definition // class #ifdef _TG_WINDOWS_ __declspec(dllexport) #endif BiltClass : public Tango::DeviceClass { public: // properties member data // add your own data members here //------------------------------------ public: Tango::DbData cl_prop; Tango::DbData cl_def_prop; Tango::DbData dev_def_prop; // Method prototypes static BiltClass *init(const char *); static BiltClass *instance(); ~BiltClass(); Tango::DbDatum get_class_property(string &); Tango::DbDatum get_default_device_property(string &); Tango::DbDatum get_default_class_property(string &); protected: BiltClass(string &); static BiltClass *_instance; void command_factory(); void get_class_property(); void attribute_factory(vector &); void write_class_property(); void set_default_property(); string get_cvstag(); string get_cvsroot(); private: void device_factory(const Tango::DevVarStringArray *); }; } // namespace Bilt_ns #endif // _BILTCLASS_H Node-path: powersupply/itest/Bilt/trunk/BiltStateMachine.cpp Node-kind: file Node-action: change Text-content-length: 12104 Text-content-md5: 043d4a196bb388372dd96d16f0bec60f Content-length: 12104 static const char *RcsId = "$Id $"; //+============================================================================= // // file : BiltStateMachine.cpp // // description : C++ source for the Bilt and its alowed // methods for commands and attributes // // project : TANGO Device Server // // $Author: meyer $ // // $Revision: 1.13 $ // $Date: 2011-08-05 13:41:08 $ // // SVN only: // $HeadURL: $ // // CVS only: // $Source: /segfs/tango/cvsroot/cppserver/machine/powersupply/SrSteerers/tango/Bilt/BiltStateMachine.cpp,v $ // $Log: not supported by cvs2svn $ // Revision 1.12 2011-01-12 12:34:00 meyer // Added attribute to indicate the power supply location. // // Revision 1.11 2010/11/10 14:00:29 meyer // Changed unit of AC RMS and average value from A to mA. // // Revision 1.10 2010-11-10 11:59:11 meyer // Changed type of Temperatures attribute from long to double. // Added default alarm and polling values. // // Revision 1.9 2010/06/21 07:13:05 meyer // Added a spectrum attribute for the temperature measurements and changed to libMagnet version 1.4. // // Revision 1.8 2010/05/01 16:58:39 meyer // Changed alarm limits for the impedance attribute. // // Revision 1.7 2010-02-12 16:35:13 meyer // Added SetPoleCurrent command again. // // Revision 1.6 2010-02-11 16:35:27 meyer // Currents settings understand NaN values. // Deleted StePoleCurrent command. // // Revision 1.5 2010/02/10 12:27:31 meyer // Restructured Bilt class. // Acquistion is now done by a thread and only the multi channel data // gets exported. A single channel class (BiltCh) was created. // // Revision 1.4 2009/11/27 13:49:26 meyer // Modified structure! The pole is no longer a device. // The device is now a magnet with three poles. // // Revision 1.3 2009/11/26 10:46:58 meyer // Updated for libMagnet_V120 // // Revision 1.2 2009/11/06 12:46:25 meyer // Added impedance attribute and corrected fromatting of attribute values. // // Revision 1.1.1.1 2009/11/04 16:23:02 meyer // Imported using TkCVS // // // copyleft : European Synchrotron Radiation Facility // BP 220, Grenoble 38043 // FRANCE // //-============================================================================= // // This file is generated by POGO // (Program Obviously used to Generate tango Object) // // (c) - Software Engineering Group - ESRF //============================================================================= #include #include #include /*==================================================================== * This file contains the methods to allow commands and attributes * read or write execution. * * If you wand to add your own code, add it between * the "End/Re-Start of Generated Code" comments. * * If you want, you can also add your own methods. *==================================================================== */ namespace Bilt_ns { //================================================= // Attributes Allowed Methods //================================================= //+---------------------------------------------------------------------------- // // method : Bilt::is_Voltages_allowed // // description : Read/Write allowed for Voltages attribute. // //----------------------------------------------------------------------------- bool Bilt::is_Voltages_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_Impedances_allowed // // description : Read/Write allowed for Impedances attribute. // //----------------------------------------------------------------------------- bool Bilt::is_Impedances_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_SetCurrentsRMS_allowed // // description : Read/Write allowed for SetCurrentsRMS attribute. // //----------------------------------------------------------------------------- bool Bilt::is_SetCurrentsRMS_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_SetCurrentsAverage_allowed // // description : Read/Write allowed for SetCurrentsAverage attribute. // //----------------------------------------------------------------------------- bool Bilt::is_SetCurrentsAverage_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_ErrorCounters_allowed // // description : Read/Write allowed for ErrorCounters attribute. // //----------------------------------------------------------------------------- bool Bilt::is_ErrorCounters_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_LocalControls_allowed // // description : Read/Write allowed for LocalControls attribute. // //----------------------------------------------------------------------------- bool Bilt::is_LocalControls_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_Currents_allowed // // description : Read/Write allowed for Currents attribute. // //----------------------------------------------------------------------------- bool Bilt::is_Currents_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_FramesPerSecond_allowed // // description : Read/Write allowed for FramesPerSecond attribute. // //----------------------------------------------------------------------------- bool Bilt::is_FramesPerSecond_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_ErrorsPerSecond_allowed // // description : Read/Write allowed for ErrorsPerSecond attribute. // //----------------------------------------------------------------------------- bool Bilt::is_ErrorsPerSecond_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_Temperatures_allowed // // description : Read/Write allowed for Temperatures attribute. // //----------------------------------------------------------------------------- bool Bilt::is_Temperatures_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_Location_allowed // // description : Read/Write allowed for Location attribute. // //----------------------------------------------------------------------------- bool Bilt::is_Location_allowed(Tango::AttReqType type) { // End of Generated Code // Re-Start of Generated Code return true; } //================================================= // Commands Allowed Methods //================================================= //+---------------------------------------------------------------------------- // // method : Bilt::is_On_allowed // // description : Execution allowed for On command. // //----------------------------------------------------------------------------- bool Bilt::is_On_allowed(const CORBA::Any &any) { if (get_state() == Tango::ON || get_state() == Tango::FAULT || get_state() == Tango::ALARM || get_state() == Tango::UNKNOWN) { // End of Generated Code // Re-Start of Generated Code return false; } return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_Off_allowed // // description : Execution allowed for Off command. // //----------------------------------------------------------------------------- bool Bilt::is_Off_allowed(const CORBA::Any &any) { if (get_state() == Tango::OFF) { // End of Generated Code // Re-Start of Generated Code return false; } return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_Reset_allowed // // description : Execution allowed for Reset command. // //----------------------------------------------------------------------------- bool Bilt::is_Reset_allowed(const CORBA::Any &any) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_SetPoleAcCurrent_allowed // // description : Execution allowed for SetPoleAcCurrent command. // //----------------------------------------------------------------------------- bool Bilt::is_SetPoleAcCurrent_allowed(const CORBA::Any &any) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_LocalPoleControl_allowed // // description : Execution allowed for LocalPoleControl command. // //----------------------------------------------------------------------------- bool Bilt::is_LocalPoleControl_allowed(const CORBA::Any &any) { if (get_state() == Tango::OFF || get_state() == Tango::FAULT || get_state() == Tango::UNKNOWN) { // End of Generated Code // Re-Start of Generated Code return false; } return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_SetpointCheck_allowed // // description : Execution allowed for SetpointCheck command. // //----------------------------------------------------------------------------- bool Bilt::is_SetpointCheck_allowed(const CORBA::Any &any) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_SetPoleCurrent_allowed // // description : Execution allowed for SetPoleCurrent command. // //----------------------------------------------------------------------------- bool Bilt::is_SetPoleCurrent_allowed(const CORBA::Any &any) { // End of Generated Code // Re-Start of Generated Code return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_EnableAcCurrent_allowed // // description : Execution allowed for EnableAcCurrent command. // //----------------------------------------------------------------------------- bool Bilt::is_EnableAcCurrent_allowed(const CORBA::Any &any) { if (get_state() == Tango::OFF || get_state() == Tango::FAULT || get_state() == Tango::UNKNOWN) { // End of Generated Code // Re-Start of Generated Code return false; } return true; } //+---------------------------------------------------------------------------- // // method : Bilt::is_DisableAcCurrent_allowed // // description : Execution allowed for DisableAcCurrent command. // //----------------------------------------------------------------------------- bool Bilt::is_DisableAcCurrent_allowed(const CORBA::Any &any) { if (get_state() == Tango::OFF || get_state() == Tango::FAULT || get_state() == Tango::UNKNOWN) { // End of Generated Code // Re-Start of Generated Code return false; } return true; } } // namespace Bilt_ns Revision-number: 87 Prop-content-length: 119 Content-length: 119 K 10 svn:author V 5 meyer K 8 svn:date V 27 2011-08-05T13:41:28.000000Z K 7 svn:log V 19 Set release to 3.9 PROPS-END Node-path: powersupply/itest/Bilt/trunk/Makefile Node-kind: file Node-action: change Text-content-length: 6884 Text-content-md5: edaf92628f61a3270fb593b94e5f1df9 Content-length: 6884 #============================================================================= # # file : Makefile # # description : Include for the Bilt class. # # project : Makefile to generate a Tango server # # $Author: meyer $ # # $Revision: 1.20 $ # # $Log: not supported by cvs2svn $ # Revision 1.19 2011-03-17 14:50:49 meyer # Changed version to 3.8 # # Revision 1.18 2011-01-12 12:35:00 meyer # Changed version to 3.7 # # Revision 1.17 2010/11/23 07:13:38 meyer # Changed version to 3.6 # # Revision 1.16 2010-11-10 11:59:30 meyer # Changed version to 3.5 # # Revision 1.15 2010-11-08 15:29:42 meyer # Linking now with libtango.a version 7.2! # # Revision 1.14 2010/06/24 11:44:00 meyer # Changed version to 3.4 # # Revision 1.13 2010/06/21 07:16:52 meyer # Changed version to 3.3 # # Revision 1.12 2010/06/21 07:13:05 meyer # Added a spectrum attribute for the temperature measurements and changed to libMagnet version 1.4. # # Revision 1.11 2010/03/19 15:27:01 meyer # Canged to version 3.2 # # Revision 1.10 2010/03/16 15:03:33 meyer # Excluded Steerer class. # # Revision 1.9 2010/03/16 14:57:56 meyer # Rlease_3_1 # # Revision 1.8 2010-02-11 16:35:27 meyer # Currents settings understand NaN values. # Deleted StePoleCurrent command. # # Revision 1.7 2010/02/10 16:22:15 meyer # Release_3_0 # # Revision 1.6 2010/02/10 12:27:31 meyer # Restructured Bilt class. # Acquistion is now done by a thread and only the multi channel data # gets exported. A single channel class (BiltCh) was created. # # Revision 1.5 2009/12/18 12:02:18 meyer # Changed version number to 2.1 # # Revision 1.4 2009/12/18 10:19:23 meyer # Using libMagnet version 130 now. # # Revision 1.3 2009/11/27 13:49:26 meyer # Modified structure! The pole is no longer a device. # The device is now a magnet with three poles. # # Revision 1.2 2009/11/26 10:46:58 meyer # Updated for libMagnet_V120 # # Revision 1.1.1.1 2009/11/04 16:23:02 meyer # Imported using TkCVS # # # copyleft : European Synchrotron Radiation Facility # BP 220, Grenoble 38043 # FRANCE # #============================================================================= # This file is generated by POGO # (Program Obviously used to Generate tango Object) # # (c) - Software Engineering Group - ESRF #============================================================================= # CLASS = Bilt MAJOR_VERS = 3 MINOR_VERS = 9 RELEASE = Release_$(MAJOR_VERS)_$(MINOR_VERS) OS = $(shell /csadmin/common/scripts/get_os) PROCESSOR = $(shell uname -p) #----------------------------------------- # Set default home directories #----------------------------------------- TANGO_HOME = /segfs/tango/release/$(BIN_DIR) CPP_SERVERS = $(TANGO_HOME)/classes ifdef no_debug DEBUG = -O else DEBUG = -g endif ifdef _solaris CC = CC BIN_DIR=$(OS)_CC AR_SL = $(CC) -mt -G VERS_OPT = -h SL_EXT = so endif ifdef linux CC = c++ CC_SHLIB = $(CC) -fPIC $(PROCESSOR)=1 ifdef x86_64 NBITS=_64 endif BIN_DIR=$(OS)$(NBITS) AR_SL = $(CC) -fPIC -shared SL_EXT = so VERS_OPT = -Wl,-soname, endif INCLUDE_DIRS = -I$(TANGO_HOME)/include -I. \ -I$(CPP_SERVERS)/include \ -I libMagnet_V140 OBJS_DIR = obj/$(BIN_DIR) LIB_DIRS = -L $(CPP_SERVERS)/lib \ -L $(TANGO_HOME)/lib \ -L libMagnet_V140 TARGET_LIB = $(CPP_SERVERS)/lib/libtgclasses.a #----------------------------------------- # Set CXXFLAGS and LFLAGS #----------------------------------------- ifdef _solaris CXXFLAGS = $(DEBUG) -mt -D_PTHREADS $(INCLUDE_DIRS) LFLAGS = $(DEBUG) $(LIB_DIRS) \ -ltango \ -llog4tango \ -lomniORB4 \ -lomniDynamic4 \ -lomnithread \ -lCOS4 \ -lpthread \ -lposix4 -lsocket -lnsl \ -ltgclasses endif ifdef linux CXXFLAGS = -g -D_REENTRANT $(INCLUDE_DIRS) LFLAGS = $(DEBUG) $(LIB_DIRS) \ -ltango \ -llog4tango \ -lomniORB4 \ -lomniDynamic4 \ -lomnithread \ -lCOS4 \ -ldl -lpthread \ -lMagnet \ -ltgclasses endif #----------------------------------------- # Set dependences #----------------------------------------- SVC_OBJS = $(OBJS_DIR)/$(CLASS).o \ $(OBJS_DIR)/$(CLASS)StateMachine.o \ $(OBJS_DIR)/$(CLASS)Class.o \ $(OBJS_DIR)/AcquisitionThread.o \ $(OBJS_DIR)/ClassFactory.o \ $(OBJS_DIR)/main.o SHLIB_OBJS = $(OBJS_DIR)/$(CLASS)Class.so.o \ $(OBJS_DIR)/$(CLASS)StateMachine.so.o \ $(OBJS_DIR)/$(CLASS).so.o \ $(OBJS_DIR)/AcquisitionThread.o SVC_INC = $(CLASS)Class.h \ $(CLASS).h \ AcquisitionThread.h $(OBJS_DIR)/%.o: %.cpp $(SVC_INC) $(CC) $(CXXFLAGS) -c $< -o $(OBJS_DIR)/$*.o $(OBJS_DIR)/%.so.o: %.cpp $(SVC_INC) $(CC_SHLIB) $(CXXFLAGS) -c $< -o $(OBJS_DIR)/$*.so.o #----------------------------------------- # Make Entry #----------------------------------------- all: $(CLASS) $(CLASS): make_obj_dir make_bin_dir $(SVC_OBJS) $(CC) $(SVC_OBJS) -o $(CLASS) $(LFLAGS) @mv $(CLASS) bin/$(BIN_DIR)/$(CLASS) shlib: make_obj_dir make_shlib_dir $(SHLIB_OBJS) $(AR_SL) -o \ shlib/$(BIN_DIR)/$(CLASS).$(SL_EXT).$(MAJOR_VERS).$(MINOR_VERS) \ $(VERS_OPT)$(CLASS).$(SL_EXT).$(MAJOR_VERS) \ $(SHLIB_OBJS) $(LFLAGS) @rm -f shlib/$(BIN_DIR)/$(CLASS).$(SL_EXT) @cd shlib/$(BIN_DIR); \ ln -s $(CLASS).$(SL_EXT).$(MAJOR_VERS).$(MINOR_VERS) $(CLASS).$(SL_EXT) clean: rm -f $(OBJS_DIR)/*.o \ $(OBJS_DIR)/*.so.o \ bin/$(BIN_DIR)/$(CLASS) \ core make_obj_dir: @mkdir -p obj @mkdir -p obj/$(BIN_DIR) make_bin_dir: @mkdir -p bin @mkdir -p bin/$(BIN_DIR) make_shlib_dir: @mkdir -p shlib @mkdir -p shlib/$(BIN_DIR) #----------------------------------------- # Install binary file #----------------------------------------- install: cp bin/$(BIN_DIR)/$(CLASS) $(CPP_SERVERS)/bin #----------------------------------------- # Update class library and header files # recompile without debug mode. #----------------------------------------- lib: clean @make no_debug=1 cp *.h $(CPP_SERVERS)/include ar ruv $(TARGET_LIB) $(OBJS_DIR)/$(CLASS).o ar ruv $(TARGET_LIB) $(OBJS_DIR)/$(CLASS)Class.o ar ruv $(TARGET_LIB) $(OBJS_DIR)/$(CLASS)StateMachine.o ar ruv $(TARGET_LIB) $(OBJS_DIR)/AcquisitionThread.o ident $(TARGET_LIB) | grep $(CLASS) #------------------------------------------------------ # Tag the CVS/SVN module corresponding to this class # copy cvs_tag or svn_tag to tag: entry #------------------------------------------------------ #svn_tag: # svn copy ../trunk ../tags/$(RELEASE) # svn commit ../tags/$(RELEASE) \ # -m "Tagging the $(RELEASE) of the $(CLASS) project." # #cvs_tag: # @cvstag "$(CLASS)-$(RELEASE)" # @make $(CLASS) # @make show_tag #show_cvs_tag: # @cvstag -d # # Only these make options work with the current Pogo version 5.3.x! tag: @cvstag "$(CLASS)-$(RELEASE)" @make $(CLASS) @make show_tag show_tag: @cvstag -d Revision-number: 88 Prop-content-length: 147 Content-length: 147 K 8 svn:date V 27 2011-08-05T13:41:29.000000Z K 7 svn:log V 73 This commit was manufactured by cvs2svn to create tag 'Bilt-Release_3_9'. PROPS-END Node-path: powersupply/itest/Bilt/tags/Bilt-Release_3_9 Node-kind: dir Node-action: add Node-copyfrom-rev: 87 Node-copyfrom-path: powersupply/itest/Bilt/trunk Revision-number: 89 Prop-content-length: 128 Content-length: 128 K 10 svn:author V 5 meyer K 8 svn:date V 27 2011-08-05T13:48:27.000000Z K 7 svn:log V 28 First installed version 1.1 PROPS-END Node-path: powersupply/itest/MchBilt/trunk/AcquisitionThread.cpp Node-kind: file Node-action: change Text-content-length: 7900 Text-content-md5: dd9887940e2c765977dc6bc23777d2be Content-length: 7900 #include #include namespace MchBilt_ns { AcquisitionThread::AcquisitionThread (MchBilt *_mch_bilt, omni_mutex &d_m, omni_mutex &g_m) : Tango::LogAdapter(_mch_bilt), omni_thread(), data_mutex(d_m), group_mutex(g_m) { mch_bilt = _mch_bilt; last_update.tv_sec = 0; last_update.tv_usec = 0; updatePeriod = mch_bilt->updatePeriod; nu_attributes = mch_bilt->attributes.size(); nu_channels = mch_bilt->mchBiltChannels; // cout << "AcquisitionThread::AcquisitionThread(): go to start thread ...\n"; start_undetached(); } //+------------------------------------------------------------------ /** * method: run_undetached() * * description: * */ //+------------------------------------------------------------------ void *AcquisitionThread::run_undetached(void*) { bool exit; INFO_STREAM << " AcquisitionThread::run_undetached() entering endless loop!" << endl; while (1) { { // copy to local variables omni_mutex_lock l(data_mutex); exit = mch_bilt->exit_thread; } /* exit the calculation thread */ if ( exit == true ) { break; } struct timeval now; gettimeofday (&now, NULL); double delay = (now.tv_sec * 1e6 + now.tv_usec) - (last_update.tv_sec * 1e6 + last_update.tv_usec); // only read new data every updatePeriod ms!! if ( delay < (updatePeriod * 1000) ) { // 50 ms struct timespec sleep_time = {0, 50000000}; nanosleep(&sleep_time, NULL); continue; } else { INFO_STREAM << "delay = " << delay/1000 << "ms" << endl; last_update = now; } try { // prepare data with default values Tango::GroupAttrReplyList bilt_data; current.clear(); voltage.clear(); current_average.clear(); current_rms.clear(); impedance.clear(); temperature.clear(); local_control.clear(); frames_per_sec.clear(); errors_per_sec.clear(); error_counter.clear(); states.clear(); dev_error_list.clear(); current.assign(3*nu_channels, nan("NaN")); voltage.assign(3*nu_channels, nan("NaN")); current_average.assign(3*nu_channels, nan("NaN")); current_rms.assign(3*nu_channels, nan("NaN")); impedance.assign(3*nu_channels, nan("NaN")); temperature.assign(6*nu_channels, nan("NaN")); local_control.assign(3*nu_channels, nan("NaN")); frames_per_sec.assign(3*nu_channels, nan("NaN")); errors_per_sec.assign(3*nu_channels, nan("NaN")); error_counter.assign(3*nu_channels, nan("NaN")); states.assign(nu_channels, Tango::DISABLE); { struct timeval st_group; gettimeofday (&st_group, NULL); // group reading of all bilts omni_mutex_lock l(group_mutex); Tango::GroupReply::enable_exception(true); bilt_data = mch_bilt->bilts->read_attributes (mch_bilt->attributes, true); struct timeval sp_group; gettimeofday (&sp_group, NULL); double g_time = (sp_group.tv_sec * 1e6 + sp_group.tv_usec) - (st_group.tv_sec * 1e6 + st_group.tv_usec); INFO_STREAM << "Time in group call = " << g_time/1000 << "ms" << endl; } // check for errors if ( bilt_data.has_failed() ) { for (long i=0; i> states[index]; // extract the read spectra vector ch_current; bilt_data[i+1] >> ch_current; vector ch_voltage; bilt_data[i+2] >> ch_voltage; vector ch_current_average; bilt_data[i+3] >> ch_current_average; vector ch_current_rms; bilt_data[i+4] >> ch_current_rms; vector ch_impedance; bilt_data[i+5] >> ch_impedance; vector ch_temperature; bilt_data[i+6] >> ch_temperature; vector ch_local_control; bilt_data[i+7] >> ch_local_control; vector ch_frames_per_sec; bilt_data[i+8] >> ch_frames_per_sec; vector ch_errors_per_sec; bilt_data[i+9] >> ch_errors_per_sec; vector ch_error_counter; bilt_data[i+10] >> ch_error_counter; for ( long ch=0; ch<3; ch++ ) { current[3*index + ch] = ch_current[ch]; voltage[3*index + ch] = ch_voltage[ch]; current_average[3*index + ch] = ch_current_average[ch]; current_rms[3*index + ch] = ch_current_rms[ch]; impedance[3*index + ch] = ch_impedance[ch]; frames_per_sec[3*index + ch] = (double) ch_frames_per_sec[ch]; errors_per_sec[3*index + ch] = (double) ch_errors_per_sec[ch]; error_counter[3*index + ch] = (double) ch_error_counter[ch]; if ( ch_local_control[ch] == true ) local_control[3*index + ch] = 1.0; else local_control[3*index + ch] = 0.0; } for ( long ch=0; ch<6; ch++ ) { temperature[6*index + ch] = ch_temperature[ch]; } } catch (const Tango::DevFailed &e) { // set data values states[index] = Tango::UNKNOWN; for (long ch=0; ch<3; ch++ ) { current[3*index + ch] = nan("NaN"); voltage[3*index + ch] = nan("NaN"); current_average[3*index + ch] = nan("NaN"); current_rms[3*index + ch] = nan("NaN"); impedance[3*index + ch] = nan("NaN"); frames_per_sec[3*index + ch] = nan("NaN"); errors_per_sec[3*index + ch] = nan("NaN"); error_counter[3*index + ch] = nan("NaN"); } for ( long ch=0; ch<6; ch++ ) { temperature[6*index + ch] = nan("NaN"); } DeviceError dev_error; dev_error.dev_name = bilt_data[i].dev_name(); dev_error.err_list = e.errors; dev_error_list.push_back (dev_error); } } // copy data after acquisition { omni_mutex_lock l(data_mutex); mch_bilt->acquisition_state = Tango::ON; mch_bilt->states = states; mch_bilt->current = current; mch_bilt->voltage = voltage; mch_bilt->current_average = current_average; mch_bilt->current_rms = current_rms; mch_bilt->impedance = impedance; mch_bilt->temperature = temperature; mch_bilt->local_control = local_control; mch_bilt->frames_per_sec = frames_per_sec; mch_bilt->errors_per_sec = errors_per_sec; mch_bilt->error_counter = error_counter; mch_bilt->dev_error_list.clear(); for (long i=0; idev_error_list.push_back (dev_error_list[i]); } // store time when data was read struct timeval now; gettimeofday (&now, NULL); mch_bilt->data_read_time = now; } bilt_data.reset(); } catch (const Tango::DevFailed &e) { omni_mutex_lock l(data_mutex); mch_bilt->acquisition_state = Tango::UNKNOWN; mch_bilt->acquisition_error = e.errors; ERROR_STREAM << "Problem in aquisition loop : " << endl; const Tango::DevErrorList& el = e.errors; for (int err = 0; err < el.length(); err++) { ERROR_STREAM << el[err].desc.in() << endl; } } } return NULL; } } // namespace Node-path: powersupply/itest/MchBilt/trunk/AcquisitionThread.h Node-kind: file Node-action: change Text-content-length: 1034 Text-content-md5: 489c17c72701a79e9265caaabc65f38b Content-length: 1034 #ifndef ACQUISITIONTHREAD_H_ #define ACQUISITIONTHREAD_H_ #include #include #include namespace MchBilt_ns { class AcquisitionThread : public omni_thread, public Tango::LogAdapter { public : AcquisitionThread (MchBilt *_mch_bilt, omni_mutex &d_m, omni_mutex &g_m); private : MchBilt *mch_bilt; omni_mutex &data_mutex; omni_mutex &group_mutex; void *run_undetached(void*); Tango::DevLong updatePeriod; struct timeval last_update; long nu_attributes; long nu_channels; vector current; vector voltage; vector current_average; vector current_rms; vector impedance; vector temperature; vector local_control; vector frames_per_sec; vector errors_per_sec; vector error_counter; vector states; vector dev_error_list; }; } #endif /*ACQUISITIONTHREAD_H_*/ Node-path: powersupply/itest/MchBilt/trunk/MchBilt.cpp Node-kind: file Node-action: change Text-content-length: 38363 Text-content-md5: c707591009125fb7b33ce74828e4e198 Content-length: 38363 /*----- PROTECTED REGION ID(MchBilt.cpp) ENABLED START -----*/ static const char *RcsId = "$Id: MchBilt.cpp,v 1.3 2011-08-05 13:48:27 meyer Exp $"; //============================================================================= // // file : MchBilt.cpp // // description : C++ source for the MchBilt and its commands. // The class is derived from Device. It represents the // CORBA servant object which will be accessed from the // network. All commands which can be executed on the // MchBilt are implemented in this file. // // project : Multi channel Bilt class for the ESRF storage ring. // // $Author: meyer $ // // $Revision: 1.3 $ // $Date: 2011-08-05 13:48:27 $ // // SVN only: // $HeadURL: $ // // CVS only: // $Source: /segfs/tango/cvsroot/cppserver/machine/powersupply/SrSteerers/tango/MchBilt/MchBilt.cpp,v $ // $Log: not supported by cvs2svn $ // Revision 1.2 2011/08/04 15:48:33 meyer // Added the missing commands and attributes. // Made the acquisition thread work. // // Revision 1.1.1.1 2011/08/04 14:42:06 meyer // Imported using TkCVS // // //============================================================================= // This file is generated by POGO // (Program Obviously used to Generate tango Object) //============================================================================= #include #include #include #include #include /*----- PROTECTED REGION END -----*/ /** * MchBilt class description: * The multi channel Bilt device regroups all Bilt powersupply device used for * the ESRF storage ring steerers * Reading and setting of currents and voltages is done by spectrum attributes, which * contain the values of the individual Bilt devices. */ //================================================================ // // The following table gives the correspondence // between command and method names. // // Command name | Method name //---------------------------------------------------------------- // State | dev_state // Status | dev_status // On | on // Off | off // Reset | reset // EnableAcCurrent | enable_ac_current // DisableAcCurrent | disable_ac_current //================================================================ // Attributes managed are: // Current: // Voltage: // SetCurrentAverage: // SetCurrentRMS: // FramesPerSecond: // ErrorsPerSecond: // ErrorCounter: // Impedance: // Temperature: // BiltStates: // BiltNames: // BiltLocations: // DisableACCurrent: namespace MchBilt_ns { /*----- PROTECTED REGION ID(MchBilt::namespace_starting) ENABLED START -----*/ // static initializations /*----- PROTECTED REGION END -----*/ // MchBilt::namespace_starting //-------------------------------------------------------- /** * Method : MchBilt::MchBilt() * Description : Constructors for a Tango device * implementing the class MchBilt */ //-------------------------------------------------------- MchBilt::MchBilt(Tango::DeviceClass *cl, string &s) : Tango::Device_4Impl(cl, s.c_str()) { /*----- PROTECTED REGION ID(MchBilt::constructor_1) ENABLED START -----*/ init_device(); /*----- PROTECTED REGION END -----*/ // MchBilt::constructor_1 } //-------------------------------------------------------- MchBilt::MchBilt(Tango::DeviceClass *cl, const char *s) : Tango::Device_4Impl(cl, s) { /*----- PROTECTED REGION ID(MchBilt::constructor_2) ENABLED START -----*/ init_device(); /*----- PROTECTED REGION END -----*/ // MchBilt::constructor_2 } //-------------------------------------------------------- MchBilt::MchBilt(Tango::DeviceClass *cl, const char *s, const char *d) : Tango::Device_4Impl(cl, s, d) { /*----- PROTECTED REGION ID(MchBilt::constructor_3) ENABLED START -----*/ init_device(); /*----- PROTECTED REGION END -----*/ // MchBilt::constructor_3 } //-------------------------------------------------------- /** * Method : MchBilt::delete_device()() * Description : will be called at device destruction or at init command */ //-------------------------------------------------------- void MchBilt::delete_device() { /*----- PROTECTED REGION ID(MchBilt::delete_device) ENABLED START -----*/ // Delete device allocated objects // Delete device allocated objects if ( acquisition_thread != NULL ) { data_mutex.lock(); exit_thread = true; data_mutex.unlock(); // join now the thread until it exits int *rv; acquisition_thread->join((void **)&rv); cout << "MchBilt::delete_device(): Exit acquisition thread !!!" << endl; } if ( bilts != NULL ) { delete (bilts); bilts = NULL; attributes.clear(); } /*----- PROTECTED REGION END -----*/ // MchBilt::delete_device } //-------------------------------------------------------- /** * Method : MchBilt::init_device() * Description : // will be called at device initialization. */ //-------------------------------------------------------- void MchBilt::init_device() { DEBUG_STREAM << "MchBilt::init_device() create device " << device_name << endl; /*----- PROTECTED REGION ID(MchBilt::init_device_before) ENABLED START -----*/ // Initialization before get_device_property() call /*----- PROTECTED REGION END -----*/ // MchBilt::init_device_before // Get the device properties (if any) from database get_device_property(); /*----- PROTECTED REGION ID(MchBilt::init_device) ENABLED START -----*/ // Initialize device try { // initialise the group bilts = new Tango::Group ("Bilts"); bilts->add (biltNames); // initialise the list of attributes to be read attributes.push_back("State"); attributes.push_back("Currents"); attributes.push_back("Voltages"); attributes.push_back("SetCurrentsAverage"); attributes.push_back("SetCurrentsRMS"); attributes.push_back("Impedances"); attributes.push_back("Temperatures"); attributes.push_back("LocalControls"); attributes.push_back("FramesPerSecond"); attributes.push_back("ErrorsPerSecond"); attributes.push_back("ErrorCounters"); // specify the group timeout bilts->set_timeout_millis (updatePeriod); // do a first call to create all network connections // which is very time consuming! bilt_data = bilts->read_attributes (attributes, true); cout << "Read data from " << (bilt_data.size() / attributes.size()) << " bilts!" << endl; // read the location strings of the available bilt devices read_locations(); // create the acquisition thread exit_thread = false; acquisition_thread = new AcquisitionThread(this, data_mutex, group_mutex); } catch (const Tango::DevFailed &e) { acquisition_state = Tango::UNKNOWN; acquisition_error = e.errors; } /*----- PROTECTED REGION END -----*/ // MchBilt::init_device } //-------------------------------------------------------- /** * Method : MchBilt::get_device_property() * Description : Read database to initialize property data members. */ //-------------------------------------------------------- void MchBilt::get_device_property() { /*----- PROTECTED REGION ID(MchBilt::get_device_property_before) ENABLED START -----*/ // Initialize property data members acquisition_thread = NULL; acquisition_state = Tango::UNKNOWN; bilts = NULL; mchBiltChannels = 0; struct timeval now; gettimeofday (&now, NULL); data_set_time = now; data_read_time = now; /*----- PROTECTED REGION END -----*/ // MchBilt::get_device_property_before // Read device properties from database. Tango::DbData dev_prop; dev_prop.push_back(Tango::DbDatum("BiltNames")); dev_prop.push_back(Tango::DbDatum("UpdatePeriod")); // is there at least one property to be read ? if (dev_prop.size()>0) { // Call database and extract values if (Tango::Util::instance()->_UseDb==true) get_db_device()->get_property(dev_prop); // get instance on MchBiltClass to get class property Tango::DbDatum def_prop, cl_prop; MchBiltClass *ds_class = (static_cast(get_device_class())); int i = -1; // Try to initialize BiltNames from class property cl_prop = ds_class->get_class_property(dev_prop[++i].name); if (cl_prop.is_empty()==false) cl_prop >> biltNames; else { // Try to initialize BiltNames from default device value def_prop = ds_class->get_default_device_property(dev_prop[i].name); if (def_prop.is_empty()==false) def_prop >> biltNames; } // And try to extract BiltNames value from database if (dev_prop[i].is_empty()==false) dev_prop[i] >> biltNames; // Try to initialize UpdatePeriod from class property cl_prop = ds_class->get_class_property(dev_prop[++i].name); if (cl_prop.is_empty()==false) cl_prop >> updatePeriod; else { // Try to initialize UpdatePeriod from default device value def_prop = ds_class->get_default_device_property(dev_prop[i].name); if (def_prop.is_empty()==false) def_prop >> updatePeriod; } // And try to extract UpdatePeriod value from database if (dev_prop[i].is_empty()==false) dev_prop[i] >> updatePeriod; } /*----- PROTECTED REGION ID(MchBilt::get_device_property_after) ENABLED START -----*/ // Check device property data members init // the number of channels is defined by the given number of // bilt names mchBiltChannels = biltNames.size(); // assign the data vectors with the given number of channels current.assign(3*mchBiltChannels, nan("NaN")); voltage.assign(3*mchBiltChannels, nan("NaN")); current_average.assign(3*mchBiltChannels, nan("NaN")); current_rms.assign(3*mchBiltChannels, nan("NaN")); impedance.assign(3*mchBiltChannels, nan("NaN")); temperature.assign(6*mchBiltChannels, nan("NaN")); local_control.assign(3*mchBiltChannels, nan("NaN")); frames_per_sec.assign(3*mchBiltChannels, nan("NaN")); errors_per_sec.assign(3*mchBiltChannels, nan("NaN")); error_counter.assign(3*mchBiltChannels, nan("NaN")); states.assign(mchBiltChannels, Tango::DISABLE); locations.assign(mchBiltChannels, "unknown"); // initialise the names array for (int i=0; iget_database()->put_device_attribute_property(get_name(), db_data); /*----- PROTECTED REGION END -----*/ // MchBilt::get_device_property_after } //-------------------------------------------------------- /** * Method : MchBilt::always_executed_hook() * Description : method always executed before any command is executed */ //-------------------------------------------------------- void MchBilt::always_executed_hook() { DEBUG_STREAM << "MchBilt::always_executed_hook() " << device_name << endl; /*----- PROTECTED REGION ID(MchBilt::always_executed_hook) ENABLED START -----*/ // code always executed before all requests /*----- PROTECTED REGION END -----*/ // MchBilt::always_executed_hook } //-------------------------------------------------------- /** * Method : MchBilt::read_attr_hardware() * Description : Hardware acquisition for attributes. */ //-------------------------------------------------------- void MchBilt::read_attr_hardware(vector &attr_list) { DEBUG_STREAM << "MchBilt::read_attr_hardware(vector &attr_list) entering... " << endl; /*----- PROTECTED REGION ID(MchBilt::read_attr_hardware) ENABLED START -----*/ // Add your own code // Add your own code here double delay; // wait for the next data acquisition after applying a new setpoint { omni_mutex_lock l(data_mutex); delay = (data_set_time.tv_sec * 1e6 + data_set_time.tv_usec) - (data_read_time.tv_sec * 1e6 + data_read_time.tv_usec); // cout << "delay = " << delay << endl; } while ( delay > 0 ) { // 50 ms struct timespec sleep_time = {0, 50000000}; nanosleep(&sleep_time, NULL); omni_mutex_lock l(data_mutex); delay = (data_set_time.tv_sec * 1e6 + data_set_time.tv_usec) - (data_read_time.tv_sec * 1e6 + data_read_time.tv_usec); INFO_STREAM << "MchBilt::read_attr_hardware() : waiting delay = " << delay << endl; } /*----- PROTECTED REGION END -----*/ // MchBilt::read_attr_hardware } //-------------------------------------------------------- /** * Read Current attribute * Description: Array of current values. Not yet available channels are filled * with NaN values. * * Data type: Tango::DevDouble * Attr type: Spectrum max = 500 */ //-------------------------------------------------------- void MchBilt::read_Current(Tango::Attribute &attr) { DEBUG_STREAM << "MchBilt::read_Current(Tango::Attribute &attr) entering... " << endl; /*----- PROTECTED REGION ID(MchBilt::read_Current) ENABLED START -----*/ omni_mutex_lock l(data_mutex); if ( acquisition_state == Tango::UNKNOWN ) { attr.set_quality(Tango::ATTR_INVALID); } else { // initialise the read value attr.set_value (¤t[0], current.size()); } /*----- PROTECTED REGION END -----*/ // MchBilt::read_Current } //-------------------------------------------------------- /** * Read Voltage attribute * Description: Array of voltage values. Not yet available channels are filled * with NaN values. * * Data type: Tango::DevDouble * Attr type: Spectrum max = 500 */ //-------------------------------------------------------- void MchBilt::read_Voltage(Tango::Attribute &attr) { DEBUG_STREAM << "MchBilt::read_Voltage(Tango::Attribute &attr) entering... " << endl; /*----- PROTECTED REGION ID(MchBilt::read_Voltage) ENABLED START -----*/ omni_mutex_lock l(data_mutex); if ( acquisition_state == Tango::UNKNOWN ) { attr.set_quality(Tango::ATTR_INVALID); } else { attr.set_value (&voltage[0], voltage.size()); } /*----- PROTECTED REGION END -----*/ // MchBilt::read_Voltage } //-------------------------------------------------------- /** * Read SetCurrentAverage attribute * Description: Array of calculated average AC current setpoint values per second.. When not yet available, the channels are filled * with NaN values. * * Data type: Tango::DevDouble * Attr type: Spectrum max = 500 */ //-------------------------------------------------------- void MchBilt::read_SetCurrentAverage(Tango::Attribute &attr) { DEBUG_STREAM << "MchBilt::read_SetCurrentAverage(Tango::Attribute &attr) entering... " << endl; /*----- PROTECTED REGION ID(MchBilt::read_SetCurrentAverage) ENABLED START -----*/ omni_mutex_lock l(data_mutex); if ( acquisition_state == Tango::UNKNOWN ) { attr.set_quality(Tango::ATTR_INVALID); } else { attr.set_value (¤t_average[0], current_average.size()); } /*----- PROTECTED REGION END -----*/ // MchBilt::read_SetCurrentAverage } //-------------------------------------------------------- /** * Read SetCurrentRMS attribute * Description: Array of calculated RMS AC current setpoint values per second.. When not yet available, the channels are filled * with NaN values. * * Data type: Tango::DevDouble * Attr type: Spectrum max = 500 */ //-------------------------------------------------------- void MchBilt::read_SetCurrentRMS(Tango::Attribute &attr) { DEBUG_STREAM << "MchBilt::read_SetCurrentRMS(Tango::Attribute &attr) entering... " << endl; /*----- PROTECTED REGION ID(MchBilt::read_SetCurrentRMS) ENABLED START -----*/ omni_mutex_lock l(data_mutex); if ( acquisition_state == Tango::UNKNOWN ) { attr.set_quality(Tango::ATTR_INVALID); } else { attr.set_value (¤t_rms[0], current_rms.size()); } /*----- PROTECTED REGION END -----*/ // MchBilt::read_SetCurrentRMS } //-------------------------------------------------------- /** * Read FramesPerSecond attribute * Description: Array of error frames per second values. Not yet available channels are filled * with NaN values. * * Data type: Tango::DevDouble * Attr type: Spectrum max = 500 */ //-------------------------------------------------------- void MchBilt::read_FramesPerSecond(Tango::Attribute &attr) { DEBUG_STREAM << "MchBilt::read_FramesPerSecond(Tango::Attribute &attr) entering... " << endl; /*----- PROTECTED REGION ID(MchBilt::read_FramesPerSecond) ENABLED START -----*/ omni_mutex_lock l(data_mutex); if ( acquisition_state == Tango::UNKNOWN ) { attr.set_quality(Tango::ATTR_INVALID); } else { attr.set_value (&frames_per_sec[0], frames_per_sec.size()); } /*----- PROTECTED REGION END -----*/ // MchBilt::read_FramesPerSecond } //-------------------------------------------------------- /** * Read ErrorsPerSecond attribute * Description: Array of error errors per second values. Not yet available channels are filled * with NaN values. * * Data type: Tango::DevDouble * Attr type: Spectrum max = 500 */ //-------------------------------------------------------- void MchBilt::read_ErrorsPerSecond(Tango::Attribute &attr) { DEBUG_STREAM << "MchBilt::read_ErrorsPerSecond(Tango::Attribute &attr) entering... " << endl; /*----- PROTECTED REGION ID(MchBilt::read_ErrorsPerSecond) ENABLED START -----*/ omni_mutex_lock l(data_mutex); if ( acquisition_state == Tango::UNKNOWN ) { attr.set_quality(Tango::ATTR_INVALID); } else { attr.set_value (&errors_per_sec[0], errors_per_sec.size()); } /*----- PROTECTED REGION END -----*/ // MchBilt::read_ErrorsPerSecond } //-------------------------------------------------------- /** * Read ErrorCounter attribute * Description: Array of error counter values. Not yet available channels are filled * with NaN values. * * Data type: Tango::DevDouble * Attr type: Spectrum max = 500 */ //-------------------------------------------------------- void MchBilt::read_ErrorCounter(Tango::Attribute &attr) { DEBUG_STREAM << "MchBilt::read_ErrorCounter(Tango::Attribute &attr) entering... " << endl; /*----- PROTECTED REGION ID(MchBilt::read_ErrorCounter) ENABLED START -----*/ omni_mutex_lock l(data_mutex); if ( acquisition_state == Tango::UNKNOWN ) { attr.set_quality(Tango::ATTR_INVALID); } else { attr.set_value (&error_counter[0], error_counter.size()); } /*----- PROTECTED REGION END -----*/ // MchBilt::read_ErrorCounter } //-------------------------------------------------------- /** * Read Impedance attribute * Description: Array of impedance values. Not yet available channels are filled * with NaN values. * * Data type: Tango::DevDouble * Attr type: Spectrum max = 500 */ //-------------------------------------------------------- void MchBilt::read_Impedance(Tango::Attribute &attr) { DEBUG_STREAM << "MchBilt::read_Impedance(Tango::Attribute &attr) entering... " << endl; /*----- PROTECTED REGION ID(MchBilt::read_Impedance) ENABLED START -----*/ omni_mutex_lock l(data_mutex); if ( acquisition_state == Tango::UNKNOWN ) { attr.set_quality(Tango::ATTR_INVALID); } else { attr.set_value (&impedance[0], impedance.size()); } /*----- PROTECTED REGION END -----*/ // MchBilt::read_Impedance } //-------------------------------------------------------- /** * Read Temperature attribute * Description: Array of temperature values. Not yet available channels are filled * with NaN values. * * Data type: Tango::DevDouble * Attr type: Spectrum max = 1000 */ //-------------------------------------------------------- void MchBilt::read_Temperature(Tango::Attribute &attr) { DEBUG_STREAM << "MchBilt::read_Temperature(Tango::Attribute &attr) entering... " << endl; /*----- PROTECTED REGION ID(MchBilt::read_Temperature) ENABLED START -----*/ omni_mutex_lock l(data_mutex); if ( acquisition_state == Tango::UNKNOWN ) { attr.set_quality(Tango::ATTR_INVALID); } else { attr.set_value (&temperature[0], temperature.size()); } /*----- PROTECTED REGION END -----*/ // MchBilt::read_Temperature } //-------------------------------------------------------- /** * Read BiltStates attribute * Description: The states of the individual bilt devices. * * Data type: Tango::DevState * Attr type: Spectrum max = 256 */ //-------------------------------------------------------- void MchBilt::read_BiltStates(Tango::Attribute &attr) { DEBUG_STREAM << "MchBilt::read_BiltStates(Tango::Attribute &attr) entering... " << endl; /*----- PROTECTED REGION ID(MchBilt::read_BiltStates) ENABLED START -----*/ omni_mutex_lock l(data_mutex); if ( acquisition_state == Tango::UNKNOWN ) { attr.set_quality(Tango::ATTR_INVALID); } else { attr.set_value (&states[0], states.size()); } /*----- PROTECTED REGION END -----*/ // MchBilt::read_BiltStates } //-------------------------------------------------------- /** * Read BiltNames attribute * Description: The names of the individual bilt devices. * * Data type: Tango::DevString * Attr type: Spectrum max = 256 */ //-------------------------------------------------------- void MchBilt::read_BiltNames(Tango::Attribute &attr) { DEBUG_STREAM << "MchBilt::read_BiltNames(Tango::Attribute &attr) entering... " << endl; /*----- PROTECTED REGION ID(MchBilt::read_BiltNames) ENABLED START -----*/ attr.set_value (names_arr, mchBiltChannels); /*----- PROTECTED REGION END -----*/ // MchBilt::read_BiltNames } //-------------------------------------------------------- /** * Read BiltLocations attribute * Description: The locations of the individual Bilt power supply devices used \nfor every bilt. * * Data type: Tango::DevString * Attr type: Spectrum max = 256 */ //-------------------------------------------------------- void MchBilt::read_BiltLocations(Tango::Attribute &attr) { DEBUG_STREAM << "MchBilt::read_BiltLocations(Tango::Attribute &attr) entering... " << endl; /*----- PROTECTED REGION ID(MchBilt::read_BiltLocations) ENABLED START -----*/ // read the locations read_locations(); // initialise the locations array for (int i=0; idevice_state data member) and returns it to the caller. * * @param argin none. * @returns State Code */ //-------------------------------------------------------- Tango::DevState MchBilt::dev_state() { DEBUG_STREAM << "MchBilt::State() - " << device_name << endl; /*----- PROTECTED REGION ID(MchBilt::dev_state) ENABLED START -----*/ Tango::DevState argout; // Add your own state management // get the last state value Tango::DevState last_state = get_state(); // Problems on data acquisition? if ( acquisition_state == Tango::UNKNOWN ) { argout = Tango::UNKNOWN; } else { int nunknown = 0; int nfault = 0; int nalarm = 0; int noff = 0; int non = 0; int ndisable = 0; omni_mutex_lock l(data_mutex); for (int i=0; idevice_status data member) and returns it to the caller. * * @param argin none. * @returns Status description */ //-------------------------------------------------------- Tango::ConstDevString MchBilt::dev_status() { DEBUG_STREAM << "MchBilt::Status() - " << device_name << endl; /*----- PROTECTED REGION ID(MchBilt::dev_status) ENABLED START -----*/ // Add your own status management Tango::DevState state = dev_state(); string status; if ( acquisition_state == Tango::UNKNOWN ) { status = "Data acquisition problem: \n"; for (short i = 0; iget_device(names_arr[i]); status += dev->status() + "\n"; } } break; } case Tango::DISABLE: // When in disable state, no bilt devices are configured! break; default: // loop over all bilt states and get the names // of bilt devices in UNKNOWN state. status += "One or more Bilt power supplies are in an UNKNOWN state:\n"; { omni_mutex_lock l(data_mutex); //cout << "Error list size : " << dev_error_list.size() << endl; for (long i=0; icommand_inout ("On", true); if ( bilt_data.has_failed() ) { TangoSys_OMemStream o; o << "Switching ON failed on "; for (long i=0; icommand_inout ("Off", true); if ( bilt_data.has_failed() ) { TangoSys_OMemStream o; o << "Switching OFF failed on "; for (long i=0; icommand_inout ("Reset", true); if ( bilt_data.has_failed() ) { TangoSys_OMemStream o; o << "Reset failed on "; for (long i=0; icommand_inout ("EnableAcCurrent", true); if ( bilt_data.has_failed() ) { TangoSys_OMemStream o; o << "Enabling the AC current failed on "; for (long i=0; icommand_inout ("DisableAcCurrent", true); if ( bilt_data.has_failed() ) { TangoSys_OMemStream o; o << "Disabling the AC current failed on "; for (long i=0; iread_attribute ("Location", true); for (long i=0; i < bilt_data.size(); i++) { try { bilt_data[i] >> locations[i]; } catch (const Tango::DevFailed &e) { // Ignore missing data. Keep the old location string! } } } /*----- PROTECTED REGION END -----*/ // MchBilt::namespace_ending } // namespace Node-path: powersupply/itest/MchBilt/trunk/MchBilt.h Node-kind: file Node-action: change Text-content-length: 11325 Text-content-md5: 065ccfc6d9f84152194032115b4fa82c Content-length: 11325 /*----- PROTECTED REGION ID(MchBilt.h) ENABLED START -----*/ //============================================================================= // // file : MchBilt.h // // description : Include for the MchBilt class. // // project : Multi channel Bilt class for the ESRF storage ring. // // $Author: meyer $ // // $Revision: 1.3 $ // $Date: 2011-08-05 13:48:27 $ // // SVN only: // $HeadURL: $ // // CVS only: // $Source: /segfs/tango/cvsroot/cppserver/machine/powersupply/SrSteerers/tango/MchBilt/MchBilt.h,v $ // $Log: not supported by cvs2svn $ // Revision 1.2 2011/08/04 15:48:33 meyer // Added the missing commands and attributes. // Made the acquisition thread work. // // Revision 1.1.1.1 2011/08/04 14:42:06 meyer // Imported using TkCVS // // //============================================================================= // This file is generated by POGO // (Program Obviously used to Generate tango Object) //============================================================================= #ifndef MCHBILT_H #define MCHBILT_H #include typedef struct { string dev_name; Tango::DevErrorList err_list; } DeviceError; /*----- PROTECTED REGION END -----*/ /** * MchBilt class Description: * The multi channel Bilt device regroups all Bilt powersupply device used for * the ESRF storage ring steerers * Reading and setting of currents and voltages is done by spectrum attributes, which * contain the values of the individual Bilt devices. */ namespace MchBilt_ns { /*----- PROTECTED REGION ID(MchBilt::Additional Class Declarations) ENABLED START -----*/ // Additional Class Declarations class AcquisitionThread; /*----- PROTECTED REGION END -----*/ // MchBilt::Additional Class Declarations class MchBilt : public Tango::Device_4Impl { /*----- PROTECTED REGION ID(MchBilt::Data Members) ENABLED START -----*/ // Add your own data members public: /*----- PROTECTED REGION END -----*/ // MchBilt::Data Members // Device property data members public: // BiltNames: The list of available bilt device names in the order the values have to be arranged // in the Current and Voltage spectra. vector biltNames; // UpdatePeriod: The update period of all aquired values from the bilt devices in milli seconds. Tango::DevLong updatePeriod; // Attribute data members public: Tango::DevDouble *attr_Current_read; Tango::DevDouble *attr_Voltage_read; Tango::DevDouble *attr_SetCurrentAverage_read; Tango::DevDouble *attr_SetCurrentRMS_read; Tango::DevDouble *attr_FramesPerSecond_read; Tango::DevDouble *attr_ErrorsPerSecond_read; Tango::DevDouble *attr_ErrorCounter_read; Tango::DevDouble *attr_Impedance_read; Tango::DevDouble *attr_Temperature_read; Tango::DevState *attr_BiltStates_read; Tango::DevString *attr_BiltNames_read; Tango::DevString *attr_BiltLocations_read; Tango::DevDouble *attr_DisableACCurrent_read; // Constructors and destructors public: /** * Constructs a newly allocated Command object. * * @param cl Class. * @param s Device Name */ MchBilt(Tango::DeviceClass *cl,string &s); /** * Constructs a newly allocated Command object. * * @param cl Class. * @param s Device Name */ MchBilt(Tango::DeviceClass *cl,const char *s); /** * Constructs a newly allocated Command object. * * @param cl Class. * @param s Device name * @param d Device description. */ MchBilt(Tango::DeviceClass *cl,const char *s,const char *d); /** * The object destructor. */ ~MchBilt() {delete_device();}; // Miscellaneous methods public: /** * will be called at device destruction or at init command. */ void delete_device(); /** * Initialize the device */ virtual void init_device(); /** * Read the device properties from database */ void get_device_property(); /** * Always executed method before execution command method. */ virtual void always_executed_hook(); // Attribute methods public: /** * Method : MchBilt::read_attr_hardware() * Description : Hardware acquisition for attributes. */ virtual void read_attr_hardware(vector &attr_list); /** * Current attribute related methods. * Description: Array of current values. Not yet available channels are filled * with NaN values. * * Data type: Tango::DevDouble * Attr type: Spectrum max = 500 */ virtual void read_Current(Tango::Attribute &attr); virtual bool is_Current_allowed(Tango::AttReqType type); /** * Voltage attribute related methods. * Description: Array of voltage values. Not yet available channels are filled * with NaN values. * * Data type: Tango::DevDouble * Attr type: Spectrum max = 500 */ virtual void read_Voltage(Tango::Attribute &attr); virtual bool is_Voltage_allowed(Tango::AttReqType type); /** * SetCurrentAverage attribute related methods. * Description: Array of calculated average AC current setpoint values per second.. When not yet available, the channels are filled * with NaN values. * * Data type: Tango::DevDouble * Attr type: Spectrum max = 500 */ virtual void read_SetCurrentAverage(Tango::Attribute &attr); virtual bool is_SetCurrentAverage_allowed(Tango::AttReqType type); /** * SetCurrentRMS attribute related methods. * Description: Array of calculated RMS AC current setpoint values per second.. When not yet available, the channels are filled * with NaN values. * * Data type: Tango::DevDouble * Attr type: Spectrum max = 500 */ virtual void read_SetCurrentRMS(Tango::Attribute &attr); virtual bool is_SetCurrentRMS_allowed(Tango::AttReqType type); /** * FramesPerSecond attribute related methods. * Description: Array of error frames per second values. Not yet available channels are filled * with NaN values. * * Data type: Tango::DevDouble * Attr type: Spectrum max = 500 */ virtual void read_FramesPerSecond(Tango::Attribute &attr); virtual bool is_FramesPerSecond_allowed(Tango::AttReqType type); /** * ErrorsPerSecond attribute related methods. * Description: Array of error errors per second values. Not yet available channels are filled * with NaN values. * * Data type: Tango::DevDouble * Attr type: Spectrum max = 500 */ virtual void read_ErrorsPerSecond(Tango::Attribute &attr); virtual bool is_ErrorsPerSecond_allowed(Tango::AttReqType type); /** * ErrorCounter attribute related methods. * Description: Array of error counter values. Not yet available channels are filled * with NaN values. * * Data type: Tango::DevDouble * Attr type: Spectrum max = 500 */ virtual void read_ErrorCounter(Tango::Attribute &attr); virtual bool is_ErrorCounter_allowed(Tango::AttReqType type); /** * Impedance attribute related methods. * Description: Array of impedance values. Not yet available channels are filled * with NaN values. * * Data type: Tango::DevDouble * Attr type: Spectrum max = 500 */ virtual void read_Impedance(Tango::Attribute &attr); virtual bool is_Impedance_allowed(Tango::AttReqType type); /** * Temperature attribute related methods. * Description: Array of temperature values. Not yet available channels are filled * with NaN values. * * Data type: Tango::DevDouble * Attr type: Spectrum max = 1000 */ virtual void read_Temperature(Tango::Attribute &attr); virtual bool is_Temperature_allowed(Tango::AttReqType type); /** * BiltStates attribute related methods. * Description: The states of the individual bilt devices. * * Data type: Tango::DevState * Attr type: Spectrum max = 256 */ virtual void read_BiltStates(Tango::Attribute &attr); virtual bool is_BiltStates_allowed(Tango::AttReqType type); /** * BiltNames attribute related methods. * Description: The names of the individual bilt devices. * * Data type: Tango::DevString * Attr type: Spectrum max = 256 */ virtual void read_BiltNames(Tango::Attribute &attr); virtual bool is_BiltNames_allowed(Tango::AttReqType type); /** * BiltLocations attribute related methods. * Description: The locations of the individual Bilt power supply devices used \nfor every bilt. * * Data type: Tango::DevString * Attr type: Spectrum max = 256 */ virtual void read_BiltLocations(Tango::Attribute &attr); virtual bool is_BiltLocations_allowed(Tango::AttReqType type); /** * DisableACCurrent attribute related methods. * Description: Array of boolean values which indicate whether the dynamic * 10kHz AC current settings from the Liberas are disabled. * * Data type: Tango::DevDouble * Attr type: Spectrum max = 500 */ virtual void read_DisableACCurrent(Tango::Attribute &attr); virtual bool is_DisableACCurrent_allowed(Tango::AttReqType type); /** * Method : MchBilt::add_dynamic_attributes() * Description : Add dynamic attributes if any. */ void add_dynamic_attributes(); // Command related methods public: /** * Command State related methods. */ Tango::DevState dev_state(); /** * Command Status related methods. */ Tango::ConstDevString dev_status(); /** * Command On related methods. */ void on(); virtual bool is_On_allowed(const CORBA::Any &any); /** * Command Off related methods. */ void off(); virtual bool is_Off_allowed(const CORBA::Any &any); /** * Command Reset related methods. */ void reset(); virtual bool is_Reset_allowed(const CORBA::Any &any); /** * Command EnableAcCurrent related methods. */ void enable_ac_current(); virtual bool is_EnableAcCurrent_allowed(const CORBA::Any &any); /** * Command DisableAcCurrent related methods. */ void disable_ac_current(); virtual bool is_DisableAcCurrent_allowed(const CORBA::Any &any); /*----- PROTECTED REGION ID(MchBilt::Additional Method prototypes) ENABLED START -----*/ // Additional Method prototypes protected : void read_locations(); friend class AcquisitionThread; AcquisitionThread *acquisition_thread; omni_mutex data_mutex; omni_mutex group_mutex; short exit_thread; Tango::DevErrorList acquisition_error; Tango::DevState acquisition_state; bool bilt_init; struct timeval data_set_time; struct timeval data_read_time; Tango::Group *bilts; Tango::GroupAttrReplyList bilt_data; vector attributes; vector current; vector voltage; vector current_average; vector current_rms; vector impedance; vector temperature; vector local_control; vector frames_per_sec; vector errors_per_sec; vector error_counter; vector states; Tango::DevString names_arr[100]; int mchBiltChannels; vector dev_error_list; vector locations; Tango::DevString locations_arr[100]; /*----- PROTECTED REGION END -----*/ // MchBilt::Additional Method prototypes }; /*----- PROTECTED REGION ID(MchBilt::Additional Classes Definitions) ENABLED START -----*/ // Additional Classes definitions /*----- PROTECTED REGION END -----*/ // MchBilt::Additional Classes Definitions } // namespace #endif // MCHBILT_H Node-path: powersupply/itest/MchBilt/trunk/MchBilt.xmi Node-kind: file Node-action: change Text-content-length: 16806 Text-content-md5: 0a6a55871a299bfd9af146e829596dfb Content-length: 16806 500 Node-path: powersupply/itest/MchBilt/trunk/MchBiltClass.h Node-kind: file Node-action: change Text-content-length: 13513 Text-content-md5: 3a53df16fe6a63208f04a69993ff2e02 Content-length: 13513 /*----- PROTECTED REGION ID(MchBiltClass.h) ENABLED START -----*/ //============================================================================= // // file : MchBiltClass.h // // description : Include for the MchBiltClass root class. // This class is the singleton class for. // the MchBilt device class.. // It contains all properties and methods which the . // MchBilt requires only once e.g. the commands. // // project : Multi channel Bilt class for the ESRF storage ring. // // $Author: meyer $ // // $Revision: 1.3 $ // $Date: 2011-08-05 13:48:27 $ // // SVN only: // $HeadURL: $ // // CVS only: // $Source: /segfs/tango/cvsroot/cppserver/machine/powersupply/SrSteerers/tango/MchBilt/MchBiltClass.h,v $ // $Log: not supported by cvs2svn $ // Revision 1.2 2011/08/04 15:48:33 meyer // Added the missing commands and attributes. // Made the acquisition thread work. // // Revision 1.1.1.1 2011/08/04 14:42:06 meyer // Imported using TkCVS // // //============================================================================= // This file is generated by POGO // (Program Obviously used to Generate tango Object) //============================================================================= #ifndef MCHBILTCLASS_H #define MCHBILTCLASS_H #include #include /*----- PROTECTED REGION END -----*/ namespace MchBilt_ns { /*----- PROTECTED REGION ID(MchBilt::classes for dynamic creation) ENABLED START -----*/ /*----- PROTECTED REGION END -----*/ // MchBilt::classes for dynamic creation //========================================= // Define classes for attributes //========================================= // Attribute Current class definition class CurrentAttrib: public Tango::SpectrumAttr { public: CurrentAttrib():SpectrumAttr("Current", Tango::DEV_DOUBLE, Tango::READ, 500) {}; ~CurrentAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_Current(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_Current_allowed(ty);} }; // Attribute Voltage class definition class VoltageAttrib: public Tango::SpectrumAttr { public: VoltageAttrib():SpectrumAttr("Voltage", Tango::DEV_DOUBLE, Tango::READ, 500) {}; ~VoltageAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_Voltage(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_Voltage_allowed(ty);} }; // Attribute SetCurrentAverage class definition class SetCurrentAverageAttrib: public Tango::SpectrumAttr { public: SetCurrentAverageAttrib():SpectrumAttr("SetCurrentAverage", Tango::DEV_DOUBLE, Tango::READ, 500) {}; ~SetCurrentAverageAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_SetCurrentAverage(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_SetCurrentAverage_allowed(ty);} }; // Attribute SetCurrentRMS class definition class SetCurrentRMSAttrib: public Tango::SpectrumAttr { public: SetCurrentRMSAttrib():SpectrumAttr("SetCurrentRMS", Tango::DEV_DOUBLE, Tango::READ, 500) {}; ~SetCurrentRMSAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_SetCurrentRMS(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_SetCurrentRMS_allowed(ty);} }; // Attribute FramesPerSecond class definition class FramesPerSecondAttrib: public Tango::SpectrumAttr { public: FramesPerSecondAttrib():SpectrumAttr("FramesPerSecond", Tango::DEV_DOUBLE, Tango::READ, 500) {}; ~FramesPerSecondAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_FramesPerSecond(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_FramesPerSecond_allowed(ty);} }; // Attribute ErrorsPerSecond class definition class ErrorsPerSecondAttrib: public Tango::SpectrumAttr { public: ErrorsPerSecondAttrib():SpectrumAttr("ErrorsPerSecond", Tango::DEV_DOUBLE, Tango::READ, 500) {}; ~ErrorsPerSecondAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_ErrorsPerSecond(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_ErrorsPerSecond_allowed(ty);} }; // Attribute ErrorCounter class definition class ErrorCounterAttrib: public Tango::SpectrumAttr { public: ErrorCounterAttrib():SpectrumAttr("ErrorCounter", Tango::DEV_DOUBLE, Tango::READ, 500) {}; ~ErrorCounterAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_ErrorCounter(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_ErrorCounter_allowed(ty);} }; // Attribute Impedance class definition class ImpedanceAttrib: public Tango::SpectrumAttr { public: ImpedanceAttrib():SpectrumAttr("Impedance", Tango::DEV_DOUBLE, Tango::READ, 500) {}; ~ImpedanceAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_Impedance(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_Impedance_allowed(ty);} }; // Attribute Temperature class definition class TemperatureAttrib: public Tango::SpectrumAttr { public: TemperatureAttrib():SpectrumAttr("Temperature", Tango::DEV_DOUBLE, Tango::READ, 1000) {}; ~TemperatureAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_Temperature(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_Temperature_allowed(ty);} }; // Attribute BiltStates class definition class BiltStatesAttrib: public Tango::SpectrumAttr { public: BiltStatesAttrib():SpectrumAttr("BiltStates", Tango::DEV_STATE, Tango::READ, 256) {}; ~BiltStatesAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_BiltStates(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_BiltStates_allowed(ty);} }; // Attribute BiltNames class definition class BiltNamesAttrib: public Tango::SpectrumAttr { public: BiltNamesAttrib():SpectrumAttr("BiltNames", Tango::DEV_STRING, Tango::READ, 256) {}; ~BiltNamesAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_BiltNames(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_BiltNames_allowed(ty);} }; // Attribute BiltLocations class definition class BiltLocationsAttrib: public Tango::SpectrumAttr { public: BiltLocationsAttrib():SpectrumAttr("BiltLocations", Tango::DEV_STRING, Tango::READ, 256) {}; ~BiltLocationsAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_BiltLocations(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_BiltLocations_allowed(ty);} }; // Attribute DisableACCurrent class definition class DisableACCurrentAttrib: public Tango::SpectrumAttr { public: DisableACCurrentAttrib():SpectrumAttr("DisableACCurrent", Tango::DEV_DOUBLE, Tango::READ, 500) {}; ~DisableACCurrentAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_DisableACCurrent(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_DisableACCurrent_allowed(ty);} }; //========================================= // Define classes for commands //========================================= // Command On class definition class OnClass : public Tango::Command { public: OnClass(const char *name, Tango::CmdArgType in, Tango::CmdArgType out, const char *in_desc, const char *out_desc, Tango::DispLevel level) :Command(name,in,out,in_desc,out_desc, level) {}; OnClass(const char *name, Tango::CmdArgType in, Tango::CmdArgType out) :Command(name,in,out) {}; ~OnClass() {}; virtual CORBA::Any *execute (Tango::DeviceImpl *dev, const CORBA::Any &any); virtual bool is_allowed (Tango::DeviceImpl *dev, const CORBA::Any &any) {return (static_cast(dev))->is_On_allowed(any);} }; // Command Off class definition class OffClass : public Tango::Command { public: OffClass(const char *name, Tango::CmdArgType in, Tango::CmdArgType out, const char *in_desc, const char *out_desc, Tango::DispLevel level) :Command(name,in,out,in_desc,out_desc, level) {}; OffClass(const char *name, Tango::CmdArgType in, Tango::CmdArgType out) :Command(name,in,out) {}; ~OffClass() {}; virtual CORBA::Any *execute (Tango::DeviceImpl *dev, const CORBA::Any &any); virtual bool is_allowed (Tango::DeviceImpl *dev, const CORBA::Any &any) {return (static_cast(dev))->is_Off_allowed(any);} }; // Command Reset class definition class ResetClass : public Tango::Command { public: ResetClass(const char *name, Tango::CmdArgType in, Tango::CmdArgType out, const char *in_desc, const char *out_desc, Tango::DispLevel level) :Command(name,in,out,in_desc,out_desc, level) {}; ResetClass(const char *name, Tango::CmdArgType in, Tango::CmdArgType out) :Command(name,in,out) {}; ~ResetClass() {}; virtual CORBA::Any *execute (Tango::DeviceImpl *dev, const CORBA::Any &any); virtual bool is_allowed (Tango::DeviceImpl *dev, const CORBA::Any &any) {return (static_cast(dev))->is_Reset_allowed(any);} }; // Command EnableAcCurrent class definition class EnableAcCurrentClass : public Tango::Command { public: EnableAcCurrentClass(const char *name, Tango::CmdArgType in, Tango::CmdArgType out, const char *in_desc, const char *out_desc, Tango::DispLevel level) :Command(name,in,out,in_desc,out_desc, level) {}; EnableAcCurrentClass(const char *name, Tango::CmdArgType in, Tango::CmdArgType out) :Command(name,in,out) {}; ~EnableAcCurrentClass() {}; virtual CORBA::Any *execute (Tango::DeviceImpl *dev, const CORBA::Any &any); virtual bool is_allowed (Tango::DeviceImpl *dev, const CORBA::Any &any) {return (static_cast(dev))->is_EnableAcCurrent_allowed(any);} }; // Command DisableAcCurrent class definition class DisableAcCurrentClass : public Tango::Command { public: DisableAcCurrentClass(const char *name, Tango::CmdArgType in, Tango::CmdArgType out, const char *in_desc, const char *out_desc, Tango::DispLevel level) :Command(name,in,out,in_desc,out_desc, level) {}; DisableAcCurrentClass(const char *name, Tango::CmdArgType in, Tango::CmdArgType out) :Command(name,in,out) {}; ~DisableAcCurrentClass() {}; virtual CORBA::Any *execute (Tango::DeviceImpl *dev, const CORBA::Any &any); virtual bool is_allowed (Tango::DeviceImpl *dev, const CORBA::Any &any) {return (static_cast(dev))->is_DisableAcCurrent_allowed(any);} }; /** * The TemplateDevServClass singleton definition */ class #ifdef _TG_WINDOWS_ __declspec(dllexport) #endif MchBiltClass : public Tango::DeviceClass { /*----- PROTECTED REGION ID(MchBilt::Additionnal DServer data members) ENABLED START -----*/ public: /*----- PROTECTED REGION END -----*/ // MchBilt::Additionnal DServer data members public: // write class properties data members Tango::DbData cl_prop; Tango::DbData cl_def_prop; Tango::DbData dev_def_prop; // Method prototypes static MchBiltClass *init(const char *); static MchBiltClass *instance(); ~MchBiltClass(); Tango::DbDatum get_class_property(string &); Tango::DbDatum get_default_device_property(string &); Tango::DbDatum get_default_class_property(string &); protected: MchBiltClass(string &); static MchBiltClass *_instance; void command_factory(); void attribute_factory(vector &); void write_class_property(); void set_default_property(); void get_class_property(); string get_cvstag(); string get_cvsroot(); private: void device_factory(const Tango::DevVarStringArray *); void create_static_attribute_list(vector &); void erase_dynamic_attributes(const Tango::DevVarStringArray *,vector &); vector defaultAttList; }; } // namespace #endif // MCHBILTCLASS_H Revision-number: 90 Prop-content-length: 150 Content-length: 150 K 8 svn:date V 27 2011-08-05T13:48:28.000000Z K 7 svn:log V 76 This commit was manufactured by cvs2svn to create tag 'MchBilt-Release_1_1'. PROPS-END Node-path: powersupply/itest/MchBilt/tags/MchBilt-Release_1_1 Node-kind: dir Node-action: add Node-copyfrom-rev: 89 Node-copyfrom-path: powersupply/itest/MchBilt/trunk Revision-number: 91 Prop-content-length: 140 Content-length: 140 K 10 svn:author V 5 meyer K 8 svn:date V 27 2011-10-06T14:03:06.000000Z K 7 svn:log V 40 Bug correction in disable_ac_current(). PROPS-END Node-path: powersupply/itest/Bilt/trunk/Bilt.cpp Node-kind: file Node-action: change Text-content-length: 39375 Text-content-md5: 537503079caab83c4f6224704a9168aa Content-length: 39375 static const char *RcsId = "$Id: Bilt.cpp,v 1.24 2011-10-06 14:03:06 meyer Exp $"; //+============================================================================= // // file : Bilt.cpp // // description : C++ source for the Bilt and its commands. // The class is derived from Device. It represents the // CORBA servant object which will be accessed from the // network. All commands which can be executed on the // Bilt are implemented in this file. // // project : TANGO Device Server // // $Author: meyer $ // // $Revision: 1.24 $ // // $Revision: 1.24 $ // $Date: 2011-10-06 14:03:06 $ // // SVN only: // $HeadURL: $ // // CVS only: // $Source: /segfs/tango/cvsroot/cppserver/machine/powersupply/SrSteerers/tango/Bilt/Bilt.cpp,v $ // $Log: not supported by cvs2svn $ // Revision 1.23 2011/08/05 13:41:08 meyer // Added the commands EnableAcCurrent and DisableAcCurrent. // These commands allow to enable or disable the remote AC // current settings from the Liberas // // Revision 1.22 2011-03-17 14:53:40 meyer // Cleaned-up the code and added an averaging for the impedance calculation. // // Revision 1.21 2011-01-12 12:33:59 meyer // Added attribute to indicate the power supply location. // // Revision 1.20 2011-01-12 08:50:06 meyer // Deleted the wait time for the next reading after writing. // Deleted sleep time during current writing. // // Revision 1.19 2010/11/26 08:40:04 meyer // Caught exceptions in in dev_state around DevImp::dev_state. // Temperature alarm checking might return an exception. // // Sleep time between the writing og current settings set to 20ms. // // Revision 1.18 2010/11/23 07:12:39 meyer // Changed placement of bilt_mutex in write_Current. // // Revision 1.17 2010/11/17 11:42:48 meyer // Replaced the INVALID attribute quality by an exception. // This should avoid a bug in the Tango api which does not take the // attribute quality into account during alarm checking! // // Revision 1.16 2010/11/10 14:00:29 meyer // Changed unit of AC RMS and average value from A to mA. // // Revision 1.15 2010-11-10 12:01:29 meyer // Changed type of Temperatures attribute from long to double and moved // temperature reading to the acquisition thread. // // Revision 1.14 2010/06/21 07:13:05 meyer // Added a spectrum attribute for the temperature measurements and changed to libMagnet version 1.4. // // Revision 1.13 2010/05/01 16:58:39 meyer // Changed alarm limits for the impedance attribute. // // Revision 1.12 2010/03/16 14:54:58 meyer // Added reconnection method. // // Revision 1.11 2010-02-18 16:46:31 meyer // Filled-in code for SetpointCheck // // Revision 1.10 2010-02-12 16:35:13 meyer // Added SetPoleCurrent command again. // // Revision 1.9 2010-02-11 16:35:27 meyer // Currents settings understand NaN values. // Deleted StePoleCurrent command. // // Revision 1.8 2010/02/10 12:27:31 meyer // Restructured Bilt class. // Acquistion is now done by a thread and only the multi channel data // gets exported. A single channel class (BiltCh) was created. // // Revision 1.7 2009/12/18 12:01:40 meyer // Corrected alarm handling in dev_state() // // Revision 1.6 2009/11/27 13:49:26 meyer // Modified structure! The pole is no longer a device. // The device is now a magnet with three poles. // // Revision 1.5 2009/11/26 10:46:58 meyer // Updated for libMagnet_V120 // // Revision 1.4 2009/11/24 09:21:46 meyer // Absolut value for impedance // // Revision 1.3 2009/11/23 16:46:58 meyer // Corrected state, status and exception handling // // Revision 1.2 2009/11/06 12:46:25 meyer // Added impedance attribute and corrected fromatting of attribute values. // // Revision 1.1.1.1 2009/11/04 16:23:02 meyer // Imported using TkCVS // // // copyleft : European Synchrotron Radiation Facility // BP 220, Grenoble 38043 // FRANCE // //-============================================================================= // // This file is generated by POGO // (Program Obviously used to Generate tango Object) // // (c) - Software Engineering Group - ESRF //============================================================================= //=================================================================== // // The following table gives the correspondence // between commands and method name. // // Command name | Method name // ---------------------------------------- // State | dev_state() // Status | dev_status() // On | on() // Off | off() // Reset | reset() // SetPoleAcCurrent | set_pole_ac_current() // LocalPoleControl | local_pole_control() // SetpointCheck | setpoint_check() // SetPoleCurrent | set_pole_current() // EnableAcCurrent | enable_ac_current() // DisableAcCurrent | disable_ac_current() // //=================================================================== #include #include #include #include #include namespace Bilt_ns { //+---------------------------------------------------------------------------- // // method : Bilt::Bilt(string &s) // // description : constructor for simulated Bilt // // in : - cl : Pointer to the DeviceClass object // - s : Device name // //----------------------------------------------------------------------------- Bilt::Bilt(Tango::DeviceClass *cl,string &s) :Tango::Device_4Impl(cl,s.c_str()) { init_device(); } Bilt::Bilt(Tango::DeviceClass *cl,const char *s) :Tango::Device_4Impl(cl,s) { init_device(); } Bilt::Bilt(Tango::DeviceClass *cl,const char *s,const char *d) :Tango::Device_4Impl(cl,s,d) { init_device(); } //+---------------------------------------------------------------------------- // // method : Bilt::delete_device() // // description : will be called at device destruction or at init command. // //----------------------------------------------------------------------------- void Bilt::delete_device() { // Delete device allocated objects if ( acquisition_thread != NULL ) { data_mutex.lock(); exit_thread = true; data_mutex.unlock(); // join now the thread until it exits int *rv; acquisition_thread->join((void **)&rv); cout << "Bilt::delete_device(): Exit acquisition thread !!!" << endl; } // Delete connection to the power supply delete BILT; BILT = NULL; } //+---------------------------------------------------------------------------- // // method : Bilt::init_device() // // description : will be called at device initialization. // //----------------------------------------------------------------------------- void Bilt::init_device() { INFO_STREAM << "Bilt::Bilt() create device " << device_name << endl; // Initialise variables to default values //-------------------------------------------- get_device_property(); set_state (Tango::OFF); // set the power supply location string // Bilt device naming = room-rack-nu.ch. string dev_name = get_name(); int pos = dev_name.rfind ('/'); string room = dev_name.substr (pos+1, string::npos); pos = room.find ('-'); string rack = room.substr (pos+1, string::npos); room = room.substr (0, pos); pos = rack.find ('-'); string number = rack.substr (pos+1, string::npos); rack = rack.substr (0, pos); string channels; if ( number.find ('a') != string::npos ) { channels = "1,2,3"; } else { channels = "4,5,6"; } number = number.substr (0, 1); ps_location = "Room: " + room + " Cubicle: " + rack + " Crate pos.: " + number + " Ch.: " + channels; DEBUG_STREAM << "Power supply location : " << ps_location << endl; // Create the access to the power supply try { BILT = new itest::TMagnet (iPAddress.c_str(), magnetNumber); } catch (itest::ItestException &e) { try { create_tango_exception (e, mdata_errors, "Init failure" , "Cannot initialise ITEST libray objects", "Bilt::init_device"); } catch (Tango::DevFailed &e) { set_state (Tango::UNKNOWN); } } // initialise with the actual current set point values try { for (int i=0; ipole(i).get_current_DC(); } Tango::MultiAttribute *attr_list = get_device_attr(); Tango::WAttribute &attr_curr = attr_list->get_w_attr_by_name ("Currents"); attr_curr.set_write_value(¤ts_dc[0], currents_dc.size()); } catch (itest::ItestException &e) { try { create_tango_exception (e, mdata_errors, "Init failure" , "Cannot read the actual current set point values", "Bilt::init_device"); } catch (Tango::DevFailed &e) { set_state (Tango::UNKNOWN); } } // initialise and start the acquisition thread exit_thread = false; acquisition_thread = new AcquisitionThread(this, data_mutex, bilt_mutex); } //+---------------------------------------------------------------------------- // // method : Bilt::get_device_property() // // description : Read the device properties from database. // //----------------------------------------------------------------------------- void Bilt::get_device_property() { // Initialize your default values here (if not done with POGO). //------------------------------------------------------------------ BILT = NULL; bilt_connection_lost = false; acquisition_thread = NULL; struct timeval now; gettimeofday (&now, NULL); data_set_time = now; data_read_time = now; // intitialise mdada structure for magnet read values mdata.magnet = -1; mdata.state = -1; for (int i=0; i_UseDb==true) get_db_device()->get_property(dev_prop); Tango::DbDatum def_prop, cl_prop; BiltClass *ds_class = (static_cast(get_device_class())); int i = -1; // Try to initialize IPAddress from class property cl_prop = ds_class->get_class_property(dev_prop[++i].name); if (cl_prop.is_empty()==false) cl_prop >> iPAddress; else { // Try to initialize IPAddress from default device value def_prop = ds_class->get_default_device_property(dev_prop[i].name); if (def_prop.is_empty()==false) def_prop >> iPAddress; } // And try to extract IPAddress value from database if (dev_prop[i].is_empty()==false) dev_prop[i] >> iPAddress; // Try to initialize MagnetNumber from class property cl_prop = ds_class->get_class_property(dev_prop[++i].name); if (cl_prop.is_empty()==false) cl_prop >> magnetNumber; else { // Try to initialize MagnetNumber from default device value def_prop = ds_class->get_default_device_property(dev_prop[i].name); if (def_prop.is_empty()==false) def_prop >> magnetNumber; } // And try to extract MagnetNumber value from database if (dev_prop[i].is_empty()==false) dev_prop[i] >> magnetNumber; // Try to initialize UpdatePeriod from class property cl_prop = ds_class->get_class_property(dev_prop[++i].name); if (cl_prop.is_empty()==false) cl_prop >> updatePeriod; else { // Try to initialize UpdatePeriod from default device value def_prop = ds_class->get_default_device_property(dev_prop[i].name); if (def_prop.is_empty()==false) def_prop >> updatePeriod; } // And try to extract UpdatePeriod value from database if (dev_prop[i].is_empty()==false) dev_prop[i] >> updatePeriod; // End of Automatic code generation //------------------------------------------------------------------ } //+---------------------------------------------------------------------------- // // method : Bilt::always_executed_hook() // // description : method always executed before any command is executed // //----------------------------------------------------------------------------- void Bilt::always_executed_hook() { } //+---------------------------------------------------------------------------- // // method : Bilt::read_attr_hardware // // description : Hardware acquisition for attributes. // //----------------------------------------------------------------------------- void Bilt::read_attr_hardware(vector &attr_list) { DEBUG_STREAM << "Bilt::read_attr_hardware(vector &attr_list) entering... "<< endl; // Add your own code here } //+---------------------------------------------------------------------------- // // method : Bilt::read_Location // // description : Extract real attribute values for Location acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_Location(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_Location(Tango::Attribute &attr) entering... "<< endl; location = const_cast (ps_location.c_str()); attr.set_value (&location); } //+---------------------------------------------------------------------------- // // method : Bilt::read_Temperatures // // description : Extract real attribute values for Temperatures acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_Temperatures(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_Temperatures(Tango::Attribute &attr) entering... "<< endl; omni_mutex_lock l(data_mutex); if ( temp_errors.length() != 0 ) { attr.set_quality(Tango::ATTR_INVALID); } else { attr.set_value (&(temperatures[0]), 2*POLES); } } //+---------------------------------------------------------------------------- // // method : Bilt::read_FramesPerSecond // // description : Extract real attribute values for FramesPerSecond acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_FramesPerSecond(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_FramesPerSecond(Tango::Attribute &attr) entering... "<< endl; omni_mutex_lock l(data_mutex); if ( fdata_errors.length() != 0 ) attr.set_quality(Tango::ATTR_INVALID); else { for (int i=0; ipole(i).get_switch(); } if ( switch_state == 1 ) local_control[i] = false; else local_control[i] = true; } } catch (itest::ItestException &e) { create_tango_exception (e, "Read failure" , "Cannot read the actual switch states", "Bilt::read_LocalControls"); } attr.set_value (&(local_control[0]), POLES); } //+---------------------------------------------------------------------------- // // method : Bilt::read_SetCurrentsRMS // // description : Extract real attribute values for SetCurrentsRMS acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_SetCurrentsRMS(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_SetCurrentsRMS(Tango::Attribute &attr) entering... "<< endl; omni_mutex_lock l(data_mutex); if ( fdata_errors.length() != 0 ) attr.set_quality(Tango::ATTR_INVALID); else { for (int i=0; i CURRENT_LIMIT ) { if ( isnan(impedances[i]) ) { impedances[i] = fabs (mdata.idata[i].measvolt / mdata.idata[i].meascurr); //cout << "nan " << i << " : " << impedances[i] << endl; } else { // Averaging to avoid impedance alarms when changing the // current settings. /* An = p * Yn + (1 - p)An-1 */ /* with 0 < p < 1 */ /* p = 1 / nu_average */ double p = 1.0 / 3; // Averaging over three values impedances[i] = p * (fabs (mdata.idata[i].measvolt / mdata.idata[i].meascurr)) + (1 - p) * impedances[i]; //cout << "average " << i << " : " << impedances[i] << endl; } } else { //cout << "limit" << i << " : " << mdata.idata[i].meascurr << endl; impedances[i] = nan("NaN"); } } } attr.set_value (&(impedances[0]), POLES); } //+---------------------------------------------------------------------------- // // method : Bilt::write_Currents // // description : Write Currents attribute values to hardware. // //----------------------------------------------------------------------------- void Bilt::write_Currents(Tango::WAttribute &attr) { DEBUG_STREAM << "Bilt::write_Currents(Tango::WAttribute &attr) entering... "<< endl; const double *set_currents; // check the correct number of setpoints if ( attr.get_write_value_length() == POLES ) attr.get_write_value(set_currents); else { TangoSys_MemStream tms; tms << "Wrong number of setpoints!" << endl; Tango::Except::throw_exception("WriteError", tms.str(), "Bilt::write_Currents"); } // apply setpoints to the poles try { omni_mutex_lock l(bilt_mutex); for (int i=0; ipole(i).set_current_DC (set_currents[i]); } // initialise the set time, to be sure that the next // returned read value is newer and contains the changes. struct timeval now; gettimeofday (&now, NULL); data_set_time = now; } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot write DC current values", "Bilt::write_Currents"); } } //+---------------------------------------------------------------------------- // // method : Bilt::read_Currents // // description : Extract real attribute values for Currents acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_Currents(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_Currents(Tango::Attribute &attr) entering... "<< endl; omni_mutex_lock l(data_mutex); if ( mdata_errors.length() != 0 ) attr.set_quality(Tango::ATTR_INVALID); else { for (int i=0; iset_state(1); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot switch on pole", "Bilt::on"); } } //+------------------------------------------------------------------ /** * method: Bilt::off * * description: method to execute "Off" * Turns of power supply * * */ //+------------------------------------------------------------------ void Bilt::off() { DEBUG_STREAM << "Bilt::off(): entering... !" << endl; // Add your own code to control device here try { omni_mutex_lock l(bilt_mutex); BILT->set_state(0); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot switch off pole", "Bilt::off"); } } //+------------------------------------------------------------------ /** * method: Bilt::reset * * description: method to execute "Reset" * Reset faults and alarms * * */ //+------------------------------------------------------------------ void Bilt::reset() { DEBUG_STREAM << "Bilt::reset(): entering... !" << endl; // Add your own code to control device here try { omni_mutex_lock l(bilt_mutex); BILT->clear_all_err(); BILT->clear_alarm(); for (int i=0; ipole(i).clear_ferrors(); } } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot reset pole", "Bilt::reset"); } } //+------------------------------------------------------------------ /** * method: Bilt::set_pole_ac_current * * description: method to execute "SetPoleAcCurrent" * Set the AC current for one Pole. * [0] = pole number, [1] = current * * @param argin [0] = pole number, [1] = current * */ //+------------------------------------------------------------------ void Bilt::set_pole_ac_current(const Tango::DevVarDoubleArray *argin) { DEBUG_STREAM << "Bilt::set_pole_ac_current(): entering... !" << endl; // Add your own code to control device here // argin[0] = pole number if ( (*argin)[0] < 0 || (*argin)[0] >= POLES ) { TangoSys_MemStream tms; tms << "The entered Pole number is out of range" << endl; Tango::Except::throw_exception("WriteError", tms.str(), "Bilt::set_pole_ac_current"); } try { omni_mutex_lock l(bilt_mutex); BILT->pole((int)(*argin)[0]).set_current_AC ((*argin)[1]); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot write AC current value", "Bilt::set_pole_ac_current"); } } //+------------------------------------------------------------------ /** * method: Bilt::local_pole_control * * description: method to execute "LocalPoleControl" * Set the AC current for one Pole. * [0] = pole number, [1] = local control true/false * * @param argin [0] = pole number, [1] = local control true/false * */ //+------------------------------------------------------------------ void Bilt::local_pole_control(const Tango::DevVarShortArray *argin) { DEBUG_STREAM << "Bilt::local_pole_control(): entering... !" << endl; // Add your own code to control device here // argin[0] = pole number if ( (*argin)[0] < 0 || (*argin)[0] >= POLES ) { TangoSys_MemStream tms; tms << "The entered Pole number is out of range" << endl; Tango::Except::throw_exception("WriteError", tms.str(), "Bilt::local_pole_control"); } // argin[1] = true or false (1 or 0 ) if ( (*argin)[1] != 0 && (*argin)[1] != 1 ) { TangoSys_MemStream tms; tms << "Local control can only be choosen as 0 or 1 (false or true)" << endl; Tango::Except::throw_exception("WriteError", tms.str(), "Bilt::local_pole_control"); } try { int switch_state; if ( (*argin)[1] == true ) switch_state = 0; else switch_state = 1; omni_mutex_lock l(bilt_mutex); BILT->pole((*argin)[0]).set_switch (switch_state); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot write switch state", "Bilt::local_pole_control"); } } //+------------------------------------------------------------------ /** * method: Bilt::set_pole_current * * description: method to execute "SetPoleCurrent" * Set the current for one Pole. * [0] = pole number, [1] = current * * @param argin [0] = pole number, [1] = current * */ //+------------------------------------------------------------------ void Bilt::set_pole_current(const Tango::DevVarDoubleArray *argin) { DEBUG_STREAM << "Bilt::set_pole_current(): entering... !" << endl; // Add your own code to control device here // argin[0] = pole number if ( (*argin)[0] < 0 || (*argin)[0] >= POLES ) { TangoSys_MemStream tms; tms << "The entered Pole number is out of range" << endl; Tango::Except::throw_exception("WriteError", tms.str(), "Bilt::set_pole_current"); } try { omni_mutex_lock l(bilt_mutex); BILT->pole((int)(*argin)[0]).set_current_DC ((*argin)[1]); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot write current value", "Bilt::set_pole_current"); } // make sure that the current set values are correct! try { omni_mutex_lock l(bilt_mutex); for (int i=0; ipole(i).get_current_DC(); } Tango::MultiAttribute *attr_list = get_device_attr(); Tango::WAttribute &attr_curr = attr_list->get_w_attr_by_name ("Currents"); attr_curr.set_write_value(¤ts_dc[0], currents_dc.size()); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot read the actual current set point values", "Bilt::set_pole_current"); } // initialise the set time, to be sure that the next // returned read value is newer and contains the changes. struct timeval now; gettimeofday (&now, NULL); data_set_time = now; } //+------------------------------------------------------------------ /** * method: Bilt::create_tango_exception() * * description: convert an itest exception into a tango exception * * * in : - &e : Reference to itest exception * - reason : Reason of the local Tango exception to be added to the stack * - desc : Description for the local Tango exception to be added to the stack * - origin : Origin if the local Tango exception to be added to the stack */ //+------------------------------------------------------------------ void Bilt::create_tango_exception (itest::ItestException &e, string reason, string desc, string origin) { Tango::DevErrorList errors; create_tango_exception (e, errors, reason, desc, origin); } //+------------------------------------------------------------------ /** * method: Bilt::create_tango_exception() * * description: convert an itest exception into a tango exception * * * in : - &e : Reference to itest exception * - errors : Tango error list to use, to store exception info * - reason : Reason of the local Tango exception to be added to the stack * - desc : Description for the local Tango exception to be added to the stack * - origin : Origin if the local Tango exception to be added to the stack */ //+------------------------------------------------------------------ void Bilt::create_tango_exception (itest::ItestException &e, Tango::DevErrorList &errors, string reason, string desc, string origin) { DEBUG_STREAM << "Bilt::create_tango_exception(): entering... !" << endl; errors.length(e.errors.size() + 1); int i; for(i=0; idevice_status data member) and returns it to the caller. * * @return Status description * */ //+------------------------------------------------------------------ Tango::ConstDevString Bilt::dev_status() { //Tango::ConstDevString argout = DeviceImpl::dev_status(); DEBUG_STREAM << "Bilt::dev_status(): entering... !" << endl; // Add your own code to control device here stringstream status; status << "PS Location : " << ps_location << endl; Tango::DevState state = dev_state(); switch (state) { case Tango::ON: status << "State : ON" << endl; break; case Tango::OFF: status << "State : OFF" << endl; break; case Tango::ALARM: { status << "State : Alarm" << endl; omni_mutex_lock l(data_mutex); for (int i=0; i 10W in 10ms!" << endl; else { if ( mdata.idata[i].fail == "TEMP" ) status << "Fault descr. : Max. temp on semiconductor reached!" << endl; else { if ( mdata.idata[i].fail == "PWSO" ) status << "Fault descr. : Delivered power > 40W in 100ms!" << endl; else { status << "Fault descr. : Unkown fault code!" << endl; } } } } } } } break; } default: { { omni_mutex_lock l(data_mutex); status << "State : Unknown" << endl; if ( bilt_connection_lost == true ) { status << "Connection lost to BILT power supply, trying to reconnect!" << endl; status << endl; } if ( mdata_errors.length() > 0 ) status << "Error stack : " << endl; for(int i=0; idevice_state data member) and returns it to the caller. * * @return State Code * */ //+------------------------------------------------------------------ Tango::DevState Bilt::dev_state() { Tango::DevState argout; try { argout = DeviceImpl::dev_state(); } catch (Tango::DevFailed &e) { // just ignore reading exceptions! } DEBUG_STREAM << "Bilt::dev_state(): entering... !" << endl; // Add your own code to control device here int state; int errors; try { omni_mutex_lock l(data_mutex); state = mdata.state; INFO_STREAM << "magnet state for " << get_name() << " = " << state << endl; errors = mdata_errors.length(); INFO_STREAM << "mdata errors = " << mdata_errors.length() << endl; } catch (Tango::DevFailed &e) { // do nothing! // Just avoid exceptions when executing state or status! } if ( errors != 0 ) set_state (Tango::UNKNOWN); else { // set the device state switch (state) { case -1: set_state (Tango::UNKNOWN); //bilt_connection_lost = true; break; case 0: set_state (Tango::OFF); break; case 1: set_state (Tango::ON); break; case 2: set_state (Tango::ALARM); break; case 3: set_state (Tango::FAULT); break; default: set_state (Tango::UNKNOWN); break; } } // Check for attribute alarms if ( get_state() == Tango::ON && argout == Tango::ALARM ) set_state (Tango::ALARM); return get_state(); } //+------------------------------------------------------------------ /** * method: Bilt::setpoint_check * * description: method to execute "SetpointCheck" * Check the given current values against the specified limits. * * @param argin Setpoint values for the Poles * @return true when settings are OK * */ //+------------------------------------------------------------------ Tango::DevBoolean Bilt::setpoint_check(const Tango::DevVarDoubleArray *argin) { Tango::DevBoolean argout ; DEBUG_STREAM << "Bilt::setpoint_check(): entering... !" << endl; // Add your own code to control device here // get the min and max values for the current settings Tango::MultiAttribute *attr_list = get_device_attr(); Tango::WAttribute &attr_curr = attr_list->get_w_attr_by_name ("Currents"); double min, max; attr_curr.get_min_value(min); attr_curr.get_max_value(max); INFO_STREAM << "min = " << min << " max = " << max << endl; // check the input values argout = true; for ( int i=0; ilength(); i++ ) { INFO_STREAM << "i = " << i << " curr = " << (*argin)[i] << endl; if ( (*argin)[i] < min || (*argin)[i] > max ) { argout = false; break; } } return argout; } //+------------------------------------------------------------------ /** * method: Bilt::enable_ac_current * * description: method to execute "EnableAcCurrent" * Enables the dynamic 10kHz AC current settings from the Liberas. * * */ //+------------------------------------------------------------------ void Bilt::enable_ac_current() { DEBUG_STREAM << "Bilt::enable_ac_current(): entering... !" << endl; // Add your own code to control device here omni_mutex_lock l(bilt_mutex); int switch_state = 1; for ( unsigned int i=0; ipole(i).set_current_AC (0.0); BILT->pole(i).set_switch (switch_state); } } //+------------------------------------------------------------------ /** * method: Bilt::disable_ac_current * * description: method to execute "DisableAcCurrent" * Disables the dynamic 10kHz AC current settings from the Liberas. * * */ //+------------------------------------------------------------------ void Bilt::disable_ac_current() { DEBUG_STREAM << "Bilt::disable_ac_current(): entering... !" << endl; // Add your own code to control device here omni_mutex_lock l(bilt_mutex); int switch_state = 0; for ( unsigned int i=0; ipole(i).set_switch (switch_state); BILT->pole(i).set_current_AC (0.0); } } } // namespace Revision-number: 92 Prop-content-length: 146 Content-length: 146 K 10 svn:author V 5 meyer K 8 svn:date V 27 2012-04-02T15:27:19.000000Z K 7 svn:log V 46 Corrected alarm levels and adapted to Tango8. PROPS-END Node-path: powersupply/itest/Bilt/trunk/Bilt.cpp Node-kind: file Node-action: change Text-content-length: 39467 Text-content-md5: 06293ffb1fe1222546ebfea3c63d408e Content-length: 39467 static const char *RcsId = "$Id: Bilt.cpp,v 1.25 2012-04-02 15:27:19 meyer Exp $"; //+============================================================================= // // file : Bilt.cpp // // description : C++ source for the Bilt and its commands. // The class is derived from Device. It represents the // CORBA servant object which will be accessed from the // network. All commands which can be executed on the // Bilt are implemented in this file. // // project : TANGO Device Server // // $Author: meyer $ // // $Revision: 1.25 $ // // $Revision: 1.25 $ // $Date: 2012-04-02 15:27:19 $ // // SVN only: // $HeadURL: $ // // CVS only: // $Source: /segfs/tango/cvsroot/cppserver/machine/powersupply/SrSteerers/tango/Bilt/Bilt.cpp,v $ // $Log: not supported by cvs2svn $ // Revision 1.24 2011/10/06 14:03:06 meyer // Bug correction in disable_ac_current(). // // Revision 1.23 2011/08/05 13:41:08 meyer // Added the commands EnableAcCurrent and DisableAcCurrent. // These commands allow to enable or disable the remote AC // current settings from the Liberas // // Revision 1.22 2011-03-17 14:53:40 meyer // Cleaned-up the code and added an averaging for the impedance calculation. // // Revision 1.21 2011-01-12 12:33:59 meyer // Added attribute to indicate the power supply location. // // Revision 1.20 2011-01-12 08:50:06 meyer // Deleted the wait time for the next reading after writing. // Deleted sleep time during current writing. // // Revision 1.19 2010/11/26 08:40:04 meyer // Caught exceptions in in dev_state around DevImp::dev_state. // Temperature alarm checking might return an exception. // // Sleep time between the writing og current settings set to 20ms. // // Revision 1.18 2010/11/23 07:12:39 meyer // Changed placement of bilt_mutex in write_Current. // // Revision 1.17 2010/11/17 11:42:48 meyer // Replaced the INVALID attribute quality by an exception. // This should avoid a bug in the Tango api which does not take the // attribute quality into account during alarm checking! // // Revision 1.16 2010/11/10 14:00:29 meyer // Changed unit of AC RMS and average value from A to mA. // // Revision 1.15 2010-11-10 12:01:29 meyer // Changed type of Temperatures attribute from long to double and moved // temperature reading to the acquisition thread. // // Revision 1.14 2010/06/21 07:13:05 meyer // Added a spectrum attribute for the temperature measurements and changed to libMagnet version 1.4. // // Revision 1.13 2010/05/01 16:58:39 meyer // Changed alarm limits for the impedance attribute. // // Revision 1.12 2010/03/16 14:54:58 meyer // Added reconnection method. // // Revision 1.11 2010-02-18 16:46:31 meyer // Filled-in code for SetpointCheck // // Revision 1.10 2010-02-12 16:35:13 meyer // Added SetPoleCurrent command again. // // Revision 1.9 2010-02-11 16:35:27 meyer // Currents settings understand NaN values. // Deleted StePoleCurrent command. // // Revision 1.8 2010/02/10 12:27:31 meyer // Restructured Bilt class. // Acquistion is now done by a thread and only the multi channel data // gets exported. A single channel class (BiltCh) was created. // // Revision 1.7 2009/12/18 12:01:40 meyer // Corrected alarm handling in dev_state() // // Revision 1.6 2009/11/27 13:49:26 meyer // Modified structure! The pole is no longer a device. // The device is now a magnet with three poles. // // Revision 1.5 2009/11/26 10:46:58 meyer // Updated for libMagnet_V120 // // Revision 1.4 2009/11/24 09:21:46 meyer // Absolut value for impedance // // Revision 1.3 2009/11/23 16:46:58 meyer // Corrected state, status and exception handling // // Revision 1.2 2009/11/06 12:46:25 meyer // Added impedance attribute and corrected fromatting of attribute values. // // Revision 1.1.1.1 2009/11/04 16:23:02 meyer // Imported using TkCVS // // // copyleft : European Synchrotron Radiation Facility // BP 220, Grenoble 38043 // FRANCE // //-============================================================================= // // This file is generated by POGO // (Program Obviously used to Generate tango Object) // // (c) - Software Engineering Group - ESRF //============================================================================= //=================================================================== // // The following table gives the correspondence // between commands and method name. // // Command name | Method name // ---------------------------------------- // State | dev_state() // Status | dev_status() // On | on() // Off | off() // Reset | reset() // SetPoleAcCurrent | set_pole_ac_current() // LocalPoleControl | local_pole_control() // SetpointCheck | setpoint_check() // SetPoleCurrent | set_pole_current() // EnableAcCurrent | enable_ac_current() // DisableAcCurrent | disable_ac_current() // //=================================================================== #include #include #include #include #include namespace Bilt_ns { //+---------------------------------------------------------------------------- // // method : Bilt::Bilt(string &s) // // description : constructor for simulated Bilt // // in : - cl : Pointer to the DeviceClass object // - s : Device name // //----------------------------------------------------------------------------- Bilt::Bilt(Tango::DeviceClass *cl,string &s) :Tango::Device_4Impl(cl,s.c_str()) { init_device(); } Bilt::Bilt(Tango::DeviceClass *cl,const char *s) :Tango::Device_4Impl(cl,s) { init_device(); } Bilt::Bilt(Tango::DeviceClass *cl,const char *s,const char *d) :Tango::Device_4Impl(cl,s,d) { init_device(); } //+---------------------------------------------------------------------------- // // method : Bilt::delete_device() // // description : will be called at device destruction or at init command. // //----------------------------------------------------------------------------- void Bilt::delete_device() { // Delete device allocated objects if ( acquisition_thread != NULL ) { data_mutex.lock(); exit_thread = true; data_mutex.unlock(); // join now the thread until it exits int *rv; acquisition_thread->join((void **)&rv); cout << "Bilt::delete_device(): Exit acquisition thread !!!" << endl; } // Delete connection to the power supply delete BILT; BILT = NULL; } //+---------------------------------------------------------------------------- // // method : Bilt::init_device() // // description : will be called at device initialization. // //----------------------------------------------------------------------------- void Bilt::init_device() { INFO_STREAM << "Bilt::Bilt() create device " << device_name << endl; // Initialise variables to default values //-------------------------------------------- get_device_property(); set_state (Tango::OFF); // set the power supply location string // Bilt device naming = room-rack-nu.ch. string dev_name = get_name(); int pos = dev_name.rfind ('/'); string room = dev_name.substr (pos+1, string::npos); pos = room.find ('-'); string rack = room.substr (pos+1, string::npos); room = room.substr (0, pos); pos = rack.find ('-'); string number = rack.substr (pos+1, string::npos); rack = rack.substr (0, pos); string channels; if ( number.find ('a') != string::npos ) { channels = "1,2,3"; } else { channels = "4,5,6"; } number = number.substr (0, 1); ps_location = "Room: " + room + " Cubicle: " + rack + " Crate pos.: " + number + " Ch.: " + channels; DEBUG_STREAM << "Power supply location : " << ps_location << endl; // Create the access to the power supply try { BILT = new itest::TMagnet (iPAddress.c_str(), magnetNumber); } catch (itest::ItestException &e) { try { create_tango_exception (e, mdata_errors, "Init failure" , "Cannot initialise ITEST libray objects", "Bilt::init_device"); } catch (Tango::DevFailed &e) { set_state (Tango::UNKNOWN); } } // initialise with the actual current set point values try { for (int i=0; ipole(i).get_current_DC(); } Tango::MultiAttribute *attr_list = get_device_attr(); Tango::WAttribute &attr_curr = attr_list->get_w_attr_by_name ("Currents"); attr_curr.set_write_value(¤ts_dc[0], currents_dc.size()); } catch (itest::ItestException &e) { try { create_tango_exception (e, mdata_errors, "Init failure" , "Cannot read the actual current set point values", "Bilt::init_device"); } catch (Tango::DevFailed &e) { set_state (Tango::UNKNOWN); } } // initialise and start the acquisition thread exit_thread = false; acquisition_thread = new AcquisitionThread(this, data_mutex, bilt_mutex); } //+---------------------------------------------------------------------------- // // method : Bilt::get_device_property() // // description : Read the device properties from database. // //----------------------------------------------------------------------------- void Bilt::get_device_property() { // Initialize your default values here (if not done with POGO). //------------------------------------------------------------------ BILT = NULL; bilt_connection_lost = false; acquisition_thread = NULL; struct timeval now; gettimeofday (&now, NULL); data_set_time = now; data_read_time = now; // intitialise mdada structure for magnet read values mdata.magnet = -1; mdata.state = -1; for (int i=0; i_UseDb==true) get_db_device()->get_property(dev_prop); Tango::DbDatum def_prop, cl_prop; BiltClass *ds_class = (static_cast(get_device_class())); int i = -1; // Try to initialize IPAddress from class property cl_prop = ds_class->get_class_property(dev_prop[++i].name); if (cl_prop.is_empty()==false) cl_prop >> iPAddress; else { // Try to initialize IPAddress from default device value def_prop = ds_class->get_default_device_property(dev_prop[i].name); if (def_prop.is_empty()==false) def_prop >> iPAddress; } // And try to extract IPAddress value from database if (dev_prop[i].is_empty()==false) dev_prop[i] >> iPAddress; // Try to initialize MagnetNumber from class property cl_prop = ds_class->get_class_property(dev_prop[++i].name); if (cl_prop.is_empty()==false) cl_prop >> magnetNumber; else { // Try to initialize MagnetNumber from default device value def_prop = ds_class->get_default_device_property(dev_prop[i].name); if (def_prop.is_empty()==false) def_prop >> magnetNumber; } // And try to extract MagnetNumber value from database if (dev_prop[i].is_empty()==false) dev_prop[i] >> magnetNumber; // Try to initialize UpdatePeriod from class property cl_prop = ds_class->get_class_property(dev_prop[++i].name); if (cl_prop.is_empty()==false) cl_prop >> updatePeriod; else { // Try to initialize UpdatePeriod from default device value def_prop = ds_class->get_default_device_property(dev_prop[i].name); if (def_prop.is_empty()==false) def_prop >> updatePeriod; } // And try to extract UpdatePeriod value from database if (dev_prop[i].is_empty()==false) dev_prop[i] >> updatePeriod; // End of Automatic code generation //------------------------------------------------------------------ } //+---------------------------------------------------------------------------- // // method : Bilt::always_executed_hook() // // description : method always executed before any command is executed // //----------------------------------------------------------------------------- void Bilt::always_executed_hook() { } //+---------------------------------------------------------------------------- // // method : Bilt::read_attr_hardware // // description : Hardware acquisition for attributes. // //----------------------------------------------------------------------------- void Bilt::read_attr_hardware(vector &attr_list) { DEBUG_STREAM << "Bilt::read_attr_hardware(vector &attr_list) entering... "<< endl; // Add your own code here } //+---------------------------------------------------------------------------- // // method : Bilt::read_Location // // description : Extract real attribute values for Location acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_Location(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_Location(Tango::Attribute &attr) entering... "<< endl; location = const_cast (ps_location.c_str()); attr.set_value (&location); } //+---------------------------------------------------------------------------- // // method : Bilt::read_Temperatures // // description : Extract real attribute values for Temperatures acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_Temperatures(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_Temperatures(Tango::Attribute &attr) entering... "<< endl; omni_mutex_lock l(data_mutex); if ( temp_errors.length() != 0 ) { attr.set_quality(Tango::ATTR_INVALID); } else { attr.set_value (&(temperatures[0]), 2*POLES); } } //+---------------------------------------------------------------------------- // // method : Bilt::read_FramesPerSecond // // description : Extract real attribute values for FramesPerSecond acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_FramesPerSecond(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_FramesPerSecond(Tango::Attribute &attr) entering... "<< endl; omni_mutex_lock l(data_mutex); if ( fdata_errors.length() != 0 ) attr.set_quality(Tango::ATTR_INVALID); else { for (int i=0; ipole(i).get_switch(); } if ( switch_state == 1 ) local_control[i] = false; else local_control[i] = true; } } catch (itest::ItestException &e) { create_tango_exception (e, "Read failure" , "Cannot read the actual switch states", "Bilt::read_LocalControls"); } attr.set_value (&(local_control[0]), POLES); } //+---------------------------------------------------------------------------- // // method : Bilt::read_SetCurrentsRMS // // description : Extract real attribute values for SetCurrentsRMS acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_SetCurrentsRMS(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_SetCurrentsRMS(Tango::Attribute &attr) entering... "<< endl; omni_mutex_lock l(data_mutex); if ( fdata_errors.length() != 0 ) attr.set_quality(Tango::ATTR_INVALID); else { for (int i=0; i CURRENT_LIMIT ) { if ( isnan(impedances[i]) ) { impedances[i] = fabs (mdata.idata[i].measvolt / mdata.idata[i].meascurr); //cout << "nan " << i << " : " << impedances[i] << endl; } else { // Averaging to avoid impedance alarms when changing the // current settings. /* An = p * Yn + (1 - p)An-1 */ /* with 0 < p < 1 */ /* p = 1 / nu_average */ double p = 1.0 / 3; // Averaging over three values impedances[i] = p * (fabs (mdata.idata[i].measvolt / mdata.idata[i].meascurr)) + (1 - p) * impedances[i]; //cout << "average " << i << " : " << impedances[i] << endl; } } else { //cout << "limit" << i << " : " << mdata.idata[i].meascurr << endl; impedances[i] = nan("NaN"); } } } attr.set_value (&(impedances[0]), POLES); } //+---------------------------------------------------------------------------- // // method : Bilt::write_Currents // // description : Write Currents attribute values to hardware. // //----------------------------------------------------------------------------- void Bilt::write_Currents(Tango::WAttribute &attr) { DEBUG_STREAM << "Bilt::write_Currents(Tango::WAttribute &attr) entering... "<< endl; const double *set_currents; // check the correct number of setpoints if ( attr.get_write_value_length() == POLES ) attr.get_write_value(set_currents); else { TangoSys_MemStream tms; tms << "Wrong number of setpoints!" << endl; Tango::Except::throw_exception("WriteError", tms.str(), "Bilt::write_Currents"); } // apply setpoints to the poles try { omni_mutex_lock l(bilt_mutex); for (int i=0; ipole(i).set_current_DC (set_currents[i]); } // initialise the set time, to be sure that the next // returned read value is newer and contains the changes. struct timeval now; gettimeofday (&now, NULL); data_set_time = now; } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot write DC current values", "Bilt::write_Currents"); } } //+---------------------------------------------------------------------------- // // method : Bilt::read_Currents // // description : Extract real attribute values for Currents acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_Currents(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_Currents(Tango::Attribute &attr) entering... "<< endl; omni_mutex_lock l(data_mutex); if ( mdata_errors.length() != 0 ) attr.set_quality(Tango::ATTR_INVALID); else { for (int i=0; iset_state(1); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot switch on pole", "Bilt::on"); } } //+------------------------------------------------------------------ /** * method: Bilt::off * * description: method to execute "Off" * Turns of power supply * * */ //+------------------------------------------------------------------ void Bilt::off() { DEBUG_STREAM << "Bilt::off(): entering... !" << endl; // Add your own code to control device here try { omni_mutex_lock l(bilt_mutex); BILT->set_state(0); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot switch off pole", "Bilt::off"); } } //+------------------------------------------------------------------ /** * method: Bilt::reset * * description: method to execute "Reset" * Reset faults and alarms * * */ //+------------------------------------------------------------------ void Bilt::reset() { DEBUG_STREAM << "Bilt::reset(): entering... !" << endl; // Add your own code to control device here try { omni_mutex_lock l(bilt_mutex); BILT->clear_all_err(); BILT->clear_alarm(); for (int i=0; ipole(i).clear_ferrors(); } } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot reset pole", "Bilt::reset"); } } //+------------------------------------------------------------------ /** * method: Bilt::set_pole_ac_current * * description: method to execute "SetPoleAcCurrent" * Set the AC current for one Pole. * [0] = pole number, [1] = current * * @param argin [0] = pole number, [1] = current * */ //+------------------------------------------------------------------ void Bilt::set_pole_ac_current(const Tango::DevVarDoubleArray *argin) { DEBUG_STREAM << "Bilt::set_pole_ac_current(): entering... !" << endl; // Add your own code to control device here // argin[0] = pole number if ( (*argin)[0] < 0 || (*argin)[0] >= POLES ) { TangoSys_MemStream tms; tms << "The entered Pole number is out of range" << endl; Tango::Except::throw_exception("WriteError", tms.str(), "Bilt::set_pole_ac_current"); } try { omni_mutex_lock l(bilt_mutex); BILT->pole((int)(*argin)[0]).set_current_AC ((*argin)[1]); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot write AC current value", "Bilt::set_pole_ac_current"); } } //+------------------------------------------------------------------ /** * method: Bilt::local_pole_control * * description: method to execute "LocalPoleControl" * Set the AC current for one Pole. * [0] = pole number, [1] = local control true/false * * @param argin [0] = pole number, [1] = local control true/false * */ //+------------------------------------------------------------------ void Bilt::local_pole_control(const Tango::DevVarShortArray *argin) { DEBUG_STREAM << "Bilt::local_pole_control(): entering... !" << endl; // Add your own code to control device here // argin[0] = pole number if ( (*argin)[0] < 0 || (*argin)[0] >= POLES ) { TangoSys_MemStream tms; tms << "The entered Pole number is out of range" << endl; Tango::Except::throw_exception("WriteError", tms.str(), "Bilt::local_pole_control"); } // argin[1] = true or false (1 or 0 ) if ( (*argin)[1] != 0 && (*argin)[1] != 1 ) { TangoSys_MemStream tms; tms << "Local control can only be choosen as 0 or 1 (false or true)" << endl; Tango::Except::throw_exception("WriteError", tms.str(), "Bilt::local_pole_control"); } try { int switch_state; if ( (*argin)[1] == true ) switch_state = 0; else switch_state = 1; omni_mutex_lock l(bilt_mutex); BILT->pole((*argin)[0]).set_switch (switch_state); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot write switch state", "Bilt::local_pole_control"); } } //+------------------------------------------------------------------ /** * method: Bilt::set_pole_current * * description: method to execute "SetPoleCurrent" * Set the current for one Pole. * [0] = pole number, [1] = current * * @param argin [0] = pole number, [1] = current * */ //+------------------------------------------------------------------ void Bilt::set_pole_current(const Tango::DevVarDoubleArray *argin) { DEBUG_STREAM << "Bilt::set_pole_current(): entering... !" << endl; // Add your own code to control device here // argin[0] = pole number if ( (*argin)[0] < 0 || (*argin)[0] >= POLES ) { TangoSys_MemStream tms; tms << "The entered Pole number is out of range" << endl; Tango::Except::throw_exception("WriteError", tms.str(), "Bilt::set_pole_current"); } try { omni_mutex_lock l(bilt_mutex); BILT->pole((int)(*argin)[0]).set_current_DC ((*argin)[1]); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot write current value", "Bilt::set_pole_current"); } // make sure that the current set values are correct! try { omni_mutex_lock l(bilt_mutex); for (int i=0; ipole(i).get_current_DC(); } Tango::MultiAttribute *attr_list = get_device_attr(); Tango::WAttribute &attr_curr = attr_list->get_w_attr_by_name ("Currents"); attr_curr.set_write_value(¤ts_dc[0], currents_dc.size()); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot read the actual current set point values", "Bilt::set_pole_current"); } // initialise the set time, to be sure that the next // returned read value is newer and contains the changes. struct timeval now; gettimeofday (&now, NULL); data_set_time = now; } //+------------------------------------------------------------------ /** * method: Bilt::create_tango_exception() * * description: convert an itest exception into a tango exception * * * in : - &e : Reference to itest exception * - reason : Reason of the local Tango exception to be added to the stack * - desc : Description for the local Tango exception to be added to the stack * - origin : Origin if the local Tango exception to be added to the stack */ //+------------------------------------------------------------------ void Bilt::create_tango_exception (itest::ItestException &e, string reason, string desc, string origin) { Tango::DevErrorList errors; create_tango_exception (e, errors, reason, desc, origin); } //+------------------------------------------------------------------ /** * method: Bilt::create_tango_exception() * * description: convert an itest exception into a tango exception * * * in : - &e : Reference to itest exception * - errors : Tango error list to use, to store exception info * - reason : Reason of the local Tango exception to be added to the stack * - desc : Description for the local Tango exception to be added to the stack * - origin : Origin if the local Tango exception to be added to the stack */ //+------------------------------------------------------------------ void Bilt::create_tango_exception (itest::ItestException &e, Tango::DevErrorList &errors, string reason, string desc, string origin) { DEBUG_STREAM << "Bilt::create_tango_exception(): entering... !" << endl; errors.length(e.errors.size() + 1); int i; for(i=0; idevice_status data member) and returns it to the caller. * * @return Status description * */ //+------------------------------------------------------------------ Tango::ConstDevString Bilt::dev_status() { //Tango::ConstDevString argout = DeviceImpl::dev_status(); DEBUG_STREAM << "Bilt::dev_status(): entering... !" << endl; // Add your own code to control device here stringstream status; status << "PS Location : " << ps_location << endl; Tango::DevState state = dev_state(); switch (state) { case Tango::ON: status << "State : ON" << endl; break; case Tango::OFF: status << "State : OFF" << endl; break; case Tango::ALARM: { status << "State : Alarm" << endl; omni_mutex_lock l(data_mutex); for (int i=0; i 10W in 10ms!" << endl; else { if ( mdata.idata[i].fail == "TEMP" ) status << "Fault descr. : Max. temp on semiconductor reached!" << endl; else { if ( mdata.idata[i].fail == "PWSO" ) status << "Fault descr. : Delivered power > 40W in 100ms!" << endl; else { status << "Fault descr. : Unkown fault code!" << endl; } } } } } } } break; } default: { { omni_mutex_lock l(data_mutex); status << "State : Unknown" << endl; if ( bilt_connection_lost == true ) { status << "Connection lost to BILT power supply, trying to reconnect!" << endl; status << endl; } if ( mdata_errors.length() > 0 ) status << "Error stack : " << endl; for(int i=0; idevice_state data member) and returns it to the caller. * * @return State Code * */ //+------------------------------------------------------------------ Tango::DevState Bilt::dev_state() { Tango::DevState argout; try { argout = DeviceImpl::dev_state(); } catch (Tango::DevFailed &e) { // just ignore reading exceptions! } DEBUG_STREAM << "Bilt::dev_state(): entering... !" << endl; // Add your own code to control device here int state; int errors; try { omni_mutex_lock l(data_mutex); state = mdata.state; INFO_STREAM << "magnet state for " << get_name() << " = " << state << endl; errors = mdata_errors.length(); INFO_STREAM << "mdata errors = " << mdata_errors.length() << endl; } catch (Tango::DevFailed &e) { // do nothing! // Just avoid exceptions when executing state or status! } if ( errors != 0 ) set_state (Tango::UNKNOWN); else { // set the device state switch (state) { case -1: set_state (Tango::UNKNOWN); //bilt_connection_lost = true; break; case 0: set_state (Tango::OFF); break; case 1: set_state (Tango::ON); break; case 2: set_state (Tango::ALARM); break; case 3: set_state (Tango::FAULT); break; default: set_state (Tango::UNKNOWN); break; } } // Check for attribute alarms if ( get_state() == Tango::ON && argout == Tango::ALARM ) set_state (Tango::ALARM); return get_state(); } //+------------------------------------------------------------------ /** * method: Bilt::setpoint_check * * description: method to execute "SetpointCheck" * Check the given current values against the specified limits. * * @param argin Setpoint values for the Poles * @return true when settings are OK * */ //+------------------------------------------------------------------ Tango::DevBoolean Bilt::setpoint_check(const Tango::DevVarDoubleArray *argin) { Tango::DevBoolean argout ; DEBUG_STREAM << "Bilt::setpoint_check(): entering... !" << endl; // Add your own code to control device here // get the min and max values for the current settings Tango::MultiAttribute *attr_list = get_device_attr(); Tango::WAttribute &attr_curr = attr_list->get_w_attr_by_name ("Currents"); double min, max; attr_curr.get_min_value(min); attr_curr.get_max_value(max); INFO_STREAM << "min = " << min << " max = " << max << endl; // check the input values argout = true; for ( int i=0; ilength(); i++ ) { INFO_STREAM << "i = " << i << " curr = " << (*argin)[i] << endl; if ( (*argin)[i] < min || (*argin)[i] > max ) { argout = false; break; } } return argout; } //+------------------------------------------------------------------ /** * method: Bilt::enable_ac_current * * description: method to execute "EnableAcCurrent" * Enables the dynamic 10kHz AC current settings from the Liberas. * * */ //+------------------------------------------------------------------ void Bilt::enable_ac_current() { DEBUG_STREAM << "Bilt::enable_ac_current(): entering... !" << endl; // Add your own code to control device here omni_mutex_lock l(bilt_mutex); int switch_state = 1; for ( unsigned int i=0; ipole(i).set_current_AC (0.0); BILT->pole(i).set_switch (switch_state); } } //+------------------------------------------------------------------ /** * method: Bilt::disable_ac_current * * description: method to execute "DisableAcCurrent" * Disables the dynamic 10kHz AC current settings from the Liberas. * * */ //+------------------------------------------------------------------ void Bilt::disable_ac_current() { DEBUG_STREAM << "Bilt::disable_ac_current(): entering... !" << endl; // Add your own code to control device here omni_mutex_lock l(bilt_mutex); int switch_state = 0; for ( unsigned int i=0; ipole(i).set_switch (switch_state); BILT->pole(i).set_current_AC (0.0); } } } // namespace Node-path: powersupply/itest/Bilt/trunk/BiltClass.cpp Node-kind: file Node-action: change Text-content-length: 30709 Text-content-md5: 14d9a8649a68168c888feff62b9fd75d Content-length: 30709 static const char *ClassId = "$Id: BiltClass.cpp,v 1.20 2012-04-02 15:27:19 meyer Exp $"; static const char *TagName = "$Name: not supported by cvs2svn $"; static const char *CvsPath = "$Source: /segfs/tango/cvsroot/cppserver/machine/powersupply/SrSteerers/tango/Bilt/BiltClass.cpp,v $"; static const char *SvnPath = "$HeadURL: $"; static const char *HttpServer = "http://www.esrf.fr/computing/cs/tango/tango_doc/ds_doc/"; //+============================================================================= // // file : BiltClass.cpp // // description : C++ source for the BiltClass. A singleton // class derived from DeviceClass. It implements the // command list and all properties and methods required // by the Bilt once per process. // // project : TANGO Device Server // // $Author: meyer $ // // $Revision: 1.20 $ // // $Log: not supported by cvs2svn $ // Revision 1.19 2011/08/05 13:41:08 meyer // Added the commands EnableAcCurrent and DisableAcCurrent. // These commands allow to enable or disable the remote AC // current settings from the Liberas // // Revision 1.18 2011-01-12 12:34:00 meyer // Added attribute to indicate the power supply location. // // Revision 1.17 2010/11/16 08:50:37 meyer // Changed temperature alarm from 40 to 40 C. // // Revision 1.16 2010/11/10 14:00:29 meyer // Changed unit of AC RMS and average value from A to mA. // // Revision 1.15 2010-11-10 11:59:11 meyer // Changed type of Temperatures attribute from long to double. // Added default alarm and polling values. // // Revision 1.14 2010/06/24 11:43:10 meyer // Corrected memory leak when the reconnection to the power supply fails. // // Revision 1.13 2010/06/21 07:13:05 meyer // Added a spectrum attribute for the temperature measurements and changed to libMagnet version 1.4. // // Revision 1.12 2010/05/01 16:58:39 meyer // Changed alarm limits for the impedance attribute. // // Revision 1.11 2010/03/16 15:03:33 meyer // Excluded Steerer class. // // Revision 1.10 2010-02-12 16:35:13 meyer // Added SetPoleCurrent command again. // // Revision 1.9 2010-02-11 16:35:27 meyer // Currents settings understand NaN values. // Deleted StePoleCurrent command. // // Revision 1.8 2010/02/10 16:22:15 meyer // Release_3_0 // // Revision 1.7 2010/02/10 12:27:31 meyer // Restructured Bilt class. // Acquistion is now done by a thread and only the multi channel data // gets exported. A single channel class (BiltCh) was created. // // Revision 1.6 2009/12/18 12:02:18 meyer // Changed version number to 2.1 // // Revision 1.5 2009/11/27 13:49:26 meyer // Modified structure! The pole is no longer a device. // The device is now a magnet with three poles. // // Revision 1.4 2009/11/26 10:46:58 meyer // Updated for libMagnet_V120 // // Revision 1.3 2009/11/23 16:46:58 meyer // Corrected state, status and exception handling // // Revision 1.2 2009/11/06 12:46:25 meyer // Added impedance attribute and corrected fromatting of attribute values. // // Revision 1.1.1.1 2009/11/04 16:23:02 meyer // Imported using TkCVS // // // copyleft : European Synchrotron Radiation Facility // BP 220, Grenoble 38043 // FRANCE // //-============================================================================= // // This file is generated by POGO // (Program Obviously used to Generate tango Object) // // (c) - Software Engineering Group - ESRF //============================================================================= #include #include #include //+---------------------------------------------------------------------------- /** * Create BiltClass singleton and return it in a C function for Python usage */ //+---------------------------------------------------------------------------- extern "C" { #ifdef WIN32 __declspec(dllexport) #endif Tango::DeviceClass *_create_Bilt_class(const char *name) { return Bilt_ns::BiltClass::init(name); } } namespace Bilt_ns { //+---------------------------------------------------------------------------- // // method : DisableAcCurrentCmd::execute() // // description : method to trigger the execution of the command. // PLEASE DO NOT MODIFY this method core without pogo // // in : - device : The device on which the command must be executed // - in_any : The command input data // // returns : The command output data (packed in the Any object) // //----------------------------------------------------------------------------- CORBA::Any *DisableAcCurrentCmd::execute(Tango::DeviceImpl *device,const CORBA::Any &in_any) { cout2 << "DisableAcCurrentCmd::execute(): arrived" << endl; ((static_cast(device))->disable_ac_current()); return new CORBA::Any(); } //+---------------------------------------------------------------------------- // // method : EnableAcCurrentClass::execute() // // description : method to trigger the execution of the command. // PLEASE DO NOT MODIFY this method core without pogo // // in : - device : The device on which the command must be executed // - in_any : The command input data // // returns : The command output data (packed in the Any object) // //----------------------------------------------------------------------------- CORBA::Any *EnableAcCurrentClass::execute(Tango::DeviceImpl *device,const CORBA::Any &in_any) { cout2 << "EnableAcCurrentClass::execute(): arrived" << endl; ((static_cast(device))->enable_ac_current()); return new CORBA::Any(); } //+---------------------------------------------------------------------------- // // method : SetPoleCurrentCmd::execute() // // description : method to trigger the execution of the command. // PLEASE DO NOT MODIFY this method core without pogo // // in : - device : The device on which the command must be executed // - in_any : The command input data // // returns : The command output data (packed in the Any object) // //----------------------------------------------------------------------------- CORBA::Any *SetPoleCurrentCmd::execute(Tango::DeviceImpl *device,const CORBA::Any &in_any) { cout2 << "SetPoleCurrentCmd::execute(): arrived" << endl; const Tango::DevVarDoubleArray *argin; extract(in_any, argin); ((static_cast(device))->set_pole_current(argin)); return new CORBA::Any(); } //+---------------------------------------------------------------------------- // // method : SetpointCheckCmd::execute() // // description : method to trigger the execution of the command. // PLEASE DO NOT MODIFY this method core without pogo // // in : - device : The device on which the command must be executed // - in_any : The command input data // // returns : The command output data (packed in the Any object) // //----------------------------------------------------------------------------- CORBA::Any *SetpointCheckCmd::execute(Tango::DeviceImpl *device,const CORBA::Any &in_any) { cout2 << "SetpointCheckCmd::execute(): arrived" << endl; const Tango::DevVarDoubleArray *argin; extract(in_any, argin); return insert((static_cast(device))->setpoint_check(argin)); } //+---------------------------------------------------------------------------- // // method : LocalPoleControlCmd::execute() // // description : method to trigger the execution of the command. // PLEASE DO NOT MODIFY this method core without pogo // // in : - device : The device on which the command must be executed // - in_any : The command input data // // returns : The command output data (packed in the Any object) // //----------------------------------------------------------------------------- CORBA::Any *LocalPoleControlCmd::execute(Tango::DeviceImpl *device,const CORBA::Any &in_any) { cout2 << "LocalPoleControlCmd::execute(): arrived" << endl; const Tango::DevVarShortArray *argin; extract(in_any, argin); ((static_cast(device))->local_pole_control(argin)); return new CORBA::Any(); } //+---------------------------------------------------------------------------- // // method : SetPoleAcCurrentCmd::execute() // // description : method to trigger the execution of the command. // PLEASE DO NOT MODIFY this method core without pogo // // in : - device : The device on which the command must be executed // - in_any : The command input data // // returns : The command output data (packed in the Any object) // //----------------------------------------------------------------------------- CORBA::Any *SetPoleAcCurrentCmd::execute(Tango::DeviceImpl *device,const CORBA::Any &in_any) { cout2 << "SetPoleAcCurrentCmd::execute(): arrived" << endl; const Tango::DevVarDoubleArray *argin; extract(in_any, argin); ((static_cast(device))->set_pole_ac_current(argin)); return new CORBA::Any(); } //+---------------------------------------------------------------------------- // // method : OnCmd::execute() // // description : method to trigger the execution of the command. // PLEASE DO NOT MODIFY this method core without pogo // // in : - device : The device on which the command must be executed // - in_any : The command input data // // returns : The command output data (packed in the Any object) // //----------------------------------------------------------------------------- CORBA::Any *OnCmd::execute(Tango::DeviceImpl *device,const CORBA::Any &in_any) { cout2 << "OnCmd::execute(): arrived" << endl; ((static_cast(device))->on()); return new CORBA::Any(); } //+---------------------------------------------------------------------------- // // method : OffCmd::execute() // // description : method to trigger the execution of the command. // PLEASE DO NOT MODIFY this method core without pogo // // in : - device : The device on which the command must be executed // - in_any : The command input data // // returns : The command output data (packed in the Any object) // //----------------------------------------------------------------------------- CORBA::Any *OffCmd::execute(Tango::DeviceImpl *device,const CORBA::Any &in_any) { cout2 << "OffCmd::execute(): arrived" << endl; ((static_cast(device))->off()); return new CORBA::Any(); } //+---------------------------------------------------------------------------- // // method : ResetCmd::execute() // // description : method to trigger the execution of the command. // PLEASE DO NOT MODIFY this method core without pogo // // in : - device : The device on which the command must be executed // - in_any : The command input data // // returns : The command output data (packed in the Any object) // //----------------------------------------------------------------------------- CORBA::Any *ResetCmd::execute(Tango::DeviceImpl *device,const CORBA::Any &in_any) { cout2 << "ResetCmd::execute(): arrived" << endl; ((static_cast(device))->reset()); return new CORBA::Any(); } // //---------------------------------------------------------------- // Initialize pointer for singleton pattern //---------------------------------------------------------------- // BiltClass *BiltClass::_instance = NULL; //+---------------------------------------------------------------------------- // // method : BiltClass::BiltClass(string &s) // // description : constructor for the BiltClass // // in : - s : The class name // //----------------------------------------------------------------------------- BiltClass::BiltClass(string &s):DeviceClass(s) { cout2 << "Entering BiltClass constructor" << endl; set_default_property(); get_class_property(); write_class_property(); cout2 << "Leaving BiltClass constructor" << endl; } //+---------------------------------------------------------------------------- // // method : BiltClass::~BiltClass() // // description : destructor for the BiltClass // //----------------------------------------------------------------------------- BiltClass::~BiltClass() { _instance = NULL; } //+---------------------------------------------------------------------------- // // method : BiltClass::instance // // description : Create the object if not already done. Otherwise, just // return a pointer to the object // // in : - name : The class name // //----------------------------------------------------------------------------- BiltClass *BiltClass::init(const char *name) { if (_instance == NULL) { try { string s(name); _instance = new BiltClass(s); } catch (bad_alloc) { throw; } } return _instance; } BiltClass *BiltClass::instance() { if (_instance == NULL) { cerr << "Class is not initialised !!" << endl; exit(-1); } return _instance; } //+---------------------------------------------------------------------------- // // method : BiltClass::command_factory // // description : Create the command object(s) and store them in the // command list // //----------------------------------------------------------------------------- void BiltClass::command_factory() { command_list.push_back(new OnCmd("On", Tango::DEV_VOID, Tango::DEV_VOID, "", "", Tango::OPERATOR)); command_list.push_back(new OffCmd("Off", Tango::DEV_VOID, Tango::DEV_VOID, "", "", Tango::OPERATOR)); command_list.push_back(new ResetCmd("Reset", Tango::DEV_VOID, Tango::DEV_VOID, "", "", Tango::OPERATOR)); command_list.push_back(new SetPoleAcCurrentCmd("SetPoleAcCurrent", Tango::DEVVAR_DOUBLEARRAY, Tango::DEV_VOID, "[0] = pole number, [1] = current", "", Tango::EXPERT)); command_list.push_back(new LocalPoleControlCmd("LocalPoleControl", Tango::DEVVAR_SHORTARRAY, Tango::DEV_VOID, "[0] = pole number, [1] = local control true/false", "", Tango::EXPERT)); command_list.push_back(new SetpointCheckCmd("SetpointCheck", Tango::DEVVAR_DOUBLEARRAY, Tango::DEV_BOOLEAN, "Setpoint values for the Poles", "true when settings are OK", Tango::OPERATOR)); command_list.push_back(new SetPoleCurrentCmd("SetPoleCurrent", Tango::DEVVAR_DOUBLEARRAY, Tango::DEV_VOID, "[0] = pole number, [1] = current", "", Tango::EXPERT)); command_list.push_back(new EnableAcCurrentClass("EnableAcCurrent", Tango::DEV_VOID, Tango::DEV_VOID, "", "", Tango::OPERATOR)); command_list.push_back(new DisableAcCurrentCmd("DisableAcCurrent", Tango::DEV_VOID, Tango::DEV_VOID, "", "", Tango::OPERATOR)); // add polling if any for (unsigned int i=0 ; ilength() ; i++) { cout4 << "Device name : " << (*devlist_ptr)[i].in() << endl; // Create devices and add it into the device list //---------------------------------------------------- device_list.push_back(new Bilt(this, (*devlist_ptr)[i])); // Export device to the outside world // Check before if database used. //--------------------------------------------- if ((Tango::Util::_UseDb == true) && (Tango::Util::_FileDb == false)) export_device(device_list.back()); else export_device(device_list.back(), (*devlist_ptr)[i]); } // End of Automatic code generation //------------------------------------------------------------- } //+---------------------------------------------------------------------------- // Method: BiltClass::attribute_factory(vector &att_list) //----------------------------------------------------------------------------- void BiltClass::attribute_factory(vector &att_list) { // Attribute : Location LocationAttrib *location = new LocationAttrib(); Tango::UserDefaultAttrProp location_prop; location_prop.set_label("Location"); location_prop.set_unit(" "); location_prop.set_format("%s"); location_prop.set_description("The pysical location of the power supply in the form:\n"); location->set_default_properties(location_prop); att_list.push_back(location); // Attribute : Currents CurrentsAttrib *currents = new CurrentsAttrib(); Tango::UserDefaultAttrProp currents_prop; currents_prop.set_label("Currents"); currents_prop.set_unit("A"); currents_prop.set_format("%6.4f"); currents_prop.set_max_value("1.8"); currents_prop.set_min_value("-1.8"); currents_prop.set_max_alarm("1.5"); currents_prop.set_min_alarm("-1.5"); currents_prop.set_description("The measured currents of the three poles."); currents->set_default_properties(currents_prop); att_list.push_back(currents); // Attribute : Voltages VoltagesAttrib *voltages = new VoltagesAttrib(); Tango::UserDefaultAttrProp voltages_prop; voltages_prop.set_label("Voltages"); voltages_prop.set_unit("V"); voltages_prop.set_format("%6.4"); voltages_prop.set_description("The measured voltages of the three poles."); voltages->set_default_properties(voltages_prop); att_list.push_back(voltages); // Attribute : Impedances ImpedancesAttrib *impedances = new ImpedancesAttrib(); Tango::UserDefaultAttrProp impedances_prop; impedances_prop.set_label("Impedances"); impedances_prop.set_unit("Ohm"); impedances_prop.set_format("%4.2f"); impedances_prop.set_max_alarm("5.0"); impedances_prop.set_min_alarm("2.8"); impedances_prop.set_description("Calculated impedances for the three poles."); impedances->set_default_properties(impedances_prop); impedances->set_polling_period(3000); att_list.push_back(impedances); // Attribute : SetCurrentsRMS SetCurrentsRMSAttrib *set_currents_rms = new SetCurrentsRMSAttrib(); Tango::UserDefaultAttrProp set_currents_rms_prop; set_currents_rms_prop.set_label("RMS AC current setpoints/s"); set_currents_rms_prop.set_unit("mA"); set_currents_rms_prop.set_format("%6.3"); set_currents_rms_prop.set_description("Statistic when driven by the Libera. One RMS value for every pole\nof the magnet.\nRMS value of the AC setpoint applied on the DAC during the last second.\nX=sqr( (sum(setAC)*sum(setAC)) / n - ((sum(setAC)/n) *(sum(setAC)/n)) )"); set_currents_rms->set_default_properties(set_currents_rms_prop); att_list.push_back(set_currents_rms); // Attribute : SetCurrentsAverage SetCurrentsAverageAttrib *set_currents_average = new SetCurrentsAverageAttrib(); Tango::UserDefaultAttrProp set_currents_average_prop; set_currents_average_prop.set_label("Average AC current setpoints/s"); set_currents_average_prop.set_unit("mA"); set_currents_average_prop.set_format("%6.3"); set_currents_average_prop.set_description("Statistic when driven by the Libera. One average value for every pole\nof the magnet.\nAverage value of the AC setpoint applied on the DAC during the last second."); set_currents_average->set_default_properties(set_currents_average_prop); att_list.push_back(set_currents_average); // Attribute : FramesPerSecond FramesPerSecondAttrib *frames_per_second = new FramesPerSecondAttrib(); Tango::UserDefaultAttrProp frames_per_second_prop; frames_per_second_prop.set_label("Frames per second"); frames_per_second_prop.set_display_unit(" "); frames_per_second_prop.set_format("%6d"); frames_per_second_prop.set_description("Number of settings applied during the last second"); frames_per_second->set_default_properties(frames_per_second_prop); att_list.push_back(frames_per_second); // Attribute : ErrorsPerSecond ErrorsPerSecondAttrib *errors_per_second = new ErrorsPerSecondAttrib(); Tango::UserDefaultAttrProp errors_per_second_prop; errors_per_second_prop.set_label("Errors per second"); errors_per_second_prop.set_display_unit(" "); errors_per_second_prop.set_format("%6d"); errors_per_second_prop.set_description("Errors detected during the last second"); errors_per_second->set_default_properties(errors_per_second_prop); att_list.push_back(errors_per_second); // Attribute : ErrorCounters ErrorCountersAttrib *error_counters = new ErrorCountersAttrib(); Tango::UserDefaultAttrProp error_counters_prop; error_counters_prop.set_label("Error counters"); error_counters_prop.set_unit(" "); error_counters_prop.set_format("%6d"); error_counters_prop.set_description("Statistic when driven by the Libera.\nThe total number of errors since the last reset for the \nthree poles."); error_counters->set_default_properties(error_counters_prop); att_list.push_back(error_counters); // Attribute : LocalControls LocalControlsAttrib *local_controls = new LocalControlsAttrib(); Tango::UserDefaultAttrProp local_controls_prop; local_controls_prop.set_description("Indicated whether the individual channels are in local control mode for the \nAC current control. True = local control activated."); local_controls->set_default_properties(local_controls_prop); att_list.push_back(local_controls); // Attribute : Temperatures TemperaturesAttrib *temperatures = new TemperaturesAttrib(); Tango::UserDefaultAttrProp temperatures_prop; temperatures_prop.set_label("Temperatures"); temperatures_prop.set_unit("C"); temperatures_prop.set_format("%6.0f"); temperatures_prop.set_max_alarm("50"); temperatures_prop.set_description("Temperature measurements for the three poles."); temperatures->set_default_properties(temperatures_prop); temperatures->set_polling_period(30000); att_list.push_back(temperatures); // End of Automatic code generation //------------------------------------------------------------- } //+---------------------------------------------------------------------------- // // method : BiltClass::get_class_property() // // description : Read the class properties from database. // //----------------------------------------------------------------------------- void BiltClass::get_class_property() { // Initialize your default values here (if not done with POGO). //------------------------------------------------------------------ // Read class properties from database.(Automatic code generation) //------------------------------------------------------------------ // Call database and extract values //-------------------------------------------- if (Tango::Util::instance()->_UseDb==true) get_db_class()->get_property(cl_prop); Tango::DbDatum def_prop; int i = -1; // End of Automatic code generation //------------------------------------------------------------------ } //+---------------------------------------------------------------------------- // // method : BiltClass::set_default_property // // description: Set default property (class and device) for wizard. // For each property, add to wizard property name and description // If default value has been set, add it to wizard property and // store it in a DbDatum. // //----------------------------------------------------------------------------- void BiltClass::set_default_property() { string prop_name; string prop_desc; string prop_def; vector vect_data; // Set Default Class Properties // Set Default Device Properties prop_name = "IPAddress"; prop_desc = "IP Address of BILT controller.\nEach controller includes several magnets and\neach magnet includes 3 power supplies,\nfor corrections in the X, Y and Z planes.\n\n"; prop_def = "0.0.0.0"; vect_data.clear(); vect_data.push_back("0.0.0.0"); if (prop_def.length()>0) { Tango::DbDatum data(prop_name); data << vect_data ; dev_def_prop.push_back(data); add_wiz_dev_prop(prop_name, prop_desc, prop_def); } else add_wiz_dev_prop(prop_name, prop_desc); prop_name = "MagnetNumber"; prop_desc = "Magnet number from 1 to 48"; prop_def = "0"; vect_data.clear(); vect_data.push_back("0"); if (prop_def.length()>0) { Tango::DbDatum data(prop_name); data << vect_data ; dev_def_prop.push_back(data); add_wiz_dev_prop(prop_name, prop_desc, prop_def); } else add_wiz_dev_prop(prop_name, prop_desc); prop_name = "UpdatePeriod"; prop_desc = "The update period for the data reading from the power supply in milli seconds."; prop_def = "1000"; vect_data.clear(); vect_data.push_back("1000"); if (prop_def.length()>0) { Tango::DbDatum data(prop_name); data << vect_data ; dev_def_prop.push_back(data); add_wiz_dev_prop(prop_name, prop_desc, prop_def); } else add_wiz_dev_prop(prop_name, prop_desc); } //+---------------------------------------------------------------------------- // // method : BiltClass::write_class_property // // description : Set class description as property in database // //----------------------------------------------------------------------------- void BiltClass::write_class_property() { // First time, check if database used //-------------------------------------------- if (Tango::Util::_UseDb == false) return; Tango::DbData data; string classname = get_name(); string header; string::size_type start, end; // Put title Tango::DbDatum title("ProjectTitle"); string str_title("BILT multi channel power supply"); title << str_title; data.push_back(title); // Put Description Tango::DbDatum description("Description"); vector str_desc; str_desc.push_back("The BILT multi channel power supply will be used with 3 channels for the ESRF fast"); str_desc.push_back("feedback systems."); str_desc.push_back("The power supply can be controlled in 2 ways :"); str_desc.push_back("By this device server for slow or human control or"); str_desc.push_back("by the Libera Beam Position monitors for fast feedback with closed loop control."); str_desc.push_back("The devices are exported as one device per steerer magnet. Every device has three"); str_desc.push_back("channels. The channels (poles) cannot be switched on individually but have their"); str_desc.push_back("individual set points and measurement values."); description << str_desc; data.push_back(description); // put cvs or svn location string filename(classname); filename += "Class.cpp"; // Create a string with the class ID to // get the string into the binary string class_id(ClassId); // check for cvs information string src_path(CvsPath); start = src_path.find("/"); if (start!=string::npos) { end = src_path.find(filename); if (end>start) { string strloc = src_path.substr(start, end-start); // Check if specific repository start = strloc.find("/cvsroot/"); if (start!=string::npos && start>0) { string repository = strloc.substr(0, start); if (repository.find("/segfs/")!=string::npos) strloc = "ESRF:" + strloc.substr(start, strloc.length()-start); } Tango::DbDatum cvs_loc("cvs_location"); cvs_loc << strloc; data.push_back(cvs_loc); } } // check for svn information else { string src_path(SvnPath); start = src_path.find("://"); if (start!=string::npos) { end = src_path.find(filename); if (end>start) { header = "$HeadURL: "; start = header.length(); string strloc = src_path.substr(start, (end-start)); Tango::DbDatum svn_loc("svn_location"); svn_loc << strloc; data.push_back(svn_loc); } } } // Get CVS or SVN revision tag // CVS tag string tagname(TagName); header = "$Name: "; start = header.length(); string endstr(" $"); end = tagname.find(endstr); if (end!=string::npos && end>start) { string strtag = tagname.substr(start, end-start); Tango::DbDatum cvs_tag("cvs_tag"); cvs_tag << strtag; data.push_back(cvs_tag); } // SVN tag string svnpath(SvnPath); header = "$HeadURL: "; start = header.length(); end = svnpath.find(endstr); if (end!=string::npos && end>start) { string strloc = svnpath.substr(start, end-start); string tagstr ("/tags/"); start = strloc.find(tagstr); if ( start!=string::npos ) { start = start + tagstr.length(); end = strloc.find(filename); string strtag = strloc.substr(start, end-start-1); Tango::DbDatum svn_tag("svn_tag"); svn_tag << strtag; data.push_back(svn_tag); } } // Get URL location string httpServ(HttpServer); if (httpServ.length()>0) { Tango::DbDatum db_doc_url("doc_url"); db_doc_url << httpServ; data.push_back(db_doc_url); } // Put inheritance Tango::DbDatum inher_datum("InheritedFrom"); vector inheritance; inheritance.push_back("Device_4Impl"); inher_datum << inheritance; data.push_back(inher_datum); // Call database and and values //-------------------------------------------- get_db_class()->put_property(data); } } // namespace Node-path: powersupply/itest/Bilt/trunk/Makefile Node-kind: file Node-action: change Text-content-length: 6965 Text-content-md5: f06ea364ff2c6efed390c4c1f0efb1c7 Content-length: 6965 #============================================================================= # # file : Makefile # # description : Include for the Bilt class. # # project : Makefile to generate a Tango server # # $Author: meyer $ # # $Revision: 1.21 $ # # $Log: not supported by cvs2svn $ # Revision 1.20 2011/08/05 13:41:28 meyer # Set release to 3.9 # # Revision 1.19 2011-03-17 14:50:49 meyer # Changed version to 3.8 # # Revision 1.18 2011-01-12 12:35:00 meyer # Changed version to 3.7 # # Revision 1.17 2010/11/23 07:13:38 meyer # Changed version to 3.6 # # Revision 1.16 2010-11-10 11:59:30 meyer # Changed version to 3.5 # # Revision 1.15 2010-11-08 15:29:42 meyer # Linking now with libtango.a version 7.2! # # Revision 1.14 2010/06/24 11:44:00 meyer # Changed version to 3.4 # # Revision 1.13 2010/06/21 07:16:52 meyer # Changed version to 3.3 # # Revision 1.12 2010/06/21 07:13:05 meyer # Added a spectrum attribute for the temperature measurements and changed to libMagnet version 1.4. # # Revision 1.11 2010/03/19 15:27:01 meyer # Canged to version 3.2 # # Revision 1.10 2010/03/16 15:03:33 meyer # Excluded Steerer class. # # Revision 1.9 2010/03/16 14:57:56 meyer # Rlease_3_1 # # Revision 1.8 2010-02-11 16:35:27 meyer # Currents settings understand NaN values. # Deleted StePoleCurrent command. # # Revision 1.7 2010/02/10 16:22:15 meyer # Release_3_0 # # Revision 1.6 2010/02/10 12:27:31 meyer # Restructured Bilt class. # Acquistion is now done by a thread and only the multi channel data # gets exported. A single channel class (BiltCh) was created. # # Revision 1.5 2009/12/18 12:02:18 meyer # Changed version number to 2.1 # # Revision 1.4 2009/12/18 10:19:23 meyer # Using libMagnet version 130 now. # # Revision 1.3 2009/11/27 13:49:26 meyer # Modified structure! The pole is no longer a device. # The device is now a magnet with three poles. # # Revision 1.2 2009/11/26 10:46:58 meyer # Updated for libMagnet_V120 # # Revision 1.1.1.1 2009/11/04 16:23:02 meyer # Imported using TkCVS # # # copyleft : European Synchrotron Radiation Facility # BP 220, Grenoble 38043 # FRANCE # #============================================================================= # This file is generated by POGO # (Program Obviously used to Generate tango Object) # # (c) - Software Engineering Group - ESRF #============================================================================= # CLASS = Bilt MAJOR_VERS = 3 MINOR_VERS = 9 RELEASE = Release_$(MAJOR_VERS)_$(MINOR_VERS) OS = $(shell /csadmin/common/scripts/get_os) PROCESSOR = $(shell uname -p) #----------------------------------------- # Set default home directories #----------------------------------------- TANGO_HOME = /segfs/tango/release/$(BIN_DIR) CPP_SERVERS = $(TANGO_HOME)/classes ifdef no_debug DEBUG = -O else DEBUG = -g endif ifdef _solaris CC = CC BIN_DIR=$(OS)_CC AR_SL = $(CC) -mt -G VERS_OPT = -h SL_EXT = so endif ifdef linux CC = c++ CC_SHLIB = $(CC) -fPIC $(PROCESSOR)=1 ifdef x86_64 NBITS=_64 endif BIN_DIR=$(OS)$(NBITS) AR_SL = $(CC) -fPIC -shared SL_EXT = so VERS_OPT = -Wl,-soname, endif INCLUDE_DIRS = -I$(TANGO_HOME)/include -I. \ -I$(CPP_SERVERS)/include \ -I libMagnet_V140 OBJS_DIR = obj/$(BIN_DIR) LIB_DIRS = -L $(CPP_SERVERS)/lib \ -L $(TANGO_HOME)/lib \ -L libMagnet_V140 TARGET_LIB = $(CPP_SERVERS)/lib/libtgclasses.a #----------------------------------------- # Set CXXFLAGS and LFLAGS #----------------------------------------- ifdef _solaris CXXFLAGS = $(DEBUG) -mt -D_PTHREADS $(INCLUDE_DIRS) LFLAGS = $(DEBUG) $(LIB_DIRS) \ -ltango \ -llog4tango \ -lomniORB4 \ -lomniDynamic4 \ -lomnithread \ -lCOS4 \ -lpthread \ -lposix4 -lsocket -lnsl \ -ltgclasses endif ifdef linux CXXFLAGS = -g -D_REENTRANT $(INCLUDE_DIRS) LFLAGS = $(DEBUG) $(LIB_DIRS) \ -ltango \ -llog4tango \ -lomniORB4 \ -lomniDynamic4 \ -lomnithread \ -lCOS4 \ -lzmq \ -ldl -lpthread \ -lMagnet \ -ltgclasses endif #----------------------------------------- # Set dependences #----------------------------------------- SVC_OBJS = $(OBJS_DIR)/$(CLASS).o \ $(OBJS_DIR)/$(CLASS)StateMachine.o \ $(OBJS_DIR)/$(CLASS)Class.o \ $(OBJS_DIR)/AcquisitionThread.o \ $(OBJS_DIR)/ClassFactory.o \ $(OBJS_DIR)/main.o SHLIB_OBJS = $(OBJS_DIR)/$(CLASS)Class.so.o \ $(OBJS_DIR)/$(CLASS)StateMachine.so.o \ $(OBJS_DIR)/$(CLASS).so.o \ $(OBJS_DIR)/AcquisitionThread.o SVC_INC = $(CLASS)Class.h \ $(CLASS).h \ AcquisitionThread.h $(OBJS_DIR)/%.o: %.cpp $(SVC_INC) $(CC) $(CXXFLAGS) -c $< -o $(OBJS_DIR)/$*.o $(OBJS_DIR)/%.so.o: %.cpp $(SVC_INC) $(CC_SHLIB) $(CXXFLAGS) -c $< -o $(OBJS_DIR)/$*.so.o #----------------------------------------- # Make Entry #----------------------------------------- all: $(CLASS) $(CLASS): make_obj_dir make_bin_dir $(SVC_OBJS) $(CC) $(SVC_OBJS) -o $(CLASS) $(LFLAGS) @mv $(CLASS) bin/$(BIN_DIR)/$(CLASS) shlib: make_obj_dir make_shlib_dir $(SHLIB_OBJS) $(AR_SL) -o \ shlib/$(BIN_DIR)/$(CLASS).$(SL_EXT).$(MAJOR_VERS).$(MINOR_VERS) \ $(VERS_OPT)$(CLASS).$(SL_EXT).$(MAJOR_VERS) \ $(SHLIB_OBJS) $(LFLAGS) @rm -f shlib/$(BIN_DIR)/$(CLASS).$(SL_EXT) @cd shlib/$(BIN_DIR); \ ln -s $(CLASS).$(SL_EXT).$(MAJOR_VERS).$(MINOR_VERS) $(CLASS).$(SL_EXT) clean: rm -f $(OBJS_DIR)/*.o \ $(OBJS_DIR)/*.so.o \ bin/$(BIN_DIR)/$(CLASS) \ core make_obj_dir: @mkdir -p obj @mkdir -p obj/$(BIN_DIR) make_bin_dir: @mkdir -p bin @mkdir -p bin/$(BIN_DIR) make_shlib_dir: @mkdir -p shlib @mkdir -p shlib/$(BIN_DIR) #----------------------------------------- # Install binary file #----------------------------------------- install: cp bin/$(BIN_DIR)/$(CLASS) $(CPP_SERVERS)/bin #----------------------------------------- # Update class library and header files # recompile without debug mode. #----------------------------------------- lib: clean @make no_debug=1 cp *.h $(CPP_SERVERS)/include ar ruv $(TARGET_LIB) $(OBJS_DIR)/$(CLASS).o ar ruv $(TARGET_LIB) $(OBJS_DIR)/$(CLASS)Class.o ar ruv $(TARGET_LIB) $(OBJS_DIR)/$(CLASS)StateMachine.o ar ruv $(TARGET_LIB) $(OBJS_DIR)/AcquisitionThread.o ident $(TARGET_LIB) | grep $(CLASS) #------------------------------------------------------ # Tag the CVS/SVN module corresponding to this class # copy cvs_tag or svn_tag to tag: entry #------------------------------------------------------ #svn_tag: # svn copy ../trunk ../tags/$(RELEASE) # svn commit ../tags/$(RELEASE) \ # -m "Tagging the $(RELEASE) of the $(CLASS) project." # #cvs_tag: # @cvstag "$(CLASS)-$(RELEASE)" # @make $(CLASS) # @make show_tag #show_cvs_tag: # @cvstag -d # # Only these make options work with the current Pogo version 5.3.x! tag: @cvstag "$(CLASS)-$(RELEASE)" @make $(CLASS) @make show_tag show_tag: @cvstag -d Revision-number: 93 Prop-content-length: 184 Content-length: 184 K 10 svn:author V 5 meyer K 8 svn:date V 27 2012-08-16T12:01:24.000000Z K 7 svn:log V 84 Try to destroy and re-created a non initialise TMagnet object of the ITEST library. PROPS-END Node-path: powersupply/itest/Bilt/trunk/Bilt.cpp Node-kind: file Node-action: change Text-content-length: 40133 Text-content-md5: f57f75d7cd0a581abf925dc5f61a51e5 Content-length: 40133 static const char *RcsId = "$Id: Bilt.cpp,v 1.26 2012-08-16 12:01:24 meyer Exp $"; //+============================================================================= // // file : Bilt.cpp // // description : C++ source for the Bilt and its commands. // The class is derived from Device. It represents the // CORBA servant object which will be accessed from the // network. All commands which can be executed on the // Bilt are implemented in this file. // // project : TANGO Device Server // // $Author: meyer $ // // $Revision: 1.26 $ // // $Revision: 1.26 $ // $Date: 2012-08-16 12:01:24 $ // // SVN only: // $HeadURL: $ // // CVS only: // $Source: /segfs/tango/cvsroot/cppserver/machine/powersupply/SrSteerers/tango/Bilt/Bilt.cpp,v $ // $Log: not supported by cvs2svn $ // Revision 1.25 2012/04/02 15:27:19 meyer // Corrected alarm levels and adapted to Tango8. // // Revision 1.24 2011/10/06 14:03:06 meyer // Bug correction in disable_ac_current(). // // Revision 1.23 2011/08/05 13:41:08 meyer // Added the commands EnableAcCurrent and DisableAcCurrent. // These commands allow to enable or disable the remote AC // current settings from the Liberas // // Revision 1.22 2011-03-17 14:53:40 meyer // Cleaned-up the code and added an averaging for the impedance calculation. // // Revision 1.21 2011-01-12 12:33:59 meyer // Added attribute to indicate the power supply location. // // Revision 1.20 2011-01-12 08:50:06 meyer // Deleted the wait time for the next reading after writing. // Deleted sleep time during current writing. // // Revision 1.19 2010/11/26 08:40:04 meyer // Caught exceptions in in dev_state around DevImp::dev_state. // Temperature alarm checking might return an exception. // // Sleep time between the writing og current settings set to 20ms. // // Revision 1.18 2010/11/23 07:12:39 meyer // Changed placement of bilt_mutex in write_Current. // // Revision 1.17 2010/11/17 11:42:48 meyer // Replaced the INVALID attribute quality by an exception. // This should avoid a bug in the Tango api which does not take the // attribute quality into account during alarm checking! // // Revision 1.16 2010/11/10 14:00:29 meyer // Changed unit of AC RMS and average value from A to mA. // // Revision 1.15 2010-11-10 12:01:29 meyer // Changed type of Temperatures attribute from long to double and moved // temperature reading to the acquisition thread. // // Revision 1.14 2010/06/21 07:13:05 meyer // Added a spectrum attribute for the temperature measurements and changed to libMagnet version 1.4. // // Revision 1.13 2010/05/01 16:58:39 meyer // Changed alarm limits for the impedance attribute. // // Revision 1.12 2010/03/16 14:54:58 meyer // Added reconnection method. // // Revision 1.11 2010-02-18 16:46:31 meyer // Filled-in code for SetpointCheck // // Revision 1.10 2010-02-12 16:35:13 meyer // Added SetPoleCurrent command again. // // Revision 1.9 2010-02-11 16:35:27 meyer // Currents settings understand NaN values. // Deleted StePoleCurrent command. // // Revision 1.8 2010/02/10 12:27:31 meyer // Restructured Bilt class. // Acquistion is now done by a thread and only the multi channel data // gets exported. A single channel class (BiltCh) was created. // // Revision 1.7 2009/12/18 12:01:40 meyer // Corrected alarm handling in dev_state() // // Revision 1.6 2009/11/27 13:49:26 meyer // Modified structure! The pole is no longer a device. // The device is now a magnet with three poles. // // Revision 1.5 2009/11/26 10:46:58 meyer // Updated for libMagnet_V120 // // Revision 1.4 2009/11/24 09:21:46 meyer // Absolut value for impedance // // Revision 1.3 2009/11/23 16:46:58 meyer // Corrected state, status and exception handling // // Revision 1.2 2009/11/06 12:46:25 meyer // Added impedance attribute and corrected fromatting of attribute values. // // Revision 1.1.1.1 2009/11/04 16:23:02 meyer // Imported using TkCVS // // // copyleft : European Synchrotron Radiation Facility // BP 220, Grenoble 38043 // FRANCE // //-============================================================================= // // This file is generated by POGO // (Program Obviously used to Generate tango Object) // // (c) - Software Engineering Group - ESRF //============================================================================= //=================================================================== // // The following table gives the correspondence // between commands and method name. // // Command name | Method name // ---------------------------------------- // State | dev_state() // Status | dev_status() // On | on() // Off | off() // Reset | reset() // SetPoleAcCurrent | set_pole_ac_current() // LocalPoleControl | local_pole_control() // SetpointCheck | setpoint_check() // SetPoleCurrent | set_pole_current() // EnableAcCurrent | enable_ac_current() // DisableAcCurrent | disable_ac_current() // //=================================================================== #include #include #include #include #include namespace Bilt_ns { //+---------------------------------------------------------------------------- // // method : Bilt::Bilt(string &s) // // description : constructor for simulated Bilt // // in : - cl : Pointer to the DeviceClass object // - s : Device name // //----------------------------------------------------------------------------- Bilt::Bilt(Tango::DeviceClass *cl,string &s) :Tango::Device_4Impl(cl,s.c_str()) { init_device(); } Bilt::Bilt(Tango::DeviceClass *cl,const char *s) :Tango::Device_4Impl(cl,s) { init_device(); } Bilt::Bilt(Tango::DeviceClass *cl,const char *s,const char *d) :Tango::Device_4Impl(cl,s,d) { init_device(); } //+---------------------------------------------------------------------------- // // method : Bilt::delete_device() // // description : will be called at device destruction or at init command. // //----------------------------------------------------------------------------- void Bilt::delete_device() { // Delete device allocated objects if ( acquisition_thread != NULL ) { data_mutex.lock(); exit_thread = true; data_mutex.unlock(); // join now the thread until it exits int *rv; acquisition_thread->join((void **)&rv); cout << "Bilt::delete_device(): Exit acquisition thread !!!" << endl; } // Delete connection to the power supply delete BILT; BILT = NULL; } //+---------------------------------------------------------------------------- // // method : Bilt::init_device() // // description : will be called at device initialization. // //----------------------------------------------------------------------------- void Bilt::init_device() { INFO_STREAM << "Bilt::Bilt() create device " << device_name << endl; // Initialise variables to default values //-------------------------------------------- get_device_property(); set_state (Tango::OFF); // set the power supply location string // Bilt device naming = room-rack-nu.ch. string dev_name = get_name(); int pos = dev_name.rfind ('/'); string room = dev_name.substr (pos+1, string::npos); pos = room.find ('-'); string rack = room.substr (pos+1, string::npos); room = room.substr (0, pos); pos = rack.find ('-'); string number = rack.substr (pos+1, string::npos); rack = rack.substr (0, pos); string channels; if ( number.find ('a') != string::npos ) { channels = "1,2,3"; } else { channels = "4,5,6"; } number = number.substr (0, 1); ps_location = "Room: " + room + " Cubicle: " + rack + " Crate pos.: " + number + " Ch.: " + channels; DEBUG_STREAM << "Power supply location : " << ps_location << endl; // Create the access to the power supply try { BILT = new itest::TMagnet (iPAddress.c_str(), magnetNumber); // check the state of the Magnet object. // If it indicates -1 something went wrong during the creation. // This happens from time to time. Why????? // Wait a second and retry! BILT->get_mdata (&mdata); if ( mdata.state == (-1) ) { delete BILT; BILT = NULL; sleep(1); BILT = new itest::TMagnet (iPAddress.c_str(), magnetNumber); } } catch (itest::ItestException &e) { try { create_tango_exception (e, mdata_errors, "Init failure" , "Cannot initialise ITEST libray objects", "Bilt::init_device"); } catch (Tango::DevFailed &e) { set_state (Tango::UNKNOWN); } } // initialise with the actual current set point values try { for (int i=0; ipole(i).get_current_DC(); } Tango::MultiAttribute *attr_list = get_device_attr(); Tango::WAttribute &attr_curr = attr_list->get_w_attr_by_name ("Currents"); attr_curr.set_write_value(¤ts_dc[0], currents_dc.size()); } catch (itest::ItestException &e) { try { create_tango_exception (e, mdata_errors, "Init failure" , "Cannot read the actual current set point values", "Bilt::init_device"); } catch (Tango::DevFailed &e) { set_state (Tango::UNKNOWN); } } // initialise and start the acquisition thread exit_thread = false; acquisition_thread = new AcquisitionThread(this, data_mutex, bilt_mutex); } //+---------------------------------------------------------------------------- // // method : Bilt::get_device_property() // // description : Read the device properties from database. // //----------------------------------------------------------------------------- void Bilt::get_device_property() { // Initialize your default values here (if not done with POGO). //------------------------------------------------------------------ BILT = NULL; bilt_connection_lost = false; acquisition_thread = NULL; struct timeval now; gettimeofday (&now, NULL); data_set_time = now; data_read_time = now; // intitialise mdada structure for magnet read values mdata.magnet = -1; mdata.state = -1; for (int i=0; i_UseDb==true) get_db_device()->get_property(dev_prop); Tango::DbDatum def_prop, cl_prop; BiltClass *ds_class = (static_cast(get_device_class())); int i = -1; // Try to initialize IPAddress from class property cl_prop = ds_class->get_class_property(dev_prop[++i].name); if (cl_prop.is_empty()==false) cl_prop >> iPAddress; else { // Try to initialize IPAddress from default device value def_prop = ds_class->get_default_device_property(dev_prop[i].name); if (def_prop.is_empty()==false) def_prop >> iPAddress; } // And try to extract IPAddress value from database if (dev_prop[i].is_empty()==false) dev_prop[i] >> iPAddress; // Try to initialize MagnetNumber from class property cl_prop = ds_class->get_class_property(dev_prop[++i].name); if (cl_prop.is_empty()==false) cl_prop >> magnetNumber; else { // Try to initialize MagnetNumber from default device value def_prop = ds_class->get_default_device_property(dev_prop[i].name); if (def_prop.is_empty()==false) def_prop >> magnetNumber; } // And try to extract MagnetNumber value from database if (dev_prop[i].is_empty()==false) dev_prop[i] >> magnetNumber; // Try to initialize UpdatePeriod from class property cl_prop = ds_class->get_class_property(dev_prop[++i].name); if (cl_prop.is_empty()==false) cl_prop >> updatePeriod; else { // Try to initialize UpdatePeriod from default device value def_prop = ds_class->get_default_device_property(dev_prop[i].name); if (def_prop.is_empty()==false) def_prop >> updatePeriod; } // And try to extract UpdatePeriod value from database if (dev_prop[i].is_empty()==false) dev_prop[i] >> updatePeriod; // End of Automatic code generation //------------------------------------------------------------------ } //+---------------------------------------------------------------------------- // // method : Bilt::always_executed_hook() // // description : method always executed before any command is executed // //----------------------------------------------------------------------------- void Bilt::always_executed_hook() { } //+---------------------------------------------------------------------------- // // method : Bilt::read_attr_hardware // // description : Hardware acquisition for attributes. // //----------------------------------------------------------------------------- void Bilt::read_attr_hardware(vector &attr_list) { DEBUG_STREAM << "Bilt::read_attr_hardware(vector &attr_list) entering... "<< endl; // Add your own code here } //+---------------------------------------------------------------------------- // // method : Bilt::read_Location // // description : Extract real attribute values for Location acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_Location(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_Location(Tango::Attribute &attr) entering... "<< endl; location = const_cast (ps_location.c_str()); attr.set_value (&location); } //+---------------------------------------------------------------------------- // // method : Bilt::read_Temperatures // // description : Extract real attribute values for Temperatures acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_Temperatures(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_Temperatures(Tango::Attribute &attr) entering... "<< endl; omni_mutex_lock l(data_mutex); if ( temp_errors.length() != 0 ) { attr.set_quality(Tango::ATTR_INVALID); } else { attr.set_value (&(temperatures[0]), 2*POLES); } } //+---------------------------------------------------------------------------- // // method : Bilt::read_FramesPerSecond // // description : Extract real attribute values for FramesPerSecond acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_FramesPerSecond(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_FramesPerSecond(Tango::Attribute &attr) entering... "<< endl; omni_mutex_lock l(data_mutex); if ( fdata_errors.length() != 0 ) attr.set_quality(Tango::ATTR_INVALID); else { for (int i=0; ipole(i).get_switch(); } if ( switch_state == 1 ) local_control[i] = false; else local_control[i] = true; } } catch (itest::ItestException &e) { create_tango_exception (e, "Read failure" , "Cannot read the actual switch states", "Bilt::read_LocalControls"); } attr.set_value (&(local_control[0]), POLES); } //+---------------------------------------------------------------------------- // // method : Bilt::read_SetCurrentsRMS // // description : Extract real attribute values for SetCurrentsRMS acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_SetCurrentsRMS(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_SetCurrentsRMS(Tango::Attribute &attr) entering... "<< endl; omni_mutex_lock l(data_mutex); if ( fdata_errors.length() != 0 ) attr.set_quality(Tango::ATTR_INVALID); else { for (int i=0; i CURRENT_LIMIT ) { if ( isnan(impedances[i]) ) { impedances[i] = fabs (mdata.idata[i].measvolt / mdata.idata[i].meascurr); //cout << "nan " << i << " : " << impedances[i] << endl; } else { // Averaging to avoid impedance alarms when changing the // current settings. /* An = p * Yn + (1 - p)An-1 */ /* with 0 < p < 1 */ /* p = 1 / nu_average */ double p = 1.0 / 3; // Averaging over three values impedances[i] = p * (fabs (mdata.idata[i].measvolt / mdata.idata[i].meascurr)) + (1 - p) * impedances[i]; //cout << "average " << i << " : " << impedances[i] << endl; } } else { //cout << "limit" << i << " : " << mdata.idata[i].meascurr << endl; impedances[i] = nan("NaN"); } } } attr.set_value (&(impedances[0]), POLES); } //+---------------------------------------------------------------------------- // // method : Bilt::write_Currents // // description : Write Currents attribute values to hardware. // //----------------------------------------------------------------------------- void Bilt::write_Currents(Tango::WAttribute &attr) { DEBUG_STREAM << "Bilt::write_Currents(Tango::WAttribute &attr) entering... "<< endl; const double *set_currents; // check the correct number of setpoints if ( attr.get_write_value_length() == POLES ) attr.get_write_value(set_currents); else { TangoSys_MemStream tms; tms << "Wrong number of setpoints!" << endl; Tango::Except::throw_exception("WriteError", tms.str(), "Bilt::write_Currents"); } // apply setpoints to the poles try { omni_mutex_lock l(bilt_mutex); for (int i=0; ipole(i).set_current_DC (set_currents[i]); } // initialise the set time, to be sure that the next // returned read value is newer and contains the changes. struct timeval now; gettimeofday (&now, NULL); data_set_time = now; } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot write DC current values", "Bilt::write_Currents"); } } //+---------------------------------------------------------------------------- // // method : Bilt::read_Currents // // description : Extract real attribute values for Currents acquisition result. // //----------------------------------------------------------------------------- void Bilt::read_Currents(Tango::Attribute &attr) { DEBUG_STREAM << "Bilt::read_Currents(Tango::Attribute &attr) entering... "<< endl; omni_mutex_lock l(data_mutex); if ( mdata_errors.length() != 0 ) attr.set_quality(Tango::ATTR_INVALID); else { for (int i=0; iset_state(1); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot switch on pole", "Bilt::on"); } } //+------------------------------------------------------------------ /** * method: Bilt::off * * description: method to execute "Off" * Turns of power supply * * */ //+------------------------------------------------------------------ void Bilt::off() { DEBUG_STREAM << "Bilt::off(): entering... !" << endl; // Add your own code to control device here try { omni_mutex_lock l(bilt_mutex); BILT->set_state(0); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot switch off pole", "Bilt::off"); } } //+------------------------------------------------------------------ /** * method: Bilt::reset * * description: method to execute "Reset" * Reset faults and alarms * * */ //+------------------------------------------------------------------ void Bilt::reset() { DEBUG_STREAM << "Bilt::reset(): entering... !" << endl; // Add your own code to control device here try { omni_mutex_lock l(bilt_mutex); BILT->clear_all_err(); BILT->clear_alarm(); for (int i=0; ipole(i).clear_ferrors(); } } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot reset pole", "Bilt::reset"); } } //+------------------------------------------------------------------ /** * method: Bilt::set_pole_ac_current * * description: method to execute "SetPoleAcCurrent" * Set the AC current for one Pole. * [0] = pole number, [1] = current * * @param argin [0] = pole number, [1] = current * */ //+------------------------------------------------------------------ void Bilt::set_pole_ac_current(const Tango::DevVarDoubleArray *argin) { DEBUG_STREAM << "Bilt::set_pole_ac_current(): entering... !" << endl; // Add your own code to control device here // argin[0] = pole number if ( (*argin)[0] < 0 || (*argin)[0] >= POLES ) { TangoSys_MemStream tms; tms << "The entered Pole number is out of range" << endl; Tango::Except::throw_exception("WriteError", tms.str(), "Bilt::set_pole_ac_current"); } try { omni_mutex_lock l(bilt_mutex); BILT->pole((int)(*argin)[0]).set_current_AC ((*argin)[1]); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot write AC current value", "Bilt::set_pole_ac_current"); } } //+------------------------------------------------------------------ /** * method: Bilt::local_pole_control * * description: method to execute "LocalPoleControl" * Set the AC current for one Pole. * [0] = pole number, [1] = local control true/false * * @param argin [0] = pole number, [1] = local control true/false * */ //+------------------------------------------------------------------ void Bilt::local_pole_control(const Tango::DevVarShortArray *argin) { DEBUG_STREAM << "Bilt::local_pole_control(): entering... !" << endl; // Add your own code to control device here // argin[0] = pole number if ( (*argin)[0] < 0 || (*argin)[0] >= POLES ) { TangoSys_MemStream tms; tms << "The entered Pole number is out of range" << endl; Tango::Except::throw_exception("WriteError", tms.str(), "Bilt::local_pole_control"); } // argin[1] = true or false (1 or 0 ) if ( (*argin)[1] != 0 && (*argin)[1] != 1 ) { TangoSys_MemStream tms; tms << "Local control can only be choosen as 0 or 1 (false or true)" << endl; Tango::Except::throw_exception("WriteError", tms.str(), "Bilt::local_pole_control"); } try { int switch_state; if ( (*argin)[1] == true ) switch_state = 0; else switch_state = 1; omni_mutex_lock l(bilt_mutex); BILT->pole((*argin)[0]).set_switch (switch_state); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot write switch state", "Bilt::local_pole_control"); } } //+------------------------------------------------------------------ /** * method: Bilt::set_pole_current * * description: method to execute "SetPoleCurrent" * Set the current for one Pole. * [0] = pole number, [1] = current * * @param argin [0] = pole number, [1] = current * */ //+------------------------------------------------------------------ void Bilt::set_pole_current(const Tango::DevVarDoubleArray *argin) { DEBUG_STREAM << "Bilt::set_pole_current(): entering... !" << endl; // Add your own code to control device here // argin[0] = pole number if ( (*argin)[0] < 0 || (*argin)[0] >= POLES ) { TangoSys_MemStream tms; tms << "The entered Pole number is out of range" << endl; Tango::Except::throw_exception("WriteError", tms.str(), "Bilt::set_pole_current"); } try { omni_mutex_lock l(bilt_mutex); BILT->pole((int)(*argin)[0]).set_current_DC ((*argin)[1]); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot write current value", "Bilt::set_pole_current"); } // make sure that the current set values are correct! try { omni_mutex_lock l(bilt_mutex); for (int i=0; ipole(i).get_current_DC(); } Tango::MultiAttribute *attr_list = get_device_attr(); Tango::WAttribute &attr_curr = attr_list->get_w_attr_by_name ("Currents"); attr_curr.set_write_value(¤ts_dc[0], currents_dc.size()); } catch (itest::ItestException &e) { create_tango_exception (e, "Write failure" , "Cannot read the actual current set point values", "Bilt::set_pole_current"); } // initialise the set time, to be sure that the next // returned read value is newer and contains the changes. struct timeval now; gettimeofday (&now, NULL); data_set_time = now; } //+------------------------------------------------------------------ /** * method: Bilt::create_tango_exception() * * description: convert an itest exception into a tango exception * * * in : - &e : Reference to itest exception * - reason : Reason of the local Tango exception to be added to the stack * - desc : Description for the local Tango exception to be added to the stack * - origin : Origin if the local Tango exception to be added to the stack */ //+------------------------------------------------------------------ void Bilt::create_tango_exception (itest::ItestException &e, string reason, string desc, string origin) { Tango::DevErrorList errors; create_tango_exception (e, errors, reason, desc, origin); } //+------------------------------------------------------------------ /** * method: Bilt::create_tango_exception() * * description: convert an itest exception into a tango exception * * * in : - &e : Reference to itest exception * - errors : Tango error list to use, to store exception info * - reason : Reason of the local Tango exception to be added to the stack * - desc : Description for the local Tango exception to be added to the stack * - origin : Origin if the local Tango exception to be added to the stack */ //+------------------------------------------------------------------ void Bilt::create_tango_exception (itest::ItestException &e, Tango::DevErrorList &errors, string reason, string desc, string origin) { DEBUG_STREAM << "Bilt::create_tango_exception(): entering... !" << endl; errors.length(e.errors.size() + 1); int i; for(i=0; idevice_status data member) and returns it to the caller. * * @return Status description * */ //+------------------------------------------------------------------ Tango::ConstDevString Bilt::dev_status() { //Tango::ConstDevString argout = DeviceImpl::dev_status(); DEBUG_STREAM << "Bilt::dev_status(): entering... !" << endl; // Add your own code to control device here stringstream status; status << "PS Location : " << ps_location << endl; Tango::DevState state = dev_state(); switch (state) { case Tango::ON: status << "State : ON" << endl; break; case Tango::OFF: status << "State : OFF" << endl; break; case Tango::ALARM: { status << "State : Alarm" << endl; omni_mutex_lock l(data_mutex); for (int i=0; i 10W in 10ms!" << endl; else { if ( mdata.idata[i].fail == "TEMP" ) status << "Fault descr. : Max. temp on semiconductor reached!" << endl; else { if ( mdata.idata[i].fail == "PWSO" ) status << "Fault descr. : Delivered power > 40W in 100ms!" << endl; else { status << "Fault descr. : Unkown fault code!" << endl; } } } } } } } break; } default: { { omni_mutex_lock l(data_mutex); status << "State : Unknown" << endl; if ( bilt_connection_lost == true ) { status << "Connection lost to BILT power supply, trying to reconnect!" << endl; status << endl; } if ( mdata.state == (-1) ) { status << "Init failure, the ITEST libray object did not initialize correctly.\nPlease re-initialize the device!" << endl; status << endl; } if ( mdata_errors.length() > 0 ) status << "Error stack : " << endl; for(int i=0; idevice_state data member) and returns it to the caller. * * @return State Code * */ //+------------------------------------------------------------------ Tango::DevState Bilt::dev_state() { Tango::DevState argout; try { argout = DeviceImpl::dev_state(); } catch (Tango::DevFailed &e) { // just ignore reading exceptions! } DEBUG_STREAM << "Bilt::dev_state(): entering... !" << endl; // Add your own code to control device here int state; int errors; try { omni_mutex_lock l(data_mutex); state = mdata.state; INFO_STREAM << "magnet state for " << get_name() << " = " << state << endl; errors = mdata_errors.length(); INFO_STREAM << "mdata errors = " << mdata_errors.length() << endl; } catch (Tango::DevFailed &e) { // do nothing! // Just avoid exceptions when executing state or status! } if ( errors != 0 ) set_state (Tango::UNKNOWN); else { // set the device state switch (state) { case -1: set_state (Tango::UNKNOWN); //bilt_connection_lost = true; break; case 0: set_state (Tango::OFF); break; case 1: set_state (Tango::ON); break; case 2: set_state (Tango::ALARM); break; case 3: set_state (Tango::FAULT); break; default: set_state (Tango::UNKNOWN); break; } } // Check for attribute alarms if ( get_state() == Tango::ON && argout == Tango::ALARM ) set_state (Tango::ALARM); return get_state(); } //+------------------------------------------------------------------ /** * method: Bilt::setpoint_check * * description: method to execute "SetpointCheck" * Check the given current values against the specified limits. * * @param argin Setpoint values for the Poles * @return true when settings are OK * */ //+------------------------------------------------------------------ Tango::DevBoolean Bilt::setpoint_check(const Tango::DevVarDoubleArray *argin) { Tango::DevBoolean argout ; DEBUG_STREAM << "Bilt::setpoint_check(): entering... !" << endl; // Add your own code to control device here // get the min and max values for the current settings Tango::MultiAttribute *attr_list = get_device_attr(); Tango::WAttribute &attr_curr = attr_list->get_w_attr_by_name ("Currents"); double min, max; attr_curr.get_min_value(min); attr_curr.get_max_value(max); INFO_STREAM << "min = " << min << " max = " << max << endl; // check the input values argout = true; for ( int i=0; ilength(); i++ ) { INFO_STREAM << "i = " << i << " curr = " << (*argin)[i] << endl; if ( (*argin)[i] < min || (*argin)[i] > max ) { argout = false; break; } } return argout; } //+------------------------------------------------------------------ /** * method: Bilt::enable_ac_current * * description: method to execute "EnableAcCurrent" * Enables the dynamic 10kHz AC current settings from the Liberas. * * */ //+------------------------------------------------------------------ void Bilt::enable_ac_current() { DEBUG_STREAM << "Bilt::enable_ac_current(): entering... !" << endl; // Add your own code to control device here omni_mutex_lock l(bilt_mutex); int switch_state = 1; for ( unsigned int i=0; ipole(i).set_current_AC (0.0); BILT->pole(i).set_switch (switch_state); } } //+------------------------------------------------------------------ /** * method: Bilt::disable_ac_current * * description: method to execute "DisableAcCurrent" * Disables the dynamic 10kHz AC current settings from the Liberas. * * */ //+------------------------------------------------------------------ void Bilt::disable_ac_current() { DEBUG_STREAM << "Bilt::disable_ac_current(): entering... !" << endl; // Add your own code to control device here omni_mutex_lock l(bilt_mutex); int switch_state = 0; for ( unsigned int i=0; ipole(i).set_switch (switch_state); BILT->pole(i).set_current_AC (0.0); } } } // namespace Revision-number: 94 Prop-content-length: 124 Content-length: 124 K 10 svn:author V 5 meyer K 8 svn:date V 27 2012-08-16T12:02:50.000000Z K 7 svn:log V 24 Changed version to 3.10 PROPS-END Node-path: powersupply/itest/Bilt/trunk/Makefile Node-kind: file Node-action: change Text-content-length: 7060 Text-content-md5: e51fb047d3bc16a93d3a6c76bfe20867 Content-length: 7060 #============================================================================= # # file : Makefile # # description : Include for the Bilt class. # # project : Makefile to generate a Tango server # # $Author: meyer $ # # $Revision: 1.22 $ # # $Log: not supported by cvs2svn $ # Revision 1.21 2012/04/02 15:27:19 meyer # Corrected alarm levels and adapted to Tango8. # # Revision 1.20 2011/08/05 13:41:28 meyer # Set release to 3.9 # # Revision 1.19 2011-03-17 14:50:49 meyer # Changed version to 3.8 # # Revision 1.18 2011-01-12 12:35:00 meyer # Changed version to 3.7 # # Revision 1.17 2010/11/23 07:13:38 meyer # Changed version to 3.6 # # Revision 1.16 2010-11-10 11:59:30 meyer # Changed version to 3.5 # # Revision 1.15 2010-11-08 15:29:42 meyer # Linking now with libtango.a version 7.2! # # Revision 1.14 2010/06/24 11:44:00 meyer # Changed version to 3.4 # # Revision 1.13 2010/06/21 07:16:52 meyer # Changed version to 3.3 # # Revision 1.12 2010/06/21 07:13:05 meyer # Added a spectrum attribute for the temperature measurements and changed to libMagnet version 1.4. # # Revision 1.11 2010/03/19 15:27:01 meyer # Canged to version 3.2 # # Revision 1.10 2010/03/16 15:03:33 meyer # Excluded Steerer class. # # Revision 1.9 2010/03/16 14:57:56 meyer # Rlease_3_1 # # Revision 1.8 2010-02-11 16:35:27 meyer # Currents settings understand NaN values. # Deleted StePoleCurrent command. # # Revision 1.7 2010/02/10 16:22:15 meyer # Release_3_0 # # Revision 1.6 2010/02/10 12:27:31 meyer # Restructured Bilt class. # Acquistion is now done by a thread and only the multi channel data # gets exported. A single channel class (BiltCh) was created. # # Revision 1.5 2009/12/18 12:02:18 meyer # Changed version number to 2.1 # # Revision 1.4 2009/12/18 10:19:23 meyer # Using libMagnet version 130 now. # # Revision 1.3 2009/11/27 13:49:26 meyer # Modified structure! The pole is no longer a device. # The device is now a magnet with three poles. # # Revision 1.2 2009/11/26 10:46:58 meyer # Updated for libMagnet_V120 # # Revision 1.1.1.1 2009/11/04 16:23:02 meyer # Imported using TkCVS # # # copyleft : European Synchrotron Radiation Facility # BP 220, Grenoble 38043 # FRANCE # #============================================================================= # This file is generated by POGO # (Program Obviously used to Generate tango Object) # # (c) - Software Engineering Group - ESRF #============================================================================= # CLASS = Bilt MAJOR_VERS = 3 MINOR_VERS = 10 RELEASE = Release_$(MAJOR_VERS)_$(MINOR_VERS) OS = $(shell /csadmin/common/scripts/get_os) PROCESSOR = $(shell uname -p) #----------------------------------------- # Set default home directories #----------------------------------------- TANGO_HOME = /segfs/tango/release/$(BIN_DIR) CPP_SERVERS = $(TANGO_HOME)/classes ifdef no_debug DEBUG = -O else DEBUG = -g endif ifdef _solaris CC = CC BIN_DIR=$(OS)_CC AR_SL = $(CC) -mt -G VERS_OPT = -h SL_EXT = so endif ifdef linux CC = c++ CC_SHLIB = $(CC) -fPIC $(PROCESSOR)=1 ifdef x86_64 NBITS=_64 endif BIN_DIR=$(OS)$(NBITS) AR_SL = $(CC) -fPIC -shared SL_EXT = so VERS_OPT = -Wl,-soname, endif INCLUDE_DIRS = -I$(TANGO_HOME)/include -I. \ -I$(CPP_SERVERS)/include \ -I libMagnet_V140 OBJS_DIR = obj/$(BIN_DIR) LIB_DIRS = -L $(CPP_SERVERS)/lib \ -L $(TANGO_HOME)/lib \ -L libMagnet_V140 TARGET_LIB = $(CPP_SERVERS)/lib/libtgclasses.a #----------------------------------------- # Set CXXFLAGS and LFLAGS #----------------------------------------- ifdef _solaris CXXFLAGS = $(DEBUG) -mt -D_PTHREADS $(INCLUDE_DIRS) LFLAGS = $(DEBUG) $(LIB_DIRS) \ -ltango \ -llog4tango \ -lomniORB4 \ -lomniDynamic4 \ -lomnithread \ -lCOS4 \ -lpthread \ -lposix4 -lsocket -lnsl \ -ltgclasses endif ifdef linux CXXFLAGS = -g -D_REENTRANT $(INCLUDE_DIRS) LFLAGS = $(DEBUG) $(LIB_DIRS) \ -ltango \ -llog4tango \ -lomniORB4 \ -lomniDynamic4 \ -lomnithread \ -lCOS4 \ -lzmq \ -ldl -lpthread \ -lMagnet \ -ltgclasses endif #----------------------------------------- # Set dependences #----------------------------------------- SVC_OBJS = $(OBJS_DIR)/$(CLASS).o \ $(OBJS_DIR)/$(CLASS)StateMachine.o \ $(OBJS_DIR)/$(CLASS)Class.o \ $(OBJS_DIR)/AcquisitionThread.o \ $(OBJS_DIR)/ClassFactory.o \ $(OBJS_DIR)/main.o SHLIB_OBJS = $(OBJS_DIR)/$(CLASS)Class.so.o \ $(OBJS_DIR)/$(CLASS)StateMachine.so.o \ $(OBJS_DIR)/$(CLASS).so.o \ $(OBJS_DIR)/AcquisitionThread.o SVC_INC = $(CLASS)Class.h \ $(CLASS).h \ AcquisitionThread.h $(OBJS_DIR)/%.o: %.cpp $(SVC_INC) $(CC) $(CXXFLAGS) -c $< -o $(OBJS_DIR)/$*.o $(OBJS_DIR)/%.so.o: %.cpp $(SVC_INC) $(CC_SHLIB) $(CXXFLAGS) -c $< -o $(OBJS_DIR)/$*.so.o #----------------------------------------- # Make Entry #----------------------------------------- all: $(CLASS) $(CLASS): make_obj_dir make_bin_dir $(SVC_OBJS) $(CC) $(SVC_OBJS) -o $(CLASS) $(LFLAGS) @mv $(CLASS) bin/$(BIN_DIR)/$(CLASS) shlib: make_obj_dir make_shlib_dir $(SHLIB_OBJS) $(AR_SL) -o \ shlib/$(BIN_DIR)/$(CLASS).$(SL_EXT).$(MAJOR_VERS).$(MINOR_VERS) \ $(VERS_OPT)$(CLASS).$(SL_EXT).$(MAJOR_VERS) \ $(SHLIB_OBJS) $(LFLAGS) @rm -f shlib/$(BIN_DIR)/$(CLASS).$(SL_EXT) @cd shlib/$(BIN_DIR); \ ln -s $(CLASS).$(SL_EXT).$(MAJOR_VERS).$(MINOR_VERS) $(CLASS).$(SL_EXT) clean: rm -f $(OBJS_DIR)/*.o \ $(OBJS_DIR)/*.so.o \ bin/$(BIN_DIR)/$(CLASS) \ core make_obj_dir: @mkdir -p obj @mkdir -p obj/$(BIN_DIR) make_bin_dir: @mkdir -p bin @mkdir -p bin/$(BIN_DIR) make_shlib_dir: @mkdir -p shlib @mkdir -p shlib/$(BIN_DIR) #----------------------------------------- # Install binary file #----------------------------------------- install: cp bin/$(BIN_DIR)/$(CLASS) $(CPP_SERVERS)/bin #----------------------------------------- # Update class library and header files # recompile without debug mode. #----------------------------------------- lib: clean @make no_debug=1 cp *.h $(CPP_SERVERS)/include ar ruv $(TARGET_LIB) $(OBJS_DIR)/$(CLASS).o ar ruv $(TARGET_LIB) $(OBJS_DIR)/$(CLASS)Class.o ar ruv $(TARGET_LIB) $(OBJS_DIR)/$(CLASS)StateMachine.o ar ruv $(TARGET_LIB) $(OBJS_DIR)/AcquisitionThread.o ident $(TARGET_LIB) | grep $(CLASS) #------------------------------------------------------ # Tag the CVS/SVN module corresponding to this class # copy cvs_tag or svn_tag to tag: entry #------------------------------------------------------ #svn_tag: # svn copy ../trunk ../tags/$(RELEASE) # svn commit ../tags/$(RELEASE) \ # -m "Tagging the $(RELEASE) of the $(CLASS) project." # #cvs_tag: # @cvstag "$(CLASS)-$(RELEASE)" # @make $(CLASS) # @make show_tag #show_cvs_tag: # @cvstag -d # # Only these make options work with the current Pogo version 5.3.x! tag: @cvstag "$(CLASS)-$(RELEASE)" @make $(CLASS) @make show_tag show_tag: @cvstag -d Revision-number: 95 Prop-content-length: 148 Content-length: 148 K 8 svn:date V 27 2012-08-16T12:02:51.000000Z K 7 svn:log V 74 This commit was manufactured by cvs2svn to create tag 'Bilt-Release_3_10'. PROPS-END Node-path: powersupply/itest/Bilt/tags/Bilt-Release_3_10 Node-kind: dir Node-action: add Node-copyfrom-rev: 94 Node-copyfrom-path: powersupply/itest/Bilt/trunk Revision-number: 96 Prop-content-length: 131 Content-length: 131 K 10 svn:author V 5 meyer K 8 svn:date V 27 2013-01-09T14:39:05.000000Z K 7 svn:log V 31 Converted from Pogo6 to Pogo8! PROPS-END Node-path: powersupply/itest/BiltCh/trunk/BiltCh.h Node-kind: file Node-action: change Text-content-length: 9814 Text-content-md5: 303b411732a51e91094b5ef5d79752f9 Content-length: 9814 /*----- PROTECTED REGION ID(BiltCh.h) ENABLED START -----*/ //============================================================================= // // file : BiltCh.h // // description : Include file for the BiltCh class // // project : BILT channel interface // // This file is part of Tango device class. // // Tango 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. // // Tango 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 Tango. If not, see . // // $Author: meyer $ // // $Revision: 1.6 $ // $Date: 2013-01-09 14:39:05 $ // // $HeadURL: $ // //============================================================================= // This file is generated by POGO // (Program Obviously used to Generate tango Object) //============================================================================= #ifndef BiltCh_H #define BiltCh_H #include // Number of poles per magnet #define POLES 3 /*----- PROTECTED REGION END -----*/ // BiltCh.h /** * BiltCh class description: * The Bilt multi channel power supply has three individual channels. * This class offers an interface to an individual channel of the power supply. */ namespace BiltCh_ns { /*----- PROTECTED REGION ID(BiltCh::Additional Class Declarations) ENABLED START -----*/ // Additional Class Declarations /*----- PROTECTED REGION END -----*/ // BiltCh::Additional Class Declarations class BiltCh : public Tango::Device_4Impl { /*----- PROTECTED REGION ID(BiltCh::Data Members) ENABLED START -----*/ // Add your own data members public: /*----- PROTECTED REGION END -----*/ // BiltCh::Data Members // Device property data members public: // BiltName: Name of the Bilt multi channel power supply device string biltName; // PoleNumber: The number of the channel or Pole of the Bilt power supply [0 -2] Tango::DevShort poleNumber; // Attribute data members public: Tango::DevDouble *attr_Current_read; Tango::DevDouble *attr_Voltage_read; Tango::DevDouble *attr_Impedance_read; Tango::DevDouble *attr_SetCurrentRMS_read; Tango::DevDouble *attr_SetCurrentAverage_read; Tango::DevULong *attr_FramesPerSecond_read; Tango::DevULong *attr_ErrorPerSecond_read; Tango::DevULong *attr_ErrorCounter_read; Tango::DevBoolean *attr_LocalControl_read; Tango::DevDouble *attr_SetCurrentAC_read; Tango::DevDouble *attr_Temperature1_read; Tango::DevDouble *attr_Temperature2_read; // Constructors and destructors public: /** * Constructs a newly device object. * * @param cl Class. * @param s Device Name */ BiltCh(Tango::DeviceClass *cl,string &s); /** * Constructs a newly device object. * * @param cl Class. * @param s Device Name */ BiltCh(Tango::DeviceClass *cl,const char *s); /** * Constructs a newly device object. * * @param cl Class. * @param s Device name * @param d Device description. */ BiltCh(Tango::DeviceClass *cl,const char *s,const char *d); /** * The device object destructor. */ ~BiltCh() {delete_device();}; // Miscellaneous methods public: /** * will be called at device destruction or at init command. */ void delete_device(); /** * Initialize the device */ virtual void init_device(); /** * Read the device properties from database */ void get_device_property(); /** * Always executed method before execution command method. */ virtual void always_executed_hook(); // Attribute methods public: //-------------------------------------------------------- /** * Method : BiltCh::read_attr_hardware() * Description : Hardware acquisition for attributes. */ //-------------------------------------------------------- virtual void read_attr_hardware(vector &attr_list); /** * Attribute Current related methods * Description: The DC current of the selected pole. * * Data type: Tango::DevDouble * Attr type: Scalar */ virtual void read_Current(Tango::Attribute &attr); virtual void write_Current(Tango::WAttribute &attr); virtual bool is_Current_allowed(Tango::AttReqType type); /** * Attribute Voltage related methods * Description: The measured voltage of the selected pole. * * Data type: Tango::DevDouble * Attr type: Scalar */ virtual void read_Voltage(Tango::Attribute &attr); virtual bool is_Voltage_allowed(Tango::AttReqType type); /** * Attribute Impedance related methods * Description: Calculated impedance of the selected pole. * * Data type: Tango::DevDouble * Attr type: Scalar */ virtual void read_Impedance(Tango::Attribute &attr); virtual bool is_Impedance_allowed(Tango::AttReqType type); /** * Attribute SetCurrentRMS related methods * Description: Statistic when driven by the Libera.\nRMS value of the AC setpoint applied on the DAC during the last second.\nX=sqr( (sum(setAC)*sum(setAC)) / n - ((sum(setAC)/n) *(sum(setAC)/n)) ) * * Data type: Tango::DevDouble * Attr type: Scalar */ virtual void read_SetCurrentRMS(Tango::Attribute &attr); virtual bool is_SetCurrentRMS_allowed(Tango::AttReqType type); /** * Attribute SetCurrentAverage related methods * Description: Statistic when driven by the Libera.\nThe average AC setpoint applied to the DAC during the last second.\nX=SUM(setAC)/n * * Data type: Tango::DevDouble * Attr type: Scalar */ virtual void read_SetCurrentAverage(Tango::Attribute &attr); virtual bool is_SetCurrentAverage_allowed(Tango::AttReqType type); /** * Attribute FramesPerSecond related methods * Description: Statistic when driven by the Libera.\nThe number of setpoints per second. * * Data type: Tango::DevULong * Attr type: Scalar */ virtual void read_FramesPerSecond(Tango::Attribute &attr); virtual bool is_FramesPerSecond_allowed(Tango::AttReqType type); /** * Attribute ErrorPerSecond related methods * Description: Statistic when driven by the Libera.\nThe number of errors detected per second. * * Data type: Tango::DevULong * Attr type: Scalar */ virtual void read_ErrorPerSecond(Tango::Attribute &attr); virtual bool is_ErrorPerSecond_allowed(Tango::AttReqType type); /** * Attribute ErrorCounter related methods * Description: Statistic when driven by the Libera.\nThe total number of errors since the last reset. * * Data type: Tango::DevULong * Attr type: Scalar */ virtual void read_ErrorCounter(Tango::Attribute &attr); virtual bool is_ErrorCounter_allowed(Tango::AttReqType type); /** * Attribute LocalControl related methods * Description: If true the AC current can be set on the device,\notherwise it is driven by the Libera. * * Data type: Tango::DevBoolean * Attr type: Scalar */ virtual void read_LocalControl(Tango::Attribute &attr); virtual void write_LocalControl(Tango::WAttribute &attr); virtual bool is_LocalControl_allowed(Tango::AttReqType type); /** * Attribute SetCurrentAC related methods * Description: The AC current setpoint in local mode. If driven by the Libera, the attribute \nattribute value in INVALID. * * Data type: Tango::DevDouble * Attr type: Scalar */ virtual void read_SetCurrentAC(Tango::Attribute &attr); virtual void write_SetCurrentAC(Tango::WAttribute &attr); virtual bool is_SetCurrentAC_allowed(Tango::AttReqType type); /** * Attribute Temperature1 related methods * Description: Temperature 1 of the pole. * * Data type: Tango::DevDouble * Attr type: Scalar */ virtual void read_Temperature1(Tango::Attribute &attr); virtual bool is_Temperature1_allowed(Tango::AttReqType type); /** * Attribute Temperature2 related methods * Description: Temperature 2 of the pole. * * Data type: Tango::DevDouble * Attr type: Scalar */ virtual void read_Temperature2(Tango::Attribute &attr); virtual bool is_Temperature2_allowed(Tango::AttReqType type); //-------------------------------------------------------- /** * Method : BiltCh::add_dynamic_attributes() * Description : Add dynamic attributes if any. */ //-------------------------------------------------------- void add_dynamic_attributes(); // Command related methods public: /** * Command State related method * Description: This command gets the device state (stored in its device_state data member) and returns it to the caller. * * @param argin none. * @returns State Code */ virtual Tango::DevState dev_state(); /** * Command Status related method * Description: This command gets the device status (stored in its device_status data member) and returns it to the caller. * * @param argin none. * @returns Status description */ virtual Tango::ConstDevString dev_status(); /*----- PROTECTED REGION ID(BiltCh::Additional Method prototypes) ENABLED START -----*/ // Additional Method prototypes protected : Tango::DeviceProxy *bilt_obj; Tango::DevErrorList bilt_error; bool bilt_init; double current; double voltage; double impedance; double current_rms; double current_average; Tango::DevULong error_counter; Tango::DevULong errors_per_sec; Tango::DevULong frames_per_sec; bool local_control; double current_ac; double temp1; double temp2; /*----- PROTECTED REGION END -----*/ // BiltCh::Additional Method prototypes }; /*----- PROTECTED REGION ID(BiltCh::Additional Classes Definitions) ENABLED START -----*/ // Additional Classes Definitions /*----- PROTECTED REGION END -----*/ // BiltCh::Additional Classes Definitions } // End of namespace #endif // BiltCh_H Node-path: powersupply/itest/BiltCh/trunk/BiltChClass.cpp Node-kind: file Node-action: change Text-content-length: 29718 Text-content-md5: 385987b9458596716b791d0ef154bbd7 Content-length: 29718 /*----- PROTECTED REGION ID(BiltChClass.cpp) ENABLED START -----*/ static const char *RcsId = "$Id: BiltChClass.cpp,v 1.7 2013-01-09 14:39:05 meyer Exp $"; static const char *TagName = "$Name: not supported by cvs2svn $"; static const char *CvsPath = "$Source: /segfs/tango/cvsroot/cppserver/machine/powersupply/SrSteerers/tango/BiltCh/BiltChClass.cpp,v $"; static const char *SvnPath = "$HeadURL: $"; static const char *HttpServer = "http://www.esrf.eu/computing/cs/tango/tango_doc/ds_doc/"; //============================================================================= // // file : BiltChClass.cpp // // description : C++ source for the BiltChClass. // A singleton class derived from DeviceClass. // It implements the command and attribute list // and all properties and methods required // by the BiltCh once per process. // // project : BILT channel interface // // This file is part of Tango device class. // // Tango 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. // // Tango 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 Tango. If not, see . // // $Author: meyer $ // // $Revision: 1.7 $ // $Date: 2013-01-09 14:39:05 $ // // $HeadURL: $ // //============================================================================= // This file is generated by POGO // (Program Obviously used to Generate tango Object) //============================================================================= #include #include #include /*----- PROTECTED REGION END -----*/ // BiltChClass.cpp //------------------------------------------------------------------- /** * Create BiltChClass singleton and * return it in a C function for Python usage */ //------------------------------------------------------------------- extern "C" { #ifdef _TG_WINDOWS_ __declspec(dllexport) #endif Tango::DeviceClass *_create_BiltCh_class(const char *name) { return BiltCh_ns::BiltChClass::init(name); } } namespace BiltCh_ns { //=================================================================== // Initialize pointer for singleton pattern //=================================================================== BiltChClass *BiltChClass::_instance = NULL; //-------------------------------------------------------- /** * method : BiltChClass::BiltChClass(string &s) * description : constructor for the BiltChClass * * @param s The class name */ //-------------------------------------------------------- BiltChClass::BiltChClass(string &s):Tango::DeviceClass(s) { cout2 << "Entering BiltChClass constructor" << endl; set_default_property(); write_class_property(); /*----- PROTECTED REGION ID(BiltChClass::constructor) ENABLED START -----*/ /*----- PROTECTED REGION END -----*/ // BiltChClass::constructor cout2 << "Leaving BiltChClass constructor" << endl; } //-------------------------------------------------------- /** * method : BiltChClass::~BiltChClass() * description : destructor for the BiltChClass */ //-------------------------------------------------------- BiltChClass::~BiltChClass() { /*----- PROTECTED REGION ID(BiltChClass::destructor) ENABLED START -----*/ /*----- PROTECTED REGION END -----*/ // BiltChClass::destructor _instance = NULL; } //-------------------------------------------------------- /** * method : BiltChClass::init * description : Create the object if not already done. * Otherwise, just return a pointer to the object * * @param name The class name */ //-------------------------------------------------------- BiltChClass *BiltChClass::init(const char *name) { if (_instance == NULL) { try { string s(name); _instance = new BiltChClass(s); } catch (bad_alloc) { throw; } } return _instance; } //-------------------------------------------------------- /** * method : BiltChClass::instance * description : Check if object already created, * and return a pointer to the object */ //-------------------------------------------------------- BiltChClass *BiltChClass::instance() { if (_instance == NULL) { cerr << "Class is not initialised !!" << endl; exit(-1); } return _instance; } //=================================================================== // Command execution method calls //=================================================================== //=================================================================== // Properties management //=================================================================== //-------------------------------------------------------- /** * Method : BiltChClass::get_class_property() * Description : Get the class property for specified name. */ //-------------------------------------------------------- Tango::DbDatum BiltChClass::get_class_property(string &prop_name) { for (unsigned int i=0 ; i vect_data; // Set Default Class Properties // Set Default device Properties prop_name = "BiltName"; prop_desc = "Name of the Bilt multi channel power supply device"; prop_def = "none"; vect_data.clear(); vect_data.push_back("none"); if (prop_def.length()>0) { Tango::DbDatum data(prop_name); data << vect_data ; dev_def_prop.push_back(data); add_wiz_dev_prop(prop_name, prop_desc, prop_def); } else add_wiz_dev_prop(prop_name, prop_desc); prop_name = "PoleNumber"; prop_desc = "The number of the channel or Pole of the Bilt power supply [0 -2]"; prop_def = "-1"; vect_data.clear(); vect_data.push_back("-1"); if (prop_def.length()>0) { Tango::DbDatum data(prop_name); data << vect_data ; dev_def_prop.push_back(data); add_wiz_dev_prop(prop_name, prop_desc, prop_def); } else add_wiz_dev_prop(prop_name, prop_desc); } //-------------------------------------------------------- /** * Method : BiltChClass::write_class_property() * Description : Set class description fields as property in database */ //-------------------------------------------------------- void BiltChClass::write_class_property() { // First time, check if database used if (Tango::Util::_UseDb == false) return; Tango::DbData data; string classname = get_name(); string header; string::size_type start, end; // Put title Tango::DbDatum title("ProjectTitle"); string str_title("BILT channel interface"); title << str_title; data.push_back(title); // Put Description Tango::DbDatum description("Description"); vector str_desc; str_desc.push_back("The Bilt multi channel power supply has three individual channels."); str_desc.push_back("This class offers an interface to an individual channel of the power supply."); description << str_desc; data.push_back(description); // put cvs or svn location string filename("BiltCh"); filename += "Class.cpp"; // check for cvs information string src_path(CvsPath); start = src_path.find("/"); if (start!=string::npos) { end = src_path.find(filename); if (end>start) { string strloc = src_path.substr(start, end-start); // Check if specific repository start = strloc.find("/cvsroot/"); if (start!=string::npos && start>0) { string repository = strloc.substr(0, start); if (repository.find("/segfs/")!=string::npos) strloc = "ESRF:" + strloc.substr(start, strloc.length()-start); } Tango::DbDatum cvs_loc("cvs_location"); cvs_loc << strloc; data.push_back(cvs_loc); } } // check for svn information else { string src_path(SvnPath); start = src_path.find("://"); if (start!=string::npos) { end = src_path.find(filename); if (end>start) { header = "$HeadURL: "; start = header.length(); string strloc = src_path.substr(start, (end-start)); Tango::DbDatum svn_loc("svn_location"); svn_loc << strloc; data.push_back(svn_loc); } } } // Get CVS or SVN revision tag // CVS tag string tagname(TagName); header = "$Name: "; start = header.length(); string endstr(" $"); end = tagname.find(endstr); if (end!=string::npos && end>start) { string strtag = tagname.substr(start, end-start); Tango::DbDatum cvs_tag("cvs_tag"); cvs_tag << strtag; data.push_back(cvs_tag); } // SVN tag string svnpath(SvnPath); header = "$HeadURL: "; start = header.length(); end = svnpath.find(endstr); if (end!=string::npos && end>start) { string strloc = svnpath.substr(start, end-start); string tagstr ("/tags/"); start = strloc.find(tagstr); if ( start!=string::npos ) { start = start + tagstr.length(); end = strloc.find(filename); string strtag = strloc.substr(start, end-start-1); Tango::DbDatum svn_tag("svn_tag"); svn_tag << strtag; data.push_back(svn_tag); } } // Get URL location string httpServ(HttpServer); if (httpServ.length()>0) { Tango::DbDatum db_doc_url("doc_url"); db_doc_url << httpServ; data.push_back(db_doc_url); } // Put inheritance Tango::DbDatum inher_datum("InheritedFrom"); vector inheritance; inheritance.push_back("Tango::Device_4Impl"); inher_datum << inheritance; data.push_back(inher_datum); // Call database and and values get_db_class()->put_property(data); } //=================================================================== // Factory methods //=================================================================== //-------------------------------------------------------- /** * Method : BiltChClass::device_factory() * Description : Create the device object(s) * and store them in the device list */ //-------------------------------------------------------- void BiltChClass::device_factory(const Tango::DevVarStringArray *devlist_ptr) { /*----- PROTECTED REGION ID(BiltChClass::device_factory_before) ENABLED START -----*/ // Add your own code /*----- PROTECTED REGION END -----*/ // BiltChClass::device_factory_before // Create devices and add it into the device list for (unsigned long i=0 ; ilength() ; i++) { cout4 << "Device name : " << (*devlist_ptr)[i].in() << endl; device_list.push_back(new BiltCh(this, (*devlist_ptr)[i])); } // Manage dynamic attributes if any erase_dynamic_attributes(devlist_ptr, get_class_attr()->get_attr_list()); // Export devices to the outside world for (unsigned long i=1 ; i<=devlist_ptr->length() ; i++) { // Add dynamic attributes if any BiltCh *dev = static_cast(device_list[device_list.size()-i]); dev->add_dynamic_attributes(); // Check before if database used. if ((Tango::Util::_UseDb == true) && (Tango::Util::_FileDb == false)) export_device(dev); else export_device(dev, dev->get_name().c_str()); } /*----- PROTECTED REGION ID(BiltChClass::device_factory_after) ENABLED START -----*/ // Add your own code /*----- PROTECTED REGION END -----*/ // BiltChClass::device_factory_after } //-------------------------------------------------------- /** * Method : BiltChClass::attribute_factory() * Description : Create the attribute object(s) * and store them in the attribute list */ //-------------------------------------------------------- void BiltChClass::attribute_factory(vector &att_list) { /*----- PROTECTED REGION ID(BiltChClass::attribute_factory_before) ENABLED START -----*/ // Add your own code /*----- PROTECTED REGION END -----*/ // BiltChClass::attribute_factory_before // Attribute : Current CurrentAttrib *current = new CurrentAttrib(); Tango::UserDefaultAttrProp current_prop; current_prop.set_description("The DC current of the selected pole."); current_prop.set_label("DC Current"); current_prop.set_unit("A"); // standard_unit not set for Current // display_unit not set for Current current_prop.set_format("%6.4f"); current_prop.set_max_value("1.8"); current_prop.set_min_value("-1.8"); // max_alarm not set for Current // min_alarm not set for Current // max_warning not set for Current // min_warning not set for Current // delta_t not set for Current // delta_val not set for Current current->set_default_properties(current_prop); current->set_polling_period(0); current->set_disp_level(Tango::OPERATOR); // Not Memorized att_list.push_back(current); // Attribute : Voltage VoltageAttrib *voltage = new VoltageAttrib(); Tango::UserDefaultAttrProp voltage_prop; voltage_prop.set_description("The measured voltage of the selected pole."); voltage_prop.set_label("Voltage"); voltage_prop.set_unit("V"); // standard_unit not set for Voltage // display_unit not set for Voltage voltage_prop.set_format("%6.4f"); // max_value not set for Voltage // min_value not set for Voltage // max_alarm not set for Voltage // min_alarm not set for Voltage // max_warning not set for Voltage // min_warning not set for Voltage // delta_t not set for Voltage // delta_val not set for Voltage voltage->set_default_properties(voltage_prop); voltage->set_polling_period(0); voltage->set_disp_level(Tango::OPERATOR); // Not Memorized att_list.push_back(voltage); // Attribute : Impedance ImpedanceAttrib *impedance = new ImpedanceAttrib(); Tango::UserDefaultAttrProp impedance_prop; impedance_prop.set_description("Calculated impedance of the selected pole."); impedance_prop.set_label("Impedance"); impedance_prop.set_unit("Ohm"); // standard_unit not set for Impedance // display_unit not set for Impedance impedance_prop.set_format("%4.2f"); // max_value not set for Impedance // min_value not set for Impedance impedance_prop.set_max_alarm("5.0"); impedance_prop.set_min_alarm("2.8"); // max_warning not set for Impedance // min_warning not set for Impedance // delta_t not set for Impedance // delta_val not set for Impedance impedance->set_default_properties(impedance_prop); impedance->set_polling_period(0); impedance->set_disp_level(Tango::OPERATOR); // Not Memorized att_list.push_back(impedance); // Attribute : SetCurrentRMS SetCurrentRMSAttrib *setcurrentrms = new SetCurrentRMSAttrib(); Tango::UserDefaultAttrProp setcurrentrms_prop; setcurrentrms_prop.set_description("Statistic when driven by the Libera.\nRMS value of the AC setpoint applied on the DAC during the last second.\nX=sqr( (sum(setAC)*sum(setAC)) / n - ((sum(setAC)/n) *(sum(setAC)/n)) )"); setcurrentrms_prop.set_label("RMS AC current setpoint/s"); setcurrentrms_prop.set_unit("mA"); // standard_unit not set for SetCurrentRMS // display_unit not set for SetCurrentRMS setcurrentrms_prop.set_format("%6.3f"); // max_value not set for SetCurrentRMS // min_value not set for SetCurrentRMS // max_alarm not set for SetCurrentRMS // min_alarm not set for SetCurrentRMS // max_warning not set for SetCurrentRMS // min_warning not set for SetCurrentRMS // delta_t not set for SetCurrentRMS // delta_val not set for SetCurrentRMS setcurrentrms->set_default_properties(setcurrentrms_prop); setcurrentrms->set_polling_period(0); setcurrentrms->set_disp_level(Tango::OPERATOR); // Not Memorized att_list.push_back(setcurrentrms); // Attribute : SetCurrentAverage SetCurrentAverageAttrib *setcurrentaverage = new SetCurrentAverageAttrib(); Tango::UserDefaultAttrProp setcurrentaverage_prop; setcurrentaverage_prop.set_description("Statistic when driven by the Libera.\nThe average AC setpoint applied to the DAC during the last second.\nX=SUM(setAC)/n"); setcurrentaverage_prop.set_label("Average AC current setpoint/s"); setcurrentaverage_prop.set_unit("mA"); // standard_unit not set for SetCurrentAverage // display_unit not set for SetCurrentAverage setcurrentaverage_prop.set_format("%6.3f"); // max_value not set for SetCurrentAverage // min_value not set for SetCurrentAverage // max_alarm not set for SetCurrentAverage // min_alarm not set for SetCurrentAverage // max_warning not set for SetCurrentAverage // min_warning not set for SetCurrentAverage // delta_t not set for SetCurrentAverage // delta_val not set for SetCurrentAverage setcurrentaverage->set_default_properties(setcurrentaverage_prop); setcurrentaverage->set_polling_period(0); setcurrentaverage->set_disp_level(Tango::OPERATOR); // Not Memorized att_list.push_back(setcurrentaverage); // Attribute : FramesPerSecond FramesPerSecondAttrib *framespersecond = new FramesPerSecondAttrib(); Tango::UserDefaultAttrProp framespersecond_prop; framespersecond_prop.set_description("Statistic when driven by the Libera.\nThe number of setpoints per second."); framespersecond_prop.set_label("Frames/s"); framespersecond_prop.set_unit(" "); // standard_unit not set for FramesPerSecond // display_unit not set for FramesPerSecond framespersecond_prop.set_format("%3d"); // max_value not set for FramesPerSecond // min_value not set for FramesPerSecond // max_alarm not set for FramesPerSecond // min_alarm not set for FramesPerSecond // max_warning not set for FramesPerSecond // min_warning not set for FramesPerSecond // delta_t not set for FramesPerSecond // delta_val not set for FramesPerSecond framespersecond->set_default_properties(framespersecond_prop); framespersecond->set_polling_period(0); framespersecond->set_disp_level(Tango::OPERATOR); // Not Memorized att_list.push_back(framespersecond); // Attribute : ErrorPerSecond ErrorPerSecondAttrib *errorpersecond = new ErrorPerSecondAttrib(); Tango::UserDefaultAttrProp errorpersecond_prop; errorpersecond_prop.set_description("Statistic when driven by the Libera.\nThe number of errors detected per second."); errorpersecond_prop.set_label("Errors/s"); errorpersecond_prop.set_unit(" "); // standard_unit not set for ErrorPerSecond // display_unit not set for ErrorPerSecond errorpersecond_prop.set_format("%3d"); // max_value not set for ErrorPerSecond // min_value not set for ErrorPerSecond // max_alarm not set for ErrorPerSecond // min_alarm not set for ErrorPerSecond // max_warning not set for ErrorPerSecond // min_warning not set for ErrorPerSecond // delta_t not set for ErrorPerSecond // delta_val not set for ErrorPerSecond errorpersecond->set_default_properties(errorpersecond_prop); errorpersecond->set_polling_period(0); errorpersecond->set_disp_level(Tango::OPERATOR); // Not Memorized att_list.push_back(errorpersecond); // Attribute : ErrorCounter ErrorCounterAttrib *errorcounter = new ErrorCounterAttrib(); Tango::UserDefaultAttrProp errorcounter_prop; errorcounter_prop.set_description("Statistic when driven by the Libera.\nThe total number of errors since the last reset."); errorcounter_prop.set_label("Error Counter"); errorcounter_prop.set_unit(" "); // standard_unit not set for ErrorCounter // display_unit not set for ErrorCounter errorcounter_prop.set_format("%6d"); // max_value not set for ErrorCounter // min_value not set for ErrorCounter // max_alarm not set for ErrorCounter // min_alarm not set for ErrorCounter // max_warning not set for ErrorCounter // min_warning not set for ErrorCounter // delta_t not set for ErrorCounter // delta_val not set for ErrorCounter errorcounter->set_default_properties(errorcounter_prop); errorcounter->set_polling_period(0); errorcounter->set_disp_level(Tango::OPERATOR); // Not Memorized att_list.push_back(errorcounter); // Attribute : LocalControl LocalControlAttrib *localcontrol = new LocalControlAttrib(); Tango::UserDefaultAttrProp localcontrol_prop; localcontrol_prop.set_description("If true the AC current can be set on the device,\notherwise it is driven by the Libera."); localcontrol_prop.set_label("Local Control"); localcontrol_prop.set_unit(" "); // standard_unit not set for LocalControl // display_unit not set for LocalControl // format not set for LocalControl // max_value not set for LocalControl // min_value not set for LocalControl // max_alarm not set for LocalControl // min_alarm not set for LocalControl // max_warning not set for LocalControl // min_warning not set for LocalControl // delta_t not set for LocalControl // delta_val not set for LocalControl localcontrol->set_default_properties(localcontrol_prop); localcontrol->set_polling_period(0); localcontrol->set_disp_level(Tango::OPERATOR); // Not Memorized att_list.push_back(localcontrol); // Attribute : SetCurrentAC SetCurrentACAttrib *setcurrentac = new SetCurrentACAttrib(); Tango::UserDefaultAttrProp setcurrentac_prop; setcurrentac_prop.set_description("The AC current setpoint in local mode. If driven by the Libera, the attribute \nattribute value in INVALID."); setcurrentac_prop.set_label("AC Current Setpoint"); setcurrentac_prop.set_unit("A"); // standard_unit not set for SetCurrentAC // display_unit not set for SetCurrentAC setcurrentac_prop.set_format("%5.4f"); setcurrentac_prop.set_max_value("0.2"); setcurrentac_prop.set_min_value("-0.2"); // max_alarm not set for SetCurrentAC // min_alarm not set for SetCurrentAC // max_warning not set for SetCurrentAC // min_warning not set for SetCurrentAC // delta_t not set for SetCurrentAC // delta_val not set for SetCurrentAC setcurrentac->set_default_properties(setcurrentac_prop); setcurrentac->set_polling_period(0); setcurrentac->set_disp_level(Tango::OPERATOR); // Not Memorized att_list.push_back(setcurrentac); // Attribute : Temperature1 Temperature1Attrib *temperature1 = new Temperature1Attrib(); Tango::UserDefaultAttrProp temperature1_prop; temperature1_prop.set_description("Temperature 1 of the pole."); temperature1_prop.set_label("Temperature 1"); temperature1_prop.set_unit("C"); // standard_unit not set for Temperature1 // display_unit not set for Temperature1 temperature1_prop.set_format("%6.0f"); // max_value not set for Temperature1 // min_value not set for Temperature1 // max_alarm not set for Temperature1 // min_alarm not set for Temperature1 // max_warning not set for Temperature1 // min_warning not set for Temperature1 // delta_t not set for Temperature1 // delta_val not set for Temperature1 temperature1->set_default_properties(temperature1_prop); temperature1->set_polling_period(0); temperature1->set_disp_level(Tango::OPERATOR); // Not Memorized att_list.push_back(temperature1); // Attribute : Temperature2 Temperature2Attrib *temperature2 = new Temperature2Attrib(); Tango::UserDefaultAttrProp temperature2_prop; temperature2_prop.set_description("Temperature 2 of the pole."); temperature2_prop.set_label("Temperature 2"); temperature2_prop.set_unit("C"); // standard_unit not set for Temperature2 // display_unit not set for Temperature2 temperature2_prop.set_format("%6.0f"); // max_value not set for Temperature2 // min_value not set for Temperature2 // max_alarm not set for Temperature2 // min_alarm not set for Temperature2 // max_warning not set for Temperature2 // min_warning not set for Temperature2 // delta_t not set for Temperature2 // delta_val not set for Temperature2 temperature2->set_default_properties(temperature2_prop); temperature2->set_polling_period(0); temperature2->set_disp_level(Tango::OPERATOR); // Not Memorized att_list.push_back(temperature2); // Create a list of static attributes create_static_attribute_list(get_class_attr()->get_attr_list()); /*----- PROTECTED REGION ID(BiltChClass::attribute_factory_after) ENABLED START -----*/ // Add your own code /*----- PROTECTED REGION END -----*/ // BiltChClass::attribute_factory_after } //-------------------------------------------------------- /** * Method : BiltChClass::command_factory() * Description : Create the command object(s) * and store them in the command list */ //-------------------------------------------------------- void BiltChClass::command_factory() { /*----- PROTECTED REGION ID(BiltChClass::command_factory_before) ENABLED START -----*/ // Add your own code /*----- PROTECTED REGION END -----*/ // BiltChClass::command_factory_before /*----- PROTECTED REGION ID(BiltChClass::command_factory_after) ENABLED START -----*/ // Add your own code /*----- PROTECTED REGION END -----*/ // BiltChClass::command_factory_after } //=================================================================== // Dynamic attributes related methods //=================================================================== //-------------------------------------------------------- /** * method : BiltChClass::create_static_attribute_list * description : Create the a list of static attributes * * @param att_list the ceated attribute list */ //-------------------------------------------------------- void BiltChClass::create_static_attribute_list(vector &att_list) { for (unsigned long i=0 ; iget_name()); transform(att_name.begin(), att_name.end(), att_name.begin(), ::tolower); defaultAttList.push_back(att_name); } cout2 << defaultAttList.size() << " attributes in default list" << endl; /*----- PROTECTED REGION ID(BiltChClass::create_static_att_list) ENABLED START -----*/ /*----- PROTECTED REGION END -----*/ // BiltChClass::create_static_att_list } //-------------------------------------------------------- /** * method : BiltChClass::erase_dynamic_attributes * description : delete the dynamic attributes if any. * * @param devlist_ptr the device list pointer * @param list of all attributes */ //-------------------------------------------------------- void BiltChClass::erase_dynamic_attributes(const Tango::DevVarStringArray *devlist_ptr, vector &att_list) { Tango::Util *tg = Tango::Util::instance(); for (unsigned long i=0 ; ilength() ; i++) { Tango::DeviceImpl *dev_impl = tg->get_device_by_name(((string)(*devlist_ptr)[i]).c_str()); BiltCh *dev = static_cast (dev_impl); vector &dev_att_list = dev->get_device_attr()->get_attribute_list(); vector::iterator ite_att; for (ite_att=dev_att_list.begin() ; ite_att != dev_att_list.end() ; ++ite_att) { string att_name((*ite_att)->get_name_lower()); if ((att_name == "state") || (att_name == "status")) continue; vector::iterator ite_str = find(defaultAttList.begin(), defaultAttList.end(), att_name); if (ite_str == defaultAttList.end()) { cout2 << att_name << " is a UNWANTED dynamic attribute for device " << (*devlist_ptr)[i] << endl; Tango::Attribute &att = dev->get_device_attr()->get_attr_by_name(att_name.c_str()); dev->remove_attribute(att_list[att.get_attr_idx()], true, false); --ite_att; } } } /*----- PROTECTED REGION ID(BiltChClass::erase_dynamic_attributes) ENABLED START -----*/ /*----- PROTECTED REGION END -----*/ // BiltChClass::erase_dynamic_attributes } //-------------------------------------------------------- /** * Method : BiltChClass::get_attr_by_name() * Description : returns Tango::Attr * object found by name */ //-------------------------------------------------------- Tango::Attr *BiltChClass::get_attr_object_by_name(vector &att_list, string attname) { vector::iterator it; for (it=att_list.begin() ; itget_name()==attname) return (*it); // Attr does not exist return NULL; } /*----- PROTECTED REGION ID(BiltChClass::Additional Methods) ENABLED START -----*/ /*----- PROTECTED REGION END -----*/ // BiltChClass::Additional Methods } // namespace Node-path: powersupply/itest/BiltCh/trunk/BiltChClass.h Node-kind: file Node-action: change Text-content-length: 9559 Text-content-md5: 1fffa87ca54be17188dd239f786f6aac Content-length: 9559 /*----- PROTECTED REGION ID(BiltChClass.h) ENABLED START -----*/ //============================================================================= // // file : BiltChClass.h // // description : Include for the BiltCh root class. // This class is the singleton class for // the BiltCh device class. // It contains all properties and methods which the // BiltCh requires only once e.g. the commands. // // project : BILT channel interface // // This file is part of Tango device class. // // Tango 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. // // Tango 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 Tango. If not, see . // // $Author: meyer $ // // $Revision: 1.6 $ // $Date: 2013-01-09 14:39:05 $ // // $HeadURL: $ // //============================================================================= // This file is generated by POGO // (Program Obviously used to Generate tango Object) //============================================================================= #ifndef BiltChClass_H #define BiltChClass_H #include #include /*----- PROTECTED REGION END -----*/ // BiltChClass.h namespace BiltCh_ns { /*----- PROTECTED REGION ID(BiltChClass::classes for dynamic creation) ENABLED START -----*/ /*----- PROTECTED REGION END -----*/ // BiltChClass::classes for dynamic creation //========================================= // Define classes for attributes //========================================= // Attribute Current class definition class CurrentAttrib: public Tango::Attr { public: CurrentAttrib():Attr("Current", Tango::DEV_DOUBLE, Tango::READ_WRITE) {}; ~CurrentAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_Current(att);} virtual void write(Tango::DeviceImpl *dev,Tango::WAttribute &att) {(static_cast(dev))->write_Current(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_Current_allowed(ty);} }; // Attribute Voltage class definition class VoltageAttrib: public Tango::Attr { public: VoltageAttrib():Attr("Voltage", Tango::DEV_DOUBLE, Tango::READ) {}; ~VoltageAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_Voltage(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_Voltage_allowed(ty);} }; // Attribute Impedance class definition class ImpedanceAttrib: public Tango::Attr { public: ImpedanceAttrib():Attr("Impedance", Tango::DEV_DOUBLE, Tango::READ) {}; ~ImpedanceAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_Impedance(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_Impedance_allowed(ty);} }; // Attribute SetCurrentRMS class definition class SetCurrentRMSAttrib: public Tango::Attr { public: SetCurrentRMSAttrib():Attr("SetCurrentRMS", Tango::DEV_DOUBLE, Tango::READ) {}; ~SetCurrentRMSAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_SetCurrentRMS(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_SetCurrentRMS_allowed(ty);} }; // Attribute SetCurrentAverage class definition class SetCurrentAverageAttrib: public Tango::Attr { public: SetCurrentAverageAttrib():Attr("SetCurrentAverage", Tango::DEV_DOUBLE, Tango::READ) {}; ~SetCurrentAverageAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_SetCurrentAverage(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_SetCurrentAverage_allowed(ty);} }; // Attribute FramesPerSecond class definition class FramesPerSecondAttrib: public Tango::Attr { public: FramesPerSecondAttrib():Attr("FramesPerSecond", Tango::DEV_ULONG, Tango::READ) {}; ~FramesPerSecondAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_FramesPerSecond(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_FramesPerSecond_allowed(ty);} }; // Attribute ErrorPerSecond class definition class ErrorPerSecondAttrib: public Tango::Attr { public: ErrorPerSecondAttrib():Attr("ErrorPerSecond", Tango::DEV_ULONG, Tango::READ) {}; ~ErrorPerSecondAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_ErrorPerSecond(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_ErrorPerSecond_allowed(ty);} }; // Attribute ErrorCounter class definition class ErrorCounterAttrib: public Tango::Attr { public: ErrorCounterAttrib():Attr("ErrorCounter", Tango::DEV_ULONG, Tango::READ) {}; ~ErrorCounterAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_ErrorCounter(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_ErrorCounter_allowed(ty);} }; // Attribute LocalControl class definition class LocalControlAttrib: public Tango::Attr { public: LocalControlAttrib():Attr("LocalControl", Tango::DEV_BOOLEAN, Tango::READ_WRITE) {}; ~LocalControlAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_LocalControl(att);} virtual void write(Tango::DeviceImpl *dev,Tango::WAttribute &att) {(static_cast(dev))->write_LocalControl(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_LocalControl_allowed(ty);} }; // Attribute SetCurrentAC class definition class SetCurrentACAttrib: public Tango::Attr { public: SetCurrentACAttrib():Attr("SetCurrentAC", Tango::DEV_DOUBLE, Tango::READ_WRITE) {}; ~SetCurrentACAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_SetCurrentAC(att);} virtual void write(Tango::DeviceImpl *dev,Tango::WAttribute &att) {(static_cast(dev))->write_SetCurrentAC(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_SetCurrentAC_allowed(ty);} }; // Attribute Temperature1 class definition class Temperature1Attrib: public Tango::Attr { public: Temperature1Attrib():Attr("Temperature1", Tango::DEV_DOUBLE, Tango::READ) {}; ~Temperature1Attrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_Temperature1(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_Temperature1_allowed(ty);} }; // Attribute Temperature2 class definition class Temperature2Attrib: public Tango::Attr { public: Temperature2Attrib():Attr("Temperature2", Tango::DEV_DOUBLE, Tango::READ) {}; ~Temperature2Attrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_Temperature2(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_Temperature2_allowed(ty);} }; /** * The BiltChClass singleton definition */ #ifdef _TG_WINDOWS_ class __declspec(dllexport) BiltChClass : public Tango::DeviceClass #else class BiltChClass : public Tango::DeviceClass #endif { /*----- PROTECTED REGION ID(BiltChClass::Additionnal DServer data members) ENABLED START -----*/ /*----- PROTECTED REGION END -----*/ // BiltChClass::Additionnal DServer data members public: // write class properties data members Tango::DbData cl_prop; Tango::DbData cl_def_prop; Tango::DbData dev_def_prop; // Method prototypes static BiltChClass *init(const char *); static BiltChClass *instance(); ~BiltChClass(); Tango::DbDatum get_class_property(string &); Tango::DbDatum get_default_device_property(string &); Tango::DbDatum get_default_class_property(string &); protected: BiltChClass(string &); static BiltChClass *_instance; void command_factory(); void attribute_factory(vector &); void write_class_property(); void set_default_property(); void get_class_property(); string get_cvstag(); string get_cvsroot(); private: void device_factory(const Tango::DevVarStringArray *); void create_static_attribute_list(vector &); void erase_dynamic_attributes(const Tango::DevVarStringArray *,vector &); vector defaultAttList; Tango::Attr *get_attr_object_by_name(vector &att_list, string attname); }; } // End of namespace #endif // BiltCh_H Node-path: powersupply/itest/BiltCh/trunk/BiltChStateMachine.cpp Node-kind: file Node-action: change Text-content-length: 9895 Text-content-md5: 2fec56c6f61e95c3d4edc2fdbda0765d Content-length: 9895 /*----- PROTECTED REGION ID(BiltChStateMachine.cpp) ENABLED START -----*/ static const char *RcsId = "$Id: BiltChStateMachine.cpp,v 1.6 2013-01-09 14:39:05 meyer Exp $"; //============================================================================= // // file : BiltChStateMachine.cpp // // description : State machine file for the BiltCh class // // project : BILT channel interface // // This file is part of Tango device class. // // Tango 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. // // Tango 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 Tango. If not, see . // // $Author: meyer $ // // $Revision: 1.6 $ // $Date: 2013-01-09 14:39:05 $ // // $HeadURL: $ // //============================================================================= // This file is generated by POGO // (Program Obviously used to Generate tango Object) //============================================================================= #include /*----- PROTECTED REGION END -----*/ // BiltCh::BiltChStateMachine.cpp //================================================================ // States | Description //================================================================ // ON | Magnet is ON, all three channels are ON. // OFF | Magnet is OFF, all three channels are OFF. // FAULT | Error detected by the BILT magnet. // ALARM | Alarm detected on one or more channels. // UNKNOWN | Communication fault namespace BiltCh_ns { //================================================= // Attributes Allowed Methods //================================================= //-------------------------------------------------------- /** * Method : BiltCh::is_Current_allowed() * Description : Execution allowed for Current attribute */ //-------------------------------------------------------- bool BiltCh::is_Current_allowed(TANGO_UNUSED(Tango::AttReqType type)) { // Not any excluded states for Current attribute in Write access. /*----- PROTECTED REGION ID(BiltCh::CurrentStateAllowed_WRITE) ENABLED START -----*/ /*----- PROTECTED REGION END -----*/ // BiltCh::CurrentStateAllowed_WRITE // Not any excluded states for Current attribute in read access. /*----- PROTECTED REGION ID(BiltCh::CurrentStateAllowed_READ) ENABLED START -----*/ /*----- PROTECTED REGION END -----*/ // BiltCh::CurrentStateAllowed_READ return true; } //-------------------------------------------------------- /** * Method : BiltCh::is_Voltage_allowed() * Description : Execution allowed for Voltage attribute */ //-------------------------------------------------------- bool BiltCh::is_Voltage_allowed(TANGO_UNUSED(Tango::AttReqType type)) { // Not any excluded states for Voltage attribute in read access. /*----- PROTECTED REGION ID(BiltCh::VoltageStateAllowed_READ) ENABLED START -----*/ /*----- PROTECTED REGION END -----*/ // BiltCh::VoltageStateAllowed_READ return true; } //-------------------------------------------------------- /** * Method : BiltCh::is_Impedance_allowed() * Description : Execution allowed for Impedance attribute */ //-------------------------------------------------------- bool BiltCh::is_Impedance_allowed(TANGO_UNUSED(Tango::AttReqType type)) { // Not any excluded states for Impedance attribute in read access. /*----- PROTECTED REGION ID(BiltCh::ImpedanceStateAllowed_READ) ENABLED START -----*/ /*----- PROTECTED REGION END -----*/ // BiltCh::ImpedanceStateAllowed_READ return true; } //-------------------------------------------------------- /** * Method : BiltCh::is_SetCurrentRMS_allowed() * Description : Execution allowed for SetCurrentRMS attribute */ //-------------------------------------------------------- bool BiltCh::is_SetCurrentRMS_allowed(TANGO_UNUSED(Tango::AttReqType type)) { // Not any excluded states for SetCurrentRMS attribute in read access. /*----- PROTECTED REGION ID(BiltCh::SetCurrentRMSStateAllowed_READ) ENABLED START -----*/ /*----- PROTECTED REGION END -----*/ // BiltCh::SetCurrentRMSStateAllowed_READ return true; } //-------------------------------------------------------- /** * Method : BiltCh::is_SetCurrentAverage_allowed() * Description : Execution allowed for SetCurrentAverage attribute */ //-------------------------------------------------------- bool BiltCh::is_SetCurrentAverage_allowed(TANGO_UNUSED(Tango::AttReqType type)) { // Not any excluded states for SetCurrentAverage attribute in read access. /*----- PROTECTED REGION ID(BiltCh::SetCurrentAverageStateAllowed_READ) ENABLED START -----*/ /*----- PROTECTED REGION END -----*/ // BiltCh::SetCurrentAverageStateAllowed_READ return true; } //-------------------------------------------------------- /** * Method : BiltCh::is_FramesPerSecond_allowed() * Description : Execution allowed for FramesPerSecond attribute */ //-------------------------------------------------------- bool BiltCh::is_FramesPerSecond_allowed(TANGO_UNUSED(Tango::AttReqType type)) { // Not any excluded states for FramesPerSecond attribute in read access. /*----- PROTECTED REGION ID(BiltCh::FramesPerSecondStateAllowed_READ) ENABLED START -----*/ /*----- PROTECTED REGION END -----*/ // BiltCh::FramesPerSecondStateAllowed_READ return true; } //-------------------------------------------------------- /** * Method : BiltCh::is_ErrorPerSecond_allowed() * Description : Execution allowed for ErrorPerSecond attribute */ //-------------------------------------------------------- bool BiltCh::is_ErrorPerSecond_allowed(TANGO_UNUSED(Tango::AttReqType type)) { // Not any excluded states for ErrorPerSecond attribute in read access. /*----- PROTECTED REGION ID(BiltCh::ErrorPerSecondStateAllowed_READ) ENABLED START -----*/ /*----- PROTECTED REGION END -----*/ // BiltCh::ErrorPerSecondStateAllowed_READ return true; } //-------------------------------------------------------- /** * Method : BiltCh::is_ErrorCounter_allowed() * Description : Execution allowed for ErrorCounter attribute */ //-------------------------------------------------------- bool BiltCh::is_ErrorCounter_allowed(TANGO_UNUSED(Tango::AttReqType type)) { // Not any excluded states for ErrorCounter attribute in read access. /*----- PROTECTED REGION ID(BiltCh::ErrorCounterStateAllowed_READ) ENABLED START -----*/ /*----- PROTECTED REGION END -----*/ // BiltCh::ErrorCounterStateAllowed_READ return true; } //-------------------------------------------------------- /** * Method : BiltCh::is_LocalControl_allowed() * Description : Execution allowed for LocalControl attribute */ //-------------------------------------------------------- bool BiltCh::is_LocalControl_allowed(TANGO_UNUSED(Tango::AttReqType type)) { // Not any excluded states for LocalControl attribute in Write access. /*----- PROTECTED REGION ID(BiltCh::LocalControlStateAllowed_WRITE) ENABLED START -----*/ /*----- PROTECTED REGION END -----*/ // BiltCh::LocalControlStateAllowed_WRITE // Not any excluded states for LocalControl attribute in read access. /*----- PROTECTED REGION ID(BiltCh::LocalControlStateAllowed_READ) ENABLED START -----*/ /*----- PROTECTED REGION END -----*/ // BiltCh::LocalControlStateAllowed_READ return true; } //-------------------------------------------------------- /** * Method : BiltCh::is_SetCurrentAC_allowed() * Description : Execution allowed for SetCurrentAC attribute */ //-------------------------------------------------------- bool BiltCh::is_SetCurrentAC_allowed(TANGO_UNUSED(Tango::AttReqType type)) { // Not any excluded states for SetCurrentAC attribute in Write access. /*----- PROTECTED REGION ID(BiltCh::SetCurrentACStateAllowed_WRITE) ENABLED START -----*/ /*----- PROTECTED REGION END -----*/ // BiltCh::SetCurrentACStateAllowed_WRITE // Not any excluded states for SetCurrentAC attribute in read access. /*----- PROTECTED REGION ID(BiltCh::SetCurrentACStateAllowed_READ) ENABLED START -----*/ /*----- PROTECTED REGION END -----*/ // BiltCh::SetCurrentACStateAllowed_READ return true; } //-------------------------------------------------------- /** * Method : BiltCh::is_Temperature1_allowed() * Description : Execution allowed for Temperature1 attribute */ //-------------------------------------------------------- bool BiltCh::is_Temperature1_allowed(TANGO_UNUSED(Tango::AttReqType type)) { // Not any excluded states for Temperature1 attribute in read access. /*----- PROTECTED REGION ID(BiltCh::Temperature1StateAllowed_READ) ENABLED START -----*/ /*----- PROTECTED REGION END -----*/ // BiltCh::Temperature1StateAllowed_READ return true; } //-------------------------------------------------------- /** * Method : BiltCh::is_Temperature2_allowed() * Description : Execution allowed for Temperature2 attribute */ //-------------------------------------------------------- bool BiltCh::is_Temperature2_allowed(TANGO_UNUSED(Tango::AttReqType type)) { // Not any excluded states for Temperature2 attribute in read access. /*----- PROTECTED REGION ID(BiltCh::Temperature2StateAllowed_READ) ENABLED START -----*/ /*----- PROTECTED REGION END -----*/ // BiltCh::Temperature2StateAllowed_READ return true; } //================================================= // Commands Allowed Methods //================================================= } // End of namespace Node-path: powersupply/itest/BiltCh/trunk/BiltCh.cpp Node-kind: file Node-action: change Text-content-length: 26417 Text-content-md5: 2f0b1ef8b5af9cadfe8b6ca8b8229cfe Content-length: 26417 /*----- PROTECTED REGION ID(BiltCh.cpp) ENABLED START -----*/ static const char *RcsId = "$Id: BiltCh.cpp,v 1.8 2013-01-09 14:39:05 meyer Exp $"; //============================================================================= // // file : BiltCh.cpp // // description : C++ source for the BiltCh class and its commands. // The class is derived from Device. It represents the // CORBA servant object which will be accessed from the // network. All commands which can be executed on the // BiltCh are implemented in this file. // // project : BILT channel interface // // This file is part of Tango device class. // // Tango 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. // // Tango 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 Tango. If not, see . // // $Author: meyer $ // // $Revision: 1.8 $ // $Date: 2013-01-09 14:39:05 $ // // $HeadURL: $ // //============================================================================= // This file is generated by POGO // (Program Obviously used to Generate tango Object) //============================================================================= #include #include #include #include /*----- PROTECTED REGION END -----*/ // BiltCh.cpp /** * BiltCh class description: * The Bilt multi channel power supply has three individual channels. * This class offers an interface to an individual channel of the power supply. */ //================================================================ // The following table gives the correspondence // between command and method names. // // Command name | Method name //================================================================ // State | dev_state // Status | dev_status //================================================================ //================================================================ // Attributes managed are: //================================================================ // Current | Tango::DevDouble Scalar // Voltage | Tango::DevDouble Scalar // Impedance | Tango::DevDouble Scalar // SetCurrentRMS | Tango::DevDouble Scalar // SetCurrentAverage | Tango::DevDouble Scalar // FramesPerSecond | Tango::DevULong Scalar // ErrorPerSecond | Tango::DevULong Scalar // ErrorCounter | Tango::DevULong Scalar // LocalControl | Tango::DevBoolean Scalar // SetCurrentAC | Tango::DevDouble Scalar // Temperature1 | Tango::DevDouble Scalar // Temperature2 | Tango::DevDouble Scalar //================================================================ namespace BiltCh_ns { /*----- PROTECTED REGION ID(BiltCh::namespace_starting) ENABLED START -----*/ // static initializations /*----- PROTECTED REGION END -----*/ // BiltCh::namespace_starting //-------------------------------------------------------- /** * Method : BiltCh::BiltCh() * Description : Constructors for a Tango device * implementing the classBiltCh */ //-------------------------------------------------------- BiltCh::BiltCh(Tango::DeviceClass *cl, string &s) : Tango::Device_4Impl(cl, s.c_str()) { /*----- PROTECTED REGION ID(BiltCh::constructor_1) ENABLED START -----*/ init_device(); /*----- PROTECTED REGION END -----*/ // BiltCh::constructor_1 } //-------------------------------------------------------- BiltCh::BiltCh(Tango::DeviceClass *cl, const char *s) : Tango::Device_4Impl(cl, s) { /*----- PROTECTED REGION ID(BiltCh::constructor_2) ENABLED START -----*/ init_device(); /*----- PROTECTED REGION END -----*/ // BiltCh::constructor_2 } //-------------------------------------------------------- BiltCh::BiltCh(Tango::DeviceClass *cl, const char *s, const char *d) : Tango::Device_4Impl(cl, s, d) { /*----- PROTECTED REGION ID(BiltCh::constructor_3) ENABLED START -----*/ init_device(); /*----- PROTECTED REGION END -----*/ // BiltCh::constructor_3 } //-------------------------------------------------------- /** * Method : BiltCh::delete_device() * Description : will be called at device destruction or at init command */ //-------------------------------------------------------- void BiltCh::delete_device() { DEBUG_STREAM << "BiltCh::delete_device() " << device_name << endl; /*----- PROTECTED REGION ID(BiltCh::delete_device) ENABLED START -----*/ // Delete device allocated objects // Delete device allocated objects if ( bilt_obj != NULL ) { delete bilt_obj; } /*----- PROTECTED REGION END -----*/ // BiltCh::delete_device } //-------------------------------------------------------- /** * Method : BiltCh::init_device() * Description : will be called at device initialization. */ //-------------------------------------------------------- void BiltCh::init_device() { DEBUG_STREAM << "BiltCh::init_device() create device " << device_name << endl; /*----- PROTECTED REGION ID(BiltCh::init_device_before) ENABLED START -----*/ // Initialization before get_device_property() call /*----- PROTECTED REGION END -----*/ // BiltCh::init_device_before // Get the device properties from database get_device_property(); /*----- PROTECTED REGION ID(BiltCh::init_device) ENABLED START -----*/ // Initialize device set_state (Tango::UNKNOWN); // open proxy to Bilt power supply try { bilt_obj = new Tango::DeviceProxy(biltName); Tango::DeviceAttribute rattr; Tango::DevState bilt_state; rattr = bilt_obj->read_attribute("State"); rattr >> bilt_state; set_state (bilt_state); bilt_init = true; } catch (Tango::DevFailed &e) { bilt_error = e.errors; bilt_init = false; } /*----- PROTECTED REGION END -----*/ // BiltCh::init_device } //-------------------------------------------------------- /** * Method : BiltCh::get_device_property() * Description : Read database to initialize property data members. */ //-------------------------------------------------------- void BiltCh::get_device_property() { /*----- PROTECTED REGION ID(BiltCh::get_device_property_before) ENABLED START -----*/ // Initialize property data members bilt_obj = NULL; current = 0; voltage = 0; impedance = 0; current_rms = 0; current_average = 0; error_counter = 0; errors_per_sec = 0; frames_per_sec = 0; local_control = false; current_ac = 0; temp1 = 0; temp2 = 0; /*----- PROTECTED REGION END -----*/ // BiltCh::get_device_property_before set_status("Initializing...."); // Read device properties from database. Tango::DbData dev_prop; dev_prop.push_back(Tango::DbDatum("BiltName")); dev_prop.push_back(Tango::DbDatum("PoleNumber")); // is there at least one property to be read ? if (dev_prop.size()>0) { // Call database and extract values if (Tango::Util::instance()->_UseDb==true) get_db_device()->get_property(dev_prop); // get instance on BiltChClass to get class property Tango::DbDatum def_prop, cl_prop; BiltChClass *ds_class = (static_cast(get_device_class())); int i = -1; // Try to initialize BiltName from class property cl_prop = ds_class->get_class_property(dev_prop[++i].name); if (cl_prop.is_empty()==false) cl_prop >> biltName; else { // Try to initialize BiltName from default device value def_prop = ds_class->get_default_device_property(dev_prop[i].name); if (def_prop.is_empty()==false) def_prop >> biltName; } // And try to extract BiltName value from database if (dev_prop[i].is_empty()==false) dev_prop[i] >> biltName; // Try to initialize PoleNumber from class property cl_prop = ds_class->get_class_property(dev_prop[++i].name); if (cl_prop.is_empty()==false) cl_prop >> poleNumber; else { // Try to initialize PoleNumber from default device value def_prop = ds_class->get_default_device_property(dev_prop[i].name); if (def_prop.is_empty()==false) def_prop >> poleNumber; } // And try to extract PoleNumber value from database if (dev_prop[i].is_empty()==false) dev_prop[i] >> poleNumber; } /*----- PROTECTED REGION ID(BiltCh::get_device_property_after) ENABLED START -----*/ // Check device property data members init /*----- PROTECTED REGION END -----*/ // BiltCh::get_device_property_after } //-------------------------------------------------------- /** * Method : BiltCh::always_executed_hook() * Description : method always executed before any command is executed */ //-------------------------------------------------------- void BiltCh::always_executed_hook() { INFO_STREAM << "BiltCh::always_executed_hook() " << device_name << endl; /*----- PROTECTED REGION ID(BiltCh::always_executed_hook) ENABLED START -----*/ // code always executed before all requests /*----- PROTECTED REGION END -----*/ // BiltCh::always_executed_hook } //-------------------------------------------------------- /** * Method : BiltCh::read_attr_hardware() * Description : Hardware acquisition for attributes */ //-------------------------------------------------------- void BiltCh::read_attr_hardware(TANGO_UNUSED(vector &attr_list)) { DEBUG_STREAM << "BiltCh::read_attr_hardware(vector &attr_list) entering... " << endl; /*----- PROTECTED REGION ID(BiltCh::read_attr_hardware) ENABLED START -----*/ // Add your own code // Add your own code here if ( bilt_init == false ) { TangoSys_MemStream tms; tms << "Device is not correctly initialised! See the device status for more information." << endl; Tango::Except::throw_exception("ReadError", tms.str(), "Bilt::read_attr_hardware"); } /*----- PROTECTED REGION END -----*/ // BiltCh::read_attr_hardware } //-------------------------------------------------------- /** * Read attribute Current related method * Description: The DC current of the selected pole. * * Data type: Tango::DevDouble * Attr type: Scalar */ //-------------------------------------------------------- void BiltCh::read_Current(Tango::Attribute &attr) { DEBUG_STREAM << "BiltCh::read_Current(Tango::Attribute &attr) entering... " << endl; /*----- PROTECTED REGION ID(BiltCh::read_Current) ENABLED START -----*/ Tango::DeviceAttribute rattr; vector values; rattr = bilt_obj->read_attribute("Currents"); rattr >> values; Tango::MultiAttribute *attr_list = get_device_attr(); Tango::WAttribute &attr_curr = attr_list->get_w_attr_by_name ("Current"); attr_curr.set_write_value( &(values[POLES + poleNumber]) ); current = values[poleNumber]; attr.set_value (¤t); /*----- PROTECTED REGION END -----*/ // BiltCh::read_Current } //-------------------------------------------------------- /** * Write attribute Current related method * Description: The DC current of the selected pole. * * Data type: Tango::DevDouble * Attr type: Scalar */ //-------------------------------------------------------- void BiltCh::write_Current(Tango::WAttribute &attr) { DEBUG_STREAM << "BiltCh::write_Current(Tango::WAttribute &attr) entering... " << endl; // Retrieve write value Tango::DevDouble w_val; attr.get_write_value(w_val); /*----- PROTECTED REGION ID(BiltCh::write_Current) ENABLED START -----*/ double set_current = w_val; Tango::DeviceData argin; vector cmd_in; cmd_in.push_back (poleNumber); cmd_in.push_back (set_current); argin << cmd_in; bilt_obj->command_inout("SetPoleCurrent", argin); /*----- PROTECTED REGION END -----*/ // BiltCh::write_Current } //-------------------------------------------------------- /** * Read attribute Voltage related method * Description: The measured voltage of the selected pole. * * Data type: Tango::DevDouble * Attr type: Scalar */ //-------------------------------------------------------- void BiltCh::read_Voltage(Tango::Attribute &attr) { DEBUG_STREAM << "BiltCh::read_Voltage(Tango::Attribute &attr) entering... " << endl; /*----- PROTECTED REGION ID(BiltCh::read_Voltage) ENABLED START -----*/ Tango::DeviceAttribute rattr; vector values; rattr = bilt_obj->read_attribute("Voltages"); rattr >> values; voltage = values[poleNumber]; attr.set_value (&voltage); /*----- PROTECTED REGION END -----*/ // BiltCh::read_Voltage } //-------------------------------------------------------- /** * Read attribute Impedance related method * Description: Calculated impedance of the selected pole. * * Data type: Tango::DevDouble * Attr type: Scalar */ //-------------------------------------------------------- void BiltCh::read_Impedance(Tango::Attribute &attr) { DEBUG_STREAM << "BiltCh::read_Impedance(Tango::Attribute &attr) entering... " << endl; /*----- PROTECTED REGION ID(BiltCh::read_Impedance) ENABLED START -----*/ Tango::DeviceAttribute rattr; vector values; rattr = bilt_obj->read_attribute("Impedances"); rattr >> values; impedance = values[poleNumber]; attr.set_value (&impedance); /*----- PROTECTED REGION END -----*/ // BiltCh::read_Impedance } //-------------------------------------------------------- /** * Read attribute SetCurrentRMS related method * Description: Statistic when driven by the Libera.\nRMS value of the AC setpoint applied on the DAC during the last second.\nX=sqr( (sum(setAC)*sum(setAC)) / n - ((sum(setAC)/n) *(sum(setAC)/n)) ) * * Data type: Tango::DevDouble * Attr type: Scalar */ //-------------------------------------------------------- void BiltCh::read_SetCurrentRMS(Tango::Attribute &attr) { DEBUG_STREAM << "BiltCh::read_SetCurrentRMS(Tango::Attribute &attr) entering... " << endl; /*----- PROTECTED REGION ID(BiltCh::read_SetCurrentRMS) ENABLED START -----*/ Tango::DeviceAttribute rattr; vector values; rattr = bilt_obj->read_attribute("SetCurrentsRMS"); rattr >> values; current_rms = values[poleNumber]; attr.set_value (¤t_rms); /*----- PROTECTED REGION END -----*/ // BiltCh::read_SetCurrentRMS } //-------------------------------------------------------- /** * Read attribute SetCurrentAverage related method * Description: Statistic when driven by the Libera.\nThe average AC setpoint applied to the DAC during the last second.\nX=SUM(setAC)/n * * Data type: Tango::DevDouble * Attr type: Scalar */ //-------------------------------------------------------- void BiltCh::read_SetCurrentAverage(Tango::Attribute &attr) { DEBUG_STREAM << "BiltCh::read_SetCurrentAverage(Tango::Attribute &attr) entering... " << endl; /*----- PROTECTED REGION ID(BiltCh::read_SetCurrentAverage) ENABLED START -----*/ Tango::DeviceAttribute rattr; vector values; rattr = bilt_obj->read_attribute("SetCurrentsAverage"); rattr >> values; current_average = values[poleNumber]; attr.set_value (¤t_average); /*----- PROTECTED REGION END -----*/ // BiltCh::read_SetCurrentAverage } //-------------------------------------------------------- /** * Read attribute FramesPerSecond related method * Description: Statistic when driven by the Libera.\nThe number of setpoints per second. * * Data type: Tango::DevULong * Attr type: Scalar */ //-------------------------------------------------------- void BiltCh::read_FramesPerSecond(Tango::Attribute &attr) { DEBUG_STREAM << "BiltCh::read_FramesPerSecond(Tango::Attribute &attr) entering... " << endl; /*----- PROTECTED REGION ID(BiltCh::read_FramesPerSecond) ENABLED START -----*/ Tango::DeviceAttribute rattr; vector values; rattr = bilt_obj->read_attribute("FramesPerSecond"); rattr >> values; frames_per_sec = values[poleNumber]; attr.set_value (&frames_per_sec); /*----- PROTECTED REGION END -----*/ // BiltCh::read_FramesPerSecond } //-------------------------------------------------------- /** * Read attribute ErrorPerSecond related method * Description: Statistic when driven by the Libera.\nThe number of errors detected per second. * * Data type: Tango::DevULong * Attr type: Scalar */ //-------------------------------------------------------- void BiltCh::read_ErrorPerSecond(Tango::Attribute &attr) { DEBUG_STREAM << "BiltCh::read_ErrorPerSecond(Tango::Attribute &attr) entering... " << endl; /*----- PROTECTED REGION ID(BiltCh::read_ErrorPerSecond) ENABLED START -----*/ Tango::DeviceAttribute rattr; vector values; rattr = bilt_obj->read_attribute("ErrorsPerSecond"); rattr >> values; errors_per_sec = values[poleNumber]; attr.set_value (&errors_per_sec); /*----- PROTECTED REGION END -----*/ // BiltCh::read_ErrorPerSecond } //-------------------------------------------------------- /** * Read attribute ErrorCounter related method * Description: Statistic when driven by the Libera.\nThe total number of errors since the last reset. * * Data type: Tango::DevULong * Attr type: Scalar */ //-------------------------------------------------------- void BiltCh::read_ErrorCounter(Tango::Attribute &attr) { DEBUG_STREAM << "BiltCh::read_ErrorCounter(Tango::Attribute &attr) entering... " << endl; /*----- PROTECTED REGION ID(BiltCh::read_ErrorCounter) ENABLED START -----*/ Tango::DeviceAttribute rattr; vector values; rattr = bilt_obj->read_attribute("ErrorCounters"); rattr >> values; error_counter = values[poleNumber]; attr.set_value (&error_counter); /*----- PROTECTED REGION END -----*/ // BiltCh::read_ErrorCounter } //-------------------------------------------------------- /** * Read attribute LocalControl related method * Description: If true the AC current can be set on the device,\notherwise it is driven by the Libera. * * Data type: Tango::DevBoolean * Attr type: Scalar */ //-------------------------------------------------------- void BiltCh::read_LocalControl(Tango::Attribute &attr) { DEBUG_STREAM << "BiltCh::read_LocalControl(Tango::Attribute &attr) entering... " << endl; /*----- PROTECTED REGION ID(BiltCh::read_LocalControl) ENABLED START -----*/ Tango::DeviceAttribute rattr; vector values; rattr = bilt_obj->read_attribute("LocalControls"); rattr >> values; local_control = values[poleNumber]; attr.set_value (&local_control); /*----- PROTECTED REGION END -----*/ // BiltCh::read_LocalControl } //-------------------------------------------------------- /** * Write attribute LocalControl related method * Description: If true the AC current can be set on the device,\notherwise it is driven by the Libera. * * Data type: Tango::DevBoolean * Attr type: Scalar */ //-------------------------------------------------------- void BiltCh::write_LocalControl(Tango::WAttribute &attr) { DEBUG_STREAM << "BiltCh::write_LocalControl(Tango::WAttribute &attr) entering... " << endl; // Retrieve write value Tango::DevBoolean w_val; attr.get_write_value(w_val); /*----- PROTECTED REGION ID(BiltCh::write_LocalControl) ENABLED START -----*/ bool local_control = w_val; Tango::DeviceData argin; vector cmd_in; cmd_in.push_back (poleNumber); if (local_control == true) cmd_in.push_back (1); else { cmd_in.push_back (0); // set back the AC current setpoint to 0! Tango::DeviceData ac_curr; vector ac_in; ac_in.push_back (poleNumber); ac_in.push_back (0); ac_curr << ac_in; bilt_obj->command_inout("SetPoleAcCurrent", ac_curr); current_ac = 0; } argin << cmd_in; bilt_obj->command_inout("LocalPoleControl", argin); /*----- PROTECTED REGION END -----*/ // BiltCh::write_LocalControl } //-------------------------------------------------------- /** * Read attribute SetCurrentAC related method * Description: The AC current setpoint in local mode. If driven by the Libera, the attribute \nattribute value in INVALID. * * Data type: Tango::DevDouble * Attr type: Scalar */ //-------------------------------------------------------- void BiltCh::read_SetCurrentAC(Tango::Attribute &attr) { DEBUG_STREAM << "BiltCh::read_SetCurrentAC(Tango::Attribute &attr) entering... " << endl; /*----- PROTECTED REGION ID(BiltCh::read_SetCurrentAC) ENABLED START -----*/ if ( local_control == false ) { attr.set_quality (Tango::ATTR_INVALID); } else { attr.set_value (¤t_ac); } /*----- PROTECTED REGION END -----*/ // BiltCh::read_SetCurrentAC } //-------------------------------------------------------- /** * Write attribute SetCurrentAC related method * Description: The AC current setpoint in local mode. If driven by the Libera, the attribute \nattribute value in INVALID. * * Data type: Tango::DevDouble * Attr type: Scalar */ //-------------------------------------------------------- void BiltCh::write_SetCurrentAC(Tango::WAttribute &attr) { DEBUG_STREAM << "BiltCh::write_SetCurrentAC(Tango::WAttribute &attr) entering... " << endl; // Retrieve write value Tango::DevDouble w_val; attr.get_write_value(w_val); /*----- PROTECTED REGION ID(BiltCh::write_SetCurrentAC) ENABLED START -----*/ if ( local_control == false ) { TangoSys_MemStream tms; tms << "Can set AC current only when local control enabled!" << endl; Tango::Except::throw_exception("WriteError", tms.str(), "Bilt::write_SetCurrentAC"); } double set_current = w_val; Tango::DeviceData argin; vector cmd_in; cmd_in.push_back (poleNumber); cmd_in.push_back (set_current); argin << cmd_in; bilt_obj->command_inout("SetPoleAcCurrent", argin); current_ac = set_current; /*----- PROTECTED REGION END -----*/ // BiltCh::write_SetCurrentAC } //-------------------------------------------------------- /** * Read attribute Temperature1 related method * Description: Temperature 1 of the pole. * * Data type: Tango::DevDouble * Attr type: Scalar */ //-------------------------------------------------------- void BiltCh::read_Temperature1(Tango::Attribute &attr) { DEBUG_STREAM << "BiltCh::read_Temperature1(Tango::Attribute &attr) entering... " << endl; /*----- PROTECTED REGION ID(BiltCh::read_Temperature1) ENABLED START -----*/ Tango::DeviceAttribute rattr; vector temps; rattr = bilt_obj->read_attribute("Temperatures"); rattr >> temps; temp1 = temps[poleNumber * 2]; attr.set_value (&temp1); /*----- PROTECTED REGION END -----*/ // BiltCh::read_Temperature1 } //-------------------------------------------------------- /** * Read attribute Temperature2 related method * Description: Temperature 2 of the pole. * * Data type: Tango::DevDouble * Attr type: Scalar */ //-------------------------------------------------------- void BiltCh::read_Temperature2(Tango::Attribute &attr) { DEBUG_STREAM << "BiltCh::read_Temperature2(Tango::Attribute &attr) entering... " << endl; /*----- PROTECTED REGION ID(BiltCh::read_Temperature2) ENABLED START -----*/ Tango::DeviceAttribute rattr; vector temps; rattr = bilt_obj->read_attribute("Temperatures"); rattr >> temps; temp2 = temps[(poleNumber * 2) + 1]; attr.set_value (&temp2); /*----- PROTECTED REGION END -----*/ // BiltCh::read_Temperature2 } //-------------------------------------------------------- /** * Method : BiltCh::add_dynamic_attributes() * Description : Create the dynamic attributes if any * for specified device. */ //-------------------------------------------------------- void BiltCh::add_dynamic_attributes() { /*----- PROTECTED REGION ID(BiltCh::add_dynamic_attributes) ENABLED START -----*/ // Add your own code to create and add dynamic attributes if any /*----- PROTECTED REGION END -----*/ // BiltCh::add_dynamic_attributes } //-------------------------------------------------------- /** * Command State related method * Description: This command gets the device state (stored in its device_state data member) and returns it to the caller. * * @param argin none. * @returns State Code */ //-------------------------------------------------------- Tango::DevState BiltCh::dev_state() { DEBUG_STREAM << "BiltCh::State() - " << device_name << endl; /*----- PROTECTED REGION ID(BiltCh::dev_state) ENABLED START -----*/ Tango::DevState argout = Tango::UNKNOWN; // replace by your own algorithm // Add your own code if ( bilt_init == true ) { Tango::DeviceAttribute rattr; Tango::DevState bilt_state; rattr = bilt_obj->read_attribute("State"); rattr >> bilt_state; set_state (bilt_state); } argout = get_state(); /*----- PROTECTED REGION END -----*/ // BiltCh::dev_state set_state(argout); // Give the state to Tango. if (argout!=Tango::ALARM) DeviceImpl::dev_state(); return get_state(); // Return it after Tango management. } //-------------------------------------------------------- /** * Command Status related method * Description: This command gets the device status (stored in its device_status data member) and returns it to the caller. * * @param argin none. * @returns Status description */ //-------------------------------------------------------- Tango::ConstDevString BiltCh::dev_status() { DEBUG_STREAM << "BiltCh::Status() - " << device_name << endl; /*----- PROTECTED REGION ID(BiltCh::dev_status) ENABLED START -----*/ string status = "Device is OK"; // Add your own code string bilt_status; if ( bilt_init == true ) { Tango::DeviceAttribute rattr; rattr = bilt_obj->read_attribute("Status"); rattr >> bilt_status; } else { bilt_status = "Error during initialisation: \n"; for (short i = 0; i #include /** * Create BiltChClass singleton and store it in DServer object. */ void Tango::DServer::class_factory() { add_class(BiltCh_ns::BiltChClass::init("BiltCh")); } /*----- PROTECTED REGION END -----*/ // BiltCh::ClassFactory.cpp Node-path: powersupply/itest/BiltCh/trunk/Makefile Node-kind: file Node-action: change Text-content-length: 5549 Text-content-md5: c70a78147f0383afcdcfa2f598949921 Content-length: 5549 #PROTECTED REGION ID(BiltChMakefile) ENABLED START# #============================================================================= # # file : Makefile # # description : Include for the BiltCh class. # # project : Makefile to generate a Tango server # # $Author: meyer $ # # $Revision: 1.8 $ # # $Log: not supported by cvs2svn $ # Revision 1.7 2010/11/10 14:01:42 meyer # changed version to 1.6 # # Revision 1.6 2010-11-10 12:02:59 meyer # Changed version to 1.5 # # Revision 1.5 2010/06/21 07:17:48 meyer # Changed version to 1.4 # # Revision 1.4 2010/05/01 16:26:01 meyer # Changed version to 1.3 # # Revision 1.3 2010/03/19 15:28:01 meyer # Canged to version 1.1 # # Revision 1.2 2010-02-11 16:36:31 meyer # Currents attribute of Bilt understand NaN values now. # # Revision 1.1.1.1 2010-02-10 11:49:21 meyer # Imported using TkCVS # # # copyleft : European Synchrotron Radiation Facility # BP 220, Grenoble 38043 # FRANCE # #============================================================================= # This file is generated by POGO # (Program Obviously used to Generate tango Object) # # (c) - Software Engineering Group - ESRF #============================================================================= # CLASS = BiltCh MAJOR_VERS = 1 MINOR_VERS = 6 RELEASE = Release_$(MAJOR_VERS)_$(MINOR_VERS) OS = $(shell /csadmin/common/scripts/get_os) PROCESSOR = $(shell uname -p) #----------------------------------------- # Set default home directories #----------------------------------------- TANGO_HOME = /segfs/tango/release/$(BIN_DIR) CPP_SERVERS = $(TANGO_HOME)/classes ifdef no_debug DEBUG = -O else DEBUG = -g endif ifdef _solaris CC = CC BIN_DIR=$(OS)_CC AR_SL = $(CC) -mt -G VERS_OPT = -h SL_EXT = so endif ifdef linux CC = c++ CC_SHLIB = $(CC) -fPIC $(PROCESSOR)=1 ifdef x86_64 NBITS=_64 endif BIN_DIR=$(OS)$(NBITS) AR_SL = $(CC) -fPIC -shared SL_EXT = so VERS_OPT = -Wl,-soname, endif INCLUDE_DIRS = -I$(TANGO_HOME)/include -I. \ -I$(CPP_SERVERS)/include OBJS_DIR = obj/$(BIN_DIR) LIB_DIRS = -L $(CPP_SERVERS)/lib \ -L $(TANGO_HOME)/lib \ TARGET_LIB = $(CPP_SERVERS)/lib/libtgclasses.a #----------------------------------------- # Set CXXFLAGS and LFLAGS #----------------------------------------- ifdef _solaris CXXFLAGS = $(DEBUG) -mt -D_PTHREADS $(INCLUDE_DIRS) LFLAGS = $(DEBUG) $(LIB_DIRS) \ -ltango \ -llog4tango \ -lomniORB4 \ -lomniDynamic4 \ -lomnithread \ -lCOS4 \ -lpthread \ -lposix4 -lsocket -lnsl endif ifdef linux CXXFLAGS = -g -D_REENTRANT $(INCLUDE_DIRS) LFLAGS = $(DEBUG) $(LIB_DIRS) \ -ltango \ -llog4tango \ -lomniORB4 \ -lomniDynamic4 \ -lomnithread \ -lCOS4 \ -lzmq \ -ldl -lpthread endif #----------------------------------------- # Set dependences #----------------------------------------- SVC_OBJS = $(OBJS_DIR)/$(CLASS).o \ $(OBJS_DIR)/$(CLASS)StateMachine.o \ $(OBJS_DIR)/$(CLASS)Class.o \ $(OBJS_DIR)/ClassFactory.o \ $(OBJS_DIR)/main.o SHLIB_OBJS = $(OBJS_DIR)/$(CLASS)Class.so.o \ $(OBJS_DIR)/$(CLASS)StateMachine.so.o \ $(OBJS_DIR)/$(CLASS).so.o SVC_INC = $(CLASS)Class.h \ $(CLASS).h $(OBJS_DIR)/%.o: %.cpp $(SVC_INC) $(CC) $(CXXFLAGS) -c $< -o $(OBJS_DIR)/$*.o $(OBJS_DIR)/%.so.o: %.cpp $(SVC_INC) $(CC_SHLIB) $(CXXFLAGS) -c $< -o $(OBJS_DIR)/$*.so.o #----------------------------------------- # Make Entry #----------------------------------------- all: $(CLASS) $(CLASS): make_obj_dir make_bin_dir $(SVC_OBJS) $(CC) $(SVC_OBJS) -o $(CLASS) $(LFLAGS) @mv $(CLASS) bin/$(BIN_DIR)/$(CLASS) shlib: make_obj_dir make_shlib_dir $(SHLIB_OBJS) $(AR_SL) -o \ shlib/$(BIN_DIR)/$(CLASS).$(SL_EXT).$(MAJOR_VERS).$(MINOR_VERS) \ $(VERS_OPT)$(CLASS).$(SL_EXT).$(MAJOR_VERS) \ $(SHLIB_OBJS) $(LFLAGS) @rm -f shlib/$(BIN_DIR)/$(CLASS).$(SL_EXT) @cd shlib/$(BIN_DIR); \ ln -s $(CLASS).$(SL_EXT).$(MAJOR_VERS).$(MINOR_VERS) $(CLASS).$(SL_EXT) clean: rm -f $(OBJS_DIR)/*.o \ $(OBJS_DIR)/*.so.o \ bin/$(BIN_DIR)/$(CLASS) \ core make_obj_dir: @mkdir -p obj @mkdir -p obj/$(BIN_DIR) make_bin_dir: @mkdir -p bin @mkdir -p bin/$(BIN_DIR) make_shlib_dir: @mkdir -p shlib @mkdir -p shlib/$(BIN_DIR) #----------------------------------------- # Install binary file #----------------------------------------- install: cp bin/$(BIN_DIR)/$(CLASS) $(CPP_SERVERS)/bin #----------------------------------------- # Update class library and header files # recompile without debug mode. #----------------------------------------- lib: clean @make no_debug=1 cp *.h $(CPP_SERVERS)/include ar ruv $(TARGET_LIB) $(OBJS_DIR)/$(CLASS).o ar ruv $(TARGET_LIB) $(OBJS_DIR)/$(CLASS)Class.o ar ruv $(TARGET_LIB) $(OBJS_DIR)/$(CLASS)StateMachine.o ident $(TARGET_LIB) | grep $(CLASS) #------------------------------------------------------ # Tag the CVS/SVN module corresponding to this class # copy cvs_tag or svn_tag to tag: entry #------------------------------------------------------ #svn_tag: # svn copy ../trunk ../tags/$(RELEASE) # svn commit ../tags/$(RELEASE) \ # -m "Tagging the $(RELEASE) of the $(CLASS) project." # #cvs_tag: # @cvstag "$(CLASS)-$(RELEASE)" # @make $(CLASS) # @make show_tag #show_cvs_tag: # @cvstag -d # # Only these make options work with the current Pogo version 5.3.x! tag: @cvstag "$(CLASS)-$(RELEASE)" @make $(CLASS) @make show_tag show_tag: @cvstag -d #PROTECTED REGION END# Node-path: powersupply/itest/BiltCh/trunk/main.cpp Node-kind: file Node-action: change Text-content-length: 2488 Text-content-md5: 8f8193e0fa123a8fa9508d92cc3485b7 Content-length: 2488 /*----- PROTECTED REGION ID(BiltCh::main.cpp) ENABLED START -----*/ static const char *RcsId = "$Id: main.cpp,v 1.2 2013-01-09 14:39:05 meyer Exp $"; //============================================================================= // // file : main.cpp // // description : C++ source for the BiltCh device server main. // The main rule is to initialise (and create) the Tango // system and to create the DServerClass singleton. // The main should be the same for every Tango device server. // // project : BILT channel interface // // This file is part of Tango device class. // // Tango 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. // // Tango 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 Tango. If not, see . // // $Author: meyer $ // // $Revision: 1.2 $ // $Date: 2013-01-09 14:39:05 $ // // $HeadURL: $ // //============================================================================= // This file is generated by POGO // (Program Obviously used to Generate tango Object) //============================================================================= #include int main(int argc,char *argv[]) { Tango::Util *tg; try { // Initialise the device server //---------------------------------------- tg = Tango::Util::init(argc,argv); // Create the device server singleton // which will create everything //---------------------------------------- tg->server_init(false); // Run the endless loop //---------------------------------------- cout << "Ready to accept request" << endl; tg->server_run(); } catch (bad_alloc) { cout << "Can't allocate memory to store device object !!!" << endl; cout << "Exiting" << endl; } catch (CORBA::Exception &e) { Tango::Except::print_exception(e); cout << "Received a CORBA_Exception" << endl; cout << "Exiting" << endl; } tg->server_cleanup(); return(0); } /*----- PROTECTED REGION END -----*/ // BiltCh::main.cpp Revision-number: 97 Prop-content-length: 120 Content-length: 120 K 10 svn:author V 5 meyer K 8 svn:date V 27 2013-01-09T14:41:04.000000Z K 7 svn:log V 20 Deleted Pogo6 file. PROPS-END Node-path: powersupply/itest/BiltCh/trunk/TangoClassID.txt Node-action: delete Revision-number: 98 Prop-content-length: 126 Content-length: 126 K 10 svn:author V 5 meyer K 8 svn:date V 27 2013-01-09T14:41:53.000000Z K 7 svn:log V 26 Added .xmi file for Pogo8 PROPS-END Node-path: powersupply/itest/BiltCh/trunk/BiltCh.xmi Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 12064 Text-content-md5: 21cc7500a3d47d0d5c3da1aa5ce002b4 Content-length: 12074 PROPS-END none -1 Revision-number: 99 Prop-content-length: 134 Content-length: 134 K 10 svn:author V 5 meyer K 8 svn:date V 27 2013-01-09T15:13:59.000000Z K 7 svn:log V 34 Added On, Off and Reset commands. PROPS-END Node-path: powersupply/itest/BiltCh/trunk/BiltCh.cpp Node-kind: file Node-action: change Text-content-length: 28047 Text-content-md5: 304d1afc8c927fc0c9ab17cb67542bb6 Content-length: 28047 /*----- PROTECTED REGION ID(BiltCh.cpp) ENABLED START -----*/ static const char *RcsId = "$Id: BiltCh.cpp,v 1.9 2013-01-09 15:13:59 meyer Exp $"; //============================================================================= // // file : BiltCh.cpp // // description : C++ source for the BiltCh class and its commands. // The class is derived from Device. It represents the // CORBA servant object which will be accessed from the // network. All commands which can be executed on the // BiltCh are implemented in this file. // // project : BILT channel interface // // This file is part of Tango device class. // // Tango 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. // // Tango 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 Tango. If not, see . // // $Author: meyer $ // // $Revision: 1.9 $ // $Date: 2013-01-09 15:13:59 $ // // $HeadURL: $ // //============================================================================= // This file is generated by POGO // (Program Obviously used to Generate tango Object) //============================================================================= #include #include #include #include /*----- PROTECTED REGION END -----*/ // BiltCh.cpp /** * BiltCh class description: * The Bilt multi channel power supply has three individual channels. * This class offers an interface to an individual channel of the power supply. */ //================================================================ // The following table gives the correspondence // between command and method names. // // Command name | Method name //================================================================ // State | dev_state // Status | dev_status // On | on // Off | off // Reset | reset //================================================================ //================================================================ // Attributes managed are: //================================================================ // Current | Tango::DevDouble Scalar // Voltage | Tango::DevDouble Scalar // Impedance | Tango::DevDouble Scalar // SetCurrentRMS | Tango::DevDouble Scalar // SetCurrentAverage | Tango::DevDouble Scalar // FramesPerSecond | Tango::DevULong Scalar // ErrorPerSecond | Tango::DevULong Scalar // ErrorCounter | Tango::DevULong Scalar // LocalControl | Tango::DevBoolean Scalar // SetCurrentAC | Tango::DevDouble Scalar // Temperature1 | Tango::DevDouble Scalar // Temperature2 | Tango::DevDouble Scalar //================================================================ namespace BiltCh_ns { /*----- PROTECTED REGION ID(BiltCh::namespace_starting) ENABLED START -----*/ // static initializations /*----- PROTECTED REGION END -----*/ // BiltCh::namespace_starting //-------------------------------------------------------- /** * Method : BiltCh::BiltCh() * Description : Constructors for a Tango device * implementing the classBiltCh */ //-------------------------------------------------------- BiltCh::BiltCh(Tango::DeviceClass *cl, string &s) : Tango::Device_4Impl(cl, s.c_str()) { /*----- PROTECTED REGION ID(BiltCh::constructor_1) ENABLED START -----*/ init_device(); /*----- PROTECTED REGION END -----*/ // BiltCh::constructor_1 } //-------------------------------------------------------- BiltCh::BiltCh(Tango::DeviceClass *cl, const char *s) : Tango::Device_4Impl(cl, s) { /*----- PROTECTED REGION ID(BiltCh::constructor_2) ENABLED START -----*/ init_device(); /*----- PROTECTED REGION END -----*/ // BiltCh::constructor_2 } //-------------------------------------------------------- BiltCh::BiltCh(Tango::DeviceClass *cl, const char *s, const char *d) : Tango::Device_4Impl(cl, s, d) { /*----- PROTECTED REGION ID(BiltCh::constructor_3) ENABLED START -----*/ init_device(); /*----- PROTECTED REGION END -----*/ // BiltCh::constructor_3 } //-------------------------------------------------------- /** * Method : BiltCh::delete_device() * Description : will be called at device destruction or at init command */ //-------------------------------------------------------- void BiltCh::delete_device() { DEBUG_STREAM << "BiltCh::delete_device() " << device_name << endl; /*----- PROTECTED REGION ID(BiltCh::delete_device) ENABLED START -----*/ // Delete device allocated objects // Delete device allocated objects if ( bilt_obj != NULL ) { delete bilt_obj; } /*----- PROTECTED REGION END -----*/ // BiltCh::delete_device } //-------------------------------------------------------- /** * Method : BiltCh::init_device() * Description : will be called at device initialization. */ //-------------------------------------------------------- void BiltCh::init_device() { DEBUG_STREAM << "BiltCh::init_device() create device " << device_name << endl; /*----- PROTECTED REGION ID(BiltCh::init_device_before) ENABLED START -----*/ // Initialization before get_device_property() call /*----- PROTECTED REGION END -----*/ // BiltCh::init_device_before // Get the device properties from database get_device_property(); /*----- PROTECTED REGION ID(BiltCh::init_device) ENABLED START -----*/ // Initialize device set_state (Tango::UNKNOWN); // open proxy to Bilt power supply try { bilt_obj = new Tango::DeviceProxy(biltName); Tango::DeviceAttribute rattr; Tango::DevState bilt_state; rattr = bilt_obj->read_attribute("State"); rattr >> bilt_state; set_state (bilt_state); bilt_init = true; } catch (Tango::DevFailed &e) { bilt_error = e.errors; bilt_init = false; } /*----- PROTECTED REGION END -----*/ // BiltCh::init_device } //-------------------------------------------------------- /** * Method : BiltCh::get_device_property() * Description : Read database to initialize property data members. */ //-------------------------------------------------------- void BiltCh::get_device_property() { /*----- PROTECTED REGION ID(BiltCh::get_device_property_before) ENABLED START -----*/ // Initialize property data members bilt_obj = NULL; current = 0; voltage = 0; impedance = 0; current_rms = 0; current_average = 0; error_counter = 0; errors_per_sec = 0; frames_per_sec = 0; local_control = false; current_ac = 0; temp1 = 0; temp2 = 0; /*----- PROTECTED REGION END -----*/ // BiltCh::get_device_property_before set_status("Initializing...."); // Read device properties from database. Tango::DbData dev_prop; dev_prop.push_back(Tango::DbDatum("BiltName")); dev_prop.push_back(Tango::DbDatum("PoleNumber")); // is there at least one property to be read ? if (dev_prop.size()>0) { // Call database and extract values if (Tango::Util::instance()->_UseDb==true) get_db_device()->get_property(dev_prop); // get instance on BiltChClass to get class property Tango::DbDatum def_prop, cl_prop; BiltChClass *ds_class = (static_cast(get_device_class())); int i = -1; // Try to initialize BiltName from class property cl_prop = ds_class->get_class_property(dev_prop[++i].name); if (cl_prop.is_empty()==false) cl_prop >> biltName; else { // Try to initialize BiltName from default device value def_prop = ds_class->get_default_device_property(dev_prop[i].name); if (def_prop.is_empty()==false) def_prop >> biltName; } // And try to extract BiltName value from database if (dev_prop[i].is_empty()==false) dev_prop[i] >> biltName; // Try to initialize PoleNumber from class property cl_prop = ds_class->get_class_property(dev_prop[++i].name); if (cl_prop.is_empty()==false) cl_prop >> poleNumber; else { // Try to initialize PoleNumber from default device value def_prop = ds_class->get_default_device_property(dev_prop[i].name); if (def_prop.is_empty()==false) def_prop >> poleNumber; } // And try to extract PoleNumber value from database if (dev_prop[i].is_empty()==false) dev_prop[i] >> poleNumber; } /*----- PROTECTED REGION ID(BiltCh::get_device_property_after) ENABLED START -----*/ // Check device property data members init /*----- PROTECTED REGION END -----*/ // BiltCh::get_device_property_after } //-------------------------------------------------------- /** * Method : BiltCh::always_executed_hook() * Description : method always executed before any command is executed */ //-------------------------------------------------------- void BiltCh::always_executed_hook() { INFO_STREAM << "BiltCh::always_executed_hook() " << device_name << endl; /*----- PROTECTED REGION ID(BiltCh::always_executed_hook) ENABLED START -----*/ // code always executed before all requests /*----- PROTECTED REGION END -----*/ // BiltCh::always_executed_hook } //-------------------------------------------------------- /** * Method : BiltCh::read_attr_hardware() * Description : Hardware acquisition for attributes */ //-------------------------------------------------------- void BiltCh::read_attr_hardware(TANGO_UNUSED(vector &attr_list)) { DEBUG_STREAM << "BiltCh::read_attr_hardware(vector &attr_list) entering... " << endl; /*----- PROTECTED REGION ID(BiltCh::read_attr_hardware) ENABLED START -----*/ // Add your own code // Add your own code here if ( bilt_init == false ) { TangoSys_MemStream tms; tms << "Device is not correctly initialised! See the device status for more information." << endl; Tango::Except::throw_exception("ReadError", tms.str(), "Bilt::read_attr_hardware"); } /*----- PROTECTED REGION END -----*/ // BiltCh::read_attr_hardware } //-------------------------------------------------------- /** * Read attribute Current related method * Description: The DC current of the selected pole. * * Data type: Tango::DevDouble * Attr type: Scalar */ //-------------------------------------------------------- void BiltCh::read_Current(Tango::Attribute &attr) { DEBUG_STREAM << "BiltCh::read_Current(Tango::Attribute &attr) entering... " << endl; /*----- PROTECTED REGION ID(BiltCh::read_Current) ENABLED START -----*/ Tango::DeviceAttribute rattr; vector values; rattr = bilt_obj->read_attribute("Currents"); rattr >> values; Tango::MultiAttribute *attr_list = get_device_attr(); Tango::WAttribute &attr_curr = attr_list->get_w_attr_by_name ("Current"); attr_curr.set_write_value( &(values[POLES + poleNumber]) ); current = values[poleNumber]; attr.set_value (¤t); /*----- PROTECTED REGION END -----*/ // BiltCh::read_Current } //-------------------------------------------------------- /** * Write attribute Current related method * Description: The DC current of the selected pole. * * Data type: Tango::DevDouble * Attr type: Scalar */ //-------------------------------------------------------- void BiltCh::write_Current(Tango::WAttribute &attr) { DEBUG_STREAM << "BiltCh::write_Current(Tango::WAttribute &attr) entering... " << endl; // Retrieve write value Tango::DevDouble w_val; attr.get_write_value(w_val); /*----- PROTECTED REGION ID(BiltCh::write_Current) ENABLED START -----*/ double set_current = w_val; Tango::DeviceData argin; vector cmd_in; cmd_in.push_back (poleNumber); cmd_in.push_back (set_current); argin << cmd_in; bilt_obj->command_inout("SetPoleCurrent", argin); /*----- PROTECTED REGION END -----*/ // BiltCh::write_Current } //-------------------------------------------------------- /** * Read attribute Voltage related method * Description: The measured voltage of the selected pole. * * Data type: Tango::DevDouble * Attr type: Scalar */ //-------------------------------------------------------- void BiltCh::read_Voltage(Tango::Attribute &attr) { DEBUG_STREAM << "BiltCh::read_Voltage(Tango::Attribute &attr) entering... " << endl; /*----- PROTECTED REGION ID(BiltCh::read_Voltage) ENABLED START -----*/ Tango::DeviceAttribute rattr; vector values; rattr = bilt_obj->read_attribute("Voltages"); rattr >> values; voltage = values[poleNumber]; attr.set_value (&voltage); /*----- PROTECTED REGION END -----*/ // BiltCh::read_Voltage } //-------------------------------------------------------- /** * Read attribute Impedance related method * Description: Calculated impedance of the selected pole. * * Data type: Tango::DevDouble * Attr type: Scalar */ //-------------------------------------------------------- void BiltCh::read_Impedance(Tango::Attribute &attr) { DEBUG_STREAM << "BiltCh::read_Impedance(Tango::Attribute &attr) entering... " << endl; /*----- PROTECTED REGION ID(BiltCh::read_Impedance) ENABLED START -----*/ Tango::DeviceAttribute rattr; vector values; rattr = bilt_obj->read_attribute("Impedances"); rattr >> values; impedance = values[poleNumber]; attr.set_value (&impedance); /*----- PROTECTED REGION END -----*/ // BiltCh::read_Impedance } //-------------------------------------------------------- /** * Read attribute SetCurrentRMS related method * Description: Statistic when driven by the Libera.\nRMS value of the AC setpoint applied on the DAC during the last second.\nX=sqr( (sum(setAC)*sum(setAC)) / n - ((sum(setAC)/n) *(sum(setAC)/n)) ) * * Data type: Tango::DevDouble * Attr type: Scalar */ //-------------------------------------------------------- void BiltCh::read_SetCurrentRMS(Tango::Attribute &attr) { DEBUG_STREAM << "BiltCh::read_SetCurrentRMS(Tango::Attribute &attr) entering... " << endl; /*----- PROTECTED REGION ID(BiltCh::read_SetCurrentRMS) ENABLED START -----*/ Tango::DeviceAttribute rattr; vector values; rattr = bilt_obj->read_attribute("SetCurrentsRMS"); rattr >> values; current_rms = values[poleNumber]; attr.set_value (¤t_rms); /*----- PROTECTED REGION END -----*/ // BiltCh::read_SetCurrentRMS } //-------------------------------------------------------- /** * Read attribute SetCurrentAverage related method * Description: Statistic when driven by the Libera.\nThe average AC setpoint applied to the DAC during the last second.\nX=SUM(setAC)/n * * Data type: Tango::DevDouble * Attr type: Scalar */ //-------------------------------------------------------- void BiltCh::read_SetCurrentAverage(Tango::Attribute &attr) { DEBUG_STREAM << "BiltCh::read_SetCurrentAverage(Tango::Attribute &attr) entering... " << endl; /*----- PROTECTED REGION ID(BiltCh::read_SetCurrentAverage) ENABLED START -----*/ Tango::DeviceAttribute rattr; vector values; rattr = bilt_obj->read_attribute("SetCurrentsAverage"); rattr >> values; current_average = values[poleNumber]; attr.set_value (¤t_average); /*----- PROTECTED REGION END -----*/ // BiltCh::read_SetCurrentAverage } //-------------------------------------------------------- /** * Read attribute FramesPerSecond related method * Description: Statistic when driven by the Libera.\nThe number of setpoints per second. * * Data type: Tango::DevULong * Attr type: Scalar */ //-------------------------------------------------------- void BiltCh::read_FramesPerSecond(Tango::Attribute &attr) { DEBUG_STREAM << "BiltCh::read_FramesPerSecond(Tango::Attribute &attr) entering... " << endl; /*----- PROTECTED REGION ID(BiltCh::read_FramesPerSecond) ENABLED START -----*/ Tango::DeviceAttribute rattr; vector values; rattr = bilt_obj->read_attribute("FramesPerSecond"); rattr >> values; frames_per_sec = values[poleNumber]; attr.set_value (&frames_per_sec); /*----- PROTECTED REGION END -----*/ // BiltCh::read_FramesPerSecond } //-------------------------------------------------------- /** * Read attribute ErrorPerSecond related method * Description: Statistic when driven by the Libera.\nThe number of errors detected per second. * * Data type: Tango::DevULong * Attr type: Scalar */ //-------------------------------------------------------- void BiltCh::read_ErrorPerSecond(Tango::Attribute &attr) { DEBUG_STREAM << "BiltCh::read_ErrorPerSecond(Tango::Attribute &attr) entering... " << endl; /*----- PROTECTED REGION ID(BiltCh::read_ErrorPerSecond) ENABLED START -----*/ Tango::DeviceAttribute rattr; vector values; rattr = bilt_obj->read_attribute("ErrorsPerSecond"); rattr >> values; errors_per_sec = values[poleNumber]; attr.set_value (&errors_per_sec); /*----- PROTECTED REGION END -----*/ // BiltCh::read_ErrorPerSecond } //-------------------------------------------------------- /** * Read attribute ErrorCounter related method * Description: Statistic when driven by the Libera.\nThe total number of errors since the last reset. * * Data type: Tango::DevULong * Attr type: Scalar */ //-------------------------------------------------------- void BiltCh::read_ErrorCounter(Tango::Attribute &attr) { DEBUG_STREAM << "BiltCh::read_ErrorCounter(Tango::Attribute &attr) entering... " << endl; /*----- PROTECTED REGION ID(BiltCh::read_ErrorCounter) ENABLED START -----*/ Tango::DeviceAttribute rattr; vector values; rattr = bilt_obj->read_attribute("ErrorCounters"); rattr >> values; error_counter = values[poleNumber]; attr.set_value (&error_counter); /*----- PROTECTED REGION END -----*/ // BiltCh::read_ErrorCounter } //-------------------------------------------------------- /** * Read attribute LocalControl related method * Description: If true the AC current can be set on the device,\notherwise it is driven by the Libera. * * Data type: Tango::DevBoolean * Attr type: Scalar */ //-------------------------------------------------------- void BiltCh::read_LocalControl(Tango::Attribute &attr) { DEBUG_STREAM << "BiltCh::read_LocalControl(Tango::Attribute &attr) entering... " << endl; /*----- PROTECTED REGION ID(BiltCh::read_LocalControl) ENABLED START -----*/ Tango::DeviceAttribute rattr; vector values; rattr = bilt_obj->read_attribute("LocalControls"); rattr >> values; local_control = values[poleNumber]; attr.set_value (&local_control); /*----- PROTECTED REGION END -----*/ // BiltCh::read_LocalControl } //-------------------------------------------------------- /** * Write attribute LocalControl related method * Description: If true the AC current can be set on the device,\notherwise it is driven by the Libera. * * Data type: Tango::DevBoolean * Attr type: Scalar */ //-------------------------------------------------------- void BiltCh::write_LocalControl(Tango::WAttribute &attr) { DEBUG_STREAM << "BiltCh::write_LocalControl(Tango::WAttribute &attr) entering... " << endl; // Retrieve write value Tango::DevBoolean w_val; attr.get_write_value(w_val); /*----- PROTECTED REGION ID(BiltCh::write_LocalControl) ENABLED START -----*/ bool local_control = w_val; Tango::DeviceData argin; vector cmd_in; cmd_in.push_back (poleNumber); if (local_control == true) cmd_in.push_back (1); else { cmd_in.push_back (0); // set back the AC current setpoint to 0! Tango::DeviceData ac_curr; vector ac_in; ac_in.push_back (poleNumber); ac_in.push_back (0); ac_curr << ac_in; bilt_obj->command_inout("SetPoleAcCurrent", ac_curr); current_ac = 0; } argin << cmd_in; bilt_obj->command_inout("LocalPoleControl", argin); /*----- PROTECTED REGION END -----*/ // BiltCh::write_LocalControl } //-------------------------------------------------------- /** * Read attribute SetCurrentAC related method * Description: The AC current setpoint in local mode. If driven by the Libera, the attribute \nattribute value in INVALID. * * Data type: Tango::DevDouble * Attr type: Scalar */ //-------------------------------------------------------- void BiltCh::read_SetCurrentAC(Tango::Attribute &attr) { DEBUG_STREAM << "BiltCh::read_SetCurrentAC(Tango::Attribute &attr) entering... " << endl; /*----- PROTECTED REGION ID(BiltCh::read_SetCurrentAC) ENABLED START -----*/ if ( local_control == false ) { attr.set_quality (Tango::ATTR_INVALID); } else { attr.set_value (¤t_ac); } /*----- PROTECTED REGION END -----*/ // BiltCh::read_SetCurrentAC } //-------------------------------------------------------- /** * Write attribute SetCurrentAC related method * Description: The AC current setpoint in local mode. If driven by the Libera, the attribute \nattribute value in INVALID. * * Data type: Tango::DevDouble * Attr type: Scalar */ //-------------------------------------------------------- void BiltCh::write_SetCurrentAC(Tango::WAttribute &attr) { DEBUG_STREAM << "BiltCh::write_SetCurrentAC(Tango::WAttribute &attr) entering... " << endl; // Retrieve write value Tango::DevDouble w_val; attr.get_write_value(w_val); /*----- PROTECTED REGION ID(BiltCh::write_SetCurrentAC) ENABLED START -----*/ if ( local_control == false ) { TangoSys_MemStream tms; tms << "Can set AC current only when local control enabled!" << endl; Tango::Except::throw_exception("WriteError", tms.str(), "Bilt::write_SetCurrentAC"); } double set_current = w_val; Tango::DeviceData argin; vector cmd_in; cmd_in.push_back (poleNumber); cmd_in.push_back (set_current); argin << cmd_in; bilt_obj->command_inout("SetPoleAcCurrent", argin); current_ac = set_current; /*----- PROTECTED REGION END -----*/ // BiltCh::write_SetCurrentAC } //-------------------------------------------------------- /** * Read attribute Temperature1 related method * Description: Temperature 1 of the pole. * * Data type: Tango::DevDouble * Attr type: Scalar */ //-------------------------------------------------------- void BiltCh::read_Temperature1(Tango::Attribute &attr) { DEBUG_STREAM << "BiltCh::read_Temperature1(Tango::Attribute &attr) entering... " << endl; /*----- PROTECTED REGION ID(BiltCh::read_Temperature1) ENABLED START -----*/ Tango::DeviceAttribute rattr; vector temps; rattr = bilt_obj->read_attribute("Temperatures"); rattr >> temps; temp1 = temps[poleNumber * 2]; attr.set_value (&temp1); /*----- PROTECTED REGION END -----*/ // BiltCh::read_Temperature1 } //-------------------------------------------------------- /** * Read attribute Temperature2 related method * Description: Temperature 2 of the pole. * * Data type: Tango::DevDouble * Attr type: Scalar */ //-------------------------------------------------------- void BiltCh::read_Temperature2(Tango::Attribute &attr) { DEBUG_STREAM << "BiltCh::read_Temperature2(Tango::Attribute &attr) entering... " << endl; /*----- PROTECTED REGION ID(BiltCh::read_Temperature2) ENABLED START -----*/ Tango::DeviceAttribute rattr; vector temps; rattr = bilt_obj->read_attribute("Temperatures"); rattr >> temps; temp2 = temps[(poleNumber * 2) + 1]; attr.set_value (&temp2); /*----- PROTECTED REGION END -----*/ // BiltCh::read_Temperature2 } //-------------------------------------------------------- /** * Method : BiltCh::add_dynamic_attributes() * Description : Create the dynamic attributes if any * for specified device. */ //-------------------------------------------------------- void BiltCh::add_dynamic_attributes() { /*----- PROTECTED REGION ID(BiltCh::add_dynamic_attributes) ENABLED START -----*/ // Add your own code to create and add dynamic attributes if any /*----- PROTECTED REGION END -----*/ // BiltCh::add_dynamic_attributes } //-------------------------------------------------------- /** * Command State related method * Description: This command gets the device state (stored in its device_state data member) and returns it to the caller. * * @param argin none. * @returns State Code */ //-------------------------------------------------------- Tango::DevState BiltCh::dev_state() { DEBUG_STREAM << "BiltCh::State() - " << device_name << endl; /*----- PROTECTED REGION ID(BiltCh::dev_state) ENABLED START -----*/ Tango::DevState argout = Tango::UNKNOWN; // replace by your own algorithm // Add your own code if ( bilt_init == true ) { Tango::DeviceAttribute rattr; Tango::DevState bilt_state; rattr = bilt_obj->read_attribute("State"); rattr >> bilt_state; set_state (bilt_state); } argout = get_state(); /*----- PROTECTED REGION END -----*/ // BiltCh::dev_state set_state(argout); // Give the state to Tango. if (argout!=Tango::ALARM) DeviceImpl::dev_state(); return get_state(); // Return it after Tango management. } //-------------------------------------------------------- /** * Command Status related method * Description: This command gets the device status (stored in its device_status data member) and returns it to the caller. * * @param argin none. * @returns Status description */ //-------------------------------------------------------- Tango::ConstDevString BiltCh::dev_status() { DEBUG_STREAM << "BiltCh::Status() - " << device_name << endl; /*----- PROTECTED REGION ID(BiltCh::dev_status) ENABLED START -----*/ string status = "Device is OK"; // Add your own code string bilt_status; if ( bilt_init == true ) { Tango::DeviceAttribute rattr; rattr = bilt_obj->read_attribute("Status"); rattr >> bilt_status; } else { bilt_status = "Error during initialisation: \n"; for (short i = 0; icommand_inout("On"); /*----- PROTECTED REGION END -----*/ // BiltCh::on } //-------------------------------------------------------- /** * Command Off related method * Description: Switch Off all three channels of the Bilt power supply * * @param argin * @returns */ //-------------------------------------------------------- void BiltCh::off() { DEBUG_STREAM << "BiltCh::Off() - " << device_name << endl; /*----- PROTECTED REGION ID(BiltCh::off) ENABLED START -----*/ // Add your own code bilt_obj->command_inout("Off"); /*----- PROTECTED REGION END -----*/ // BiltCh::off } //-------------------------------------------------------- /** * Command Reset related method * Description: Send a reset to the Bilt power supply * * @param argin * @returns */ //-------------------------------------------------------- void BiltCh::reset() { DEBUG_STREAM << "BiltCh::Reset() - " << device_name << endl; /*----- PROTECTED REGION ID(BiltCh::reset) ENABLED START -----*/ // Add your own code bilt_obj->command_inout("Reset"); /*----- PROTECTED REGION END -----*/ // BiltCh::reset } /*----- PROTECTED REGION ID(BiltCh::namespace_ending) ENABLED START -----*/ // Additional Methods /*----- PROTECTED REGION END -----*/ // BiltCh::namespace_ending } // namespace Node-path: powersupply/itest/BiltCh/trunk/BiltCh.h Node-kind: file Node-action: change Text-content-length: 10468 Text-content-md5: 0da0e0b1ea1f4b7e8cce058678980327 Content-length: 10468 /*----- PROTECTED REGION ID(BiltCh.h) ENABLED START -----*/ //============================================================================= // // file : BiltCh.h // // description : Include file for the BiltCh class // // project : BILT channel interface // // This file is part of Tango device class. // // Tango 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. // // Tango 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 Tango. If not, see . // // $Author: meyer $ // // $Revision: 1.7 $ // $Date: 2013-01-09 15:13:59 $ // // $HeadURL: $ // //============================================================================= // This file is generated by POGO // (Program Obviously used to Generate tango Object) //============================================================================= #ifndef BiltCh_H #define BiltCh_H #include // Number of poles per magnet #define POLES 3 /*----- PROTECTED REGION END -----*/ // BiltCh.h /** * BiltCh class description: * The Bilt multi channel power supply has three individual channels. * This class offers an interface to an individual channel of the power supply. */ namespace BiltCh_ns { /*----- PROTECTED REGION ID(BiltCh::Additional Class Declarations) ENABLED START -----*/ // Additional Class Declarations /*----- PROTECTED REGION END -----*/ // BiltCh::Additional Class Declarations class BiltCh : public Tango::Device_4Impl { /*----- PROTECTED REGION ID(BiltCh::Data Members) ENABLED START -----*/ // Add your own data members public: /*----- PROTECTED REGION END -----*/ // BiltCh::Data Members // Device property data members public: // BiltName: Name of the Bilt multi channel power supply device string biltName; // PoleNumber: The number of the channel or Pole of the Bilt power supply [0 -2] Tango::DevShort poleNumber; // Attribute data members public: Tango::DevDouble *attr_Current_read; Tango::DevDouble *attr_Voltage_read; Tango::DevDouble *attr_Impedance_read; Tango::DevDouble *attr_SetCurrentRMS_read; Tango::DevDouble *attr_SetCurrentAverage_read; Tango::DevULong *attr_FramesPerSecond_read; Tango::DevULong *attr_ErrorPerSecond_read; Tango::DevULong *attr_ErrorCounter_read; Tango::DevBoolean *attr_LocalControl_read; Tango::DevDouble *attr_SetCurrentAC_read; Tango::DevDouble *attr_Temperature1_read; Tango::DevDouble *attr_Temperature2_read; // Constructors and destructors public: /** * Constructs a newly device object. * * @param cl Class. * @param s Device Name */ BiltCh(Tango::DeviceClass *cl,string &s); /** * Constructs a newly device object. * * @param cl Class. * @param s Device Name */ BiltCh(Tango::DeviceClass *cl,const char *s); /** * Constructs a newly device object. * * @param cl Class. * @param s Device name * @param d Device description. */ BiltCh(Tango::DeviceClass *cl,const char *s,const char *d); /** * The device object destructor. */ ~BiltCh() {delete_device();}; // Miscellaneous methods public: /** * will be called at device destruction or at init command. */ void delete_device(); /** * Initialize the device */ virtual void init_device(); /** * Read the device properties from database */ void get_device_property(); /** * Always executed method before execution command method. */ virtual void always_executed_hook(); // Attribute methods public: //-------------------------------------------------------- /** * Method : BiltCh::read_attr_hardware() * Description : Hardware acquisition for attributes. */ //-------------------------------------------------------- virtual void read_attr_hardware(vector &attr_list); /** * Attribute Current related methods * Description: The DC current of the selected pole. * * Data type: Tango::DevDouble * Attr type: Scalar */ virtual void read_Current(Tango::Attribute &attr); virtual void write_Current(Tango::WAttribute &attr); virtual bool is_Current_allowed(Tango::AttReqType type); /** * Attribute Voltage related methods * Description: The measured voltage of the selected pole. * * Data type: Tango::DevDouble * Attr type: Scalar */ virtual void read_Voltage(Tango::Attribute &attr); virtual bool is_Voltage_allowed(Tango::AttReqType type); /** * Attribute Impedance related methods * Description: Calculated impedance of the selected pole. * * Data type: Tango::DevDouble * Attr type: Scalar */ virtual void read_Impedance(Tango::Attribute &attr); virtual bool is_Impedance_allowed(Tango::AttReqType type); /** * Attribute SetCurrentRMS related methods * Description: Statistic when driven by the Libera.\nRMS value of the AC setpoint applied on the DAC during the last second.\nX=sqr( (sum(setAC)*sum(setAC)) / n - ((sum(setAC)/n) *(sum(setAC)/n)) ) * * Data type: Tango::DevDouble * Attr type: Scalar */ virtual void read_SetCurrentRMS(Tango::Attribute &attr); virtual bool is_SetCurrentRMS_allowed(Tango::AttReqType type); /** * Attribute SetCurrentAverage related methods * Description: Statistic when driven by the Libera.\nThe average AC setpoint applied to the DAC during the last second.\nX=SUM(setAC)/n * * Data type: Tango::DevDouble * Attr type: Scalar */ virtual void read_SetCurrentAverage(Tango::Attribute &attr); virtual bool is_SetCurrentAverage_allowed(Tango::AttReqType type); /** * Attribute FramesPerSecond related methods * Description: Statistic when driven by the Libera.\nThe number of setpoints per second. * * Data type: Tango::DevULong * Attr type: Scalar */ virtual void read_FramesPerSecond(Tango::Attribute &attr); virtual bool is_FramesPerSecond_allowed(Tango::AttReqType type); /** * Attribute ErrorPerSecond related methods * Description: Statistic when driven by the Libera.\nThe number of errors detected per second. * * Data type: Tango::DevULong * Attr type: Scalar */ virtual void read_ErrorPerSecond(Tango::Attribute &attr); virtual bool is_ErrorPerSecond_allowed(Tango::AttReqType type); /** * Attribute ErrorCounter related methods * Description: Statistic when driven by the Libera.\nThe total number of errors since the last reset. * * Data type: Tango::DevULong * Attr type: Scalar */ virtual void read_ErrorCounter(Tango::Attribute &attr); virtual bool is_ErrorCounter_allowed(Tango::AttReqType type); /** * Attribute LocalControl related methods * Description: If true the AC current can be set on the device,\notherwise it is driven by the Libera. * * Data type: Tango::DevBoolean * Attr type: Scalar */ virtual void read_LocalControl(Tango::Attribute &attr); virtual void write_LocalControl(Tango::WAttribute &attr); virtual bool is_LocalControl_allowed(Tango::AttReqType type); /** * Attribute SetCurrentAC related methods * Description: The AC current setpoint in local mode. If driven by the Libera, the attribute \nattribute value in INVALID. * * Data type: Tango::DevDouble * Attr type: Scalar */ virtual void read_SetCurrentAC(Tango::Attribute &attr); virtual void write_SetCurrentAC(Tango::WAttribute &attr); virtual bool is_SetCurrentAC_allowed(Tango::AttReqType type); /** * Attribute Temperature1 related methods * Description: Temperature 1 of the pole. * * Data type: Tango::DevDouble * Attr type: Scalar */ virtual void read_Temperature1(Tango::Attribute &attr); virtual bool is_Temperature1_allowed(Tango::AttReqType type); /** * Attribute Temperature2 related methods * Description: Temperature 2 of the pole. * * Data type: Tango::DevDouble * Attr type: Scalar */ virtual void read_Temperature2(Tango::Attribute &attr); virtual bool is_Temperature2_allowed(Tango::AttReqType type); //-------------------------------------------------------- /** * Method : BiltCh::add_dynamic_attributes() * Description : Add dynamic attributes if any. */ //-------------------------------------------------------- void add_dynamic_attributes(); // Command related methods public: /** * Command State related method * Description: This command gets the device state (stored in its device_state data member) and returns it to the caller. * * @param argin none. * @returns State Code */ virtual Tango::DevState dev_state(); /** * Command Status related method * Description: This command gets the device status (stored in its device_status data member) and returns it to the caller. * * @param argin none. * @returns Status description */ virtual Tango::ConstDevString dev_status(); /** * Command On related method * Description: Switch ON all three channels of the Bilt power supply * * @param argin * @returns */ virtual void on(); virtual bool is_On_allowed(const CORBA::Any &any); /** * Command Off related method * Description: Switch Off all three channels of the Bilt power supply * * @param argin * @returns */ virtual void off(); virtual bool is_Off_allowed(const CORBA::Any &any); /** * Command Reset related method * Description: Send a reset to the Bilt power supply * * @param argin * @returns */ virtual void reset(); virtual bool is_Reset_allowed(const CORBA::Any &any); /*----- PROTECTED REGION ID(BiltCh::Additional Method prototypes) ENABLED START -----*/ // Additional Method prototypes protected : Tango::DeviceProxy *bilt_obj; Tango::DevErrorList bilt_error; bool bilt_init; double current; double voltage; double impedance; double current_rms; double current_average; Tango::DevULong error_counter; Tango::DevULong errors_per_sec; Tango::DevULong frames_per_sec; bool local_control; double current_ac; double temp1; double temp2; /*----- PROTECTED REGION END -----*/ // BiltCh::Additional Method prototypes }; /*----- PROTECTED REGION ID(BiltCh::Additional Classes Definitions) ENABLED START -----*/ // Additional Classes Definitions /*----- PROTECTED REGION END -----*/ // BiltCh::Additional Classes Definitions } // End of namespace #endif // BiltCh_H Node-path: powersupply/itest/BiltCh/trunk/BiltCh.xmi Node-kind: file Node-action: change Text-content-length: 13344 Text-content-md5: 6cdf8df5e3c66a19708a56699152a2ad Content-length: 13344 none -1 Node-path: powersupply/itest/BiltCh/trunk/BiltChClass.cpp Node-kind: file Node-action: change Text-content-length: 32031 Text-content-md5: c0acc35654f304db8405d64b4871e0f3 Content-length: 32031 /*----- PROTECTED REGION ID(BiltChClass.cpp) ENABLED START -----*/ static const char *RcsId = "$Id: BiltChClass.cpp,v 1.8 2013-01-09 15:13:59 meyer Exp $"; static const char *TagName = "$Name: not supported by cvs2svn $"; static const char *CvsPath = "$Source: /segfs/tango/cvsroot/cppserver/machine/powersupply/SrSteerers/tango/BiltCh/BiltChClass.cpp,v $"; static const char *SvnPath = "$HeadURL: $"; static const char *HttpServer = "http://www.esrf.eu/computing/cs/tango/tango_doc/ds_doc/"; //============================================================================= // // file : BiltChClass.cpp // // description : C++ source for the BiltChClass. // A singleton class derived from DeviceClass. // It implements the command and attribute list // and all properties and methods required // by the BiltCh once per process. // // project : BILT channel interface // // This file is part of Tango device class. // // Tango 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. // // Tango 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 Tango. If not, see . // // $Author: meyer $ // // $Revision: 1.8 $ // $Date: 2013-01-09 15:13:59 $ // // $HeadURL: $ // //============================================================================= // This file is generated by POGO // (Program Obviously used to Generate tango Object) //============================================================================= #include #include #include /*----- PROTECTED REGION END -----*/ // BiltChClass.cpp //------------------------------------------------------------------- /** * Create BiltChClass singleton and * return it in a C function for Python usage */ //------------------------------------------------------------------- extern "C" { #ifdef _TG_WINDOWS_ __declspec(dllexport) #endif Tango::DeviceClass *_create_BiltCh_class(const char *name) { return BiltCh_ns::BiltChClass::init(name); } } namespace BiltCh_ns { //=================================================================== // Initialize pointer for singleton pattern //=================================================================== BiltChClass *BiltChClass::_instance = NULL; //-------------------------------------------------------- /** * method : BiltChClass::BiltChClass(string &s) * description : constructor for the BiltChClass * * @param s The class name */ //-------------------------------------------------------- BiltChClass::BiltChClass(string &s):Tango::DeviceClass(s) { cout2 << "Entering BiltChClass constructor" << endl; set_default_property(); write_class_property(); /*----- PROTECTED REGION ID(BiltChClass::constructor) ENABLED START -----*/ /*----- PROTECTED REGION END -----*/ // BiltChClass::constructor cout2 << "Leaving BiltChClass constructor" << endl; } //-------------------------------------------------------- /** * method : BiltChClass::~BiltChClass() * description : destructor for the BiltChClass */ //-------------------------------------------------------- BiltChClass::~BiltChClass() { /*----- PROTECTED REGION ID(BiltChClass::destructor) ENABLED START -----*/ /*----- PROTECTED REGION END -----*/ // BiltChClass::destructor _instance = NULL; } //-------------------------------------------------------- /** * method : BiltChClass::init * description : Create the object if not already done. * Otherwise, just return a pointer to the object * * @param name The class name */ //-------------------------------------------------------- BiltChClass *BiltChClass::init(const char *name) { if (_instance == NULL) { try { string s(name); _instance = new BiltChClass(s); } catch (bad_alloc) { throw; } } return _instance; } //-------------------------------------------------------- /** * method : BiltChClass::instance * description : Check if object already created, * and return a pointer to the object */ //-------------------------------------------------------- BiltChClass *BiltChClass::instance() { if (_instance == NULL) { cerr << "Class is not initialised !!" << endl; exit(-1); } return _instance; } //=================================================================== // Command execution method calls //=================================================================== //-------------------------------------------------------- /** * method : OnClass::execute() * description : method to trigger the execution of the command. * * @param device The device on which the command must be executed * @param in_any The command input data * * returns The command output data (packed in the Any object) */ //-------------------------------------------------------- CORBA::Any *OnClass::execute(Tango::DeviceImpl *device, TANGO_UNUSED(const CORBA::Any &in_any)) { cout2 << "OnClass::execute(): arrived" << endl; ((static_cast(device))->on()); return new CORBA::Any(); } //-------------------------------------------------------- /** * method : OffClass::execute() * description : method to trigger the execution of the command. * * @param device The device on which the command must be executed * @param in_any The command input data * * returns The command output data (packed in the Any object) */ //-------------------------------------------------------- CORBA::Any *OffClass::execute(Tango::DeviceImpl *device, TANGO_UNUSED(const CORBA::Any &in_any)) { cout2 << "OffClass::execute(): arrived" << endl; ((static_cast(device))->off()); return new CORBA::Any(); } //-------------------------------------------------------- /** * method : ResetClass::execute() * description : method to trigger the execution of the command. * * @param device The device on which the command must be executed * @param in_any The command input data * * returns The command output data (packed in the Any object) */ //-------------------------------------------------------- CORBA::Any *ResetClass::execute(Tango::DeviceImpl *device, TANGO_UNUSED(const CORBA::Any &in_any)) { cout2 << "ResetClass::execute(): arrived" << endl; ((static_cast(device))->reset()); return new CORBA::Any(); } //=================================================================== // Properties management //=================================================================== //-------------------------------------------------------- /** * Method : BiltChClass::get_class_property() * Description : Get the class property for specified name. */ //-------------------------------------------------------- Tango::DbDatum BiltChClass::get_class_property(string &prop_name) { for (unsigned int i=0 ; i vect_data; // Set Default Class Properties // Set Default device Properties prop_name = "BiltName"; prop_desc = "Name of the Bilt multi channel power supply device"; prop_def = "none"; vect_data.clear(); vect_data.push_back("none"); if (prop_def.length()>0) { Tango::DbDatum data(prop_name); data << vect_data ; dev_def_prop.push_back(data); add_wiz_dev_prop(prop_name, prop_desc, prop_def); } else add_wiz_dev_prop(prop_name, prop_desc); prop_name = "PoleNumber"; prop_desc = "The number of the channel or Pole of the Bilt power supply [0 -2]"; prop_def = "-1"; vect_data.clear(); vect_data.push_back("-1"); if (prop_def.length()>0) { Tango::DbDatum data(prop_name); data << vect_data ; dev_def_prop.push_back(data); add_wiz_dev_prop(prop_name, prop_desc, prop_def); } else add_wiz_dev_prop(prop_name, prop_desc); } //-------------------------------------------------------- /** * Method : BiltChClass::write_class_property() * Description : Set class description fields as property in database */ //-------------------------------------------------------- void BiltChClass::write_class_property() { // First time, check if database used if (Tango::Util::_UseDb == false) return; Tango::DbData data; string classname = get_name(); string header; string::size_type start, end; // Put title Tango::DbDatum title("ProjectTitle"); string str_title("BILT channel interface"); title << str_title; data.push_back(title); // Put Description Tango::DbDatum description("Description"); vector str_desc; str_desc.push_back("The Bilt multi channel power supply has three individual channels."); str_desc.push_back("This class offers an interface to an individual channel of the power supply."); description << str_desc; data.push_back(description); // put cvs or svn location string filename("BiltCh"); filename += "Class.cpp"; // check for cvs information string src_path(CvsPath); start = src_path.find("/"); if (start!=string::npos) { end = src_path.find(filename); if (end>start) { string strloc = src_path.substr(start, end-start); // Check if specific repository start = strloc.find("/cvsroot/"); if (start!=string::npos && start>0) { string repository = strloc.substr(0, start); if (repository.find("/segfs/")!=string::npos) strloc = "ESRF:" + strloc.substr(start, strloc.length()-start); } Tango::DbDatum cvs_loc("cvs_location"); cvs_loc << strloc; data.push_back(cvs_loc); } } // check for svn information else { string src_path(SvnPath); start = src_path.find("://"); if (start!=string::npos) { end = src_path.find(filename); if (end>start) { header = "$HeadURL: "; start = header.length(); string strloc = src_path.substr(start, (end-start)); Tango::DbDatum svn_loc("svn_location"); svn_loc << strloc; data.push_back(svn_loc); } } } // Get CVS or SVN revision tag // CVS tag string tagname(TagName); header = "$Name: "; start = header.length(); string endstr(" $"); end = tagname.find(endstr); if (end!=string::npos && end>start) { string strtag = tagname.substr(start, end-start); Tango::DbDatum cvs_tag("cvs_tag"); cvs_tag << strtag; data.push_back(cvs_tag); } // SVN tag string svnpath(SvnPath); header = "$HeadURL: "; start = header.length(); end = svnpath.find(endstr); if (end!=string::npos && end>start) { string strloc = svnpath.substr(start, end-start); string tagstr ("/tags/"); start = strloc.find(tagstr); if ( start!=string::npos ) { start = start + tagstr.length(); end = strloc.find(filename); string strtag = strloc.substr(start, end-start-1); Tango::DbDatum svn_tag("svn_tag"); svn_tag << strtag; data.push_back(svn_tag); } } // Get URL location string httpServ(HttpServer); if (httpServ.length()>0) { Tango::DbDatum db_doc_url("doc_url"); db_doc_url << httpServ; data.push_back(db_doc_url); } // Put inheritance Tango::DbDatum inher_datum("InheritedFrom"); vector inheritance; inheritance.push_back("Tango::Device_4Impl"); inher_datum << inheritance; data.push_back(inher_datum); // Call database and and values get_db_class()->put_property(data); } //=================================================================== // Factory methods //=================================================================== //-------------------------------------------------------- /** * Method : BiltChClass::device_factory() * Description : Create the device object(s) * and store them in the device list */ //-------------------------------------------------------- void BiltChClass::device_factory(const Tango::DevVarStringArray *devlist_ptr) { /*----- PROTECTED REGION ID(BiltChClass::device_factory_before) ENABLED START -----*/ // Add your own code /*----- PROTECTED REGION END -----*/ // BiltChClass::device_factory_before // Create devices and add it into the device list for (unsigned long i=0 ; ilength() ; i++) { cout4 << "Device name : " << (*devlist_ptr)[i].in() << endl; device_list.push_back(new BiltCh(this, (*devlist_ptr)[i])); } // Manage dynamic attributes if any erase_dynamic_attributes(devlist_ptr, get_class_attr()->get_attr_list()); // Export devices to the outside world for (unsigned long i=1 ; i<=devlist_ptr->length() ; i++) { // Add dynamic attributes if any BiltCh *dev = static_cast(device_list[device_list.size()-i]); dev->add_dynamic_attributes(); // Check before if database used. if ((Tango::Util::_UseDb == true) && (Tango::Util::_FileDb == false)) export_device(dev); else export_device(dev, dev->get_name().c_str()); } /*----- PROTECTED REGION ID(BiltChClass::device_factory_after) ENABLED START -----*/ // Add your own code /*----- PROTECTED REGION END -----*/ // BiltChClass::device_factory_after } //-------------------------------------------------------- /** * Method : BiltChClass::attribute_factory() * Description : Create the attribute object(s) * and store them in the attribute list */ //-------------------------------------------------------- void BiltChClass::attribute_factory(vector &att_list) { /*----- PROTECTED REGION ID(BiltChClass::attribute_factory_before) ENABLED START -----*/ // Add your own code /*----- PROTECTED REGION END -----*/ // BiltChClass::attribute_factory_before // Attribute : Current CurrentAttrib *current = new CurrentAttrib(); Tango::UserDefaultAttrProp current_prop; current_prop.set_description("The DC current of the selected pole."); current_prop.set_label("DC Current"); current_prop.set_unit("A"); // standard_unit not set for Current // display_unit not set for Current current_prop.set_format("%6.4f"); current_prop.set_max_value("1.8"); current_prop.set_min_value("-1.8"); // max_alarm not set for Current // min_alarm not set for Current // max_warning not set for Current // min_warning not set for Current // delta_t not set for Current // delta_val not set for Current current->set_default_properties(current_prop); current->set_polling_period(0); current->set_disp_level(Tango::OPERATOR); // Not Memorized att_list.push_back(current); // Attribute : Voltage VoltageAttrib *voltage = new VoltageAttrib(); Tango::UserDefaultAttrProp voltage_prop; voltage_prop.set_description("The measured voltage of the selected pole."); voltage_prop.set_label("Voltage"); voltage_prop.set_unit("V"); // standard_unit not set for Voltage // display_unit not set for Voltage voltage_prop.set_format("%6.4f"); // max_value not set for Voltage // min_value not set for Voltage // max_alarm not set for Voltage // min_alarm not set for Voltage // max_warning not set for Voltage // min_warning not set for Voltage // delta_t not set for Voltage // delta_val not set for Voltage voltage->set_default_properties(voltage_prop); voltage->set_polling_period(0); voltage->set_disp_level(Tango::OPERATOR); // Not Memorized att_list.push_back(voltage); // Attribute : Impedance ImpedanceAttrib *impedance = new ImpedanceAttrib(); Tango::UserDefaultAttrProp impedance_prop; impedance_prop.set_description("Calculated impedance of the selected pole."); impedance_prop.set_label("Impedance"); impedance_prop.set_unit("Ohm"); // standard_unit not set for Impedance // display_unit not set for Impedance impedance_prop.set_format("%4.2f"); // max_value not set for Impedance // min_value not set for Impedance impedance_prop.set_max_alarm("5.0"); impedance_prop.set_min_alarm("2.8"); // max_warning not set for Impedance // min_warning not set for Impedance // delta_t not set for Impedance // delta_val not set for Impedance impedance->set_default_properties(impedance_prop); impedance->set_polling_period(0); impedance->set_disp_level(Tango::OPERATOR); // Not Memorized att_list.push_back(impedance); // Attribute : SetCurrentRMS SetCurrentRMSAttrib *setcurrentrms = new SetCurrentRMSAttrib(); Tango::UserDefaultAttrProp setcurrentrms_prop; setcurrentrms_prop.set_description("Statistic when driven by the Libera.\nRMS value of the AC setpoint applied on the DAC during the last second.\nX=sqr( (sum(setAC)*sum(setAC)) / n - ((sum(setAC)/n) *(sum(setAC)/n)) )"); setcurrentrms_prop.set_label("RMS AC current setpoint/s"); setcurrentrms_prop.set_unit("mA"); // standard_unit not set for SetCurrentRMS // display_unit not set for SetCurrentRMS setcurrentrms_prop.set_format("%6.3f"); // max_value not set for SetCurrentRMS // min_value not set for SetCurrentRMS // max_alarm not set for SetCurrentRMS // min_alarm not set for SetCurrentRMS // max_warning not set for SetCurrentRMS // min_warning not set for SetCurrentRMS // delta_t not set for SetCurrentRMS // delta_val not set for SetCurrentRMS setcurrentrms->set_default_properties(setcurrentrms_prop); setcurrentrms->set_polling_period(0); setcurrentrms->set_disp_level(Tango::OPERATOR); // Not Memorized att_list.push_back(setcurrentrms); // Attribute : SetCurrentAverage SetCurrentAverageAttrib *setcurrentaverage = new SetCurrentAverageAttrib(); Tango::UserDefaultAttrProp setcurrentaverage_prop; setcurrentaverage_prop.set_description("Statistic when driven by the Libera.\nThe average AC setpoint applied to the DAC during the last second.\nX=SUM(setAC)/n"); setcurrentaverage_prop.set_label("Average AC current setpoint/s"); setcurrentaverage_prop.set_unit("mA"); // standard_unit not set for SetCurrentAverage // display_unit not set for SetCurrentAverage setcurrentaverage_prop.set_format("%6.3f"); // max_value not set for SetCurrentAverage // min_value not set for SetCurrentAverage // max_alarm not set for SetCurrentAverage // min_alarm not set for SetCurrentAverage // max_warning not set for SetCurrentAverage // min_warning not set for SetCurrentAverage // delta_t not set for SetCurrentAverage // delta_val not set for SetCurrentAverage setcurrentaverage->set_default_properties(setcurrentaverage_prop); setcurrentaverage->set_polling_period(0); setcurrentaverage->set_disp_level(Tango::OPERATOR); // Not Memorized att_list.push_back(setcurrentaverage); // Attribute : FramesPerSecond FramesPerSecondAttrib *framespersecond = new FramesPerSecondAttrib(); Tango::UserDefaultAttrProp framespersecond_prop; framespersecond_prop.set_description("Statistic when driven by the Libera.\nThe number of setpoints per second."); framespersecond_prop.set_label("Frames/s"); framespersecond_prop.set_unit(" "); // standard_unit not set for FramesPerSecond // display_unit not set for FramesPerSecond framespersecond_prop.set_format("%3d"); // max_value not set for FramesPerSecond // min_value not set for FramesPerSecond // max_alarm not set for FramesPerSecond // min_alarm not set for FramesPerSecond // max_warning not set for FramesPerSecond // min_warning not set for FramesPerSecond // delta_t not set for FramesPerSecond // delta_val not set for FramesPerSecond framespersecond->set_default_properties(framespersecond_prop); framespersecond->set_polling_period(0); framespersecond->set_disp_level(Tango::OPERATOR); // Not Memorized att_list.push_back(framespersecond); // Attribute : ErrorPerSecond ErrorPerSecondAttrib *errorpersecond = new ErrorPerSecondAttrib(); Tango::UserDefaultAttrProp errorpersecond_prop; errorpersecond_prop.set_description("Statistic when driven by the Libera.\nThe number of errors detected per second."); errorpersecond_prop.set_label("Errors/s"); errorpersecond_prop.set_unit(" "); // standard_unit not set for ErrorPerSecond // display_unit not set for ErrorPerSecond errorpersecond_prop.set_format("%3d"); // max_value not set for ErrorPerSecond // min_value not set for ErrorPerSecond // max_alarm not set for ErrorPerSecond // min_alarm not set for ErrorPerSecond // max_warning not set for ErrorPerSecond // min_warning not set for ErrorPerSecond // delta_t not set for ErrorPerSecond // delta_val not set for ErrorPerSecond errorpersecond->set_default_properties(errorpersecond_prop); errorpersecond->set_polling_period(0); errorpersecond->set_disp_level(Tango::OPERATOR); // Not Memorized att_list.push_back(errorpersecond); // Attribute : ErrorCounter ErrorCounterAttrib *errorcounter = new ErrorCounterAttrib(); Tango::UserDefaultAttrProp errorcounter_prop; errorcounter_prop.set_description("Statistic when driven by the Libera.\nThe total number of errors since the last reset."); errorcounter_prop.set_label("Error Counter"); errorcounter_prop.set_unit(" "); // standard_unit not set for ErrorCounter // display_unit not set for ErrorCounter errorcounter_prop.set_format("%6d"); // max_value not set for ErrorCounter // min_value not set for ErrorCounter // max_alarm not set for ErrorCounter // min_alarm not set for ErrorCounter // max_warning not set for ErrorCounter // min_warning not set for ErrorCounter // delta_t not set for ErrorCounter // delta_val not set for ErrorCounter errorcounter->set_default_properties(errorcounter_prop); errorcounter->set_polling_period(0); errorcounter->set_disp_level(Tango::OPERATOR); // Not Memorized att_list.push_back(errorcounter); // Attribute : LocalControl LocalControlAttrib *localcontrol = new LocalControlAttrib(); Tango::UserDefaultAttrProp localcontrol_prop; localcontrol_prop.set_description("If true the AC current can be set on the device,\notherwise it is driven by the Libera."); localcontrol_prop.set_label("Local Control"); localcontrol_prop.set_unit(" "); // standard_unit not set for LocalControl // display_unit not set for LocalControl // format not set for LocalControl // max_value not set for LocalControl // min_value not set for LocalControl // max_alarm not set for LocalControl // min_alarm not set for LocalControl // max_warning not set for LocalControl // min_warning not set for LocalControl // delta_t not set for LocalControl // delta_val not set for LocalControl localcontrol->set_default_properties(localcontrol_prop); localcontrol->set_polling_period(0); localcontrol->set_disp_level(Tango::OPERATOR); // Not Memorized att_list.push_back(localcontrol); // Attribute : SetCurrentAC SetCurrentACAttrib *setcurrentac = new SetCurrentACAttrib(); Tango::UserDefaultAttrProp setcurrentac_prop; setcurrentac_prop.set_description("The AC current setpoint in local mode. If driven by the Libera, the attribute \nattribute value in INVALID."); setcurrentac_prop.set_label("AC Current Setpoint"); setcurrentac_prop.set_unit("A"); // standard_unit not set for SetCurrentAC // display_unit not set for SetCurrentAC setcurrentac_prop.set_format("%5.4f"); setcurrentac_prop.set_max_value("0.2"); setcurrentac_prop.set_min_value("-0.2"); // max_alarm not set for SetCurrentAC // min_alarm not set for SetCurrentAC // max_warning not set for SetCurrentAC // min_warning not set for SetCurrentAC // delta_t not set for SetCurrentAC // delta_val not set for SetCurrentAC setcurrentac->set_default_properties(setcurrentac_prop); setcurrentac->set_polling_period(0); setcurrentac->set_disp_level(Tango::OPERATOR); // Not Memorized att_list.push_back(setcurrentac); // Attribute : Temperature1 Temperature1Attrib *temperature1 = new Temperature1Attrib(); Tango::UserDefaultAttrProp temperature1_prop; temperature1_prop.set_description("Temperature 1 of the pole."); temperature1_prop.set_label("Temperature 1"); temperature1_prop.set_unit("C"); // standard_unit not set for Temperature1 // display_unit not set for Temperature1 temperature1_prop.set_format("%6.0f"); // max_value not set for Temperature1 // min_value not set for Temperature1 // max_alarm not set for Temperature1 // min_alarm not set for Temperature1 // max_warning not set for Temperature1 // min_warning not set for Temperature1 // delta_t not set for Temperature1 // delta_val not set for Temperature1 temperature1->set_default_properties(temperature1_prop); temperature1->set_polling_period(0); temperature1->set_disp_level(Tango::OPERATOR); // Not Memorized att_list.push_back(temperature1); // Attribute : Temperature2 Temperature2Attrib *temperature2 = new Temperature2Attrib(); Tango::UserDefaultAttrProp temperature2_prop; temperature2_prop.set_description("Temperature 2 of the pole."); temperature2_prop.set_label("Temperature 2"); temperature2_prop.set_unit("C"); // standard_unit not set for Temperature2 // display_unit not set for Temperature2 temperature2_prop.set_format("%6.0f"); // max_value not set for Temperature2 // min_value not set for Temperature2 // max_alarm not set for Temperature2 // min_alarm not set for Temperature2 // max_warning not set for Temperature2 // min_warning not set for Temperature2 // delta_t not set for Temperature2 // delta_val not set for Temperature2 temperature2->set_default_properties(temperature2_prop); temperature2->set_polling_period(0); temperature2->set_disp_level(Tango::OPERATOR); // Not Memorized att_list.push_back(temperature2); // Create a list of static attributes create_static_attribute_list(get_class_attr()->get_attr_list()); /*----- PROTECTED REGION ID(BiltChClass::attribute_factory_after) ENABLED START -----*/ // Add your own code /*----- PROTECTED REGION END -----*/ // BiltChClass::attribute_factory_after } //-------------------------------------------------------- /** * Method : BiltChClass::command_factory() * Description : Create the command object(s) * and store them in the command list */ //-------------------------------------------------------- void BiltChClass::command_factory() { /*----- PROTECTED REGION ID(BiltChClass::command_factory_before) ENABLED START -----*/ // Add your own code /*----- PROTECTED REGION END -----*/ // BiltChClass::command_factory_before OnClass *pOnCmd = new OnClass("On", Tango::DEV_VOID, Tango::DEV_VOID, "", "", Tango::EXPERT); command_list.push_back(pOnCmd); OffClass *pOffCmd = new OffClass("Off", Tango::DEV_VOID, Tango::DEV_VOID, "", "", Tango::EXPERT); command_list.push_back(pOffCmd); ResetClass *pResetCmd = new ResetClass("Reset", Tango::DEV_VOID, Tango::DEV_VOID, "", "", Tango::EXPERT); command_list.push_back(pResetCmd); /*----- PROTECTED REGION ID(BiltChClass::command_factory_after) ENABLED START -----*/ // Add your own code /*----- PROTECTED REGION END -----*/ // BiltChClass::command_factory_after } //=================================================================== // Dynamic attributes related methods //=================================================================== //-------------------------------------------------------- /** * method : BiltChClass::create_static_attribute_list * description : Create the a list of static attributes * * @param att_list the ceated attribute list */ //-------------------------------------------------------- void BiltChClass::create_static_attribute_list(vector &att_list) { for (unsigned long i=0 ; iget_name()); transform(att_name.begin(), att_name.end(), att_name.begin(), ::tolower); defaultAttList.push_back(att_name); } cout2 << defaultAttList.size() << " attributes in default list" << endl; /*----- PROTECTED REGION ID(BiltChClass::create_static_att_list) ENABLED START -----*/ /*----- PROTECTED REGION END -----*/ // BiltChClass::create_static_att_list } //-------------------------------------------------------- /** * method : BiltChClass::erase_dynamic_attributes * description : delete the dynamic attributes if any. * * @param devlist_ptr the device list pointer * @param list of all attributes */ //-------------------------------------------------------- void BiltChClass::erase_dynamic_attributes(const Tango::DevVarStringArray *devlist_ptr, vector &att_list) { Tango::Util *tg = Tango::Util::instance(); for (unsigned long i=0 ; ilength() ; i++) { Tango::DeviceImpl *dev_impl = tg->get_device_by_name(((string)(*devlist_ptr)[i]).c_str()); BiltCh *dev = static_cast (dev_impl); vector &dev_att_list = dev->get_device_attr()->get_attribute_list(); vector::iterator ite_att; for (ite_att=dev_att_list.begin() ; ite_att != dev_att_list.end() ; ++ite_att) { string att_name((*ite_att)->get_name_lower()); if ((att_name == "state") || (att_name == "status")) continue; vector::iterator ite_str = find(defaultAttList.begin(), defaultAttList.end(), att_name); if (ite_str == defaultAttList.end()) { cout2 << att_name << " is a UNWANTED dynamic attribute for device " << (*devlist_ptr)[i] << endl; Tango::Attribute &att = dev->get_device_attr()->get_attr_by_name(att_name.c_str()); dev->remove_attribute(att_list[att.get_attr_idx()], true, false); --ite_att; } } } /*----- PROTECTED REGION ID(BiltChClass::erase_dynamic_attributes) ENABLED START -----*/ /*----- PROTECTED REGION END -----*/ // BiltChClass::erase_dynamic_attributes } //-------------------------------------------------------- /** * Method : BiltChClass::get_attr_by_name() * Description : returns Tango::Attr * object found by name */ //-------------------------------------------------------- Tango::Attr *BiltChClass::get_attr_object_by_name(vector &att_list, string attname) { vector::iterator it; for (it=att_list.begin() ; itget_name()==attname) return (*it); // Attr does not exist return NULL; } /*----- PROTECTED REGION ID(BiltChClass::Additional Methods) ENABLED START -----*/ /*----- PROTECTED REGION END -----*/ // BiltChClass::Additional Methods } // namespace Node-path: powersupply/itest/BiltCh/trunk/BiltChClass.h Node-kind: file Node-action: change Text-content-length: 11767 Text-content-md5: 7c7d45c9415d4eb2c2a8d75641751977 Content-length: 11767 /*----- PROTECTED REGION ID(BiltChClass.h) ENABLED START -----*/ //============================================================================= // // file : BiltChClass.h // // description : Include for the BiltCh root class. // This class is the singleton class for // the BiltCh device class. // It contains all properties and methods which the // BiltCh requires only once e.g. the commands. // // project : BILT channel interface // // This file is part of Tango device class. // // Tango 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. // // Tango 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 Tango. If not, see . // // $Author: meyer $ // // $Revision: 1.7 $ // $Date: 2013-01-09 15:13:59 $ // // $HeadURL: $ // //============================================================================= // This file is generated by POGO // (Program Obviously used to Generate tango Object) //============================================================================= #ifndef BiltChClass_H #define BiltChClass_H #include #include /*----- PROTECTED REGION END -----*/ // BiltChClass.h namespace BiltCh_ns { /*----- PROTECTED REGION ID(BiltChClass::classes for dynamic creation) ENABLED START -----*/ /*----- PROTECTED REGION END -----*/ // BiltChClass::classes for dynamic creation //========================================= // Define classes for attributes //========================================= // Attribute Current class definition class CurrentAttrib: public Tango::Attr { public: CurrentAttrib():Attr("Current", Tango::DEV_DOUBLE, Tango::READ_WRITE) {}; ~CurrentAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_Current(att);} virtual void write(Tango::DeviceImpl *dev,Tango::WAttribute &att) {(static_cast(dev))->write_Current(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_Current_allowed(ty);} }; // Attribute Voltage class definition class VoltageAttrib: public Tango::Attr { public: VoltageAttrib():Attr("Voltage", Tango::DEV_DOUBLE, Tango::READ) {}; ~VoltageAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_Voltage(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_Voltage_allowed(ty);} }; // Attribute Impedance class definition class ImpedanceAttrib: public Tango::Attr { public: ImpedanceAttrib():Attr("Impedance", Tango::DEV_DOUBLE, Tango::READ) {}; ~ImpedanceAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_Impedance(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_Impedance_allowed(ty);} }; // Attribute SetCurrentRMS class definition class SetCurrentRMSAttrib: public Tango::Attr { public: SetCurrentRMSAttrib():Attr("SetCurrentRMS", Tango::DEV_DOUBLE, Tango::READ) {}; ~SetCurrentRMSAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_SetCurrentRMS(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_SetCurrentRMS_allowed(ty);} }; // Attribute SetCurrentAverage class definition class SetCurrentAverageAttrib: public Tango::Attr { public: SetCurrentAverageAttrib():Attr("SetCurrentAverage", Tango::DEV_DOUBLE, Tango::READ) {}; ~SetCurrentAverageAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_SetCurrentAverage(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_SetCurrentAverage_allowed(ty);} }; // Attribute FramesPerSecond class definition class FramesPerSecondAttrib: public Tango::Attr { public: FramesPerSecondAttrib():Attr("FramesPerSecond", Tango::DEV_ULONG, Tango::READ) {}; ~FramesPerSecondAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_FramesPerSecond(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_FramesPerSecond_allowed(ty);} }; // Attribute ErrorPerSecond class definition class ErrorPerSecondAttrib: public Tango::Attr { public: ErrorPerSecondAttrib():Attr("ErrorPerSecond", Tango::DEV_ULONG, Tango::READ) {}; ~ErrorPerSecondAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_ErrorPerSecond(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_ErrorPerSecond_allowed(ty);} }; // Attribute ErrorCounter class definition class ErrorCounterAttrib: public Tango::Attr { public: ErrorCounterAttrib():Attr("ErrorCounter", Tango::DEV_ULONG, Tango::READ) {}; ~ErrorCounterAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_ErrorCounter(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_ErrorCounter_allowed(ty);} }; // Attribute LocalControl class definition class LocalControlAttrib: public Tango::Attr { public: LocalControlAttrib():Attr("LocalControl", Tango::DEV_BOOLEAN, Tango::READ_WRITE) {}; ~LocalControlAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_LocalControl(att);} virtual void write(Tango::DeviceImpl *dev,Tango::WAttribute &att) {(static_cast(dev))->write_LocalControl(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_LocalControl_allowed(ty);} }; // Attribute SetCurrentAC class definition class SetCurrentACAttrib: public Tango::Attr { public: SetCurrentACAttrib():Attr("SetCurrentAC", Tango::DEV_DOUBLE, Tango::READ_WRITE) {}; ~SetCurrentACAttrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_SetCurrentAC(att);} virtual void write(Tango::DeviceImpl *dev,Tango::WAttribute &att) {(static_cast(dev))->write_SetCurrentAC(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_SetCurrentAC_allowed(ty);} }; // Attribute Temperature1 class definition class Temperature1Attrib: public Tango::Attr { public: Temperature1Attrib():Attr("Temperature1", Tango::DEV_DOUBLE, Tango::READ) {}; ~Temperature1Attrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_Temperature1(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_Temperature1_allowed(ty);} }; // Attribute Temperature2 class definition class Temperature2Attrib: public Tango::Attr { public: Temperature2Attrib():Attr("Temperature2", Tango::DEV_DOUBLE, Tango::READ) {}; ~Temperature2Attrib() {}; virtual void read(Tango::DeviceImpl *dev,Tango::Attribute &att) {(static_cast(dev))->read_Temperature2(att);} virtual bool is_allowed(Tango::DeviceImpl *dev,Tango::AttReqType ty) {return (static_cast(dev))->is_Temperature2_allowed(ty);} }; //========================================= // Define classes for commands //========================================= // Command On class definition class OnClass : public Tango::Command { public: OnClass(const char *name, Tango::CmdArgType in, Tango::CmdArgType out, const char *in_desc, const char *out_desc, Tango::DispLevel level) :Command(name,in,out,in_desc,out_desc, level) {}; OnClass(const char *name, Tango::CmdArgType in, Tango::CmdArgType out) :Command(name,in,out) {}; ~OnClass() {}; virtual CORBA::Any *execute (Tango::DeviceImpl *dev, const CORBA::Any &any); virtual bool is_allowed (Tango::DeviceImpl *dev, const CORBA::Any &any) {return (static_cast(dev))->is_On_allowed(any);} }; // Command Off class definition class OffClass : public Tango::Command { public: OffClass(const char *name, Tango::CmdArgType in, Tango::CmdArgType out, const char *in_desc, const char *out_desc, Tango::DispLevel level) :Command(name,in,out,in_desc,out_desc, level) {}; OffClass(const char *name, Tango::CmdArgType in, Tango::CmdArgType out) :Command(name,in,out) {}; ~OffClass() {}; virtual CORBA::Any *execute (Tango::DeviceImpl *dev, const CORBA::Any &any); virtual bool is_allowed (Tango::DeviceImpl *dev, const CORBA::Any &any) {return (static_cast(dev))->is_Off_allowed(any);} }; // Command Reset class definition class ResetClass : public Tango::Command { public: ResetClass(const char *name, Tango::CmdArgType in, Tango::CmdArgType out, const char *in_desc, const char *out_desc, Tango::DispLevel level) :Command(name,in,out,in_desc,out_desc, level) {}; ResetClass(const char *name, Tango::CmdArgType in, Tango::CmdArgType out) :Command(name,in,out) {}; ~ResetClass() {}; virtual CORBA::Any *execute (Tango::DeviceImpl *dev, const CORBA::Any &any); virtual bool is_allowed (Tango::DeviceImpl *dev, const CORBA::Any &any) {return (static_cast(dev))->is_Reset_allowed(any);} }; /** * The BiltChClass singleton definition */ #ifdef _TG_WINDOWS_ class __declspec(dllexport) BiltChClass : public Tango::DeviceClass #else class BiltChClass : public Tango::DeviceClass #endif { /*----- PROTECTED REGION ID(BiltChClass::Additionnal DServer data members) ENABLED START -----*/ /*----- PROTECTED REGION END -----*/ // BiltChClass::Additionnal DServer data members public: // write class properties data members Tango::DbData cl_prop; Tango::DbData cl_def_prop; Tango::DbData dev_def_prop; // Method prototypes static BiltChClass *init(const char *); static BiltChClass *instance(); ~BiltChClass(); Tango::DbDatum get_class_property(string &); Tango::DbDatum get_default_device_property(string &); Tango::DbDatum get_default_class_property(string &); protected: BiltChClass(string &); static BiltChClass *_instance; void command_factory(); void attribute_factory(vector &); void write_class_property(); void set_default_property(); void get_class_property(); string get_cvstag(); string get_cvsroot(); private: void device_factory(const Tango::DevVarStringArray *); void create_static_attribute_list(vector &); void erase_dynamic_attributes(const Tango::DevVarStringArray *,vector &); vector defaultAttList; Tango::Attr *get_attr_object_by_name(vector &att_list, string attname); }; } // End of namespace #endif // BiltCh_H Node-path: powersupply/itest/BiltCh/trunk/BiltChStateMachine.cpp Node-kind: file Node-action: change Text-content-length: 11380 Text-content-md5: 9d4162ea50f346913125e4fb64fc2d1c Content-length: 11380 /*----- PROTECTED REGION ID(BiltChStateMachine.cpp) ENABLED START -----*/ static const char *RcsId = "$Id: BiltChStateMachine.cpp,v 1.7 2013-01-09 15:13:59 meyer Exp $"; //============================================================================= // // file : BiltChStateMachine.cpp // // description : State machine file for the BiltCh class // // project : BILT channel interface // // This file is part of Tango device class. // // Tango 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. // // Tango 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 Tango. If not, see . // // $Author: meyer $ // // $Revision: 1.7 $ // $Date: 2013-01-09 15:13:59 $ // // $HeadURL: $ // //============================================================================= // This file is generated by POGO // (Program Obviously used to Generate tango Object) //============================================================================= #include /*----- PROTECTED REGION END -----*/ // BiltCh::BiltChStateMachine.cpp //================================================================ // States | Description //================================================================ // ON | Magnet is ON, all three channels are ON. // OFF | Magnet is OFF, all three channels are OFF. // FAULT | Error detected by the BILT magnet. // ALARM | Alarm detected on one or more channels. // UNKNOWN | Communication fault namespace BiltCh_ns { //================================================= // Attributes Allowed Methods //================================================= //-------------------------------------------------------- /** * Method : BiltCh::is_Current_allowed() * Description : Execution allowed for Current attribute */ //-------------------------------------------------------- bool BiltCh::is_Current_allowed(TANGO_UNUSED(Tango::AttReqType type)) { // Not any excluded states for Current attribute in Write access. /*----- PROTECTED REGION ID(BiltCh::CurrentStateAllowed_WRITE) ENABLED START -----*/ /*----- PROTECTED REGION END -----*/ // BiltCh::CurrentStateAllowed_WRITE // Not any excluded states for Current attribute in read access. /*----- PROTECTED REGION ID(BiltCh::CurrentStateAllowed_READ) ENABLED START -----*/ /*----- PROTECTED REGION END -----*/ // BiltCh::CurrentStateAllowed_READ return true; } //-------------------------------------------------------- /** * Method : BiltCh::is_Voltage_allowed() * Description : Execution allowed for Voltage attribute */ //-------------------------------------------------------- bool BiltCh::is_Voltage_allowed(TANGO_UNUSED(Tango::AttReqType type)) { // Not any excluded states for Voltage attribute in read access. /*----- PROTECTED REGION ID(BiltCh::VoltageStateAllowed_READ) ENABLED START -----*/ /*----- PROTECTED REGION END -----*/ // BiltCh::VoltageStateAllowed_READ return true; } //-------------------------------------------------------- /** * Method : BiltCh::is_Impedance_allowed() * Description : Execution allowed for Impedance attribute */ //-------------------------------------------------------- bool BiltCh::is_Impedance_allowed(TANGO_UNUSED(Tango::AttReqType type)) { // Not any excluded states for Impedance attribute in read access. /*----- PROTECTED REGION ID(BiltCh::ImpedanceStateAllowed_READ) ENABLED START -----*/ /*----- PROTECTED REGION END -----*/ // BiltCh::ImpedanceStateAllowed_READ return true; } //-------------------------------------------------------- /** * Method : BiltCh::is_SetCurrentRMS_allowed() * Description : Execution allowed for SetCurrentRMS attribute */ //-------------------------------------------------------- bool BiltCh::is_SetCurrentRMS_allowed(TANGO_UNUSED(Tango::AttReqType type)) { // Not any excluded states for SetCurrentRMS attribute in read access. /*----- PROTECTED REGION ID(BiltCh::SetCurrentRMSStateAllowed_READ) ENABLED START -----*/ /*----- PROTECTED REGION END -----*/ // BiltCh::SetCurrentRMSStateAllowed_READ return true; } //-------------------------------------------------------- /** * Method : BiltCh::is_SetCurrentAverage_allowed() * Description : Execution allowed for SetCurrentAverage attribute */ //-------------------------------------------------------- bool BiltCh::is_SetCurrentAverage_allowed(TANGO_UNUSED(Tango::AttReqType type)) { // Not any excluded states for SetCurrentAverage attribute in read access. /*----- PROTECTED REGION ID(BiltCh::SetCurrentAverageStateAllowed_READ) ENABLED START -----*/ /*----- PROTECTED REGION END -----*/ // BiltCh::SetCurrentAverageStateAllowed_READ return true; } //-------------------------------------------------------- /** * Method : BiltCh::is_FramesPerSecond_allowed() * Description : Execution allowed for FramesPerSecond attribute */ //-------------------------------------------------------- bool BiltCh::is_FramesPerSecond_allowed(TANGO_UNUSED(Tango::AttReqType type)) { // Not any excluded states for FramesPerSecond attribute in read access. /*----- PROTECTED REGION ID(BiltCh::FramesPerSecondStateAllowed_READ) ENABLED START -----*/ /*----- PROTECTED REGION END -----*/ // BiltCh::FramesPerSecondStateAllowed_READ return true; } //-------------------------------------------------------- /** * Method : BiltCh::is_ErrorPerSecond_allowed() * Description : Execution allowed for ErrorPerSecond attribute */ //-------------------------------------------------------- bool BiltCh::is_ErrorPerSecond_allowed(TANGO_UNUSED(Tango::AttReqType type)) { // Not any excluded states for ErrorPerSecond attribute in read access. /*----- PROTECTED REGION ID(BiltCh::ErrorPerSecondStateAllowed_READ) ENABLED START -----*/ /*----- PROTECTED REGION END -----*/ // BiltCh::ErrorPerSecondStateAllowed_READ return true; } //-------------------------------------------------------- /** * Method : BiltCh::is_ErrorCounter_allowed() * Description : Execution allowed for ErrorCounter attribute */ //-------------------------------------------------------- bool BiltCh::is_ErrorCounter_allowed(TANGO_UNUSED(Tango::AttReqType type)) { // Not any excluded states for ErrorCounter attribute in read access. /*----- PROTECTED REGION ID(BiltCh::ErrorCounterStateAllowed_READ) ENABLED START -----*/ /*----- PROTECTED REGION END -----*/ // BiltCh::ErrorCounterStateAllowed_READ return true; } //-------------------------------------------------------- /** * Method : BiltCh::is_LocalControl_allowed() * Description : Execution allowed for LocalControl attribute */ //-------------------------------------------------------- bool BiltCh::is_LocalControl_allowed(TANGO_UNUSED(Tango::AttReqType type)) { // Not any excluded states for LocalControl attribute in Write access. /*----- PROTECTED REGION ID(BiltCh::LocalControlStateAllowed_WRITE) ENABLED START -----*/ /*----- PROTECTED REGION END -----*/ // BiltCh::LocalControlStateAllowed_WRITE // Not any excluded states for LocalControl attribute in read access. /*----- PROTECTED REGION ID(BiltCh::LocalControlStateAllowed_READ) ENABLED START -----*/ /*----- PROTECTED REGION END -----*/ // BiltCh::LocalControlStateAllowed_READ return true; } //-------------------------------------------------------- /** * Method : BiltCh::is_SetCurrentAC_allowed() * Description : Execution allowed for SetCurrentAC attribute */ //-------------------------------------------------------- bool BiltCh::is_SetCurrentAC_allowed(TANGO_UNUSED(Tango::AttReqType type)) { // Not any excluded states for SetCurrentAC attribute in Write access. /*----- PROTECTED REGION ID(BiltCh::SetCurrentACStateAllowed_WRITE) ENABLED START -----*/ /*----- PROTECTED REGION END -----*/ // BiltCh::SetCurrentACStateAllowed_WRITE // Not any excluded states for SetCurrentAC attribute in read access. /*----- PROTECTED REGION ID(BiltCh::SetCurrentACStateAllowed_READ) ENABLED START -----*/ /*----- PROTECTED REGION END -----*/ // BiltCh::SetCurrentACStateAllowed_READ return true; } //-------------------------------------------------------- /** * Method : BiltCh::is_Temperature1_allowed() * Description : Execution allowed for Temperature1 attribute */ //-------------------------------------------------------- bool BiltCh::is_Temperature1_allowed(TANGO_UNUSED(Tango::AttReqType type)) { // Not any excluded states for Temperature1 attribute in read access. /*----- PROTECTED REGION ID(BiltCh::Temperature1StateAllowed_READ) ENABLED START -----*/ /*----- PROTECTED REGION END -----*/ // BiltCh::Temperature1StateAllowed_READ return true; } //-------------------------------------------------------- /** * Method : BiltCh::is_Temperature2_allowed() * Description : Execution allowed for Temperature2 attribute */ //-------------------------------------------------------- bool BiltCh::is_Temperature2_allowed(TANGO_UNUSED(Tango::AttReqType type)) { // Not any excluded states for Temperature2 attribute in read access. /*----- PROTECTED REGION ID(BiltCh::Temperature2StateAllowed_READ) ENABLED START -----*/ /*----- PROTECTED REGION END -----*/ // BiltCh::Temperature2StateAllowed_READ return true; } //================================================= // Commands Allowed Methods //================================================= //-------------------------------------------------------- /** * Method : BiltCh::is_On_allowed() * Description : Execution allowed for On attribute */ //-------------------------------------------------------- bool BiltCh::is_On_allowed(TANGO_UNUSED(const CORBA::Any &any)) { // Not any excluded states for On command. /*----- PROTECTED REGION ID(BiltCh::OnStateAllowed) ENABLED START -----*/ /*----- PROTECTED REGION END -----*/ // BiltCh::OnStateAllowed return true; } //-------------------------------------------------------- /** * Method : BiltCh::is_Off_allowed() * Description : Execution allowed for Off attribute */ //-------------------------------------------------------- bool BiltCh::is_Off_allowed(TANGO_UNUSED(const CORBA::Any &any)) { // Not any excluded states for Off command. /*----- PROTECTED REGION ID(BiltCh::OffStateAllowed) ENABLED START -----*/ /*----- PROTECTED REGION END -----*/ // BiltCh::OffStateAllowed return true; } //-------------------------------------------------------- /** * Method : BiltCh::is_Reset_allowed() * Description : Execution allowed for Reset attribute */ //-------------------------------------------------------- bool BiltCh::is_Reset_allowed(TANGO_UNUSED(const CORBA::Any &any)) { // Not any excluded states for Reset command. /*----- PROTECTED REGION ID(BiltCh::ResetStateAllowed) ENABLED START -----*/ /*----- PROTECTED REGION END -----*/ // BiltCh::ResetStateAllowed return true; } } // End of namespace Revision-number: 100 Prop-content-length: 120 Content-length: 120 K 10 svn:author V 5 meyer K 8 svn:date V 27 2013-01-09T15:14:35.000000Z K 7 svn:log V 20 set Version to 1.7. PROPS-END Node-path: powersupply/itest/BiltCh/trunk/Makefile Node-kind: file Node-action: change Text-content-length: 5627 Text-content-md5: 28494db5c3deb0f57de245e594585456 Content-length: 5627 #PROTECTED REGION ID(BiltChMakefile) ENABLED START# #============================================================================= # # file : Makefile # # description : Include for the BiltCh class. # # project : Makefile to generate a Tango server # # $Author: meyer $ # # $Revision: 1.9 $ # # $Log: not supported by cvs2svn $ # Revision 1.8 2013/01/09 14:39:05 meyer # Converted from Pogo6 to Pogo8! # # Revision 1.7 2010/11/10 14:01:42 meyer # changed version to 1.6 # # Revision 1.6 2010-11-10 12:02:59 meyer # Changed version to 1.5 # # Revision 1.5 2010/06/21 07:17:48 meyer # Changed version to 1.4 # # Revision 1.4 2010/05/01 16:26:01 meyer # Changed version to 1.3 # # Revision 1.3 2010/03/19 15:28:01 meyer # Canged to version 1.1 # # Revision 1.2 2010-02-11 16:36:31 meyer # Currents attribute of Bilt understand NaN values now. # # Revision 1.1.1.1 2010-02-10 11:49:21 meyer # Imported using TkCVS # # # copyleft : European Synchrotron Radiation Facility # BP 220, Grenoble 38043 # FRANCE # #============================================================================= # This file is generated by POGO # (Program Obviously used to Generate tango Object) # # (c) - Software Engineering Group - ESRF #============================================================================= # CLASS = BiltCh MAJOR_VERS = 1 MINOR_VERS = 7 RELEASE = Release_$(MAJOR_VERS)_$(MINOR_VERS) OS = $(shell /csadmin/common/scripts/get_os) PROCESSOR = $(shell uname -p) #----------------------------------------- # Set default home directories #----------------------------------------- TANGO_HOME = /segfs/tango/release/$(BIN_DIR) CPP_SERVERS = $(TANGO_HOME)/classes ifdef no_debug DEBUG = -O else DEBUG = -g endif ifdef _solaris CC = CC BIN_DIR=$(OS)_CC AR_SL = $(CC) -mt -G VERS_OPT = -h SL_EXT = so endif ifdef linux CC = c++ CC_SHLIB = $(CC) -fPIC $(PROCESSOR)=1 ifdef x86_64 NBITS=_64 endif BIN_DIR=$(OS)$(NBITS) AR_SL = $(CC) -fPIC -shared SL_EXT = so VERS_OPT = -Wl,-soname, endif INCLUDE_DIRS = -I$(TANGO_HOME)/include -I. \ -I$(CPP_SERVERS)/include OBJS_DIR = obj/$(BIN_DIR) LIB_DIRS = -L $(CPP_SERVERS)/lib \ -L $(TANGO_HOME)/lib \ TARGET_LIB = $(CPP_SERVERS)/lib/libtgclasses.a #----------------------------------------- # Set CXXFLAGS and LFLAGS #----------------------------------------- ifdef _solaris CXXFLAGS = $(DEBUG) -mt -D_PTHREADS $(INCLUDE_DIRS) LFLAGS = $(DEBUG) $(LIB_DIRS) \ -ltango \ -llog4tango \ -lomniORB4 \ -lomniDynamic4 \ -lomnithread \ -lCOS4 \ -lpthread \ -lposix4 -lsocket -lnsl endif ifdef linux CXXFLAGS = -g -D_REENTRANT $(INCLUDE_DIRS) LFLAGS = $(DEBUG) $(LIB_DIRS) \ -ltango \ -llog4tango \ -lomniORB4 \ -lomniDynamic4 \ -lomnithread \ -lCOS4 \ -lzmq \ -ldl -lpthread endif #----------------------------------------- # Set dependences #----------------------------------------- SVC_OBJS = $(OBJS_DIR)/$(CLASS).o \ $(OBJS_DIR)/$(CLASS)StateMachine.o \ $(OBJS_DIR)/$(CLASS)Class.o \ $(OBJS_DIR)/ClassFactory.o \ $(OBJS_DIR)/main.o SHLIB_OBJS = $(OBJS_DIR)/$(CLASS)Class.so.o \ $(OBJS_DIR)/$(CLASS)StateMachine.so.o \ $(OBJS_DIR)/$(CLASS).so.o SVC_INC = $(CLASS)Class.h \ $(CLASS).h $(OBJS_DIR)/%.o: %.cpp $(SVC_INC) $(CC) $(CXXFLAGS) -c $< -o $(OBJS_DIR)/$*.o $(OBJS_DIR)/%.so.o: %.cpp $(SVC_INC) $(CC_SHLIB) $(CXXFLAGS) -c $< -o $(OBJS_DIR)/$*.so.o #----------------------------------------- # Make Entry #----------------------------------------- all: $(CLASS) $(CLASS): make_obj_dir make_bin_dir $(SVC_OBJS) $(CC) $(SVC_OBJS) -o $(CLASS) $(LFLAGS) @mv $(CLASS) bin/$(BIN_DIR)/$(CLASS) shlib: make_obj_dir make_shlib_dir $(SHLIB_OBJS) $(AR_SL) -o \ shlib/$(BIN_DIR)/$(CLASS).$(SL_EXT).$(MAJOR_VERS).$(MINOR_VERS) \ $(VERS_OPT)$(CLASS).$(SL_EXT).$(MAJOR_VERS) \ $(SHLIB_OBJS) $(LFLAGS) @rm -f shlib/$(BIN_DIR)/$(CLASS).$(SL_EXT) @cd shlib/$(BIN_DIR); \ ln -s $(CLASS).$(SL_EXT).$(MAJOR_VERS).$(MINOR_VERS) $(CLASS).$(SL_EXT) clean: rm -f $(OBJS_DIR)/*.o \ $(OBJS_DIR)/*.so.o \ bin/$(BIN_DIR)/$(CLASS) \ core make_obj_dir: @mkdir -p obj @mkdir -p obj/$(BIN_DIR) make_bin_dir: @mkdir -p bin @mkdir -p bin/$(BIN_DIR) make_shlib_dir: @mkdir -p shlib @mkdir -p shlib/$(BIN_DIR) #----------------------------------------- # Install binary file #----------------------------------------- install: cp bin/$(BIN_DIR)/$(CLASS) $(CPP_SERVERS)/bin #----------------------------------------- # Update class library and header files # recompile without debug mode. #----------------------------------------- lib: clean @make no_debug=1 cp *.h $(CPP_SERVERS)/include ar ruv $(TARGET_LIB) $(OBJS_DIR)/$(CLASS).o ar ruv $(TARGET_LIB) $(OBJS_DIR)/$(CLASS)Class.o ar ruv $(TARGET_LIB) $(OBJS_DIR)/$(CLASS)StateMachine.o ident $(TARGET_LIB) | grep $(CLASS) #------------------------------------------------------ # Tag the CVS/SVN module corresponding to this class # copy cvs_tag or svn_tag to tag: entry #------------------------------------------------------ #svn_tag: # svn copy ../trunk ../tags/$(RELEASE) # svn commit ../tags/$(RELEASE) \ # -m "Tagging the $(RELEASE) of the $(CLASS) project." # #cvs_tag: # @cvstag "$(CLASS)-$(RELEASE)" # @make $(CLASS) # @make show_tag #show_cvs_tag: # @cvstag -d # # Only these make options work with the current Pogo version 5.3.x! tag: @cvstag "$(CLASS)-$(RELEASE)" @make $(CLASS) @make show_tag show_tag: @cvstag -d #PROTECTED REGION END# Revision-number: 101 Prop-content-length: 149 Content-length: 149 K 8 svn:date V 27 2013-01-09T15:14:36.000000Z K 7 svn:log V 75 This commit was manufactured by cvs2svn to create tag 'BiltCh-Release_1_7'. PROPS-END Node-path: powersupply/itest/BiltCh/tags/BiltCh-Release_1_7 Node-kind: dir Node-action: add Node-copyfrom-rev: 100 Node-copyfrom-path: powersupply/itest/BiltCh/trunk