From 8a2d46e21ed473a325425b8831bb420f8922a13f Mon Sep 17 00:00:00 2001 From: Jean-Paul Chaput Date: Sun, 18 Jan 2009 21:17:43 +0000 Subject: [PATCH] * ./hurricane/src/hviewer : - Bug: redraw the palette layer samples whenever the style changes. Uses a new, more clear model to transmit signals. A star model where the CellWidget is the center, signals propagate a void pointer which tells the emitter to avoid looping. First a slave emit the signal to the CellWidget. When the CellWidget receive the signal it's transmitted to all slave widgets. - New feature: ExceptionWidget (derived from QDialog) to display properly catched exceptions. The Abort button of the Dialog forces the program to core-dump with a SIGSEGV. The "Try to Continue" resumes the program, which is higtly to crash anyway... - New feature: a HApplication in replacement of the QApplication to catch exceptions in the notify() function, that is exceptions that could be throwed inside event handlers. --- hurricane/src/hurricane/Breakpoint.cpp | 1 - hurricane/src/hviewer/BreakpointWidget.cpp | 10 +- hurricane/src/hviewer/CMakeLists.txt | 12 ++- hurricane/src/hviewer/CellViewer.qrc | 2 + hurricane/src/hviewer/CellWidget.cpp | 11 +- hurricane/src/hviewer/ControllerWidget.cpp | 2 +- hurricane/src/hviewer/GraphicsWidget.cpp | 6 +- hurricane/src/hviewer/HApplication.cpp | 102 ++++++++++++++++++ hurricane/src/hviewer/PaletteItem.cpp | 10 +- hurricane/src/hviewer/PaletteLayerItem.cpp | 9 +- hurricane/src/hviewer/PaletteWidget.cpp | 14 +++ .../src/hviewer/hurricane/viewer/CellWidget.h | 2 + .../hviewer/hurricane/viewer/GraphicsWidget.h | 4 +- .../hviewer/hurricane/viewer/HApplication.h | 54 ++++++++++ .../hviewer/hurricane/viewer/PaletteItem.h | 8 +- .../hviewer/hurricane/viewer/PaletteWidget.h | 3 +- hurricane/src/hviewer/images/gnome-core.png | Bin 0 -> 3266 bytes hurricane/src/hviewer/images/i-core.png | Bin 0 -> 3138 bytes 18 files changed, 226 insertions(+), 24 deletions(-) create mode 100644 hurricane/src/hviewer/HApplication.cpp create mode 100644 hurricane/src/hviewer/hurricane/viewer/HApplication.h create mode 100644 hurricane/src/hviewer/images/gnome-core.png create mode 100644 hurricane/src/hviewer/images/i-core.png diff --git a/hurricane/src/hurricane/Breakpoint.cpp b/hurricane/src/hurricane/Breakpoint.cpp index 401d60ae..3725ad6f 100644 --- a/hurricane/src/hurricane/Breakpoint.cpp +++ b/hurricane/src/hurricane/Breakpoint.cpp @@ -94,7 +94,6 @@ namespace Hurricane { void Breakpoint::setStopCb ( Breakpoint::StopCb_t* cb ) { - cerr << "Breakpoint::setStopCb() - " << (void*)cb << endl; _stopCb = cb; } diff --git a/hurricane/src/hviewer/BreakpointWidget.cpp b/hurricane/src/hviewer/BreakpointWidget.cpp index ed82469a..1c6ecc9b 100644 --- a/hurricane/src/hviewer/BreakpointWidget.cpp +++ b/hurricane/src/hviewer/BreakpointWidget.cpp @@ -61,11 +61,11 @@ namespace Hurricane { vLine->setFrameShadow ( QFrame::Sunken ); QGridLayout* layout = new QGridLayout (); - layout->addWidget ( ok , 0, 0, 2, 1, Qt::AlignVCenter ); - layout->addWidget ( vLine , 0, 1, 2, 1 ); - layout->addWidget ( _message , 0, 2 ); - layout->addWidget ( stopLabel , 1, 2 ); - layout->addWidget ( _stopLevel, 1, 3 ); + layout->addWidget ( _message , 0, 0 ); + layout->addWidget ( stopLabel , 1, 0 ); + layout->addWidget ( _stopLevel, 1, 1 ); + layout->addWidget ( vLine , 0, 2, 2, 1 ); + layout->addWidget ( ok , 0, 3, 2, 1, Qt::AlignVCenter ); setLayout ( layout ); connect ( ok , SIGNAL(clicked()) , this, SLOT(accept()) ); diff --git a/hurricane/src/hviewer/CMakeLists.txt b/hurricane/src/hviewer/CMakeLists.txt index e7531dab..8f45ff4b 100644 --- a/hurricane/src/hviewer/CMakeLists.txt +++ b/hurricane/src/hviewer/CMakeLists.txt @@ -4,12 +4,14 @@ include_directories ( ${HURRICANE_SOURCE_DIR}/src/hurricane ${HURRICANE_SOURCE_DIR}/src/hviewer ) - set ( mocincludes hurricane/viewer/PaletteItem.h + set ( mocincludes hurricane/viewer/HApplication.h + hurricane/viewer/PaletteItem.h hurricane/viewer/PaletteNamedItem.h hurricane/viewer/PaletteLayerItem.h hurricane/viewer/PaletteExtensionGoItem.h hurricane/viewer/PaletteWidget.h hurricane/viewer/GraphicsWidget.h + hurricane/viewer/ExceptionWidget.h hurricane/viewer/BreakpointWidget.h hurricane/viewer/DynamicLabel.h hurricane/viewer/MousePositionWidget.h @@ -27,11 +29,13 @@ hurricane/viewer/DisplayFilterWidget.h hurricane/viewer/ControllerWidget.h ) - set ( exports hurricane/viewer/ScreenUtilities.h + set ( exports hurricane/viewer/HApplication.h + hurricane/viewer/ScreenUtilities.h hurricane/viewer/DisplayStyle.h hurricane/viewer/ColorScale.h hurricane/viewer/Graphics.h hurricane/viewer/GraphicsWidget.h + hurricane/viewer/ExceptionWidget.h hurricane/viewer/BreakpointWidget.h hurricane/viewer/Selector.h hurricane/viewer/Command.h @@ -53,11 +57,13 @@ hurricane/viewer/DisplayFilterWidget.h hurricane/viewer/ControllerWidget.h ) - set ( cpps ScreenUtilities.cpp + set ( cpps HApplication.cpp + ScreenUtilities.cpp DisplayStyle.cpp ColorScale.cpp Graphics.cpp GraphicsWidget.cpp + ExceptionWidget.cpp BreakpointWidget.cpp PaletteItem.cpp PaletteNamedItem.cpp diff --git a/hurricane/src/hviewer/CellViewer.qrc b/hurricane/src/hviewer/CellViewer.qrc index fb7e6985..168c250e 100644 --- a/hurricane/src/hviewer/CellViewer.qrc +++ b/hurricane/src/hviewer/CellViewer.qrc @@ -10,5 +10,7 @@ images/gtk-go-forward-ltr.png images/swiss-knife.png images/gnome-gmush.png + images/gnome-core.png + images/i-core.png diff --git a/hurricane/src/hviewer/CellWidget.cpp b/hurricane/src/hviewer/CellWidget.cpp index 3803b157..04da5ae0 100644 --- a/hurricane/src/hviewer/CellWidget.cpp +++ b/hurricane/src/hviewer/CellWidget.cpp @@ -890,6 +890,13 @@ namespace Hurricane { } + void CellWidget::styleChange ( void* emitter ) + { + refresh (); + emit styleChanged(emitter); + } + + void CellWidget::updatePalette () { emit updatePalette(getCell()); @@ -904,6 +911,7 @@ namespace Hurricane { connect ( _palette, SIGNAL(paletteChanged()) , this , SLOT(refresh()) ); connect ( this , SIGNAL(cellChanged(Cell*)) , _palette, SLOT(updateExtensions(Cell*)) ); connect ( this , SIGNAL(updatePalette(Cell*)), _palette, SLOT(updateExtensions(Cell*)) ); + connect ( this , SIGNAL(styleChanged(void*)) , _palette, SLOT(styleChange(void*)) ); } @@ -913,6 +921,7 @@ namespace Hurricane { disconnect ( _palette, SIGNAL(paletteChanged()) , this , SLOT(refresh()) ); disconnect ( this , SIGNAL(cellChanged(Cell*)) , _palette, SLOT(updateExtensions(Cell*)) ); disconnect ( this , SIGNAL(updatePalette(Cell*)), _palette, SLOT(updateExtensions(Cell*)) ); + disconnect ( this , SIGNAL(styleChanged(void*)) , _palette, SLOT(styleChange(void*)) ); _palette = NULL; } } @@ -1094,7 +1103,7 @@ namespace Hurricane { } } - //_drawingQuery.setFilter ( _queryFilter & ~Query::DoMasterCells ); + //_drawingQuery.setFilter ( _queryFilter & ~Query::DoMasterCells ); forEach ( ExtensionSlice*, islice, _cell->getExtensionSlices() ) { QApplication::processEvents(); if ( /*timeout("redraw [extension]",timer,10.0,timedout) ||*/ (_redrawManager.interrupted()) ) break; diff --git a/hurricane/src/hviewer/ControllerWidget.cpp b/hurricane/src/hviewer/ControllerWidget.cpp index e5954233..f1071925 100644 --- a/hurricane/src/hviewer/ControllerWidget.cpp +++ b/hurricane/src/hviewer/ControllerWidget.cpp @@ -98,7 +98,7 @@ namespace Hurricane { if ( getCellWidget() != cellWidget ) { ControllerTab::setCellWidget ( cellWidget ); if ( getCellWidget() ) { - connect ( _graphics, SIGNAL(styleChanged()), getCellWidget(), SLOT(refresh()) ); + connect ( _graphics, SIGNAL(styleChanged(void*)), getCellWidget(), SLOT(styleChange(void*)) ); } } } diff --git a/hurricane/src/hviewer/GraphicsWidget.cpp b/hurricane/src/hviewer/GraphicsWidget.cpp index 7640bb84..5fd13f3d 100644 --- a/hurricane/src/hviewer/GraphicsWidget.cpp +++ b/hurricane/src/hviewer/GraphicsWidget.cpp @@ -79,15 +79,15 @@ namespace Hurricane { wLayout->addStretch (); setLayout ( wLayout ); - connect ( group, SIGNAL(buttonClicked(int)), this, SLOT(styleChanged(int)) ); + connect ( group, SIGNAL(buttonClicked(int)), this, SLOT(styleChange(int)) ); } - void GraphicsWidget::styleChanged ( int id ) + void GraphicsWidget::styleChange ( int id ) { Graphics::setStyle ( (size_t)id ); //cerr << "GraphicsWidget::setStyle() - " << getString(Graphics::getStyle()->getName()) << endl; - emit styleChanged (); + emit styleChanged ( (void*)this ); } diff --git a/hurricane/src/hviewer/HApplication.cpp b/hurricane/src/hviewer/HApplication.cpp new file mode 100644 index 00000000..a3b90fcb --- /dev/null +++ b/hurricane/src/hviewer/HApplication.cpp @@ -0,0 +1,102 @@ + +// -*- C++ -*- +// +// This file is part of the Coriolis Software. +// Copyright (c) UPMC/LIP6 2008-2009, All Rights Reserved +// +// =================================================================== +// +// $Id$ +// +// x-----------------------------------------------------------------x +// | | +// | C O R I O L I S | +// | U n i c o r n - M a i n G U I | +// | | +// | Author : Jean-Paul CHAPUT | +// | E-mail : Jean-Paul.Chaput@asim.lip6.fr | +// | =============================================================== | +// | C++ Module : "./HApplication.cpp" | +// | *************************************************************** | +// | U p d a t e s | +// | | +// x-----------------------------------------------------------------x + + +#include +#include + +#include "hurricane/Error.h" +#include "hurricane/viewer/ExceptionWidget.h" +#include "hurricane/viewer/HApplication.h" + + +namespace Hurricane { + + + using std::cerr; + using std::endl; + using std::exception; + + +// ------------------------------------------------------------------- +// Class : "HApplication". + + + HApplication::HApplication ( int& argc, char** argv ) + : QApplication ( argc, argv ) + { } + + + HApplication::HApplication ( int& argc, char** argv, bool GUIenabled ) + : QApplication ( argc, argv, GUIenabled ) + { } + + + HApplication::HApplication ( int& argc, char** argv, Type type ) + : QApplication ( argc, argv, type ) + { } + + + HApplication::HApplication ( Display* display, Qt::HANDLE visual, Qt::HANDLE colormap ) + : QApplication ( display, visual, colormap ) + { } + + + HApplication::HApplication ( Display* display, int& argc, char** argv, Qt::HANDLE visual, Qt::HANDLE colormap ) + : QApplication ( display, argc, argv, visual, colormap ) + { } + + + bool HApplication::notify ( QObject* object, QEvent* event ) + { + try { + return QApplication::notify ( object, event ); + } + catch ( Error& e ) { + ExceptionWidget* ew = new ExceptionWidget (); + ew->setMessage ( e.getReason().c_str() ); + if ( ew->exec() == QDialog::Rejected ) + kill ( getpid(), SIGSEGV ); + } + catch ( exception& e ) { + ExceptionWidget* ew = new ExceptionWidget (); + ew->setMessage ( e.what() ); + if ( ew->exec() == QDialog::Rejected ) + kill ( getpid(), SIGSEGV ); + } + catch ( ... ) { + static const char* message = + "  Unmanaged exception, neither a Hurricane::Error
" + "nor a std::exception."; + + ExceptionWidget* ew = new ExceptionWidget (); + ew->setMessage ( message ); + if ( ew->exec() == QDialog::Rejected ) + kill ( getpid(), SIGSEGV ); + } + return true; + } + + +} // End of Hurricane namespace. diff --git a/hurricane/src/hviewer/PaletteItem.cpp b/hurricane/src/hviewer/PaletteItem.cpp index aa467969..e05f8c59 100644 --- a/hurricane/src/hviewer/PaletteItem.cpp +++ b/hurricane/src/hviewer/PaletteItem.cpp @@ -2,7 +2,7 @@ // -*- C++ -*- // // This file is part of the Coriolis Software. -// Copyright (c) UPMC/LIP6 2008-2008, All Rights Reserved +// Copyright (c) UPMC/LIP6 2008-2009, All Rights Reserved // // =================================================================== // @@ -59,6 +59,8 @@ namespace Hurricane { painter.setPen ( Graphics::getPen (_entry->getName()) ); painter.setBrush ( Graphics::getBrush(_entry->getName()) ); painter.drawRect ( 2, 2, 16, 16 ); + + update (); } @@ -88,4 +90,10 @@ namespace Hurricane { { } + void PaletteItem::styleChange () + { + emit styleChanged (); + } + + } // End of Hurricane namespace. diff --git a/hurricane/src/hviewer/PaletteLayerItem.cpp b/hurricane/src/hviewer/PaletteLayerItem.cpp index e791aa9d..18275869 100644 --- a/hurricane/src/hviewer/PaletteLayerItem.cpp +++ b/hurricane/src/hviewer/PaletteLayerItem.cpp @@ -43,7 +43,9 @@ namespace Hurricane { { QHBoxLayout* layout = new QHBoxLayout (); layout->setContentsMargins ( 0, 0, 0, 0 ); - layout->addWidget ( new DrawingStyleSample(this) ); + + DrawingStyleSample* sample = new DrawingStyleSample(this); + layout->addWidget ( sample ); _visible->setChecked ( visible ); _visible->setText ( getString(getName()).c_str() ); @@ -61,8 +63,9 @@ namespace Hurricane { setLayout ( layout ); - connect ( _visible , SIGNAL(clicked()), this, SIGNAL(visibleToggled ()) ); - connect ( _selectable, SIGNAL(clicked()), this, SIGNAL(selectableToggled()) ); + connect ( this , SIGNAL(styleChanged()), sample, SLOT (redraw ()) ); + connect ( _visible , SIGNAL(clicked ()), this , SIGNAL(visibleToggled ()) ); + connect ( _selectable, SIGNAL(clicked ()), this , SIGNAL(selectableToggled()) ); } diff --git a/hurricane/src/hviewer/PaletteWidget.cpp b/hurricane/src/hviewer/PaletteWidget.cpp index 59bbcda9..e2b6d4d3 100644 --- a/hurricane/src/hviewer/PaletteWidget.cpp +++ b/hurricane/src/hviewer/PaletteWidget.cpp @@ -377,4 +377,18 @@ namespace Hurricane { } + void PaletteWidget::styleChange ( void* emitter ) + { + if ( emitter == this ) return; + + PaletteItems::iterator iitem = _layerItems.begin(); + for ( ; iitem != _layerItems.end() ; iitem++ ) + iitem->second->styleChange (); + + iitem = _extensionGoItems.begin(); + for ( ; iitem != _extensionGoItems.end() ; iitem++ ) + iitem->second->styleChange (); + } + + } // End of Hurricane namespace. diff --git a/hurricane/src/hviewer/hurricane/viewer/CellWidget.h b/hurricane/src/hviewer/hurricane/viewer/CellWidget.h index f5d90333..6967d569 100644 --- a/hurricane/src/hviewer/hurricane/viewer/CellWidget.h +++ b/hurricane/src/hviewer/hurricane/viewer/CellWidget.h @@ -187,6 +187,7 @@ namespace Hurricane { void cellPreModificated (); void cellPostModificated (); void settingsChanged (); + void styleChanged ( void* emitter ); void updatePalette ( Cell* ); void mousePositionChanged ( const Point& position ); void selectionChanged ( const SelectorSet&, Cell* ); @@ -211,6 +212,7 @@ namespace Hurricane { void _selectOccurrencesUnder ( Box selectArea ); void _unselectAll ( bool delayRedraw ); void rubberChange (); + void styleChange ( void* emitter ); void updatePalette (); void cellPreModificate (); void cellPostModificate (); diff --git a/hurricane/src/hviewer/hurricane/viewer/GraphicsWidget.h b/hurricane/src/hviewer/hurricane/viewer/GraphicsWidget.h index 65356d37..68b6588f 100644 --- a/hurricane/src/hviewer/hurricane/viewer/GraphicsWidget.h +++ b/hurricane/src/hviewer/hurricane/viewer/GraphicsWidget.h @@ -39,9 +39,9 @@ namespace Hurricane { public: GraphicsWidget ( QWidget* parent=NULL ); signals: - void styleChanged (); + void styleChanged ( void* emitter ); public slots: - void styleChanged ( int id ); + void styleChange ( int id ); }; diff --git a/hurricane/src/hviewer/hurricane/viewer/HApplication.h b/hurricane/src/hviewer/hurricane/viewer/HApplication.h new file mode 100644 index 00000000..dbe0faf3 --- /dev/null +++ b/hurricane/src/hviewer/hurricane/viewer/HApplication.h @@ -0,0 +1,54 @@ + +// -*- C++ -*- +// +// This file is part of the Coriolis Software. +// Copyright (c) UPMC/LIP6 2008-2009, All Rights Reserved +// +// =================================================================== +// +// $Id$ +// +// x-----------------------------------------------------------------x +// | | +// | C O R I O L I S | +// | U n i c o r n - M a i n G U I | +// | | +// | Author : Jean-Paul CHAPUT | +// | E-mail : Jean-Paul.Chaput@asim.lip6.fr | +// | =============================================================== | +// | C++ Header : "./HApplication.h" | +// | *************************************************************** | +// | U p d a t e s | +// | | +// x-----------------------------------------------------------------x + + + + +#ifndef __HURRICANE_HAPPLICATION__ +#define __HURRICANE_HAPPLICATION__ + +#include + + +namespace Hurricane { + + + class HApplication : public QApplication { + Q_OBJECT; + + public: + HApplication ( int& argc, char** argv ); + HApplication ( int& argc, char** argv, bool GUIenabled ); + HApplication ( int& argc, char** argv, Type type ); + HApplication ( Display*, Qt::HANDLE visual=0, Qt::HANDLE colormap=0 ); + HApplication ( Display*, int& argc, char** argv, Qt::HANDLE visual=0, Qt::HANDLE colormap=0 ); + virtual bool notify ( QObject*, QEvent* ); + }; + + +} // End of Hurricane namespace. + + +#endif // __HURRICANE_HAPPLICATION__ + diff --git a/hurricane/src/hviewer/hurricane/viewer/PaletteItem.h b/hurricane/src/hviewer/hurricane/viewer/PaletteItem.h index e57b0920..bfbc28b7 100644 --- a/hurricane/src/hviewer/hurricane/viewer/PaletteItem.h +++ b/hurricane/src/hviewer/hurricane/viewer/PaletteItem.h @@ -2,7 +2,7 @@ // -*- C++ -*- // // This file is part of the Coriolis Software. -// Copyright (c) UPMC/LIP6 2008-2008, All Rights Reserved +// Copyright (c) UPMC/LIP6 2008-2009, All Rights Reserved // // =================================================================== // @@ -55,7 +55,7 @@ namespace Hurricane { protected: QPixmap _sample; PaletteItem* _entry; - protected: + protected slots: void redraw (); void paintEvent ( QPaintEvent* ); }; @@ -74,10 +74,12 @@ namespace Hurricane { virtual bool isItemSelectable () const; virtual void setItemVisible ( bool ) = 0; virtual void setItemSelectable ( bool ); + public slots: + virtual void styleChange (); signals: + void styleChanged (); void visibleToggled (); void selectableToggled (); - protected: PaletteItem (); PaletteItem ( const PaletteItem& ); diff --git a/hurricane/src/hviewer/hurricane/viewer/PaletteWidget.h b/hurricane/src/hviewer/hurricane/viewer/PaletteWidget.h index 0938571c..fc2d12df 100644 --- a/hurricane/src/hviewer/hurricane/viewer/PaletteWidget.h +++ b/hurricane/src/hviewer/hurricane/viewer/PaletteWidget.h @@ -2,7 +2,7 @@ // -*- C++ -*- // // This file is part of the Coriolis Software. -// Copyright (c) UPMC/LIP6 2008-2008, All Rights Reserved +// Copyright (c) UPMC/LIP6 2008-2009, All Rights Reserved // // =================================================================== // @@ -68,6 +68,7 @@ namespace Hurricane { void updateExtensions ( Cell* cell ); void showAll (); void hideAll (); + void styleChange ( void* emitter ); protected: PaletteItems _layerItems; diff --git a/hurricane/src/hviewer/images/gnome-core.png b/hurricane/src/hviewer/images/gnome-core.png new file mode 100644 index 0000000000000000000000000000000000000000..05ffbd808d5ba78095b9d4067002d7109428f1f2 GIT binary patch literal 3266 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 A$^ZZW literal 0 HcmV?d00001 diff --git a/hurricane/src/hviewer/images/i-core.png b/hurricane/src/hviewer/images/i-core.png new file mode 100644 index 0000000000000000000000000000000000000000..1228907227ffa472da7946759592794e912b8a84 GIT binary patch literal 3138 zcmV-I488M-P)ESNg!6) z-~@<>h#i|$aEOUbB`HG%Y?G>>vdgBd1f1YUky89fgk`5}?1b1UAP5;P5(o(`NGqY0 z_Njf%?C#9;>)w+;dbL4BL61dB=&G*jnd!dweCM3+JLldWc#j`yhR@3d8ux+%kc;G; z3o?nE#j|oTL0A_6xH^w$T@(Ov4qm-z9I!6J9P(ZTp#DEa;EZ0(W?;khxib!Q{nc5r znTua9-$>ueVa{|MK*6Tfg4QJ)dj<;LtOd((&U<`0S?| zX_;qTv@oBRz<+jEBY(KDg_GtW^TV%_3PLQ$<78Xh= zQZ{_%j)kmVUd30x-AzxQnK1|6o+`5Cq2^O=ShLdQ2U}LL{>mC^Dj}UVc#C#X^J}~K zox2YF_rPA;X(!xt??Ku=xQ7K-?#6Kpm098H_t)_7=a#Z)fjx5)k9V$|2D0U$Wq#ethZ*w0ht28UHA3ycMs14psIa8fZG1}a@Jo_LpmdP zi(j1Pz_M#PB%6WjuF7%Muh;OKH{Q(L<^{<34~Zif&IcSlR^sK(advbR*wImN5$mvwbh#+DxMi2v93`Pratk5wSfzzqb z)~_sAU-;WY9O>3PdjAq0c&v-jyquE?o#Oeo8a=H(3mx^!{!o7Ro>%$Nx7tsuLP}|r z5wHzn0s5qu6qW*`Ijsua_sBu%=`%FeTgtYDRZA*)repl9Njzq$dn)(5sXoYQD_aK6|q)C zp+ak$D1>4OdU`bnyUYCb-ydQ1vP$*z^92?(r|9mB&RRy*J5}b*j}FL}?{8yStD6{) zPK+nWgBeE;5Y``jGO9tvHk?)xw%^OEbJhY{s{vjXRF;rv~v#J$qmgo45tEw5zi|l%B@?GhLWJ#;T z&L3VzMUKR)Dh8#&iUGr`oh7cj?KofiLLEQ*k0Ludd>;8y9k*=AAqGSg`(KZ^VN)Mr z2p_w#l7IYBfmu~HKmBGa4RvXvKv66zP7GGOIuT%7&i3u z$6%#Ek+IHNh0X}zn#(J2Y!Y=5 zjWDG&Vv=hNdpiRAm;Pj77^ z42A3OIEFfz#7aO3t_#_WqB>{OG&^-h0B36dWYbOctXoxu>n1XZ(usVkDg9T%CvVHq z*q~5KxbCVnAGx8C*47qM-h4_y75Rc;0fXaxf4l%l!b114v-pm80G{CG?%1*tR% z2qlOl0F+1)84BHs%RzUw4juWm$ArX zvN(>SuRr9#p@5nSi`puix@w1%rO-wY4JHO{Al3#)L2Z>Ya}uKjV+0c?sWW|wAVwv| z8$c}L$fe|GiQ)`KJVb09+fb3!xK2nAYRYBdc)zB*H%?j$BZyAg?N|#sGQ<(YT9R@PjCMJcd z3Jb?h8YUeJag>l(YeN(%0^cx{k7f>FI3I9{n?;F6#|p6pgTh8lDW5`3rIcgEq!^^< z*j`SIypC;aGR_dMcfQQdmkKo0T3o)yBa9Tw7pBO#7NQkKKx>FXLl`K+z%X7k^p6BH z2e7|ul6CK^#Pbv`f-PVnAO>Y8*On+mz_oqqs)n(wn2Efix37SSNAZhetXgifZjDDv zql4Cptm|NmB8r7DfG~tO2H!V~PZ&yN&FFYMV*qN`zDfE04^M^J5{w8oU|9-#N{Pf4 zibcaeKULts;R1f(VcUvg$tMhajE-?riuxLxIDi$4()hlhP((54DDi&aCqO34hA=V= zj0I=x*UlJ$eFuH=`Iy<&$*uNOZ*MzO@*Tl{?g`j<&mfMnSv99NS)o~m{&JC=Wz&$$ zQPzrY9t?3SeLiukVSYo31#>(?AA&%pj2B8J!(>sTV_`V2XIzQVnlCyj!_t;485cwe z!jwRWVPIHu`)3CkFACQ#tK*NCui?ttd91E(WH2A{f!cYjuWw~dZ3DA19$onYk8R6y zX?vQcI)^BRz*hu;Fj<7*QNu_+W@qO(-GedjRE5uWXHNa=&b(ZEX$_9!QeCC6wZXCt z`9RqCxj_a;G#OX%M+?@{l+NK=7Dj~2o10l&SxHMShp#mm<jI?y|?d{{FQ#Om| zy68wzEJA+VFfYaO;TrS=A7d&H=QQ!IA}@KD-yxinmIKojt|C66b%DIF>m&U93O}o zpVU0Nf8v~8j-1m*Wbc5m`FlOQdZ*PuwtD@$nmHvwBg6`WlRgNhGHBu90UxO%k%~TUgabWZDS1PV+!MjU5ARi z_GWb6w#@ji292{7A6i?%?G@{=!z`jTArMccOnwT$SQsL%Pp+k(k%DH=;W9@C!t?U_ zg?N)FnKazgK9@Ch^)yKx`6!|gMdafcQ#s0*nc&b!fn!4vCq@ln`0mVqAzp>b|G}K^ c-Q&LiJYGUBR-w&r00000NkvXXu0mjf3Y$yoC;$Ke literal 0 HcmV?d00001